app.1576413764867.js
7.86 MB
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
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ function webpackJsonpCallback(data) {
/******/ var chunkIds = data[0];
/******/ var moreModules = data[1];
/******/
/******/
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
/******/
/******/ while(resolves.length) {
/******/ resolves.shift()();
/******/ }
/******/
/******/ };
/******/
/******/ function hotDisposeChunk(chunkId) {
/******/ delete installedChunks[chunkId];
/******/ }
/******/ var parentHotUpdateCallback = (typeof self !== 'undefined' ? self : this)["webpackHotUpdate"];
/******/ (typeof self !== 'undefined' ? self : this)["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
/******/ function webpackHotUpdateCallback(chunkId, moreModules) {
/******/ hotAddUpdateChunk(chunkId, moreModules);
/******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
/******/ } ;
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotDownloadUpdateChunk(chunkId) {
/******/ var script = document.createElement("script");
/******/ script.charset = "utf-8";
/******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
/******/ if (null) script.crossOrigin = null;
/******/ document.head.appendChild(script);
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotDownloadManifest(requestTimeout) {
/******/ requestTimeout = requestTimeout || 10000;
/******/ return new Promise(function(resolve, reject) {
/******/ if (typeof XMLHttpRequest === "undefined") {
/******/ return reject(new Error("No browser support"));
/******/ }
/******/ try {
/******/ var request = new XMLHttpRequest();
/******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
/******/ request.open("GET", requestPath, true);
/******/ request.timeout = requestTimeout;
/******/ request.send(null);
/******/ } catch (err) {
/******/ return reject(err);
/******/ }
/******/ request.onreadystatechange = function() {
/******/ if (request.readyState !== 4) return;
/******/ if (request.status === 0) {
/******/ // timeout
/******/ reject(
/******/ new Error("Manifest request to " + requestPath + " timed out.")
/******/ );
/******/ } else if (request.status === 404) {
/******/ // no update available
/******/ resolve();
/******/ } else if (request.status !== 200 && request.status !== 304) {
/******/ // other failure
/******/ reject(new Error("Manifest request to " + requestPath + " failed."));
/******/ } else {
/******/ // success
/******/ try {
/******/ var update = JSON.parse(request.responseText);
/******/ } catch (e) {
/******/ reject(e);
/******/ return;
/******/ }
/******/ resolve(update);
/******/ }
/******/ };
/******/ });
/******/ }
/******/
/******/ var hotApplyOnUpdate = true;
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentHash = "c0554ec1fc1dd7581da1";
/******/ var hotRequestTimeout = 10000;
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentChildModule;
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentParents = [];
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentParentsTemp = [];
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotCreateRequire(moduleId) {
/******/ var me = installedModules[moduleId];
/******/ if (!me) return __webpack_require__;
/******/ var fn = function(request) {
/******/ if (me.hot.active) {
/******/ if (installedModules[request]) {
/******/ if (installedModules[request].parents.indexOf(moduleId) === -1) {
/******/ installedModules[request].parents.push(moduleId);
/******/ }
/******/ } else {
/******/ hotCurrentParents = [moduleId];
/******/ hotCurrentChildModule = request;
/******/ }
/******/ if (me.children.indexOf(request) === -1) {
/******/ me.children.push(request);
/******/ }
/******/ } else {
/******/ console.warn(
/******/ "[HMR] unexpected require(" +
/******/ request +
/******/ ") from disposed module " +
/******/ moduleId
/******/ );
/******/ hotCurrentParents = [];
/******/ }
/******/ return __webpack_require__(request);
/******/ };
/******/ var ObjectFactory = function ObjectFactory(name) {
/******/ return {
/******/ configurable: true,
/******/ enumerable: true,
/******/ get: function() {
/******/ return __webpack_require__[name];
/******/ },
/******/ set: function(value) {
/******/ __webpack_require__[name] = value;
/******/ }
/******/ };
/******/ };
/******/ for (var name in __webpack_require__) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
/******/ name !== "e" &&
/******/ name !== "t"
/******/ ) {
/******/ Object.defineProperty(fn, name, ObjectFactory(name));
/******/ }
/******/ }
/******/ fn.e = function(chunkId) {
/******/ if (hotStatus === "ready") hotSetStatus("prepare");
/******/ hotChunksLoading++;
/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
/******/ finishChunkLoading();
/******/ throw err;
/******/ });
/******/
/******/ function finishChunkLoading() {
/******/ hotChunksLoading--;
/******/ if (hotStatus === "prepare") {
/******/ if (!hotWaitingFilesMap[chunkId]) {
/******/ hotEnsureUpdateChunk(chunkId);
/******/ }
/******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ }
/******/ }
/******/ };
/******/ fn.t = function(value, mode) {
/******/ if (mode & 1) value = fn(value);
/******/ return __webpack_require__.t(value, mode & ~1);
/******/ };
/******/ return fn;
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotCreateModule(moduleId) {
/******/ var hot = {
/******/ // private stuff
/******/ _acceptedDependencies: {},
/******/ _declinedDependencies: {},
/******/ _selfAccepted: false,
/******/ _selfDeclined: false,
/******/ _disposeHandlers: [],
/******/ _main: hotCurrentChildModule !== moduleId,
/******/
/******/ // Module API
/******/ active: true,
/******/ accept: function(dep, callback) {
/******/ if (dep === undefined) hot._selfAccepted = true;
/******/ else if (typeof dep === "function") hot._selfAccepted = dep;
/******/ else if (typeof dep === "object")
/******/ for (var i = 0; i < dep.length; i++)
/******/ hot._acceptedDependencies[dep[i]] = callback || function() {};
/******/ else hot._acceptedDependencies[dep] = callback || function() {};
/******/ },
/******/ decline: function(dep) {
/******/ if (dep === undefined) hot._selfDeclined = true;
/******/ else if (typeof dep === "object")
/******/ for (var i = 0; i < dep.length; i++)
/******/ hot._declinedDependencies[dep[i]] = true;
/******/ else hot._declinedDependencies[dep] = true;
/******/ },
/******/ dispose: function(callback) {
/******/ hot._disposeHandlers.push(callback);
/******/ },
/******/ addDisposeHandler: function(callback) {
/******/ hot._disposeHandlers.push(callback);
/******/ },
/******/ removeDisposeHandler: function(callback) {
/******/ var idx = hot._disposeHandlers.indexOf(callback);
/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
/******/ },
/******/
/******/ // Management API
/******/ check: hotCheck,
/******/ apply: hotApply,
/******/ status: function(l) {
/******/ if (!l) return hotStatus;
/******/ hotStatusHandlers.push(l);
/******/ },
/******/ addStatusHandler: function(l) {
/******/ hotStatusHandlers.push(l);
/******/ },
/******/ removeStatusHandler: function(l) {
/******/ var idx = hotStatusHandlers.indexOf(l);
/******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
/******/ },
/******/
/******/ //inherit from previous dispose call
/******/ data: hotCurrentModuleData[moduleId]
/******/ };
/******/ hotCurrentChildModule = undefined;
/******/ return hot;
/******/ }
/******/
/******/ var hotStatusHandlers = [];
/******/ var hotStatus = "idle";
/******/
/******/ function hotSetStatus(newStatus) {
/******/ hotStatus = newStatus;
/******/ for (var i = 0; i < hotStatusHandlers.length; i++)
/******/ hotStatusHandlers[i].call(null, newStatus);
/******/ }
/******/
/******/ // while downloading
/******/ var hotWaitingFiles = 0;
/******/ var hotChunksLoading = 0;
/******/ var hotWaitingFilesMap = {};
/******/ var hotRequestedFilesMap = {};
/******/ var hotAvailableFilesMap = {};
/******/ var hotDeferred;
/******/
/******/ // The update info
/******/ var hotUpdate, hotUpdateNewHash;
/******/
/******/ function toModuleId(id) {
/******/ var isNumber = +id + "" === id;
/******/ return isNumber ? +id : id;
/******/ }
/******/
/******/ function hotCheck(apply) {
/******/ if (hotStatus !== "idle") {
/******/ throw new Error("check() is only allowed in idle status");
/******/ }
/******/ hotApplyOnUpdate = apply;
/******/ hotSetStatus("check");
/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) {
/******/ if (!update) {
/******/ hotSetStatus("idle");
/******/ return null;
/******/ }
/******/ hotRequestedFilesMap = {};
/******/ hotWaitingFilesMap = {};
/******/ hotAvailableFilesMap = update.c;
/******/ hotUpdateNewHash = update.h;
/******/
/******/ hotSetStatus("prepare");
/******/ var promise = new Promise(function(resolve, reject) {
/******/ hotDeferred = {
/******/ resolve: resolve,
/******/ reject: reject
/******/ };
/******/ });
/******/ hotUpdate = {};
/******/ for(var chunkId in installedChunks)
/******/ // eslint-disable-next-line no-lone-blocks
/******/ {
/******/ /*globals chunkId */
/******/ hotEnsureUpdateChunk(chunkId);
/******/ }
/******/ if (
/******/ hotStatus === "prepare" &&
/******/ hotChunksLoading === 0 &&
/******/ hotWaitingFiles === 0
/******/ ) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ return promise;
/******/ });
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotAddUpdateChunk(chunkId, moreModules) {
/******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
/******/ return;
/******/ hotRequestedFilesMap[chunkId] = false;
/******/ for (var moduleId in moreModules) {
/******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ hotUpdate[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ }
/******/
/******/ function hotEnsureUpdateChunk(chunkId) {
/******/ if (!hotAvailableFilesMap[chunkId]) {
/******/ hotWaitingFilesMap[chunkId] = true;
/******/ } else {
/******/ hotRequestedFilesMap[chunkId] = true;
/******/ hotWaitingFiles++;
/******/ hotDownloadUpdateChunk(chunkId);
/******/ }
/******/ }
/******/
/******/ function hotUpdateDownloaded() {
/******/ hotSetStatus("ready");
/******/ var deferred = hotDeferred;
/******/ hotDeferred = null;
/******/ if (!deferred) return;
/******/ if (hotApplyOnUpdate) {
/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
/******/ // avoid triggering uncaught exception warning in Chrome.
/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
/******/ Promise.resolve()
/******/ .then(function() {
/******/ return hotApply(hotApplyOnUpdate);
/******/ })
/******/ .then(
/******/ function(result) {
/******/ deferred.resolve(result);
/******/ },
/******/ function(err) {
/******/ deferred.reject(err);
/******/ }
/******/ );
/******/ } else {
/******/ var outdatedModules = [];
/******/ for (var id in hotUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ outdatedModules.push(toModuleId(id));
/******/ }
/******/ }
/******/ deferred.resolve(outdatedModules);
/******/ }
/******/ }
/******/
/******/ function hotApply(options) {
/******/ if (hotStatus !== "ready")
/******/ throw new Error("apply() is only allowed in ready status");
/******/ options = options || {};
/******/
/******/ var cb;
/******/ var i;
/******/ var j;
/******/ var module;
/******/ var moduleId;
/******/
/******/ function getAffectedStuff(updateModuleId) {
/******/ var outdatedModules = [updateModuleId];
/******/ var outdatedDependencies = {};
/******/
/******/ var queue = outdatedModules.map(function(id) {
/******/ return {
/******/ chain: [id],
/******/ id: id
/******/ };
/******/ });
/******/ while (queue.length > 0) {
/******/ var queueItem = queue.pop();
/******/ var moduleId = queueItem.id;
/******/ var chain = queueItem.chain;
/******/ module = installedModules[moduleId];
/******/ if (!module || module.hot._selfAccepted) continue;
/******/ if (module.hot._selfDeclined) {
/******/ return {
/******/ type: "self-declined",
/******/ chain: chain,
/******/ moduleId: moduleId
/******/ };
/******/ }
/******/ if (module.hot._main) {
/******/ return {
/******/ type: "unaccepted",
/******/ chain: chain,
/******/ moduleId: moduleId
/******/ };
/******/ }
/******/ for (var i = 0; i < module.parents.length; i++) {
/******/ var parentId = module.parents[i];
/******/ var parent = installedModules[parentId];
/******/ if (!parent) continue;
/******/ if (parent.hot._declinedDependencies[moduleId]) {
/******/ return {
/******/ type: "declined",
/******/ chain: chain.concat([parentId]),
/******/ moduleId: moduleId,
/******/ parentId: parentId
/******/ };
/******/ }
/******/ if (outdatedModules.indexOf(parentId) !== -1) continue;
/******/ if (parent.hot._acceptedDependencies[moduleId]) {
/******/ if (!outdatedDependencies[parentId])
/******/ outdatedDependencies[parentId] = [];
/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
/******/ continue;
/******/ }
/******/ delete outdatedDependencies[parentId];
/******/ outdatedModules.push(parentId);
/******/ queue.push({
/******/ chain: chain.concat([parentId]),
/******/ id: parentId
/******/ });
/******/ }
/******/ }
/******/
/******/ return {
/******/ type: "accepted",
/******/ moduleId: updateModuleId,
/******/ outdatedModules: outdatedModules,
/******/ outdatedDependencies: outdatedDependencies
/******/ };
/******/ }
/******/
/******/ function addAllToSet(a, b) {
/******/ for (var i = 0; i < b.length; i++) {
/******/ var item = b[i];
/******/ if (a.indexOf(item) === -1) a.push(item);
/******/ }
/******/ }
/******/
/******/ // at begin all updates modules are outdated
/******/ // the "outdated" status can propagate to parents if they don't accept the children
/******/ var outdatedDependencies = {};
/******/ var outdatedModules = [];
/******/ var appliedUpdate = {};
/******/
/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
/******/ console.warn(
/******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
/******/ );
/******/ };
/******/
/******/ for (var id in hotUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ moduleId = toModuleId(id);
/******/ /** @type {TODO} */
/******/ var result;
/******/ if (hotUpdate[id]) {
/******/ result = getAffectedStuff(moduleId);
/******/ } else {
/******/ result = {
/******/ type: "disposed",
/******/ moduleId: id
/******/ };
/******/ }
/******/ /** @type {Error|false} */
/******/ var abortError = false;
/******/ var doApply = false;
/******/ var doDispose = false;
/******/ var chainInfo = "";
/******/ if (result.chain) {
/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
/******/ }
/******/ switch (result.type) {
/******/ case "self-declined":
/******/ if (options.onDeclined) options.onDeclined(result);
/******/ if (!options.ignoreDeclined)
/******/ abortError = new Error(
/******/ "Aborted because of self decline: " +
/******/ result.moduleId +
/******/ chainInfo
/******/ );
/******/ break;
/******/ case "declined":
/******/ if (options.onDeclined) options.onDeclined(result);
/******/ if (!options.ignoreDeclined)
/******/ abortError = new Error(
/******/ "Aborted because of declined dependency: " +
/******/ result.moduleId +
/******/ " in " +
/******/ result.parentId +
/******/ chainInfo
/******/ );
/******/ break;
/******/ case "unaccepted":
/******/ if (options.onUnaccepted) options.onUnaccepted(result);
/******/ if (!options.ignoreUnaccepted)
/******/ abortError = new Error(
/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo
/******/ );
/******/ break;
/******/ case "accepted":
/******/ if (options.onAccepted) options.onAccepted(result);
/******/ doApply = true;
/******/ break;
/******/ case "disposed":
/******/ if (options.onDisposed) options.onDisposed(result);
/******/ doDispose = true;
/******/ break;
/******/ default:
/******/ throw new Error("Unexception type " + result.type);
/******/ }
/******/ if (abortError) {
/******/ hotSetStatus("abort");
/******/ return Promise.reject(abortError);
/******/ }
/******/ if (doApply) {
/******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
/******/ addAllToSet(outdatedModules, result.outdatedModules);
/******/ for (moduleId in result.outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(
/******/ result.outdatedDependencies,
/******/ moduleId
/******/ )
/******/ ) {
/******/ if (!outdatedDependencies[moduleId])
/******/ outdatedDependencies[moduleId] = [];
/******/ addAllToSet(
/******/ outdatedDependencies[moduleId],
/******/ result.outdatedDependencies[moduleId]
/******/ );
/******/ }
/******/ }
/******/ }
/******/ if (doDispose) {
/******/ addAllToSet(outdatedModules, [result.moduleId]);
/******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
/******/ }
/******/ }
/******/ }
/******/
/******/ // Store self accepted outdated modules to require them later by the module system
/******/ var outdatedSelfAcceptedModules = [];
/******/ for (i = 0; i < outdatedModules.length; i++) {
/******/ moduleId = outdatedModules[i];
/******/ if (
/******/ installedModules[moduleId] &&
/******/ installedModules[moduleId].hot._selfAccepted &&
/******/ // removed self-accepted modules should not be required
/******/ appliedUpdate[moduleId] !== warnUnexpectedRequire
/******/ ) {
/******/ outdatedSelfAcceptedModules.push({
/******/ module: moduleId,
/******/ errorHandler: installedModules[moduleId].hot._selfAccepted
/******/ });
/******/ }
/******/ }
/******/
/******/ // Now in "dispose" phase
/******/ hotSetStatus("dispose");
/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
/******/ if (hotAvailableFilesMap[chunkId] === false) {
/******/ hotDisposeChunk(chunkId);
/******/ }
/******/ });
/******/
/******/ var idx;
/******/ var queue = outdatedModules.slice();
/******/ while (queue.length > 0) {
/******/ moduleId = queue.pop();
/******/ module = installedModules[moduleId];
/******/ if (!module) continue;
/******/
/******/ var data = {};
/******/
/******/ // Call dispose handlers
/******/ var disposeHandlers = module.hot._disposeHandlers;
/******/ for (j = 0; j < disposeHandlers.length; j++) {
/******/ cb = disposeHandlers[j];
/******/ cb(data);
/******/ }
/******/ hotCurrentModuleData[moduleId] = data;
/******/
/******/ // disable module (this disables requires from this module)
/******/ module.hot.active = false;
/******/
/******/ // remove module from cache
/******/ delete installedModules[moduleId];
/******/
/******/ // when disposing there is no need to call dispose handler
/******/ delete outdatedDependencies[moduleId];
/******/
/******/ // remove "parents" references from all children
/******/ for (j = 0; j < module.children.length; j++) {
/******/ var child = installedModules[module.children[j]];
/******/ if (!child) continue;
/******/ idx = child.parents.indexOf(moduleId);
/******/ if (idx >= 0) {
/******/ child.parents.splice(idx, 1);
/******/ }
/******/ }
/******/ }
/******/
/******/ // remove outdated dependency from module children
/******/ var dependency;
/******/ var moduleOutdatedDependencies;
/******/ for (moduleId in outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ ) {
/******/ module = installedModules[moduleId];
/******/ if (module) {
/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
/******/ dependency = moduleOutdatedDependencies[j];
/******/ idx = module.children.indexOf(dependency);
/******/ if (idx >= 0) module.children.splice(idx, 1);
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // Now in "apply" phase
/******/ hotSetStatus("apply");
/******/
/******/ hotCurrentHash = hotUpdateNewHash;
/******/
/******/ // insert new code
/******/ for (moduleId in appliedUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
/******/ modules[moduleId] = appliedUpdate[moduleId];
/******/ }
/******/ }
/******/
/******/ // call accept handlers
/******/ var error = null;
/******/ for (moduleId in outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ ) {
/******/ module = installedModules[moduleId];
/******/ if (module) {
/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ var callbacks = [];
/******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
/******/ dependency = moduleOutdatedDependencies[i];
/******/ cb = module.hot._acceptedDependencies[dependency];
/******/ if (cb) {
/******/ if (callbacks.indexOf(cb) !== -1) continue;
/******/ callbacks.push(cb);
/******/ }
/******/ }
/******/ for (i = 0; i < callbacks.length; i++) {
/******/ cb = callbacks[i];
/******/ try {
/******/ cb(moduleOutdatedDependencies);
/******/ } catch (err) {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "accept-errored",
/******/ moduleId: moduleId,
/******/ dependencyId: moduleOutdatedDependencies[i],
/******/ error: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err;
/******/ }
/******/ }
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // Load self accepted modules
/******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
/******/ var item = outdatedSelfAcceptedModules[i];
/******/ moduleId = item.module;
/******/ hotCurrentParents = [moduleId];
/******/ try {
/******/ __webpack_require__(moduleId);
/******/ } catch (err) {
/******/ if (typeof item.errorHandler === "function") {
/******/ try {
/******/ item.errorHandler(err);
/******/ } catch (err2) {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "self-accept-error-handler-errored",
/******/ moduleId: moduleId,
/******/ error: err2,
/******/ originalError: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err2;
/******/ }
/******/ if (!error) error = err;
/******/ }
/******/ } else {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "self-accept-errored",
/******/ moduleId: moduleId,
/******/ error: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err;
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // handle errors in accept handlers and self accepted module load
/******/ if (error) {
/******/ hotSetStatus("fail");
/******/ return Promise.reject(error);
/******/ }
/******/
/******/ hotSetStatus("idle");
/******/ return new Promise(function(resolve) {
/******/ resolve(outdatedModules);
/******/ });
/******/ }
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // Promise = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "app": 0
/******/ };
/******/
/******/
/******/
/******/ // script path function
/******/ function jsonpScriptSrc(chunkId) {
/******/ return __webpack_require__.p + "static/js/" + ({}[chunkId]||chunkId) + ".1576413764867.js"
/******/ }
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {},
/******/ hot: hotCreateModule(moduleId),
/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
/******/ children: []
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId) {
/******/ var promises = [];
/******/
/******/
/******/ // JSONP chunk loading for javascript
/******/
/******/ var installedChunkData = installedChunks[chunkId];
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
/******/
/******/ // a Promise means "currently loading".
/******/ if(installedChunkData) {
/******/ promises.push(installedChunkData[2]);
/******/ } else {
/******/ // setup Promise in chunk cache
/******/ var promise = new Promise(function(resolve, reject) {
/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject];
/******/ });
/******/ promises.push(installedChunkData[2] = promise);
/******/
/******/ // start chunk loading
/******/ var script = document.createElement('script');
/******/ var onScriptComplete;
/******/
/******/ script.charset = 'utf-8';
/******/ script.timeout = 120;
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = jsonpScriptSrc(chunkId);
/******/
/******/ // create error before stack unwound to get useful stacktrace later
/******/ var error = new Error();
/******/ onScriptComplete = function (event) {
/******/ // avoid mem leaks in IE.
/******/ script.onerror = script.onload = null;
/******/ clearTimeout(timeout);
/******/ var chunk = installedChunks[chunkId];
/******/ if(chunk !== 0) {
/******/ if(chunk) {
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
/******/ var realSrc = event && event.target && event.target.src;
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
/******/ error.name = 'ChunkLoadError';
/******/ error.type = errorType;
/******/ error.request = realSrc;
/******/ chunk[1](error);
/******/ }
/******/ installedChunks[chunkId] = undefined;
/******/ }
/******/ };
/******/ var timeout = setTimeout(function(){
/******/ onScriptComplete({ type: 'timeout', target: script });
/******/ }, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ document.head.appendChild(script);
/******/ }
/******/ }
/******/ return Promise.all(promises);
/******/ };
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // on error function for async loading
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/
/******/ // __webpack_hash__
/******/ __webpack_require__.h = function() { return hotCurrentHash; };
/******/
/******/ var jsonpArray = (typeof self !== 'undefined' ? self : this)["webpackJsonp"] = (typeof self !== 'undefined' ? self : this)["webpackJsonp"] || [];
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
/******/ jsonpArray.push = webpackJsonpCallback;
/******/ jsonpArray = jsonpArray.slice();
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
/******/ var parentJsonpFunction = oldJsonpFunction;
/******/
/******/
/******/ // Load entry module and return exports
/******/ return hotCreateRequire(0)(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js":
/*!*****************************************************************************************!*\
!*** ./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js ***!
\*****************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNi4zQEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjYuM0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcz85N2EzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\n");
/***/ }),
/***/ "./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js":
/*!**********************************************************************************!*\
!*** ./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js ***!
\**********************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _extends; });\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNy40QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNy40QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/Y2UwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\n");
/***/ }),
/***/ "./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js":
/*!************************************************************************************************************************!*\
!*** ./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js ***!
\************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("function _extends(){return _extends=Object.assign||function(a){for(var b,c=1;c<arguments.length;c++)for(var d in b=arguments[c],b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]);return a},_extends.apply(this,arguments)}var normalMerge=[\"attrs\",\"props\",\"domProps\"],toArrayMerge=[\"class\",\"style\",\"directives\"],functionalMerge=[\"on\",\"nativeOn\"],mergeJsxProps=function(a){return a.reduce(function(c,a){for(var b in a)if(!c[b])c[b]=a[b];else if(-1!==normalMerge.indexOf(b))c[b]=_extends({},c[b],a[b]);else if(-1!==toArrayMerge.indexOf(b)){var d=c[b]instanceof Array?c[b]:[c[b]],e=a[b]instanceof Array?a[b]:[a[b]];c[b]=d.concat(e)}else if(-1!==functionalMerge.indexOf(b)){for(var f in a[b])if(c[b][f]){var g=c[b][f]instanceof Array?c[b][f]:[c[b][f]],h=a[b][f]instanceof Array?a[b][f]:[a[b][f]];c[b][f]=g.concat(h)}else c[b][f]=a[b][f];}else if(\"hook\"==b)for(var i in a[b])c[b][i]=c[b][i]?mergeFn(c[b][i],a[b][i]):a[b][i];else c[b]=a[b];return c},{})},mergeFn=function(a,b){return function(){a&&a.apply(this,arguments),b&&b.apply(this,arguments)}};module.exports=mergeJsxProps;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0B2dWVfYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNAMS4wLjBAQHZ1ZS9iYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wcy9kaXN0L2hlbHBlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fQHZ1ZV9iYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc0AxLjAuMEBAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzL2Rpc3QvaGVscGVyLmpzPzIzYzQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gX2V4dGVuZHMoKXtyZXR1cm4gX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiPWFyZ3VtZW50c1tjXSxiKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGQpJiYoYVtkXT1iW2RdKTtyZXR1cm4gYX0sX2V4dGVuZHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBub3JtYWxNZXJnZT1bXCJhdHRyc1wiLFwicHJvcHNcIixcImRvbVByb3BzXCJdLHRvQXJyYXlNZXJnZT1bXCJjbGFzc1wiLFwic3R5bGVcIixcImRpcmVjdGl2ZXNcIl0sZnVuY3Rpb25hbE1lcmdlPVtcIm9uXCIsXCJuYXRpdmVPblwiXSxtZXJnZUpzeFByb3BzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlZHVjZShmdW5jdGlvbihjLGEpe2Zvcih2YXIgYiBpbiBhKWlmKCFjW2JdKWNbYl09YVtiXTtlbHNlIGlmKC0xIT09bm9ybWFsTWVyZ2UuaW5kZXhPZihiKSljW2JdPV9leHRlbmRzKHt9LGNbYl0sYVtiXSk7ZWxzZSBpZigtMSE9PXRvQXJyYXlNZXJnZS5pbmRleE9mKGIpKXt2YXIgZD1jW2JdaW5zdGFuY2VvZiBBcnJheT9jW2JdOltjW2JdXSxlPWFbYl1pbnN0YW5jZW9mIEFycmF5P2FbYl06W2FbYl1dO2NbYl09ZC5jb25jYXQoZSl9ZWxzZSBpZigtMSE9PWZ1bmN0aW9uYWxNZXJnZS5pbmRleE9mKGIpKXtmb3IodmFyIGYgaW4gYVtiXSlpZihjW2JdW2ZdKXt2YXIgZz1jW2JdW2ZdaW5zdGFuY2VvZiBBcnJheT9jW2JdW2ZdOltjW2JdW2ZdXSxoPWFbYl1bZl1pbnN0YW5jZW9mIEFycmF5P2FbYl1bZl06W2FbYl1bZl1dO2NbYl1bZl09Zy5jb25jYXQoaCl9ZWxzZSBjW2JdW2ZdPWFbYl1bZl07fWVsc2UgaWYoXCJob29rXCI9PWIpZm9yKHZhciBpIGluIGFbYl0pY1tiXVtpXT1jW2JdW2ldP21lcmdlRm4oY1tiXVtpXSxhW2JdW2ldKTphW2JdW2ldO2Vsc2UgY1tiXT1hW2JdO3JldHVybiBjfSx7fSl9LG1lcmdlRm49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXthJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiJiZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O21vZHVsZS5leHBvcnRzPW1lcmdlSnN4UHJvcHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\n");
/***/ }),
/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js":
/*!******************************************************************************************!*\
!*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js ***!
\******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js\");\n\nfunction makeResponse(result, config) {\n return {\n status: result[0],\n data: utils.isSimpleObject(result[1]) ? JSON.parse(JSON.stringify(result[1])) : result[1],\n headers: result[2],\n config: config\n };\n}\n\nfunction handleRequest(mockAdapter, resolve, reject, config) {\n var url = config.url;\n if (config.baseURL && config.url.substr(0, config.baseURL.length) === config.baseURL) {\n url = config.url.slice(config.baseURL ? config.baseURL.length : 0);\n }\n\n delete config.adapter;\n mockAdapter.history[config.method].push(config);\n\n var handler = utils.findHandler(\n mockAdapter.handlers,\n config.method,\n url,\n config.data,\n config.params,\n config.headers,\n config.baseURL\n );\n\n if (handler) {\n if (handler.length === 7) {\n utils.purgeIfReplyOnce(mockAdapter, handler);\n }\n\n if (handler.length === 2) {\n // passThrough handler\n mockAdapter.originalAdapter(config).then(resolve, reject);\n } else if (typeof handler[3] !== 'function') {\n utils.settle(\n resolve,\n reject,\n makeResponse(handler.slice(3), config),\n mockAdapter.delayResponse\n );\n } else {\n var result = handler[3](config);\n // TODO throw a sane exception when return value is incorrect\n if (typeof result.then !== 'function') {\n utils.settle(resolve, reject, makeResponse(result, config), mockAdapter.delayResponse);\n } else {\n result.then(\n function(result) {\n if (result.config && result.status) {\n utils.settle(resolve, reject, makeResponse([result.status, result.data, result.headers], result.config), 0);\n } else {\n utils.settle(resolve, reject, makeResponse(result, config), mockAdapter.delayResponse);\n }\n },\n function(error) {\n if (mockAdapter.delayResponse > 0) {\n setTimeout(function() {\n reject(error);\n }, mockAdapter.delayResponse);\n } else {\n reject(error);\n }\n }\n );\n }\n }\n } else {\n // handler not found\n utils.settle(\n resolve,\n reject,\n {\n status: 404,\n config: config\n },\n mockAdapter.delayResponse\n );\n }\n}\n\nmodule.exports = handleRequest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy9oYW5kbGVfcmVxdWVzdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL2hhbmRsZV9yZXF1ZXN0LmpzPzEwZjkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIG1ha2VSZXNwb25zZShyZXN1bHQsIGNvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogcmVzdWx0WzBdLFxuICAgIGRhdGE6IHV0aWxzLmlzU2ltcGxlT2JqZWN0KHJlc3VsdFsxXSkgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdFsxXSkpIDogcmVzdWx0WzFdLFxuICAgIGhlYWRlcnM6IHJlc3VsdFsyXSxcbiAgICBjb25maWc6IGNvbmZpZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KG1vY2tBZGFwdGVyLCByZXNvbHZlLCByZWplY3QsIGNvbmZpZykge1xuICB2YXIgdXJsID0gY29uZmlnLnVybDtcbiAgaWYgKGNvbmZpZy5iYXNlVVJMICYmIGNvbmZpZy51cmwuc3Vic3RyKDAsIGNvbmZpZy5iYXNlVVJMLmxlbmd0aCkgPT09IGNvbmZpZy5iYXNlVVJMKSB7XG4gICAgdXJsID0gY29uZmlnLnVybC5zbGljZShjb25maWcuYmFzZVVSTCA/IGNvbmZpZy5iYXNlVVJMLmxlbmd0aCA6IDApO1xuICB9XG5cbiAgZGVsZXRlIGNvbmZpZy5hZGFwdGVyO1xuICBtb2NrQWRhcHRlci5oaXN0b3J5W2NvbmZpZy5tZXRob2RdLnB1c2goY29uZmlnKTtcblxuICB2YXIgaGFuZGxlciA9IHV0aWxzLmZpbmRIYW5kbGVyKFxuICAgIG1vY2tBZGFwdGVyLmhhbmRsZXJzLFxuICAgIGNvbmZpZy5tZXRob2QsXG4gICAgdXJsLFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5wYXJhbXMsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLmJhc2VVUkxcbiAgKTtcblxuICBpZiAoaGFuZGxlcikge1xuICAgIGlmIChoYW5kbGVyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdXRpbHMucHVyZ2VJZlJlcGx5T25jZShtb2NrQWRhcHRlciwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBwYXNzVGhyb3VnaCBoYW5kbGVyXG4gICAgICBtb2NrQWRhcHRlci5vcmlnaW5hbEFkYXB0ZXIoY29uZmlnKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaGFuZGxlclszXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXRpbHMuc2V0dGxlKFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIG1ha2VSZXNwb25zZShoYW5kbGVyLnNsaWNlKDMpLCBjb25maWcpLFxuICAgICAgICBtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaGFuZGxlclszXShjb25maWcpO1xuICAgICAgLy8gVE9ETyB0aHJvdyBhIHNhbmUgZXhjZXB0aW9uIHdoZW4gcmV0dXJuIHZhbHVlIGlzIGluY29ycmVjdFxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQudGhlbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1dGlscy5zZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBtYWtlUmVzcG9uc2UocmVzdWx0LCBjb25maWcpLCBtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5jb25maWcgJiYgcmVzdWx0LnN0YXR1cykge1xuICAgICAgICAgICAgICB1dGlscy5zZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBtYWtlUmVzcG9uc2UoW3Jlc3VsdC5zdGF0dXMsIHJlc3VsdC5kYXRhLCByZXN1bHQuaGVhZGVyc10sIHJlc3VsdC5jb25maWcpLCAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHV0aWxzLnNldHRsZShyZXNvbHZlLCByZWplY3QsIG1ha2VSZXNwb25zZShyZXN1bHQsIGNvbmZpZyksIG1vY2tBZGFwdGVyLmRlbGF5UmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlID4gMCkge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH0sIG1vY2tBZGFwdGVyLmRlbGF5UmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGhhbmRsZXIgbm90IGZvdW5kXG4gICAgdXRpbHMuc2V0dGxlKFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9LFxuICAgICAgbW9ja0FkYXB0ZXIuZGVsYXlSZXNwb25zZVxuICAgICk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGVSZXF1ZXN0O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js\n");
/***/ }),
/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js":
/*!*********************************************************************************!*\
!*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar deepEqual = __webpack_require__(/*! deep-equal */ \"./node_modules/_deep-equal@1.1.0@deep-equal/index.js\");\n\nvar handleRequest = __webpack_require__(/*! ./handle_request */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js\");\n\nvar VERBS = ['get', 'post', 'head', 'delete', 'patch', 'put', 'options', 'list'];\n\nfunction adapter() {\n return function(config) {\n var mockAdapter = this;\n // axios >= 0.13.0 only passes the config and expects a promise to be\n // returned. axios < 0.13.0 passes (config, resolve, reject).\n if (arguments.length === 3) {\n handleRequest(mockAdapter, arguments[0], arguments[1], arguments[2]);\n } else {\n return new Promise(function(resolve, reject) {\n handleRequest(mockAdapter, resolve, reject, config);\n });\n }\n }.bind(this);\n}\n\nfunction getVerbObject() {\n return VERBS.reduce(function(accumulator, verb) {\n accumulator[verb] = [];\n return accumulator;\n }, {});\n}\n\nfunction reset() {\n resetHandlers.call(this);\n resetHistory.call(this);\n}\n\nfunction resetHandlers() {\n this.handlers = getVerbObject();\n}\n\nfunction resetHistory() {\n this.history = getVerbObject();\n}\n\nfunction MockAdapter(axiosInstance, options) {\n reset.call(this);\n\n if (axiosInstance) {\n this.axiosInstance = axiosInstance;\n this.originalAdapter = axiosInstance.defaults.adapter;\n this.delayResponse = options && options.delayResponse > 0 ? options.delayResponse : null;\n axiosInstance.defaults.adapter = this.adapter.call(this);\n }\n}\n\nMockAdapter.prototype.adapter = adapter;\n\nMockAdapter.prototype.restore = function restore() {\n if (this.axiosInstance) {\n this.axiosInstance.defaults.adapter = this.originalAdapter;\n }\n};\n\nMockAdapter.prototype.reset = reset;\nMockAdapter.prototype.resetHandlers = resetHandlers;\nMockAdapter.prototype.resetHistory = resetHistory;\n\nVERBS.concat('any').forEach(function(method) {\n var methodName = 'on' + method.charAt(0).toUpperCase() + method.slice(1);\n MockAdapter.prototype[methodName] = function(matcher, body, requestHeaders) {\n var _this = this;\n var matcher = matcher === undefined ? /.*/ : matcher;\n\n function reply(code, response, headers) {\n var handler = [matcher, body, requestHeaders, code, response, headers];\n addHandler(method, _this.handlers, handler);\n return _this;\n }\n\n function replyOnce(code, response, headers) {\n var handler = [matcher, body, requestHeaders, code, response, headers, true];\n addHandler(method, _this.handlers, handler);\n return _this;\n }\n\n return {\n reply: reply,\n\n replyOnce: replyOnce,\n\n passThrough: function passThrough() {\n var handler = [matcher, body];\n addHandler(method, _this.handlers, handler);\n return _this;\n },\n\n networkError: function() {\n reply(function(config) {\n var error = new Error('Network Error');\n error.config = config;\n return Promise.reject(error);\n });\n },\n\n networkErrorOnce: function() {\n replyOnce(function(config) {\n var error = new Error('Network Error');\n error.config = config;\n return Promise.reject(error);\n });\n },\n\n timeout: function() {\n reply(function(config) {\n var error = new Error('timeout of ' + config.timeout + 'ms exceeded');\n error.config = config;\n error.code = 'ECONNABORTED';\n return Promise.reject(error);\n });\n },\n\n timeoutOnce: function() {\n replyOnce(function(config) {\n var error = new Error('timeout of ' + config.timeout + 'ms exceeded');\n error.config = config;\n error.code = 'ECONNABORTED';\n return Promise.reject(error);\n });\n }\n };\n };\n});\n\nfunction findInHandlers(method, handlers, handler) {\n var index = -1;\n for (var i = 0; i < handlers[method].length; i += 1) {\n var item = handlers[method][i];\n var isReplyOnce = item.length === 7;\n var comparePaths = item[0] instanceof RegExp && handler[0] instanceof RegExp\n ? String(item[0]) === String(handler[0])\n : item[0] === handler[0];\n var isSame = (\n comparePaths &&\n deepEqual(item[1], handler[1], { strict: true }) &&\n deepEqual(item[2], handler[2], { strict: true })\n );\n if (isSame && !isReplyOnce) {\n index = i;\n }\n }\n return index;\n}\n\nfunction addHandler(method, handlers, handler) {\n if (method === 'any') {\n VERBS.forEach(function(verb) {\n handlers[verb].push(handler);\n });\n } else {\n var indexOfExistingHandler = findInHandlers(method, handlers, handler);\n if (indexOfExistingHandler > -1 && handler.length < 7) {\n handlers[method].splice(indexOfExistingHandler, 1, handler);\n } else {\n handlers[method].push(handler);\n }\n }\n}\n\nmodule.exports = MockAdapter;\nmodule.exports.default = MockAdapter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL2luZGV4LmpzP2JlMDkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZSgnZGVlcC1lcXVhbCcpO1xuXG52YXIgaGFuZGxlUmVxdWVzdCA9IHJlcXVpcmUoJy4vaGFuZGxlX3JlcXVlc3QnKTtcblxudmFyIFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdoZWFkJywgJ2RlbGV0ZScsICdwYXRjaCcsICdwdXQnLCAnb3B0aW9ucycsICdsaXN0J107XG5cbmZ1bmN0aW9uIGFkYXB0ZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb25maWcpIHtcbiAgICB2YXIgbW9ja0FkYXB0ZXIgPSB0aGlzO1xuICAgIC8vIGF4aW9zID49IDAuMTMuMCBvbmx5IHBhc3NlcyB0aGUgY29uZmlnIGFuZCBleHBlY3RzIGEgcHJvbWlzZSB0byBiZVxuICAgIC8vIHJldHVybmVkLiBheGlvcyA8IDAuMTMuMCBwYXNzZXMgKGNvbmZpZywgcmVzb2x2ZSwgcmVqZWN0KS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgaGFuZGxlUmVxdWVzdChtb2NrQWRhcHRlciwgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaGFuZGxlUmVxdWVzdChtb2NrQWRhcHRlciwgcmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LmJpbmQodGhpcyk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcmJPYmplY3QoKSB7XG4gIHJldHVybiBWRVJCUy5yZWR1Y2UoZnVuY3Rpb24oYWNjdW11bGF0b3IsIHZlcmIpIHtcbiAgICBhY2N1bXVsYXRvclt2ZXJiXSA9IFtdO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcmVzZXRIYW5kbGVycy5jYWxsKHRoaXMpO1xuICByZXNldEhpc3RvcnkuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYW5kbGVycygpIHtcbiAgdGhpcy5oYW5kbGVycyA9IGdldFZlcmJPYmplY3QoKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIaXN0b3J5KCkge1xuICB0aGlzLmhpc3RvcnkgPSBnZXRWZXJiT2JqZWN0KCk7XG59XG5cbmZ1bmN0aW9uIE1vY2tBZGFwdGVyKGF4aW9zSW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgcmVzZXQuY2FsbCh0aGlzKTtcblxuICBpZiAoYXhpb3NJbnN0YW5jZSkge1xuICAgIHRoaXMuYXhpb3NJbnN0YW5jZSA9IGF4aW9zSW5zdGFuY2U7XG4gICAgdGhpcy5vcmlnaW5hbEFkYXB0ZXIgPSBheGlvc0luc3RhbmNlLmRlZmF1bHRzLmFkYXB0ZXI7XG4gICAgdGhpcy5kZWxheVJlc3BvbnNlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGF5UmVzcG9uc2UgPiAwID8gb3B0aW9ucy5kZWxheVJlc3BvbnNlIDogbnVsbDtcbiAgICBheGlvc0luc3RhbmNlLmRlZmF1bHRzLmFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIuY2FsbCh0aGlzKTtcbiAgfVxufVxuXG5Nb2NrQWRhcHRlci5wcm90b3R5cGUuYWRhcHRlciA9IGFkYXB0ZXI7XG5cbk1vY2tBZGFwdGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgaWYgKHRoaXMuYXhpb3NJbnN0YW5jZSkge1xuICAgIHRoaXMuYXhpb3NJbnN0YW5jZS5kZWZhdWx0cy5hZGFwdGVyID0gdGhpcy5vcmlnaW5hbEFkYXB0ZXI7XG4gIH1cbn07XG5cbk1vY2tBZGFwdGVyLnByb3RvdHlwZS5yZXNldCA9IHJlc2V0O1xuTW9ja0FkYXB0ZXIucHJvdG90eXBlLnJlc2V0SGFuZGxlcnMgPSByZXNldEhhbmRsZXJzO1xuTW9ja0FkYXB0ZXIucHJvdG90eXBlLnJlc2V0SGlzdG9yeSA9IHJlc2V0SGlzdG9yeTtcblxuVkVSQlMuY29uY2F0KCdhbnknKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICB2YXIgbWV0aG9kTmFtZSA9ICdvbicgKyBtZXRob2QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBtZXRob2Quc2xpY2UoMSk7XG4gIE1vY2tBZGFwdGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKG1hdGNoZXIsIGJvZHksIHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgbWF0Y2hlciA9IG1hdGNoZXIgPT09IHVuZGVmaW5lZCA/IC8uKi8gOiBtYXRjaGVyO1xuXG4gICAgZnVuY3Rpb24gcmVwbHkoY29kZSwgcmVzcG9uc2UsIGhlYWRlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gW21hdGNoZXIsIGJvZHksIHJlcXVlc3RIZWFkZXJzLCBjb2RlLCByZXNwb25zZSwgaGVhZGVyc107XG4gICAgICBhZGRIYW5kbGVyKG1ldGhvZCwgX3RoaXMuaGFuZGxlcnMsIGhhbmRsZXIpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGx5T25jZShjb2RlLCByZXNwb25zZSwgaGVhZGVycykge1xuICAgICAgdmFyIGhhbmRsZXIgPSBbbWF0Y2hlciwgYm9keSwgcmVxdWVzdEhlYWRlcnMsIGNvZGUsIHJlc3BvbnNlLCBoZWFkZXJzLCB0cnVlXTtcbiAgICAgIGFkZEhhbmRsZXIobWV0aG9kLCBfdGhpcy5oYW5kbGVycywgaGFuZGxlcik7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcGx5OiByZXBseSxcblxuICAgICAgcmVwbHlPbmNlOiByZXBseU9uY2UsXG5cbiAgICAgIHBhc3NUaHJvdWdoOiBmdW5jdGlvbiBwYXNzVGhyb3VnaCgpIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBbbWF0Y2hlciwgYm9keV07XG4gICAgICAgIGFkZEhhbmRsZXIobWV0aG9kLCBfdGhpcy5oYW5kbGVycywgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG5ldHdvcmtFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlcGx5KGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignTmV0d29yayBFcnJvcicpO1xuICAgICAgICAgIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIG5ldHdvcmtFcnJvck9uY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXBseU9uY2UoZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdOZXR3b3JrIEVycm9yJyk7XG4gICAgICAgICAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgdGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlcGx5KGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgICAgICAgICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTkFCT1JURUQnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgdGltZW91dE9uY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXBseU9uY2UoZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcpO1xuICAgICAgICAgIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICBlcnJvci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn0pO1xuXG5mdW5jdGlvbiBmaW5kSW5IYW5kbGVycyhtZXRob2QsIGhhbmRsZXJzLCBoYW5kbGVyKSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzW21ldGhvZF0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgaXRlbSA9IGhhbmRsZXJzW21ldGhvZF1baV07XG4gICAgdmFyIGlzUmVwbHlPbmNlID0gaXRlbS5sZW5ndGggPT09IDc7XG4gICAgdmFyIGNvbXBhcmVQYXRocyA9IGl0ZW1bMF0gaW5zdGFuY2VvZiBSZWdFeHAgJiYgaGFuZGxlclswXSBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgPyBTdHJpbmcoaXRlbVswXSkgPT09IFN0cmluZyhoYW5kbGVyWzBdKVxuICAgICAgOiBpdGVtWzBdID09PSBoYW5kbGVyWzBdO1xuICAgIHZhciBpc1NhbWUgPSAoXG4gICAgICBjb21wYXJlUGF0aHMgJiZcbiAgICAgIGRlZXBFcXVhbChpdGVtWzFdLCBoYW5kbGVyWzFdLCB7IHN0cmljdDogdHJ1ZSB9KSAmJlxuICAgICAgZGVlcEVxdWFsKGl0ZW1bMl0sIGhhbmRsZXJbMl0sIHsgc3RyaWN0OiB0cnVlIH0pXG4gICAgKTtcbiAgICBpZiAoaXNTYW1lICYmICFpc1JlcGx5T25jZSkge1xuICAgICAgaW5kZXggPSAgaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyKG1ldGhvZCwgaGFuZGxlcnMsIGhhbmRsZXIpIHtcbiAgaWYgKG1ldGhvZCA9PT0gJ2FueScpIHtcbiAgICBWRVJCUy5mb3JFYWNoKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGhhbmRsZXJzW3ZlcmJdLnB1c2goaGFuZGxlcik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluZGV4T2ZFeGlzdGluZ0hhbmRsZXIgPSBmaW5kSW5IYW5kbGVycyhtZXRob2QsIGhhbmRsZXJzLCBoYW5kbGVyKTtcbiAgICBpZiAoaW5kZXhPZkV4aXN0aW5nSGFuZGxlciA+IC0xICYmIGhhbmRsZXIubGVuZ3RoIDwgNykge1xuICAgICAgaGFuZGxlcnNbbWV0aG9kXS5zcGxpY2UoaW5kZXhPZkV4aXN0aW5nSGFuZGxlciwgMSwgaGFuZGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZXJzW21ldGhvZF0ucHVzaChoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWRhcHRlcjtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBNb2NrQWRhcHRlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js\n");
/***/ }),
/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js":
/*!*********************************************************************************!*\
!*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar axios = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\nvar deepEqual = __webpack_require__(/*! deep-equal */ \"./node_modules/_deep-equal@1.1.0@deep-equal/index.js\");\n\nfunction isEqual(a, b) {\n return deepEqual(a, b, { strict: true });\n}\n\n// < 0.13.0 will not have default headers set on a custom instance\nvar rejectWithError = !!axios.create().defaults.headers;\n\nfunction find(array, predicate) {\n var length = array.length;\n for (var i = 0; i < length; i++) {\n var value = array[i];\n if (predicate(value)) return value;\n }\n}\n\nfunction combineUrls(baseURL, url) {\n if (baseURL) {\n return baseURL.replace(/\\/+$/, '') + '/' + url.replace(/^\\/+/, '');\n }\n\n return url;\n}\n\nfunction findHandler(handlers, method, url, body, parameters, headers, baseURL) {\n return find(handlers[method.toLowerCase()], function(handler) {\n if (typeof handler[0] === 'string') {\n return (isUrlMatching(url, handler[0]) || isUrlMatching(combineUrls(baseURL, url), handler[0])) && isBodyOrParametersMatching(method, body, parameters, handler[1]) && isRequestHeadersMatching(headers, handler[2]);\n } else if (handler[0] instanceof RegExp) {\n return (handler[0].test(url) || handler[0].test(combineUrls(baseURL, url))) && isBodyOrParametersMatching(method, body, parameters, handler[1]) && isRequestHeadersMatching(headers, handler[2]);\n }\n });\n}\n\nfunction isUrlMatching(url, required) {\n var noSlashUrl = url[0] === '/' ? url.substr(1) : url;\n var noSlashRequired = required[0] === '/' ? required.substr(1) : required;\n return (noSlashUrl === noSlashRequired);\n}\n\nfunction isRequestHeadersMatching(requestHeaders, required) {\n if (required === undefined) return true;\n return isEqual(requestHeaders, required);\n}\n\nfunction isBodyOrParametersMatching(method, body, parameters, required) {\n var allowedParamsMethods = ['delete', 'get', 'head', 'options'];\n if (allowedParamsMethods.indexOf(method.toLowerCase()) >= 0 ) {\n var params = required ? required.params : undefined;\n return isParametersMatching(parameters, params);\n } else {\n return isBodyMatching(body, required);\n }\n}\n\nfunction isParametersMatching(parameters, required) {\n if (required === undefined) return true;\n\n return isEqual(parameters, required);\n}\n\nfunction isBodyMatching(body, requiredBody) {\n if (requiredBody === undefined) {\n return true;\n }\n var parsedBody;\n try {\n parsedBody = JSON.parse(body);\n } catch (e) { }\n return parsedBody ? isEqual(parsedBody, requiredBody) : isEqual(body, requiredBody);\n}\n\nfunction purgeIfReplyOnce(mock, handler) {\n Object.keys(mock.handlers).forEach(function(key) {\n var index = mock.handlers[key].indexOf(handler);\n if (index > -1) {\n mock.handlers[key].splice(index, 1);\n }\n });\n}\n\nfunction settle(resolve, reject, response, delay) {\n if (delay > 0) {\n setTimeout(function() {\n settle(resolve, reject, response);\n }, delay);\n return;\n }\n\n if (response.config && response.config.validateStatus) {\n response.config.validateStatus(response.status)\n ? resolve(response)\n : reject(createErrorResponse(\n 'Request failed with status code ' + response.status,\n response.config,\n response\n ));\n return;\n }\n\n // Support for axios < 0.11\n if (response.status >= 200 && response.status < 300) {\n resolve(response);\n } else {\n reject(response);\n }\n}\n\nfunction createErrorResponse(message, config, response) {\n // Support for axios < 0.13.0\n if (!rejectWithError) return response;\n\n var error = new Error(message);\n error.config = config;\n error.response = response;\n return error;\n}\n\nfunction isSimpleObject(value) {\n return value !== null && value !== undefined && value.toString() === '[object Object]';\n}\n\nmodule.exports = {\n find: find,\n findHandler: findHandler,\n isSimpleObject: isSimpleObject,\n purgeIfReplyOnce: purgeIfReplyOnce,\n settle: settle\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy91dGlscy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL3V0aWxzLmpzP2NlZTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoJ2RlZXAtZXF1YWwnKTtcblxuZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIHJldHVybiBkZWVwRXF1YWwoYSwgYiwgeyBzdHJpY3Q6IHRydWUgfSk7XG59XG5cbi8vIDwgMC4xMy4wIHdpbGwgbm90IGhhdmUgZGVmYXVsdCBoZWFkZXJzIHNldCBvbiBhIGN1c3RvbSBpbnN0YW5jZVxudmFyIHJlamVjdFdpdGhFcnJvciA9ICEhYXhpb3MuY3JlYXRlKCkuZGVmYXVsdHMuaGVhZGVycztcblxuZnVuY3Rpb24gZmluZChhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpXTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVVcmxzKGJhc2VVUkwsIHVybCkge1xuICBpZiAoYmFzZVVSTCkge1xuICAgIHJldHVybiBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gZmluZEhhbmRsZXIoaGFuZGxlcnMsIG1ldGhvZCwgdXJsLCBib2R5LCBwYXJhbWV0ZXJzLCBoZWFkZXJzLCBiYXNlVVJMKSB7XG4gIHJldHVybiBmaW5kKGhhbmRsZXJzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSwgZnVuY3Rpb24oaGFuZGxlcikge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlclswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoaXNVcmxNYXRjaGluZyh1cmwsIGhhbmRsZXJbMF0pIHx8IGlzVXJsTWF0Y2hpbmcoY29tYmluZVVybHMoYmFzZVVSTCwgdXJsKSwgaGFuZGxlclswXSkpICYmIGlzQm9keU9yUGFyYW1ldGVyc01hdGNoaW5nKG1ldGhvZCwgYm9keSwgcGFyYW1ldGVycywgaGFuZGxlclsxXSkgICYmIGlzUmVxdWVzdEhlYWRlcnNNYXRjaGluZyhoZWFkZXJzLCBoYW5kbGVyWzJdKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXJbMF0gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiAoaGFuZGxlclswXS50ZXN0KHVybCkgfHwgaGFuZGxlclswXS50ZXN0KGNvbWJpbmVVcmxzKGJhc2VVUkwsIHVybCkpKSAmJiBpc0JvZHlPclBhcmFtZXRlcnNNYXRjaGluZyhtZXRob2QsIGJvZHksIHBhcmFtZXRlcnMsIGhhbmRsZXJbMV0pICYmIGlzUmVxdWVzdEhlYWRlcnNNYXRjaGluZyhoZWFkZXJzLCBoYW5kbGVyWzJdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1VybE1hdGNoaW5nKHVybCwgcmVxdWlyZWQpIHtcbiAgdmFyIG5vU2xhc2hVcmwgPSB1cmxbMF0gPT09ICcvJyA/IHVybC5zdWJzdHIoMSkgOiB1cmw7XG4gIHZhciBub1NsYXNoUmVxdWlyZWQgPSByZXF1aXJlZFswXSA9PT0gJy8nID8gcmVxdWlyZWQuc3Vic3RyKDEpIDogcmVxdWlyZWQ7XG4gIHJldHVybiAobm9TbGFzaFVybCA9PT0gbm9TbGFzaFJlcXVpcmVkKTtcbn1cblxuZnVuY3Rpb24gaXNSZXF1ZXN0SGVhZGVyc01hdGNoaW5nKHJlcXVlc3RIZWFkZXJzLCByZXF1aXJlZCkge1xuICBpZiAocmVxdWlyZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpc0VxdWFsKHJlcXVlc3RIZWFkZXJzLCByZXF1aXJlZCk7XG59XG5cbmZ1bmN0aW9uIGlzQm9keU9yUGFyYW1ldGVyc01hdGNoaW5nKG1ldGhvZCwgYm9keSwgcGFyYW1ldGVycywgcmVxdWlyZWQpIHtcbiAgdmFyIGFsbG93ZWRQYXJhbXNNZXRob2RzID0gWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddO1xuICBpZiAoYWxsb3dlZFBhcmFtc01ldGhvZHMuaW5kZXhPZihtZXRob2QudG9Mb3dlckNhc2UoKSkgPj0gMCApIHtcbiAgICB2YXIgcGFyYW1zID0gcmVxdWlyZWQgPyByZXF1aXJlZC5wYXJhbXMgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzUGFyYW1ldGVyc01hdGNoaW5nKHBhcmFtZXRlcnMsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlzQm9keU1hdGNoaW5nKGJvZHksIHJlcXVpcmVkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BhcmFtZXRlcnNNYXRjaGluZyhwYXJhbWV0ZXJzLCByZXF1aXJlZCkge1xuICBpZiAocmVxdWlyZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzRXF1YWwocGFyYW1ldGVycywgcmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiBpc0JvZHlNYXRjaGluZyhib2R5LCByZXF1aXJlZEJvZHkpIHtcbiAgaWYgKHJlcXVpcmVkQm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHBhcnNlZEJvZHk7XG4gIHRyeSB7XG4gICAgcGFyc2VkQm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gIH0gY2F0Y2ggKGUpIHsgfVxuICByZXR1cm4gcGFyc2VkQm9keSA/IGlzRXF1YWwocGFyc2VkQm9keSwgcmVxdWlyZWRCb2R5KSA6IGlzRXF1YWwoYm9keSwgcmVxdWlyZWRCb2R5KTtcbn1cblxuZnVuY3Rpb24gcHVyZ2VJZlJlcGx5T25jZShtb2NrLCBoYW5kbGVyKSB7XG4gIE9iamVjdC5rZXlzKG1vY2suaGFuZGxlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gbW9jay5oYW5kbGVyc1trZXldLmluZGV4T2YoaGFuZGxlcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIG1vY2suaGFuZGxlcnNba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlLCBkZWxheSkge1xuICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcbiAgICB9LCBkZWxheSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNvbmZpZyAmJiByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXMpIHtcbiAgICByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgPyByZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgOiByZWplY3QoY3JlYXRlRXJyb3JSZXNwb25zZShcbiAgICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgICByZXNwb25zZVxuICAgICAgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBmb3IgYXhpb3MgPCAwLjExXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChyZXNwb25zZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JSZXNwb25zZShtZXNzYWdlLCBjb25maWcsIHJlc3BvbnNlKSB7XG4gIC8vIFN1cHBvcnQgZm9yIGF4aW9zIDwgMC4xMy4wXG4gIGlmICghcmVqZWN0V2l0aEVycm9yKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBmaW5kOiBmaW5kLFxuICBmaW5kSGFuZGxlcjogZmluZEhhbmRsZXIsXG4gIGlzU2ltcGxlT2JqZWN0OiBpc1NpbXBsZU9iamVjdCxcbiAgcHVyZ2VJZlJlcGx5T25jZTogcHVyZ2VJZlJlcGx5T25jZSxcbiAgc2V0dGxlOiBzZXR0bGVcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/index.js":
/*!***************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/index.js ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__(/*! ./lib/axios */ \"./node_modules/_axios@0.19.0@axios/lib/axios.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2luZGV4LmpzPzI0MjciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/index.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js":
/*!**************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar settle = __webpack_require__(/*! ./../core/settle */ \"./node_modules/_axios@0.19.0@axios/lib/core/settle.js\");\nvar buildURL = __webpack_require__(/*! ./../helpers/buildURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\");\nvar parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js\");\nvar isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js\");\nvar createError = __webpack_require__(/*! ../core/createError */ \"./node_modules/_axios@0.19.0@axios/lib/core/createError.js\");\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = __webpack_require__(/*! ./../helpers/cookies */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js\");\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYWRhcHRlcnMveGhyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz8xM2E3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkIHx8ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChjb25maWcudXJsLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGVcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIWNvbmZpZy5yZXNwb25zZVR5cGUgfHwgY29uZmlnLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnID8gcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdOZXR3b3JrIEVycm9yJywgY29uZmlnLCBudWxsLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcigndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICAgIGlmICh1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpKSB7XG4gICAgICB2YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG5cbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihjb25maWcudXJsKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgRE9NRXhjZXB0aW9uIHRocm93biBieSBicm93c2VycyBub3QgY29tcGF0aWJsZSBYTUxIdHRwUmVxdWVzdCBMZXZlbCAyLlxuICAgICAgICAvLyBCdXQsIHRoaXMgY2FuIGJlIHN1cHByZXNzZWQgZm9yICdqc29uJyB0eXBlIGFzIGl0IGNhbiBiZSBwYXJzZWQgYnkgZGVmYXVsdCAndHJhbnNmb3JtUmVzcG9uc2UnIGZ1bmN0aW9uLlxuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gb25DYW5jZWxlZChjYW5jZWwpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZWplY3QoY2FuY2VsKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/axios.js":
/*!*******************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/axios.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\");\nvar Axios = __webpack_require__(/*! ./core/Axios */ \"./node_modules/_axios@0.19.0@axios/lib/core/Axios.js\");\nvar mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ \"./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\");\nvar defaults = __webpack_require__(/*! ./defaults */ \"./node_modules/_axios@0.19.0@axios/lib/defaults.js\");\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\");\naxios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js\");\naxios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\");\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = __webpack_require__(/*! ./helpers/spread */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js\");\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYXhpb3MuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYXhpb3MuanM/YjI5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG5heGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGF4aW9zLmRlZmF1bHRzLCBpbnN0YW5jZUNvbmZpZykpO1xufTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWwnKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/axios.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js":
/*!***************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL0NhbmNlbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzPzY5MzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBDYW5jZWwobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xufVxuXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnQ2FuY2VsJyArICh0aGlzLm1lc3NhZ2UgPyAnOiAnICsgdGhpcy5tZXNzYWdlIDogJycpO1xufTtcblxuQ2FuY2VsLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js":
/*!********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar Cancel = __webpack_require__(/*! ./Cancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\");\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz8xYzBmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcbiAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gIGlmICh0aGlzLnJlYXNvbikge1xuICAgIHRocm93IHRoaXMucmVhc29uO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gKi9cbkNhbmNlbFRva2VuLnNvdXJjZSA9IGZ1bmN0aW9uIHNvdXJjZSgpIHtcbiAgdmFyIGNhbmNlbDtcbiAgdmFyIHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICBjYW5jZWwgPSBjO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsVG9rZW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js":
/*!*****************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9kZWFkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/Axios.js":
/*!************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/Axios.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar buildURL = __webpack_require__(/*! ../helpers/buildURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\");\nvar InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ \"./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js\");\nvar dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ \"./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js\");\nvar mergeConfig = __webpack_require__(/*! ./mergeConfig */ \"./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\");\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n config.method = config.method ? config.method.toLowerCase() : 'get';\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9BeGlvcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL0F4aW9zLmpzPzUyMWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QgPyBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCkgOiAnZ2V0JztcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/Axios.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js":
/*!*************************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanM/YWM5YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/createError.js":
/*!******************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/createError.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar enhanceError = __webpack_require__(/*! ./enhanceError */ \"./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js\");\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9jcmVhdGVFcnJvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzPzZkMmYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/createError.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js":
/*!**********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar transformData = __webpack_require__(/*! ./transformData */ \"./node_modules/_axios@0.19.0@axios/lib/core/transformData.js\");\nvar isCancel = __webpack_require__(/*! ../cancel/isCancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\");\nvar defaults = __webpack_require__(/*! ../defaults */ \"./node_modules/_axios@0.19.0@axios/lib/defaults.js\");\nvar isAbsoluteURL = __webpack_require__(/*! ./../helpers/isAbsoluteURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js\");\nvar combineURLs = __webpack_require__(/*! ./../helpers/combineURLs */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js\");\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanM/NTZiOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBTdXBwb3J0IGJhc2VVUkwgY29uZmlnXG4gIGlmIChjb25maWcuYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChjb25maWcudXJsKSkge1xuICAgIGNvbmZpZy51cmwgPSBjb21iaW5lVVJMcyhjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gIH1cblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js":
/*!*******************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanM/NTAzYSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIGVycm9yLmlzQXhpb3NFcnJvciA9IHRydWU7XG5cbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js":
/*!******************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n }\n });\n\n utils.forEach(['headers', 'auth', 'proxy'], function mergeDeepProperties(prop) {\n if (utils.isObject(config2[prop])) {\n config[prop] = utils.deepMerge(config1[prop], config2[prop]);\n } else if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (utils.isObject(config1[prop])) {\n config[prop] = utils.deepMerge(config1[prop]);\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n utils.forEach([\n 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',\n 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'maxContentLength',\n 'validateStatus', 'maxRedirects', 'httpAgent', 'httpsAgent', 'cancelToken',\n 'socketPath'\n ], function defaultToConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n return config;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzPzE1ZDUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIHV0aWxzLmZvckVhY2goWyd1cmwnLCAnbWV0aG9kJywgJ3BhcmFtcycsICdkYXRhJ10sIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICB1dGlscy5mb3JFYWNoKFsnaGVhZGVycycsICdhdXRoJywgJ3Byb3h5J10sIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICh1dGlscy5pc09iamVjdChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gdXRpbHMuZGVlcE1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IHV0aWxzLmRlZXBNZXJnZShjb25maWcxW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcxW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMVtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2goW1xuICAgICdiYXNlVVJMJywgJ3RyYW5zZm9ybVJlcXVlc3QnLCAndHJhbnNmb3JtUmVzcG9uc2UnLCAncGFyYW1zU2VyaWFsaXplcicsXG4gICAgJ3RpbWVvdXQnLCAnd2l0aENyZWRlbnRpYWxzJywgJ2FkYXB0ZXInLCAncmVzcG9uc2VUeXBlJywgJ3hzcmZDb29raWVOYW1lJyxcbiAgICAneHNyZkhlYWRlck5hbWUnLCAnb25VcGxvYWRQcm9ncmVzcycsICdvbkRvd25sb2FkUHJvZ3Jlc3MnLCAnbWF4Q29udGVudExlbmd0aCcsXG4gICAgJ3ZhbGlkYXRlU3RhdHVzJywgJ21heFJlZGlyZWN0cycsICdodHRwQWdlbnQnLCAnaHR0cHNBZ2VudCcsICdjYW5jZWxUb2tlbicsXG4gICAgJ3NvY2tldFBhdGgnXG4gIF0sIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMVtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzFbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/settle.js":
/*!*************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/settle.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar createError = __webpack_require__(/*! ./createError */ \"./node_modules/_axios@0.19.0@axios/lib/core/createError.js\");\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9zZXR0bGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9zZXR0bGUuanM/OTM3YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/settle.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/core/transformData.js":
/*!********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/core/transformData.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz9mOThjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/transformData.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/defaults.js":
/*!**********************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/defaults.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js\");\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n // Only Node.JS has a process variable that is of [[Class]] process\n if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = __webpack_require__(/*! ./adapters/http */ \"./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\");\n } else if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(/*! ./adapters/xhr */ \"./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\");\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_process@0.11.10@process/browser.js */ \"./node_modules/_process@0.11.10@process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvZGVmYXVsdHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvZGVmYXVsdHMuanM/YTMxMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICAvLyBPbmx5IE5vZGUuSlMgaGFzIGEgcHJvY2VzcyB2YXJpYWJsZSB0aGF0IGlzIG9mIFtbQ2xhc3NdXSBwcm9jZXNzXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMveGhyJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/defaults.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js":
/*!**************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9iaW5kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz9jOWVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js":
/*!******************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9oZWxwZXJzL2J1aWxkVVJMLmpzP2M5NmIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB2YXIgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuXG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js":
/*!*********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzA5MmIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js":
/*!*****************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz8xMjYyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js":
/*!***********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz85ODg0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkXFwrXFwtXFwuXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js":
/*!*************************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanM/ZjFiZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgdmFyIG9yaWdpblVSTDtcblxuICAgICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js":
/*!*****************************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz8wM2NlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsIG5vcm1hbGl6ZWROYW1lKSB7XG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChuYW1lICE9PSBub3JtYWxpemVkTmFtZSAmJiBuYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWROYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZE5hbWVdID0gdmFsdWU7XG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcbiAgICB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js":
/*!**********************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/ZmI3NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js":
/*!****************************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9zcHJlYWQuanM/OGNjOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js\n");
/***/ }),
/***/ "./node_modules/_axios@0.19.0@axios/lib/utils.js":
/*!*******************************************************!*\
!*** ./node_modules/_axios@0.19.0@axios/lib/utils.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\");\nvar isBuffer = __webpack_require__(/*! is-buffer */ \"./node_modules/_is-buffer@2.0.4@is-buffer/index.js\");\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Function equal to merge with the difference being that no reference\n * to original objects is kept.\n *\n * @see merge\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction deepMerge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = deepMerge(result[key], val);\n } else if (typeof val === 'object') {\n result[key] = deepMerge({}, val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n deepMerge: deepMerge,\n extend: extend,\n trim: trim\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvdXRpbHMuanM/NGExNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBpc0J1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05TJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGVxdWFsIHRvIG1lcmdlIHdpdGggdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBubyByZWZlcmVuY2VcbiAqIHRvIG9yaWdpbmFsIG9iamVjdHMgaXMga2VwdC5cbiAqXG4gKiBAc2VlIG1lcmdlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBkZWVwTWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtOiBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1N0YW5kYXJkQnJvd3NlckVudjogaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZGVlcE1lcmdlOiBkZWVwTWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/utils.js\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&":
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js& ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var _components_home_header_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @components/home/header/header.vue */ \"./src/components/home/header/header.vue\");\n/* harmony import */ var _components_home_footer_footer_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/home/footer/footer.vue */ \"./src/components/home/footer/footer.vue\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\nvar UA = __webpack_require__(/*! ua-device */ \"./node_modules/_ua-device@0.1.10@ua-device/index.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"app\",\n components: {\n VHeader: _components_home_header_header_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n VFooter: _components_home_footer_footer_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n },\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_4__[\"mapState\"])({\n isMobile: function isMobile(state) {\n return state.isMobile;\n }\n })),\n methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_4__[\"mapActions\"])([\"pcorphone\"]), {\n // 设置UA\n refreshUA: function refreshUA() {\n var output = new UA(navigator.userAgent);\n var deviceType = output.device.type;\n var isMobile = deviceType == \"mobile\";\n this.$store.commit(\"IS_MOBILE\", isMobile);\n },\n refreshProfile: function refreshProfile() {\n var _this = this;\n\n var userInfoStr = decodeURIComponent(Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_5__[\"getCookie\"])(\"_user_profile\"));\n\n if (userInfoStr) {\n try {\n var userInfo = JSON.parse(decodeURIComponent(userInfoStr));\n this.$store.commit(\"SET_USER_INFO\", userInfo);\n\n if (userInfo && userInfo.sid) {\n Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_9__[\"httpPost\"])({\n url: _api_api__WEBPACK_IMPORTED_MODULE_8___default.a.baseInfo,\n sidStr: userInfo.sid\n }).then(function (res) {\n if (res) {\n _this.$store.commit(\"SET_USER_INFO\", userInfo);\n } else {\n _this.$store.commit(\"SET_USER_INFO\", null);\n }\n });\n }\n } catch (e) {}\n }\n }\n }),\n created: function created() {\n // window.onresize = () => {\n // this.refreshUA();\n // };\n this.refreshUA(); //\n\n this.refreshProfile();\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9BcHAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BcHAudnVlPzIzNGUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGlkPVwiYXBwXCI+XG4gICAgPHYtaGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI+PC92LWhlYWRlcj5cbiAgICA8bWFpbiByZWY9XCJjb250YWluZXJcIiBjbGFzcz1cIm1haW4tY29udGFpbmVyXCI+XG4gICAgICA8cm91dGVyLXZpZXcgLz5cbiAgICA8L21haW4+XG4gICAgPHYtZm9vdGVyPjwvdi1mb290ZXI+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuXG48c2NyaXB0PlxuaW1wb3J0IHsgbWFwR2V0dGVycywgbWFwQWN0aW9ucywgbWFwU3RhdGUgfSBmcm9tIFwidnVleFwiO1xuaW1wb3J0IHsgZ2V0Q29va2llIH0gZnJvbSBcIkB1dGlscy91dGlscy5qc1wiO1xuaW1wb3J0IFZIZWFkZXIgZnJvbSBcIkBjb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWVcIjtcbmltcG9ydCBWRm9vdGVyIGZyb20gXCJAY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlXCI7XG5cbmltcG9ydCBhcGkgZnJvbSBcIkAvYXBpL2FwaVwiO1xuaW1wb3J0IHsgaHR0cEdldCwgaHR0cFBvc3QgfSBmcm9tIFwiQC9hcGkvZmV0Y2gtYXBpLmpzXCI7XG5cbnZhciBVQSA9IHJlcXVpcmUoXCJ1YS1kZXZpY2VcIik7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogXCJhcHBcIixcbiAgY29tcG9uZW50czoge1xuICAgIFZIZWFkZXIsXG4gICAgVkZvb3RlclxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIC4uLm1hcFN0YXRlKHtcbiAgICAgIGlzTW9iaWxlOiBzdGF0ZSA9PiBzdGF0ZS5pc01vYmlsZVxuICAgIH0pXG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICAuLi5tYXBBY3Rpb25zKFtcInBjb3JwaG9uZVwiXSksXG4gICAgLy8g6K6+572uVUFcbiAgICByZWZyZXNoVUEoKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gbmV3IFVBKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgbGV0IGRldmljZVR5cGUgPSBvdXRwdXQuZGV2aWNlLnR5cGU7XG4gICAgICBsZXQgaXNNb2JpbGUgPSBkZXZpY2VUeXBlID09IFwibW9iaWxlXCI7XG4gICAgICB0aGlzLiRzdG9yZS5jb21taXQoXCJJU19NT0JJTEVcIiwgaXNNb2JpbGUpO1xuICAgIH0sXG4gICAgcmVmcmVzaFByb2ZpbGUoKSB7XG4gICAgICBsZXQgdXNlckluZm9TdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0Q29va2llKFwiX3VzZXJfcHJvZmlsZVwiKSk7XG4gICAgICBpZiAodXNlckluZm9TdHIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgdXNlckluZm8gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh1c2VySW5mb1N0cikpO1xuICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgdXNlckluZm8pO1xuICAgICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zaWQpIHtcbiAgICAgICAgICAgIGh0dHBQb3N0KHsgdXJsOiBhcGkuYmFzZUluZm8sIHNpZFN0cjogdXNlckluZm8uc2lkIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgdXNlckluZm8pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgbnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5yZWZyZXNoVUEoKTtcbiAgICAvLyB9O1xuICAgIHRoaXMucmVmcmVzaFVBKCk7XG4gICAgLy9cbiAgICB0aGlzLnJlZnJlc2hQcm9maWxlKCk7XG4gIH1cbn07XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0IFwiQC9zdHlsZXMvX3N1cHBvcnRcIjtcblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBcIk1pY3Jvc29mdCBZYUhlaVwiLCBcIkFyaWFsXCI7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgd29yZC1zcGFjaW5nOiAxcHg7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC8vIGNvbG9yOiAjMzMzO1xuICBjb2xvcjogJGNGb250R3JheTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgLy8gLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8vIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLy8gLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgLy8gLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmJvZHkge1xuICBmb250LXNpemU6ICRmb250U2l6ZTtcbn1cblxuaHRtbCxcbmJvZHkge1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7XG59XG5cbmJvZHksXG5kaXYge1xuICBib3JkZXI6IDA7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuKixcbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMDtcbn1cblxuYm9keSxcbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNixcbmhyLFxucCxcbmJsb2NrcXVvdGUsXG5kbCxcbmR0LFxuZGQsXG51bCxcbm9sLFxubGksXG5wcmUsXG5mb3JtLFxuZmllbGRzZXQsXG5sZWdlbmQsXG5idXR0b24sXG5pbnB1dCxcbnRleHRhcmVhLFxudGgsXG50ZCxcbmlmcmFtZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuaW1nLFxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5tZW51LFxubmF2LFxuc2VjdGlvbixcbnN1bW1hcnksXG50aW1lLFxubWFyayxcbmF1ZGlvLFxudmlkZW8ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDEwMCU7XG59XG5cbmZpZWxkc2V0LFxuaW1nIHtcbiAgYm9yZGVyOiAwO1xufVxuXG5hZGRyZXNzLFxuY2FwdGlvbixcbmNpdGUsXG5kZm4sXG5lbSxcbnRoLFxudmFyLFxuaSxcbmVtIHtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuXG5vbCxcbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6IGluaGVyaXQ7XG4gICY6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxufVxuXG5hLFxubGFiZWwsXG5idXR0b24sXG5pbnB1dCxcbnNlbGVjdCB7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcbn1cblxuaW5wdXQsXG5zZWxlY3QsXG5idXR0b24ge1xuICAvLyBmb250OiAxMDAlIHRhaG9tYSwgXCJcXDViOGJcXDRmNTNcIiwgYXJpYWw7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbnNlbGVjdCB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xufVxuc2VsZWN0OjotbXMtZXhwYW5kIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuaW5wdXQge1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0LFxuaW5wdXRbdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFxuaW5wdXRbdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5pbnB1dFt0eXBlPVwiZmlsZVwiXSA+IGlucHV0W3R5cGU9XCJidXR0b25cIl06Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXI6IG5vbmU7XG59XG5cbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50O1xuICBtYXJnaW46IDA7XG59XG5cbmlucHV0Oi13ZWJraXQtYXV0b2ZpbGwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAwIDEwMDBweCB3aGl0ZSBpbnNldDtcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSxcbmlucHV0W3R5cGU9XCJ0ZWxcIl0sXG5pbnB1dFt0eXBlPVwidGV4dFwiXSxcbmlucHV0IHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOyAvKuWOu+mZpOezu+e7n+m7mOiupOeahOagt+W8jyovXG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8vIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5pbnB1dDo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbixcbmlucHV0Ojotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuLy8gICBjb2xvcjogJGNHcmF5ICFpbXBvcnRhbnQ7XG4vLyB9XG5cbjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG46LW1vei1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG46Oi1tb3otcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGNHcmF5O1xuICBvcGFjaXR5OiAxO1xufVxuOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG5cbnNlbGVjdCxcbmlucHV0LFxub3B0aW9uIHtcbiAgY29sb3I6ICRjTGlnaHRCbGFjaztcbn1cblxudGV4dGFyZWEge1xuICBvdXRsaW5lOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHJlc2l6ZTogbm9uZTtcbiAgLy8gZm9udDogMTAwJSB0YWhvbWEsIFwiXFw1YjhiXFw0ZjUzXCIsIGFyaWFsO1xuICBjb2xvcjogJGNMaWdodEJsYWNrO1xufVxuXG4jYXBwIHtcbiAgYm9yZGVyOiAwO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5tYWluLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuXG4gICY6OmFmdGVyIHtcbiAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGNsZWFyOiBib3RoO1xuICB9XG59XG5cbi5jb250ZW50IHtcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJveC13IHtcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJveCB7XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwIGF1dG87XG59XG5cbi5tLXdpZHRoIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogMCA0JTtcbn1cblxuLmZvY3VzIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJGNPcmFuZ2U7XG59XG5cbi8vIC8vIOinhumikVxuLnZpZGVvLWpzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlclJhZGl1c1NtYWxsO1xufVxuXG4udmlkZW8tanMgLnZqcy10ZWNoLFxuLnZpZGVvLWpzIC52anMtcG9zdGVyIHtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlclJhZGl1c1NtYWxsO1xufVxuXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24ge1xuICB0b3A6IDAgIWltcG9ydGFudDtcbiAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gIGxlZnQ6IDAgIWltcG9ydGFudDtcbiAgcmlnaHQ6IDAgIWltcG9ydGFudDtcbiAgbWFyZ2luOiBhdXRvICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXNsaWRlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRjT3JhbmdlICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXBvc3RlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG59XG5cbi8vIHZhbnRcbi52LWhlYWRlciB7XG4gIC52YW4tY2VsbCB7XG4gICAgcGFkZGluZzogMTZweCAxNnB4ICFpbXBvcnRhbnQ7XG4gIH1cblxuICAudmFuLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAudmFuLWNlbGw6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXIge1xuICAgIGxlZnQ6IDA7XG4gIH1cbn1cblxuLmZsZXgtY2VudGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXJcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkge1xuICAucGFnZS1pbmRleCB7XG4gICAgLnZpZGVvLWpzIHtcbiAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cblxuICAjYXBwIHtcbiAgICAuaGVhZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAubWFpbi1jb250YWluZXIge1xuICAgICAgcGFkZGluZy10b3A6ICRuYXZIZWlnaHQtTTtcbiAgICB9XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gICRmb250U2l6ZVRpdGxlOiAkZm9udFNpemVUaXRsZS1NO1xuICAkZm9udFNpemU6ICRmb250U2l6ZS1NO1xuICAkZm9udFNpemVTbWFsbDogJGZvbnRTaXplU21hbGwtTTtcbiAgLm1haW4tY29udGFpbmVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAkbWFyZ2luTWVkaXVtLU07XG4gIH1cbn1cbjwvc3R5bGU+XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTtBQUFBO0FBQUE7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFCQTtBQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&":
/*!*******************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js& ***!
\*******************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"DropDownList\",\n data: function data() {\n return {\n activeIndex: 0,\n sTitle: this.dataObj && this.dataObj.name || ''\n };\n },\n props: {\n type: {\n type: String,\n default: function _default() {\n return \"nav\";\n }\n },\n dataObj: {\n type: Object,\n default: function _default() {\n return {};\n }\n },\n dataList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n labelProperty: {\n type: String,\n default: function _default() {\n return \"name\";\n }\n }\n },\n directives: {\n dpl: {\n bind: function bind(el) {\n el.style.display = \"none\";\n }\n }\n },\n methods: {\n onNavHandler: function onNavHandler() {\n var path = this.dataObj && this.dataObj.path || \"\";\n\n if (path) {\n this.$router.push({\n path: path\n });\n }\n },\n onOverHandler: function onOverHandler(event) {\n var ul = event.currentTarget.childNodes[1].childNodes[1];\n ul.style.display = \"block\";\n },\n onOutHandler: function onOutHandler(event) {\n // console.log(event);\n var ul = event.currentTarget.childNodes[1].childNodes[1];\n ul.style.display = \"none\";\n },\n onClickHandler: function onClickHandler(event, index) {\n // 隐藏其他\n // let path = event.path || (event.composedPath && event.composedPath()); //兼容火狐和safari\n // path[1].style.display = \"none\";\n if (this.$refs.ul) {\n this.$refs.ul.style.display = \"none\";\n } // 选择item\n\n\n this.activeIndex = index;\n var curData = this.dataList[index];\n\n if (this.type == \"lang\") {\n // 如果是语言设置,则设置语言\n var lang = curData.value;\n this.$i18n.locale = lang;\n localStorage.setItem(\"lang\", lang);\n this.sTitle = curData.name;\n window.location.reload();\n } else {\n // if (curData.value == \"logout\") {\n // \tthis.loginHandler();\n // } else {\n // \tthis.$router.push({\n // \t\tpath: curData.path\n // \t})\n // }\n console.log(curData);\n var item = curData;\n var path = item && item.path || \"\";\n\n if (path) {\n this.$router.push({\n path: path\n });\n } else {\n var value = item && item.value || null;\n\n if (value) {\n switch (value) {\n case \"logout\":\n this.loginHandler();\n break;\n\n case \"gotoVHIS\":\n Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_4__[\"gotoVHIS\"])(this.$i18n.locale);\n break;\n }\n }\n }\n }\n },\n loginHandler: function loginHandler() {\n var _this = this;\n\n Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_3__[\"httpPost\"])({\n url: _api_api__WEBPACK_IMPORTED_MODULE_2___default.a.logout\n }).then(function () {\n _this.$store.commit(\"SET_USER_INFO\", null);\n\n _this.showLogoutTip();\n });\n },\n showLogoutTip: function showLogoutTip() {// 登出后的提示\n // alert(\"登出成功\");\n },\n updateTitle: function updateTitle(name) {\n this.sTitle = name || this.sTitle;\n }\n },\n computed: {\n dplLable: function dplLable() {\n return this.dataList[this.activeIndex][this.labelProperty];\n }\n },\n created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9kcm9wZG93bi9kcm9wZG93bi5qcz85Mzc1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdG1hcFN0YXRlXG59IGZyb20gJ3Z1ZXgnXG5cbmltcG9ydCBhcGkgZnJvbSAnQC9hcGkvYXBpJ1xuaW1wb3J0IHtcblx0aHR0cFBvc3Rcbn0gZnJvbSAnQC9hcGkvZmV0Y2gtYXBpLmpzJ1xuXG5pbXBvcnQgeyBnb3RvVkhJUyB9IGZyb20gJ0AvdXRpbHMvYml6LmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXHRuYW1lOiBcIkRyb3BEb3duTGlzdFwiLFxuXHRkYXRhKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY3RpdmVJbmRleDogMCxcblx0XHRcdHNUaXRsZTogdGhpcy5kYXRhT2JqICYmIHRoaXMuZGF0YU9iai5uYW1lIHx8ICcnLFxuXHRcdH07XG5cdH0sXG5cdHByb3BzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0dHlwZTogU3RyaW5nLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIFwibmF2XCI7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkYXRhT2JqOiB7XG5cdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkYXRhTGlzdDoge1xuXHRcdFx0dHlwZTogQXJyYXksXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRsYWJlbFByb3BlcnR5OiB7XG5cdFx0XHR0eXBlOiBTdHJpbmcsXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gXCJuYW1lXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRkaXJlY3RpdmVzOiB7XG5cdFx0ZHBsOiB7XG5cdFx0XHRiaW5kKGVsKSB7XG5cdFx0XHRcdGVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdG1ldGhvZHM6IHtcblx0XHRvbk5hdkhhbmRsZXIoKSB7XG5cdFx0XHRsZXQgcGF0aCA9IHRoaXMuZGF0YU9iaiAmJiB0aGlzLmRhdGFPYmoucGF0aCB8fCBcIlwiO1xuXHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRcdHBhdGg6IHBhdGhcblx0XHRcdFx0fSlcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uT3ZlckhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdGxldCB1bCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdO1xuXHRcdFx0dWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0XHR9LFxuXHRcdG9uT3V0SGFuZGxlcihldmVudCkge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coZXZlbnQpO1xuXHRcdFx0bGV0IHVsID0gZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV07XG5cdFx0XHR1bC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0fSxcblx0XHRvbkNsaWNrSGFuZGxlcihldmVudCwgaW5kZXgpIHtcblx0XHRcdC8vIOmakOiXj+WFtuS7llxuXHRcdFx0Ly8gbGV0IHBhdGggPSBldmVudC5wYXRoIHx8IChldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKCkpOyAvL+WFvOWuueeBq+eLkOWSjHNhZmFyaVxuXHRcdFx0Ly8gcGF0aFsxXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHRpZiAodGhpcy4kcmVmcy51bCkge1xuXHRcdFx0XHR0aGlzLiRyZWZzLnVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8g6YCJ5oupaXRlbVxuXHRcdFx0dGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuXHRcdFx0bGV0IGN1ckRhdGEgPSB0aGlzLmRhdGFMaXN0W2luZGV4XTtcblx0XHRcdGlmICh0aGlzLnR5cGUgPT0gXCJsYW5nXCIpIHtcblx0XHRcdFx0Ly8g5aaC5p6c5piv6K+t6KiA6K6+572u77yM5YiZ6K6+572u6K+t6KiAXG5cdFx0XHRcdGxldCBsYW5nID0gY3VyRGF0YS52YWx1ZTtcblx0XHRcdFx0dGhpcy4kaTE4bi5sb2NhbGUgPSBsYW5nO1xuXHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImxhbmdcIiwgbGFuZyk7XG5cdFx0XHRcdHRoaXMuc1RpdGxlID0gY3VyRGF0YS5uYW1lO1xuXHRcdFx0XHR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpZiAoY3VyRGF0YS52YWx1ZSA9PSBcImxvZ291dFwiKSB7XG5cdFx0XHRcdC8vIFx0dGhpcy5sb2dpbkhhbmRsZXIoKTtcblx0XHRcdFx0Ly8gfSBlbHNlIHtcblx0XHRcdFx0Ly8gXHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdC8vIFx0XHRwYXRoOiBjdXJEYXRhLnBhdGhcblx0XHRcdFx0Ly8gXHR9KVxuXHRcdFx0XHQvLyB9XG5cdFx0XHRcdGNvbnNvbGUubG9nKGN1ckRhdGEpO1xuXHRcdFx0XHRsZXQgaXRlbSA9IGN1ckRhdGE7XG5cdFx0XHRcdGxldCBwYXRoID0gaXRlbSAmJiBpdGVtLnBhdGggfHwgXCJcIjtcblx0XHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoOiBwYXRoXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgdmFsdWUgPSBpdGVtICYmIGl0ZW0udmFsdWUgfHwgbnVsbDtcblx0XHRcdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImxvZ291dFwiOlxuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9naW5IYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJnb3RvVkhJU1wiOlxuXHRcdFx0XHRcdFx0XHRcdGdvdG9WSElTKHRoaXMuJGkxOG4ubG9jYWxlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGxvZ2luSGFuZGxlcigpIHtcblx0XHRcdGh0dHBQb3N0KHtcblx0XHRcdFx0dXJsOiBhcGkubG9nb3V0XG5cdFx0XHR9KS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kc3RvcmUuY29tbWl0KFwiU0VUX1VTRVJfSU5GT1wiLCBudWxsKTtcblx0XHRcdFx0dGhpcy5zaG93TG9nb3V0VGlwKCk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdHNob3dMb2dvdXRUaXAoKSB7XG5cdFx0XHQvLyDnmbvlh7rlkI7nmoTmj5DnpLpcblx0XHRcdC8vIGFsZXJ0KFwi55m75Ye65oiQ5YqfXCIpO1xuXHRcdH0sXG5cdFx0dXBkYXRlVGl0bGUobmFtZSkge1xuXHRcdFx0dGhpcy5zVGl0bGUgPSBuYW1lIHx8IHRoaXMuc1RpdGxlO1xuXHRcdH1cblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHRkcGxMYWJsZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLmRhdGFMaXN0W3RoaXMuYWN0aXZlSW5kZXhdW3RoaXMubGFiZWxQcm9wZXJ0eV07XG5cdFx0fVxuXHR9LFxuXHRjcmVhdGVkKCkgeyB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFJQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFuQkE7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBREE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhGQTtBQWtGQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFoSUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&":
/*!***************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/footer/footer.js?vue&type=script&lang=js& ***!
\***************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data: function data() {\n return {\n key: 'value',\n qrcodeVisible: false\n };\n },\n components: {},\n methods: {\n toPage: function toPage(name) {\n document.documentElement.scrollTop = 0;\n document.body.scrollTop = 0;\n this.$router.push({\n name: name\n });\n },\n toPath: function toPath(path) {\n document.documentElement.scrollTop = 0;\n document.body.scrollTop = 0;\n this.$router.push({\n path: path\n });\n },\n initData: function initData() {}\n },\n mounted: function mounted() {},\n created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIuanM/MGNmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gJ0AvYXBpL2FwaSdcbmltcG9ydCB7XG5cdGh0dHBHZXQsXG5cdGh0dHBQb3N0XG59IGZyb20gJ0AvYXBpL2ZldGNoLWFwaS5qcydcblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGtleTogJ3ZhbHVlJyxcblx0XHRcdHFyY29kZVZpc2libGU6IGZhbHNlLFxuXHRcdH1cblx0fSxcblx0Y29tcG9uZW50czoge30sXG5cdG1ldGhvZHM6IHtcblx0XHR0b1BhZ2UobmFtZSkge1xuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG5cdFx0XHRkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdG5hbWU6IG5hbWVcblx0XHRcdH0pXG5cdFx0fSxcblx0XHR0b1BhdGgocGF0aCl7XG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcblx0XHRcdGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcblx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0cGF0aDogcGF0aFxuXHRcdFx0fSlcblx0XHR9LFxuXHRcdGluaXREYXRhKCkge31cblx0fSxcblx0bW91bnRlZCgpIHt9LFxuXHRjcmVhdGVkKCkge31cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBZkE7QUFpQkE7QUFDQTtBQTFCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&":
/*!***************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/header/header.js?vue&type=script&lang=js& ***!
\***************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var _components_home_dropdown_dropdown_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/home/dropdown/dropdown.vue */ \"./src/components/home/dropdown/dropdown.vue\");\n/* harmony import */ var _components_home_m_dropdown_m_dropdown_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @components/home/m-dropdown/m-dropdown.vue */ \"./src/components/home/m-dropdown/m-dropdown.vue\");\n\n\n\n\n\n\nvar _name$components$comp;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_name$components$comp = {\n name: 'VHeader',\n components: {\n VDropdown: _components_home_dropdown_dropdown_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n MDropdown: _components_home_m_dropdown_m_dropdown_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n },\n computed: {\n i18n: function i18n() {\n return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n }\n },\n data: function data() {\n return {\n dropdownMVisible: false,\n loginMVisible: false,\n maxClientWidth: 1200,\n navList: [],\n loginData: {},\n langData: {\n name: \"繁\",\n path: \"\",\n list: [{\n name: \"繁\",\n path: \"\",\n value: \"tc\"\n }, {\n name: \"简\",\n path: \"\",\n value: \"zh\"\n }, {\n name: \"EN\",\n path: \"\",\n value: \"en\"\n }]\n }\n };\n }\n}, Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"computed\", _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_5__[\"mapState\"])({\n isSmallScreen: function isSmallScreen(state) {\n return state.isSmallScreen;\n },\n userInfo: function userInfo(state) {\n return state.userInfo;\n }\n}))), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"methods\", {\n toIndex: function toIndex() {\n this.$router.push({\n path: \"/\"\n });\n },\n onShowDropdown: function onShowDropdown(evtStr) {\n this.dropdownMVisible = false;\n this.loginMVisible = false;\n\n if (evtStr == 'nav') {\n this.dropdownMVisible = true;\n } else if (evtStr == 'login') {\n this.loginMVisible = true;\n } else {}\n },\n checkIsSmallScreen: function checkIsSmallScreen() {\n var self = this;\n\n if (document.body.clientWidth > self.maxClientWidth) {\n self.$store.commit('IS_SMALL_SCREEN', false);\n } else {\n self.$store.commit('IS_SMALL_SCREEN', true);\n }\n },\n initData: function initData() {\n var i18n = this.$i18n.messages[this.$i18n.locale] || {}; // this.loginData = i18n.nav.loginData;\n\n this._buildLoginMenu();\n\n this.navList = i18n.nav.navList;\n var curLang = Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_6__[\"getObjByListKeyValue\"])(this.$i18n.locale, \"value\", this.langData.list);\n this.langData.name = curLang.name;\n },\n _buildLoginMenu: function _buildLoginMenu() {\n // 构建登录页\n var i18n = this.$i18n.messages[this.$i18n.locale] || {};\n var menuData = JSON.parse(JSON.stringify(i18n.nav.loginData));\n var list = [];\n\n if (this.userInfo && this.userInfo.name) {\n menuData.name = this.userInfo.name;\n menuData.list.forEach(function (element) {\n if (element.type == \"auth\") {\n list.push(element);\n }\n });\n } else {\n menuData.list.forEach(function (element) {\n if (element.type == \"noAuth\") {\n list.push(element);\n }\n });\n }\n\n menuData.list = list;\n this.$set(this, 'loginData', menuData); // console.log(this.userInfo);\n }\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"beforeDestroy\", function beforeDestroy() {\n window.removeEventListener('resize', this.checkIsSmallScreen(), false);\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"mounted\", function mounted() {\n var _this = this;\n\n // const self = this;\n // self.checkIsSmallScreen();\n // document.body.onresize = () => {\n // \tself.checkIsSmallScreen();\n // }\n window.addEventListener('resize', function () {\n return _this.checkIsSmallScreen();\n }, false);\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"watch\", {\n userInfo: function userInfo(val) {\n this._buildLoginMenu();\n }\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"created\", function created() {\n this.initData();\n}), _name$components$comp);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIuanM/M2FmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRtYXBTdGF0ZVxufSBmcm9tICd2dWV4J1xuXG5pbXBvcnQge1xuXHRnZXRPYmpCeUxpc3RLZXlWYWx1ZVxufSBmcm9tICdAdXRpbHMvdXRpbHMuanMnXG5pbXBvcnQgVkRyb3Bkb3duIGZyb20gJ0Bjb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlJ1xuaW1wb3J0IE1Ecm9wZG93biBmcm9tICdAY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0bmFtZTogJ1ZIZWFkZXInLFxuXHRjb21wb25lbnRzOiB7XG5cdFx0VkRyb3Bkb3duLFxuXHRcdE1Ecm9wZG93blxuXHR9LFxuXHRjb21wdXRlZDoge1xuXHRcdGkxOG4oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4kaTE4bi5tZXNzYWdlcyAmJiB0aGlzLiRpMThuLmxvY2FsZSA/IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIDoge307XG5cdFx0fVxuXHR9LFxuXHRkYXRhKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRkcm9wZG93bk1WaXNpYmxlOiBmYWxzZSxcblx0XHRcdGxvZ2luTVZpc2libGU6IGZhbHNlLFxuXHRcdFx0bWF4Q2xpZW50V2lkdGg6IDEyMDAsXG5cdFx0XHRuYXZMaXN0OiBbXSxcblx0XHRcdGxvZ2luRGF0YToge30sXG5cdFx0XHRsYW5nRGF0YToge1xuXHRcdFx0XHRuYW1lOiBcIue5gVwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdFx0bmFtZTogXCLnuYFcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJ0Y1wiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIueugFwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcInpoXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiRU5cIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJlblwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHQuLi5tYXBTdGF0ZSh7XG5cdFx0XHRpc1NtYWxsU2NyZWVuOiBzdGF0ZSA9PiBzdGF0ZS5pc1NtYWxsU2NyZWVuLFxuXHRcdFx0dXNlckluZm86IHN0YXRlID0+IHN0YXRlLnVzZXJJbmZvXG5cdFx0fSlcblx0fSxcblx0bWV0aG9kczoge1xuXHRcdHRvSW5kZXgoKSB7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdHBhdGg6IFwiL1wiXG5cdFx0XHR9KVxuXHRcdH0sXG5cdFx0b25TaG93RHJvcGRvd24oZXZ0U3RyKSB7XG5cdFx0XHR0aGlzLmRyb3Bkb3duTVZpc2libGUgPSBmYWxzZTtcblx0XHRcdHRoaXMubG9naW5NVmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0aWYgKGV2dFN0ciA9PSAnbmF2Jykge1xuXHRcdFx0XHR0aGlzLmRyb3Bkb3duTVZpc2libGUgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChldnRTdHIgPT0gJ2xvZ2luJykge1xuXHRcdFx0XHR0aGlzLmxvZ2luTVZpc2libGUgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHt9XG5cdFx0fSxcblx0XHRjaGVja0lzU21hbGxTY3JlZW4oKSB7XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdGlmIChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoID4gc2VsZi5tYXhDbGllbnRXaWR0aCkge1xuXHRcdFx0XHRzZWxmLiRzdG9yZS5jb21taXQoJ0lTX1NNQUxMX1NDUkVFTicsIGZhbHNlKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi4kc3RvcmUuY29tbWl0KCdJU19TTUFMTF9TQ1JFRU4nLCB0cnVlKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aW5pdERhdGEoKSB7XG5cdFx0XHRsZXQgaTE4biA9IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIHx8IHt9O1xuXHRcdFx0Ly8gdGhpcy5sb2dpbkRhdGEgPSBpMThuLm5hdi5sb2dpbkRhdGE7XG5cdFx0XHR0aGlzLl9idWlsZExvZ2luTWVudSgpO1xuXHRcdFx0dGhpcy5uYXZMaXN0ID0gaTE4bi5uYXYubmF2TGlzdDtcblx0XHRcdGxldCBjdXJMYW5nID0gZ2V0T2JqQnlMaXN0S2V5VmFsdWUodGhpcy4kaTE4bi5sb2NhbGUsIFwidmFsdWVcIiwgdGhpcy5sYW5nRGF0YS5saXN0KVxuXHRcdFx0dGhpcy5sYW5nRGF0YS5uYW1lID0gY3VyTGFuZy5uYW1lO1xuXHRcdH0sXG5cdFx0X2J1aWxkTG9naW5NZW51KCkge1xuXHRcdFx0Ly8g5p6E5bu655m75b2V6aG1XG5cdFx0XHRsZXQgaTE4biA9IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIHx8IHt9O1xuXHRcdFx0bGV0IG1lbnVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpMThuLm5hdi5sb2dpbkRhdGEpKTtcblx0XHRcdGxldCBsaXN0ID0gW107XG5cdFx0XHRpZiAodGhpcy51c2VySW5mbyAmJiB0aGlzLnVzZXJJbmZvLm5hbWUpIHtcblx0XHRcdFx0bWVudURhdGEubmFtZSA9IHRoaXMudXNlckluZm8ubmFtZTtcblx0XHRcdFx0bWVudURhdGEubGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdGlmIChlbGVtZW50LnR5cGUgPT0gXCJhdXRoXCIpIHtcblx0XHRcdFx0XHRcdGxpc3QucHVzaChlbGVtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWVudURhdGEubGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdGlmIChlbGVtZW50LnR5cGUgPT0gXCJub0F1dGhcIikge1xuXHRcdFx0XHRcdFx0bGlzdC5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRtZW51RGF0YS5saXN0ID0gbGlzdDtcblx0XHRcdHRoaXMuJHNldCh0aGlzLCAnbG9naW5EYXRhJywgbWVudURhdGEpO1xuXHRcdFx0Ly8gY29uc29sZS5sb2codGhpcy51c2VySW5mbyk7XG5cdFx0fVxuXHR9LFxuXHRiZWZvcmVEZXN0cm95KCkge1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmNoZWNrSXNTbWFsbFNjcmVlbigpLCBmYWxzZSlcblx0fSxcblx0bW91bnRlZCgpIHtcblx0XHQvLyBjb25zdCBzZWxmID0gdGhpcztcblx0XHQvLyBzZWxmLmNoZWNrSXNTbWFsbFNjcmVlbigpO1xuXHRcdC8vIGRvY3VtZW50LmJvZHkub25yZXNpemUgPSAoKSA9PiB7XG5cdFx0Ly8gXHRzZWxmLmNoZWNrSXNTbWFsbFNjcmVlbigpO1xuXHRcdC8vIH1cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5jaGVja0lzU21hbGxTY3JlZW4oKSwgZmFsc2UpO1xuXG5cdH0sXG5cdHdhdGNoOiB7XG5cdFx0dXNlckluZm8odmFsKSB7XG5cdFx0XHR0aGlzLl9idWlsZExvZ2luTWVudSgpO1xuXHRcdH1cblx0fSxcblx0Y3JlYXRlZCgpIHtcblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFJQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQWJBO0FBTkE7QUEyQkE7QUF2Q0E7QUEwQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFNQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFyREE7QUF3REE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&":
/*!***********************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js& ***!
\***********************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"DropDownList\",\n data: function data() {\n return {\n navList: [],\n activeNames: [],\n activeName: [],\n activeIndex: -1,\n borderBoo: false\n };\n },\n props: {\n visible: {\n type: Boolean,\n default: function _default() {\n return false;\n }\n },\n type: {\n type: String,\n default: function _default() {\n return \"nav\";\n }\n },\n langList: {\n type: Array,\n default: function _default() {\n return [];\n }\n },\n // 显示/隐藏移动端导航\n showDropdownM: {\n type: Function,\n default: null\n }\n },\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_5__[\"mapState\"])({\n isSmallScreen: function isSmallScreen(state) {\n return state.isSmallScreen;\n },\n userInfo: function userInfo(state) {\n return state.userInfo;\n }\n }), {\n locale: function locale() {\n return this.$i18n.locale || 'tc';\n },\n i18n: function i18n() {\n return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n }\n }),\n methods: {\n // 跳转菜单\n onClickHandler: function onClickHandler(item) {\n var path = item && item.path || \"\";\n\n if (path) {\n this.showDropdownM('');\n this.$router.push({\n path: path\n });\n } else {\n var value = item && item.value || null;\n\n if (value) {\n switch (value) {\n case \"logout\":\n this.loginHandler();\n break;\n\n case \"gotoVHIS\":\n Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_8__[\"gotoVHIS\"])(this.$i18n.locale);\n break;\n }\n }\n }\n },\n loginHandler: function loginHandler() {\n var _this = this;\n\n Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_7__[\"httpPost\"])({\n url: _api_api__WEBPACK_IMPORTED_MODULE_6___default.a.logout\n }).then(function () {\n _this.$store.commit(\"SET_USER_INFO\", null);\n\n _this.showLogoutTip();\n });\n },\n // 点击item\n onChangeHandler: function onChangeHandler(evt) {\n this.activeIndex = evt;\n },\n\n /**\n * 设置语言\n */\n setLangHandler: function setLangHandler(curData) {\n this.showDropdownM(''); // 如果是语言设置,则设置语言\n\n var lang = curData.value;\n this.$i18n.locale = lang;\n localStorage.setItem(\"lang\", lang);\n this.sTitle = curData.name;\n window.location.reload();\n },\n initData: function initData() {\n var _this2 = this;\n\n var navList = [];\n\n if (this.type == \"nav\") {\n navList = this.i18n.nav.navList;\n navList.forEach(function (element) {\n _this2.activeNames.push([]);\n });\n } else if (this.type == \"login\") {\n // 构建登陆页面\n var i18n = this.$i18n.messages[this.$i18n.locale] || {};\n var menuData = JSON.parse(JSON.stringify(i18n.nav.loginData));\n var list = [];\n\n if (this.userInfo && this.userInfo.name) {\n menuData.name = this.userInfo.name;\n menuData.list.forEach(function (element) {\n if (element.type == \"auth\") {\n list.push(element);\n }\n });\n } else {\n menuData.list.forEach(function (element) {\n if (element.type == \"noAuth\") {\n list.push(element);\n }\n });\n } // menuData.list = list;\n\n\n navList = list; // console.log(\"navList:\", navList);\n }\n\n this.navList = navList;\n }\n },\n created: function created() {\n this.initData();\n },\n watch: {\n visible: function visible(newVal, oldVal) {\n var _this3 = this;\n\n this.$nextTick(function () {\n _this3.$refs.panel.scrollTop = 0;\n });\n },\n userInfo: function userInfo(val) {\n this.initData();\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLmpzPzNmNDQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0bWFwU3RhdGVcbn0gZnJvbSAndnVleCdcblxuaW1wb3J0IGFwaSBmcm9tICdAL2FwaS9hcGknXG5pbXBvcnQge1xuXHRodHRwUG9zdFxufSBmcm9tICdAL2FwaS9mZXRjaC1hcGkuanMnXG5cbmltcG9ydCB7IGdvdG9WSElTIH0gZnJvbSAnQC91dGlscy9iaXouanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdG5hbWU6IFwiRHJvcERvd25MaXN0XCIsXG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hdkxpc3Q6IFtdLFxuXHRcdFx0YWN0aXZlTmFtZXM6IFtdLFxuXHRcdFx0YWN0aXZlTmFtZTogW10sXG5cdFx0XHRhY3RpdmVJbmRleDogLTEsXG5cdFx0XHRib3JkZXJCb286IGZhbHNlXG5cdFx0fTtcblx0fSxcblx0cHJvcHM6IHtcblx0XHR2aXNpYmxlOiB7XG5cdFx0XHR0eXBlOiBCb29sZWFuLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dHlwZToge1xuXHRcdFx0dHlwZTogU3RyaW5nLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIFwibmF2XCI7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRsYW5nTGlzdDoge1xuXHRcdFx0dHlwZTogQXJyYXksXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyDmmL7npLov6ZqQ6JeP56e75Yqo56uv5a+86IiqXG5cdFx0c2hvd0Ryb3Bkb3duTToge1xuXHRcdFx0dHlwZTogRnVuY3Rpb24sXG5cdFx0XHRkZWZhdWx0OiBudWxsXG5cdFx0fSxcblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHQuLi5tYXBTdGF0ZSh7XG5cdFx0XHRpc1NtYWxsU2NyZWVuOiBzdGF0ZSA9PiBzdGF0ZS5pc1NtYWxsU2NyZWVuLFxuXHRcdFx0dXNlckluZm86IHN0YXRlID0+IHN0YXRlLnVzZXJJbmZvXG5cdFx0fSksXG5cdFx0bG9jYWxlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuJGkxOG4ubG9jYWxlIHx8ICd0Yyc7XG5cdFx0fSxcblx0XHRpMThuKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuJGkxOG4ubWVzc2FnZXMgJiYgdGhpcy4kaTE4bi5sb2NhbGUgPyB0aGlzLiRpMThuLm1lc3NhZ2VzW3RoaXMuJGkxOG4ubG9jYWxlXSA6IHt9O1xuXHRcdH0sXG5cdH0sXG5cdG1ldGhvZHM6IHtcblx0XHQvLyDot7Povazoj5zljZVcblx0XHRvbkNsaWNrSGFuZGxlcihpdGVtKSB7XG5cdFx0XHRsZXQgcGF0aCA9IGl0ZW0gJiYgaXRlbS5wYXRoIHx8IFwiXCI7XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0aGlzLnNob3dEcm9wZG93bk0oJycpO1xuXHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0cGF0aDogcGF0aFxuXHRcdFx0XHR9KVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IHZhbHVlID0gaXRlbSAmJiBpdGVtLnZhbHVlIHx8IG51bGw7XG5cdFx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJsb2dvdXRcIjpcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dpbkhhbmRsZXIoKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiZ290b1ZISVNcIjpcblx0XHRcdFx0XHRcdFx0Z290b1ZISVModGhpcy4kaTE4bi5sb2NhbGUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGxvZ2luSGFuZGxlcigpIHtcblx0XHRcdGh0dHBQb3N0KHtcblx0XHRcdFx0dXJsOiBhcGkubG9nb3V0XG5cdFx0XHR9KS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kc3RvcmUuY29tbWl0KFwiU0VUX1VTRVJfSU5GT1wiLCBudWxsKTtcblx0XHRcdFx0dGhpcy5zaG93TG9nb3V0VGlwKCk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdC8vIOeCueWHu2l0ZW1cblx0XHRvbkNoYW5nZUhhbmRsZXIoZXZ0KSB7XG5cdFx0XHR0aGlzLmFjdGl2ZUluZGV4ID0gZXZ0O1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICog6K6+572u6K+t6KiAXG5cdFx0ICovXG5cdFx0c2V0TGFuZ0hhbmRsZXIoY3VyRGF0YSkge1xuXHRcdFx0dGhpcy5zaG93RHJvcGRvd25NKCcnKTtcblx0XHRcdC8vIOWmguaenOaYr+ivreiogOiuvue9ru+8jOWImeiuvue9ruivreiogFxuXHRcdFx0bGV0IGxhbmcgPSBjdXJEYXRhLnZhbHVlO1xuXHRcdFx0dGhpcy4kaTE4bi5sb2NhbGUgPSBsYW5nO1xuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsYW5nXCIsIGxhbmcpO1xuXHRcdFx0dGhpcy5zVGl0bGUgPSBjdXJEYXRhLm5hbWU7XG5cdFx0XHR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG5cdFx0fSxcblx0XHRpbml0RGF0YSgpIHtcblx0XHRcdGxldCBuYXZMaXN0ID0gW107XG5cdFx0XHRpZiAodGhpcy50eXBlID09IFwibmF2XCIpIHtcblx0XHRcdFx0bmF2TGlzdCA9IHRoaXMuaTE4bi5uYXYubmF2TGlzdDtcblx0XHRcdFx0bmF2TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuYWN0aXZlTmFtZXMucHVzaChcblx0XHRcdFx0XHRcdFtdXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy50eXBlID09IFwibG9naW5cIikge1xuXHRcdFx0XHQvLyDmnoTlu7rnmbvpmYbpobXpnaJcblx0XHRcdFx0bGV0IGkxOG4gPSB0aGlzLiRpMThuLm1lc3NhZ2VzW3RoaXMuJGkxOG4ubG9jYWxlXSB8fCB7fTtcblx0XHRcdFx0bGV0IG1lbnVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpMThuLm5hdi5sb2dpbkRhdGEpKTtcblx0XHRcdFx0bGV0IGxpc3QgPSBbXTtcblx0XHRcdFx0aWYgKHRoaXMudXNlckluZm8gJiYgdGhpcy51c2VySW5mby5uYW1lKSB7XG5cdFx0XHRcdFx0bWVudURhdGEubmFtZSA9IHRoaXMudXNlckluZm8ubmFtZTtcblx0XHRcdFx0XHRtZW51RGF0YS5saXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC50eXBlID09IFwiYXV0aFwiKSB7XG5cdFx0XHRcdFx0XHRcdGxpc3QucHVzaChlbGVtZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZW51RGF0YS5saXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC50eXBlID09IFwibm9BdXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG1lbnVEYXRhLmxpc3QgPSBsaXN0O1xuXHRcdFx0XHRuYXZMaXN0ID0gbGlzdDtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJuYXZMaXN0OlwiLCBuYXZMaXN0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMubmF2TGlzdCA9IG5hdkxpc3Q7XG5cblx0XHR9XG5cdH0sXG5cdGNyZWF0ZWQoKSB7XG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9LFxuXHR3YXRjaDoge1xuXHRcdHZpc2libGUobmV3VmFsLCBvbGRWYWwpIHtcblx0XHRcdHRoaXMuJG5leHRUaWNrKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kcmVmcy5wYW5lbC5zY3JvbGxUb3AgPSAwO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHR1c2VySW5mbyh2YWwpIHtcblx0XHRcdHRoaXMuaW5pdERhdGEoKTtcblx0XHR9XG5cdH0sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFJQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBcEJBO0FBeUJBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQWpGQTtBQW1GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUF0SUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&":
/*!******************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/pages/index?vue&type=script&lang=js& ***!
\******************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\nvar UA = __webpack_require__(/*! ua-device */ \"./node_modules/_ua-device@0.1.10@ua-device/index.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data: function data() {\n return {\n key: 'value',\n // swiper\n swiperOption: {\n // navigation: {\n // \tnextEl: '.swiper-button-next',\n // \tprevEl: '.swiper-button-prev'\n // },\n pagination: {\n el: '.swiper-pagination',\n clickable: true\n },\n autoplay: {\n delay: 5000,\n stopOnLastSlide: false,\n disableOnInteraction: false\n },\n speed: 1000\n },\n bannerList: [],\n bannerCandidateList: [],\n // 视频\n playerOptions: {}\n };\n },\n components: {},\n computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_6__[\"mapState\"])({\n isSmallScreen: function isSmallScreen(state) {\n return state.isSmallScreen;\n }\n }), {\n locale: function locale() {\n return this.$i18n.locale || 'tc';\n },\n i18n: function i18n() {\n return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n },\n player: function player() {\n return this.$refs.videoPlayer.player;\n }\n }),\n methods: {\n toVhis: function toVhis() {\n Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_7__[\"gotoVHIS\"])(this.locale);\n },\n\n /**\n * 推荐产品\n */\n onRecommendHandler: function onRecommendHandler(val) {\n if (val == 1) {\n this.$router.push({\n path: \"/product\"\n });\n }\n\n if (val == 2) {\n this.$router.push({\n path: \"/custom/service?q=m6\"\n });\n }\n\n if (val == 3) {\n this.$router.push({\n path: \"/custom/product\"\n });\n }\n\n if (val == 4) {\n this.$router.push({\n path: \"/news/list\"\n });\n }\n },\n\n /**\n * 推荐产品\n */\n onMoreNewsHandler: function onMoreNewsHandler() {\n this.$router.push({\n path: \"/news/list\"\n });\n },\n\n /**\n * 去新闻详情页面\n * 需要带id\n */\n toNewsDetail: function toNewsDetail() {\n this.$router.push({\n path: '/news/detail'\n });\n },\n toProfile: function toProfile() {\n this.$router.push({\n path: '/profile'\n });\n },\n refreshVideoPlayer: function refreshVideoPlayer() {\n var videoUrl = sessionStorage.getItem(\"_video_url\");\n var posterUrl = sessionStorage.getItem(\"_poster_url\");\n var playerOptions = {\n width: 800,\n height: 450,\n // aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如\"16:9\"或\"4:3\")\n autoplay: false,\n //如果true,浏览器准备好时开始回放。\n muted: true,\n // 默认情况下将会消除任何音频。\n language: 'en',\n // playbackRates: [0.7, 1.0, 1.5, 2.0],//播放速度\n sources: [{\n type: \"video/mp4\",\n // mp4\n src: videoUrl // webm\n // src: \"https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm\"\n\n }],\n poster: posterUrl,\n controlBar: {\n timeDivider: true,\n durationDisplay: true,\n remainingTimeDisplay: false,\n fullscreenToggle: true //全屏按钮\n\n }\n };\n var output = new UA(navigator.userAgent);\n var deviceType = output.device.type;\n var isMobile = deviceType == \"mobile\"; // if (this.isSmallScreen) {\n\n if (isMobile) {\n playerOptions.aspectRatio = \"16:9\";\n }\n\n this.playerOptions = playerOptions;\n },\n initData: function initData() {\n var _this = this;\n\n this.fetchBanner().then(function (res) {\n _this.bannerCandidateList = res;\n\n _this.refreshBanner();\n });\n this.fetchIndexVideo().then(function (res) {\n _this.refreshVideoPlayer();\n });\n window.addEventListener('resize', function () {\n return _this.refreshVideoPlayer();\n }, false);\n },\n fetchBanner: function fetchBanner() {\n return new Promise(function (resolve, reject) {\n Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_5__[\"httpPost\"])({\n url: _api_api__WEBPACK_IMPORTED_MODULE_4___default.a.banner\n }).then(function (res) {\n resolve(res);\n });\n });\n },\n fetchIndexVideo: function fetchIndexVideo() {\n return new Promise(function (resolve, reject) {\n Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_5__[\"httpPost\"])({\n url: _api_api__WEBPACK_IMPORTED_MODULE_4___default.a.indexVideo\n }).then(function (res) {\n sessionStorage.setItem(\"_video_url\", res.videoUrl);\n sessionStorage.setItem(\"_poster_url\", res.posterUrl);\n resolve(res);\n });\n });\n },\n refreshBanner: function refreshBanner() {\n var key = this.locale;\n\n if (key == \"zh\") {\n key = \"cn\";\n }\n\n var newList = [];\n this.bannerCandidateList.forEach(function (element) {\n newList.push(element[key]);\n });\n console.log(newList);\n this.$set(this, 'bannerList', newList);\n },\n btnNavigateTo: function btnNavigateTo(type, link) {\n location.href = link;\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.refreshVideoPlayer(), false);\n },\n mounted: function mounted() {\n this.initData();\n },\n created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9wYWdlcy9pbmRleC9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXguanM/NDRlYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gJ0AvYXBpL2FwaSc7XG5pbXBvcnQge1xuXHRodHRwR2V0LFxuXHRodHRwUG9zdFxufSBmcm9tICdAL2FwaS9mZXRjaC1hcGkuanMnO1xuaW1wb3J0IHtcblx0bWFwR2V0dGVycyxcblx0bWFwQWN0aW9ucyxcblx0bWFwU3RhdGVcbn0gZnJvbSBcInZ1ZXhcIjtcbnZhciBVQSA9IHJlcXVpcmUoXCJ1YS1kZXZpY2VcIik7XG5cbmltcG9ydCB7IGdvdG9WSElTIH0gZnJvbSAnQC91dGlscy9iaXouanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGtleTogJ3ZhbHVlJyxcblx0XHRcdC8vIHN3aXBlclxuXHRcdFx0c3dpcGVyT3B0aW9uOiB7XG5cdFx0XHRcdC8vIG5hdmlnYXRpb246IHtcblx0XHRcdFx0Ly8gXHRuZXh0RWw6ICcuc3dpcGVyLWJ1dHRvbi1uZXh0Jyxcblx0XHRcdFx0Ly8gXHRwcmV2RWw6ICcuc3dpcGVyLWJ1dHRvbi1wcmV2J1xuXHRcdFx0XHQvLyB9LFxuXHRcdFx0XHRwYWdpbmF0aW9uOiB7XG5cdFx0XHRcdFx0ZWw6ICcuc3dpcGVyLXBhZ2luYXRpb24nLFxuXHRcdFx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0YXV0b3BsYXk6IHtcblx0XHRcdFx0XHRkZWxheTogNTAwMCxcblx0XHRcdFx0XHRzdG9wT25MYXN0U2xpZGU6IGZhbHNlLFxuXHRcdFx0XHRcdGRpc2FibGVPbkludGVyYWN0aW9uOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzcGVlZDogMTAwMCxcblx0XHRcdH0sXG5cdFx0XHRiYW5uZXJMaXN0OiBbXSxcblx0XHRcdGJhbm5lckNhbmRpZGF0ZUxpc3Q6IFtdLFxuXHRcdFx0Ly8g6KeG6aKRXG5cdFx0XHRwbGF5ZXJPcHRpb25zOiB7fSxcblxuXHRcdH1cblx0fSxcblx0Y29tcG9uZW50czoge30sXG5cdGNvbXB1dGVkOiB7XG5cdFx0Li4ubWFwU3RhdGUoe1xuXHRcdFx0aXNTbWFsbFNjcmVlbjogc3RhdGUgPT4gc3RhdGUuaXNTbWFsbFNjcmVlblxuXHRcdH0pLFxuXHRcdGxvY2FsZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLiRpMThuLmxvY2FsZSB8fCAndGMnO1xuXHRcdH0sXG5cdFx0aTE4bigpIHtcblx0XHRcdHJldHVybiB0aGlzLiRpMThuLm1lc3NhZ2VzICYmIHRoaXMuJGkxOG4ubG9jYWxlID8gdGhpcy4kaTE4bi5tZXNzYWdlc1t0aGlzLiRpMThuLmxvY2FsZV0gOiB7fTtcblx0XHR9LFxuXHRcdHBsYXllcigpIHtcblx0XHRcdHJldHVybiB0aGlzLiRyZWZzLnZpZGVvUGxheWVyLnBsYXllclxuXHRcdH0sXG5cblx0fSxcblx0bWV0aG9kczoge1xuXHRcdHRvVmhpcygpIHtcblx0XHRcdGdvdG9WSElTKHRoaXMubG9jYWxlKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIOaOqOiNkOS6p+WTgVxuXHRcdCAqL1xuXHRcdG9uUmVjb21tZW5kSGFuZGxlcih2YWwpIHtcblx0XHRcdGlmICh2YWwgPT0gMSkge1xuXHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsID09IDIpIHtcblx0XHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTZcIlxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbCA9PSAzKSB7XG5cdFx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsID09IDQpIHtcblx0XHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRcdHBhdGg6IFwiL25ld3MvbGlzdFwiXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICog5o6o6I2Q5Lqn5ZOBXG5cdFx0ICovXG5cdFx0b25Nb3JlTmV3c0hhbmRsZXIoKSB7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdHBhdGg6IFwiL25ld3MvbGlzdFwiXG5cdFx0XHR9KVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiDljrvmlrDpl7vor6bmg4XpobXpnaJcblx0XHQgKiDpnIDopoHluKZpZFxuXHRcdCAqL1xuXHRcdHRvTmV3c0RldGFpbCgpIHtcblx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0cGF0aDogJy9uZXdzL2RldGFpbCdcblx0XHRcdH0pXG5cdFx0fSxcblx0XHR0b1Byb2ZpbGUoKSB7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdHBhdGg6ICcvcHJvZmlsZSdcblx0XHRcdH0pXG5cdFx0fSxcblx0XHRyZWZyZXNoVmlkZW9QbGF5ZXIoKSB7XG5cdFx0XHRsZXQgdmlkZW9VcmwgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiX3ZpZGVvX3VybFwiKTtcblx0XHRcdGxldCBwb3N0ZXJVcmwgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiX3Bvc3Rlcl91cmxcIik7XG5cdFx0XHRsZXQgcGxheWVyT3B0aW9ucyA9IHtcblx0XHRcdFx0d2lkdGg6IDgwMCxcblx0XHRcdFx0aGVpZ2h0OiA0NTAsXG5cdFx0XHRcdC8vIGFzcGVjdFJhdGlvOiAnMTY6OScsIC8vIOWwhuaSreaUvuWZqOe9ruS6jua1geeVheaooeW8j++8jOW5tuWcqOiuoeeul+aSreaUvuWZqOeahOWKqOaAgeWkp+Wwj+aXtuS9v+eUqOivpeWAvOOAguWAvOW6lOivpeS7o+ihqOS4gOS4quavlOS+iyAtIOeUqOWGkuWPt+WIhumalOeahOS4pOS4quaVsOWtl++8iOS+i+WmglwiMTY6OVwi5oiWXCI0OjNcIu+8iVxuXHRcdFx0XHRhdXRvcGxheTogZmFsc2UsIC8v5aaC5p6cdHJ1ZSzmtY/op4jlmajlh4blpIflpb3ml7blvIDlp4vlm57mlL7jgIJcblx0XHRcdFx0bXV0ZWQ6IHRydWUsIC8vIOm7mOiupOaDheWGteS4i+WwhuS8mua2iOmZpOS7u+S9lemfs+mikeOAglxuXHRcdFx0XHRsYW5ndWFnZTogJ2VuJyxcblx0XHRcdFx0Ly8gcGxheWJhY2tSYXRlczogWzAuNywgMS4wLCAxLjUsIDIuMF0sLy/mkq3mlL7pgJ/luqZcblx0XHRcdFx0c291cmNlczogW3tcblx0XHRcdFx0XHR0eXBlOiBcInZpZGVvL21wNFwiLFxuXHRcdFx0XHRcdC8vIG1wNFxuXHRcdFx0XHRcdHNyYzogdmlkZW9VcmwsXG5cdFx0XHRcdFx0Ly8gd2VibVxuXHRcdFx0XHRcdC8vIHNyYzogXCJodHRwczovL2Nkbi50aGVndWFyZGlhbi50di93ZWJNLzIwMTUvMDcvMjAvMTUwNzE2WWVzTWVuX3N5bmRfNzY4a192cDgud2VibVwiXG5cdFx0XHRcdH1dLFxuXHRcdFx0XHRwb3N0ZXI6IHBvc3RlclVybCxcblx0XHRcdFx0Y29udHJvbEJhcjoge1xuXHRcdFx0XHRcdHRpbWVEaXZpZGVyOiB0cnVlLFxuXHRcdFx0XHRcdGR1cmF0aW9uRGlzcGxheTogdHJ1ZSxcblx0XHRcdFx0XHRyZW1haW5pbmdUaW1lRGlzcGxheTogZmFsc2UsXG5cdFx0XHRcdFx0ZnVsbHNjcmVlblRvZ2dsZTogdHJ1ZSAvL+WFqOWxj+aMiemSrlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZXQgb3V0cHV0ID0gbmV3IFVBKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXHRcdFx0bGV0IGRldmljZVR5cGUgPSBvdXRwdXQuZGV2aWNlLnR5cGU7XG5cdFx0XHRsZXQgaXNNb2JpbGUgPSBkZXZpY2VUeXBlID09IFwibW9iaWxlXCI7XG5cdFx0XHQvLyBpZiAodGhpcy5pc1NtYWxsU2NyZWVuKSB7XG5cdFx0XHRpZiAoaXNNb2JpbGUpIHtcblx0XHRcdFx0cGxheWVyT3B0aW9ucy5hc3BlY3RSYXRpbyA9IFwiMTY6OVwiO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wbGF5ZXJPcHRpb25zID0gcGxheWVyT3B0aW9ucztcblx0XHR9LFxuXHRcdGluaXREYXRhKCkge1xuXHRcdFx0dGhpcy5mZXRjaEJhbm5lcigpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0dGhpcy5iYW5uZXJDYW5kaWRhdGVMaXN0ID0gcmVzO1xuXHRcdFx0XHR0aGlzLnJlZnJlc2hCYW5uZXIoKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5mZXRjaEluZGV4VmlkZW8oKS50aGVuKHJlcyA9PiB7XG5cdFx0XHRcdHRoaXMucmVmcmVzaFZpZGVvUGxheWVyKCk7XG5cdFx0XHR9KTtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlZnJlc2hWaWRlb1BsYXllcigpLCBmYWxzZSk7XG5cdFx0fSxcblx0XHRmZXRjaEJhbm5lcigpIHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGh0dHBQb3N0KHsgdXJsOiBhcGkuYmFubmVyIH0pLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRyZXNvbHZlKHJlcyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRmZXRjaEluZGV4VmlkZW8oKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRodHRwUG9zdCh7IHVybDogYXBpLmluZGV4VmlkZW8gfSkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJfdmlkZW9fdXJsXCIsIHJlcy52aWRlb1VybCk7XG5cdFx0XHRcdFx0c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcIl9wb3N0ZXJfdXJsXCIsIHJlcy5wb3N0ZXJVcmwpO1xuXHRcdFx0XHRcdHJlc29sdmUocmVzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdHJlZnJlc2hCYW5uZXIoKSB7XG5cdFx0XHRsZXQga2V5ID0gdGhpcy5sb2NhbGU7XG5cdFx0XHRpZiAoa2V5ID09IFwiemhcIikge1xuXHRcdFx0XHRrZXkgPSBcImNuXCI7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbmV3TGlzdCA9IFtdO1xuXHRcdFx0dGhpcy5iYW5uZXJDYW5kaWRhdGVMaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdG5ld0xpc3QucHVzaChlbGVtZW50W2tleV0pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zb2xlLmxvZyhuZXdMaXN0KTtcblx0XHRcdHRoaXMuJHNldCh0aGlzLCAnYmFubmVyTGlzdCcsIG5ld0xpc3QpO1xuXHRcdH0sXG5cdFx0YnRuTmF2aWdhdGVUbyh0eXBlLCBsaW5rKSB7XG5cdFx0XHRsb2NhdGlvbi5ocmVmID0gbGluaztcblx0XHR9XG5cdH0sXG5cdGJlZm9yZURlc3Ryb3koKSB7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVmcmVzaFZpZGVvUGxheWVyKCksIGZhbHNlKTtcblx0fSxcblx0bW91bnRlZCgpIHtcblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH0sXG5cblx0Y3JlYXRlZCgpIHtcblxuXHR9XG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQWRBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBdEJBO0FBeUJBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBaEJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqSUE7QUFtSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF0TEEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&":
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=template&id=7ba5bd90& ***!
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"app\" } },\n [\n _c(\"v-header\", { staticClass: \"header\" }),\n _c(\n \"main\",\n { ref: \"container\", staticClass: \"main-container\" },\n [_c(\"router-view\")],\n 1\n ),\n _c(\"v-footer\")\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9BcHAudnVlP2UxYjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHsgYXR0cnM6IHsgaWQ6IFwiYXBwXCIgfSB9LFxuICAgIFtcbiAgICAgIF9jKFwidi1oZWFkZXJcIiwgeyBzdGF0aWNDbGFzczogXCJoZWFkZXJcIiB9KSxcbiAgICAgIF9jKFxuICAgICAgICBcIm1haW5cIixcbiAgICAgICAgeyByZWY6IFwiY29udGFpbmVyXCIsIHN0YXRpY0NsYXNzOiBcIm1haW4tY29udGFpbmVyXCIgfSxcbiAgICAgICAgW19jKFwicm91dGVyLXZpZXdcIildLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX2MoXCJ2LWZvb3RlclwiKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&":
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n {\n staticClass: \"drop-list\",\n class: { login: _vm.type == \"login\" },\n on: {\n mouseover: function($event) {\n return _vm.onOverHandler($event)\n },\n mouseout: function($event) {\n return _vm.onOutHandler($event)\n }\n }\n },\n [\n _vm.type == \"login\"\n ? [\n _c(\"div\", { staticClass: \"user\" }, [\n _c(\"img\", {\n staticClass: \"icon-img\",\n attrs: { src: __webpack_require__(/*! @/assets/images/home/icon-user.png */ \"./src/assets/images/home/icon-user.png\") }\n }),\n _c(\"span\", [_vm._v(_vm._s(_vm.dataObj.name))])\n ])\n ]\n : [\n _c(\n \"span\",\n {\n on: {\n click: function($event) {\n return _vm.onNavHandler()\n }\n }\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" +\n _vm._s(\n _vm.type == \"lang\" ? _vm.sTitle : _vm.dataObj.name\n ) +\n \"\\n\\t\\t\\t\"\n )\n ]\n )\n ],\n _c(\"div\", { staticClass: \"list\" }, [\n _c(\"div\", { staticClass: \"space\" }),\n _c(\n \"ul\",\n { directives: [{ name: \"dpl\", rawName: \"v-dpl\" }], ref: \"ul\" },\n _vm._l(_vm.dataList, function(item, index) {\n return _c(\n \"li\",\n {\n key: index,\n on: {\n mousedown: function($event) {\n return _vm.onClickHandler($event, index)\n }\n }\n },\n [_vm._v(_vm._s(item[_vm.labelProperty]))]\n )\n }),\n 0\n )\n ])\n ],\n 2\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiNGYzNWFmJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlPzFkYWQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBzdGF0aWNDbGFzczogXCJkcm9wLWxpc3RcIixcbiAgICAgICAgY2xhc3M6IHsgbG9naW46IF92bS50eXBlID09IFwibG9naW5cIiB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3ZtLm9uT3ZlckhhbmRsZXIoJGV2ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF92bS5vbk91dEhhbmRsZXIoJGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgX3ZtLnR5cGUgPT0gXCJsb2dpblwiXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidXNlclwiIH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJpY29uLWltZ1wiLFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi11c2VyLnBuZ1wiKSB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5kYXRhT2JqLm5hbWUpKV0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uTmF2SGFuZGxlcigpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHRcIiArXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnR5cGUgPT0gXCJsYW5nXCIgPyBfdm0uc1RpdGxlIDogX3ZtLmRhdGFPYmoubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXFx0XFx0XFx0XCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0sXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibGlzdFwiIH0sIFtcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInNwYWNlXCIgfSksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICB7IGRpcmVjdGl2ZXM6IFt7IG5hbWU6IFwiZHBsXCIsIHJhd05hbWU6IFwidi1kcGxcIiB9XSwgcmVmOiBcInVsXCIgfSxcbiAgICAgICAgICAgIF92bS5fbChfdm0uZGF0YUxpc3QsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNsaWNrSGFuZGxlcigkZXZlbnQsIGluZGV4KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhpdGVtW192bS5sYWJlbFByb3BlcnR5XSkpXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApXG4gICAgICAgIF0pXG4gICAgICBdLFxuICAgICAgMlxuICAgIClcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true& ***!
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"footer\", { staticClass: \"v-footer \" }, [\n _c(\"div\", { staticClass: \"footer-containter \" }, [\n _c(\"div\", { staticClass: \"cont\" }, [\n _vm._m(0),\n _c(\"div\", { staticClass: \"line\" }),\n _c(\"div\", { staticClass: \"info\" }, [\n _c(\"div\", { staticClass: \"hotline\" }, [\n _c(\"div\", { staticClass: \"contact\" }, [\n _c(\"div\", { staticClass: \"n-item\" }, [\n _vm._v(_vm._s(_vm.$t(\"footer.hkPhone\")))\n ]),\n _c(\"div\", { staticClass: \"phone\" }, [_vm._v(\"(852)2983 8866\")])\n ]),\n _c(\"div\", { staticClass: \"contact\" }, [\n _c(\"div\", { staticClass: \"n-item\" }, [\n _vm._v(_vm._s(_vm.$t(\"footer.cnPhone\")))\n ]),\n _c(\"div\", { staticClass: \"phone\" }, [_vm._v(\"(86)40078 95511\")])\n ])\n ]),\n _c(\"div\", { staticClass: \"nav\" }, [\n _c(\"div\", { staticClass: \"nav-v\" }, [\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"profile\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.aboutUs\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"profile\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.companyIntroduction\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"newsList\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.news\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"empty\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.joinUs\")))]\n )\n ]),\n _c(\"div\", { staticClass: \"nav-v\" }, [\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"empty\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.helpCenter\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"privacy\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.privacy\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"terms\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.terms\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"personalDataCollection\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.protocol\")))]\n )\n ]),\n _c(\"div\", { staticClass: \"nav-v\" }, [\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPath(\"/custom/service?q=m1\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.contactUs\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"empty\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.contactInformation\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"empty\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.service\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"empty\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.map\")))]\n )\n ])\n ]),\n _c(\"div\", { staticClass: \"nav nav2\" }, [\n _c(\"div\", { staticClass: \"nav-v\" }, [\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"privacy\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.privacy\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"terms\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.terms\")))]\n ),\n _c(\n \"div\",\n {\n staticClass: \"n-item\",\n on: {\n click: function($event) {\n return _vm.toPage(\"personalDataCollection\")\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"footer.protocol\")))]\n )\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"public\" },\n [\n _c(\"div\", { staticClass: \"tit\" }, [\n _vm._v(_vm._s(_vm.$t(\"footer.qrcode\")))\n ]),\n _vm.qrcodeVisible\n ? _c(\n \"div\",\n {\n staticClass: \"qrcode-wrap\",\n on: {\n click: function($event) {\n _vm.qrcodeVisible = !_vm.qrcodeVisible\n }\n }\n },\n [\n _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/qrcode.png */ \"./src/assets/images/home/qrcode.png\"),\n alt: \"\"\n }\n }),\n _c(\"div\", { staticClass: \"c1\" }, [_vm._v(\"官方公眾號\")])\n ]\n )\n : [\n _c(\"img\", {\n staticClass: \"icon pointer\",\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/footer-icon-1.png */ \"./src/assets/images/home/footer-icon-1.png\"),\n alt: \"\"\n },\n on: {\n click: function($event) {\n _vm.qrcodeVisible = !_vm.qrcodeVisible\n }\n }\n }),\n _c(\"img\", {\n staticClass: \"icon pointer\",\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/footer-icon-2.png */ \"./src/assets/images/home/footer-icon-2.png\"),\n alt: \"\"\n }\n }),\n _c(\"img\", {\n staticClass: \"icon pointer\",\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/footer-icon-3.png */ \"./src/assets/images/home/footer-icon-3.png\"),\n alt: \"\"\n }\n })\n ]\n ],\n 2\n )\n ]),\n _c(\"div\", { staticClass: \"line\" }),\n _c(\"div\", { staticClass: \"copyright\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t\" + _vm._s(_vm.$t(\"footer.copyright\")) + \"\\n\\t\\t\\t\\t\"\n ),\n _c(\"br\"),\n _vm._v(\n \"Copyright © PING AN INSURANCE (GROUP) COMPANY OF CHINA ,LTD. All Rights Reserved\\n\\t\\t\\t\"\n )\n ])\n ])\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"logo-wrap\" }, [\n _c(\"img\", {\n staticClass: \"logo-img\",\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/footer-logo.png */ \"./src/assets/images/home/footer-logo.png\"),\n alt: \"中国平安人寿保险\"\n }\n })\n ])\n }\n]\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjY3OGZjMjImc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZT83NTYwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJmb290ZXJcIiwgeyBzdGF0aWNDbGFzczogXCJ2LWZvb3RlciBcIiB9LCBbXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJmb290ZXItY29udGFpbnRlciBcIiB9LCBbXG4gICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImNvbnRcIiB9LCBbXG4gICAgICAgIF92bS5fbSgwKSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJsaW5lXCIgfSksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiaW5mb1wiIH0sIFtcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImhvdGxpbmVcIiB9LCBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImNvbnRhY3RcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmhrUGhvbmVcIikpKVxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJwaG9uZVwiIH0sIFtfdm0uX3YoXCIoODUyKTI5ODMgODg2NlwiKV0pXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiY29udGFjdFwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuY25QaG9uZVwiKSkpXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInBob25lXCIgfSwgW192bS5fdihcIig4Nik0MDA3OCA5NTUxMVwiKV0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2XCIgfSwgW1xuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtdlwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInByb2ZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmFib3V0VXNcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInByb2ZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmNvbXBhbnlJbnRyb2R1Y3Rpb25cIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcIm5ld3NMaXN0XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5uZXdzXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJlbXB0eVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuam9pblVzXCIpKSldXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtdlwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcImVtcHR5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5oZWxwQ2VudGVyXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJwcml2YWN5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5wcml2YWN5XCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJ0ZXJtc1wiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIudGVybXNcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInBlcnNvbmFsRGF0YUNvbGxlY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLnByb3RvY29sXCIpKSldXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtdlwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGF0aChcIi9jdXN0b20vc2VydmljZT9xPW0xXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5jb250YWN0VXNcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcImVtcHR5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5jb250YWN0SW5mb3JtYXRpb25cIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcImVtcHR5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5zZXJ2aWNlXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJlbXB0eVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIubWFwXCIpKSldXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgXSksXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYgbmF2MlwiIH0sIFtcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2LXZcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJwcml2YWN5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5wcml2YWN5XCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJ0ZXJtc1wiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIudGVybXNcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInBlcnNvbmFsRGF0YUNvbGxlY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLnByb3RvY29sXCIpKSldXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgXSksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJwdWJsaWNcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInRpdFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5xcmNvZGVcIikpKVxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgX3ZtLnFyY29kZVZpc2libGVcbiAgICAgICAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwicXJjb2RlLXdyYXBcIixcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucXJjb2RlVmlzaWJsZSA9ICFfdm0ucXJjb2RlVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL3FyY29kZS5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiYzFcIiB9LCBbX3ZtLl92KFwi5a6Y5pa55YWs55y+6JmfXCIpXSlcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTEucG5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0ucXJjb2RlVmlzaWJsZSA9ICFfdm0ucXJjb2RlVmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJpY29uIHBvaW50ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvZm9vdGVyLWljb24tMi5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTMucG5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIF0pLFxuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImxpbmVcIiB9KSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJjb3B5cmlnaHRcIiB9LCBbXG4gICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHRcIiArIF92bS5fcyhfdm0uJHQoXCJmb290ZXIuY29weXJpZ2h0XCIpKSArIFwiXFxuXFx0XFx0XFx0XFx0XCJcbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFwiYnJcIiksXG4gICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgXCJDb3B5cmlnaHQgwqkgUElORyBBTiBJTlNVUkFOQ0UgKEdST1VQKSBDT01QQU5ZIE9GIENISU5BIO+8jExURC4gQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcdFxcdFxcdFwiXG4gICAgICAgICAgKVxuICAgICAgICBdKVxuICAgICAgXSlcbiAgICBdKVxuICBdKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtcbiAgZnVuY3Rpb24oKSB7XG4gICAgdmFyIF92bSA9IHRoaXNcbiAgICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJsb2dvLXdyYXBcIiB9LCBbXG4gICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImxvZ28taW1nXCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvZm9vdGVyLWxvZ28ucG5nXCIpLFxuICAgICAgICAgIGFsdDogXCLkuK3lm73lubPlronkurrlr7/kv53pmalcIlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF0pXG4gIH1cbl1cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true& ***!
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"header\", { staticClass: \"v-header\" }, [\n _c(\"div\", { staticClass: \"header-container\" }, [\n _c(\"img\", {\n staticClass: \"logo-img\",\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/header-logo.png */ \"./src/assets/images/home/header-logo.png\"),\n alt: \"中国平安人寿保险\"\n },\n on: { click: _vm.toIndex }\n }),\n _c(\"div\", { staticClass: \"main-nav\" }, [\n _c(\n \"div\",\n { staticClass: \"nav-list-m mobile\" },\n [\n _c(\"div\", { staticClass: \"mobile-nav-list\" }, [\n !_vm.loginMVisible\n ? _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/mobile-user.png */ \"./src/assets/images/home/mobile-user.png\"),\n alt: \"\"\n },\n on: {\n click: function($event) {\n return _vm.onShowDropdown(\"login\")\n }\n }\n })\n : _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/mobile-user.png */ \"./src/assets/images/home/mobile-user.png\"),\n alt: \"\"\n },\n on: {\n click: function($event) {\n return _vm.onShowDropdown(\"\")\n }\n }\n }),\n !_vm.dropdownMVisible\n ? _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/mobile-nav.png */ \"./src/assets/images/home/mobile-nav.png\"),\n alt: \"\"\n },\n on: {\n click: function($event) {\n return _vm.onShowDropdown(\"nav\")\n }\n }\n })\n : _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! @/assets/images/home/mobile-nav-close.png */ \"./src/assets/images/home/mobile-nav-close.png\"),\n alt: \"\"\n },\n on: {\n click: function($event) {\n return _vm.onShowDropdown(\"\")\n }\n }\n })\n ]),\n _c(\"m-dropdown\", {\n ref: \"pcMenu\",\n staticClass: \"lang\",\n attrs: {\n type: \"nav\",\n visible: _vm.dropdownMVisible,\n \"show-dropdown-m\": _vm.onShowDropdown,\n \"lang-list\": _vm.langData.list\n }\n }),\n _c(\"m-dropdown\", {\n staticClass: \"lang\",\n attrs: {\n type: \"login\",\n visible: _vm.loginMVisible,\n \"show-dropdown-m\": _vm.onShowDropdown\n }\n })\n ],\n 1\n ),\n _c(\"div\", { staticClass: \"nav-list pc\" }, [\n _c(\n \"div\",\n { staticClass: \"main-nav-list\" },\n _vm._l(_vm.navList, function(item) {\n return _c(\"v-dropdown\", {\n key: item.id,\n attrs: { \"data-obj\": item, \"data-list\": item.list }\n })\n }),\n 1\n ),\n _c(\"div\", { staticClass: \"nav-item search\" }),\n _c(\n \"div\",\n { staticClass: \"nav-item auth\" },\n [\n _c(\"v-dropdown\", {\n ref: \"mobileMenu\",\n staticClass: \"lang\",\n attrs: {\n type: \"login\",\n \"data-obj\": _vm.loginData,\n \"data-list\": _vm.loginData.list\n }\n }),\n _c(\"v-dropdown\", {\n staticClass: \"lang\",\n attrs: {\n type: \"lang\",\n \"data-obj\": _vm.langData,\n \"data-list\": _vm.langData.list\n }\n })\n ],\n 1\n )\n ])\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmZiYThkYWYmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZT82NjkxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJoZWFkZXJcIiwgeyBzdGF0aWNDbGFzczogXCJ2LWhlYWRlclwiIH0sIFtcbiAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImhlYWRlci1jb250YWluZXJcIiB9LCBbXG4gICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImxvZ28taW1nXCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaGVhZGVyLWxvZ28ucG5nXCIpLFxuICAgICAgICAgIGFsdDogXCLkuK3lm73lubPlronkurrlr7/kv53pmalcIlxuICAgICAgICB9LFxuICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvSW5kZXggfVxuICAgICAgfSksXG4gICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcIm1haW4tbmF2XCIgfSwgW1xuICAgICAgICBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwibmF2LWxpc3QtbSBtb2JpbGVcIiB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibW9iaWxlLW5hdi1saXN0XCIgfSwgW1xuICAgICAgICAgICAgICAhX3ZtLmxvZ2luTVZpc2libGVcbiAgICAgICAgICAgICAgICA/IF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtdXNlci5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblNob3dEcm9wZG93bihcImxvZ2luXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS11c2VyLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uU2hvd0Ryb3Bkb3duKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgIV92bS5kcm9wZG93bk1WaXNpYmxlXG4gICAgICAgICAgICAgICAgPyBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvbW9iaWxlLW5hdi5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblNob3dEcm9wZG93bihcIm5hdlwiKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LWNsb3NlLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uU2hvd0Ryb3Bkb3duKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBfYyhcIm0tZHJvcGRvd25cIiwge1xuICAgICAgICAgICAgICByZWY6IFwicGNNZW51XCIsXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImxhbmdcIixcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm5hdlwiLFxuICAgICAgICAgICAgICAgIHZpc2libGU6IF92bS5kcm9wZG93bk1WaXNpYmxlLFxuICAgICAgICAgICAgICAgIFwic2hvdy1kcm9wZG93bi1tXCI6IF92bS5vblNob3dEcm9wZG93bixcbiAgICAgICAgICAgICAgICBcImxhbmctbGlzdFwiOiBfdm0ubGFuZ0RhdGEubGlzdFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF9jKFwibS1kcm9wZG93blwiLCB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImxhbmdcIixcbiAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImxvZ2luXCIsXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogX3ZtLmxvZ2luTVZpc2libGUsXG4gICAgICAgICAgICAgICAgXCJzaG93LWRyb3Bkb3duLW1cIjogX3ZtLm9uU2hvd0Ryb3Bkb3duXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICAxXG4gICAgICAgICksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2LWxpc3QgcGNcIiB9LCBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJtYWluLW5hdi1saXN0XCIgfSxcbiAgICAgICAgICAgIF92bS5fbChfdm0ubmF2TGlzdCwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gX2MoXCJ2LWRyb3Bkb3duXCIsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHsgXCJkYXRhLW9ialwiOiBpdGVtLCBcImRhdGEtbGlzdFwiOiBpdGVtLmxpc3QgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcIm5hdi1pdGVtIHNlYXJjaFwiIH0pLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwibmF2LWl0ZW0gYXV0aFwiIH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwidi1kcm9wZG93blwiLCB7XG4gICAgICAgICAgICAgICAgcmVmOiBcIm1vYmlsZU1lbnVcIixcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwibG9naW5cIixcbiAgICAgICAgICAgICAgICAgIFwiZGF0YS1vYmpcIjogX3ZtLmxvZ2luRGF0YSxcbiAgICAgICAgICAgICAgICAgIFwiZGF0YS1saXN0XCI6IF92bS5sb2dpbkRhdGEubGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF9jKFwidi1kcm9wZG93blwiLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibGFuZ1wiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImxhbmdcIixcbiAgICAgICAgICAgICAgICAgIFwiZGF0YS1vYmpcIjogX3ZtLmxhbmdEYXRhLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLWxpc3RcIjogX3ZtLmxhbmdEYXRhLmxpc3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n { ref: \"panel\", staticClass: \"panel\", class: { hide: !_vm.visible } },\n [\n _c(\"div\", {\n staticClass: \"mask\",\n on: {\n click: function($event) {\n return _vm.showDropdownM(\"\")\n }\n }\n }),\n _c(\n \"div\",\n { staticClass: \"list\" },\n _vm._l(_vm.navList, function(item, index) {\n return _c(\n \"div\",\n { key: item.id, attrs: { index: index } },\n [\n item && item.list && item.list.length > 0\n ? _c(\n \"van-collapse\",\n {\n on: { change: _vm.onChangeHandler },\n model: {\n value: _vm.activeNames[index],\n callback: function($$v) {\n _vm.$set(_vm.activeNames, index, $$v)\n },\n expression: \"activeNames[index]\"\n }\n },\n [\n _c(\n \"van-collapse-item\",\n {\n attrs: {\n border: _vm.borderBoo,\n title: item.name,\n name: index\n }\n },\n [\n _c(\n \"div\",\n { attrs: { slot: \"title\" }, slot: \"title\" },\n [\n _c(\n \"span\",\n {\n class: {\n \"coll-item-act\": index == _vm.activeIndex\n }\n },\n [_vm._v(_vm._s(item.name))]\n )\n ]\n ),\n _c(\n \"div\",\n {\n attrs: { slot: \"right-icon\" },\n slot: \"right-icon\"\n },\n [\n _c(\"div\", { staticClass: \"icon-wrap\" }, [\n _c(\"div\", {\n staticClass: \"plus-icon\",\n class: {\n \"plus-icon-act\": index == _vm.activeIndex\n }\n })\n ])\n ]\n ),\n _vm._l(item.list, function(item2) {\n return _c(\n \"div\",\n {\n key: item2.id,\n staticClass: \"list-item\",\n on: {\n click: function($event) {\n return _vm.onClickHandler(item2)\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"arrow-icon\" }),\n _c(\"div\", { staticClass: \"txt\" }, [\n _vm._v(_vm._s(item2.name))\n ])\n ]\n )\n })\n ],\n 2\n )\n ],\n 1\n )\n : _c(\n \"div\",\n {\n staticClass: \"list-item\",\n on: {\n click: function($event) {\n return _vm.onClickHandler(item)\n }\n }\n },\n [\n _vm._v(\n \"\\n\\t\\t\\t\\t\\t\" + _vm._s(item.name) + \"\\n\\t\\t\\t\\t\"\n )\n ]\n )\n ],\n 1\n )\n }),\n 0\n ),\n _vm.langList && _vm.langList.length > 0\n ? _c(\n \"div\",\n { staticClass: \"lang\" },\n _vm._l(_vm.langList, function(item) {\n return _c(\n \"div\",\n {\n key: item.id,\n staticClass: \"lang-item pointer\",\n class: { \"lang-item-act\": _vm.locale == item.value },\n on: {\n click: function($event) {\n return _vm.setLangHandler(item)\n }\n }\n },\n [_vm._v(\"\\n\\t\\t\\t\\t\" + _vm._s(item.name) + \"\\n\\t\\t\\t\")]\n )\n }),\n 0\n )\n : _vm._e()\n ]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/OWY2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIFtcbiAgICBfYyhcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHJlZjogXCJwYW5lbFwiLCBzdGF0aWNDbGFzczogXCJwYW5lbFwiLCBjbGFzczogeyBoaWRlOiAhX3ZtLnZpc2libGUgfSB9LFxuICAgICAgW1xuICAgICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwibWFza1wiLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdm0uc2hvd0Ryb3Bkb3duTShcIlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJsaXN0XCIgfSxcbiAgICAgICAgICBfdm0uX2woX3ZtLm5hdkxpc3QsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsga2V5OiBpdGVtLmlkLCBhdHRyczogeyBpbmRleDogaW5kZXggfSB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgaXRlbSAmJiBpdGVtLmxpc3QgJiYgaXRlbS5saXN0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2YW4tY29sbGFwc2VcIixcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjaGFuZ2U6IF92bS5vbkNoYW5nZUhhbmRsZXIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uYWN0aXZlTmFtZXNbaW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLiRzZXQoX3ZtLmFjdGl2ZU5hbWVzLCBpbmRleCwgJCR2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImFjdGl2ZU5hbWVzW2luZGV4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YW4tY29sbGFwc2UtaXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogX3ZtLmJvcmRlckJvbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgc2xvdDogXCJ0aXRsZVwiIH0sIHNsb3Q6IFwidGl0bGVcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbGwtaXRlbS1hY3RcIjogaW5kZXggPT0gX3ZtLmFjdGl2ZUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhpdGVtLm5hbWUpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBzbG90OiBcInJpZ2h0LWljb25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90OiBcInJpZ2h0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJpY29uLXdyYXBcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwicGx1cy1pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBsdXMtaWNvbi1hY3RcIjogaW5kZXggPT0gX3ZtLmFjdGl2ZUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChpdGVtLmxpc3QsIGZ1bmN0aW9uKGl0ZW0yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0yLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImxpc3QtaXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DbGlja0hhbmRsZXIoaXRlbTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJhcnJvdy1pY29uXCIgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0eHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKGl0ZW0yLm5hbWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIDogX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsaXN0LWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uQ2xpY2tIYW5kbGVyKGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHRcXHRcIiArIF92bS5fcyhpdGVtLm5hbWUpICsgXCJcXG5cXHRcXHRcXHRcXHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgMFxuICAgICAgICApLFxuICAgICAgICBfdm0ubGFuZ0xpc3QgJiYgX3ZtLmxhbmdMaXN0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImxhbmdcIiB9LFxuICAgICAgICAgICAgICBfdm0uX2woX3ZtLmxhbmdMaXN0LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nLWl0ZW0gcG9pbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBcImxhbmctaXRlbS1hY3RcIjogX3ZtLmxvY2FsZSA9PSBpdGVtLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5zZXRMYW5nSGFuZGxlcihpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtfdm0uX3YoXCJcXG5cXHRcXHRcXHRcXHRcIiArIF92bS5fcyhpdGVtLm5hbWUpICsgXCJcXG5cXHRcXHRcXHRcIildXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgIF1cbiAgICApXG4gIF0pXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"3907bbca-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true& ***!
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"page page-index\" }, [\n _c(\"div\", { staticClass: \"banner-contaner\" }, [\n _c(\n \"div\",\n { staticClass: \"banner banner-pc\" },\n [\n _c(\n \"swiper\",\n { attrs: { options: _vm.swiperOption } },\n [\n _vm._l(_vm.bannerList, function(item, index) {\n return _c(\"swiper-slide\", { key: index }, [\n _c(\"img\", {\n staticClass: \"banner-img\",\n attrs: { src: item.pcBannerUrl }\n }),\n _c(\n \"div\",\n { staticClass: \"btn-wrap\" },\n _vm._l(item.btns, function(btnItem, btnIndex) {\n return _c(\n \"div\",\n {\n key: btnIndex,\n staticClass: \"banner-btn\",\n style: { backgroundColor: btnItem.c },\n on: {\n click: function($event) {\n return _vm.btnNavigateTo(btnItem.t, btnItem.l)\n }\n }\n },\n [_vm._v(_vm._s(btnItem.n))]\n )\n }),\n 0\n )\n ])\n }),\n _c(\"div\", {\n staticClass: \"swiper-pagination\",\n attrs: { slot: \"pagination\" },\n slot: \"pagination\"\n })\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"div\",\n { staticClass: \"banner banner-mobile\" },\n [\n _c(\n \"swiper\",\n { staticClass: \"swiper\", attrs: { options: _vm.swiperOption } },\n [\n _vm._l(_vm.bannerList, function(item, index) {\n return _c(\"swiper-slide\", { key: index }, [\n _c(\"img\", {\n staticClass: \"banner-img\",\n attrs: { src: item.mobileBannerUrl }\n }),\n _c(\n \"div\",\n { staticClass: \"btn-wrap\" },\n _vm._l(item.btns, function(btnItem, btnIndex) {\n return _c(\n \"div\",\n {\n key: btnIndex,\n staticClass: \"banner-btn\",\n style: { color: btnItem.c },\n on: {\n click: function($event) {\n return _vm.btnNavigateTo(btnItem.t, btnItem.l)\n }\n }\n },\n [_vm._v(_vm._s(btnItem.n) + \" >\")]\n )\n }),\n 0\n )\n ])\n }),\n _c(\"div\", {\n staticClass: \"swiper-pagination\",\n attrs: { slot: \"pagination\" },\n slot: \"pagination\"\n })\n ],\n 2\n )\n ],\n 1\n )\n ]),\n _c(\"div\", { staticClass: \"content\" }, [\n _c(\"div\", { staticClass: \"box recommend gird-g\" }, [\n _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n _c(\n \"div\",\n {\n staticClass: \"btn pointer\",\n on: {\n click: function($event) {\n return _vm.onRecommendHandler(1)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"index.recommend.t1\")))]\n ),\n _c(\"div\", { staticClass: \"img img1\" })\n ]),\n _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n _c(\n \"div\",\n {\n staticClass: \"btn pointer\",\n on: {\n click: function($event) {\n return _vm.onRecommendHandler(3)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"index.recommend.t2\")))]\n ),\n _c(\"div\", { staticClass: \"img img2\" })\n ]),\n _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n _c(\n \"div\",\n {\n staticClass: \"btn pointer\",\n on: {\n click: function($event) {\n return _vm.onRecommendHandler(1)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"index.recommend.t3\")))]\n ),\n _c(\"div\", { staticClass: \"img img3\" })\n ]),\n _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n _c(\n \"div\",\n {\n staticClass: \"btn pointer\",\n on: {\n click: function($event) {\n return _vm.onRecommendHandler(4)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"index.recommend.t4\")))]\n ),\n _c(\"div\", { staticClass: \"img img4\" })\n ])\n ]),\n _c(\n \"div\",\n { staticClass: \"box detail\" },\n [\n _c(\"video-player\", {\n ref: \"videoPlayer\",\n staticClass: \"vjs-custom-skin\",\n attrs: { options: _vm.playerOptions, playsinline: true }\n }),\n _vm.$i18n.locale == \"zh\"\n ? _c(\"div\", { staticClass: \"txt\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t中国平安人寿保险股份有限公司成立于2002年,是中国平安保险(集团)股份有限公司旗下的重要成员。截至2017年12月31日,平安人寿注册资本为338亿元,在全国拥有42家分公司(含7家电话销售中心)及超过3,300个营业网点,寿险代理人达138.6万名。公司个险、银保、电销、互联网多渠道齐头并进,实现协同发展,运营管理水平及客户体验领先市场,并依托集团“金融+科技”双驱动战略,在合规经营、防范风险的前提下,开启平台经营新时代,持续提升产品、科技两大核心竞争力,推动内含价值及规模持续、健康、稳定增长。\\n\\t\\t\\t\"\n )\n ])\n : _vm.$i18n.locale == \"tc\"\n ? _c(\"div\", { staticClass: \"txt\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\t中國平安人壽保險股份有限公司成立於2002年,是中國平安保險(集團)股份有限公司旗下的重要成員。截至2017年12月31日,平安人壽註冊資本為338億元,在全國擁有42家分公司(含7家電話銷售中心)及超過3,300個營業網點,壽險代理人達138.6萬名。公司個險、銀保、電銷、互聯網多渠道齊頭並進,實現協同發展,運營管理水平及客戶體驗領先市場,並依托集團“金融+科技”雙驅動戰略,在合規經營、防範風險的前提下,開啟平臺經營新時代,持續提升產品、科技兩大核心競爭力,推動內含價值及規模持續、健康、穩定增長。\\n\\t\\t\\t\"\n )\n ])\n : _c(\"div\", { staticClass: \"txt\" }, [\n _vm._v(\n \"\\n\\t\\t\\t\\tPing An Life Insurance Co., Ltd. of China was founded in 2002. It is an important member of Ping An insurance (Group) Co., Ltd. As of December 31, 2017, Ping An life had a registered capital of 33.8 billion yuan. It has 42 branches (including 7 telemarketing centers) and more than 3300 business outlets nationwide, with 1.386 million life insurance agents. The company's personal insurance, bancassurance, telemarketing and Internet multi-channel go hand in hand to achieve coordinated development, leading the market in operation and management level and customer experience, and relying on the group's \\\"Finance + technology\\\" dual drive strategy, under the premise of compliant operation and risk prevention, to open a new era of platform operation, continuously improve the two core competitiveness of products and technology, and promote the sustainability of embedded value and scale Healthy and stable growth.\\n\\t\\t\\t\"\n )\n ])\n ],\n 1\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWJhZGM4MDEmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4L2luZGV4LnZ1ZT9mZjFlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJwYWdlIHBhZ2UtaW5kZXhcIiB9LCBbXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJiYW5uZXItY29udGFuZXJcIiB9LCBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJiYW5uZXIgYmFubmVyLXBjXCIgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJzd2lwZXJcIixcbiAgICAgICAgICAgIHsgYXR0cnM6IHsgb3B0aW9uczogX3ZtLnN3aXBlck9wdGlvbiB9IH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5fbChfdm0uYmFubmVyTGlzdCwgZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2MoXCJzd2lwZXItc2xpZGVcIiwgeyBrZXk6IGluZGV4IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYmFubmVyLWltZ1wiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBzcmM6IGl0ZW0ucGNCYW5uZXJVcmwgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJidG4td3JhcFwiIH0sXG4gICAgICAgICAgICAgICAgICAgIF92bS5fbChpdGVtLmJ0bnMsIGZ1bmN0aW9uKGJ0bkl0ZW0sIGJ0bkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBidG5JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYmFubmVyLWJ0blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6IGJ0bkl0ZW0uYyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uYnRuTmF2aWdhdGVUbyhidG5JdGVtLnQsIGJ0bkl0ZW0ubClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhidG5JdGVtLm4pKV1cbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJzd2lwZXItcGFnaW5hdGlvblwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNsb3Q6IFwicGFnaW5hdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgc2xvdDogXCJwYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiYmFubmVyIGJhbm5lci1tb2JpbGVcIiB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInN3aXBlclwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJzd2lwZXJcIiwgYXR0cnM6IHsgb3B0aW9uczogX3ZtLnN3aXBlck9wdGlvbiB9IH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF92bS5fbChfdm0uYmFubmVyTGlzdCwgZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2MoXCJzd2lwZXItc2xpZGVcIiwgeyBrZXk6IGluZGV4IH0sIFtcbiAgICAgICAgICAgICAgICAgIF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYmFubmVyLWltZ1wiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBzcmM6IGl0ZW0ubW9iaWxlQmFubmVyVXJsIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiYnRuLXdyYXBcIiB9LFxuICAgICAgICAgICAgICAgICAgICBfdm0uX2woaXRlbS5idG5zLCBmdW5jdGlvbihidG5JdGVtLCBidG5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogYnRuSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImJhbm5lci1idG5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgY29sb3I6IGJ0bkl0ZW0uYyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0uYnRuTmF2aWdhdGVUbyhidG5JdGVtLnQsIGJ0bkl0ZW0ubClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhidG5JdGVtLm4pICsgXCLCoD5cIildXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwic3dpcGVyLXBhZ2luYXRpb25cIixcbiAgICAgICAgICAgICAgICBhdHRyczogeyBzbG90OiBcInBhZ2luYXRpb25cIiB9LFxuICAgICAgICAgICAgICAgIHNsb3Q6IFwicGFnaW5hdGlvblwiXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgXSxcbiAgICAgICAgMVxuICAgICAgKVxuICAgIF0pLFxuICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiY29udGVudFwiIH0sIFtcbiAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiYm94IHJlY29tbWVuZCBnaXJkLWdcIiB9LCBbXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwicmVjb21tZW5kLWl0ZW0gcHVyZS11LTEgcHVyZS11LW1kLTEtMlwiIH0sIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImJ0biBwb2ludGVyXCIsXG4gICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblJlY29tbWVuZEhhbmRsZXIoMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJpbmRleC5yZWNvbW1lbmQudDFcIikpKV1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiaW1nIGltZzFcIiB9KVxuICAgICAgICBdKSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJyZWNvbW1lbmQtaXRlbSBwdXJlLXUtMSBwdXJlLXUtbWQtMS0yXCIgfSwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYnRuIHBvaW50ZXJcIixcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uUmVjb21tZW5kSGFuZGxlcigzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImluZGV4LnJlY29tbWVuZC50MlwiKSkpXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJpbWcgaW1nMlwiIH0pXG4gICAgICAgIF0pLFxuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInJlY29tbWVuZC1pdGVtIHB1cmUtdS0xIHB1cmUtdS1tZC0xLTJcIiB9LCBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJidG4gcG9pbnRlclwiLFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25SZWNvbW1lbmRIYW5kbGVyKDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiaW5kZXgucmVjb21tZW5kLnQzXCIpKSldXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImltZyBpbWczXCIgfSlcbiAgICAgICAgXSksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwicmVjb21tZW5kLWl0ZW0gcHVyZS11LTEgcHVyZS11LW1kLTEtMlwiIH0sIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImJ0biBwb2ludGVyXCIsXG4gICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblJlY29tbWVuZEhhbmRsZXIoNClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJpbmRleC5yZWNvbW1lbmQudDRcIikpKV1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiaW1nIGltZzRcIiB9KVxuICAgICAgICBdKVxuICAgICAgXSksXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJib3ggZGV0YWlsXCIgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFwidmlkZW8tcGxheWVyXCIsIHtcbiAgICAgICAgICAgIHJlZjogXCJ2aWRlb1BsYXllclwiLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwidmpzLWN1c3RvbS1za2luXCIsXG4gICAgICAgICAgICBhdHRyczogeyBvcHRpb25zOiBfdm0ucGxheWVyT3B0aW9ucywgcGxheXNpbmxpbmU6IHRydWUgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIF92bS4kaTE4bi5sb2NhbGUgPT0gXCJ6aFwiXG4gICAgICAgICAgICA/IF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHh0XCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgIFwiXFxuXFx0XFx0XFx0XFx05Lit5Zu95bmz5a6J5Lq65a+/5L+d6Zmp6IKh5Lu95pyJ6ZmQ5YWs5Y+45oiQ56uL5LqOMjAwMuW5tCzmmK/kuK3lm73lubPlronkv53pmanvvIjpm4blm6LvvInogqHku73mnInpmZDlhazlj7jml5fkuIvnmoTph43opoHmiJDlkZjjgILmiKroh7MyMDE35bm0MTLmnIgzMeaXpSzlubPlronkurrlr7/ms6jlhozotYTmnKzkuLozMzjkur/lhYPvvIzlnKjlhajlm73mi6XmnIk0MuWutuWIhuWFrOWPuO+8iOWQqzflrrbnlLXor53plIDllK7kuK3lv4PvvInlj4rotoXov4czLDMwMOS4quiQpeS4mue9keeCuSzlr7/pmanku6PnkIbkurrovr4xMzguNuS4h+WQjeOAguWFrOWPuOS4qumZqeOAgemTtuS/neOAgeeUtemUgOOAgeS6kuiBlOe9keWkmua4oOmBk+m9kOWktOW5tui/m++8jOWunueOsOWNj+WQjOWPkeWxle+8jOi/kOiQpeeuoeeQhuawtOW5s+WPiuWuouaIt+S9k+mqjOmihuWFiOW4guWcuu+8jOW5tuS+neaJmOmbhuWbouKAnOmHkeiejSvnp5HmioDigJ3lj4zpqbHliqjmiJjnlaXvvIzlnKjlkIjop4Tnu4/okKXjgIHpmLLojIPpo47pmannmoTliY3mj5DkuIvvvIzlvIDlkK/lubPlj7Dnu4/okKXmlrDml7bku6PvvIzmjIHnu63mj5DljYfkuqflk4HjgIHnp5HmioDkuKTlpKfmoLjlv4Pnq57kuonlipvvvIzmjqjliqjlhoXlkKvku7flgLzlj4rop4TmqKHmjIHnu63jgIHlgaXlurfjgIHnqLPlrprlop7plb/jgIJcXG5cXHRcXHRcXHRcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIDogX3ZtLiRpMThuLmxvY2FsZSA9PSBcInRjXCJcbiAgICAgICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0eHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHTkuK3lnIvlubPlronkurrlo73kv53pmqrogqHku73mnInpmZDlhazlj7jmiJDnq4vmlrwyMDAy5bm0LOaYr+S4reWci+W5s+WuieS/nemaqu+8iOmbhuWcmO+8ieiCoeS7veaciemZkOWFrOWPuOaXl+S4i+eahOmHjeimgeaIkOWToeOAguaIquiHszIwMTflubQxMuaciDMx5pelLOW5s+WuieS6uuWjveiou+WGiuizh+acrOeCujMzOOWEhOWFg++8jOWcqOWFqOWci+aTgeaciTQy5a625YiG5YWs5Y+477yI5ZCrN+Wutumbu+ipsemKt+WUruS4reW/g++8ieWPiui2hemBjjMsMzAw5YCL54ef5qWt57ay6bueLOWjvemaquS7o+eQhuS6uumBlDEzOC426JCs5ZCN44CC5YWs5Y+45YCL6Zqq44CB6YqA5L+d44CB6Zu76Yq344CB5LqS6IGv57ay5aSa5rig6YGT6b2K6aCt5Lim6YCy77yM5a+m54++5Y2U5ZCM55m85bGV77yM6YGL54ef566h55CG5rC05bmz5Y+K5a6i5oi26auU6amX6aCY5YWI5biC5aC077yM5Lim5L6d5omY6ZuG5ZyY4oCc6YeR6J6NK+enkeaKgOKAnembmempheWLleaIsOeVpe+8jOWcqOWQiOimj+e2k+eHn+OAgemYsuevhOmiqOmaqueahOWJjeaPkOS4i++8jOmWi+WVn+W5s+iHuue2k+eHn+aWsOaZguS7o++8jOaMgee6jOaPkOWNh+eUouWTgeOAgeenkeaKgOWFqeWkp+aguOW/g+ertueIreWKm++8jOaOqOWLleWFp+WQq+WDueWAvOWPiuimj+aooeaMgee6jOOAgeWBpeW6t+OAgeepqeWumuWinumVt+OAglxcblxcdFxcdFxcdFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInR4dFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICBcIlxcblxcdFxcdFxcdFxcdFBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ28uLCBMdGQuIG9mIENoaW5hIHdhcyBmb3VuZGVkIGluIDIwMDIuIEl0IGlzIGFuIGltcG9ydGFudCBtZW1iZXIgb2YgUGluZyBBbiBpbnN1cmFuY2UgKEdyb3VwKSBDby4sIEx0ZC4gQXMgb2YgRGVjZW1iZXIgMzEsIDIwMTcsIFBpbmcgQW4gbGlmZSBoYWQgYSByZWdpc3RlcmVkIGNhcGl0YWwgb2YgMzMuOCBiaWxsaW9uIHl1YW4uIEl0IGhhcyA0MiBicmFuY2hlcyAoaW5jbHVkaW5nIDcgdGVsZW1hcmtldGluZyBjZW50ZXJzKSBhbmQgbW9yZSB0aGFuIDMzMDAgYnVzaW5lc3Mgb3V0bGV0cyBuYXRpb253aWRlLCB3aXRoIDEuMzg2IG1pbGxpb24gbGlmZSBpbnN1cmFuY2UgYWdlbnRzLiBUaGUgY29tcGFueSdzIHBlcnNvbmFsIGluc3VyYW5jZSwgYmFuY2Fzc3VyYW5jZSwgdGVsZW1hcmtldGluZyBhbmQgSW50ZXJuZXQgbXVsdGktY2hhbm5lbCBnbyBoYW5kIGluIGhhbmQgdG8gYWNoaWV2ZSBjb29yZGluYXRlZCBkZXZlbG9wbWVudCwgbGVhZGluZyB0aGUgbWFya2V0IGluIG9wZXJhdGlvbiBhbmQgbWFuYWdlbWVudCBsZXZlbCBhbmQgY3VzdG9tZXIgZXhwZXJpZW5jZSwgYW5kIHJlbHlpbmcgb24gdGhlIGdyb3VwJ3MgXFxcIkZpbmFuY2UgKyB0ZWNobm9sb2d5XFxcIiBkdWFsIGRyaXZlIHN0cmF0ZWd5LCB1bmRlciB0aGUgcHJlbWlzZSBvZiBjb21wbGlhbnQgb3BlcmF0aW9uIGFuZCByaXNrIHByZXZlbnRpb24sIHRvIG9wZW4gYSBuZXcgZXJhIG9mIHBsYXRmb3JtIG9wZXJhdGlvbiwgY29udGludW91c2x5IGltcHJvdmUgdGhlIHR3byBjb3JlIGNvbXBldGl0aXZlbmVzcyBvZiBwcm9kdWN0cyBhbmQgdGVjaG5vbG9neSwgYW5kIHByb21vdGUgdGhlIHN1c3RhaW5hYmlsaXR5IG9mIGVtYmVkZGVkIHZhbHVlIGFuZCBzY2FsZSBIZWFsdGh5IGFuZCBzdGFibGUgZ3Jvd3RoLlxcblxcdFxcdFxcdFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApXG4gICAgXSlcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzPzg0NTEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js":
/*!*****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\")(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcz9hYjE5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js":
/*!*******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar at = __webpack_require__(/*! ./_string-at */ \"./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js\")(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWR2YW5jZS1zdHJpbmctaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWR2YW5jZS1zdHJpbmctaW5kZXguanM/ZmYwNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanM/NWUwMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcz84Y2FjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js":
/*!*************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js\");\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanM/MWY5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_classof.js":
/*!******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_classof.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzAyZjIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_cof.js":
/*!**************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_cof.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY29mLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2NvZi5qcz82MDc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_core.js":
/*!***************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_core.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var core = module.exports = { version: '2.6.10' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY29yZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzP2RhMjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4xMCcgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_core.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar $defineProperty = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcz9lMzIzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js":
/*!**************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// optional / simple context binding\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY3R4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2N0eC5qcz9lODVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_defined.js":
/*!******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_defined.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzPzMwMzgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanM/ZjlhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar document = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzY2MTgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js":
/*!************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2Q5M2YiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_export.js":
/*!*****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_export.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcz8yNDk4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_export.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_fails.js":
/*!****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_fails.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmFpbHMuanM/MGNjMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n__webpack_require__(/*! ./es6.regexp.exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\");\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzZhZjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_flags.js":
/*!****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_flags.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanM/ZTdhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js":
/*!*****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar call = __webpack_require__(/*! ./_iter-call */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js\");\nvar isArrayIter = __webpack_require__(/*! ./_is-array-iter */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ \"./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js\");\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qcz8yMmFlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js":
/*!*****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('native-function-to-string', Function.toString);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2Z1bmN0aW9uLXRvLXN0cmluZy5qcz82ZmUwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_global.js":
/*!*****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_global.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcz8zZjhiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_global.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_has.js":
/*!**************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_has.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faGFzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2hhcy5qcz81NDlkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_has.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_hide.js":
/*!***************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_hide.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faGlkZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzP2I4ZWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_html.js":
/*!***************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_html.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var document = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faHRtbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19odG1sLmpzPzE3Y2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_html.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js":
/*!*************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && !__webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\")('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanM/MjVhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js":
/*!******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js ***!
\******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar setPrototypeOf = __webpack_require__(/*! ./_set-proto */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js\").set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzFlMDEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js":
/*!*****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcz8yZjFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js":
/*!******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzk5NTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js":
/*!************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// check on default Array iterator\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzPzY3YzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcz9kYTBiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\nvar MATCH = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtcmVnZXhwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcz81ZjljIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcz9kZDgwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js\");\nvar descriptor = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\");\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\")(IteratorPrototype, __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanM/YzI2NCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\");\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar $iterCreate = __webpack_require__(/*! ./_iter-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js\");\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\");\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanM/NGFlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanM/YjMwOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcz9jOGU5Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcz9lM2IzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge307XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_library.js":
/*!******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_library.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzZjYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_library.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar macrotask = __webpack_require__(/*! ./_task */ \"./node_modules/_core-js@2.6.10@core-js/modules/_task.js\").set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\")(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcz85NDk3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js":
/*!*********************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzPzIxY2IiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js":
/*!************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\");\nvar pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\");\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzPzg3YzUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBpc0VudW0uY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js":
/*!************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar dPs = __webpack_require__(/*! ./_object-dps */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js\");\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\");\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\")('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(/*! ./_html */ \"./node_modules/_core-js@2.6.10@core-js/modules/_html.js\").appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzY1YzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\");\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\");\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcz9kM2Q4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\n\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzhkNjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\");\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\");\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanM/ZTQ5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\");\nvar hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\").concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanM/Y2IyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanM/OWQ2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzP2QxNWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js":
/*!*******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar arrayIndexOf = __webpack_require__(/*! ./_array-includes */ \"./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js\")(false);\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanM/N2FmZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\");\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanM/N2Q1NiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzP2M4NjQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzPzg4NjgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js":
/*!*******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\");\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar Reflect = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanM/ZjM2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_perform.js":
/*!******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_perform.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzP2Q4YmQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGU6IGZhbHNlLCB2OiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGU6IHRydWUsIHY6IGUgfTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_perform.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\");\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcz9hMDdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js":
/*!************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzA2MTQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js":
/*!***********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcz9hMTdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js":
/*!*******************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar SRC = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\")('src');\nvar $toString = __webpack_require__(/*! ./_function-to-string */ \"./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js\");\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\").inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanM/YTZkNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgJHRvU3RyaW5nID0gcmVxdWlyZSgnLi9fZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBUUEwgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWwsIHNhZmUpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmIChPW2tleV0gPT09IHZhbCkgcmV0dXJuO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSBpZiAoIXNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9IGVsc2UgaWYgKE9ba2V5XSkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js":
/*!*******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanM/MjEzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIGJ1aWx0aW5FeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuXG4gLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwZXhlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgaWYgKHR5cGVvZiBleGVjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc3VsdCA9IGV4ZWMuY2FsbChSLCBTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXInKTtcbiAgfVxuICByZXR1cm4gYnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar regexpFlags = __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanM/MTMzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLyxcbiAgICAgIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxW0xBU1RfSU5ERVhdICE9PSAwIHx8IHJlMltMQVNUX0lOREVYXSAhPT0gMDtcbn0pKCk7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEO1xuXG5pZiAoUEFUQ0gpIHtcbiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikge1xuICAgIHZhciByZSA9IHRoaXM7XG4gICAgdmFyIGxhc3RJbmRleCwgcmVDb3B5LCBtYXRjaCwgaTtcblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHJlLnNvdXJjZSArICckKD8hXFxcXHMpJywgcmVnZXhwRmxhZ3MuY2FsbChyZSkpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZVtMQVNUX0lOREVYXTtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmVbTEFTVF9JTkRFWF0gPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKE5QQ0dfSU5DTFVERUQgJiYgbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAgIC8vIGZvciBOUENHLCBsaWtlIElFOC4gTk9URTogVGhpcyBkb2Vzbicgd29yayBmb3IgLyguPyk/L1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgbmF0aXZlUmVwbGFjZS5jYWxsKG1hdGNoWzBdLCByZUNvcHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\")(Function.call, __webpack_require__(/*! ./_object-gopd */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\").f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXByb3RvLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcz9hZTZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js":
/*!**********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\");\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanM/ZTQ2NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZiAoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSkgZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js":
/*!****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var def = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanM/M2Q4NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var shared = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('keys');\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\");\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzk5NDciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_shared.js":
/*!*****************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_shared.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\") ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcz9mMzQxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js":
/*!******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js ***!
\******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPzk1ZTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcz8xZWIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_task.js":
/*!***************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_task.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar invoke = __webpack_require__(/*! ./_invoke */ \"./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js\");\nvar html = __webpack_require__(/*! ./_html */ \"./node_modules/_core-js@2.6.10@core-js/modules/_html.js\");\nvar cel = __webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (__webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\")(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdGFzay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190YXNrLmpzPzJkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY2VsID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_task.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js":
/*!****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanM/YzNhOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzP2E2YWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzYxMTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcz84OTQxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js":
/*!********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcz9hOWNmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js":
/*!***********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcz8yYWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_uid.js":
/*!**************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_uid.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdWlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3VpZC5qcz80ZDJjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL191c2VyLWFnZW50LmpzPzFjZDciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_wks.js":
/*!**************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/_wks.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var store = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('wks');\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\");\nvar Symbol = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fd2tzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3drcy5qcz8xMjc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js":
/*!**********************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js ***!
\**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nmodule.exports = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\").getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanM/NWZmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js":
/*!****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js\");\nvar step = __webpack_require__(/*! ./_iter-step */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(/*! ./_iter-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js\")(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanM/OTZkZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js":
/*!***************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzPzdjZmQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js":
/*!***************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js\") });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzP2U3ODMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js":
/*!*************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar $keys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js\")('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanM/ZWQ4YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js":
/*!*********************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js\");\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar task = __webpack_require__(/*! ./_task */ \"./node_modules/_core-js@2.6.10@core-js/modules/_task.js\").set;\nvar microtask = __webpack_require__(/*! ./_microtask */ \"./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js\")();\nvar newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\");\nvar perform = __webpack_require__(/*! ./_perform */ \"./node_modules/_core-js@2.6.10@core-js/modules/_perform.js\");\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js\");\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\");\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js\")($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\")($Promise, PROMISE);\n__webpack_require__(/*! ./_set-species */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\")(PROMISE);\nWrapper = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\")[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js\")(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzP2E2MGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciAkUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKExJQlJBUlkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js":
/*!********************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js ***!
\********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ \"./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js\");\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\").f;\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\");\nvar $flags = __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\");\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n re2[__webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\")(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(/*! ./_set-species */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\")('RegExp');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcz9kNDc5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyICRmbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG52YXIgQmFzZSA9ICRSZWdFeHA7XG52YXIgcHJvdG8gPSAkUmVnRXhwLnByb3RvdHlwZTtcbnZhciByZTEgPSAvYS9nO1xudmFyIHJlMiA9IC9hL2c7XG4vLyBcIm5ld1wiIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Z2d5IGhlcmVcbnZhciBDT1JSRUNUX05FVyA9IG5ldyAkUmVnRXhwKHJlMSkgIT09IHJlMTtcblxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgKCFDT1JSRUNUX05FVyB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmUyW3JlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpXSA9IGZhbHNlO1xuICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICByZXR1cm4gJFJlZ0V4cChyZTEpICE9IHJlMSB8fCAkUmVnRXhwKHJlMikgPT0gcmUyIHx8ICRSZWdFeHAocmUxLCAnaScpICE9ICcvYS9pJztcbn0pKSkge1xuICAkUmVnRXhwID0gZnVuY3Rpb24gUmVnRXhwKHAsIGYpIHtcbiAgICB2YXIgdGlSRSA9IHRoaXMgaW5zdGFuY2VvZiAkUmVnRXhwO1xuICAgIHZhciBwaVJFID0gaXNSZWdFeHAocCk7XG4gICAgdmFyIGZpVSA9IGYgPT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gIXRpUkUgJiYgcGlSRSAmJiBwLmNvbnN0cnVjdG9yID09PSAkUmVnRXhwICYmIGZpVSA/IHBcbiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVdcbiAgICAgICAgPyBuZXcgQmFzZShwaVJFICYmICFmaVUgPyBwLnNvdXJjZSA6IHAsIGYpXG4gICAgICAgIDogQmFzZSgocGlSRSA9IHAgaW5zdGFuY2VvZiAkUmVnRXhwKSA/IHAuc291cmNlIDogcCwgcGlSRSAmJiBmaVUgPyAkZmxhZ3MuY2FsbChwKSA6IGYpXG4gICAgICAsIHRpUkUgPyB0aGlzIDogcHJvdG8sICRSZWdFeHApO1xuICB9O1xuICB2YXIgcHJveHkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAga2V5IGluICRSZWdFeHAgfHwgZFAoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEJhc2Vba2V5XTsgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKGl0KSB7IEJhc2Vba2V5XSA9IGl0OyB9XG4gICAgfSk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2UpLCBpID0gMDsga2V5cy5sZW5ndGggPiBpOykgcHJveHkoa2V5c1tpKytdKTtcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkUmVnRXhwO1xuICAkUmVnRXhwLnByb3RvdHlwZSA9IHByb3RvO1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKGdsb2JhbCwgJ1JlZ0V4cCcsICRSZWdFeHApO1xufVxuXG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdSZWdFeHAnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js":
/*!*************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\n__webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\")({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMuanM/YjNmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5yZXF1aXJlKCcuL19leHBvcnQnKSh7XG4gIHRhcmdldDogJ1JlZ0V4cCcsXG4gIHByb3RvOiB0cnVlLFxuICBmb3JjZWQ6IHJlZ2V4cEV4ZWMgIT09IC8uLy5leGVjXG59LCB7XG4gIGV4ZWM6IHJlZ2V4cEV4ZWNcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.flags.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.flags.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f(RegExp.prototype, 'flags', {\n configurable: true,\n get: __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\")\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcz85ZjdlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzKClcbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIC8uL2cuZmxhZ3MgIT0gJ2cnKSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IHJlcXVpcmUoJy4vX2ZsYWdzJylcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.flags.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\n\n// @@match logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcz9lYmVjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIE1BVENILCAkbWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLm1hdGNoXG4gICAgZnVuY3Rpb24gbWF0Y2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBtYXRjaFxuICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJG1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKCFyeC5nbG9iYWwpIHJldHVybiByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js":
/*!****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanM/YzA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJmAnXXxcXGRcXGQ/fDxbXj5dKj4pL2c7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXFwkKFskJmAnXXxcXGRcXGQ/KS9nO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAocmVnZXhwLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJHJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gdHlwZW9mIHJlcGxhY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpO1xuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgIH1cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICAgIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICB2YXIgbSA9IGNhcHR1cmVzLmxlbmd0aDtcbiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hbWVkQ2FwdHVyZXMgPSB0b09iamVjdChuYW1lZENhcHR1cmVzKTtcbiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcz9lNmQxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNhbGxSZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJG1pbiA9IE1hdGgubWluO1xudmFyICRwdXNoID0gW10ucHVzaDtcbnZhciAkU1BMSVQgPSAnc3BsaXQnO1xudmFyIExFTkdUSCA9ICdsZW5ndGgnO1xudmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbnZhciBNQVhfVUlOVDMyID0gMHhmZmZmZmZmZjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgUmVnRXhwKE1BWF9VSU5UMzIsICd5Jyk7IH0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFNQTElULCAkc3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJ1skU1BMSVRdKC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgJ3Rlc3QnWyRTUExJVF0oLyg/OikvLCAtMSlbTEVOR1RIXSAhPSA0IHx8XG4gICAgJ2FiJ1skU1BMSVRdKC8oPzphYikqLylbTEVOR1RIXSAhPSAyIHx8XG4gICAgJy4nWyRTUExJVF0oLyguPykoLj8pLylbTEVOR1RIXSAhPSA0IHx8XG4gICAgJy4nWyRTUExJVF0oLygpKCkvKVtMRU5HVEhdID4gMSB8fFxuICAgICcnWyRTUExJVF0oLy4/LylbTEVOR1RIXVxuICApIHtcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDApIHJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHJldHVybiAkc3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgdmFyIGZsYWdzID0gKHNlcGFyYXRvci5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKTtcbiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBzcGxpdExpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICB2YXIgc2VwYXJhdG9yQ29weSA9IG5ldyBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7XG4gICAgICB3aGlsZSAobWF0Y2ggPSByZWdleHBFeGVjLmNhbGwoc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdO1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSAkcHVzaC5hcHBseShvdXRwdXQsIG1hdGNoLnNsaWNlKDEpKTtcbiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgIGlmIChvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJ1skU1BMSVRdKHVuZGVmaW5lZCwgMClbTEVOR1RIXSkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiAkc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsU3BsaXQgPSAkc3BsaXQ7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcmVnZXhwLCB0aGlzLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gJHNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gJG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js":
/*!******************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js ***!
\******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n__webpack_require__(/*! ./es6.regexp.flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.flags.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar $flags = __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\");\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\")(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (__webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzP2NjMWQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmZsYWdzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IC8uL1tUT19TVFJJTkddO1xuXG52YXIgZGVmaW5lID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmbiwgdHJ1ZSk7XG59O1xuXG4vLyAyMS4yLjUuMTQgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZygpXG5pZiAocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7IHJldHVybiAkdG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSkpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICRmbGFncy5jYWxsKFIpIDogdW5kZWZpbmVkKTtcbiAgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxufSBlbHNlIGlmICgkdG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkcpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js":
/*!*************************************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js ***!
\*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar ownKeys = __webpack_require__(/*! ./_own-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\");\nvar createProperty = __webpack_require__(/*! ./_create-property */ \"./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js\");\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/ZWZjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0RGVzYyA9IGdPUEQuZjtcbiAgICB2YXIga2V5cyA9IG93bktleXMoTyk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5LCBkZXNjO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGkpIHtcbiAgICAgIGRlc2MgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js":
/*!*****************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\");\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcz84YjFmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js\n");
/***/ }),
/***/ "./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js":
/*!**************************************************************************!*\
!*** ./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var $iterators = __webpack_require__(/*! ./es6.array.iterator */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\");\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcz80NjM0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkaXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLkFycmF5O1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IGZhbHNlLFxuICBDU1NWYWx1ZUxpc3Q6IGZhbHNlLFxuICBDbGllbnRSZWN0TGlzdDogZmFsc2UsXG4gIERPTVJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NU3RyaW5nTGlzdDogZmFsc2UsXG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IGZhbHNlLFxuICBGaWxlTGlzdDogZmFsc2UsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MRm9ybUVsZW1lbnQ6IGZhbHNlLFxuICBIVE1MU2VsZWN0RWxlbWVudDogZmFsc2UsXG4gIE1lZGlhTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIE1pbWVUeXBlQXJyYXk6IGZhbHNlLFxuICBOYW1lZE5vZGVNYXA6IGZhbHNlLFxuICBOb2RlTGlzdDogdHJ1ZSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogZmFsc2UsXG4gIFBsdWdpbjogZmFsc2UsXG4gIFBsdWdpbkFycmF5OiBmYWxzZSxcbiAgU1ZHTGVuZ3RoTGlzdDogZmFsc2UsXG4gIFNWR051bWJlckxpc3Q6IGZhbHNlLFxuICBTVkdQYXRoU2VnTGlzdDogZmFsc2UsXG4gIFNWR1BvaW50TGlzdDogZmFsc2UsXG4gIFNWR1N0cmluZ0xpc3Q6IGZhbHNlLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiBmYWxzZSxcbiAgU291cmNlQnVmZmVyTGlzdDogZmFsc2UsXG4gIFN0eWxlU2hlZXRMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgVGV4dFRyYWNrQ3VlTGlzdDogZmFsc2UsXG4gIFRleHRUcmFja0xpc3Q6IGZhbHNlLFxuICBUb3VjaExpc3Q6IGZhbHNlXG59O1xuXG5mb3IgKHZhciBjb2xsZWN0aW9ucyA9IGdldEtleXMoRE9NSXRlcmFibGVzKSwgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IGNvbGxlY3Rpb25zW2ldO1xuICB2YXIgZXhwbGljaXQgPSBET01JdGVyYWJsZXNbTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICB2YXIga2V5O1xuICBpZiAocHJvdG8pIHtcbiAgICBpZiAoIXByb3RvW0lURVJBVE9SXSkgaGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZiAoIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBpZiAoZXhwbGljaXQpIGZvciAoa2V5IGluICRpdGVyYXRvcnMpIGlmICghcHJvdG9ba2V5XSkgcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/aes.js":
/*!**********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/aes.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9hZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9hZXMuanM/YTJlYyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBMb29rdXAgdGFibGVzXG5cdCAgICB2YXIgU0JPWCA9IFtdO1xuXHQgICAgdmFyIElOVl9TQk9YID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8wID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8xID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8zID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMCA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzEgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMyA9IFtdO1xuXG5cdCAgICAvLyBDb21wdXRlIGxvb2t1cCB0YWJsZXNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gQ29tcHV0ZSBkb3VibGUgdGFibGVcblx0ICAgICAgICB2YXIgZCA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgaWYgKGkgPCAxMjgpIHtcblx0ICAgICAgICAgICAgICAgIGRbaV0gPSBpIDw8IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBkW2ldID0gKGkgPDwgMSkgXiAweDExYjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFdhbGsgR0YoMl44KVxuXHQgICAgICAgIHZhciB4ID0gMDtcblx0ICAgICAgICB2YXIgeGkgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBzYm94XG5cdCAgICAgICAgICAgIHZhciBzeCA9IHhpIF4gKHhpIDw8IDEpIF4gKHhpIDw8IDIpIF4gKHhpIDw8IDMpIF4gKHhpIDw8IDQpO1xuXHQgICAgICAgICAgICBzeCA9IChzeCA+Pj4gOCkgXiAoc3ggJiAweGZmKSBeIDB4NjM7XG5cdCAgICAgICAgICAgIFNCT1hbeF0gPSBzeDtcblx0ICAgICAgICAgICAgSU5WX1NCT1hbc3hdID0geDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG11bHRpcGxpY2F0aW9uXG5cdCAgICAgICAgICAgIHZhciB4MiA9IGRbeF07XG5cdCAgICAgICAgICAgIHZhciB4NCA9IGRbeDJdO1xuXHQgICAgICAgICAgICB2YXIgeDggPSBkW3g0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIHN1YiBieXRlcywgbWl4IGNvbHVtbnMgdGFibGVzXG5cdCAgICAgICAgICAgIHZhciB0ID0gKGRbc3hdICogMHgxMDEpIF4gKHN4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgU1VCX01JWF8wW3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzFbeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzJbeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzNbeF0gPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgaW52IHN1YiBieXRlcywgaW52IG1peCBjb2x1bW5zIHRhYmxlc1xuXHQgICAgICAgICAgICB2YXIgdCA9ICh4OCAqIDB4MTAxMDEwMSkgXiAoeDQgKiAweDEwMDAxKSBeICh4MiAqIDB4MTAxKSBeICh4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMFtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzFbc3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMltzeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8zW3N4XSA9IHQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IGNvdW50ZXJcblx0ICAgICAgICAgICAgaWYgKCF4KSB7XG5cdCAgICAgICAgICAgICAgICB4ID0geGkgPSAxO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgeCA9IHgyIF4gZFtkW2RbeDggXiB4Ml1dXTtcblx0ICAgICAgICAgICAgICAgIHhpIF49IGRbZFt4aV1dO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUHJlY29tcHV0ZWQgUmNvbiBsb29rdXBcblx0ICAgIHZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFFUyBibG9jayBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgQUVTID0gQ19hbGdvLkFFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2tpcCByZXNldCBvZiBuUm91bmRzIGhhcyBiZWVuIHNldCBiZWZvcmUgYW5kIGtleSBkaWQgbm90IGNoYW5nZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5fblJvdW5kcyAmJiB0aGlzLl9rZXlQcmlvclJlc2V0ID09PSB0aGlzLl9rZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5UHJpb3JSZXNldCA9IHRoaXMuX2tleTtcblx0ICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGtleS5zaWdCeXRlcyAvIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Ygcm91bmRzXG5cdCAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIGtleSBzY2hlZHVsZSByb3dzXG5cdCAgICAgICAgICAgIHZhciBrc1Jvd3MgPSAoblJvdW5kcyArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGtleSBzY2hlZHVsZVxuXHQgICAgICAgICAgICB2YXIga2V5U2NoZWR1bGUgPSB0aGlzLl9rZXlTY2hlZHVsZSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrc1JvdyA9IDA7IGtzUm93IDwga3NSb3dzOyBrc1JvdysrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoa3NSb3cgPCBrZXlTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5V29yZHNba3NSb3ddO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gMV07XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIShrc1JvdyAlIGtleVNpemUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdCB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA8PCA4KSB8ICh0ID4+PiAyNCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViIHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggUmNvblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0IF49IFJDT05bKGtzUm93IC8ga2V5U2l6ZSkgfCAwXSA8PCAyNDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVNpemUgPiA2ICYmIGtzUm93ICUga2V5U2l6ZSA9PSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFt0ICYgMHhmZl07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5U2NoZWR1bGVba3NSb3cgLSBrZXlTaXplXSBeIHQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludiBrZXkgc2NoZWR1bGVcblx0ICAgICAgICAgICAgdmFyIGludktleVNjaGVkdWxlID0gdGhpcy5faW52S2V5U2NoZWR1bGUgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaW52S3NSb3cgPSAwOyBpbnZLc1JvdyA8IGtzUm93czsgaW52S3NSb3crKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtzUm93ID0ga3NSb3dzIC0gaW52S3NSb3c7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93XTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgPCA0IHx8IGtzUm93IDw9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSB0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSBJTlZfU1VCX01JWF8wW1NCT1hbdCA+Pj4gMjRdXSBeIElOVl9TVUJfTUlYXzFbU0JPWFsodCA+Pj4gMTYpICYgMHhmZl1dIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZfU1VCX01JWF8yW1NCT1hbKHQgPj4+IDgpICYgMHhmZl1dIF4gSU5WX1NVQl9NSVhfM1tTQk9YW3QgJiAweGZmXV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2tleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU3dhcCAybmQgYW5kIDR0aCByb3dzXG5cdCAgICAgICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0O1xuXG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2ludktleVNjaGVkdWxlLCBJTlZfU1VCX01JWF8wLCBJTlZfU1VCX01JWF8xLCBJTlZfU1VCX01JWF8yLCBJTlZfU1VCX01JWF8zLCBJTlZfU0JPWCk7XG5cblx0ICAgICAgICAgICAgLy8gSW52IHN3YXAgMm5kIGFuZCA0dGggcm93c1xuXHQgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwga2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHM7XG5cblx0ICAgICAgICAgICAgLy8gR2V0IGlucHV0LCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciBzMCA9IE1bb2Zmc2V0XSAgICAgXiBrZXlTY2hlZHVsZVswXTtcblx0ICAgICAgICAgICAgdmFyIHMxID0gTVtvZmZzZXQgKyAxXSBeIGtleVNjaGVkdWxlWzFdO1xuXHQgICAgICAgICAgICB2YXIgczIgPSBNW29mZnNldCArIDJdIF4ga2V5U2NoZWR1bGVbMl07XG5cdCAgICAgICAgICAgIHZhciBzMyA9IE1bb2Zmc2V0ICsgM10gXiBrZXlTY2hlZHVsZVszXTtcblxuXHQgICAgICAgICAgICAvLyBLZXkgc2NoZWR1bGUgcm93IGNvdW50ZXJcblx0ICAgICAgICAgICAgdmFyIGtzUm93ID0gNDtcblxuXHQgICAgICAgICAgICAvLyBSb3VuZHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IG5Sb3VuZHM7IHJvdW5kKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgbWl4IGNvbHVtbnMsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgICAgIHZhciB0MCA9IFNVQl9NSVhfMFtzMCA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMSA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMyID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MzICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MSA9IFNVQl9NSVhfMFtzMSA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMiA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMzID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MwICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MiA9IFNVQl9NSVhfMFtzMiA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMyA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMwID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MxICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MyA9IFNVQl9NSVhfMFtzMyA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMCA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMxID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MyICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG5cdCAgICAgICAgICAgICAgICBzMCA9IHQwO1xuXHQgICAgICAgICAgICAgICAgczEgPSB0MTtcblx0ICAgICAgICAgICAgICAgIHMyID0gdDI7XG5cdCAgICAgICAgICAgICAgICBzMyA9IHQzO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hpZnQgcm93cywgc3ViIGJ5dGVzLCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciB0MCA9ICgoU0JPWFtzMCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMSA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMyID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMyAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDEgPSAoKFNCT1hbczEgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczIgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMyA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQyID0gKChTQk9YW3MyID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMzID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczAgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MxICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MyA9ICgoU0JPWFtzMyA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMxID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMiAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBvdXRwdXRcblx0ICAgICAgICAgICAgTVtvZmZzZXRdICAgICA9IHQwO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gdDE7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMl0gPSB0Mjtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAyNTYvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5BRVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKEFFUyk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuQUVTO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/aes.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js":
/*!******************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t var block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t var block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t var modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t var modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t var wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t var salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9jaXBoZXItY29yZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL2NpcGhlci1jb3JlLmpzP2NhM2EiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9ldnBrZGZcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBDaXBoZXIgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0Q3J5cHRvSlMubGliLkNpcGhlciB8fCAoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoaXMgY2lwaGVyJ3Mga2V5IHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl2U2l6ZSBUaGlzIGNpcGhlcidzIElWIHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9FTkNfWEZPUk1fTU9ERSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0RFQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENpcGhlciA9IENfbGliLkNpcGhlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVFbmNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fRU5DX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBkZWNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVEZWNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVEZWNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4Zm9ybU1vZGUgRWl0aGVyIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gdHJhbnNvcm1hdGlvbiBtb2RlIGNvbnN0YW50LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyID0gQ3J5cHRvSlMuYWxnby5BRVMuY3JlYXRlKENyeXB0b0pTLmFsZ28uQUVTLl9FTkNfWEZPUk1fTU9ERSwga2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoeGZvcm1Nb2RlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTdG9yZSB0cmFuc2Zvcm0gbW9kZSBhbmQga2V5XG5cdCAgICAgICAgICAgIHRoaXMuX3hmb3JtTW9kZSA9IHhmb3JtTW9kZTtcblx0ICAgICAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGNpcGhlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgY2lwaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUmVzZXQgZGF0YSBidWZmZXJcblx0ICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBkYXRhIHRvIGJlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3MoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5wcm9jZXNzKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGF2YWlsYWJsZSBibG9ja3Ncblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3MoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gcHJvY2Vzcy5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhVXBkYXRlIFRoZSBmaW5hbCBkYXRhIHRvIGVuY3J5cHQgb3IgZGVjcnlwdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgZmluYWwgcHJvY2Vzc2luZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgZGF0YSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZERhdGEgPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkRGF0YTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXG5cdCAgICAgICAgaXZTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBfRU5DX1hGT1JNX01PREU6IDEsXG5cblx0ICAgICAgICBfREVDX1hGT1JNX01PREU6IDIsXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHNob3J0Y3V0IGZ1bmN0aW9ucyB0byBhIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggZW5jcnlwdCBhbmQgZGVjcnlwdCBzaG9ydGN1dCBmdW5jdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBBRVMgPSBDcnlwdG9KUy5saWIuQ2lwaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5BRVMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFzc3dvcmRCYXNlZENpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZUNpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2lwaGVyKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5lbmNyeXB0KGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVydGV4dCwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZGVjcnlwdChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0oKSlcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2Ugc3RyZWFtIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxICgzMiBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBwYXJ0aWFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDFcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIE1vZGUgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19tb2RlID0gQy5tb2RlID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgbW9kZSB0ZW1wbGF0ZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyTW9kZSA9IENfbGliLkJsb2NrQ2lwaGVyTW9kZSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZW5jcnlwdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZUVuY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdik7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBkZWNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRGVjcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5FbmNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NpcGhlciA9IGNpcGhlcjtcblx0ICAgICAgICAgICAgdGhpcy5faXYgPSBpdjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENCQyA9IENfbW9kZS5DQkMgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFic3RyYWN0IGJhc2UgQ0JDIG1vZGUuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdmFyIENCQyA9IEJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBlbmNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkVuY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFhPUiBhbmQgZW5jcnlwdFxuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBkZWNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkRlY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9ja1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gRGVjcnlwdCBhbmQgWE9SXG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZGVjcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGJsb2NrIGJlY29tZXMgdGhlIHByZXZpb3VzIGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB0aGlzQmxvY2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGZ1bmN0aW9uIHhvckJsb2NrKHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblxuXHQgICAgICAgICAgICAvLyBDaG9vc2UgbWl4aW5nIGJsb2NrXG5cdCAgICAgICAgICAgIGlmIChpdikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrID0gaXY7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5fcHJldkJsb2NrO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gWE9SIGJsb2Nrc1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tvZmZzZXQgKyBpXSBePSBibG9ja1tpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBDQkM7XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBhZGRpbmcgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19wYWQgPSBDLnBhZCA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBLQ1MgIzUvNyBwYWRkaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGtjczcgPSBDX3BhZC5Qa2NzNyA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQYWRzIGRhdGEgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHBhZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYmxvY2tTaXplIFRoZSBtdWx0aXBsZSB0aGF0IHRoZSBkYXRhIHNob3VsZCBiZSBwYWRkZWQgdG8uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIENyeXB0b0pTLnBhZC5Qa2NzNy5wYWQod29yZEFycmF5LCA0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBwYWRkaW5nIGJ5dGVzXG5cdCAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gYmxvY2tTaXplQnl0ZXMgLSBkYXRhLnNpZ0J5dGVzICUgYmxvY2tTaXplQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmcgd29yZFxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ1dvcmQgPSAoblBhZGRpbmdCeXRlcyA8PCAyNCkgfCAoblBhZGRpbmdCeXRlcyA8PCAxNikgfCAoblBhZGRpbmdCeXRlcyA8PCA4KSB8IG5QYWRkaW5nQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5QYWRkaW5nQnl0ZXM7IGkgKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgcGFkZGluZ1dvcmRzLnB1c2gocGFkZGluZ1dvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nID0gV29yZEFycmF5LmNyZWF0ZShwYWRkaW5nV29yZHMsIG5QYWRkaW5nQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGEuY29uY2F0KHBhZGRpbmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVbnBhZHMgZGF0YSB0aGF0IGhhZCBiZWVuIHBhZGRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGRlZmluZWQgaW4gUEtDUyAjNS83LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gdW5wYWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIENyeXB0b0pTLnBhZC5Qa2NzNy51bnBhZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZnJvbSBsYXN0IGJ5dGVcblx0ICAgICAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzWyhkYXRhLnNpZ0J5dGVzIC0gMSkgPj4+IDJdICYgMHhmZjtcblxuXHQgICAgICAgICAgICAvLyBSZW1vdmUgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5QYWRkaW5nQnl0ZXM7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdG8gdXNlLiBEZWZhdWx0OiBDQkNcblx0ICAgICAgICAgKiBAcHJvcGVydHkge1BhZGRpbmd9IHBhZGRpbmcgVGhlIHBhZGRpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBQa2NzN1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBtb2RlOiBDQkMsXG5cdCAgICAgICAgICAgIHBhZGRpbmc6IFBrY3M3XG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBjaXBoZXJcblx0ICAgICAgICAgICAgQ2lwaGVyLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblx0ICAgICAgICAgICAgdmFyIGl2ID0gY2ZnLml2O1xuXHQgICAgICAgICAgICB2YXIgbW9kZSA9IGNmZy5tb2RlO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGJsb2NrIG1vZGVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG1vZGVDcmVhdG9yID0gbW9kZS5jcmVhdGVFbmNyeXB0b3I7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZURlY3J5cHRvcjtcblx0ICAgICAgICAgICAgICAgIC8vIEtlZXAgYXQgbGVhc3Qgb25lIGJsb2NrIGluIHRoZSBidWZmZXIgZm9yIHVucGFkZGluZ1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbWluQnVmZmVyU2l6ZSA9IDE7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodGhpcy5fbW9kZSAmJiB0aGlzLl9tb2RlLl9fY3JlYXRvciA9PSBtb2RlQ3JlYXRvcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5pbml0KHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlQ3JlYXRvci5jYWxsKG1vZGUsIHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSB0aGlzLmNmZy5wYWRkaW5nO1xuXG5cdCAgICAgICAgICAgIC8vIEZpbmFsaXplXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fRU5DX1hGT1JNX01PREUpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFBhZCBkYXRhXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nLnBhZCh0aGlzLl9kYXRhLCB0aGlzLmJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBVbnBhZCBkYXRhXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nLnVucGFkKGZpbmFsUHJvY2Vzc2VkQmxvY2tzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2Nrcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxMjgvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY29sbGVjdGlvbiBvZiBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gY2lwaGVydGV4dCBUaGUgcmF3IGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkgdG8gdGhpcyBjaXBoZXJ0ZXh0LlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IHNhbHQgVGhlIHNhbHQgdXNlZCB3aXRoIGEga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge0NpcGhlcn0gYWxnb3JpdGhtIFRoZSBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1BhZGRpbmd9IHBhZGRpbmcgVGhlIHBhZGRpbmcgc2NoZW1lIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIuXG5cdCAgICAgKiBAcHJvcGVydHkge0Zvcm1hdH0gZm9ybWF0dGVyIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyUGFyYW1zID0gQ19saWIuQ2lwaGVyUGFyYW1zID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaXBoZXJQYXJhbXMgQW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmxpYi5DaXBoZXJQYXJhbXMuY3JlYXRlKHtcblx0ICAgICAgICAgKiAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBrZXk6IGtleVdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGl2OiBpdldvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIHNhbHQ6IHNhbHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBhbGdvcml0aG06IENyeXB0b0pTLmFsZ28uQUVTLFxuXHQgICAgICAgICAqICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXG5cdCAgICAgICAgICogICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUEtDUzcsXG5cdCAgICAgICAgICogICAgICAgICBibG9ja1NpemU6IDQsXG5cdCAgICAgICAgICogICAgICAgICBmb3JtYXR0ZXI6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMXG5cdCAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdGhpcy5taXhJbihjaXBoZXJQYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtGb3JtYXR9IGZvcm1hdHRlciAoT3B0aW9uYWwpIFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIGNpcGhlciBwYXJhbXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAdGhyb3dzIEVycm9yIElmIG5laXRoZXIgdGhlIGZvcm1hdHRlciBub3IgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGlzIHNldC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcyArICcnO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZm9ybWF0dGVyIHx8IHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRm9ybWF0IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZm9ybWF0ID0gQy5mb3JtYXQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuU1NMIGZvcm1hdHRpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBPcGVuU1NMRm9ybWF0dGVyID0gQ19mb3JtYXQuT3BlblNTTCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc30gY2lwaGVyUGFyYW1zIFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBvcGVuU1NMU3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wuc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGNpcGhlclBhcmFtcy5jaXBoZXJ0ZXh0O1xuXHQgICAgICAgICAgICB2YXIgc2FsdCA9IGNpcGhlclBhcmFtcy5zYWx0O1xuXG5cdCAgICAgICAgICAgIC8vIEZvcm1hdFxuXHQgICAgICAgICAgICBpZiAoc2FsdCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHdvcmRBcnJheSA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTM2MTZjNzQsIDB4NjU2NDVmNWZdKS5jb25jYXQoc2FsdCkuY29uY2F0KGNpcGhlcnRleHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIHdvcmRBcnJheSA9IGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gd29yZEFycmF5LnRvU3RyaW5nKEJhc2U2NCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVuU1NMU3RyIFRoZSBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5wYXJzZShvcGVuU1NMU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKG9wZW5TU0xTdHIpIHtcblx0ICAgICAgICAgICAgLy8gUGFyc2UgYmFzZTY0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gQmFzZTY0LnBhcnNlKG9wZW5TU0xTdHIpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0V29yZHMgPSBjaXBoZXJ0ZXh0LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFRlc3QgZm9yIHNhbHRcblx0ICAgICAgICAgICAgaWYgKGNpcGhlcnRleHRXb3Jkc1swXSA9PSAweDUzNjE2Yzc0ICYmIGNpcGhlcnRleHRXb3Jkc1sxXSA9PSAweDY1NjQ1ZjVmKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHNhbHRcblx0ICAgICAgICAgICAgICAgIHZhciBzYWx0ID0gV29yZEFycmF5LmNyZWF0ZShjaXBoZXJ0ZXh0V29yZHMuc2xpY2UoMiwgNCkpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc2FsdCBmcm9tIGNpcGhlcnRleHRcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHRXb3Jkcy5zcGxpY2UoMCwgNCk7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0LnNpZ0J5dGVzIC09IDE2O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoeyBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LCBzYWx0OiBzYWx0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBjaXBoZXIgd3JhcHBlciB0aGF0IHJldHVybnMgY2lwaGVydGV4dCBhcyBhIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAqL1xuXHQgICAgdmFyIFNlcmlhbGl6YWJsZUNpcGhlciA9IENfbGliLlNlcmlhbGl6YWJsZUNpcGhlciA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0Zvcm1hdHRlcn0gZm9ybWF0IFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIGNvbnZlcnQgY2lwaGVyIHBhcmFtIG9iamVjdHMgdG8gYW5kIGZyb20gYSBzdHJpbmcuIERlZmF1bHQ6IE9wZW5TU0xcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgZm9ybWF0OiBPcGVuU1NMRm9ybWF0dGVyXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBFbmNyeXB0cyBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXksIHsgaXY6IGl2IH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gRW5jcnlwdFxuXHQgICAgICAgICAgICB2YXIgZW5jcnlwdG9yID0gY2lwaGVyLmNyZWF0ZUVuY3J5cHRvcihrZXksIGNmZyk7XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gZW5jcnlwdG9yLmZpbmFsaXplKG1lc3NhZ2UpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJDZmcgPSBlbmNyeXB0b3IuY2ZnO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHtcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsXG5cdCAgICAgICAgICAgICAgICBrZXk6IGtleSxcblx0ICAgICAgICAgICAgICAgIGl2OiBjaXBoZXJDZmcuaXYsXG5cdCAgICAgICAgICAgICAgICBhbGdvcml0aG06IGNpcGhlcixcblx0ICAgICAgICAgICAgICAgIG1vZGU6IGNpcGhlckNmZy5tb2RlLFxuXHQgICAgICAgICAgICAgICAgcGFkZGluZzogY2lwaGVyQ2ZnLnBhZGRpbmcsXG5cdCAgICAgICAgICAgICAgICBibG9ja1NpemU6IGNpcGhlci5ibG9ja1NpemUsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGNmZy5mb3JtYXRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlY3J5cHRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBjaXBoZXJ0ZXh0UGFyYW1zLCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBDaXBoZXJQYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpO1xuXG5cdCAgICAgICAgICAgIC8vIERlY3J5cHRcblx0ICAgICAgICAgICAgdmFyIHBsYWludGV4dCA9IGNpcGhlci5jcmVhdGVEZWNyeXB0b3Ioa2V5LCBjZmcpLmZpbmFsaXplKGNpcGhlcnRleHQuY2lwaGVydGV4dCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHRvIENpcGhlclBhcmFtcyxcblx0ICAgICAgICAgKiBlbHNlIGFzc3VtZWQgQ2lwaGVyUGFyYW1zIGFscmVhZHkgYW5kIHJldHVybnMgY2lwaGVydGV4dCB1bmNoYW5nZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtGb3JtYXR0ZXJ9IGZvcm1hdCBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byB1c2UgdG8gcGFyc2Ugc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgdW5zZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5fcGFyc2UoY2lwaGVydGV4dFN0cmluZ09yUGFyYW1zLCBmb3JtYXQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9wYXJzZTogZnVuY3Rpb24gKGNpcGhlcnRleHQsIGZvcm1hdCkge1xuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNpcGhlcnRleHQgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQucGFyc2UoY2lwaGVydGV4dCwgdGhpcyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfa2RmID0gQy5rZGYgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuU1NMIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICovXG5cdCAgICB2YXIgT3BlblNTTEtkZiA9IENfa2RmLk9wZW5TU0wgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBhbmQgSVYgZnJvbSBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBkZXJpdmUgZnJvbS5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5U2l6ZSBUaGUgc2l6ZSBpbiB3b3JkcyBvZiB0aGUga2V5IHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpdlNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIElWIHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCAoT3B0aW9uYWwpIEEgNjQtYml0IHNhbHQgdG8gdXNlLiBJZiBvbWl0dGVkLCBhIHNhbHQgd2lsbCBiZSBnZW5lcmF0ZWQgcmFuZG9tbHkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3Qgd2l0aCB0aGUga2V5LCBJViwgYW5kIHNhbHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMik7XG5cdCAgICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMiwgJ3NhbHRzYWx0Jyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBrZXlTaXplLCBpdlNpemUsIHNhbHQpIHtcblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgcmFuZG9tIHNhbHRcblx0ICAgICAgICAgICAgaWYgKCFzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LnJhbmRvbSg2NC84KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIHZhciBrZXkgPSBFdnBLREYuY3JlYXRlKHsga2V5U2l6ZToga2V5U2l6ZSArIGl2U2l6ZSB9KS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblxuXHQgICAgICAgICAgICAvLyBTZXBhcmF0ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIHZhciBpdiA9IFdvcmRBcnJheS5jcmVhdGUoa2V5LndvcmRzLnNsaWNlKGtleVNpemUpLCBpdlNpemUgKiA0KTtcblx0ICAgICAgICAgICAga2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGtleToga2V5LCBpdjogaXYsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIHNlcmlhbGl6YWJsZSBjaXBoZXIgd3JhcHBlciB0aGF0IGRlcml2ZXMgdGhlIGtleSBmcm9tIGEgcGFzc3dvcmQsXG5cdCAgICAgKiBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGFzc3dvcmRCYXNlZENpcGhlciA9IENfbGliLlBhc3N3b3JkQmFzZWRDaXBoZXIgPSBTZXJpYWxpemFibGVDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0tERn0ga2RmIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgdG8gZ2VuZXJhdGUgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogU2VyaWFsaXphYmxlQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZGY6IE9wZW5TU0xLZGZcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnXG5cdCAgICAgICAgICAgIGNmZy5pdiA9IGRlcml2ZWRQYXJhbXMuaXY7XG5cblx0ICAgICAgICAgICAgLy8gRW5jcnlwdFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IFNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0LmNhbGwodGhpcywgY2lwaGVyLCBtZXNzYWdlLCBkZXJpdmVkUGFyYW1zLmtleSwgY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBNaXggaW4gZGVyaXZlZCBwYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dC5taXhJbihkZXJpdmVkUGFyYW1zKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHVzaW5nIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwbGFpbnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBjaXBoZXJ0ZXh0UGFyYW1zLCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwgcGFzc3dvcmQsIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplLCBjaXBoZXJ0ZXh0LnNhbHQpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBJViB0byBjb25maWdcblx0ICAgICAgICAgICAgY2ZnLml2ID0gZGVyaXZlZFBhcmFtcy5pdjtcblxuXHQgICAgICAgICAgICAvLyBEZWNyeXB0XG5cdCAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgY2lwaGVydGV4dCwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0fSgpKTtcblxuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js":
/*!***********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse {}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9jb3JlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvY29yZS5qcz8yMmVjIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRyb290LkNyeXB0b0pTID0gZmFjdG9yeSgpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuXHQvKipcblx0ICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0dmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgKGZ1bmN0aW9uIChNYXRoLCB1bmRlZmluZWQpIHtcblx0ICAgIC8qXG5cdCAgICAgKiBMb2NhbCBwb2x5ZmlsIG9mIE9iamVjdC5jcmVhdGVcblx0ICAgICAqL1xuXHQgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmdW5jdGlvbiBGKCkge307XG5cblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuXHQgICAgICAgICAgICB2YXIgc3VidHlwZTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG9iajtcblxuXHQgICAgICAgICAgICBzdWJ0eXBlID0gbmV3IEYoKTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSlcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcnlwdG9KUyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGlicmFyeSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2xpYiA9IEMubGliID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7XG5cblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTcGF3blxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YnR5cGUgPSBjcmVhdGUodGhpcyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEF1Z21lbnRcblx0ICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLm1peEluKG92ZXJyaWRlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyXG5cdCAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBzdXBlcnR5cGVcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpcztcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEV4dGVuZHMgdGhpcyBvYmplY3QgYW5kIHJ1bnMgdGhlIGluaXQgbWV0aG9kLlxuXHQgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgaW5zdGFuY2UgPSBNeVR5cGUuY3JlYXRlKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZXh0ZW5kKCk7XG5cdCAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi5cblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gbWl4IGluLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJ1xuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBtaXhJbjogZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlXG5cdCAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcgPSBwcm9wZXJ0aWVzLnRvU3RyaW5nO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBpbnN0YW5jZS5jbG9uZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICovXG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogNDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHdvcmQgYXJyYXkgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChlbmNvZGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uY2F0ZW5hdGVzIGEgd29yZCBhcnJheSB0byB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB0aGlzV29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRTaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB0aGlzLmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29uY2F0XG5cdCAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSBieXRlIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaSkgPj4+IDJdIHw9IHRoYXRCeXRlIDw8ICgyNCAtICgodGhpc1NpZ0J5dGVzICsgaSkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgd29yZCBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhhdFNpZ0J5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGkpID4+PiAyXSA9IHRoYXRXb3Jkc1tpID4+PiAyXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcFxuXHQgICAgICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSAoc2lnQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB3b3Jkcy5sZW5ndGggPSBNYXRoLmNlaWwoc2lnQnl0ZXMgLyA0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHJhbmRvbSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oMTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJhbmRvbTogZnVuY3Rpb24gKG5CeXRlcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblxuXHQgICAgICAgICAgICB2YXIgciA9IChmdW5jdGlvbiAobV93KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbV93ID0gbV93O1xuXHQgICAgICAgICAgICAgICAgdmFyIG1feiA9IDB4M2FkZTY4YjE7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFzayA9IDB4ZmZmZmZmZmY7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbV96ID0gKDB4OTA2OSAqIChtX3ogJiAweEZGRkYpICsgKG1feiA+PiAweDEwKSkgJiBtYXNrO1xuXHQgICAgICAgICAgICAgICAgICAgIG1fdyA9ICgweDQ2NTAgKiAobV93ICYgMHhGRkZGKSArIChtX3cgPj4gMHgxMCkpICYgbWFzaztcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gKChtX3ogPDwgMHgxMCkgKyBtX3cpICYgbWFzaztcblx0ICAgICAgICAgICAgICAgICAgICByZXN1bHQgLz0gMHgxMDAwMDAwMDA7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IDAuNTtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKE1hdGgucmFuZG9tKCkgPiAuNSA/IDEgOiAtMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCByY2FjaGU7IGkgPCBuQnl0ZXM7IGkgKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIF9yID0gcigocmNhY2hlIHx8IE1hdGgucmFuZG9tKCkpICogMHgxMDAwMDAwMDApO1xuXG5cdCAgICAgICAgICAgICAgICByY2FjaGUgPSBfcigpICogMHgzYWRlNjdiNztcblx0ICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goKF9yKCkgKiAweDEwMDAwMDAwMCkgfCAwKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIG5CeXRlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRW5jb2RlciBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlICYgMHgwZikudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBoZXhDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShoZXhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaGV4U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGV4U3RyTGVuZ3RoOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExhdGluMSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGxhdGluMUNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGluMVN0ciBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMVN0ckxlbmd0aCA9IGxhdGluMVN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgKDI0IC0gKGkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmOC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjhTdHIgVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGUgcHJvcGVydHkgYmxvY2tTaXplIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfbWluQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBrZXB0IHVucHJvY2Vzc2VkIGluIHRoZSBidWZmZXIuIERlZmF1bHQ6IDBcblx0ICAgICAqL1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGRhdGEgYnVmZmVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBXb3JkQXJyYXkuaW5pdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBfZG9Qcm9jZXNzQmxvY2sob2Zmc2V0KSwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvRmx1c2ggV2hldGhlciBhbGwgYmxvY2tzIGFuZCBwYXJ0aWFsIGJsb2NrcyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcygpO1xuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcHJvY2VzczogZnVuY3Rpb24gKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gdGhpcy5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQmxvY2tzUmVhZHkgPSBkYXRhU2lnQnl0ZXMgLyBibG9ja1NpemVCeXRlcztcblx0ICAgICAgICAgICAgaWYgKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIHVwIHRvIGluY2x1ZGUgcGFydGlhbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgZG93biB0byBpbmNsdWRlIG9ubHkgZnVsbCBibG9ja3MsXG5cdCAgICAgICAgICAgICAgICAvLyBsZXNzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGJ1ZmZlclxuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5tYXgoKG5CbG9ja3NSZWFkeSB8IDApIC0gdGhpcy5fbWluQnVmZmVyU2l6ZSwgMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb3VudCB3b3JkcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbldvcmRzUmVhZHkgPSBuQmxvY2tzUmVhZHkgKiBibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYnl0ZXMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CeXRlc1JlYWR5ID0gTWF0aC5taW4obldvcmRzUmVhZHkgKiA0LCBkYXRhU2lnQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2tzXG5cdCAgICAgICAgICAgIGlmIChuV29yZHNSZWFkeSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbldvcmRzUmVhZHk7IG9mZnNldCArPSBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWFsZ29yaXRobSBsb2dpY1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGRhdGFXb3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7XG5cdCAgICAgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5CeXRlc1JlYWR5O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21pbkJ1ZmZlclNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgaGFzaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2hcblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgbWVzc2FnZSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDUxMi8zMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byBhIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UgaW4gdGhpcyBITUFDIGhlbHBlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ19hbGdvLkhNQUMuaW5pdChoYXNoZXIsIGtleSkuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9O1xuXG5cdCAgICByZXR1cm4gQztcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js":
/*!*****************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64 encoding strategy.\n\t */\n\t var Base64 = C_enc.Base64 = {\n\t /**\n\t * Converts a word array to a Base64 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Base64 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64 string to a word array.\n\t *\n\t * @param {string} base64Str The Base64 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t */\n\t parse: function (base64Str) {\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9lbmMtYmFzZTY0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvZW5jLWJhc2U2NC5qcz9hNjc5Il0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEJhc2U2NCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBiYXNlNjRTdHJpbmcgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAgd29yZEFycmF5LmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgYmFzZTY0Q2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAzKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTEgPSAod29yZHNbaSA+Pj4gMl0gICAgICAgPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgICAgICAgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gKHdvcmRzWyhpICsgMSkgPj4+IDJdID4+PiAoMjQgLSAoKGkgKyAxKSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMyA9ICh3b3Jkc1soaSArIDIpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMikgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0cmlwbGV0ID0gKGJ5dGUxIDw8IDE2KSB8IChieXRlMiA8PCA4KSB8IGJ5dGUzO1xuXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiAwLjc1IDwgc2lnQnl0ZXMpOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKG1hcC5jaGFyQXQoKHRyaXBsZXQgPj4+ICg2ICogKDMgLSBqKSkpICYgMHgzZikpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7XG5cdCAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhcikge1xuXHQgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2U2NENoYXJzLmxlbmd0aCAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKHBhZGRpbmdDaGFyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRTdHIgVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShiYXNlNjRTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoYmFzZTY0U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgYmFzZTY0U3RyTGVuZ3RoID0gYmFzZTY0U3RyLmxlbmd0aDtcblx0ICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblx0ICAgICAgICAgICAgdmFyIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwO1xuXG5cdCAgICAgICAgICAgIGlmICghcmV2ZXJzZU1hcCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXAubGVuZ3RoOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZU1hcFttYXAuY2hhckNvZGVBdChqKV0gPSBqO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIElnbm9yZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpO1xuXHQgICAgICAgICAgICBpZiAocGFkZGluZ0NoYXIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBiYXNlNjRTdHIuaW5kZXhPZihwYWRkaW5nQ2hhcik7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFkZGluZ0luZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJhc2U2NFN0ckxlbmd0aCA9IHBhZGRpbmdJbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgcmV0dXJuIHBhcnNlTG9vcChiYXNlNjRTdHIsIGJhc2U2NFN0ckxlbmd0aCwgcmV2ZXJzZU1hcCk7XG5cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21hcDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89J1xuXHQgICAgfTtcblxuXHQgICAgZnVuY3Rpb24gcGFyc2VMb29wKGJhc2U2NFN0ciwgYmFzZTY0U3RyTGVuZ3RoLCByZXZlcnNlTWFwKSB7XG5cdCAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICB2YXIgbkJ5dGVzID0gMDtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlNjRTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgJSA0KSB7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMxID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpIC0gMSldIDw8ICgoaSAlIDQpICogMik7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMyID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV0gPj4+ICg2IC0gKGkgJSA0KSAqIDIpO1xuXHQgICAgICAgICAgICAgIHdvcmRzW25CeXRlcyA+Pj4gMl0gfD0gKGJpdHMxIHwgYml0czIpIDw8ICgyNCAtIChuQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgIG5CeXRlcysrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCBuQnl0ZXMpO1xuXHQgICAgfVxuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLmVuYy5CYXNlNjQ7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-utf16.js":
/*!****************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-utf16.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * UTF-16 BE encoding strategy.\n\t */\n\t var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t /**\n\t * Converts a word array to a UTF-16 BE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 BE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 BE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 BE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t /**\n\t * UTF-16 LE encoding strategy.\n\t */\n\t C_enc.Utf16LE = {\n\t /**\n\t * Converts a word array to a UTF-16 LE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 LE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 LE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 LE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t function swapEndian(word) {\n\t return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Utf16;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9lbmMtdXRmMTYuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9lbmMtdXRmMTYuanM/NjBjYyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBVVEYtMTYgQkUgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBVdGYxNkJFID0gQ19lbmMuVXRmMTYgPSBDX2VuYy5VdGYxNkJFID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIFVURi0xNiBCRSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTE2IEJFIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjE2U3RyaW5nID0gQ3J5cHRvSlMuZW5jLlV0ZjE2LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgxNiAtIChpICUgNCkgKiA4KSkgJiAweGZmZmY7XG5cdCAgICAgICAgICAgICAgICB1dGYxNkNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi0xNiBCRSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgQkUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNi5wYXJzZSh1dGYxNlN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGYxNlN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZTdHJMZW5ndGggPSB1dGYxNlN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1dGYxNlN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAxXSB8PSB1dGYxNlN0ci5jaGFyQ29kZUF0KGkpIDw8ICgxNiAtIChpICUgMikgKiAxNik7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgdXRmMTZTdHJMZW5ndGggKiAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi0xNiBMRSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgQ19lbmMuVXRmMTZMRSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtMTYgTEUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi0xNiBMRSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB1dGYxNlN0ciA9IENyeXB0b0pTLmVuYy5VdGYxNkxFLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBzd2FwRW5kaWFuKCh3b3Jkc1tpID4+PiAyXSA+Pj4gKDE2IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmZmZik7XG5cdCAgICAgICAgICAgICAgICB1dGYxNkNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi0xNiBMRSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgTEUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNkxFLnBhcnNlKHV0ZjE2U3RyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjE2U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciB1dGYxNlN0ckxlbmd0aCA9IHV0ZjE2U3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHV0ZjE2U3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDFdIHw9IHN3YXBFbmRpYW4odXRmMTZTdHIuY2hhckNvZGVBdChpKSA8PCAoMTYgLSAoaSAlIDIpICogMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCB1dGYxNlN0ckxlbmd0aCAqIDIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIGZ1bmN0aW9uIHN3YXBFbmRpYW4od29yZCkge1xuXHQgICAgICAgIHJldHVybiAoKHdvcmQgPDwgOCkgJiAweGZmMDBmZjAwKSB8ICgod29yZCA+Pj4gOCkgJiAweDAwZmYwMGZmKTtcblx0ICAgIH1cblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuVXRmMTY7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-utf16.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./sha1 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js\"), __webpack_require__(/*! ./hmac */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t var block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9ldnBrZGYuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9ldnBrZGYuanM/NTkxNyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMVwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGExXCIsIFwiLi9obWFjXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoaXMga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaXMgbWVhbnQgdG8gY29uZm9ybSB3aXRoIEVWUF9CeXRlc1RvS2V5LlxuXHQgICAgICogd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWxcblx0ICAgICAqL1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREYgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhlIGtleSBzaXplIGluIHdvcmRzIHRvIGdlbmVyYXRlLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuIERlZmF1bHQ6IE1ENVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGtleVNpemU6IDEyOC8zMixcblx0ICAgICAgICAgICAgaGFzaGVyOiBNRDUsXG5cdCAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDFcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGRlcml2YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblxuXHQgICAgICAgICAgICAvLyBJbml0IGhhc2hlclxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gY2ZnLmhhc2hlci5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZEtleSA9IFdvcmRBcnJheS5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXlXb3JkcyA9IGRlcml2ZWRLZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0gY2ZnLmtleVNpemU7XG5cdCAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5XG5cdCAgICAgICAgICAgIHdoaWxlIChkZXJpdmVkS2V5V29yZHMubGVuZ3RoIDwga2V5U2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShibG9jayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBoYXNoZXIudXBkYXRlKHBhc3N3b3JkKS5maW5hbGl6ZShzYWx0KTtcblx0ICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb25zXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLmZpbmFsaXplKGJsb2NrKTtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlcml2ZWRLZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDtcblxuXHQgICAgICAgICAgICByZXR1cm4gZGVyaXZlZEtleTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgKi9cblx0ICAgIEMuRXZwS0RGID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHtcblx0ICAgICAgICByZXR1cm4gRXZwS0RGLmNyZWF0ZShjZmcpLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgfTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5FdnBLREY7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/format-hex.js":
/*!*****************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/format-hex.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var CipherParams = C_lib.CipherParams;\n\t var C_enc = C.enc;\n\t var Hex = C_enc.Hex;\n\t var C_format = C.format;\n\n\t var HexFormatter = C_format.Hex = {\n\t /**\n\t * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The hexadecimally encoded string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t return cipherParams.ciphertext.toString(Hex);\n\t },\n\n\t /**\n\t * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t *\n\t * @param {string} input The hexadecimally encoded string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t */\n\t parse: function (input) {\n\t var ciphertext = Hex.parse(input);\n\t return CipherParams.create({ ciphertext: ciphertext });\n\t }\n\t };\n\t}());\n\n\n\treturn CryptoJS.format.Hex;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9mb3JtYXQtaGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvZm9ybWF0LWhleC5qcz9lYTVlIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIENpcGhlclBhcmFtcyA9IENfbGliLkNpcGhlclBhcmFtcztcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXHQgICAgdmFyIEhleCA9IENfZW5jLkhleDtcblx0ICAgIHZhciBDX2Zvcm1hdCA9IEMuZm9ybWF0O1xuXG5cdCAgICB2YXIgSGV4Rm9ybWF0dGVyID0gQ19mb3JtYXQuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoZSBjaXBoZXJ0ZXh0IG9mIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN9IGNpcGhlclBhcmFtcyBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0LkhleC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGNpcGhlclBhcmFtcy5jaXBoZXJ0ZXh0LnRvU3RyaW5nKEhleCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgaGV4YWRlY2ltYWxseSBlbmNvZGVkIGNpcGhlcnRleHQgc3RyaW5nIHRvIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgVGhlIGhleGFkZWNpbWFsbHkgZW5jb2RlZCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5IZXgucGFyc2UoaGV4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGlucHV0KSB7XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gSGV4LnBhcnNlKGlucHV0KTtcblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoeyBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuZm9ybWF0LkhleDtcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/format-hex.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js":
/*!***********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9obWFjLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvaG1hYy5qcz9kZmIxIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEhNQUMgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBITUFDLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaG1hY0hhc2hlciA9IENyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5TSEEyNTYsIGtleSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGhhc2hlciwga2V5KSB7XG5cdCAgICAgICAgICAgIC8vIEluaXQgaGFzaGVyXG5cdCAgICAgICAgICAgIGhhc2hlciA9IHRoaXMuX2hhc2hlciA9IG5ldyBoYXNoZXIuaW5pdCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGtleSA9IFV0ZjgucGFyc2Uoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgaGFzaGVyQmxvY2tTaXplID0gaGFzaGVyLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZUJ5dGVzID0gaGFzaGVyQmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBBbGxvdyBhcmJpdHJhcnkgbGVuZ3RoIGtleXNcblx0ICAgICAgICAgICAgaWYgKGtleS5zaWdCeXRlcyA+IGhhc2hlckJsb2NrU2l6ZUJ5dGVzKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBoYXNoZXIuZmluYWxpemUoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIGtleS5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENsb25lIGtleSBmb3IgaW5uZXIgYW5kIG91dGVyIHBhZHNcblx0ICAgICAgICAgICAgdmFyIG9LZXkgPSB0aGlzLl9vS2V5ID0ga2V5LmNsb25lKCk7XG5cdCAgICAgICAgICAgIHZhciBpS2V5ID0gdGhpcy5faUtleSA9IGtleS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgb0tleVdvcmRzID0gb0tleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGlLZXlXb3JkcyA9IGlLZXkud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gWE9SIGtleXMgd2l0aCBwYWQgY29uc3RhbnRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVyQmxvY2tTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIG9LZXlXb3Jkc1tpXSBePSAweDVjNWM1YzVjO1xuXHQgICAgICAgICAgICAgICAgaUtleVdvcmRzW2ldIF49IDB4MzYzNjM2MzY7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgb0tleS5zaWdCeXRlcyA9IGlLZXkuc2lnQnl0ZXMgPSBoYXNoZXJCbG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBITUFDIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjtcblxuXHQgICAgICAgICAgICAvLyBSZXNldFxuXHQgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZSh0aGlzLl9pS2V5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVXBkYXRlcyB0aGlzIEhNQUMgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SE1BQ30gVGhpcyBITUFDIGluc3RhbmNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaGVyLnVwZGF0ZShtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgSE1BQyBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSB0aGlzLl9oYXNoZXI7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBITUFDXG5cdCAgICAgICAgICAgIHZhciBpbm5lckhhc2ggPSBoYXNoZXIuZmluYWxpemUobWVzc2FnZVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICB2YXIgaG1hYyA9IGhhc2hlci5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGlubmVySGFzaCkpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBobWFjO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/index.js":
/*!************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/index.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./x64-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js\"), __webpack_require__(/*! ./lib-typedarrays */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/lib-typedarrays.js\"), __webpack_require__(/*! ./enc-utf16 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-utf16.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./sha1 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js\"), __webpack_require__(/*! ./sha256 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha256.js\"), __webpack_require__(/*! ./sha224 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha224.js\"), __webpack_require__(/*! ./sha512 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha512.js\"), __webpack_require__(/*! ./sha384 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha384.js\"), __webpack_require__(/*! ./sha3 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha3.js\"), __webpack_require__(/*! ./ripemd160 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/ripemd160.js\"), __webpack_require__(/*! ./hmac */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js\"), __webpack_require__(/*! ./pbkdf2 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pbkdf2.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"), __webpack_require__(/*! ./mode-cfb */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-cfb.js\"), __webpack_require__(/*! ./mode-ctr */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr.js\"), __webpack_require__(/*! ./mode-ctr-gladman */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr-gladman.js\"), __webpack_require__(/*! ./mode-ofb */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ofb.js\"), __webpack_require__(/*! ./mode-ecb */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ecb.js\"), __webpack_require__(/*! ./pad-ansix923 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-ansix923.js\"), __webpack_require__(/*! ./pad-iso10126 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso10126.js\"), __webpack_require__(/*! ./pad-iso97971 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso97971.js\"), __webpack_require__(/*! ./pad-zeropadding */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-zeropadding.js\"), __webpack_require__(/*! ./pad-nopadding */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-nopadding.js\"), __webpack_require__(/*! ./format-hex */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/format-hex.js\"), __webpack_require__(/*! ./aes */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/aes.js\"), __webpack_require__(/*! ./tripledes */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/tripledes.js\"), __webpack_require__(/*! ./rc4 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/rc4.js\"), __webpack_require__(/*! ./rabbit */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit.js\"), __webpack_require__(/*! ./rabbit-legacy */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit-legacy.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL2luZGV4LmpzPzdlZWIiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL3g2NC1jb3JlXCIpLCByZXF1aXJlKFwiLi9saWItdHlwZWRhcnJheXNcIiksIHJlcXVpcmUoXCIuL2VuYy11dGYxNlwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9zaGExXCIpLCByZXF1aXJlKFwiLi9zaGEyNTZcIiksIHJlcXVpcmUoXCIuL3NoYTIyNFwiKSwgcmVxdWlyZShcIi4vc2hhNTEyXCIpLCByZXF1aXJlKFwiLi9zaGEzODRcIiksIHJlcXVpcmUoXCIuL3NoYTNcIiksIHJlcXVpcmUoXCIuL3JpcGVtZDE2MFwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSwgcmVxdWlyZShcIi4vcGJrZGYyXCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpLCByZXF1aXJlKFwiLi9tb2RlLWNmYlwiKSwgcmVxdWlyZShcIi4vbW9kZS1jdHJcIiksIHJlcXVpcmUoXCIuL21vZGUtY3RyLWdsYWRtYW5cIiksIHJlcXVpcmUoXCIuL21vZGUtb2ZiXCIpLCByZXF1aXJlKFwiLi9tb2RlLWVjYlwiKSwgcmVxdWlyZShcIi4vcGFkLWFuc2l4OTIzXCIpLCByZXF1aXJlKFwiLi9wYWQtaXNvMTAxMjZcIiksIHJlcXVpcmUoXCIuL3BhZC1pc285Nzk3MVwiKSwgcmVxdWlyZShcIi4vcGFkLXplcm9wYWRkaW5nXCIpLCByZXF1aXJlKFwiLi9wYWQtbm9wYWRkaW5nXCIpLCByZXF1aXJlKFwiLi9mb3JtYXQtaGV4XCIpLCByZXF1aXJlKFwiLi9hZXNcIiksIHJlcXVpcmUoXCIuL3RyaXBsZWRlc1wiKSwgcmVxdWlyZShcIi4vcmM0XCIpLCByZXF1aXJlKFwiLi9yYWJiaXRcIiksIHJlcXVpcmUoXCIuL3JhYmJpdC1sZWdhY3lcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4veDY0LWNvcmVcIiwgXCIuL2xpYi10eXBlZGFycmF5c1wiLCBcIi4vZW5jLXV0ZjE2XCIsIFwiLi9lbmMtYmFzZTY0XCIsIFwiLi9tZDVcIiwgXCIuL3NoYTFcIiwgXCIuL3NoYTI1NlwiLCBcIi4vc2hhMjI0XCIsIFwiLi9zaGE1MTJcIiwgXCIuL3NoYTM4NFwiLCBcIi4vc2hhM1wiLCBcIi4vcmlwZW1kMTYwXCIsIFwiLi9obWFjXCIsIFwiLi9wYmtkZjJcIiwgXCIuL2V2cGtkZlwiLCBcIi4vY2lwaGVyLWNvcmVcIiwgXCIuL21vZGUtY2ZiXCIsIFwiLi9tb2RlLWN0clwiLCBcIi4vbW9kZS1jdHItZ2xhZG1hblwiLCBcIi4vbW9kZS1vZmJcIiwgXCIuL21vZGUtZWNiXCIsIFwiLi9wYWQtYW5zaXg5MjNcIiwgXCIuL3BhZC1pc28xMDEyNlwiLCBcIi4vcGFkLWlzbzk3OTcxXCIsIFwiLi9wYWQtemVyb3BhZGRpbmdcIiwgXCIuL3BhZC1ub3BhZGRpbmdcIiwgXCIuL2Zvcm1hdC1oZXhcIiwgXCIuL2Flc1wiLCBcIi4vdHJpcGxlZGVzXCIsIFwiLi9yYzRcIiwgXCIuL3JhYmJpdFwiLCBcIi4vcmFiYml0LWxlZ2FjeVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdHJvb3QuQ3J5cHRvSlMgPSBmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdHJldHVybiBDcnlwdG9KUztcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/index.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/lib-typedarrays.js":
/*!**********************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/lib-typedarrays.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Check if typed arrays are supported\n\t if (typeof ArrayBuffer != 'function') {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\n\t // Reference original init\n\t var superInit = WordArray.init;\n\n\t // Augment WordArray.init to handle typed arrays\n\t var subInit = WordArray.init = function (typedArray) {\n\t // Convert buffers to uint8\n\t if (typedArray instanceof ArrayBuffer) {\n\t typedArray = new Uint8Array(typedArray);\n\t }\n\n\t // Convert other array views to uint8\n\t if (\n\t typedArray instanceof Int8Array ||\n\t (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t typedArray instanceof Int16Array ||\n\t typedArray instanceof Uint16Array ||\n\t typedArray instanceof Int32Array ||\n\t typedArray instanceof Uint32Array ||\n\t typedArray instanceof Float32Array ||\n\t typedArray instanceof Float64Array\n\t ) {\n\t typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t }\n\n\t // Handle Uint8Array\n\t if (typedArray instanceof Uint8Array) {\n\t // Shortcut\n\t var typedArrayByteLength = typedArray.byteLength;\n\n\t // Extract bytes\n\t var words = [];\n\t for (var i = 0; i < typedArrayByteLength; i++) {\n\t words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t }\n\n\t // Initialize this word array\n\t superInit.call(this, words, typedArrayByteLength);\n\t } else {\n\t // Else call normal init\n\t superInit.apply(this, arguments);\n\t }\n\t };\n\n\t subInit.prototype = WordArray;\n\t}());\n\n\n\treturn CryptoJS.lib.WordArray;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9saWItdHlwZWRhcnJheXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9saWItdHlwZWRhcnJheXMuanM/NGE3NiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBDaGVjayBpZiB0eXBlZCBhcnJheXMgYXJlIHN1cHBvcnRlZFxuXHQgICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cblx0ICAgIC8vIFJlZmVyZW5jZSBvcmlnaW5hbCBpbml0XG5cdCAgICB2YXIgc3VwZXJJbml0ID0gV29yZEFycmF5LmluaXQ7XG5cblx0ICAgIC8vIEF1Z21lbnQgV29yZEFycmF5LmluaXQgdG8gaGFuZGxlIHR5cGVkIGFycmF5c1xuXHQgICAgdmFyIHN1YkluaXQgPSBXb3JkQXJyYXkuaW5pdCA9IGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdCAgICAgICAgLy8gQ29udmVydCBidWZmZXJzIHRvIHVpbnQ4XG5cdCAgICAgICAgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuXHQgICAgICAgICAgICB0eXBlZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodHlwZWRBcnJheSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gQ29udmVydCBvdGhlciBhcnJheSB2aWV3cyB0byB1aW50OFxuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuXHQgICAgICAgICAgICAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkgfHxcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fFxuXHQgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXlcblx0ICAgICAgICApIHtcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KHR5cGVkQXJyYXkuYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkuYnl0ZUxlbmd0aCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gSGFuZGxlIFVpbnQ4QXJyYXlcblx0ICAgICAgICBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIHR5cGVkQXJyYXlCeXRlTGVuZ3RoID0gdHlwZWRBcnJheS5ieXRlTGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIEV4dHJhY3QgYnl0ZXNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZWRBcnJheUJ5dGVMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gdHlwZWRBcnJheVtpXSA8PCAoMjQgLSAoaSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoaXMgd29yZCBhcnJheVxuXHQgICAgICAgICAgICBzdXBlckluaXQuY2FsbCh0aGlzLCB3b3JkcywgdHlwZWRBcnJheUJ5dGVMZW5ndGgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vIEVsc2UgY2FsbCBub3JtYWwgaW5pdFxuXHQgICAgICAgICAgICBzdXBlckluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBzdWJJbml0LnByb3RvdHlwZSA9IFdvcmRBcnJheTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5saWIuV29yZEFycmF5O1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/lib-typedarrays.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js":
/*!**********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var T = [];\n\n\t // Compute constants\n\t (function () {\n\t for (var i = 0; i < 64; i++) {\n\t T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t }\n\t }());\n\n\t /**\n\t * MD5 hash algorithm.\n\t */\n\t var MD5 = C_algo.MD5 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var M_offset_0 = M[offset + 0];\n\t var M_offset_1 = M[offset + 1];\n\t var M_offset_2 = M[offset + 2];\n\t var M_offset_3 = M[offset + 3];\n\t var M_offset_4 = M[offset + 4];\n\t var M_offset_5 = M[offset + 5];\n\t var M_offset_6 = M[offset + 6];\n\t var M_offset_7 = M[offset + 7];\n\t var M_offset_8 = M[offset + 8];\n\t var M_offset_9 = M[offset + 9];\n\t var M_offset_10 = M[offset + 10];\n\t var M_offset_11 = M[offset + 11];\n\t var M_offset_12 = M[offset + 12];\n\t var M_offset_13 = M[offset + 13];\n\t var M_offset_14 = M[offset + 14];\n\t var M_offset_15 = M[offset + 15];\n\n\t // Working varialbes\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\n\t // Computation\n\t a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n\t d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n\t c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n\t b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n\t a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n\t d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n\t c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n\t b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n\t a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n\t d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n\t c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n\t d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n\t d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n\t c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n\t a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n\t d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n\t c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n\t a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n\t d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n\t c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n\t b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n\t a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n\t d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n\t c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n\t b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n\t d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n\t c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n\t d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n\t c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n\t b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n\t d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n\t c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n\t b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n\t a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n\t d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n\t a = II(a, b, c, d, M_offset_0, 6, T[48]);\n\t d = II(d, a, b, c, M_offset_7, 10, T[49]);\n\t c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t b = II(b, c, d, a, M_offset_5, 21, T[51]);\n\t a = II(a, b, c, d, M_offset_12, 6, T[52]);\n\t d = II(d, a, b, c, M_offset_3, 10, T[53]);\n\t c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t b = II(b, c, d, a, M_offset_1, 21, T[55]);\n\t a = II(a, b, c, d, M_offset_8, 6, T[56]);\n\t d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t c = II(c, d, a, b, M_offset_6, 15, T[58]);\n\t b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t a = II(a, b, c, d, M_offset_4, 6, T[60]);\n\t d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t c = II(c, d, a, b, M_offset_2, 15, T[62]);\n\t b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t var nBitsTotalL = nBitsTotal;\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n\t );\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n\t );\n\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t function FF(a, b, c, d, x, s, t) {\n\t var n = a + ((b & c) | (~b & d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function GG(a, b, c, d, x, s, t) {\n\t var n = a + ((b & d) | (c & ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function HH(a, b, c, d, x, s, t) {\n\t var n = a + (b ^ c ^ d) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function II(a, b, c, d, x, s, t) {\n\t var n = a + (c ^ (b | ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.MD5('message');\n\t * var hash = CryptoJS.MD5(wordArray);\n\t */\n\t C.MD5 = Hasher._createHelper(MD5);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacMD5(message, key);\n\t */\n\t C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tZDUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tZDUuanM/MjdhNiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoTWF0aCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIENvbnN0YW50cyB0YWJsZVxuXHQgICAgdmFyIFQgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBjb25zdGFudHNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG5cdCAgICAgICAgICAgIFRbaV0gPSAoTWF0aC5hYnMoTWF0aC5zaW4oaSArIDEpKSAqIDB4MTAwMDAwMDAwKSB8IDA7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBNRDUgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1ID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NlxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X2kgPSBvZmZzZXQgKyBpO1xuXHQgICAgICAgICAgICAgICAgdmFyIE1fb2Zmc2V0X2kgPSBNW29mZnNldF9pXTtcblxuXHQgICAgICAgICAgICAgICAgTVtvZmZzZXRfaV0gPSAoXG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCA4KSAgfCAoTV9vZmZzZXRfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8wICA9IE1bb2Zmc2V0ICsgMF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xICA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8yICA9IE1bb2Zmc2V0ICsgMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8zICA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF80ICA9IE1bb2Zmc2V0ICsgNF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF81ICA9IE1bb2Zmc2V0ICsgNV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF82ICA9IE1bb2Zmc2V0ICsgNl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF83ICA9IE1bb2Zmc2V0ICsgN107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF84ICA9IE1bb2Zmc2V0ICsgOF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF85ICA9IE1bb2Zmc2V0ICsgOV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMCA9IE1bb2Zmc2V0ICsgMTBdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTEgPSBNW29mZnNldCArIDExXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEyID0gTVtvZmZzZXQgKyAxMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMyA9IE1bb2Zmc2V0ICsgMTNdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTQgPSBNW29mZnNldCArIDE0XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE1ID0gTVtvZmZzZXQgKyAxNV07XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWxiZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF8wLCAgNywgIFRbMF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMSwgIDEyLCBUWzFdKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzIsICAxNywgVFsyXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8zLCAgMjIsIFRbM10pO1xuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDcsICBUWzRdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzUsICAxMiwgVFs1XSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF82LCAgMTcsIFRbNl0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfNywgIDIyLCBUWzddKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzgsICA3LCAgVFs4XSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF85LCAgMTIsIFRbOV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE3LCBUWzEwXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8xMSwgMjIsIFRbMTFdKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA3LCAgVFsxMl0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTMsIDEyLCBUWzEzXSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTcsIFRbMTRdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzE1LCAyMiwgVFsxNV0pO1xuXG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNSwgIFRbMTZdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzYsICA5LCAgVFsxN10pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMTEsIDE0LCBUWzE4XSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8wLCAgMjAsIFRbMTldKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA1LCAgVFsyMF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMTAsIDksICBUWzIxXSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTQsIFRbMjJdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzQsICAyMCwgVFsyM10pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDUsICBUWzI0XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xNCwgOSwgIFRbMjVdKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzMsICAxNCwgVFsyNl0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfOCwgIDIwLCBUWzI3XSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNSwgIFRbMjhdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzIsICA5LCAgVFsyOV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE0LCBUWzMwXSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8xMiwgMjAsIFRbMzFdKTtcblxuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfNSwgIDQsICBUWzMyXSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF84LCAgMTEsIFRbMzNdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNiwgVFszNF0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTQsIDIzLCBUWzM1XSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNCwgIFRbMzZdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzQsICAxMSwgVFszN10pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE2LCBUWzM4XSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xMCwgMjMsIFRbMzldKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEzLCA0LCAgVFs0MF0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMCwgIDExLCBUWzQxXSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTYsIFRbNDJdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzYsICAyMywgVFs0M10pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDQsICBUWzQ0XSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8xMiwgMTEsIFRbNDVdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE1LCAxNiwgVFs0Nl0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMiwgIDIzLCBUWzQ3XSk7XG5cblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsICA2LCAgVFs0OF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfNywgIDEwLCBUWzQ5XSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTUsIFRbNTBdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzUsICAyMSwgVFs1MV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDYsICBUWzUyXSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8zLCAgMTAsIFRbNTNdKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNSwgVFs1NF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMSwgIDIxLCBUWzU1XSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNiwgIFRbNTZdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE1LCAxMCwgVFs1N10pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE1LCBUWzU4XSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xMywgMjEsIFRbNTldKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsICA2LCAgVFs2MF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTEsIDEwLCBUWzYxXSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTUsIFRbNjJdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzksICAyMSwgVFs2M10pO1xuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsSCA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWxMID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCA4KSAgfCAobkJpdHNUb3RhbEggPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCAyNCkgfCAobkJpdHNUb3RhbEggPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IChcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDgpICB8IChuQml0c1RvdGFsTCA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDI0KSB8IChuQml0c1RvdGFsTCA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICk7XG5cblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IChkYXRhV29yZHMubGVuZ3RoICsgMSkgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoO1xuXHQgICAgICAgICAgICB2YXIgSCA9IGhhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgICAgICB2YXIgSF9pID0gSFtpXTtcblxuXHQgICAgICAgICAgICAgICAgSFtpXSA9ICgoKEhfaSA8PCA4KSAgfCAoSF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICAgICgoKEhfaSA8PCAyNCkgfCAoSF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGMpIHwgKH5iICYgZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGQpIHwgKGMgJiB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChiIF4gYyBeIGQpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChjIF4gKGIgfCB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLk1ENSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuTUQ1KHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuTUQ1ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoTUQ1KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNNRDUobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjTUQ1ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKE1ENSk7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLk1ENTtcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-cfb.js":
/*!***************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-cfb.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t CFB.Encryptor = CFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t CFB.Decryptor = CFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Generate keystream\n\t if (iv) {\n\t var keystream = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t var keystream = this._prevBlock;\n\t }\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\n\t return CFB;\n\t}());\n\n\n\treturn CryptoJS.mode.CFB;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tb2RlLWNmYi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL21vZGUtY2ZiLmpzPzFjNTkiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogQ2lwaGVyIEZlZWRiYWNrIGJsb2NrIG1vZGUuXG5cdCAqL1xuXHRDcnlwdG9KUy5tb2RlLkNGQiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgQ0ZCID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgQ0ZCLkVuY3J5cHRvciA9IENGQi5leHRlbmQoe1xuXHQgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgIGdlbmVyYXRlS2V5c3RyZWFtQW5kRW5jcnlwdC5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSwgY2lwaGVyKTtcblxuXHQgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2tcblx0ICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICBDRkIuRGVjcnlwdG9yID0gQ0ZCLmV4dGVuZCh7XG5cdCAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgIHZhciB0aGlzQmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgZ2VuZXJhdGVLZXlzdHJlYW1BbmRFbmNyeXB0LmNhbGwodGhpcywgd29yZHMsIG9mZnNldCwgYmxvY2tTaXplLCBjaXBoZXIpO1xuXG5cdCAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2tcblx0ICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gdGhpc0Jsb2NrO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICBmdW5jdGlvbiBnZW5lcmF0ZUtleXN0cmVhbUFuZEVuY3J5cHQod29yZHMsIG9mZnNldCwgYmxvY2tTaXplLCBjaXBoZXIpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgIHZhciBpdiA9IHRoaXMuX2l2O1xuXG5cdCAgICAgICAgLy8gR2VuZXJhdGUga2V5c3RyZWFtXG5cdCAgICAgICAgaWYgKGl2KSB7XG5cdCAgICAgICAgICAgIHZhciBrZXlzdHJlYW0gPSBpdi5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICAvLyBSZW1vdmUgSVYgZm9yIHN1YnNlcXVlbnQgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBrZXlzdHJlYW0gPSB0aGlzLl9wcmV2QmxvY2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNpcGhlci5lbmNyeXB0QmxvY2soa2V5c3RyZWFtLCAwKTtcblxuXHQgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGtleXN0cmVhbVtpXTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBDRkI7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMubW9kZS5DRkI7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-cfb.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr-gladman.js":
/*!***********************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr-gladman.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t * Counter block mode compatible with Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var counter = this._counter;\n\n\t // Generate keystream\n\t if (iv) {\n\t counter = this._counter = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t CTRGladman.Decryptor = Encryptor;\n\n\t return CTRGladman;\n\t}());\n\n\n\n\n\treturn CryptoJS.mode.CTRGladman;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tb2RlLWN0ci1nbGFkbWFuLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvbW9kZS1jdHItZ2xhZG1hbi5qcz8yMzIwIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0LyoqIEBwcmVzZXJ2ZVxuXHQgKiBDb3VudGVyIGJsb2NrIG1vZGUgY29tcGF0aWJsZSB3aXRoICBEciBCcmlhbiBHbGFkbWFuIGZpbGVlbmMuY1xuXHQgKiBkZXJpdmVkIGZyb20gQ3J5cHRvSlMubW9kZS5DVFJcblx0ICogSmFuIEhydWJ5IGpocnVieS53ZWJAZ21haWwuY29tXG5cdCAqL1xuXHRDcnlwdG9KUy5tb2RlLkNUUkdsYWRtYW4gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIENUUkdsYWRtYW4gPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpO1xuXG5cdFx0ZnVuY3Rpb24gaW5jV29yZCh3b3JkKVxuXHRcdHtcblx0XHRcdGlmICgoKHdvcmQgPj4gMjQpICYgMHhmZikgPT09IDB4ZmYpIHsgLy9vdmVyZmxvd1xuXHRcdFx0dmFyIGIxID0gKHdvcmQgPj4gMTYpJjB4ZmY7XG5cdFx0XHR2YXIgYjIgPSAod29yZCA+PiA4KSYweGZmO1xuXHRcdFx0dmFyIGIzID0gd29yZCAmIDB4ZmY7XG5cblx0XHRcdGlmIChiMSA9PT0gMHhmZikgLy8gb3ZlcmZsb3cgYjFcblx0XHRcdHtcblx0XHRcdGIxID0gMDtcblx0XHRcdGlmIChiMiA9PT0gMHhmZilcblx0XHRcdHtcblx0XHRcdFx0YjIgPSAwO1xuXHRcdFx0XHRpZiAoYjMgPT09IDB4ZmYpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiMyA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0KytiMztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQrK2IyO1xuXHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0KytiMTtcblx0XHRcdH1cblxuXHRcdFx0d29yZCA9IDA7XG5cdFx0XHR3b3JkICs9IChiMSA8PCAxNik7XG5cdFx0XHR3b3JkICs9IChiMiA8PCA4KTtcblx0XHRcdHdvcmQgKz0gYjM7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHR3b3JkICs9ICgweDAxIDw8IDI0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB3b3JkO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGluY0NvdW50ZXIoY291bnRlcilcblx0XHR7XG5cdFx0XHRpZiAoKGNvdW50ZXJbMF0gPSBpbmNXb3JkKGNvdW50ZXJbMF0pKSA9PT0gMClcblx0XHRcdHtcblx0XHRcdFx0Ly8gZW5jcl9kYXRhIGluIGZpbGVlbmMuYyBmcm9tICBEciBCcmlhbiBHbGFkbWFuJ3MgY291bnRzIG9ubHkgd2l0aCBEV09SRCBqIDwgOFxuXHRcdFx0XHRjb3VudGVyWzFdID0gaW5jV29yZChjb3VudGVyWzFdKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb3VudGVyO1xuXHRcdH1cblxuXHQgICAgdmFyIEVuY3J5cHRvciA9IENUUkdsYWRtYW4uRW5jcnlwdG9yID0gQ1RSR2xhZG1hbi5leHRlbmQoe1xuXHQgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXJcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuX2l2O1xuXHQgICAgICAgICAgICB2YXIgY291bnRlciA9IHRoaXMuX2NvdW50ZXI7XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5c3RyZWFtXG5cdCAgICAgICAgICAgIGlmIChpdikge1xuXHQgICAgICAgICAgICAgICAgY291bnRlciA9IHRoaXMuX2NvdW50ZXIgPSBpdi5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH1cblxuXHRcdFx0XHRpbmNDb3VudGVyKGNvdW50ZXIpO1xuXG5cdFx0XHRcdHZhciBrZXlzdHJlYW0gPSBjb3VudGVyLnNsaWNlKDApO1xuXHQgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKGtleXN0cmVhbSwgMCk7XG5cblx0ICAgICAgICAgICAgLy8gRW5jcnlwdFxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tvZmZzZXQgKyBpXSBePSBrZXlzdHJlYW1baV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgQ1RSR2xhZG1hbi5EZWNyeXB0b3IgPSBFbmNyeXB0b3I7XG5cblx0ICAgIHJldHVybiBDVFJHbGFkbWFuO1xuXHR9KCkpO1xuXG5cblxuXG5cdHJldHVybiBDcnlwdG9KUy5tb2RlLkNUUkdsYWRtYW47XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr-gladman.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr.js":
/*!***************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t var Encryptor = CTR.Encryptor = CTR.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var counter = this._counter;\n\n\t // Generate keystream\n\t if (iv) {\n\t counter = this._counter = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\t var keystream = counter.slice(0);\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Increment counter\n\t counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t CTR.Decryptor = Encryptor;\n\n\t return CTR;\n\t}());\n\n\n\treturn CryptoJS.mode.CTR;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tb2RlLWN0ci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL21vZGUtY3RyLmpzP2VkNGYiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogQ291bnRlciBibG9jayBtb2RlLlxuXHQgKi9cblx0Q3J5cHRvSlMubW9kZS5DVFIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIENUUiA9IENyeXB0b0pTLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7XG5cblx0ICAgIHZhciBFbmNyeXB0b3IgPSBDVFIuRW5jcnlwdG9yID0gQ1RSLmV4dGVuZCh7XG5cdCAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlclxuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7XG5cdCAgICAgICAgICAgIHZhciBjb3VudGVyID0gdGhpcy5fY291bnRlcjtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW1cblx0ICAgICAgICAgICAgaWYgKGl2KSB7XG5cdCAgICAgICAgICAgICAgICBjb3VudGVyID0gdGhpcy5fY291bnRlciA9IGl2LnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgSVYgZm9yIHN1YnNlcXVlbnQgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9pdiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIga2V5c3RyZWFtID0gY291bnRlci5zbGljZSgwKTtcblx0ICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApO1xuXG5cdCAgICAgICAgICAgIC8vIEluY3JlbWVudCBjb3VudGVyXG5cdCAgICAgICAgICAgIGNvdW50ZXJbYmxvY2tTaXplIC0gMV0gPSAoY291bnRlcltibG9ja1NpemUgLSAxXSArIDEpIHwgMFxuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIENUUi5EZWNyeXB0b3IgPSBFbmNyeXB0b3I7XG5cblx0ICAgIHJldHVybiBDVFI7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMubW9kZS5DVFI7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ctr.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ecb.js":
/*!***************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ecb.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t ECB.Encryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.encryptBlock(words, offset);\n\t }\n\t });\n\n\t ECB.Decryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.decryptBlock(words, offset);\n\t }\n\t });\n\n\t return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tb2RlLWVjYi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL21vZGUtZWNiLmpzP2NkNDUiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogRWxlY3Ryb25pYyBDb2RlYm9vayBibG9jayBtb2RlLlxuXHQgKi9cblx0Q3J5cHRvSlMubW9kZS5FQ0IgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIEVDQiA9IENyeXB0b0pTLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7XG5cblx0ICAgIEVDQi5FbmNyeXB0b3IgPSBFQ0IuZXh0ZW5kKHtcblx0ICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIEVDQi5EZWNyeXB0b3IgPSBFQ0IuZXh0ZW5kKHtcblx0ICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIHJldHVybiBFQ0I7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMubW9kZS5FQ0I7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ecb.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ofb.js":
/*!***************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ofb.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t var Encryptor = OFB.Encryptor = OFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var keystream = this._keystream;\n\n\t // Generate keystream\n\t if (iv) {\n\t keystream = this._keystream = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t OFB.Decryptor = Encryptor;\n\n\t return OFB;\n\t}());\n\n\n\treturn CryptoJS.mode.OFB;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9tb2RlLW9mYi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL21vZGUtb2ZiLmpzPzk0ODIiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogT3V0cHV0IEZlZWRiYWNrIGJsb2NrIG1vZGUuXG5cdCAqL1xuXHRDcnlwdG9KUy5tb2RlLk9GQiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgT0ZCID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgdmFyIEVuY3J5cHRvciA9IE9GQi5FbmNyeXB0b3IgPSBPRkIuZXh0ZW5kKHtcblx0ICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyXG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblx0ICAgICAgICAgICAgdmFyIGtleXN0cmVhbSA9IHRoaXMuX2tleXN0cmVhbTtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW1cblx0ICAgICAgICAgICAgaWYgKGl2KSB7XG5cdCAgICAgICAgICAgICAgICBrZXlzdHJlYW0gPSB0aGlzLl9rZXlzdHJlYW0gPSBpdi5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApO1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIE9GQi5EZWNyeXB0b3IgPSBFbmNyeXB0b3I7XG5cblx0ICAgIHJldHVybiBPRkI7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMubW9kZS5PRkI7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/mode-ofb.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-ansix923.js":
/*!*******************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-ansix923.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t pad: function (data, blockSize) {\n\t // Shortcuts\n\t var dataSigBytes = data.sigBytes;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t // Compute last byte position\n\t var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t // Pad\n\t data.clamp();\n\t data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t data.sigBytes += nPaddingBytes;\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtYW5zaXg5MjMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtYW5zaXg5MjMuanM/MzMwZSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBBTlNJIFguOTIzIHBhZGRpbmcgc3RyYXRlZ3kuXG5cdCAqL1xuXHRDcnlwdG9KUy5wYWQuQW5zaVg5MjMgPSB7XG5cdCAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgLy8gQ291bnQgcGFkZGluZyBieXRlc1xuXHQgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gYmxvY2tTaXplQnl0ZXMgLSBkYXRhU2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgIC8vIENvbXB1dGUgbGFzdCBieXRlIHBvc2l0aW9uXG5cdCAgICAgICAgdmFyIGxhc3RCeXRlUG9zID0gZGF0YVNpZ0J5dGVzICsgblBhZGRpbmdCeXRlcyAtIDE7XG5cblx0ICAgICAgICAvLyBQYWRcblx0ICAgICAgICBkYXRhLmNsYW1wKCk7XG5cdCAgICAgICAgZGF0YS53b3Jkc1tsYXN0Qnl0ZVBvcyA+Pj4gMl0gfD0gblBhZGRpbmdCeXRlcyA8PCAoMjQgLSAobGFzdEJ5dGVQb3MgJSA0KSAqIDgpO1xuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMgKz0gblBhZGRpbmdCeXRlcztcblx0ICAgIH0sXG5cblx0ICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZVxuXHQgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAvLyBSZW1vdmUgcGFkZGluZ1xuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlcztcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuQW5zaXg5MjM7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-ansix923.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso10126.js":
/*!*******************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso10126.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Pad\n\t data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtaXNvMTAxMjYuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtaXNvMTAxMjYuanM/YzU2MiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBJU08gMTAxMjYgcGFkZGluZyBzdHJhdGVneS5cblx0ICovXG5cdENyeXB0b0pTLnBhZC5Jc28xMDEyNiA9IHtcblx0ICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXNcblx0ICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgLy8gUGFkXG5cdCAgICAgICAgZGF0YS5jb25jYXQoQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oblBhZGRpbmdCeXRlcyAtIDEpKS5cblx0ICAgICAgICAgICAgIGNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbblBhZGRpbmdCeXRlcyA8PCAyNF0sIDEpKTtcblx0ICAgIH0sXG5cblx0ICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZVxuXHQgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAvLyBSZW1vdmUgcGFkZGluZ1xuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlcztcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuSXNvMTAxMjY7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso10126.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso97971.js":
/*!*******************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso97971.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t pad: function (data, blockSize) {\n\t // Add 0x80 byte\n\t data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t // Zero pad the rest\n\t CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t },\n\n\t unpad: function (data) {\n\t // Remove zero padding\n\t CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t // Remove one more byte -- the 0x80 byte\n\t data.sigBytes--;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso97971;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtaXNvOTc5NzEuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtaXNvOTc5NzEuanM/ZDg5YyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBJU08vSUVDIDk3OTctMSBQYWRkaW5nIE1ldGhvZCAyLlxuXHQgKi9cblx0Q3J5cHRvSlMucGFkLklzbzk3OTcxID0ge1xuXHQgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgLy8gQWRkIDB4ODAgYnl0ZVxuXHQgICAgICAgIGRhdGEuY29uY2F0KENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDgwMDAwMDAwXSwgMSkpO1xuXG5cdCAgICAgICAgLy8gWmVybyBwYWQgdGhlIHJlc3Rcblx0ICAgICAgICBDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcucGFkKGRhdGEsIGJsb2NrU2l6ZSk7XG5cdCAgICB9LFxuXG5cdCAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAvLyBSZW1vdmUgemVybyBwYWRkaW5nXG5cdCAgICAgICAgQ3J5cHRvSlMucGFkLlplcm9QYWRkaW5nLnVucGFkKGRhdGEpO1xuXG5cdCAgICAgICAgLy8gUmVtb3ZlIG9uZSBtb3JlIGJ5dGUgLS0gdGhlIDB4ODAgYnl0ZVxuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMtLTtcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuSXNvOTc5NzE7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-iso97971.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-nopadding.js":
/*!********************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-nopadding.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t pad: function () {\n\t },\n\n\t unpad: function () {\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtbm9wYWRkaW5nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvcGFkLW5vcGFkZGluZy5qcz9mMWMxIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0LyoqXG5cdCAqIEEgbm9vcCBwYWRkaW5nIHN0cmF0ZWd5LlxuXHQgKi9cblx0Q3J5cHRvSlMucGFkLk5vUGFkZGluZyA9IHtcblx0ICAgIHBhZDogZnVuY3Rpb24gKCkge1xuXHQgICAgfSxcblxuXHQgICAgdW5wYWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuTm9QYWRkaW5nO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-nopadding.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-zeropadding.js":
/*!**********************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-zeropadding.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Pad\n\t data.clamp();\n\t data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t },\n\n\t unpad: function (data) {\n\t // Shortcut\n\t var dataWords = data.words;\n\n\t // Unpad\n\t var i = data.sigBytes - 1;\n\t while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t i--;\n\t }\n\t data.sigBytes = i + 1;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtemVyb3BhZGRpbmcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYWQtemVyb3BhZGRpbmcuanM/ZTc1MSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBaZXJvIHBhZGRpbmcgc3RyYXRlZ3kuXG5cdCAqL1xuXHRDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcgPSB7XG5cdCAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAvLyBQYWRcblx0ICAgICAgICBkYXRhLmNsYW1wKCk7XG5cdCAgICAgICAgZGF0YS5zaWdCeXRlcyArPSBibG9ja1NpemVCeXRlcyAtICgoZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzKSB8fCBibG9ja1NpemVCeXRlcyk7XG5cdCAgICB9LFxuXG5cdCAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgLy8gVW5wYWRcblx0ICAgICAgICB2YXIgaSA9IGRhdGEuc2lnQnl0ZXMgLSAxO1xuXHQgICAgICAgIHdoaWxlICghKChkYXRhV29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmKSkge1xuXHQgICAgICAgICAgICBpLS07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBpICsgMTtcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmc7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pad-zeropadding.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/pbkdf2.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/pbkdf2.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./sha1 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js\"), __webpack_require__(/*! ./hmac */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/hmac.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA1 = C_algo.SHA1;\n\t var HMAC = C_algo.HMAC;\n\n\t /**\n\t * Password-Based Key Derivation Function 2 algorithm.\n\t */\n\t var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hasher to use. Default: SHA1\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: SHA1,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.PBKDF2.create();\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init HMAC\n\t var hmac = HMAC.create(cfg.hasher, password);\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\t var blockIndex = WordArray.create([0x00000001]);\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var blockIndexWords = blockIndex.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t var block = hmac.update(salt).finalize(blockIndex);\n\t hmac.reset();\n\n\t // Shortcuts\n\t var blockWords = block.words;\n\t var blockWordsLength = blockWords.length;\n\n\t // Iterations\n\t var intermediate = block;\n\t for (var i = 1; i < iterations; i++) {\n\t intermediate = hmac.finalize(intermediate);\n\t hmac.reset();\n\n\t // Shortcut\n\t var intermediateWords = intermediate.words;\n\n\t // XOR intermediate with block\n\t for (var j = 0; j < blockWordsLength; j++) {\n\t blockWords[j] ^= intermediateWords[j];\n\t }\n\t }\n\n\t derivedKey.concat(block);\n\t blockIndexWords[0]++;\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.PBKDF2(password, salt);\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.PBKDF2 = function (password, salt, cfg) {\n\t return PBKDF2.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.PBKDF2;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYmtkZjIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9wYmtkZjIuanM/Mzc3MiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMVwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGExXCIsIFwiLi9obWFjXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBTSEExID0gQ19hbGdvLlNIQTE7XG5cdCAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBhc3N3b3JkLUJhc2VkIEtleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIDIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgUEJLREYyID0gQ19hbGdvLlBCS0RGMiA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UuIERlZmF1bHQ6IFNIQTFcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXRlcmF0aW9ucyBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybS4gRGVmYXVsdDogMVxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cdCAgICAgICAgICAgIGhhc2hlcjogU0hBMSxcblx0ICAgICAgICAgICAgaXRlcmF0aW9uczogMVxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uUEJLREYyLmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5QQktERjIuY3JlYXRlKHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uUEJLREYyLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb21wdXRlcyB0aGUgUGFzc3dvcmQtQmFzZWQgS2V5IERlcml2YXRpb24gRnVuY3Rpb24gMi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtleSA9IGtkZi5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb21wdXRlOiBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnO1xuXG5cdCAgICAgICAgICAgIC8vIEluaXQgSE1BQ1xuXHQgICAgICAgICAgICB2YXIgaG1hYyA9IEhNQUMuY3JlYXRlKGNmZy5oYXNoZXIsIHBhc3N3b3JkKTtcblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZEtleSA9IFdvcmRBcnJheS5jcmVhdGUoKTtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrSW5kZXggPSBXb3JkQXJyYXkuY3JlYXRlKFsweDAwMDAwMDAxXSk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tJbmRleFdvcmRzID0gYmxvY2tJbmRleC53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGtleVNpemUgPSBjZmcua2V5U2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbnMgPSBjZmcuaXRlcmF0aW9ucztcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBrZXlcblx0ICAgICAgICAgICAgd2hpbGUgKGRlcml2ZWRLZXlXb3Jkcy5sZW5ndGggPCBrZXlTaXplKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBobWFjLnVwZGF0ZShzYWx0KS5maW5hbGl6ZShibG9ja0luZGV4KTtcblx0ICAgICAgICAgICAgICAgIGhtYWMucmVzZXQoKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tXb3JkcyA9IGJsb2NrLndvcmRzO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrV29yZHNMZW5ndGggPSBibG9ja1dvcmRzLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uc1xuXHQgICAgICAgICAgICAgICAgdmFyIGludGVybWVkaWF0ZSA9IGJsb2NrO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSBobWFjLmZpbmFsaXplKGludGVybWVkaWF0ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgaG1hYy5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJtZWRpYXRlV29yZHMgPSBpbnRlcm1lZGlhdGUud29yZHM7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBYT1IgaW50ZXJtZWRpYXRlIHdpdGggYmxvY2tcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJsb2NrV29yZHNMZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1dvcmRzW2pdIF49IGludGVybWVkaWF0ZVdvcmRzW2pdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgYmxvY2tJbmRleFdvcmRzWzBdKys7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZGVyaXZlZEtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIHJldHVybiBkZXJpdmVkS2V5O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENvbXB1dGVzIHRoZSBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC5cblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBjb21wdXRhdGlvbi5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4IH0pO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5QQktERjIocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCwgaXRlcmF0aW9uczogMTAwMCB9KTtcblx0ICAgICAqL1xuXHQgICAgQy5QQktERjIgPSBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQsIGNmZykge1xuXHQgICAgICAgIHJldHVybiBQQktERjIuY3JlYXRlKGNmZykuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICB9O1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlBCS0RGMjtcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/pbkdf2.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit-legacy.js":
/*!********************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit-legacy.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t // Reusable objects\n\t var S = [];\n\t var C_ = [];\n\t var G = [];\n\n\t /**\n\t * Rabbit stream cipher algorithm.\n\t *\n\t * This is a legacy version that neglected to convert the key to little-endian.\n\t * This error doesn't affect the cipher's security,\n\t * but it does affect its compatibility with other implementations.\n\t */\n\t var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var K = this._key.words;\n\t var iv = this.cfg.iv;\n\n\t // Generate initial state values\n\t var X = this._X = [\n\t K[0], (K[3] << 16) | (K[2] >>> 16),\n\t K[1], (K[0] << 16) | (K[3] >>> 16),\n\t K[2], (K[1] << 16) | (K[0] >>> 16),\n\t K[3], (K[2] << 16) | (K[1] >>> 16)\n\t ];\n\n\t // Generate initial counter values\n\t var C = this._C = [\n\t (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t ];\n\n\t // Carry bit\n\t this._b = 0;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\n\t // Modify the counters\n\t for (var i = 0; i < 8; i++) {\n\t C[i] ^= X[(i + 4) & 7];\n\t }\n\n\t // IV setup\n\t if (iv) {\n\t // Shortcuts\n\t var IV = iv.words;\n\t var IV_0 = IV[0];\n\t var IV_1 = IV[1];\n\n\t // Generate four subvectors\n\t var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n\t // Modify counter values\n\t C[0] ^= i0;\n\t C[1] ^= i1;\n\t C[2] ^= i2;\n\t C[3] ^= i3;\n\t C[4] ^= i0;\n\t C[5] ^= i1;\n\t C[6] ^= i2;\n\t C[7] ^= i3;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\t }\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var X = this._X;\n\n\t // Iterate the system\n\t nextState.call(this);\n\n\t // Generate four keystream words\n\t S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t for (var i = 0; i < 4; i++) {\n\t // Swap endian\n\t S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\n\t (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n\t // Encrypt\n\t M[offset + i] ^= S[i];\n\t }\n\t },\n\n\t blockSize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t function nextState() {\n\t // Shortcuts\n\t var X = this._X;\n\t var C = this._C;\n\n\t // Save old counter values\n\t for (var i = 0; i < 8; i++) {\n\t C_[i] = C[i];\n\t }\n\n\t // Calculate new counter values\n\t C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t // Calculate the g-values\n\t for (var i = 0; i < 8; i++) {\n\t var gx = X[i] + C[i];\n\n\t // Construct high and low argument for squaring\n\t var ga = gx & 0xffff;\n\t var gb = gx >>> 16;\n\n\t // Calculate high and low result of squaring\n\t var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t // High XOR low\n\t G[i] = gh ^ gl;\n\t }\n\n\t // Calculate new state values\n\t X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n\t X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n\t X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n\t X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\treturn CryptoJS.RabbitLegacy;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yYWJiaXQtbGVnYWN5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvcmFiYml0LWxlZ2FjeS5qcz9kMjIyIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9lbmMtYmFzZTY0XCIpLCByZXF1aXJlKFwiLi9tZDVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vbWQ1XCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0c1xuXHQgICAgdmFyIFMgID0gW107XG5cdCAgICB2YXIgQ18gPSBbXTtcblx0ICAgIHZhciBHICA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJhYmJpdCBzdHJlYW0gY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGlzIGlzIGEgbGVnYWN5IHZlcnNpb24gdGhhdCBuZWdsZWN0ZWQgdG8gY29udmVydCB0aGUga2V5IHRvIGxpdHRsZS1lbmRpYW4uXG5cdCAgICAgKiBUaGlzIGVycm9yIGRvZXNuJ3QgYWZmZWN0IHRoZSBjaXBoZXIncyBzZWN1cml0eSxcblx0ICAgICAqIGJ1dCBpdCBkb2VzIGFmZmVjdCBpdHMgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucy5cblx0ICAgICAqL1xuXHQgICAgdmFyIFJhYmJpdExlZ2FjeSA9IENfYWxnby5SYWJiaXRMZWdhY3kgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEsgPSB0aGlzLl9rZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuY2ZnLml2O1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGluaXRpYWwgc3RhdGUgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBYID0gdGhpcy5fWCA9IFtcblx0ICAgICAgICAgICAgICAgIEtbMF0sIChLWzNdIDw8IDE2KSB8IChLWzJdID4+PiAxNiksXG5cdCAgICAgICAgICAgICAgICBLWzFdLCAoS1swXSA8PCAxNikgfCAoS1szXSA+Pj4gMTYpLFxuXHQgICAgICAgICAgICAgICAgS1syXSwgKEtbMV0gPDwgMTYpIHwgKEtbMF0gPj4+IDE2KSxcblx0ICAgICAgICAgICAgICAgIEtbM10sIChLWzJdIDw8IDE2KSB8IChLWzFdID4+PiAxNilcblx0ICAgICAgICAgICAgXTtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBDID0gdGhpcy5fQyA9IFtcblx0ICAgICAgICAgICAgICAgIChLWzJdIDw8IDE2KSB8IChLWzJdID4+PiAxNiksIChLWzBdICYgMHhmZmZmMDAwMCkgfCAoS1sxXSAmIDB4MDAwMGZmZmYpLFxuXHQgICAgICAgICAgICAgICAgKEtbM10gPDwgMTYpIHwgKEtbM10gPj4+IDE2KSwgKEtbMV0gJiAweGZmZmYwMDAwKSB8IChLWzJdICYgMHgwMDAwZmZmZiksXG5cdCAgICAgICAgICAgICAgICAoS1swXSA8PCAxNikgfCAoS1swXSA+Pj4gMTYpLCAoS1syXSAmIDB4ZmZmZjAwMDApIHwgKEtbM10gJiAweDAwMDBmZmZmKSxcblx0ICAgICAgICAgICAgICAgIChLWzFdIDw8IDE2KSB8IChLWzFdID4+PiAxNiksIChLWzNdICYgMHhmZmZmMDAwMCkgfCAoS1swXSAmIDB4MDAwMGZmZmYpXG5cdCAgICAgICAgICAgIF07XG5cblx0ICAgICAgICAgICAgLy8gQ2FycnkgYml0XG5cdCAgICAgICAgICAgIHRoaXMuX2IgPSAwO1xuXG5cdCAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbSBmb3VyIHRpbWVzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgY291bnRlcnNcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIENbaV0gXj0gWFsoaSArIDQpICYgN107XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJViBzZXR1cFxuXHQgICAgICAgICAgICBpZiAoaXYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIElWID0gaXYud29yZHM7XG5cdCAgICAgICAgICAgICAgICB2YXIgSVZfMCA9IElWWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIElWXzEgPSBJVlsxXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBzdWJ2ZWN0b3JzXG5cdCAgICAgICAgICAgICAgICB2YXIgaTAgPSAoKChJVl8wIDw8IDgpIHwgKElWXzAgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8ICgoKElWXzAgPDwgMjQpIHwgKElWXzAgPj4+IDgpKSAmIDB4ZmYwMGZmMDApO1xuXHQgICAgICAgICAgICAgICAgdmFyIGkyID0gKCgoSVZfMSA8PCA4KSB8IChJVl8xID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfCAoKChJVl8xIDw8IDI0KSB8IChJVl8xID4+PiA4KSkgJiAweGZmMDBmZjAwKTtcblx0ICAgICAgICAgICAgICAgIHZhciBpMSA9IChpMCA+Pj4gMTYpIHwgKGkyICYgMHhmZmZmMDAwMCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgaTMgPSAoaTIgPDwgMTYpICB8IChpMCAmIDB4MDAwMGZmZmYpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBNb2RpZnkgY291bnRlciB2YWx1ZXNcblx0ICAgICAgICAgICAgICAgIENbMF0gXj0gaTA7XG5cdCAgICAgICAgICAgICAgICBDWzFdIF49IGkxO1xuXHQgICAgICAgICAgICAgICAgQ1syXSBePSBpMjtcblx0ICAgICAgICAgICAgICAgIENbM10gXj0gaTM7XG5cdCAgICAgICAgICAgICAgICBDWzRdIF49IGkwO1xuXHQgICAgICAgICAgICAgICAgQ1s1XSBePSBpMTtcblx0ICAgICAgICAgICAgICAgIENbNl0gXj0gaTI7XG5cdCAgICAgICAgICAgICAgICBDWzddIF49IGkzO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lc1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIFggPSB0aGlzLl9YO1xuXG5cdCAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbVxuXHQgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBmb3VyIGtleXN0cmVhbSB3b3Jkc1xuXHQgICAgICAgICAgICBTWzBdID0gWFswXSBeIChYWzVdID4+PiAxNikgXiAoWFszXSA8PCAxNik7XG5cdCAgICAgICAgICAgIFNbMV0gPSBYWzJdIF4gKFhbN10gPj4+IDE2KSBeIChYWzVdIDw8IDE2KTtcblx0ICAgICAgICAgICAgU1syXSA9IFhbNF0gXiAoWFsxXSA+Pj4gMTYpIF4gKFhbN10gPDwgMTYpO1xuXHQgICAgICAgICAgICBTWzNdID0gWFs2XSBeIChYWzNdID4+PiAxNikgXiAoWFsxXSA8PCAxNik7XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgICAgICBTW2ldID0gKCgoU1tpXSA8PCA4KSAgfCAoU1tpXSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChTW2ldIDw8IDI0KSB8IChTW2ldID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgICAgIE1bb2Zmc2V0ICsgaV0gXj0gU1tpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDEyOC8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogNjQvMzJcblx0ICAgIH0pO1xuXG5cdCAgICBmdW5jdGlvbiBuZXh0U3RhdGUoKSB7XG5cdCAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgdmFyIFggPSB0aGlzLl9YO1xuXHQgICAgICAgIHZhciBDID0gdGhpcy5fQztcblxuXHQgICAgICAgIC8vIFNhdmUgb2xkIGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgQ19baV0gPSBDW2ldO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgY291bnRlciB2YWx1ZXNcblx0ICAgICAgICBDWzBdID0gKENbMF0gKyAweDRkMzRkMzRkICsgdGhpcy5fYikgfCAwO1xuXHQgICAgICAgIENbMV0gPSAoQ1sxXSArIDB4ZDM0ZDM0ZDMgKyAoKENbMF0gPj4+IDApIDwgKENfWzBdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbMl0gPSAoQ1syXSArIDB4MzRkMzRkMzQgKyAoKENbMV0gPj4+IDApIDwgKENfWzFdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbM10gPSAoQ1szXSArIDB4NGQzNGQzNGQgKyAoKENbMl0gPj4+IDApIDwgKENfWzJdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNF0gPSAoQ1s0XSArIDB4ZDM0ZDM0ZDMgKyAoKENbM10gPj4+IDApIDwgKENfWzNdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNV0gPSAoQ1s1XSArIDB4MzRkMzRkMzQgKyAoKENbNF0gPj4+IDApIDwgKENfWzRdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNl0gPSAoQ1s2XSArIDB4NGQzNGQzNGQgKyAoKENbNV0gPj4+IDApIDwgKENfWzVdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbN10gPSAoQ1s3XSArIDB4ZDM0ZDM0ZDMgKyAoKENbNl0gPj4+IDApIDwgKENfWzZdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIHRoaXMuX2IgPSAoQ1s3XSA+Pj4gMCkgPCAoQ19bN10gPj4+IDApID8gMSA6IDA7XG5cblx0ICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGctdmFsdWVzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGd4ID0gWFtpXSArIENbaV07XG5cblx0ICAgICAgICAgICAgLy8gQ29uc3RydWN0IGhpZ2ggYW5kIGxvdyBhcmd1bWVudCBmb3Igc3F1YXJpbmdcblx0ICAgICAgICAgICAgdmFyIGdhID0gZ3ggJiAweGZmZmY7XG5cdCAgICAgICAgICAgIHZhciBnYiA9IGd4ID4+PiAxNjtcblxuXHQgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaGlnaCBhbmQgbG93IHJlc3VsdCBvZiBzcXVhcmluZ1xuXHQgICAgICAgICAgICB2YXIgZ2ggPSAoKCgoZ2EgKiBnYSkgPj4+IDE3KSArIGdhICogZ2IpID4+PiAxNSkgKyBnYiAqIGdiO1xuXHQgICAgICAgICAgICB2YXIgZ2wgPSAoKChneCAmIDB4ZmZmZjAwMDApICogZ3gpIHwgMCkgKyAoKChneCAmIDB4MDAwMGZmZmYpICogZ3gpIHwgMCk7XG5cblx0ICAgICAgICAgICAgLy8gSGlnaCBYT1IgbG93XG5cdCAgICAgICAgICAgIEdbaV0gPSBnaCBeIGdsO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc3RhdGUgdmFsdWVzXG5cdCAgICAgICAgWFswXSA9IChHWzBdICsgKChHWzddIDw8IDE2KSB8IChHWzddID4+PiAxNikpICsgKChHWzZdIDw8IDE2KSB8IChHWzZdID4+PiAxNikpKSB8IDA7XG5cdCAgICAgICAgWFsxXSA9IChHWzFdICsgKChHWzBdIDw8IDgpICB8IChHWzBdID4+PiAyNCkpICsgR1s3XSkgfCAwO1xuXHQgICAgICAgIFhbMl0gPSAoR1syXSArICgoR1sxXSA8PCAxNikgfCAoR1sxXSA+Pj4gMTYpKSArICgoR1swXSA8PCAxNikgfCAoR1swXSA+Pj4gMTYpKSkgfCAwO1xuXHQgICAgICAgIFhbM10gPSAoR1szXSArICgoR1syXSA8PCA4KSAgfCAoR1syXSA+Pj4gMjQpKSArIEdbMV0pIHwgMDtcblx0ICAgICAgICBYWzRdID0gKEdbNF0gKyAoKEdbM10gPDwgMTYpIHwgKEdbM10gPj4+IDE2KSkgKyAoKEdbMl0gPDwgMTYpIHwgKEdbMl0gPj4+IDE2KSkpIHwgMDtcblx0ICAgICAgICBYWzVdID0gKEdbNV0gKyAoKEdbNF0gPDwgOCkgIHwgKEdbNF0gPj4+IDI0KSkgKyBHWzNdKSB8IDA7XG5cdCAgICAgICAgWFs2XSA9IChHWzZdICsgKChHWzVdIDw8IDE2KSB8IChHWzVdID4+PiAxNikpICsgKChHWzRdIDw8IDE2KSB8IChHWzRdID4+PiAxNikpKSB8IDA7XG5cdCAgICAgICAgWFs3XSA9IChHWzddICsgKChHWzZdIDw8IDgpICB8IChHWzZdID4+PiAyNCkpICsgR1s1XSkgfCAwO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJhYmJpdExlZ2FjeS5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLlJhYmJpdExlZ2FjeS5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5SYWJiaXRMZWdhY3kgPSBTdHJlYW1DaXBoZXIuX2NyZWF0ZUhlbHBlcihSYWJiaXRMZWdhY3kpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlJhYmJpdExlZ2FjeTtcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit-legacy.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t // Reusable objects\n\t var S = [];\n\t var C_ = [];\n\t var G = [];\n\n\t /**\n\t * Rabbit stream cipher algorithm\n\t */\n\t var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var K = this._key.words;\n\t var iv = this.cfg.iv;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |\n\t (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Generate initial state values\n\t var X = this._X = [\n\t K[0], (K[3] << 16) | (K[2] >>> 16),\n\t K[1], (K[0] << 16) | (K[3] >>> 16),\n\t K[2], (K[1] << 16) | (K[0] >>> 16),\n\t K[3], (K[2] << 16) | (K[1] >>> 16)\n\t ];\n\n\t // Generate initial counter values\n\t var C = this._C = [\n\t (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t ];\n\n\t // Carry bit\n\t this._b = 0;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\n\t // Modify the counters\n\t for (var i = 0; i < 8; i++) {\n\t C[i] ^= X[(i + 4) & 7];\n\t }\n\n\t // IV setup\n\t if (iv) {\n\t // Shortcuts\n\t var IV = iv.words;\n\t var IV_0 = IV[0];\n\t var IV_1 = IV[1];\n\n\t // Generate four subvectors\n\t var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n\t // Modify counter values\n\t C[0] ^= i0;\n\t C[1] ^= i1;\n\t C[2] ^= i2;\n\t C[3] ^= i3;\n\t C[4] ^= i0;\n\t C[5] ^= i1;\n\t C[6] ^= i2;\n\t C[7] ^= i3;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\t }\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var X = this._X;\n\n\t // Iterate the system\n\t nextState.call(this);\n\n\t // Generate four keystream words\n\t S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t for (var i = 0; i < 4; i++) {\n\t // Swap endian\n\t S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\n\t (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n\t // Encrypt\n\t M[offset + i] ^= S[i];\n\t }\n\t },\n\n\t blockSize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t function nextState() {\n\t // Shortcuts\n\t var X = this._X;\n\t var C = this._C;\n\n\t // Save old counter values\n\t for (var i = 0; i < 8; i++) {\n\t C_[i] = C[i];\n\t }\n\n\t // Calculate new counter values\n\t C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t // Calculate the g-values\n\t for (var i = 0; i < 8; i++) {\n\t var gx = X[i] + C[i];\n\n\t // Construct high and low argument for squaring\n\t var ga = gx & 0xffff;\n\t var gb = gx >>> 16;\n\n\t // Calculate high and low result of squaring\n\t var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t // High XOR low\n\t G[i] = gh ^ gl;\n\t }\n\n\t // Calculate new state values\n\t X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n\t X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n\t X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n\t X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t */\n\t C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\treturn CryptoJS.Rabbit;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yYWJiaXQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yYWJiaXQuanM/ZTU0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFN0cmVhbUNpcGhlciA9IENfbGliLlN0cmVhbUNpcGhlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdHNcblx0ICAgIHZhciBTICA9IFtdO1xuXHQgICAgdmFyIENfID0gW107XG5cdCAgICB2YXIgRyAgPSBbXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBSYWJiaXQgc3RyZWFtIGNpcGhlciBhbGdvcml0aG1cblx0ICAgICAqL1xuXHQgICAgdmFyIFJhYmJpdCA9IENfYWxnby5SYWJiaXQgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEsgPSB0aGlzLl9rZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuY2ZnLml2O1xuXG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBLW2ldID0gKCgoS1tpXSA8PCA4KSAgfCAoS1tpXSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChLW2ldIDw8IDI0KSB8IChLW2ldID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIHN0YXRlIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgWCA9IHRoaXMuX1ggPSBbXG5cdCAgICAgICAgICAgICAgICBLWzBdLCAoS1szXSA8PCAxNikgfCAoS1syXSA+Pj4gMTYpLFxuXHQgICAgICAgICAgICAgICAgS1sxXSwgKEtbMF0gPDwgMTYpIHwgKEtbM10gPj4+IDE2KSxcblx0ICAgICAgICAgICAgICAgIEtbMl0sIChLWzFdIDw8IDE2KSB8IChLWzBdID4+PiAxNiksXG5cdCAgICAgICAgICAgICAgICBLWzNdLCAoS1syXSA8PCAxNikgfCAoS1sxXSA+Pj4gMTYpXG5cdCAgICAgICAgICAgIF07XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgaW5pdGlhbCBjb3VudGVyIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgQyA9IHRoaXMuX0MgPSBbXG5cdCAgICAgICAgICAgICAgICAoS1syXSA8PCAxNikgfCAoS1syXSA+Pj4gMTYpLCAoS1swXSAmIDB4ZmZmZjAwMDApIHwgKEtbMV0gJiAweDAwMDBmZmZmKSxcblx0ICAgICAgICAgICAgICAgIChLWzNdIDw8IDE2KSB8IChLWzNdID4+PiAxNiksIChLWzFdICYgMHhmZmZmMDAwMCkgfCAoS1syXSAmIDB4MDAwMGZmZmYpLFxuXHQgICAgICAgICAgICAgICAgKEtbMF0gPDwgMTYpIHwgKEtbMF0gPj4+IDE2KSwgKEtbMl0gJiAweGZmZmYwMDAwKSB8IChLWzNdICYgMHgwMDAwZmZmZiksXG5cdCAgICAgICAgICAgICAgICAoS1sxXSA8PCAxNikgfCAoS1sxXSA+Pj4gMTYpLCAoS1szXSAmIDB4ZmZmZjAwMDApIHwgKEtbMF0gJiAweDAwMDBmZmZmKVxuXHQgICAgICAgICAgICBdO1xuXG5cdCAgICAgICAgICAgIC8vIENhcnJ5IGJpdFxuXHQgICAgICAgICAgICB0aGlzLl9iID0gMDtcblxuXHQgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lc1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBNb2RpZnkgdGhlIGNvdW50ZXJzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBDW2ldIF49IFhbKGkgKyA0KSAmIDddO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSVYgc2V0dXBcblx0ICAgICAgICAgICAgaWYgKGl2KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBJViA9IGl2LndvcmRzO1xuXHQgICAgICAgICAgICAgICAgdmFyIElWXzAgPSBJVlswXTtcblx0ICAgICAgICAgICAgICAgIHZhciBJVl8xID0gSVZbMV07XG5cblx0ICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGZvdXIgc3VidmVjdG9yc1xuXHQgICAgICAgICAgICAgICAgdmFyIGkwID0gKCgoSVZfMCA8PCA4KSB8IChJVl8wID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfCAoKChJVl8wIDw8IDI0KSB8IChJVl8wID4+PiA4KSkgJiAweGZmMDBmZjAwKTtcblx0ICAgICAgICAgICAgICAgIHZhciBpMiA9ICgoKElWXzEgPDwgOCkgfCAoSVZfMSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHwgKCgoSVZfMSA8PCAyNCkgfCAoSVZfMSA+Pj4gOCkpICYgMHhmZjAwZmYwMCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgaTEgPSAoaTAgPj4+IDE2KSB8IChpMiAmIDB4ZmZmZjAwMDApO1xuXHQgICAgICAgICAgICAgICAgdmFyIGkzID0gKGkyIDw8IDE2KSAgfCAoaTAgJiAweDAwMDBmZmZmKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gTW9kaWZ5IGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgICAgICAgICBDWzBdIF49IGkwO1xuXHQgICAgICAgICAgICAgICAgQ1sxXSBePSBpMTtcblx0ICAgICAgICAgICAgICAgIENbMl0gXj0gaTI7XG5cdCAgICAgICAgICAgICAgICBDWzNdIF49IGkzO1xuXHQgICAgICAgICAgICAgICAgQ1s0XSBePSBpMDtcblx0ICAgICAgICAgICAgICAgIENbNV0gXj0gaTE7XG5cdCAgICAgICAgICAgICAgICBDWzZdIF49IGkyO1xuXHQgICAgICAgICAgICAgICAgQ1s3XSBePSBpMztcblxuXHQgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aGUgc3lzdGVtIGZvdXIgdGltZXNcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBYID0gdGhpcy5fWDtcblxuXHQgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW1cblx0ICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBrZXlzdHJlYW0gd29yZHNcblx0ICAgICAgICAgICAgU1swXSA9IFhbMF0gXiAoWFs1XSA+Pj4gMTYpIF4gKFhbM10gPDwgMTYpO1xuXHQgICAgICAgICAgICBTWzFdID0gWFsyXSBeIChYWzddID4+PiAxNikgXiAoWFs1XSA8PCAxNik7XG5cdCAgICAgICAgICAgIFNbMl0gPSBYWzRdIF4gKFhbMV0gPj4+IDE2KSBeIChYWzddIDw8IDE2KTtcblx0ICAgICAgICAgICAgU1szXSA9IFhbNl0gXiAoWFszXSA+Pj4gMTYpIF4gKFhbMV0gPDwgMTYpO1xuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICAgICAgU1tpXSA9ICgoKFNbaV0gPDwgOCkgIHwgKFNbaV0gPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgKCgoU1tpXSA8PCAyNCkgfCAoU1tpXSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBFbmNyeXB0XG5cdCAgICAgICAgICAgICAgICBNW29mZnNldCArIGldIF49IFNbaV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDY0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgZnVuY3Rpb24gbmV4dFN0YXRlKCkge1xuXHQgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgIHZhciBYID0gdGhpcy5fWDtcblx0ICAgICAgICB2YXIgQyA9IHRoaXMuX0M7XG5cblx0ICAgICAgICAvLyBTYXZlIG9sZCBjb3VudGVyIHZhbHVlc1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cdCAgICAgICAgICAgIENfW2ldID0gQ1tpXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgQ1swXSA9IChDWzBdICsgMHg0ZDM0ZDM0ZCArIHRoaXMuX2IpIHwgMDtcblx0ICAgICAgICBDWzFdID0gKENbMV0gKyAweGQzNGQzNGQzICsgKChDWzBdID4+PiAwKSA8IChDX1swXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzJdID0gKENbMl0gKyAweDM0ZDM0ZDM0ICsgKChDWzFdID4+PiAwKSA8IChDX1sxXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzNdID0gKENbM10gKyAweDRkMzRkMzRkICsgKChDWzJdID4+PiAwKSA8IChDX1syXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzRdID0gKENbNF0gKyAweGQzNGQzNGQzICsgKChDWzNdID4+PiAwKSA8IChDX1szXSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzVdID0gKENbNV0gKyAweDM0ZDM0ZDM0ICsgKChDWzRdID4+PiAwKSA8IChDX1s0XSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzZdID0gKENbNl0gKyAweDRkMzRkMzRkICsgKChDWzVdID4+PiAwKSA8IChDX1s1XSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICBDWzddID0gKENbN10gKyAweGQzNGQzNGQzICsgKChDWzZdID4+PiAwKSA8IChDX1s2XSA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICB0aGlzLl9iID0gKENbN10gPj4+IDApIDwgKENfWzddID4+PiAwKSA/IDEgOiAwO1xuXG5cdCAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBnLXZhbHVlc1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciBneCA9IFhbaV0gKyBDW2ldO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnN0cnVjdCBoaWdoIGFuZCBsb3cgYXJndW1lbnQgZm9yIHNxdWFyaW5nXG5cdCAgICAgICAgICAgIHZhciBnYSA9IGd4ICYgMHhmZmZmO1xuXHQgICAgICAgICAgICB2YXIgZ2IgPSBneCA+Pj4gMTY7XG5cblx0ICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhpZ2ggYW5kIGxvdyByZXN1bHQgb2Ygc3F1YXJpbmdcblx0ICAgICAgICAgICAgdmFyIGdoID0gKCgoKGdhICogZ2EpID4+PiAxNykgKyBnYSAqIGdiKSA+Pj4gMTUpICsgZ2IgKiBnYjtcblx0ICAgICAgICAgICAgdmFyIGdsID0gKCgoZ3ggJiAweGZmZmYwMDAwKSAqIGd4KSB8IDApICsgKCgoZ3ggJiAweDAwMDBmZmZmKSAqIGd4KSB8IDApO1xuXG5cdCAgICAgICAgICAgIC8vIEhpZ2ggWE9SIGxvd1xuXHQgICAgICAgICAgICBHW2ldID0gZ2ggXiBnbDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXRlIHZhbHVlc1xuXHQgICAgICAgIFhbMF0gPSAoR1swXSArICgoR1s3XSA8PCAxNikgfCAoR1s3XSA+Pj4gMTYpKSArICgoR1s2XSA8PCAxNikgfCAoR1s2XSA+Pj4gMTYpKSkgfCAwO1xuXHQgICAgICAgIFhbMV0gPSAoR1sxXSArICgoR1swXSA8PCA4KSAgfCAoR1swXSA+Pj4gMjQpKSArIEdbN10pIHwgMDtcblx0ICAgICAgICBYWzJdID0gKEdbMl0gKyAoKEdbMV0gPDwgMTYpIHwgKEdbMV0gPj4+IDE2KSkgKyAoKEdbMF0gPDwgMTYpIHwgKEdbMF0gPj4+IDE2KSkpIHwgMDtcblx0ICAgICAgICBYWzNdID0gKEdbM10gKyAoKEdbMl0gPDwgOCkgIHwgKEdbMl0gPj4+IDI0KSkgKyBHWzFdKSB8IDA7XG5cdCAgICAgICAgWFs0XSA9IChHWzRdICsgKChHWzNdIDw8IDE2KSB8IChHWzNdID4+PiAxNikpICsgKChHWzJdIDw8IDE2KSB8IChHWzJdID4+PiAxNikpKSB8IDA7XG5cdCAgICAgICAgWFs1XSA9IChHWzVdICsgKChHWzRdIDw8IDgpICB8IChHWzRdID4+PiAyNCkpICsgR1szXSkgfCAwO1xuXHQgICAgICAgIFhbNl0gPSAoR1s2XSArICgoR1s1XSA8PCAxNikgfCAoR1s1XSA+Pj4gMTYpKSArICgoR1s0XSA8PCAxNikgfCAoR1s0XSA+Pj4gMTYpKSkgfCAwO1xuXHQgICAgICAgIFhbN10gPSAoR1s3XSArICgoR1s2XSA8PCA4KSAgfCAoR1s2XSA+Pj4gMjQpKSArIEdbNV0pIHwgMDtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5SYWJiaXQuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SYWJiaXQuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgKi9cblx0ICAgIEMuUmFiYml0ID0gU3RyZWFtQ2lwaGVyLl9jcmVhdGVIZWxwZXIoUmFiYml0KTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5SYWJiaXQ7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/rabbit.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/rc4.js":
/*!**********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/rc4.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t /**\n\t * RC4 stream cipher algorithm.\n\t */\n\t var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\t var keySigBytes = key.sigBytes;\n\n\t // Init sbox\n\t var S = this._S = [];\n\t for (var i = 0; i < 256; i++) {\n\t S[i] = i;\n\t }\n\n\t // Key setup\n\t for (var i = 0, j = 0; i < 256; i++) {\n\t var keyByteIndex = i % keySigBytes;\n\t var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t j = (j + S[i] + keyByte) % 256;\n\n\t // Swap\n\t var t = S[i];\n\t S[i] = S[j];\n\t S[j] = t;\n\t }\n\n\t // Counters\n\t this._i = this._j = 0;\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t M[offset] ^= generateKeystreamWord.call(this);\n\t },\n\n\t keySize: 256/32,\n\n\t ivSize: 0\n\t });\n\n\t function generateKeystreamWord() {\n\t // Shortcuts\n\t var S = this._S;\n\t var i = this._i;\n\t var j = this._j;\n\n\t // Generate keystream word\n\t var keystreamWord = 0;\n\t for (var n = 0; n < 4; n++) {\n\t i = (i + 1) % 256;\n\t j = (j + S[i]) % 256;\n\n\t // Swap\n\t var t = S[i];\n\t S[i] = S[j];\n\t S[j] = t;\n\n\t keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t }\n\n\t // Update counters\n\t this._i = i;\n\t this._j = j;\n\n\t return keystreamWord;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RC4 = StreamCipher._createHelper(RC4);\n\n\t /**\n\t * Modified RC4 stream cipher algorithm.\n\t */\n\t var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} drop The number of keystream words to drop. Default 192\n\t */\n\t cfg: RC4.cfg.extend({\n\t drop: 192\n\t }),\n\n\t _doReset: function () {\n\t RC4._doReset.call(this);\n\n\t // Drop\n\t for (var i = this.cfg.drop; i > 0; i--) {\n\t generateKeystreamWord.call(this);\n\t }\n\t }\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\treturn CryptoJS.RC4;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yYzQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yYzQuanM/MmIwMCJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFN0cmVhbUNpcGhlciA9IENfbGliLlN0cmVhbUNpcGhlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8qKlxuXHQgICAgICogUkM0IHN0cmVhbSBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgUkM0ID0gQ19hbGdvLlJDNCA9IFN0cmVhbUNpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5O1xuXHQgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaWdCeXRlcyA9IGtleS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBJbml0IHNib3hcblx0ICAgICAgICAgICAgdmFyIFMgPSB0aGlzLl9TID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIFNbaV0gPSBpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gS2V5IHNldHVwXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5Qnl0ZUluZGV4ID0gaSAlIGtleVNpZ0J5dGVzO1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleUJ5dGUgPSAoa2V5V29yZHNba2V5Qnl0ZUluZGV4ID4+PiAyXSA+Pj4gKDI0IC0gKGtleUJ5dGVJbmRleCAlIDQpICogOCkpICYgMHhmZjtcblxuXHQgICAgICAgICAgICAgICAgaiA9IChqICsgU1tpXSArIGtleUJ5dGUpICUgMjU2O1xuXG5cdCAgICAgICAgICAgICAgICAvLyBTd2FwXG5cdCAgICAgICAgICAgICAgICB2YXIgdCA9IFNbaV07XG5cdCAgICAgICAgICAgICAgICBTW2ldID0gU1tqXTtcblx0ICAgICAgICAgICAgICAgIFNbal0gPSB0O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ291bnRlcnNcblx0ICAgICAgICAgICAgdGhpcy5faSA9IHRoaXMuX2ogPSAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgTVtvZmZzZXRdIF49IGdlbmVyYXRlS2V5c3RyZWFtV29yZC5jYWxsKHRoaXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAyNTYvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICBmdW5jdGlvbiBnZW5lcmF0ZUtleXN0cmVhbVdvcmQoKSB7XG5cdCAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgdmFyIFMgPSB0aGlzLl9TO1xuXHQgICAgICAgIHZhciBpID0gdGhpcy5faTtcblx0ICAgICAgICB2YXIgaiA9IHRoaXMuX2o7XG5cblx0ICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0gd29yZFxuXHQgICAgICAgIHZhciBrZXlzdHJlYW1Xb3JkID0gMDtcblx0ICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IDQ7IG4rKykge1xuXHQgICAgICAgICAgICBpID0gKGkgKyAxKSAlIDI1Njtcblx0ICAgICAgICAgICAgaiA9IChqICsgU1tpXSkgJSAyNTY7XG5cblx0ICAgICAgICAgICAgLy8gU3dhcFxuXHQgICAgICAgICAgICB2YXIgdCA9IFNbaV07XG5cdCAgICAgICAgICAgIFNbaV0gPSBTW2pdO1xuXHQgICAgICAgICAgICBTW2pdID0gdDtcblxuXHQgICAgICAgICAgICBrZXlzdHJlYW1Xb3JkIHw9IFNbKFNbaV0gKyBTW2pdKSAlIDI1Nl0gPDwgKDI0IC0gbiAqIDgpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFVwZGF0ZSBjb3VudGVyc1xuXHQgICAgICAgIHRoaXMuX2kgPSBpO1xuXHQgICAgICAgIHRoaXMuX2ogPSBqO1xuXG5cdCAgICAgICAgcmV0dXJuIGtleXN0cmVhbVdvcmQ7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuUkM0LmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuUkM0LmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLlJDNCA9IFN0cmVhbUNpcGhlci5fY3JlYXRlSGVscGVyKFJDNCk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTW9kaWZpZWQgUkM0IHN0cmVhbSBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgUkM0RHJvcCA9IENfYWxnby5SQzREcm9wID0gUkM0LmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGRyb3AgVGhlIG51bWJlciBvZiBrZXlzdHJlYW0gd29yZHMgdG8gZHJvcC4gRGVmYXVsdCAxOTJcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IFJDNC5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgZHJvcDogMTkyXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBSQzQuX2RvUmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBEcm9wXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmNmZy5kcm9wOyBpID4gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICBnZW5lcmF0ZUtleXN0cmVhbVdvcmQuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJDNERyb3AuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SQzREcm9wLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLlJDNERyb3AgPSBTdHJlYW1DaXBoZXIuX2NyZWF0ZUhlbHBlcihSQzREcm9wKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5SQzQ7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/rc4.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/ripemd160.js":
/*!****************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/ripemd160.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var _zl = WordArray.create([\n\t 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n\t 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n\t 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n\t 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n\t 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);\n\t var _zr = WordArray.create([\n\t 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n\t 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n\t 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n\t 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n\t 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);\n\t var _sl = WordArray.create([\n\t 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n\t 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n\t 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n\t 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n\t 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);\n\t var _sr = WordArray.create([\n\t 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n\t 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n\t 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n\t 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n\t 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);\n\n\t var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t /**\n\t * RIPEMD160 hash algorithm.\n\t */\n\t var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t // Swap\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\t // Shortcut\n\t var H = this._hash.words;\n\t var hl = _hl.words;\n\t var hr = _hr.words;\n\t var zl = _zl.words;\n\t var zr = _zr.words;\n\t var sl = _sl.words;\n\t var sr = _sr.words;\n\n\t // Working variables\n\t var al, bl, cl, dl, el;\n\t var ar, br, cr, dr, er;\n\n\t ar = al = H[0];\n\t br = bl = H[1];\n\t cr = cl = H[2];\n\t dr = dl = H[3];\n\t er = el = H[4];\n\t // Computation\n\t var t;\n\t for (var i = 0; i < 80; i += 1) {\n\t t = (al + M[offset+zl[i]])|0;\n\t if (i<16){\n\t\t t += f1(bl,cl,dl) + hl[0];\n\t } else if (i<32) {\n\t\t t += f2(bl,cl,dl) + hl[1];\n\t } else if (i<48) {\n\t\t t += f3(bl,cl,dl) + hl[2];\n\t } else if (i<64) {\n\t\t t += f4(bl,cl,dl) + hl[3];\n\t } else {// if (i<80) {\n\t\t t += f5(bl,cl,dl) + hl[4];\n\t }\n\t t = t|0;\n\t t = rotl(t,sl[i]);\n\t t = (t+el)|0;\n\t al = el;\n\t el = dl;\n\t dl = rotl(cl, 10);\n\t cl = bl;\n\t bl = t;\n\n\t t = (ar + M[offset+zr[i]])|0;\n\t if (i<16){\n\t\t t += f5(br,cr,dr) + hr[0];\n\t } else if (i<32) {\n\t\t t += f4(br,cr,dr) + hr[1];\n\t } else if (i<48) {\n\t\t t += f3(br,cr,dr) + hr[2];\n\t } else if (i<64) {\n\t\t t += f2(br,cr,dr) + hr[3];\n\t } else {// if (i<80) {\n\t\t t += f1(br,cr,dr) + hr[4];\n\t }\n\t t = t|0;\n\t t = rotl(t,sr[i]) ;\n\t t = (t+er)|0;\n\t ar = er;\n\t er = dr;\n\t dr = rotl(cr, 10);\n\t cr = br;\n\t br = t;\n\t }\n\t // Intermediate hash value\n\t t = (H[1] + cl + dr)|0;\n\t H[1] = (H[2] + dl + er)|0;\n\t H[2] = (H[3] + el + ar)|0;\n\t H[3] = (H[4] + al + br)|0;\n\t H[4] = (H[0] + bl + cr)|0;\n\t H[0] = t;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)\n\t );\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 5; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t // Swap\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\n\t function f1(x, y, z) {\n\t return ((x) ^ (y) ^ (z));\n\n\t }\n\n\t function f2(x, y, z) {\n\t return (((x)&(y)) | ((~x)&(z)));\n\t }\n\n\t function f3(x, y, z) {\n\t return (((x) | (~(y))) ^ (z));\n\t }\n\n\t function f4(x, y, z) {\n\t return (((x) & (z)) | ((y)&(~(z))));\n\t }\n\n\t function f5(x, y, z) {\n\t return ((x) ^ ((y) |(~(z))));\n\n\t }\n\n\t function rotl(x,n) {\n\t return (x<<n) | (x>>>(32-n));\n\t }\n\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.RIPEMD160('message');\n\t * var hash = CryptoJS.RIPEMD160(wordArray);\n\t */\n\t C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t */\n\t C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\treturn CryptoJS.RIPEMD160;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yaXBlbWQxNjAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9yaXBlbWQxNjAuanM/N2U3ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKiBAcHJlc2VydmVcblx0KGMpIDIwMTIgYnkgQ8OpZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblx0UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG5cdCAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cblx0ICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5cdFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblx0Ki9cblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBDb25zdGFudHMgdGFibGVcblx0ICAgIHZhciBfemwgPSBXb3JkQXJyYXkuY3JlYXRlKFtcblx0ICAgICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuXHQgICAgICAgIDcsICA0LCAxMywgIDEsIDEwLCAgNiwgMTUsICAzLCAxMiwgIDAsICA5LCAgNSwgIDIsIDE0LCAxMSwgIDgsXG5cdCAgICAgICAgMywgMTAsIDE0LCAgNCwgIDksIDE1LCAgOCwgIDEsICAyLCAgNywgIDAsICA2LCAxMywgMTEsICA1LCAxMixcblx0ICAgICAgICAxLCAgOSwgMTEsIDEwLCAgMCwgIDgsIDEyLCAgNCwgMTMsICAzLCAgNywgMTUsIDE0LCAgNSwgIDYsICAyLFxuXHQgICAgICAgIDQsICAwLCAgNSwgIDksICA3LCAxMiwgIDIsIDEwLCAxNCwgIDEsICAzLCAgOCwgMTEsICA2LCAxNSwgMTNdKTtcblx0ICAgIHZhciBfenIgPSBXb3JkQXJyYXkuY3JlYXRlKFtcblx0ICAgICAgICA1LCAxNCwgIDcsICAwLCAgOSwgIDIsIDExLCAgNCwgMTMsICA2LCAxNSwgIDgsICAxLCAxMCwgIDMsIDEyLFxuXHQgICAgICAgIDYsIDExLCAgMywgIDcsICAwLCAxMywgIDUsIDEwLCAxNCwgMTUsICA4LCAxMiwgIDQsICA5LCAgMSwgIDIsXG5cdCAgICAgICAgMTUsICA1LCAgMSwgIDMsICA3LCAxNCwgIDYsICA5LCAxMSwgIDgsIDEyLCAgMiwgMTAsICAwLCAgNCwgMTMsXG5cdCAgICAgICAgOCwgIDYsICA0LCAgMSwgIDMsIDExLCAxNSwgIDAsICA1LCAxMiwgIDIsIDEzLCAgOSwgIDcsIDEwLCAxNCxcblx0ICAgICAgICAxMiwgMTUsIDEwLCAgNCwgIDEsICA1LCAgOCwgIDcsICA2LCAgMiwgMTMsIDE0LCAgMCwgIDMsICA5LCAxMV0pO1xuXHQgICAgdmFyIF9zbCA9IFdvcmRBcnJheS5jcmVhdGUoW1xuXHQgICAgICAgICAxMSwgMTQsIDE1LCAxMiwgIDUsICA4LCAgNywgIDksIDExLCAxMywgMTQsIDE1LCAgNiwgIDcsICA5LCAgOCxcblx0ICAgICAgICA3LCA2LCAgIDgsIDEzLCAxMSwgIDksICA3LCAxNSwgIDcsIDEyLCAxNSwgIDksIDExLCAgNywgMTMsIDEyLFxuXHQgICAgICAgIDExLCAxMywgIDYsICA3LCAxNCwgIDksIDEzLCAxNSwgMTQsICA4LCAxMywgIDYsICA1LCAxMiwgIDcsICA1LFxuXHQgICAgICAgICAgMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgIDksICA4LCAgOSwgMTQsICA1LCAgNiwgIDgsICA2LCAgNSwgMTIsXG5cdCAgICAgICAgOSwgMTUsICA1LCAxMSwgIDYsICA4LCAxMywgMTIsICA1LCAxMiwgMTMsIDE0LCAxMSwgIDgsICA1LCAgNiBdKTtcblx0ICAgIHZhciBfc3IgPSBXb3JkQXJyYXkuY3JlYXRlKFtcblx0ICAgICAgICA4LCAgOSwgIDksIDExLCAxMywgMTUsIDE1LCAgNSwgIDcsICA3LCAgOCwgMTEsIDE0LCAxNCwgMTIsICA2LFxuXHQgICAgICAgIDksIDEzLCAxNSwgIDcsIDEyLCAgOCwgIDksIDExLCAgNywgIDcsIDEyLCAgNywgIDYsIDE1LCAxMywgMTEsXG5cdCAgICAgICAgOSwgIDcsIDE1LCAxMSwgIDgsICA2LCAgNiwgMTQsIDEyLCAxMywgIDUsIDE0LCAxMywgMTMsICA3LCAgNSxcblx0ICAgICAgICAxNSwgIDUsICA4LCAxMSwgMTQsIDE0LCAgNiwgMTQsICA2LCAgOSwgMTIsICA5LCAxMiwgIDUsIDE1LCAgOCxcblx0ICAgICAgICA4LCAgNSwgMTIsICA5LCAxMiwgIDUsIDE0LCAgNiwgIDgsIDEzLCAgNiwgIDUsIDE1LCAxMywgMTEsIDExIF0pO1xuXG5cdCAgICB2YXIgX2hsID0gIFdvcmRBcnJheS5jcmVhdGUoWyAweDAwMDAwMDAwLCAweDVBODI3OTk5LCAweDZFRDlFQkExLCAweDhGMUJCQ0RDLCAweEE5NTNGRDRFXSk7XG5cdCAgICB2YXIgX2hyID0gIFdvcmRBcnJheS5jcmVhdGUoWyAweDUwQTI4QkU2LCAweDVDNEREMTI0LCAweDZENzAzRUYzLCAweDdBNkQ3NkU5LCAweDAwMDAwMDAwXSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogUklQRU1EMTYwIGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgUklQRU1EMTYwID0gQ19hbGdvLlJJUEVNRDE2MCA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggID0gV29yZEFycmF5LmNyZWF0ZShbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3NiwgMHhDM0QyRTFGMF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblxuXHQgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIG9mZnNldF9pID0gb2Zmc2V0ICsgaTtcblx0ICAgICAgICAgICAgICAgIHZhciBNX29mZnNldF9pID0gTVtvZmZzZXRfaV07XG5cblx0ICAgICAgICAgICAgICAgIC8vIFN3YXBcblx0ICAgICAgICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE1fb2Zmc2V0X2kgPDwgOCkgIHwgKE1fb2Zmc2V0X2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCAyNCkgfCAoTV9vZmZzZXRfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIICA9IHRoaXMuX2hhc2gud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBobCA9IF9obC53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGhyID0gX2hyLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgemwgPSBfemwud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB6ciA9IF96ci53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNsID0gX3NsLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc3IgPSBfc3Iud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGFsLCBibCwgY2wsIGRsLCBlbDtcblx0ICAgICAgICAgICAgdmFyIGFyLCBiciwgY3IsIGRyLCBlcjtcblxuXHQgICAgICAgICAgICBhciA9IGFsID0gSFswXTtcblx0ICAgICAgICAgICAgYnIgPSBibCA9IEhbMV07XG5cdCAgICAgICAgICAgIGNyID0gY2wgPSBIWzJdO1xuXHQgICAgICAgICAgICBkciA9IGRsID0gSFszXTtcblx0ICAgICAgICAgICAgZXIgPSBlbCA9IEhbNF07XG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIHZhciB0O1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpICs9IDEpIHtcblx0ICAgICAgICAgICAgICAgIHQgPSAoYWwgKyAgTVtvZmZzZXQremxbaV1dKXwwO1xuXHQgICAgICAgICAgICAgICAgaWYgKGk8MTYpe1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGYxKGJsLGNsLGRsKSArIGhsWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpPDMyKSB7XG5cdFx0ICAgICAgICAgICAgdCArPSAgZjIoYmwsY2wsZGwpICsgaGxbMV07XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGk8NDgpIHtcblx0XHQgICAgICAgICAgICB0ICs9ICBmMyhibCxjbCxkbCkgKyBobFsyXTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaTw2NCkge1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGY0KGJsLGNsLGRsKSArIGhsWzNdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHsvLyBpZiAoaTw4MCkge1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGY1KGJsLGNsLGRsKSArIGhsWzRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdCA9IHR8MDtcblx0ICAgICAgICAgICAgICAgIHQgPSAgcm90bCh0LHNsW2ldKTtcblx0ICAgICAgICAgICAgICAgIHQgPSAodCtlbCl8MDtcblx0ICAgICAgICAgICAgICAgIGFsID0gZWw7XG5cdCAgICAgICAgICAgICAgICBlbCA9IGRsO1xuXHQgICAgICAgICAgICAgICAgZGwgPSByb3RsKGNsLCAxMCk7XG5cdCAgICAgICAgICAgICAgICBjbCA9IGJsO1xuXHQgICAgICAgICAgICAgICAgYmwgPSB0O1xuXG5cdCAgICAgICAgICAgICAgICB0ID0gKGFyICsgTVtvZmZzZXQrenJbaV1dKXwwO1xuXHQgICAgICAgICAgICAgICAgaWYgKGk8MTYpe1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGY1KGJyLGNyLGRyKSArIGhyWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpPDMyKSB7XG5cdFx0ICAgICAgICAgICAgdCArPSAgZjQoYnIsY3IsZHIpICsgaHJbMV07XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGk8NDgpIHtcblx0XHQgICAgICAgICAgICB0ICs9ICBmMyhicixjcixkcikgKyBoclsyXTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaTw2NCkge1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGYyKGJyLGNyLGRyKSArIGhyWzNdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHsvLyBpZiAoaTw4MCkge1xuXHRcdCAgICAgICAgICAgIHQgKz0gIGYxKGJyLGNyLGRyKSArIGhyWzRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdCA9IHR8MDtcblx0ICAgICAgICAgICAgICAgIHQgPSAgcm90bCh0LHNyW2ldKSA7XG5cdCAgICAgICAgICAgICAgICB0ID0gKHQrZXIpfDA7XG5cdCAgICAgICAgICAgICAgICBhciA9IGVyO1xuXHQgICAgICAgICAgICAgICAgZXIgPSBkcjtcblx0ICAgICAgICAgICAgICAgIGRyID0gcm90bChjciwgMTApO1xuXHQgICAgICAgICAgICAgICAgY3IgPSBicjtcblx0ICAgICAgICAgICAgICAgIGJyID0gdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICB0ICAgID0gKEhbMV0gKyBjbCArIGRyKXwwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMl0gKyBkbCArIGVyKXwwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbM10gKyBlbCArIGFyKXwwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbNF0gKyBhbCArIGJyKXwwO1xuXHQgICAgICAgICAgICBIWzRdID0gKEhbMF0gKyBibCArIGNyKXwwO1xuXHQgICAgICAgICAgICBIWzBdID0gIHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsIDw8IDgpICB8IChuQml0c1RvdGFsID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbCA8PCAyNCkgfCAobkJpdHNUb3RhbCA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSAoZGF0YVdvcmRzLmxlbmd0aCArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5faGFzaDtcblx0ICAgICAgICAgICAgdmFyIEggPSBoYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICAgICAgdmFyIEhfaSA9IEhbaV07XG5cblx0ICAgICAgICAgICAgICAgIC8vIFN3YXBcblx0ICAgICAgICAgICAgICAgIEhbaV0gPSAoKChIX2kgPDwgOCkgIHwgKEhfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblxuXHQgICAgZnVuY3Rpb24gZjEoeCwgeSwgeikge1xuXHQgICAgICAgIHJldHVybiAoKHgpIF4gKHkpIF4gKHopKTtcblxuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBmMih4LCB5LCB6KSB7XG5cdCAgICAgICAgcmV0dXJuICgoKHgpJih5KSkgfCAoKH54KSYoeikpKTtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gZjMoeCwgeSwgeikge1xuXHQgICAgICAgIHJldHVybiAoKCh4KSB8ICh+KHkpKSkgXiAoeikpO1xuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBmNCh4LCB5LCB6KSB7XG5cdCAgICAgICAgcmV0dXJuICgoKHgpICYgKHopKSB8ICgoeSkmKH4oeikpKSk7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIGY1KHgsIHksIHopIHtcblx0ICAgICAgICByZXR1cm4gKCh4KSBeICgoeSkgfCh+KHopKSkpO1xuXG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIHJvdGwoeCxuKSB7XG5cdCAgICAgICAgcmV0dXJuICh4PDxuKSB8ICh4Pj4+KDMyLW4pKTtcblx0ICAgIH1cblxuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuUklQRU1EMTYwKCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5SSVBFTUQxNjAod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5SSVBFTUQxNjAgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihSSVBFTUQxNjApO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1JJUEVNRDE2MChtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNSSVBFTUQxNjAgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoUklQRU1EMTYwKTtcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuUklQRU1EMTYwO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/ripemd160.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js":
/*!***********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGExLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvc2hhMS5qcz8xNGZhIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBSZXVzYWJsZSBvYmplY3Rcblx0ICAgIHZhciBXID0gW107XG5cblx0ICAgIC8qKlxuXHQgICAgICogU0hBLTEgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEExID0gQ19hbGdvLlNIQTEgPSBIYXNoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFtcblx0ICAgICAgICAgICAgICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksXG5cdCAgICAgICAgICAgICAgICAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LFxuXHQgICAgICAgICAgICAgICAgMHhjM2QyZTFmMFxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cdCAgICAgICAgICAgIHZhciBlID0gSFs0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMTYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBuID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gKG4gPDwgMSkgfCAobiA+Pj4gMzEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZSArIFdbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDIwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIDB4NWE4Mjc5OTk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA0MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgKyAweDZlZDllYmExO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNjApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9ICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpIC0gMHg3MGU0NDMyNDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaSA8IDgwKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSAtIDB4MzU5ZDNlMmE7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGUgPSBkO1xuXHQgICAgICAgICAgICAgICAgZCA9IGM7XG5cdCAgICAgICAgICAgICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpO1xuXHQgICAgICAgICAgICAgICAgYiA9IGE7XG5cdCAgICAgICAgICAgICAgICBhID0gdDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICAgICAgSFs0XSA9IChIWzRdICsgZSkgfCAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4O1xuXHQgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9IG5CaXRzVG90YWw7XG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBMSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTEpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTEobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBMSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEExKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEExO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha1.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha224.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha224.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./sha256 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha256.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA256 = C_algo.SHA256;\n\n\t /**\n\t * SHA-224 hash algorithm.\n\t */\n\t var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t ]);\n\t },\n\n\t _doFinalize: function () {\n\t var hash = SHA256._doFinalize.call(this);\n\n\t hash.sigBytes -= 4;\n\n\t return hash;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA224('message');\n\t * var hash = CryptoJS.SHA224(wordArray);\n\t */\n\t C.SHA224 = SHA256._createHelper(SHA224);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA224(message, key);\n\t */\n\t C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\treturn CryptoJS.SHA224;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEyMjQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEyMjQuanM/MTAzNSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMjU2XCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3NoYTI1NlwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cdCAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NjtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMjI0IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMjI0ID0gQ19hbGdvLlNIQTIyNCA9IFNIQTI1Ni5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcblx0ICAgICAgICAgICAgICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTRcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gU0hBMjU2Ll9kb0ZpbmFsaXplLmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgaGFzaC5zaWdCeXRlcyAtPSA0O1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjI0KCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyMjQod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhlbHBlcihTSEEyMjQpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTIyNChtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjI0KTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEEyMjQ7XG5cbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha224.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha256.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha256.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Initialization and round constants tables\n\t var H = [];\n\t var K = [];\n\n\t // Compute constants\n\t (function () {\n\t function isPrime(n) {\n\t var sqrtN = Math.sqrt(n);\n\t for (var factor = 2; factor <= sqrtN; factor++) {\n\t if (!(n % factor)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t function getFractionalBits(n) {\n\t return ((n - (n | 0)) * 0x100000000) | 0;\n\t }\n\n\t var n = 2;\n\t var nPrime = 0;\n\t while (nPrime < 64) {\n\t if (isPrime(n)) {\n\t if (nPrime < 8) {\n\t H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t }\n\t K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t nPrime++;\n\t }\n\n\t n++;\n\t }\n\t }());\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-256 hash algorithm.\n\t */\n\t var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init(H.slice(0));\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\t var f = H[5];\n\t var g = H[6];\n\t var h = H[7];\n\n\t // Computation\n\t for (var i = 0; i < 64; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var gamma0x = W[i - 15];\n\t var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\n\t ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t (gamma0x >>> 3);\n\n\t var gamma1x = W[i - 2];\n\t var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t (gamma1x >>> 10);\n\n\t W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t }\n\n\t var ch = (e & f) ^ (~e & g);\n\t var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\n\n\t var t1 = h + sigma1 + ch + K[i] + W[i];\n\t var t2 = sigma0 + maj;\n\n\t h = g;\n\t g = f;\n\t f = e;\n\t e = (d + t1) | 0;\n\t d = c;\n\t c = b;\n\t b = a;\n\t a = (t1 + t2) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t H[5] = (H[5] + f) | 0;\n\t H[6] = (H[6] + g) | 0;\n\t H[7] = (H[7] + h) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA256('message');\n\t * var hash = CryptoJS.SHA256(wordArray);\n\t */\n\t C.SHA256 = Hasher._createHelper(SHA256);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA256(message, key);\n\t */\n\t C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEyNTYuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEyNTYuanM/MTI0NCJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoTWF0aCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCByb3VuZCBjb25zdGFudHMgdGFibGVzXG5cdCAgICB2YXIgSCA9IFtdO1xuXHQgICAgdmFyIEsgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBjb25zdGFudHNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZnVuY3Rpb24gaXNQcmltZShuKSB7XG5cdCAgICAgICAgICAgIHZhciBzcXJ0TiA9IE1hdGguc3FydChuKTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgZmFjdG9yID0gMjsgZmFjdG9yIDw9IHNxcnROOyBmYWN0b3IrKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCEobiAlIGZhY3RvcikpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBnZXRGcmFjdGlvbmFsQml0cyhuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoKG4gLSAobiB8IDApKSAqIDB4MTAwMDAwMDAwKSB8IDA7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIG4gPSAyO1xuXHQgICAgICAgIHZhciBuUHJpbWUgPSAwO1xuXHQgICAgICAgIHdoaWxlIChuUHJpbWUgPCA2NCkge1xuXHQgICAgICAgICAgICBpZiAoaXNQcmltZShuKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKG5QcmltZSA8IDgpIHtcblx0ICAgICAgICAgICAgICAgICAgICBIW25QcmltZV0gPSBnZXRGcmFjdGlvbmFsQml0cyhNYXRoLnBvdyhuLCAxIC8gMikpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgS1tuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDMpKTtcblxuXHQgICAgICAgICAgICAgICAgblByaW1lKys7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBuKys7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0XG5cdCAgICB2YXIgVyA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0yNTYgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEEyNTYgPSBDX2FsZ28uU0hBMjU2ID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChILnNsaWNlKDApKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cdCAgICAgICAgICAgIHZhciBlID0gSFs0XTtcblx0ICAgICAgICAgICAgdmFyIGYgPSBIWzVdO1xuXHQgICAgICAgICAgICB2YXIgZyA9IEhbNl07XG5cdCAgICAgICAgICAgIHZhciBoID0gSFs3XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMTYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTB4ID0gV1tpIC0gMTVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTAgID0gKChnYW1tYTB4IDw8IDI1KSB8IChnYW1tYTB4ID4+PiA3KSkgIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2FtbWEweCA8PCAxNCkgfCAoZ2FtbWEweCA+Pj4gMTgpKSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdhbW1hMHggPj4+IDMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXggPSBXW2kgLSAyXTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWExICA9ICgoZ2FtbWExeCA8PCAxNSkgfCAoZ2FtbWExeCA+Pj4gMTcpKSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhbW1hMXggPDwgMTMpIHwgKGdhbW1hMXggPj4+IDE5KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnYW1tYTF4ID4+PiAxMCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gZ2FtbWEwICsgV1tpIC0gN10gKyBnYW1tYTEgKyBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhciBjaCAgPSAoZSAmIGYpIF4gKH5lICYgZyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFqID0gKGEgJiBiKSBeIChhICYgYykgXiAoYiAmIGMpO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgc2lnbWEwID0gKChhIDw8IDMwKSB8IChhID4+PiAyKSkgXiAoKGEgPDwgMTkpIHwgKGEgPj4+IDEzKSkgXiAoKGEgPDwgMTApIHwgKGEgPj4+IDIyKSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgc2lnbWExID0gKChlIDw8IDI2KSB8IChlID4+PiA2KSkgXiAoKGUgPDwgMjEpIHwgKGUgPj4+IDExKSkgXiAoKGUgPDwgNykgIHwgKGUgPj4+IDI1KSk7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0MSA9IGggKyBzaWdtYTEgKyBjaCArIEtbaV0gKyBXW2ldO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQyID0gc2lnbWEwICsgbWFqO1xuXG5cdCAgICAgICAgICAgICAgICBoID0gZztcblx0ICAgICAgICAgICAgICAgIGcgPSBmO1xuXHQgICAgICAgICAgICAgICAgZiA9IGU7XG5cdCAgICAgICAgICAgICAgICBlID0gKGQgKyB0MSkgfCAwO1xuXHQgICAgICAgICAgICAgICAgZCA9IGM7XG5cdCAgICAgICAgICAgICAgICBjID0gYjtcblx0ICAgICAgICAgICAgICAgIGIgPSBhO1xuXHQgICAgICAgICAgICAgICAgYSA9ICh0MSArIHQyKSB8IDA7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDtcblx0ICAgICAgICAgICAgSFs1XSA9IChIWzVdICsgZikgfCAwO1xuXHQgICAgICAgICAgICBIWzZdID0gKEhbNl0gKyBnKSB8IDA7XG5cdCAgICAgICAgICAgIEhbN10gPSAoSFs3XSArIGgpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyNTYod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEEyNTYpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTI1NihtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjU2KTtcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBMjU2O1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha256.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha3.js":
/*!***********************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha3.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./x64-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var C_algo = C.algo;\n\n\t // Constants tables\n\t var RHO_OFFSETS = [];\n\t var PI_INDEXES = [];\n\t var ROUND_CONSTANTS = [];\n\n\t // Compute Constants\n\t (function () {\n\t // Compute rho offset constants\n\t var x = 1, y = 0;\n\t for (var t = 0; t < 24; t++) {\n\t RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t var newX = y % 5;\n\t var newY = (2 * x + 3 * y) % 5;\n\t x = newX;\n\t y = newY;\n\t }\n\n\t // Compute pi index constants\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t }\n\t }\n\n\t // Compute round constants\n\t var LFSR = 0x01;\n\t for (var i = 0; i < 24; i++) {\n\t var roundConstantMsw = 0;\n\t var roundConstantLsw = 0;\n\n\t for (var j = 0; j < 7; j++) {\n\t if (LFSR & 0x01) {\n\t var bitPosition = (1 << j) - 1;\n\t if (bitPosition < 32) {\n\t roundConstantLsw ^= 1 << bitPosition;\n\t } else /* if (bitPosition >= 32) */ {\n\t roundConstantMsw ^= 1 << (bitPosition - 32);\n\t }\n\t }\n\n\t // Compute next LFSR\n\t if (LFSR & 0x80) {\n\t // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t LFSR = (LFSR << 1) ^ 0x71;\n\t } else {\n\t LFSR <<= 1;\n\t }\n\t }\n\n\t ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t }\n\t }());\n\n\t // Reusable objects for temporary values\n\t var T = [];\n\t (function () {\n\t for (var i = 0; i < 25; i++) {\n\t T[i] = X64Word.create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-3 hash algorithm.\n\t */\n\t var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} outputLength\n\t * The desired number of bits in the output hash.\n\t * Only values permitted are: 224, 256, 384, 512.\n\t * Default: 512\n\t */\n\t cfg: Hasher.cfg.extend({\n\t outputLength: 512\n\t }),\n\n\t _doReset: function () {\n\t var state = this._state = []\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = new X64Word.init();\n\t }\n\n\t this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var state = this._state;\n\t var nBlockSizeLanes = this.blockSize / 2;\n\n\t // Absorb\n\t for (var i = 0; i < nBlockSizeLanes; i++) {\n\t // Shortcuts\n\t var M2i = M[offset + 2 * i];\n\t var M2i1 = M[offset + 2 * i + 1];\n\n\t // Swap endian\n\t M2i = (\n\t (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |\n\t (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)\n\t );\n\t M2i1 = (\n\t (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Absorb message into state\n\t var lane = state[i];\n\t lane.high ^= M2i1;\n\t lane.low ^= M2i;\n\t }\n\n\t // Rounds\n\t for (var round = 0; round < 24; round++) {\n\t // Theta\n\t for (var x = 0; x < 5; x++) {\n\t // Mix column lanes\n\t var tMsw = 0, tLsw = 0;\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t tMsw ^= lane.high;\n\t tLsw ^= lane.low;\n\t }\n\n\t // Temporary values\n\t var Tx = T[x];\n\t Tx.high = tMsw;\n\t Tx.low = tLsw;\n\t }\n\t for (var x = 0; x < 5; x++) {\n\t // Shortcuts\n\t var Tx4 = T[(x + 4) % 5];\n\t var Tx1 = T[(x + 1) % 5];\n\t var Tx1Msw = Tx1.high;\n\t var Tx1Lsw = Tx1.low;\n\n\t // Mix surrounding columns\n\t var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t lane.high ^= tMsw;\n\t lane.low ^= tLsw;\n\t }\n\t }\n\n\t // Rho Pi\n\t for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t // Shortcuts\n\t var lane = state[laneIndex];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\t var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t // Rotate lanes\n\t if (rhoOffset < 32) {\n\t var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t } else /* if (rhoOffset >= 32) */ {\n\t var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t }\n\n\t // Transpose lanes\n\t var TPiLane = T[PI_INDEXES[laneIndex]];\n\t TPiLane.high = tMsw;\n\t TPiLane.low = tLsw;\n\t }\n\n\t // Rho pi at x = y = 0\n\t var T0 = T[0];\n\t var state0 = state[0];\n\t T0.high = state0.high;\n\t T0.low = state0.low;\n\n\t // Chi\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t // Shortcuts\n\t var laneIndex = x + 5 * y;\n\t var lane = state[laneIndex];\n\t var TLane = T[laneIndex];\n\t var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t // Mix rows\n\t lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);\n\t }\n\t }\n\n\t // Iota\n\t var lane = state[0];\n\t var roundConstant = ROUND_CONSTANTS[round];\n\t lane.high ^= roundConstant.high;\n\t lane.low ^= roundConstant.low;;\n\t }\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\t var blockSizeBits = this.blockSize * 32;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var state = this._state;\n\t var outputLengthBytes = this.cfg.outputLength / 8;\n\t var outputLengthLanes = outputLengthBytes / 8;\n\n\t // Squeeze\n\t var hashWords = [];\n\t for (var i = 0; i < outputLengthLanes; i++) {\n\t // Shortcuts\n\t var lane = state[i];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\n\t // Swap endian\n\t laneMsw = (\n\t (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)\n\t );\n\t laneLsw = (\n\t (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Squeeze state to retrieve hash\n\t hashWords.push(laneLsw);\n\t hashWords.push(laneMsw);\n\t }\n\n\t // Return final computed hash\n\t return new WordArray.init(hashWords, outputLengthBytes);\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\n\t var state = clone._state = this._state.slice(0);\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = state[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA3('message');\n\t * var hash = CryptoJS.SHA3(wordArray);\n\t */\n\t C.SHA3 = Hasher._createHelper(SHA3);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA3(message, key);\n\t */\n\t C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA3;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jcnlwdG8tanNAMy4xLjktMUBjcnlwdG8tanMvc2hhMy5qcz80NDIyIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi94NjQtY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi94NjQtY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uIChNYXRoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyO1xuXHQgICAgdmFyIENfeDY0ID0gQy54NjQ7XG5cdCAgICB2YXIgWDY0V29yZCA9IENfeDY0LldvcmQ7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBDb25zdGFudHMgdGFibGVzXG5cdCAgICB2YXIgUkhPX09GRlNFVFMgPSBbXTtcblx0ICAgIHZhciBQSV9JTkRFWEVTICA9IFtdO1xuXHQgICAgdmFyIFJPVU5EX0NPTlNUQU5UUyA9IFtdO1xuXG5cdCAgICAvLyBDb21wdXRlIENvbnN0YW50c1xuXHQgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBDb21wdXRlIHJobyBvZmZzZXQgY29uc3RhbnRzXG5cdCAgICAgICAgdmFyIHggPSAxLCB5ID0gMDtcblx0ICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDI0OyB0KyspIHtcblx0ICAgICAgICAgICAgUkhPX09GRlNFVFNbeCArIDUgKiB5XSA9ICgodCArIDEpICogKHQgKyAyKSAvIDIpICUgNjQ7XG5cblx0ICAgICAgICAgICAgdmFyIG5ld1ggPSB5ICUgNTtcblx0ICAgICAgICAgICAgdmFyIG5ld1kgPSAoMiAqIHggKyAzICogeSkgJSA1O1xuXHQgICAgICAgICAgICB4ID0gbmV3WDtcblx0ICAgICAgICAgICAgeSA9IG5ld1k7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gQ29tcHV0ZSBwaSBpbmRleCBjb25zdGFudHNcblx0ICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykge1xuXHQgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykge1xuXHQgICAgICAgICAgICAgICAgUElfSU5ERVhFU1t4ICsgNSAqIHldID0geSArICgoMiAqIHggKyAzICogeSkgJSA1KSAqIDU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBDb21wdXRlIHJvdW5kIGNvbnN0YW50c1xuXHQgICAgICAgIHZhciBMRlNSID0gMHgwMTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnRNc3cgPSAwO1xuXHQgICAgICAgICAgICB2YXIgcm91bmRDb25zdGFudExzdyA9IDA7XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA3OyBqKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChMRlNSICYgMHgwMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBiaXRQb3NpdGlvbiA9ICgxIDw8IGopIC0gMTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoYml0UG9zaXRpb24gPCAzMikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByb3VuZENvbnN0YW50THN3IF49IDEgPDwgYml0UG9zaXRpb247XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChiaXRQb3NpdGlvbiA+PSAzMikgKi8ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByb3VuZENvbnN0YW50TXN3IF49IDEgPDwgKGJpdFBvc2l0aW9uIC0gMzIpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IExGU1Jcblx0ICAgICAgICAgICAgICAgIGlmIChMRlNSICYgMHg4MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFByaW1pdGl2ZSBwb2x5bm9taWFsIG92ZXIgR0YoMik6IHheOCArIHheNiArIHheNSArIHheNCArIDFcblx0ICAgICAgICAgICAgICAgICAgICBMRlNSID0gKExGU1IgPDwgMSkgXiAweDcxO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBMRlNSIDw8PSAxO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgUk9VTkRfQ09OU1RBTlRTW2ldID0gWDY0V29yZC5jcmVhdGUocm91bmRDb25zdGFudE1zdywgcm91bmRDb25zdGFudExzdyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0cyBmb3IgdGVtcG9yYXJ5IHZhbHVlc1xuXHQgICAgdmFyIFQgPSBbXTtcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7XG5cdCAgICAgICAgICAgIFRbaV0gPSBYNjRXb3JkLmNyZWF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU0hBLTMgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEEzID0gQ19hbGdvLlNIQTMgPSBIYXNoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gb3V0cHV0TGVuZ3RoXG5cdCAgICAgICAgICogICBUaGUgZGVzaXJlZCBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3V0cHV0IGhhc2guXG5cdCAgICAgICAgICogICBPbmx5IHZhbHVlcyBwZXJtaXR0ZWQgYXJlOiAyMjQsIDI1NiwgMzg0LCA1MTIuXG5cdCAgICAgICAgICogICBEZWZhdWx0OiA1MTJcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEhhc2hlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgb3V0cHV0TGVuZ3RoOiA1MTJcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlID0gW11cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBzdGF0ZVtpXSA9IG5ldyBYNjRXb3JkLmluaXQoKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHRoaXMuYmxvY2tTaXplID0gKDE2MDAgLSAyICogdGhpcy5jZmcub3V0cHV0TGVuZ3RoKSAvIDMyO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuXHQgICAgICAgICAgICB2YXIgbkJsb2NrU2l6ZUxhbmVzID0gdGhpcy5ibG9ja1NpemUgLyAyO1xuXG5cdCAgICAgICAgICAgIC8vIEFic29yYlxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5CbG9ja1NpemVMYW5lczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBNMmkgID0gTVtvZmZzZXQgKyAyICogaV07XG5cdCAgICAgICAgICAgICAgICB2YXIgTTJpMSA9IE1bb2Zmc2V0ICsgMiAqIGkgKyAxXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW5cblx0ICAgICAgICAgICAgICAgIE0yaSA9IChcblx0ICAgICAgICAgICAgICAgICAgICAoKChNMmkgPDwgOCkgIHwgKE0yaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAoKChNMmkgPDwgMjQpIHwgKE0yaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICAgICAgTTJpMSA9IChcblx0ICAgICAgICAgICAgICAgICAgICAoKChNMmkxIDw8IDgpICB8IChNMmkxID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE0yaTEgPDwgMjQpIHwgKE0yaTEgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICAgICAgKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gQWJzb3JiIG1lc3NhZ2UgaW50byBzdGF0ZVxuXHQgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtpXTtcblx0ICAgICAgICAgICAgICAgIGxhbmUuaGlnaCBePSBNMmkxO1xuXHQgICAgICAgICAgICAgICAgbGFuZS5sb3cgIF49IE0yaTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFJvdW5kc1xuXHQgICAgICAgICAgICBmb3IgKHZhciByb3VuZCA9IDA7IHJvdW5kIDwgMjQ7IHJvdW5kKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFRoZXRhXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIE1peCBjb2x1bW4gbGFuZXNcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdE1zdyA9IDAsIHRMc3cgPSAwO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgNTsgeSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbeCArIDUgKiB5XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdE1zdyBePSBsYW5lLmhpZ2g7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRMc3cgXj0gbGFuZS5sb3c7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJ5IHZhbHVlc1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBUeCA9IFRbeF07XG5cdCAgICAgICAgICAgICAgICAgICAgVHguaGlnaCA9IHRNc3c7XG5cdCAgICAgICAgICAgICAgICAgICAgVHgubG93ICA9IHRMc3c7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBUeDQgPSBUWyh4ICsgNCkgJSA1XTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgVHgxID0gVFsoeCArIDEpICUgNV07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFR4MU1zdyA9IFR4MS5oaWdoO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBUeDFMc3cgPSBUeDEubG93O1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTWl4IHN1cnJvdW5kaW5nIGNvbHVtbnNcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdE1zdyA9IFR4NC5oaWdoIF4gKChUeDFNc3cgPDwgMSkgfCAoVHgxTHN3ID4+PiAzMSkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0THN3ID0gVHg0LmxvdyAgXiAoKFR4MUxzdyA8PCAxKSB8IChUeDFNc3cgPj4+IDMxKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCA1OyB5KyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVt4ICsgNSAqIHldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmhpZ2ggXj0gdE1zdztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGFuZS5sb3cgIF49IHRMc3c7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBSaG8gUGlcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGxhbmVJbmRleCA9IDE7IGxhbmVJbmRleCA8IDI1OyBsYW5lSW5kZXgrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbbGFuZUluZGV4XTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZU1zdyA9IGxhbmUuaGlnaDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZUxzdyA9IGxhbmUubG93O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByaG9PZmZzZXQgPSBSSE9fT0ZGU0VUU1tsYW5lSW5kZXhdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUm90YXRlIGxhbmVzXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHJob09mZnNldCA8IDMyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0TXN3ID0gKGxhbmVNc3cgPDwgcmhvT2Zmc2V0KSB8IChsYW5lTHN3ID4+PiAoMzIgLSByaG9PZmZzZXQpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRMc3cgPSAobGFuZUxzdyA8PCByaG9PZmZzZXQpIHwgKGxhbmVNc3cgPj4+ICgzMiAtIHJob09mZnNldCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocmhvT2Zmc2V0ID49IDMyKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0TXN3ID0gKGxhbmVMc3cgPDwgKHJob09mZnNldCAtIDMyKSkgfCAobGFuZU1zdyA+Pj4gKDY0IC0gcmhvT2Zmc2V0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0THN3ID0gKGxhbmVNc3cgPDwgKHJob09mZnNldCAtIDMyKSkgfCAobGFuZUxzdyA+Pj4gKDY0IC0gcmhvT2Zmc2V0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3NlIGxhbmVzXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFRQaUxhbmUgPSBUW1BJX0lOREVYRVNbbGFuZUluZGV4XV07XG5cdCAgICAgICAgICAgICAgICAgICAgVFBpTGFuZS5oaWdoID0gdE1zdztcblx0ICAgICAgICAgICAgICAgICAgICBUUGlMYW5lLmxvdyAgPSB0THN3O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBSaG8gcGkgYXQgeCA9IHkgPSAwXG5cdCAgICAgICAgICAgICAgICB2YXIgVDAgPSBUWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHN0YXRlMCA9IHN0YXRlWzBdO1xuXHQgICAgICAgICAgICAgICAgVDAuaGlnaCA9IHN0YXRlMC5oaWdoO1xuXHQgICAgICAgICAgICAgICAgVDAubG93ICA9IHN0YXRlMC5sb3c7XG5cblx0ICAgICAgICAgICAgICAgIC8vIENoaVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVJbmRleCA9IHggKyA1ICogeTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtsYW5lSW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVExhbmUgPSBUW2xhbmVJbmRleF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBUeDFMYW5lID0gVFsoKHggKyAxKSAlIDUpICsgNSAqIHldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVHgyTGFuZSA9IFRbKCh4ICsgMikgJSA1KSArIDUgKiB5XTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggcm93c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmhpZ2ggPSBUTGFuZS5oaWdoIF4gKH5UeDFMYW5lLmhpZ2ggJiBUeDJMYW5lLmhpZ2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmxvdyAgPSBUTGFuZS5sb3cgIF4gKH5UeDFMYW5lLmxvdyAgJiBUeDJMYW5lLmxvdyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJb3RhXG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnQgPSBST1VORF9DT05TVEFOVFNbcm91bmRdO1xuXHQgICAgICAgICAgICAgICAgbGFuZS5oaWdoIF49IHJvdW5kQ29uc3RhbnQuaGlnaDtcblx0ICAgICAgICAgICAgICAgIGxhbmUubG93ICBePSByb3VuZENvbnN0YW50Lmxvdzs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJpdHMgPSB0aGlzLmJsb2NrU2l6ZSAqIDMyO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4MSA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKE1hdGguY2VpbCgobkJpdHNMZWZ0ICsgMSkgLyBibG9ja1NpemVCaXRzKSAqIGJsb2NrU2l6ZUJpdHMpID4+PiA1KSAtIDFdIHw9IDB4ODA7XG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuXHQgICAgICAgICAgICB2YXIgb3V0cHV0TGVuZ3RoQnl0ZXMgPSB0aGlzLmNmZy5vdXRwdXRMZW5ndGggLyA4O1xuXHQgICAgICAgICAgICB2YXIgb3V0cHV0TGVuZ3RoTGFuZXMgPSBvdXRwdXRMZW5ndGhCeXRlcyAvIDg7XG5cblx0ICAgICAgICAgICAgLy8gU3F1ZWV6ZVxuXHQgICAgICAgICAgICB2YXIgaGFzaFdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0TGVuZ3RoTGFuZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlW2ldO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxhbmVNc3cgPSBsYW5lLmhpZ2g7XG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZUxzdyA9IGxhbmUubG93O1xuXG5cdCAgICAgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICAgICAgbGFuZU1zdyA9IChcblx0ICAgICAgICAgICAgICAgICAgICAoKChsYW5lTXN3IDw8IDgpICB8IChsYW5lTXN3ID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICgoKGxhbmVNc3cgPDwgMjQpIHwgKGxhbmVNc3cgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgICAgIGxhbmVMc3cgPSAoXG5cdCAgICAgICAgICAgICAgICAgICAgKCgobGFuZUxzdyA8PCA4KSAgfCAobGFuZUxzdyA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAoKChsYW5lTHN3IDw8IDI0KSB8IChsYW5lTHN3ID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgICAgICk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFNxdWVlemUgc3RhdGUgdG8gcmV0cmlldmUgaGFzaFxuXHQgICAgICAgICAgICAgICAgaGFzaFdvcmRzLnB1c2gobGFuZUxzdyk7XG5cdCAgICAgICAgICAgICAgICBoYXNoV29yZHMucHVzaChsYW5lTXN3KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQoaGFzaFdvcmRzLCBvdXRwdXRMZW5ndGhCeXRlcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IGNsb25lLl9zdGF0ZSA9IHRoaXMuX3N0YXRlLnNsaWNlKDApO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHN0YXRlW2ldID0gc3RhdGVbaV0uY2xvbmUoKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTMoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTMod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEEzID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMyk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMyhtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEEzID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTMpO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEEzO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha3.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha384.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha384.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./x64-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js\"), __webpack_require__(/*! ./sha512 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/sha512.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\t var SHA512 = C_algo.SHA512;\n\n\t /**\n\t * SHA-384 hash algorithm.\n\t */\n\t var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t ]);\n\t },\n\n\t _doFinalize: function () {\n\t var hash = SHA512._doFinalize.call(this);\n\n\t hash.sigBytes -= 16;\n\n\t return hash;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA384('message');\n\t * var hash = CryptoJS.SHA384(wordArray);\n\t */\n\t C.SHA384 = SHA512._createHelper(SHA384);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA384(message, key);\n\t */\n\t C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\treturn CryptoJS.SHA384;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEzODQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGEzODQuanM/NDVjNyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4veDY0LWNvcmVcIiksIHJlcXVpcmUoXCIuL3NoYTUxMlwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi94NjQtY29yZVwiLCBcIi4vc2hhNTEyXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfeDY0ID0gQy54NjQ7XG5cdCAgICB2YXIgWDY0V29yZCA9IENfeDY0LldvcmQ7XG5cdCAgICB2YXIgWDY0V29yZEFycmF5ID0gQ194NjQuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBTSEE1MTIgPSBDX2FsZ28uU0hBNTEyO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0zODQgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEEzODQgPSBDX2FsZ28uU0hBMzg0ID0gU0hBNTEyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBYNjRXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgpLCBuZXcgWDY0V29yZC5pbml0KDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcpLFxuXHQgICAgICAgICAgICAgICAgbmV3IFg2NFdvcmQuaW5pdCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KSwgbmV3IFg2NFdvcmQuaW5pdCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KSxcblx0ICAgICAgICAgICAgICAgIG5ldyBYNjRXb3JkLmluaXQoMHg2NzMzMjY2NywgMHhmZmMwMGIzMSksIG5ldyBYNjRXb3JkLmluaXQoMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSksXG5cdCAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcpLCBuZXcgWDY0V29yZC5pbml0KDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQpXG5cdCAgICAgICAgICAgIF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgaGFzaCA9IFNIQTUxMi5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIGhhc2guc2lnQnl0ZXMgLT0gMTY7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzODQoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTM4NCh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLlNIQTM4NCA9IFNIQTUxMi5fY3JlYXRlSGVscGVyKFNIQTM4NCk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMzg0KG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY1NIQTM4NCA9IFNIQTUxMi5fY3JlYXRlSG1hY0hlbHBlcihTSEEzODQpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTM4NDtcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha384.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/sha512.js":
/*!*************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/sha512.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./x64-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGE1MTIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy9zaGE1MTIuanM/MjVmZSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4veDY0LWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4veDY0LWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ194NjQgPSBDLng2NDtcblx0ICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDtcblx0ICAgIHZhciBYNjRXb3JkQXJyYXkgPSBDX3g2NC5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICBmdW5jdGlvbiBYNjRXb3JkX2NyZWF0ZSgpIHtcblx0ICAgICAgICByZXR1cm4gWDY0V29yZC5jcmVhdGUuYXBwbHkoWDY0V29yZCwgYXJndW1lbnRzKTtcblx0ICAgIH1cblxuXHQgICAgLy8gQ29uc3RhbnRzXG5cdCAgICB2YXIgSyA9IFtcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDQyOGEyZjk4LCAweGQ3MjhhZTIyKSwgWDY0V29yZF9jcmVhdGUoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIFg2NFdvcmRfY3JlYXRlKDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgpLCBYNjRXb3JkX2NyZWF0ZSgweDU5ZjExMWYxLCAweGI2MDVkMDE5KSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDkyM2Y4MmE0LCAweGFmMTk0ZjliKSwgWDY0V29yZF9jcmVhdGUoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIFg2NFdvcmRfY3JlYXRlKDB4MTI4MzViMDEsIDB4NDU3MDZmYmUpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMpLCBYNjRXb3JkX2NyZWF0ZSgweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDcyYmU1ZDc0LCAweGYyN2I4OTZmKSwgWDY0V29yZF9jcmVhdGUoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIFg2NFdvcmRfY3JlYXRlKDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIpLCBYNjRXb3JkX2NyZWF0ZSgweGVmYmU0Nzg2LCAweDM4NGYyNWUzKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDBmYzE5ZGM2LCAweDhiOGNkNWI1KSwgWDY0V29yZF9jcmVhdGUoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIFg2NFdvcmRfY3JlYXRlKDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQpLCBYNjRXb3JkX2NyZWF0ZSgweDc2Zjk4OGRhLCAweDgzMTE1M2I1KSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDk4M2U1MTUyLCAweGVlNjZkZmFiKSwgWDY0V29yZF9jcmVhdGUoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIFg2NFdvcmRfY3JlYXRlKDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4YzZlMDBiZjMsIDB4M2RhODhmYzIpLCBYNjRXb3JkX2NyZWF0ZSgweGQ1YTc5MTQ3LCAweDkzMGFhNzI1KSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDA2Y2E2MzUxLCAweGUwMDM4MjZmKSwgWDY0V29yZF9jcmVhdGUoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIFg2NFdvcmRfY3JlYXRlKDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQpLCBYNjRXb3JkX2NyZWF0ZSgweDUzMzgwZDEzLCAweDlkOTViM2RmKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDY1MGE3MzU0LCAweDhiYWY2M2RlKSwgWDY0V29yZF9jcmVhdGUoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIFg2NFdvcmRfY3JlYXRlKDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQpLCBYNjRXb3JkX2NyZWF0ZSgweGE4MWE2NjRiLCAweGJjNDIzMDAxKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweGMyNGI4YjcwLCAweGQwZjg5NzkxKSwgWDY0V29yZF9jcmVhdGUoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIFg2NFdvcmRfY3JlYXRlKDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTApLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEpLCBYNjRXb3JkX2NyZWF0ZSgweDEwNmFhMDcwLCAweDMyYmJkMWI4KSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDE5YTRjMTE2LCAweGI4ZDJkMGM4KSwgWDY0V29yZF9jcmVhdGUoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIFg2NFdvcmRfY3JlYXRlKDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMpLCBYNjRXb3JkX2NyZWF0ZSgweDRlZDhhYTRhLCAweGUzNDE4YWNiKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDViOWNjYTRmLCAweDc3NjNlMzczKSwgWDY0V29yZF9jcmVhdGUoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIFg2NFdvcmRfY3JlYXRlKDB4NzhhNTYzNmYsIDB4NDMxNzJmNjApLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4ODRjODc4MTQsIDB4YTFmMGFiNzIpLCBYNjRXb3JkX2NyZWF0ZSgweDhjYzcwMjA4LCAweDFhNjQzOWVjKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDkwYmVmZmZhLCAweDIzNjMxZTI4KSwgWDY0V29yZF9jcmVhdGUoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIFg2NFdvcmRfY3JlYXRlKDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMpLCBYNjRXb3JkX2NyZWF0ZSgweGQxODZiOGM3LCAweDIxYzBjMjA3KSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweGVhZGE3ZGQ2LCAweGNkZTBlYjFlKSwgWDY0V29yZF9jcmVhdGUoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIFg2NFdvcmRfY3JlYXRlKDB4MGE2MzdkYzUsIDB4YTJjODk4YTYpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUpLCBYNjRXb3JkX2NyZWF0ZSgweDFiNzEwYjM1LCAweDEzMWM0NzFiKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0KSwgWDY0V29yZF9jcmVhdGUoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksXG5cdCAgICAgICAgWDY0V29yZF9jcmVhdGUoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIFg2NFdvcmRfY3JlYXRlKDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMpLFxuXHQgICAgICAgIFg2NFdvcmRfY3JlYXRlKDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYpLCBYNjRXb3JkX2NyZWF0ZSgweDU5N2YyOTljLCAweGZjNjU3ZTJhKSxcblx0ICAgICAgICBYNjRXb3JkX2NyZWF0ZSgweDVmY2I2ZmFiLCAweDNhZDZmYWVjKSwgWDY0V29yZF9jcmVhdGUoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNylcblx0ICAgIF07XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdHNcblx0ICAgIHZhciBXID0gW107XG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykge1xuXHQgICAgICAgICAgICBXW2ldID0gWDY0V29yZF9jcmVhdGUoKTtcblx0ICAgICAgICB9XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS01MTIgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEE1MTIgPSBDX2FsZ28uU0hBNTEyID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBYNjRXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgpLCBuZXcgWDY0V29yZC5pbml0KDB4YmI2N2FlODUsIDB4ODRjYWE3M2IpLFxuXHQgICAgICAgICAgICAgICAgbmV3IFg2NFdvcmQuaW5pdCgweDNjNmVmMzcyLCAweGZlOTRmODJiKSwgbmV3IFg2NFdvcmQuaW5pdCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKSxcblx0ICAgICAgICAgICAgICAgIG5ldyBYNjRXb3JkLmluaXQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSksIG5ldyBYNjRXb3JkLmluaXQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZiksXG5cdCAgICAgICAgICAgICAgICBuZXcgWDY0V29yZC5pbml0KDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIpLCBuZXcgWDY0V29yZC5pbml0KDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkpXG5cdCAgICAgICAgICAgIF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgSDAgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgSDEgPSBIWzFdO1xuXHQgICAgICAgICAgICB2YXIgSDIgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgSDMgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgSDQgPSBIWzRdO1xuXHQgICAgICAgICAgICB2YXIgSDUgPSBIWzVdO1xuXHQgICAgICAgICAgICB2YXIgSDYgPSBIWzZdO1xuXHQgICAgICAgICAgICB2YXIgSDcgPSBIWzddO1xuXG5cdCAgICAgICAgICAgIHZhciBIMGggPSBIMC5oaWdoO1xuXHQgICAgICAgICAgICB2YXIgSDBsID0gSDAubG93O1xuXHQgICAgICAgICAgICB2YXIgSDFoID0gSDEuaGlnaDtcblx0ICAgICAgICAgICAgdmFyIEgxbCA9IEgxLmxvdztcblx0ICAgICAgICAgICAgdmFyIEgyaCA9IEgyLmhpZ2g7XG5cdCAgICAgICAgICAgIHZhciBIMmwgPSBIMi5sb3c7XG5cdCAgICAgICAgICAgIHZhciBIM2ggPSBIMy5oaWdoO1xuXHQgICAgICAgICAgICB2YXIgSDNsID0gSDMubG93O1xuXHQgICAgICAgICAgICB2YXIgSDRoID0gSDQuaGlnaDtcblx0ICAgICAgICAgICAgdmFyIEg0bCA9IEg0Lmxvdztcblx0ICAgICAgICAgICAgdmFyIEg1aCA9IEg1LmhpZ2g7XG5cdCAgICAgICAgICAgIHZhciBINWwgPSBINS5sb3c7XG5cdCAgICAgICAgICAgIHZhciBINmggPSBINi5oaWdoO1xuXHQgICAgICAgICAgICB2YXIgSDZsID0gSDYubG93O1xuXHQgICAgICAgICAgICB2YXIgSDdoID0gSDcuaGlnaDtcblx0ICAgICAgICAgICAgdmFyIEg3bCA9IEg3LmxvdztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYWggPSBIMGg7XG5cdCAgICAgICAgICAgIHZhciBhbCA9IEgwbDtcblx0ICAgICAgICAgICAgdmFyIGJoID0gSDFoO1xuXHQgICAgICAgICAgICB2YXIgYmwgPSBIMWw7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IEgyaDtcblx0ICAgICAgICAgICAgdmFyIGNsID0gSDJsO1xuXHQgICAgICAgICAgICB2YXIgZGggPSBIM2g7XG5cdCAgICAgICAgICAgIHZhciBkbCA9IEgzbDtcblx0ICAgICAgICAgICAgdmFyIGVoID0gSDRoO1xuXHQgICAgICAgICAgICB2YXIgZWwgPSBINGw7XG5cdCAgICAgICAgICAgIHZhciBmaCA9IEg1aDtcblx0ICAgICAgICAgICAgdmFyIGZsID0gSDVsO1xuXHQgICAgICAgICAgICB2YXIgZ2ggPSBINmg7XG5cdCAgICAgICAgICAgIHZhciBnbCA9IEg2bDtcblx0ICAgICAgICAgICAgdmFyIGhoID0gSDdoO1xuXHQgICAgICAgICAgICB2YXIgaGwgPSBIN2w7XG5cblx0ICAgICAgICAgICAgLy8gUm91bmRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgICAgIHZhciBXaSA9IFdbaV07XG5cblx0ICAgICAgICAgICAgICAgIC8vIEV4dGVuZCBtZXNzYWdlXG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFdpaCA9IFdpLmhpZ2ggPSBNW29mZnNldCArIGkgKiAyXSAgICAgfCAwO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBXaWwgPSBXaS5sb3cgID0gTVtvZmZzZXQgKyBpICogMiArIDFdIHwgMDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gR2FtbWEwXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMHggID0gV1tpIC0gMTVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTB4aCA9IGdhbW1hMHguaGlnaDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEweGwgPSBnYW1tYTB4Lmxvdztcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEwaCAgPSAoKGdhbW1hMHhoID4+PiAxKSB8IChnYW1tYTB4bCA8PCAzMSkpIF4gKChnYW1tYTB4aCA+Pj4gOCkgfCAoZ2FtbWEweGwgPDwgMjQpKSBeIChnYW1tYTB4aCA+Pj4gNyk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMGwgID0gKChnYW1tYTB4bCA+Pj4gMSkgfCAoZ2FtbWEweGggPDwgMzEpKSBeICgoZ2FtbWEweGwgPj4+IDgpIHwgKGdhbW1hMHhoIDw8IDI0KSkgXiAoKGdhbW1hMHhsID4+PiA3KSB8IChnYW1tYTB4aCA8PCAyNSkpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gR2FtbWExXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXggID0gV1tpIC0gMl07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXhoID0gZ2FtbWExeC5oaWdoO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTF4bCA9IGdhbW1hMXgubG93O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTFoICA9ICgoZ2FtbWExeGggPj4+IDE5KSB8IChnYW1tYTF4bCA8PCAxMykpIF4gKChnYW1tYTF4aCA8PCAzKSB8IChnYW1tYTF4bCA+Pj4gMjkpKSBeIChnYW1tYTF4aCA+Pj4gNik7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMWwgID0gKChnYW1tYTF4bCA+Pj4gMTkpIHwgKGdhbW1hMXhoIDw8IDEzKSkgXiAoKGdhbW1hMXhsIDw8IDMpIHwgKGdhbW1hMXhoID4+PiAyOSkpIF4gKChnYW1tYTF4bCA+Pj4gNikgfCAoZ2FtbWExeGggPDwgMjYpKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdbaV0gPSBnYW1tYTAgKyBXW2kgLSA3XSArIGdhbW1hMSArIFdbaSAtIDE2XVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBXaTcgID0gV1tpIC0gN107XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFdpN2ggPSBXaTcuaGlnaDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgV2k3bCA9IFdpNy5sb3c7XG5cblx0ICAgICAgICAgICAgICAgICAgICB2YXIgV2kxNiAgPSBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFdpMTZoID0gV2kxNi5oaWdoO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBXaTE2bCA9IFdpMTYubG93O1xuXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFdpbCA9IGdhbW1hMGwgKyBXaTdsO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBXaWggPSBnYW1tYTBoICsgV2k3aCArICgoV2lsID4+PiAwKSA8IChnYW1tYTBsID4+PiAwKSA/IDEgOiAwKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgV2lsID0gV2lsICsgZ2FtbWExbDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgV2loID0gV2loICsgZ2FtbWExaCArICgoV2lsID4+PiAwKSA8IChnYW1tYTFsID4+PiAwKSA/IDEgOiAwKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgV2lsID0gV2lsICsgV2kxNmw7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFdpaCA9IFdpaCArIFdpMTZoICsgKChXaWwgPj4+IDApIDwgKFdpMTZsID4+PiAwKSA/IDEgOiAwKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIFdpLmhpZ2ggPSBXaWg7XG5cdCAgICAgICAgICAgICAgICAgICAgV2kubG93ICA9IFdpbDtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdmFyIGNoaCAgPSAoZWggJiBmaCkgXiAofmVoICYgZ2gpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGNobCAgPSAoZWwgJiBmbCkgXiAofmVsICYgZ2wpO1xuXHQgICAgICAgICAgICAgICAgdmFyIG1hamggPSAoYWggJiBiaCkgXiAoYWggJiBjaCkgXiAoYmggJiBjaCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFqbCA9IChhbCAmIGJsKSBeIChhbCAmIGNsKSBeIChibCAmIGNsKTtcblxuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMGggPSAoKGFoID4+PiAyOCkgfCAoYWwgPDwgNCkpICBeICgoYWggPDwgMzApICB8IChhbCA+Pj4gMikpIF4gKChhaCA8PCAyNSkgfCAoYWwgPj4+IDcpKTtcblx0ICAgICAgICAgICAgICAgIHZhciBzaWdtYTBsID0gKChhbCA+Pj4gMjgpIHwgKGFoIDw8IDQpKSAgXiAoKGFsIDw8IDMwKSAgfCAoYWggPj4+IDIpKSBeICgoYWwgPDwgMjUpIHwgKGFoID4+PiA3KSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgc2lnbWExaCA9ICgoZWggPj4+IDE0KSB8IChlbCA8PCAxOCkpIF4gKChlaCA+Pj4gMTgpIHwgKGVsIDw8IDE0KSkgXiAoKGVoIDw8IDIzKSB8IChlbCA+Pj4gOSkpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMWwgPSAoKGVsID4+PiAxNCkgfCAoZWggPDwgMTgpKSBeICgoZWwgPj4+IDE4KSB8IChlaCA8PCAxNCkpIF4gKChlbCA8PCAyMykgfCAoZWggPj4+IDkpKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gdDEgPSBoICsgc2lnbWExICsgY2ggKyBLW2ldICsgV1tpXVxuXHQgICAgICAgICAgICAgICAgdmFyIEtpICA9IEtbaV07XG5cdCAgICAgICAgICAgICAgICB2YXIgS2loID0gS2kuaGlnaDtcblx0ICAgICAgICAgICAgICAgIHZhciBLaWwgPSBLaS5sb3c7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0MWwgPSBobCArIHNpZ21hMWw7XG5cdCAgICAgICAgICAgICAgICB2YXIgdDFoID0gaGggKyBzaWdtYTFoICsgKCh0MWwgPj4+IDApIDwgKGhsID4+PiAwKSA/IDEgOiAwKTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MWwgPSB0MWwgKyBjaGw7XG5cdCAgICAgICAgICAgICAgICB2YXIgdDFoID0gdDFoICsgY2hoICsgKCh0MWwgPj4+IDApIDwgKGNobCA+Pj4gMCkgPyAxIDogMCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgdDFsID0gdDFsICsgS2lsO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQxaCA9IHQxaCArIEtpaCArICgodDFsID4+PiAwKSA8IChLaWwgPj4+IDApID8gMSA6IDApO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQxbCA9IHQxbCArIFdpbDtcblx0ICAgICAgICAgICAgICAgIHZhciB0MWggPSB0MWggKyBXaWggKyAoKHQxbCA+Pj4gMCkgPCAoV2lsID4+PiAwKSA/IDEgOiAwKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gdDIgPSBzaWdtYTAgKyBtYWpcblx0ICAgICAgICAgICAgICAgIHZhciB0MmwgPSBzaWdtYTBsICsgbWFqbDtcblx0ICAgICAgICAgICAgICAgIHZhciB0MmggPSBzaWdtYTBoICsgbWFqaCArICgodDJsID4+PiAwKSA8IChzaWdtYTBsID4+PiAwKSA/IDEgOiAwKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHdvcmtpbmcgdmFyaWFibGVzXG5cdCAgICAgICAgICAgICAgICBoaCA9IGdoO1xuXHQgICAgICAgICAgICAgICAgaGwgPSBnbDtcblx0ICAgICAgICAgICAgICAgIGdoID0gZmg7XG5cdCAgICAgICAgICAgICAgICBnbCA9IGZsO1xuXHQgICAgICAgICAgICAgICAgZmggPSBlaDtcblx0ICAgICAgICAgICAgICAgIGZsID0gZWw7XG5cdCAgICAgICAgICAgICAgICBlbCA9IChkbCArIHQxbCkgfCAwO1xuXHQgICAgICAgICAgICAgICAgZWggPSAoZGggKyB0MWggKyAoKGVsID4+PiAwKSA8IChkbCA+Pj4gMCkgPyAxIDogMCkpIHwgMDtcblx0ICAgICAgICAgICAgICAgIGRoID0gY2g7XG5cdCAgICAgICAgICAgICAgICBkbCA9IGNsO1xuXHQgICAgICAgICAgICAgICAgY2ggPSBiaDtcblx0ICAgICAgICAgICAgICAgIGNsID0gYmw7XG5cdCAgICAgICAgICAgICAgICBiaCA9IGFoO1xuXHQgICAgICAgICAgICAgICAgYmwgPSBhbDtcblx0ICAgICAgICAgICAgICAgIGFsID0gKHQxbCArIHQybCkgfCAwO1xuXHQgICAgICAgICAgICAgICAgYWggPSAodDFoICsgdDJoICsgKChhbCA+Pj4gMCkgPCAodDFsID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSDBsID0gSDAubG93ICA9IChIMGwgKyBhbCk7XG5cdCAgICAgICAgICAgIEgwLmhpZ2ggPSAoSDBoICsgYWggKyAoKEgwbCA+Pj4gMCkgPCAoYWwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDFsID0gSDEubG93ICA9IChIMWwgKyBibCk7XG5cdCAgICAgICAgICAgIEgxLmhpZ2ggPSAoSDFoICsgYmggKyAoKEgxbCA+Pj4gMCkgPCAoYmwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDJsID0gSDIubG93ICA9IChIMmwgKyBjbCk7XG5cdCAgICAgICAgICAgIEgyLmhpZ2ggPSAoSDJoICsgY2ggKyAoKEgybCA+Pj4gMCkgPCAoY2wgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDNsID0gSDMubG93ICA9IChIM2wgKyBkbCk7XG5cdCAgICAgICAgICAgIEgzLmhpZ2ggPSAoSDNoICsgZGggKyAoKEgzbCA+Pj4gMCkgPCAoZGwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDRsID0gSDQubG93ICA9IChINGwgKyBlbCk7XG5cdCAgICAgICAgICAgIEg0LmhpZ2ggPSAoSDRoICsgZWggKyAoKEg0bCA+Pj4gMCkgPCAoZWwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDVsID0gSDUubG93ICA9IChINWwgKyBmbCk7XG5cdCAgICAgICAgICAgIEg1LmhpZ2ggPSAoSDVoICsgZmggKyAoKEg1bCA+Pj4gMCkgPCAoZmwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDZsID0gSDYubG93ICA9IChINmwgKyBnbCk7XG5cdCAgICAgICAgICAgIEg2LmhpZ2ggPSAoSDZoICsgZ2ggKyAoKEg2bCA+Pj4gMCkgPCAoZ2wgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICAgICAgSDdsID0gSDcubG93ICA9IChIN2wgKyBobCk7XG5cdCAgICAgICAgICAgIEg3LmhpZ2ggPSAoSDdoICsgaGggKyAoKEg3bCA+Pj4gMCkgPCAoaGwgPj4+IDApID8gMSA6IDApKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgMTI4KSA+Pj4gMTApIDw8IDUpICsgMzBdID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgMTI4KSA+Pj4gMTApIDw8IDUpICsgMzFdID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IGhhc2ggdG8gMzItYml0IHdvcmQgYXJyYXkgYmVmb3JlIHJldHVybmluZ1xuXHQgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2hhc2gudG9YMzIoKTtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxMDI0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTUxMignbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBNTEyKHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBNTEyID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBNTEyKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEE1MTIobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBNTEyID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTUxMik7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBNTEyO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/sha512.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/tripledes.js":
/*!****************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/tripledes.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"), __webpack_require__(/*! ./enc-base64 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/enc-base64.js\"), __webpack_require__(/*! ./md5 */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/md5.js\"), __webpack_require__(/*! ./evpkdf */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/evpkdf.js\"), __webpack_require__(/*! ./cipher-core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/cipher-core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Permuted Choice 1 constants\n\t var PC1 = [\n\t 57, 49, 41, 33, 25, 17, 9, 1,\n\t 58, 50, 42, 34, 26, 18, 10, 2,\n\t 59, 51, 43, 35, 27, 19, 11, 3,\n\t 60, 52, 44, 36, 63, 55, 47, 39,\n\t 31, 23, 15, 7, 62, 54, 46, 38,\n\t 30, 22, 14, 6, 61, 53, 45, 37,\n\t 29, 21, 13, 5, 28, 20, 12, 4\n\t ];\n\n\t // Permuted Choice 2 constants\n\t var PC2 = [\n\t 14, 17, 11, 24, 1, 5,\n\t 3, 28, 15, 6, 21, 10,\n\t 23, 19, 12, 4, 26, 8,\n\t 16, 7, 27, 20, 13, 2,\n\t 41, 52, 31, 37, 47, 55,\n\t 30, 40, 51, 45, 33, 48,\n\t 44, 49, 39, 56, 34, 53,\n\t 46, 42, 50, 36, 29, 32\n\t ];\n\n\t // Cumulative bit shift constants\n\t var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t // SBOXes and round permutation constants\n\t var SBOX_P = [\n\t {\n\t 0x0: 0x808200,\n\t 0x10000000: 0x8000,\n\t 0x20000000: 0x808002,\n\t 0x30000000: 0x2,\n\t 0x40000000: 0x200,\n\t 0x50000000: 0x808202,\n\t 0x60000000: 0x800202,\n\t 0x70000000: 0x800000,\n\t 0x80000000: 0x202,\n\t 0x90000000: 0x800200,\n\t 0xa0000000: 0x8200,\n\t 0xb0000000: 0x808000,\n\t 0xc0000000: 0x8002,\n\t 0xd0000000: 0x800002,\n\t 0xe0000000: 0x0,\n\t 0xf0000000: 0x8202,\n\t 0x8000000: 0x0,\n\t 0x18000000: 0x808202,\n\t 0x28000000: 0x8202,\n\t 0x38000000: 0x8000,\n\t 0x48000000: 0x808200,\n\t 0x58000000: 0x200,\n\t 0x68000000: 0x808002,\n\t 0x78000000: 0x2,\n\t 0x88000000: 0x800200,\n\t 0x98000000: 0x8200,\n\t 0xa8000000: 0x808000,\n\t 0xb8000000: 0x800202,\n\t 0xc8000000: 0x800002,\n\t 0xd8000000: 0x8002,\n\t 0xe8000000: 0x202,\n\t 0xf8000000: 0x800000,\n\t 0x1: 0x8000,\n\t 0x10000001: 0x2,\n\t 0x20000001: 0x808200,\n\t 0x30000001: 0x800000,\n\t 0x40000001: 0x808002,\n\t 0x50000001: 0x8200,\n\t 0x60000001: 0x200,\n\t 0x70000001: 0x800202,\n\t 0x80000001: 0x808202,\n\t 0x90000001: 0x808000,\n\t 0xa0000001: 0x800002,\n\t 0xb0000001: 0x8202,\n\t 0xc0000001: 0x202,\n\t 0xd0000001: 0x800200,\n\t 0xe0000001: 0x8002,\n\t 0xf0000001: 0x0,\n\t 0x8000001: 0x808202,\n\t 0x18000001: 0x808000,\n\t 0x28000001: 0x800000,\n\t 0x38000001: 0x200,\n\t 0x48000001: 0x8000,\n\t 0x58000001: 0x800002,\n\t 0x68000001: 0x2,\n\t 0x78000001: 0x8202,\n\t 0x88000001: 0x8002,\n\t 0x98000001: 0x800202,\n\t 0xa8000001: 0x202,\n\t 0xb8000001: 0x808200,\n\t 0xc8000001: 0x800200,\n\t 0xd8000001: 0x0,\n\t 0xe8000001: 0x8200,\n\t 0xf8000001: 0x808002\n\t },\n\t {\n\t 0x0: 0x40084010,\n\t 0x1000000: 0x4000,\n\t 0x2000000: 0x80000,\n\t 0x3000000: 0x40080010,\n\t 0x4000000: 0x40000010,\n\t 0x5000000: 0x40084000,\n\t 0x6000000: 0x40004000,\n\t 0x7000000: 0x10,\n\t 0x8000000: 0x84000,\n\t 0x9000000: 0x40004010,\n\t 0xa000000: 0x40000000,\n\t 0xb000000: 0x84010,\n\t 0xc000000: 0x80010,\n\t 0xd000000: 0x0,\n\t 0xe000000: 0x4010,\n\t 0xf000000: 0x40080000,\n\t 0x800000: 0x40004000,\n\t 0x1800000: 0x84010,\n\t 0x2800000: 0x10,\n\t 0x3800000: 0x40004010,\n\t 0x4800000: 0x40084010,\n\t 0x5800000: 0x40000000,\n\t 0x6800000: 0x80000,\n\t 0x7800000: 0x40080010,\n\t 0x8800000: 0x80010,\n\t 0x9800000: 0x0,\n\t 0xa800000: 0x4000,\n\t 0xb800000: 0x40080000,\n\t 0xc800000: 0x40000010,\n\t 0xd800000: 0x84000,\n\t 0xe800000: 0x40084000,\n\t 0xf800000: 0x4010,\n\t 0x10000000: 0x0,\n\t 0x11000000: 0x40080010,\n\t 0x12000000: 0x40004010,\n\t 0x13000000: 0x40084000,\n\t 0x14000000: 0x40080000,\n\t 0x15000000: 0x10,\n\t 0x16000000: 0x84010,\n\t 0x17000000: 0x4000,\n\t 0x18000000: 0x4010,\n\t 0x19000000: 0x80000,\n\t 0x1a000000: 0x80010,\n\t 0x1b000000: 0x40000010,\n\t 0x1c000000: 0x84000,\n\t 0x1d000000: 0x40004000,\n\t 0x1e000000: 0x40000000,\n\t 0x1f000000: 0x40084010,\n\t 0x10800000: 0x84010,\n\t 0x11800000: 0x80000,\n\t 0x12800000: 0x40080000,\n\t 0x13800000: 0x4000,\n\t 0x14800000: 0x40004000,\n\t 0x15800000: 0x40084010,\n\t 0x16800000: 0x10,\n\t 0x17800000: 0x40000000,\n\t 0x18800000: 0x40084000,\n\t 0x19800000: 0x40000010,\n\t 0x1a800000: 0x40004010,\n\t 0x1b800000: 0x80010,\n\t 0x1c800000: 0x0,\n\t 0x1d800000: 0x4010,\n\t 0x1e800000: 0x40080010,\n\t 0x1f800000: 0x84000\n\t },\n\t {\n\t 0x0: 0x104,\n\t 0x100000: 0x0,\n\t 0x200000: 0x4000100,\n\t 0x300000: 0x10104,\n\t 0x400000: 0x10004,\n\t 0x500000: 0x4000004,\n\t 0x600000: 0x4010104,\n\t 0x700000: 0x4010000,\n\t 0x800000: 0x4000000,\n\t 0x900000: 0x4010100,\n\t 0xa00000: 0x10100,\n\t 0xb00000: 0x4010004,\n\t 0xc00000: 0x4000104,\n\t 0xd00000: 0x10000,\n\t 0xe00000: 0x4,\n\t 0xf00000: 0x100,\n\t 0x80000: 0x4010100,\n\t 0x180000: 0x4010004,\n\t 0x280000: 0x0,\n\t 0x380000: 0x4000100,\n\t 0x480000: 0x4000004,\n\t 0x580000: 0x10000,\n\t 0x680000: 0x10004,\n\t 0x780000: 0x104,\n\t 0x880000: 0x4,\n\t 0x980000: 0x100,\n\t 0xa80000: 0x4010000,\n\t 0xb80000: 0x10104,\n\t 0xc80000: 0x10100,\n\t 0xd80000: 0x4000104,\n\t 0xe80000: 0x4010104,\n\t 0xf80000: 0x4000000,\n\t 0x1000000: 0x4010100,\n\t 0x1100000: 0x10004,\n\t 0x1200000: 0x10000,\n\t 0x1300000: 0x4000100,\n\t 0x1400000: 0x100,\n\t 0x1500000: 0x4010104,\n\t 0x1600000: 0x4000004,\n\t 0x1700000: 0x0,\n\t 0x1800000: 0x4000104,\n\t 0x1900000: 0x4000000,\n\t 0x1a00000: 0x4,\n\t 0x1b00000: 0x10100,\n\t 0x1c00000: 0x4010000,\n\t 0x1d00000: 0x104,\n\t 0x1e00000: 0x10104,\n\t 0x1f00000: 0x4010004,\n\t 0x1080000: 0x4000000,\n\t 0x1180000: 0x104,\n\t 0x1280000: 0x4010100,\n\t 0x1380000: 0x0,\n\t 0x1480000: 0x10004,\n\t 0x1580000: 0x4000100,\n\t 0x1680000: 0x100,\n\t 0x1780000: 0x4010004,\n\t 0x1880000: 0x10000,\n\t 0x1980000: 0x4010104,\n\t 0x1a80000: 0x10104,\n\t 0x1b80000: 0x4000004,\n\t 0x1c80000: 0x4000104,\n\t 0x1d80000: 0x4010000,\n\t 0x1e80000: 0x4,\n\t 0x1f80000: 0x10100\n\t },\n\t {\n\t 0x0: 0x80401000,\n\t 0x10000: 0x80001040,\n\t 0x20000: 0x401040,\n\t 0x30000: 0x80400000,\n\t 0x40000: 0x0,\n\t 0x50000: 0x401000,\n\t 0x60000: 0x80000040,\n\t 0x70000: 0x400040,\n\t 0x80000: 0x80000000,\n\t 0x90000: 0x400000,\n\t 0xa0000: 0x40,\n\t 0xb0000: 0x80001000,\n\t 0xc0000: 0x80400040,\n\t 0xd0000: 0x1040,\n\t 0xe0000: 0x1000,\n\t 0xf0000: 0x80401040,\n\t 0x8000: 0x80001040,\n\t 0x18000: 0x40,\n\t 0x28000: 0x80400040,\n\t 0x38000: 0x80001000,\n\t 0x48000: 0x401000,\n\t 0x58000: 0x80401040,\n\t 0x68000: 0x0,\n\t 0x78000: 0x80400000,\n\t 0x88000: 0x1000,\n\t 0x98000: 0x80401000,\n\t 0xa8000: 0x400000,\n\t 0xb8000: 0x1040,\n\t 0xc8000: 0x80000000,\n\t 0xd8000: 0x400040,\n\t 0xe8000: 0x401040,\n\t 0xf8000: 0x80000040,\n\t 0x100000: 0x400040,\n\t 0x110000: 0x401000,\n\t 0x120000: 0x80000040,\n\t 0x130000: 0x0,\n\t 0x140000: 0x1040,\n\t 0x150000: 0x80400040,\n\t 0x160000: 0x80401000,\n\t 0x170000: 0x80001040,\n\t 0x180000: 0x80401040,\n\t 0x190000: 0x80000000,\n\t 0x1a0000: 0x80400000,\n\t 0x1b0000: 0x401040,\n\t 0x1c0000: 0x80001000,\n\t 0x1d0000: 0x400000,\n\t 0x1e0000: 0x40,\n\t 0x1f0000: 0x1000,\n\t 0x108000: 0x80400000,\n\t 0x118000: 0x80401040,\n\t 0x128000: 0x0,\n\t 0x138000: 0x401000,\n\t 0x148000: 0x400040,\n\t 0x158000: 0x80000000,\n\t 0x168000: 0x80001040,\n\t 0x178000: 0x40,\n\t 0x188000: 0x80000040,\n\t 0x198000: 0x1000,\n\t 0x1a8000: 0x80001000,\n\t 0x1b8000: 0x80400040,\n\t 0x1c8000: 0x1040,\n\t 0x1d8000: 0x80401000,\n\t 0x1e8000: 0x400000,\n\t 0x1f8000: 0x401040\n\t },\n\t {\n\t 0x0: 0x80,\n\t 0x1000: 0x1040000,\n\t 0x2000: 0x40000,\n\t 0x3000: 0x20000000,\n\t 0x4000: 0x20040080,\n\t 0x5000: 0x1000080,\n\t 0x6000: 0x21000080,\n\t 0x7000: 0x40080,\n\t 0x8000: 0x1000000,\n\t 0x9000: 0x20040000,\n\t 0xa000: 0x20000080,\n\t 0xb000: 0x21040080,\n\t 0xc000: 0x21040000,\n\t 0xd000: 0x0,\n\t 0xe000: 0x1040080,\n\t 0xf000: 0x21000000,\n\t 0x800: 0x1040080,\n\t 0x1800: 0x21000080,\n\t 0x2800: 0x80,\n\t 0x3800: 0x1040000,\n\t 0x4800: 0x40000,\n\t 0x5800: 0x20040080,\n\t 0x6800: 0x21040000,\n\t 0x7800: 0x20000000,\n\t 0x8800: 0x20040000,\n\t 0x9800: 0x0,\n\t 0xa800: 0x21040080,\n\t 0xb800: 0x1000080,\n\t 0xc800: 0x20000080,\n\t 0xd800: 0x21000000,\n\t 0xe800: 0x1000000,\n\t 0xf800: 0x40080,\n\t 0x10000: 0x40000,\n\t 0x11000: 0x80,\n\t 0x12000: 0x20000000,\n\t 0x13000: 0x21000080,\n\t 0x14000: 0x1000080,\n\t 0x15000: 0x21040000,\n\t 0x16000: 0x20040080,\n\t 0x17000: 0x1000000,\n\t 0x18000: 0x21040080,\n\t 0x19000: 0x21000000,\n\t 0x1a000: 0x1040000,\n\t 0x1b000: 0x20040000,\n\t 0x1c000: 0x40080,\n\t 0x1d000: 0x20000080,\n\t 0x1e000: 0x0,\n\t 0x1f000: 0x1040080,\n\t 0x10800: 0x21000080,\n\t 0x11800: 0x1000000,\n\t 0x12800: 0x1040000,\n\t 0x13800: 0x20040080,\n\t 0x14800: 0x20000000,\n\t 0x15800: 0x1040080,\n\t 0x16800: 0x80,\n\t 0x17800: 0x21040000,\n\t 0x18800: 0x40080,\n\t 0x19800: 0x21040080,\n\t 0x1a800: 0x0,\n\t 0x1b800: 0x21000000,\n\t 0x1c800: 0x1000080,\n\t 0x1d800: 0x40000,\n\t 0x1e800: 0x20040000,\n\t 0x1f800: 0x20000080\n\t },\n\t {\n\t 0x0: 0x10000008,\n\t 0x100: 0x2000,\n\t 0x200: 0x10200000,\n\t 0x300: 0x10202008,\n\t 0x400: 0x10002000,\n\t 0x500: 0x200000,\n\t 0x600: 0x200008,\n\t 0x700: 0x10000000,\n\t 0x800: 0x0,\n\t 0x900: 0x10002008,\n\t 0xa00: 0x202000,\n\t 0xb00: 0x8,\n\t 0xc00: 0x10200008,\n\t 0xd00: 0x202008,\n\t 0xe00: 0x2008,\n\t 0xf00: 0x10202000,\n\t 0x80: 0x10200000,\n\t 0x180: 0x10202008,\n\t 0x280: 0x8,\n\t 0x380: 0x200000,\n\t 0x480: 0x202008,\n\t 0x580: 0x10000008,\n\t 0x680: 0x10002000,\n\t 0x780: 0x2008,\n\t 0x880: 0x200008,\n\t 0x980: 0x2000,\n\t 0xa80: 0x10002008,\n\t 0xb80: 0x10200008,\n\t 0xc80: 0x0,\n\t 0xd80: 0x10202000,\n\t 0xe80: 0x202000,\n\t 0xf80: 0x10000000,\n\t 0x1000: 0x10002000,\n\t 0x1100: 0x10200008,\n\t 0x1200: 0x10202008,\n\t 0x1300: 0x2008,\n\t 0x1400: 0x200000,\n\t 0x1500: 0x10000000,\n\t 0x1600: 0x10000008,\n\t 0x1700: 0x202000,\n\t 0x1800: 0x202008,\n\t 0x1900: 0x0,\n\t 0x1a00: 0x8,\n\t 0x1b00: 0x10200000,\n\t 0x1c00: 0x2000,\n\t 0x1d00: 0x10002008,\n\t 0x1e00: 0x10202000,\n\t 0x1f00: 0x200008,\n\t 0x1080: 0x8,\n\t 0x1180: 0x202000,\n\t 0x1280: 0x200000,\n\t 0x1380: 0x10000008,\n\t 0x1480: 0x10002000,\n\t 0x1580: 0x2008,\n\t 0x1680: 0x10202008,\n\t 0x1780: 0x10200000,\n\t 0x1880: 0x10202000,\n\t 0x1980: 0x10200008,\n\t 0x1a80: 0x2000,\n\t 0x1b80: 0x202008,\n\t 0x1c80: 0x200008,\n\t 0x1d80: 0x0,\n\t 0x1e80: 0x10000000,\n\t 0x1f80: 0x10002008\n\t },\n\t {\n\t 0x0: 0x100000,\n\t 0x10: 0x2000401,\n\t 0x20: 0x400,\n\t 0x30: 0x100401,\n\t 0x40: 0x2100401,\n\t 0x50: 0x0,\n\t 0x60: 0x1,\n\t 0x70: 0x2100001,\n\t 0x80: 0x2000400,\n\t 0x90: 0x100001,\n\t 0xa0: 0x2000001,\n\t 0xb0: 0x2100400,\n\t 0xc0: 0x2100000,\n\t 0xd0: 0x401,\n\t 0xe0: 0x100400,\n\t 0xf0: 0x2000000,\n\t 0x8: 0x2100001,\n\t 0x18: 0x0,\n\t 0x28: 0x2000401,\n\t 0x38: 0x2100400,\n\t 0x48: 0x100000,\n\t 0x58: 0x2000001,\n\t 0x68: 0x2000000,\n\t 0x78: 0x401,\n\t 0x88: 0x100401,\n\t 0x98: 0x2000400,\n\t 0xa8: 0x2100000,\n\t 0xb8: 0x100001,\n\t 0xc8: 0x400,\n\t 0xd8: 0x2100401,\n\t 0xe8: 0x1,\n\t 0xf8: 0x100400,\n\t 0x100: 0x2000000,\n\t 0x110: 0x100000,\n\t 0x120: 0x2000401,\n\t 0x130: 0x2100001,\n\t 0x140: 0x100001,\n\t 0x150: 0x2000400,\n\t 0x160: 0x2100400,\n\t 0x170: 0x100401,\n\t 0x180: 0x401,\n\t 0x190: 0x2100401,\n\t 0x1a0: 0x100400,\n\t 0x1b0: 0x1,\n\t 0x1c0: 0x0,\n\t 0x1d0: 0x2100000,\n\t 0x1e0: 0x2000001,\n\t 0x1f0: 0x400,\n\t 0x108: 0x100400,\n\t 0x118: 0x2000401,\n\t 0x128: 0x2100001,\n\t 0x138: 0x1,\n\t 0x148: 0x2000000,\n\t 0x158: 0x100000,\n\t 0x168: 0x401,\n\t 0x178: 0x2100400,\n\t 0x188: 0x2000001,\n\t 0x198: 0x2100000,\n\t 0x1a8: 0x0,\n\t 0x1b8: 0x2100401,\n\t 0x1c8: 0x100401,\n\t 0x1d8: 0x400,\n\t 0x1e8: 0x2000400,\n\t 0x1f8: 0x100001\n\t },\n\t {\n\t 0x0: 0x8000820,\n\t 0x1: 0x20000,\n\t 0x2: 0x8000000,\n\t 0x3: 0x20,\n\t 0x4: 0x20020,\n\t 0x5: 0x8020820,\n\t 0x6: 0x8020800,\n\t 0x7: 0x800,\n\t 0x8: 0x8020000,\n\t 0x9: 0x8000800,\n\t 0xa: 0x20800,\n\t 0xb: 0x8020020,\n\t 0xc: 0x820,\n\t 0xd: 0x0,\n\t 0xe: 0x8000020,\n\t 0xf: 0x20820,\n\t 0x80000000: 0x800,\n\t 0x80000001: 0x8020820,\n\t 0x80000002: 0x8000820,\n\t 0x80000003: 0x8000000,\n\t 0x80000004: 0x8020000,\n\t 0x80000005: 0x20800,\n\t 0x80000006: 0x20820,\n\t 0x80000007: 0x20,\n\t 0x80000008: 0x8000020,\n\t 0x80000009: 0x820,\n\t 0x8000000a: 0x20020,\n\t 0x8000000b: 0x8020800,\n\t 0x8000000c: 0x0,\n\t 0x8000000d: 0x8020020,\n\t 0x8000000e: 0x8000800,\n\t 0x8000000f: 0x20000,\n\t 0x10: 0x20820,\n\t 0x11: 0x8020800,\n\t 0x12: 0x20,\n\t 0x13: 0x800,\n\t 0x14: 0x8000800,\n\t 0x15: 0x8000020,\n\t 0x16: 0x8020020,\n\t 0x17: 0x20000,\n\t 0x18: 0x0,\n\t 0x19: 0x20020,\n\t 0x1a: 0x8020000,\n\t 0x1b: 0x8000820,\n\t 0x1c: 0x8020820,\n\t 0x1d: 0x20800,\n\t 0x1e: 0x820,\n\t 0x1f: 0x8000000,\n\t 0x80000010: 0x20000,\n\t 0x80000011: 0x800,\n\t 0x80000012: 0x8020020,\n\t 0x80000013: 0x20820,\n\t 0x80000014: 0x20,\n\t 0x80000015: 0x8020000,\n\t 0x80000016: 0x8000000,\n\t 0x80000017: 0x8000820,\n\t 0x80000018: 0x8020820,\n\t 0x80000019: 0x8000020,\n\t 0x8000001a: 0x8000800,\n\t 0x8000001b: 0x0,\n\t 0x8000001c: 0x20800,\n\t 0x8000001d: 0x820,\n\t 0x8000001e: 0x20020,\n\t 0x8000001f: 0x8020800\n\t }\n\t ];\n\n\t // Masks that select the SBOX input\n\t var SBOX_MASK = [\n\t 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t ];\n\n\t /**\n\t * DES block cipher algorithm.\n\t */\n\t var DES = C_algo.DES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\n\t // Select 56 bits according to PC1\n\t var keyBits = [];\n\t for (var i = 0; i < 56; i++) {\n\t var keyBitPos = PC1[i] - 1;\n\t keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t }\n\n\t // Assemble 16 subkeys\n\t var subKeys = this._subKeys = [];\n\t for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t // Create subkey\n\t var subKey = subKeys[nSubKey] = [];\n\n\t // Shortcut\n\t var bitShift = BIT_SHIFTS[nSubKey];\n\n\t // Select 48 bits according to PC2\n\t for (var i = 0; i < 24; i++) {\n\t // Select from the left 28 key bits\n\t subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t // Select from the right 28 key bits\n\t subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t }\n\n\t // Since each subkey is applied to an expanded 32-bit input,\n\t // the subkey can be broken into 8 values scaled to 32-bits,\n\t // which allows the key to be used without expansion\n\t subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t for (var i = 1; i < 7; i++) {\n\t subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t }\n\t subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t }\n\n\t // Compute inverse subkeys\n\t var invSubKeys = this._invSubKeys = [];\n\t for (var i = 0; i < 16; i++) {\n\t invSubKeys[i] = subKeys[15 - i];\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._subKeys);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._invSubKeys);\n\t },\n\n\t _doCryptBlock: function (M, offset, subKeys) {\n\t // Get input\n\t this._lBlock = M[offset];\n\t this._rBlock = M[offset + 1];\n\n\t // Initial permutation\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeLR.call(this, 1, 0x55555555);\n\n\t // Rounds\n\t for (var round = 0; round < 16; round++) {\n\t // Shortcuts\n\t var subKey = subKeys[round];\n\t var lBlock = this._lBlock;\n\t var rBlock = this._rBlock;\n\n\t // Feistel function\n\t var f = 0;\n\t for (var i = 0; i < 8; i++) {\n\t f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t }\n\t this._lBlock = rBlock;\n\t this._rBlock = lBlock ^ f;\n\t }\n\n\t // Undo swap from last round\n\t var t = this._lBlock;\n\t this._lBlock = this._rBlock;\n\t this._rBlock = t;\n\n\t // Final permutation\n\t exchangeLR.call(this, 1, 0x55555555);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\n\t // Set output\n\t M[offset] = this._lBlock;\n\t M[offset + 1] = this._rBlock;\n\t },\n\n\t keySize: 64/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t // Swap bits across the left and right words\n\t function exchangeLR(offset, mask) {\n\t var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t this._rBlock ^= t;\n\t this._lBlock ^= t << offset;\n\t }\n\n\t function exchangeRL(offset, mask) {\n\t var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t this._lBlock ^= t;\n\t this._rBlock ^= t << offset;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.DES = BlockCipher._createHelper(DES);\n\n\t /**\n\t * Triple-DES block cipher algorithm.\n\t */\n\t var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\n\t // Create DES instances\n\t this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));\n\t this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));\n\t this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._des1.encryptBlock(M, offset);\n\t this._des2.decryptBlock(M, offset);\n\t this._des3.encryptBlock(M, offset);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._des3.decryptBlock(M, offset);\n\t this._des2.encryptBlock(M, offset);\n\t this._des1.decryptBlock(M, offset);\n\t },\n\n\t keySize: 192/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\treturn CryptoJS.TripleDES;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy90cmlwbGVkZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy90cmlwbGVkZXMuanM/YmJjYyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUGVybXV0ZWQgQ2hvaWNlIDEgY29uc3RhbnRzXG5cdCAgICB2YXIgUEMxID0gW1xuXHQgICAgICAgIDU3LCA0OSwgNDEsIDMzLCAyNSwgMTcsIDksICAxLFxuXHQgICAgICAgIDU4LCA1MCwgNDIsIDM0LCAyNiwgMTgsIDEwLCAyLFxuXHQgICAgICAgIDU5LCA1MSwgNDMsIDM1LCAyNywgMTksIDExLCAzLFxuXHQgICAgICAgIDYwLCA1MiwgNDQsIDM2LCA2MywgNTUsIDQ3LCAzOSxcblx0ICAgICAgICAzMSwgMjMsIDE1LCA3LCAgNjIsIDU0LCA0NiwgMzgsXG5cdCAgICAgICAgMzAsIDIyLCAxNCwgNiwgIDYxLCA1MywgNDUsIDM3LFxuXHQgICAgICAgIDI5LCAyMSwgMTMsIDUsICAyOCwgMjAsIDEyLCA0XG5cdCAgICBdO1xuXG5cdCAgICAvLyBQZXJtdXRlZCBDaG9pY2UgMiBjb25zdGFudHNcblx0ICAgIHZhciBQQzIgPSBbXG5cdCAgICAgICAgMTQsIDE3LCAxMSwgMjQsIDEsICA1LFxuXHQgICAgICAgIDMsICAyOCwgMTUsIDYsICAyMSwgMTAsXG5cdCAgICAgICAgMjMsIDE5LCAxMiwgNCwgIDI2LCA4LFxuXHQgICAgICAgIDE2LCA3LCAgMjcsIDIwLCAxMywgMixcblx0ICAgICAgICA0MSwgNTIsIDMxLCAzNywgNDcsIDU1LFxuXHQgICAgICAgIDMwLCA0MCwgNTEsIDQ1LCAzMywgNDgsXG5cdCAgICAgICAgNDQsIDQ5LCAzOSwgNTYsIDM0LCA1Myxcblx0ICAgICAgICA0NiwgNDIsIDUwLCAzNiwgMjksIDMyXG5cdCAgICBdO1xuXG5cdCAgICAvLyBDdW11bGF0aXZlIGJpdCBzaGlmdCBjb25zdGFudHNcblx0ICAgIHZhciBCSVRfU0hJRlRTID0gWzEsICAyLCAgNCwgIDYsICA4LCAgMTAsIDEyLCAxNCwgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI4XTtcblxuXHQgICAgLy8gU0JPWGVzIGFuZCByb3VuZCBwZXJtdXRhdGlvbiBjb25zdGFudHNcblx0ICAgIHZhciBTQk9YX1AgPSBbXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4ODA4MjAwLFxuXHQgICAgICAgICAgICAweDEwMDAwMDAwOiAweDgwMDAsXG5cdCAgICAgICAgICAgIDB4MjAwMDAwMDA6IDB4ODA4MDAyLFxuXHQgICAgICAgICAgICAweDMwMDAwMDAwOiAweDIsXG5cdCAgICAgICAgICAgIDB4NDAwMDAwMDA6IDB4MjAwLFxuXHQgICAgICAgICAgICAweDUwMDAwMDAwOiAweDgwODIwMixcblx0ICAgICAgICAgICAgMHg2MDAwMDAwMDogMHg4MDAyMDIsXG5cdCAgICAgICAgICAgIDB4NzAwMDAwMDA6IDB4ODAwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDAwOiAweDIwMixcblx0ICAgICAgICAgICAgMHg5MDAwMDAwMDogMHg4MDAyMDAsXG5cdCAgICAgICAgICAgIDB4YTAwMDAwMDA6IDB4ODIwMCxcblx0ICAgICAgICAgICAgMHhiMDAwMDAwMDogMHg4MDgwMDAsXG5cdCAgICAgICAgICAgIDB4YzAwMDAwMDA6IDB4ODAwMixcblx0ICAgICAgICAgICAgMHhkMDAwMDAwMDogMHg4MDAwMDIsXG5cdCAgICAgICAgICAgIDB4ZTAwMDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHhmMDAwMDAwMDogMHg4MjAyLFxuXHQgICAgICAgICAgICAweDgwMDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxODAwMDAwMDogMHg4MDgyMDIsXG5cdCAgICAgICAgICAgIDB4MjgwMDAwMDA6IDB4ODIwMixcblx0ICAgICAgICAgICAgMHgzODAwMDAwMDogMHg4MDAwLFxuXHQgICAgICAgICAgICAweDQ4MDAwMDAwOiAweDgwODIwMCxcblx0ICAgICAgICAgICAgMHg1ODAwMDAwMDogMHgyMDAsXG5cdCAgICAgICAgICAgIDB4NjgwMDAwMDA6IDB4ODA4MDAyLFxuXHQgICAgICAgICAgICAweDc4MDAwMDAwOiAweDIsXG5cdCAgICAgICAgICAgIDB4ODgwMDAwMDA6IDB4ODAwMjAwLFxuXHQgICAgICAgICAgICAweDk4MDAwMDAwOiAweDgyMDAsXG5cdCAgICAgICAgICAgIDB4YTgwMDAwMDA6IDB4ODA4MDAwLFxuXHQgICAgICAgICAgICAweGI4MDAwMDAwOiAweDgwMDIwMixcblx0ICAgICAgICAgICAgMHhjODAwMDAwMDogMHg4MDAwMDIsXG5cdCAgICAgICAgICAgIDB4ZDgwMDAwMDA6IDB4ODAwMixcblx0ICAgICAgICAgICAgMHhlODAwMDAwMDogMHgyMDIsXG5cdCAgICAgICAgICAgIDB4ZjgwMDAwMDA6IDB4ODAwMDAwLFxuXHQgICAgICAgICAgICAweDE6IDB4ODAwMCxcblx0ICAgICAgICAgICAgMHgxMDAwMDAwMTogMHgyLFxuXHQgICAgICAgICAgICAweDIwMDAwMDAxOiAweDgwODIwMCxcblx0ICAgICAgICAgICAgMHgzMDAwMDAwMTogMHg4MDAwMDAsXG5cdCAgICAgICAgICAgIDB4NDAwMDAwMDE6IDB4ODA4MDAyLFxuXHQgICAgICAgICAgICAweDUwMDAwMDAxOiAweDgyMDAsXG5cdCAgICAgICAgICAgIDB4NjAwMDAwMDE6IDB4MjAwLFxuXHQgICAgICAgICAgICAweDcwMDAwMDAxOiAweDgwMDIwMixcblx0ICAgICAgICAgICAgMHg4MDAwMDAwMTogMHg4MDgyMDIsXG5cdCAgICAgICAgICAgIDB4OTAwMDAwMDE6IDB4ODA4MDAwLFxuXHQgICAgICAgICAgICAweGEwMDAwMDAxOiAweDgwMDAwMixcblx0ICAgICAgICAgICAgMHhiMDAwMDAwMTogMHg4MjAyLFxuXHQgICAgICAgICAgICAweGMwMDAwMDAxOiAweDIwMixcblx0ICAgICAgICAgICAgMHhkMDAwMDAwMTogMHg4MDAyMDAsXG5cdCAgICAgICAgICAgIDB4ZTAwMDAwMDE6IDB4ODAwMixcblx0ICAgICAgICAgICAgMHhmMDAwMDAwMTogMHgwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDE6IDB4ODA4MjAyLFxuXHQgICAgICAgICAgICAweDE4MDAwMDAxOiAweDgwODAwMCxcblx0ICAgICAgICAgICAgMHgyODAwMDAwMTogMHg4MDAwMDAsXG5cdCAgICAgICAgICAgIDB4MzgwMDAwMDE6IDB4MjAwLFxuXHQgICAgICAgICAgICAweDQ4MDAwMDAxOiAweDgwMDAsXG5cdCAgICAgICAgICAgIDB4NTgwMDAwMDE6IDB4ODAwMDAyLFxuXHQgICAgICAgICAgICAweDY4MDAwMDAxOiAweDIsXG5cdCAgICAgICAgICAgIDB4NzgwMDAwMDE6IDB4ODIwMixcblx0ICAgICAgICAgICAgMHg4ODAwMDAwMTogMHg4MDAyLFxuXHQgICAgICAgICAgICAweDk4MDAwMDAxOiAweDgwMDIwMixcblx0ICAgICAgICAgICAgMHhhODAwMDAwMTogMHgyMDIsXG5cdCAgICAgICAgICAgIDB4YjgwMDAwMDE6IDB4ODA4MjAwLFxuXHQgICAgICAgICAgICAweGM4MDAwMDAxOiAweDgwMDIwMCxcblx0ICAgICAgICAgICAgMHhkODAwMDAwMTogMHgwLFxuXHQgICAgICAgICAgICAweGU4MDAwMDAxOiAweDgyMDAsXG5cdCAgICAgICAgICAgIDB4ZjgwMDAwMDE6IDB4ODA4MDAyXG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIDB4MDogMHg0MDA4NDAxMCxcblx0ICAgICAgICAgICAgMHgxMDAwMDAwOiAweDQwMDAsXG5cdCAgICAgICAgICAgIDB4MjAwMDAwMDogMHg4MDAwMCxcblx0ICAgICAgICAgICAgMHgzMDAwMDAwOiAweDQwMDgwMDEwLFxuXHQgICAgICAgICAgICAweDQwMDAwMDA6IDB4NDAwMDAwMTAsXG5cdCAgICAgICAgICAgIDB4NTAwMDAwMDogMHg0MDA4NDAwMCxcblx0ICAgICAgICAgICAgMHg2MDAwMDAwOiAweDQwMDA0MDAwLFxuXHQgICAgICAgICAgICAweDcwMDAwMDA6IDB4MTAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDogMHg4NDAwMCxcblx0ICAgICAgICAgICAgMHg5MDAwMDAwOiAweDQwMDA0MDEwLFxuXHQgICAgICAgICAgICAweGEwMDAwMDA6IDB4NDAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4YjAwMDAwMDogMHg4NDAxMCxcblx0ICAgICAgICAgICAgMHhjMDAwMDAwOiAweDgwMDEwLFxuXHQgICAgICAgICAgICAweGQwMDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHhlMDAwMDAwOiAweDQwMTAsXG5cdCAgICAgICAgICAgIDB4ZjAwMDAwMDogMHg0MDA4MDAwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDA6IDB4NDAwMDQwMDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwMDogMHg4NDAxMCxcblx0ICAgICAgICAgICAgMHgyODAwMDAwOiAweDEwLFxuXHQgICAgICAgICAgICAweDM4MDAwMDA6IDB4NDAwMDQwMTAsXG5cdCAgICAgICAgICAgIDB4NDgwMDAwMDogMHg0MDA4NDAxMCxcblx0ICAgICAgICAgICAgMHg1ODAwMDAwOiAweDQwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDY4MDAwMDA6IDB4ODAwMDAsXG5cdCAgICAgICAgICAgIDB4NzgwMDAwMDogMHg0MDA4MDAxMCxcblx0ICAgICAgICAgICAgMHg4ODAwMDAwOiAweDgwMDEwLFxuXHQgICAgICAgICAgICAweDk4MDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHhhODAwMDAwOiAweDQwMDAsXG5cdCAgICAgICAgICAgIDB4YjgwMDAwMDogMHg0MDA4MDAwMCxcblx0ICAgICAgICAgICAgMHhjODAwMDAwOiAweDQwMDAwMDEwLFxuXHQgICAgICAgICAgICAweGQ4MDAwMDA6IDB4ODQwMDAsXG5cdCAgICAgICAgICAgIDB4ZTgwMDAwMDogMHg0MDA4NDAwMCxcblx0ICAgICAgICAgICAgMHhmODAwMDAwOiAweDQwMTAsXG5cdCAgICAgICAgICAgIDB4MTAwMDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxMTAwMDAwMDogMHg0MDA4MDAxMCxcblx0ICAgICAgICAgICAgMHgxMjAwMDAwMDogMHg0MDAwNDAxMCxcblx0ICAgICAgICAgICAgMHgxMzAwMDAwMDogMHg0MDA4NDAwMCxcblx0ICAgICAgICAgICAgMHgxNDAwMDAwMDogMHg0MDA4MDAwMCxcblx0ICAgICAgICAgICAgMHgxNTAwMDAwMDogMHgxMCxcblx0ICAgICAgICAgICAgMHgxNjAwMDAwMDogMHg4NDAxMCxcblx0ICAgICAgICAgICAgMHgxNzAwMDAwMDogMHg0MDAwLFxuXHQgICAgICAgICAgICAweDE4MDAwMDAwOiAweDQwMTAsXG5cdCAgICAgICAgICAgIDB4MTkwMDAwMDA6IDB4ODAwMDAsXG5cdCAgICAgICAgICAgIDB4MWEwMDAwMDA6IDB4ODAwMTAsXG5cdCAgICAgICAgICAgIDB4MWIwMDAwMDA6IDB4NDAwMDAwMTAsXG5cdCAgICAgICAgICAgIDB4MWMwMDAwMDA6IDB4ODQwMDAsXG5cdCAgICAgICAgICAgIDB4MWQwMDAwMDA6IDB4NDAwMDQwMDAsXG5cdCAgICAgICAgICAgIDB4MWUwMDAwMDA6IDB4NDAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWYwMDAwMDA6IDB4NDAwODQwMTAsXG5cdCAgICAgICAgICAgIDB4MTA4MDAwMDA6IDB4ODQwMTAsXG5cdCAgICAgICAgICAgIDB4MTE4MDAwMDA6IDB4ODAwMDAsXG5cdCAgICAgICAgICAgIDB4MTI4MDAwMDA6IDB4NDAwODAwMDAsXG5cdCAgICAgICAgICAgIDB4MTM4MDAwMDA6IDB4NDAwMCxcblx0ICAgICAgICAgICAgMHgxNDgwMDAwMDogMHg0MDAwNDAwMCxcblx0ICAgICAgICAgICAgMHgxNTgwMDAwMDogMHg0MDA4NDAxMCxcblx0ICAgICAgICAgICAgMHgxNjgwMDAwMDogMHgxMCxcblx0ICAgICAgICAgICAgMHgxNzgwMDAwMDogMHg0MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxODgwMDAwMDogMHg0MDA4NDAwMCxcblx0ICAgICAgICAgICAgMHgxOTgwMDAwMDogMHg0MDAwMDAxMCxcblx0ICAgICAgICAgICAgMHgxYTgwMDAwMDogMHg0MDAwNDAxMCxcblx0ICAgICAgICAgICAgMHgxYjgwMDAwMDogMHg4MDAxMCxcblx0ICAgICAgICAgICAgMHgxYzgwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDFkODAwMDAwOiAweDQwMTAsXG5cdCAgICAgICAgICAgIDB4MWU4MDAwMDA6IDB4NDAwODAwMTAsXG5cdCAgICAgICAgICAgIDB4MWY4MDAwMDA6IDB4ODQwMDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDEwNCxcblx0ICAgICAgICAgICAgMHgxMDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgyMDAwMDA6IDB4NDAwMDEwMCxcblx0ICAgICAgICAgICAgMHgzMDAwMDA6IDB4MTAxMDQsXG5cdCAgICAgICAgICAgIDB4NDAwMDAwOiAweDEwMDA0LFxuXHQgICAgICAgICAgICAweDUwMDAwMDogMHg0MDAwMDA0LFxuXHQgICAgICAgICAgICAweDYwMDAwMDogMHg0MDEwMTA0LFxuXHQgICAgICAgICAgICAweDcwMDAwMDogMHg0MDEwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDogMHg0MDAwMDAwLFxuXHQgICAgICAgICAgICAweDkwMDAwMDogMHg0MDEwMTAwLFxuXHQgICAgICAgICAgICAweGEwMDAwMDogMHgxMDEwMCxcblx0ICAgICAgICAgICAgMHhiMDAwMDA6IDB4NDAxMDAwNCxcblx0ICAgICAgICAgICAgMHhjMDAwMDA6IDB4NDAwMDEwNCxcblx0ICAgICAgICAgICAgMHhkMDAwMDA6IDB4MTAwMDAsXG5cdCAgICAgICAgICAgIDB4ZTAwMDAwOiAweDQsXG5cdCAgICAgICAgICAgIDB4ZjAwMDAwOiAweDEwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDogMHg0MDEwMTAwLFxuXHQgICAgICAgICAgICAweDE4MDAwMDogMHg0MDEwMDA0LFxuXHQgICAgICAgICAgICAweDI4MDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDM4MDAwMDogMHg0MDAwMTAwLFxuXHQgICAgICAgICAgICAweDQ4MDAwMDogMHg0MDAwMDA0LFxuXHQgICAgICAgICAgICAweDU4MDAwMDogMHgxMDAwMCxcblx0ICAgICAgICAgICAgMHg2ODAwMDA6IDB4MTAwMDQsXG5cdCAgICAgICAgICAgIDB4NzgwMDAwOiAweDEwNCxcblx0ICAgICAgICAgICAgMHg4ODAwMDA6IDB4NCxcblx0ICAgICAgICAgICAgMHg5ODAwMDA6IDB4MTAwLFxuXHQgICAgICAgICAgICAweGE4MDAwMDogMHg0MDEwMDAwLFxuXHQgICAgICAgICAgICAweGI4MDAwMDogMHgxMDEwNCxcblx0ICAgICAgICAgICAgMHhjODAwMDA6IDB4MTAxMDAsXG5cdCAgICAgICAgICAgIDB4ZDgwMDAwOiAweDQwMDAxMDQsXG5cdCAgICAgICAgICAgIDB4ZTgwMDAwOiAweDQwMTAxMDQsXG5cdCAgICAgICAgICAgIDB4ZjgwMDAwOiAweDQwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTAwMDAwMDogMHg0MDEwMTAwLFxuXHQgICAgICAgICAgICAweDExMDAwMDA6IDB4MTAwMDQsXG5cdCAgICAgICAgICAgIDB4MTIwMDAwMDogMHgxMDAwMCxcblx0ICAgICAgICAgICAgMHgxMzAwMDAwOiAweDQwMDAxMDAsXG5cdCAgICAgICAgICAgIDB4MTQwMDAwMDogMHgxMDAsXG5cdCAgICAgICAgICAgIDB4MTUwMDAwMDogMHg0MDEwMTA0LFxuXHQgICAgICAgICAgICAweDE2MDAwMDA6IDB4NDAwMDAwNCxcblx0ICAgICAgICAgICAgMHgxNzAwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwMDogMHg0MDAwMTA0LFxuXHQgICAgICAgICAgICAweDE5MDAwMDA6IDB4NDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxYTAwMDAwOiAweDQsXG5cdCAgICAgICAgICAgIDB4MWIwMDAwMDogMHgxMDEwMCxcblx0ICAgICAgICAgICAgMHgxYzAwMDAwOiAweDQwMTAwMDAsXG5cdCAgICAgICAgICAgIDB4MWQwMDAwMDogMHgxMDQsXG5cdCAgICAgICAgICAgIDB4MWUwMDAwMDogMHgxMDEwNCxcblx0ICAgICAgICAgICAgMHgxZjAwMDAwOiAweDQwMTAwMDQsXG5cdCAgICAgICAgICAgIDB4MTA4MDAwMDogMHg0MDAwMDAwLFxuXHQgICAgICAgICAgICAweDExODAwMDA6IDB4MTA0LFxuXHQgICAgICAgICAgICAweDEyODAwMDA6IDB4NDAxMDEwMCxcblx0ICAgICAgICAgICAgMHgxMzgwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MTQ4MDAwMDogMHgxMDAwNCxcblx0ICAgICAgICAgICAgMHgxNTgwMDAwOiAweDQwMDAxMDAsXG5cdCAgICAgICAgICAgIDB4MTY4MDAwMDogMHgxMDAsXG5cdCAgICAgICAgICAgIDB4MTc4MDAwMDogMHg0MDEwMDA0LFxuXHQgICAgICAgICAgICAweDE4ODAwMDA6IDB4MTAwMDAsXG5cdCAgICAgICAgICAgIDB4MTk4MDAwMDogMHg0MDEwMTA0LFxuXHQgICAgICAgICAgICAweDFhODAwMDA6IDB4MTAxMDQsXG5cdCAgICAgICAgICAgIDB4MWI4MDAwMDogMHg0MDAwMDA0LFxuXHQgICAgICAgICAgICAweDFjODAwMDA6IDB4NDAwMDEwNCxcblx0ICAgICAgICAgICAgMHgxZDgwMDAwOiAweDQwMTAwMDAsXG5cdCAgICAgICAgICAgIDB4MWU4MDAwMDogMHg0LFxuXHQgICAgICAgICAgICAweDFmODAwMDA6IDB4MTAxMDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDgwNDAxMDAwLFxuXHQgICAgICAgICAgICAweDEwMDAwOiAweDgwMDAxMDQwLFxuXHQgICAgICAgICAgICAweDIwMDAwOiAweDQwMTA0MCxcblx0ICAgICAgICAgICAgMHgzMDAwMDogMHg4MDQwMDAwMCxcblx0ICAgICAgICAgICAgMHg0MDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDUwMDAwOiAweDQwMTAwMCxcblx0ICAgICAgICAgICAgMHg2MDAwMDogMHg4MDAwMDA0MCxcblx0ICAgICAgICAgICAgMHg3MDAwMDogMHg0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDA6IDB4ODAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4OTAwMDA6IDB4NDAwMDAwLFxuXHQgICAgICAgICAgICAweGEwMDAwOiAweDQwLFxuXHQgICAgICAgICAgICAweGIwMDAwOiAweDgwMDAxMDAwLFxuXHQgICAgICAgICAgICAweGMwMDAwOiAweDgwNDAwMDQwLFxuXHQgICAgICAgICAgICAweGQwMDAwOiAweDEwNDAsXG5cdCAgICAgICAgICAgIDB4ZTAwMDA6IDB4MTAwMCxcblx0ICAgICAgICAgICAgMHhmMDAwMDogMHg4MDQwMTA0MCxcblx0ICAgICAgICAgICAgMHg4MDAwOiAweDgwMDAxMDQwLFxuXHQgICAgICAgICAgICAweDE4MDAwOiAweDQwLFxuXHQgICAgICAgICAgICAweDI4MDAwOiAweDgwNDAwMDQwLFxuXHQgICAgICAgICAgICAweDM4MDAwOiAweDgwMDAxMDAwLFxuXHQgICAgICAgICAgICAweDQ4MDAwOiAweDQwMTAwMCxcblx0ICAgICAgICAgICAgMHg1ODAwMDogMHg4MDQwMTA0MCxcblx0ICAgICAgICAgICAgMHg2ODAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDc4MDAwOiAweDgwNDAwMDAwLFxuXHQgICAgICAgICAgICAweDg4MDAwOiAweDEwMDAsXG5cdCAgICAgICAgICAgIDB4OTgwMDA6IDB4ODA0MDEwMDAsXG5cdCAgICAgICAgICAgIDB4YTgwMDA6IDB4NDAwMDAwLFxuXHQgICAgICAgICAgICAweGI4MDAwOiAweDEwNDAsXG5cdCAgICAgICAgICAgIDB4YzgwMDA6IDB4ODAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ZDgwMDA6IDB4NDAwMDQwLFxuXHQgICAgICAgICAgICAweGU4MDAwOiAweDQwMTA0MCxcblx0ICAgICAgICAgICAgMHhmODAwMDogMHg4MDAwMDA0MCxcblx0ICAgICAgICAgICAgMHgxMDAwMDA6IDB4NDAwMDQwLFxuXHQgICAgICAgICAgICAweDExMDAwMDogMHg0MDEwMDAsXG5cdCAgICAgICAgICAgIDB4MTIwMDAwOiAweDgwMDAwMDQwLFxuXHQgICAgICAgICAgICAweDEzMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDE0MDAwMDogMHgxMDQwLFxuXHQgICAgICAgICAgICAweDE1MDAwMDogMHg4MDQwMDA0MCxcblx0ICAgICAgICAgICAgMHgxNjAwMDA6IDB4ODA0MDEwMDAsXG5cdCAgICAgICAgICAgIDB4MTcwMDAwOiAweDgwMDAxMDQwLFxuXHQgICAgICAgICAgICAweDE4MDAwMDogMHg4MDQwMTA0MCxcblx0ICAgICAgICAgICAgMHgxOTAwMDA6IDB4ODAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWEwMDAwOiAweDgwNDAwMDAwLFxuXHQgICAgICAgICAgICAweDFiMDAwMDogMHg0MDEwNDAsXG5cdCAgICAgICAgICAgIDB4MWMwMDAwOiAweDgwMDAxMDAwLFxuXHQgICAgICAgICAgICAweDFkMDAwMDogMHg0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWUwMDAwOiAweDQwLFxuXHQgICAgICAgICAgICAweDFmMDAwMDogMHgxMDAwLFxuXHQgICAgICAgICAgICAweDEwODAwMDogMHg4MDQwMDAwMCxcblx0ICAgICAgICAgICAgMHgxMTgwMDA6IDB4ODA0MDEwNDAsXG5cdCAgICAgICAgICAgIDB4MTI4MDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MTM4MDAwOiAweDQwMTAwMCxcblx0ICAgICAgICAgICAgMHgxNDgwMDA6IDB4NDAwMDQwLFxuXHQgICAgICAgICAgICAweDE1ODAwMDogMHg4MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxNjgwMDA6IDB4ODAwMDEwNDAsXG5cdCAgICAgICAgICAgIDB4MTc4MDAwOiAweDQwLFxuXHQgICAgICAgICAgICAweDE4ODAwMDogMHg4MDAwMDA0MCxcblx0ICAgICAgICAgICAgMHgxOTgwMDA6IDB4MTAwMCxcblx0ICAgICAgICAgICAgMHgxYTgwMDA6IDB4ODAwMDEwMDAsXG5cdCAgICAgICAgICAgIDB4MWI4MDAwOiAweDgwNDAwMDQwLFxuXHQgICAgICAgICAgICAweDFjODAwMDogMHgxMDQwLFxuXHQgICAgICAgICAgICAweDFkODAwMDogMHg4MDQwMTAwMCxcblx0ICAgICAgICAgICAgMHgxZTgwMDA6IDB4NDAwMDAwLFxuXHQgICAgICAgICAgICAweDFmODAwMDogMHg0MDEwNDBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDgwLFxuXHQgICAgICAgICAgICAweDEwMDA6IDB4MTA0MDAwMCxcblx0ICAgICAgICAgICAgMHgyMDAwOiAweDQwMDAwLFxuXHQgICAgICAgICAgICAweDMwMDA6IDB4MjAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4NDAwMDogMHgyMDA0MDA4MCxcblx0ICAgICAgICAgICAgMHg1MDAwOiAweDEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4NjAwMDogMHgyMTAwMDA4MCxcblx0ICAgICAgICAgICAgMHg3MDAwOiAweDQwMDgwLFxuXHQgICAgICAgICAgICAweDgwMDA6IDB4MTAwMDAwMCxcblx0ICAgICAgICAgICAgMHg5MDAwOiAweDIwMDQwMDAwLFxuXHQgICAgICAgICAgICAweGEwMDA6IDB4MjAwMDAwODAsXG5cdCAgICAgICAgICAgIDB4YjAwMDogMHgyMTA0MDA4MCxcblx0ICAgICAgICAgICAgMHhjMDAwOiAweDIxMDQwMDAwLFxuXHQgICAgICAgICAgICAweGQwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHhlMDAwOiAweDEwNDAwODAsXG5cdCAgICAgICAgICAgIDB4ZjAwMDogMHgyMTAwMDAwMCxcblx0ICAgICAgICAgICAgMHg4MDA6IDB4MTA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxODAwOiAweDIxMDAwMDgwLFxuXHQgICAgICAgICAgICAweDI4MDA6IDB4ODAsXG5cdCAgICAgICAgICAgIDB4MzgwMDogMHgxMDQwMDAwLFxuXHQgICAgICAgICAgICAweDQ4MDA6IDB4NDAwMDAsXG5cdCAgICAgICAgICAgIDB4NTgwMDogMHgyMDA0MDA4MCxcblx0ICAgICAgICAgICAgMHg2ODAwOiAweDIxMDQwMDAwLFxuXHQgICAgICAgICAgICAweDc4MDA6IDB4MjAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODgwMDogMHgyMDA0MDAwMCxcblx0ICAgICAgICAgICAgMHg5ODAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4YTgwMDogMHgyMTA0MDA4MCxcblx0ICAgICAgICAgICAgMHhiODAwOiAweDEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4YzgwMDogMHgyMDAwMDA4MCxcblx0ICAgICAgICAgICAgMHhkODAwOiAweDIxMDAwMDAwLFxuXHQgICAgICAgICAgICAweGU4MDA6IDB4MTAwMDAwMCxcblx0ICAgICAgICAgICAgMHhmODAwOiAweDQwMDgwLFxuXHQgICAgICAgICAgICAweDEwMDAwOiAweDQwMDAwLFxuXHQgICAgICAgICAgICAweDExMDAwOiAweDgwLFxuXHQgICAgICAgICAgICAweDEyMDAwOiAweDIwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDEzMDAwOiAweDIxMDAwMDgwLFxuXHQgICAgICAgICAgICAweDE0MDAwOiAweDEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4MTUwMDA6IDB4MjEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTYwMDA6IDB4MjAwNDAwODAsXG5cdCAgICAgICAgICAgIDB4MTcwMDA6IDB4MTAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxODAwMDogMHgyMTA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxOTAwMDogMHgyMTAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxYTAwMDogMHgxMDQwMDAwLFxuXHQgICAgICAgICAgICAweDFiMDAwOiAweDIwMDQwMDAwLFxuXHQgICAgICAgICAgICAweDFjMDAwOiAweDQwMDgwLFxuXHQgICAgICAgICAgICAweDFkMDAwOiAweDIwMDAwMDgwLFxuXHQgICAgICAgICAgICAweDFlMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWYwMDA6IDB4MTA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxMDgwMDogMHgyMTAwMDA4MCxcblx0ICAgICAgICAgICAgMHgxMTgwMDogMHgxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDEyODAwOiAweDEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTM4MDA6IDB4MjAwNDAwODAsXG5cdCAgICAgICAgICAgIDB4MTQ4MDA6IDB4MjAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTU4MDA6IDB4MTA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxNjgwMDogMHg4MCxcblx0ICAgICAgICAgICAgMHgxNzgwMDogMHgyMTA0MDAwMCxcblx0ICAgICAgICAgICAgMHgxODgwMDogMHg0MDA4MCxcblx0ICAgICAgICAgICAgMHgxOTgwMDogMHgyMTA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxYTgwMDogMHgwLFxuXHQgICAgICAgICAgICAweDFiODAwOiAweDIxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDFjODAwOiAweDEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4MWQ4MDA6IDB4NDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWU4MDA6IDB4MjAwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWY4MDA6IDB4MjAwMDAwODBcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDEwMDAwMDA4LFxuXHQgICAgICAgICAgICAweDEwMDogMHgyMDAwLFxuXHQgICAgICAgICAgICAweDIwMDogMHgxMDIwMDAwMCxcblx0ICAgICAgICAgICAgMHgzMDA6IDB4MTAyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4NDAwOiAweDEwMDAyMDAwLFxuXHQgICAgICAgICAgICAweDUwMDogMHgyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4NjAwOiAweDIwMDAwOCxcblx0ICAgICAgICAgICAgMHg3MDA6IDB4MTAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4OTAwOiAweDEwMDAyMDA4LFxuXHQgICAgICAgICAgICAweGEwMDogMHgyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4YjAwOiAweDgsXG5cdCAgICAgICAgICAgIDB4YzAwOiAweDEwMjAwMDA4LFxuXHQgICAgICAgICAgICAweGQwMDogMHgyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4ZTAwOiAweDIwMDgsXG5cdCAgICAgICAgICAgIDB4ZjAwOiAweDEwMjAyMDAwLFxuXHQgICAgICAgICAgICAweDgwOiAweDEwMjAwMDAwLFxuXHQgICAgICAgICAgICAweDE4MDogMHgxMDIwMjAwOCxcblx0ICAgICAgICAgICAgMHgyODA6IDB4OCxcblx0ICAgICAgICAgICAgMHgzODA6IDB4MjAwMDAwLFxuXHQgICAgICAgICAgICAweDQ4MDogMHgyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4NTgwOiAweDEwMDAwMDA4LFxuXHQgICAgICAgICAgICAweDY4MDogMHgxMDAwMjAwMCxcblx0ICAgICAgICAgICAgMHg3ODA6IDB4MjAwOCxcblx0ICAgICAgICAgICAgMHg4ODA6IDB4MjAwMDA4LFxuXHQgICAgICAgICAgICAweDk4MDogMHgyMDAwLFxuXHQgICAgICAgICAgICAweGE4MDogMHgxMDAwMjAwOCxcblx0ICAgICAgICAgICAgMHhiODA6IDB4MTAyMDAwMDgsXG5cdCAgICAgICAgICAgIDB4YzgwOiAweDAsXG5cdCAgICAgICAgICAgIDB4ZDgwOiAweDEwMjAyMDAwLFxuXHQgICAgICAgICAgICAweGU4MDogMHgyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4ZjgwOiAweDEwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDEwMDA6IDB4MTAwMDIwMDAsXG5cdCAgICAgICAgICAgIDB4MTEwMDogMHgxMDIwMDAwOCxcblx0ICAgICAgICAgICAgMHgxMjAwOiAweDEwMjAyMDA4LFxuXHQgICAgICAgICAgICAweDEzMDA6IDB4MjAwOCxcblx0ICAgICAgICAgICAgMHgxNDAwOiAweDIwMDAwMCxcblx0ICAgICAgICAgICAgMHgxNTAwOiAweDEwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDE2MDA6IDB4MTAwMDAwMDgsXG5cdCAgICAgICAgICAgIDB4MTcwMDogMHgyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDogMHgyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4MTkwMDogMHgwLFxuXHQgICAgICAgICAgICAweDFhMDA6IDB4OCxcblx0ICAgICAgICAgICAgMHgxYjAwOiAweDEwMjAwMDAwLFxuXHQgICAgICAgICAgICAweDFjMDA6IDB4MjAwMCxcblx0ICAgICAgICAgICAgMHgxZDAwOiAweDEwMDAyMDA4LFxuXHQgICAgICAgICAgICAweDFlMDA6IDB4MTAyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4MWYwMDogMHgyMDAwMDgsXG5cdCAgICAgICAgICAgIDB4MTA4MDogMHg4LFxuXHQgICAgICAgICAgICAweDExODA6IDB4MjAyMDAwLFxuXHQgICAgICAgICAgICAweDEyODA6IDB4MjAwMDAwLFxuXHQgICAgICAgICAgICAweDEzODA6IDB4MTAwMDAwMDgsXG5cdCAgICAgICAgICAgIDB4MTQ4MDogMHgxMDAwMjAwMCxcblx0ICAgICAgICAgICAgMHgxNTgwOiAweDIwMDgsXG5cdCAgICAgICAgICAgIDB4MTY4MDogMHgxMDIwMjAwOCxcblx0ICAgICAgICAgICAgMHgxNzgwOiAweDEwMjAwMDAwLFxuXHQgICAgICAgICAgICAweDE4ODA6IDB4MTAyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4MTk4MDogMHgxMDIwMDAwOCxcblx0ICAgICAgICAgICAgMHgxYTgwOiAweDIwMDAsXG5cdCAgICAgICAgICAgIDB4MWI4MDogMHgyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4MWM4MDogMHgyMDAwMDgsXG5cdCAgICAgICAgICAgIDB4MWQ4MDogMHgwLFxuXHQgICAgICAgICAgICAweDFlODA6IDB4MTAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWY4MDogMHgxMDAwMjAwOFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4MTAwMDAwLFxuXHQgICAgICAgICAgICAweDEwOiAweDIwMDA0MDEsXG5cdCAgICAgICAgICAgIDB4MjA6IDB4NDAwLFxuXHQgICAgICAgICAgICAweDMwOiAweDEwMDQwMSxcblx0ICAgICAgICAgICAgMHg0MDogMHgyMTAwNDAxLFxuXHQgICAgICAgICAgICAweDUwOiAweDAsXG5cdCAgICAgICAgICAgIDB4NjA6IDB4MSxcblx0ICAgICAgICAgICAgMHg3MDogMHgyMTAwMDAxLFxuXHQgICAgICAgICAgICAweDgwOiAweDIwMDA0MDAsXG5cdCAgICAgICAgICAgIDB4OTA6IDB4MTAwMDAxLFxuXHQgICAgICAgICAgICAweGEwOiAweDIwMDAwMDEsXG5cdCAgICAgICAgICAgIDB4YjA6IDB4MjEwMDQwMCxcblx0ICAgICAgICAgICAgMHhjMDogMHgyMTAwMDAwLFxuXHQgICAgICAgICAgICAweGQwOiAweDQwMSxcblx0ICAgICAgICAgICAgMHhlMDogMHgxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4ZjA6IDB4MjAwMDAwMCxcblx0ICAgICAgICAgICAgMHg4OiAweDIxMDAwMDEsXG5cdCAgICAgICAgICAgIDB4MTg6IDB4MCxcblx0ICAgICAgICAgICAgMHgyODogMHgyMDAwNDAxLFxuXHQgICAgICAgICAgICAweDM4OiAweDIxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4NDg6IDB4MTAwMDAwLFxuXHQgICAgICAgICAgICAweDU4OiAweDIwMDAwMDEsXG5cdCAgICAgICAgICAgIDB4Njg6IDB4MjAwMDAwMCxcblx0ICAgICAgICAgICAgMHg3ODogMHg0MDEsXG5cdCAgICAgICAgICAgIDB4ODg6IDB4MTAwNDAxLFxuXHQgICAgICAgICAgICAweDk4OiAweDIwMDA0MDAsXG5cdCAgICAgICAgICAgIDB4YTg6IDB4MjEwMDAwMCxcblx0ICAgICAgICAgICAgMHhiODogMHgxMDAwMDEsXG5cdCAgICAgICAgICAgIDB4Yzg6IDB4NDAwLFxuXHQgICAgICAgICAgICAweGQ4OiAweDIxMDA0MDEsXG5cdCAgICAgICAgICAgIDB4ZTg6IDB4MSxcblx0ICAgICAgICAgICAgMHhmODogMHgxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MTAwOiAweDIwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTEwOiAweDEwMDAwMCxcblx0ICAgICAgICAgICAgMHgxMjA6IDB4MjAwMDQwMSxcblx0ICAgICAgICAgICAgMHgxMzA6IDB4MjEwMDAwMSxcblx0ICAgICAgICAgICAgMHgxNDA6IDB4MTAwMDAxLFxuXHQgICAgICAgICAgICAweDE1MDogMHgyMDAwNDAwLFxuXHQgICAgICAgICAgICAweDE2MDogMHgyMTAwNDAwLFxuXHQgICAgICAgICAgICAweDE3MDogMHgxMDA0MDEsXG5cdCAgICAgICAgICAgIDB4MTgwOiAweDQwMSxcblx0ICAgICAgICAgICAgMHgxOTA6IDB4MjEwMDQwMSxcblx0ICAgICAgICAgICAgMHgxYTA6IDB4MTAwNDAwLFxuXHQgICAgICAgICAgICAweDFiMDogMHgxLFxuXHQgICAgICAgICAgICAweDFjMDogMHgwLFxuXHQgICAgICAgICAgICAweDFkMDogMHgyMTAwMDAwLFxuXHQgICAgICAgICAgICAweDFlMDogMHgyMDAwMDAxLFxuXHQgICAgICAgICAgICAweDFmMDogMHg0MDAsXG5cdCAgICAgICAgICAgIDB4MTA4OiAweDEwMDQwMCxcblx0ICAgICAgICAgICAgMHgxMTg6IDB4MjAwMDQwMSxcblx0ICAgICAgICAgICAgMHgxMjg6IDB4MjEwMDAwMSxcblx0ICAgICAgICAgICAgMHgxMzg6IDB4MSxcblx0ICAgICAgICAgICAgMHgxNDg6IDB4MjAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxNTg6IDB4MTAwMDAwLFxuXHQgICAgICAgICAgICAweDE2ODogMHg0MDEsXG5cdCAgICAgICAgICAgIDB4MTc4OiAweDIxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MTg4OiAweDIwMDAwMDEsXG5cdCAgICAgICAgICAgIDB4MTk4OiAweDIxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWE4OiAweDAsXG5cdCAgICAgICAgICAgIDB4MWI4OiAweDIxMDA0MDEsXG5cdCAgICAgICAgICAgIDB4MWM4OiAweDEwMDQwMSxcblx0ICAgICAgICAgICAgMHgxZDg6IDB4NDAwLFxuXHQgICAgICAgICAgICAweDFlODogMHgyMDAwNDAwLFxuXHQgICAgICAgICAgICAweDFmODogMHgxMDAwMDFcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDgwMDA4MjAsXG5cdCAgICAgICAgICAgIDB4MTogMHgyMDAwMCxcblx0ICAgICAgICAgICAgMHgyOiAweDgwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MzogMHgyMCxcblx0ICAgICAgICAgICAgMHg0OiAweDIwMDIwLFxuXHQgICAgICAgICAgICAweDU6IDB4ODAyMDgyMCxcblx0ICAgICAgICAgICAgMHg2OiAweDgwMjA4MDAsXG5cdCAgICAgICAgICAgIDB4NzogMHg4MDAsXG5cdCAgICAgICAgICAgIDB4ODogMHg4MDIwMDAwLFxuXHQgICAgICAgICAgICAweDk6IDB4ODAwMDgwMCxcblx0ICAgICAgICAgICAgMHhhOiAweDIwODAwLFxuXHQgICAgICAgICAgICAweGI6IDB4ODAyMDAyMCxcblx0ICAgICAgICAgICAgMHhjOiAweDgyMCxcblx0ICAgICAgICAgICAgMHhkOiAweDAsXG5cdCAgICAgICAgICAgIDB4ZTogMHg4MDAwMDIwLFxuXHQgICAgICAgICAgICAweGY6IDB4MjA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDA6IDB4ODAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDAxOiAweDgwMjA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDI6IDB4ODAwMDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwMzogMHg4MDAwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDA0OiAweDgwMjAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDU6IDB4MjA4MDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDY6IDB4MjA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDc6IDB4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDg6IDB4ODAwMDAyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwOTogMHg4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMGE6IDB4MjAwMjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMGI6IDB4ODAyMDgwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwYzogMHgwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDBkOiAweDgwMjAwMjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMGU6IDB4ODAwMDgwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwZjogMHgyMDAwMCxcblx0ICAgICAgICAgICAgMHgxMDogMHgyMDgyMCxcblx0ICAgICAgICAgICAgMHgxMTogMHg4MDIwODAwLFxuXHQgICAgICAgICAgICAweDEyOiAweDIwLFxuXHQgICAgICAgICAgICAweDEzOiAweDgwMCxcblx0ICAgICAgICAgICAgMHgxNDogMHg4MDAwODAwLFxuXHQgICAgICAgICAgICAweDE1OiAweDgwMDAwMjAsXG5cdCAgICAgICAgICAgIDB4MTY6IDB4ODAyMDAyMCxcblx0ICAgICAgICAgICAgMHgxNzogMHgyMDAwMCxcblx0ICAgICAgICAgICAgMHgxODogMHgwLFxuXHQgICAgICAgICAgICAweDE5OiAweDIwMDIwLFxuXHQgICAgICAgICAgICAweDFhOiAweDgwMjAwMDAsXG5cdCAgICAgICAgICAgIDB4MWI6IDB4ODAwMDgyMCxcblx0ICAgICAgICAgICAgMHgxYzogMHg4MDIwODIwLFxuXHQgICAgICAgICAgICAweDFkOiAweDIwODAwLFxuXHQgICAgICAgICAgICAweDFlOiAweDgyMCxcblx0ICAgICAgICAgICAgMHgxZjogMHg4MDAwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDEwOiAweDIwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDExOiAweDgwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxMjogMHg4MDIwMDIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDEzOiAweDIwODIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDE0OiAweDIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDE1OiAweDgwMjAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTY6IDB4ODAwMDAwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxNzogMHg4MDAwODIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDE4OiAweDgwMjA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTk6IDB4ODAwMDAyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxYTogMHg4MDAwODAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDFiOiAweDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMWM6IDB4MjA4MDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMWQ6IDB4ODIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDFlOiAweDIwMDIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDFmOiAweDgwMjA4MDBcblx0ICAgICAgICB9XG5cdCAgICBdO1xuXG5cdCAgICAvLyBNYXNrcyB0aGF0IHNlbGVjdCB0aGUgU0JPWCBpbnB1dFxuXHQgICAgdmFyIFNCT1hfTUFTSyA9IFtcblx0ICAgICAgICAweGY4MDAwMDAxLCAweDFmODAwMDAwLCAweDAxZjgwMDAwLCAweDAwMWY4MDAwLFxuXHQgICAgICAgIDB4MDAwMWY4MDAsIDB4MDAwMDFmODAsIDB4MDAwMDAxZjgsIDB4ODAwMDAwMWZcblx0ICAgIF07XG5cblx0ICAgIC8qKlxuXHQgICAgICogREVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBERVMgPSBDX2FsZ28uREVTID0gQmxvY2tDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleTtcblx0ICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFNlbGVjdCA1NiBiaXRzIGFjY29yZGluZyB0byBQQzFcblx0ICAgICAgICAgICAgdmFyIGtleUJpdHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5Qml0UG9zID0gUEMxW2ldIC0gMTtcblx0ICAgICAgICAgICAgICAgIGtleUJpdHNbaV0gPSAoa2V5V29yZHNba2V5Qml0UG9zID4+PiA1XSA+Pj4gKDMxIC0ga2V5Qml0UG9zICUgMzIpKSAmIDE7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBBc3NlbWJsZSAxNiBzdWJrZXlzXG5cdCAgICAgICAgICAgIHZhciBzdWJLZXlzID0gdGhpcy5fc3ViS2V5cyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBuU3ViS2V5ID0gMDsgblN1YktleSA8IDE2OyBuU3ViS2V5KyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzdWJrZXlcblx0ICAgICAgICAgICAgICAgIHZhciBzdWJLZXkgPSBzdWJLZXlzW25TdWJLZXldID0gW107XG5cblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0U2hpZnQgPSBCSVRfU0hJRlRTW25TdWJLZXldO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBTZWxlY3QgNDggYml0cyBhY2NvcmRpbmcgdG8gUEMyXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgZnJvbSB0aGUgbGVmdCAyOCBrZXkgYml0c1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YktleVsoaSAvIDYpIHwgMF0gfD0ga2V5Qml0c1soKFBDMltpXSAtIDEpICsgYml0U2hpZnQpICUgMjhdIDw8ICgzMSAtIGkgJSA2KTtcblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCBmcm9tIHRoZSByaWdodCAyOCBrZXkgYml0c1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YktleVs0ICsgKChpIC8gNikgfCAwKV0gfD0ga2V5Qml0c1syOCArICgoKFBDMltpICsgMjRdIC0gMSkgKyBiaXRTaGlmdCkgJSAyOCldIDw8ICgzMSAtIGkgJSA2KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gU2luY2UgZWFjaCBzdWJrZXkgaXMgYXBwbGllZCB0byBhbiBleHBhbmRlZCAzMi1iaXQgaW5wdXQsXG5cdCAgICAgICAgICAgICAgICAvLyB0aGUgc3Via2V5IGNhbiBiZSBicm9rZW4gaW50byA4IHZhbHVlcyBzY2FsZWQgdG8gMzItYml0cyxcblx0ICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFsbG93cyB0aGUga2V5IHRvIGJlIHVzZWQgd2l0aG91dCBleHBhbnNpb25cblx0ICAgICAgICAgICAgICAgIHN1YktleVswXSA9IChzdWJLZXlbMF0gPDwgMSkgfCAoc3ViS2V5WzBdID4+PiAzMSk7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDc7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YktleVtpXSA9IHN1YktleVtpXSA+Pj4gKChpIC0gMSkgKiA0ICsgMyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBzdWJLZXlbN10gPSAoc3ViS2V5WzddIDw8IDUpIHwgKHN1YktleVs3XSA+Pj4gMjcpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnZlcnNlIHN1YmtleXNcblx0ICAgICAgICAgICAgdmFyIGludlN1YktleXMgPSB0aGlzLl9pbnZTdWJLZXlzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgaW52U3ViS2V5c1tpXSA9IHN1YktleXNbMTUgLSBpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5fc3ViS2V5cyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9pbnZTdWJLZXlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwgc3ViS2V5cykge1xuXHQgICAgICAgICAgICAvLyBHZXQgaW5wdXRcblx0ICAgICAgICAgICAgdGhpcy5fbEJsb2NrID0gTVtvZmZzZXRdO1xuXHQgICAgICAgICAgICB0aGlzLl9yQmxvY2sgPSBNW29mZnNldCArIDFdO1xuXG5cdCAgICAgICAgICAgIC8vIEluaXRpYWwgcGVybXV0YXRpb25cblx0ICAgICAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDQsICAweDBmMGYwZjBmKTtcblx0ICAgICAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDE2LCAweDAwMDBmZmZmKTtcblx0ICAgICAgICAgICAgZXhjaGFuZ2VSTC5jYWxsKHRoaXMsIDIsICAweDMzMzMzMzMzKTtcblx0ICAgICAgICAgICAgZXhjaGFuZ2VSTC5jYWxsKHRoaXMsIDgsICAweDAwZmYwMGZmKTtcblx0ICAgICAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDEsICAweDU1NTU1NTU1KTtcblxuXHQgICAgICAgICAgICAvLyBSb3VuZHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgcm91bmQgPSAwOyByb3VuZCA8IDE2OyByb3VuZCsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBzdWJLZXkgPSBzdWJLZXlzW3JvdW5kXTtcblx0ICAgICAgICAgICAgICAgIHZhciBsQmxvY2sgPSB0aGlzLl9sQmxvY2s7XG5cdCAgICAgICAgICAgICAgICB2YXIgckJsb2NrID0gdGhpcy5fckJsb2NrO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBGZWlzdGVsIGZ1bmN0aW9uXG5cdCAgICAgICAgICAgICAgICB2YXIgZiA9IDA7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGYgfD0gU0JPWF9QW2ldWygockJsb2NrIF4gc3ViS2V5W2ldKSAmIFNCT1hfTUFTS1tpXSkgPj4+IDBdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5fbEJsb2NrID0gckJsb2NrO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fckJsb2NrID0gbEJsb2NrIF4gZjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFVuZG8gc3dhcCBmcm9tIGxhc3Qgcm91bmRcblx0ICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9sQmxvY2s7XG5cdCAgICAgICAgICAgIHRoaXMuX2xCbG9jayA9IHRoaXMuX3JCbG9jaztcblx0ICAgICAgICAgICAgdGhpcy5fckJsb2NrID0gdDtcblxuXHQgICAgICAgICAgICAvLyBGaW5hbCBwZXJtdXRhdGlvblxuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgMSwgIDB4NTU1NTU1NTUpO1xuXHQgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgOCwgIDB4MDBmZjAwZmYpO1xuXHQgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgMiwgIDB4MzMzMzMzMzMpO1xuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgMTYsIDB4MDAwMGZmZmYpO1xuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgNCwgIDB4MGYwZjBmMGYpO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBvdXRwdXRcblx0ICAgICAgICAgICAgTVtvZmZzZXRdID0gdGhpcy5fbEJsb2NrO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gdGhpcy5fckJsb2NrO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiA2NC8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogNjQvMzIsXG5cblx0ICAgICAgICBibG9ja1NpemU6IDY0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLy8gU3dhcCBiaXRzIGFjcm9zcyB0aGUgbGVmdCBhbmQgcmlnaHQgd29yZHNcblx0ICAgIGZ1bmN0aW9uIGV4Y2hhbmdlTFIob2Zmc2V0LCBtYXNrKSB7XG5cdCAgICAgICAgdmFyIHQgPSAoKHRoaXMuX2xCbG9jayA+Pj4gb2Zmc2V0KSBeIHRoaXMuX3JCbG9jaykgJiBtYXNrO1xuXHQgICAgICAgIHRoaXMuX3JCbG9jayBePSB0O1xuXHQgICAgICAgIHRoaXMuX2xCbG9jayBePSB0IDw8IG9mZnNldDtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gZXhjaGFuZ2VSTChvZmZzZXQsIG1hc2spIHtcblx0ICAgICAgICB2YXIgdCA9ICgodGhpcy5fckJsb2NrID4+PiBvZmZzZXQpIF4gdGhpcy5fbEJsb2NrKSAmIG1hc2s7XG5cdCAgICAgICAgdGhpcy5fbEJsb2NrIF49IHQ7XG5cdCAgICAgICAgdGhpcy5fckJsb2NrIF49IHQgPDwgb2Zmc2V0O1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLkRFUy5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkRFUy5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5ERVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKERFUyk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogVHJpcGxlLURFUyBibG9jayBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgVHJpcGxlREVTID0gQ19hbGdvLlRyaXBsZURFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXk7XG5cdCAgICAgICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgREVTIGluc3RhbmNlc1xuXHQgICAgICAgICAgICB0aGlzLl9kZXMxID0gREVTLmNyZWF0ZUVuY3J5cHRvcihXb3JkQXJyYXkuY3JlYXRlKGtleVdvcmRzLnNsaWNlKDAsIDIpKSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczIgPSBERVMuY3JlYXRlRW5jcnlwdG9yKFdvcmRBcnJheS5jcmVhdGUoa2V5V29yZHMuc2xpY2UoMiwgNCkpKTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMyA9IERFUy5jcmVhdGVFbmNyeXB0b3IoV29yZEFycmF5LmNyZWF0ZShrZXlXb3Jkcy5zbGljZSg0LCA2KSkpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMS5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczMuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczIuZW5jcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczEuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDE5Mi8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogNjQvMzIsXG5cblx0ICAgICAgICBibG9ja1NpemU6IDY0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgKi9cblx0ICAgIEMuVHJpcGxlREVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihUcmlwbGVERVMpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlRyaXBsZURFUztcblxufSkpOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/tripledes.js\n");
/***/ }),
/***/ "./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js":
/*!***************************************************************!*\
!*** ./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(/*! ./core */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/core.js\"));\n\t}\n\telse {}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NyeXB0by1qc0AzLjEuOS0xQGNyeXB0by1qcy94NjQtY29yZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3J5cHRvLWpzQDMuMS45LTFAY3J5cHRvLWpzL3g2NC1jb3JlLmpzPzRlNGQiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgWDMyV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXG5cdCAgICAvKipcblx0ICAgICAqIHg2NCBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX3g2NCA9IEMueDY0ID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSA2NC1iaXQgd29yZC5cblx0ICAgICAqL1xuXHQgICAgdmFyIFg2NFdvcmQgPSBDX3g2NC5Xb3JkID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCA2NC1iaXQgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIDMyIGJpdHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGxvdyBUaGUgbG93IDMyIGJpdHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB4NjRXb3JkID0gQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChoaWdoLCBsb3cpIHtcblx0ICAgICAgICAgICAgdGhpcy5oaWdoID0gaGlnaDtcblx0ICAgICAgICAgICAgdGhpcy5sb3cgPSBsb3c7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQml0d2lzZSBOT1RzIHRoaXMgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBuZWdhdGluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG5lZ2F0ZWQgPSB4NjRXb3JkLm5vdCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIG5vdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IH50aGlzLmhpZ2g7XG5cdCAgICAgICAgICAgIC8vIHZhciBsb3cgPSB+dGhpcy5sb3c7XG5cblx0ICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7XG5cdCAgICAgICAgLy8gfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEJpdHdpc2UgQU5EcyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1g2NFdvcmR9IHdvcmQgVGhlIHg2NC1Xb3JkIHRvIEFORCB3aXRoIHRoaXMgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBBTkRpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBhbmRlZCA9IHg2NFdvcmQuYW5kKGFub3RoZXJYNjRXb3JkKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICAvLyBhbmQ6IGZ1bmN0aW9uICh3b3JkKSB7XG5cdCAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5oaWdoICYgd29yZC5oaWdoO1xuXHQgICAgICAgICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgJiB3b3JkLmxvdztcblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQml0d2lzZSBPUnMgdGhpcyB3b3JkIHdpdGggdGhlIHBhc3NlZCB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBPUiB3aXRoIHRoaXMgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBPUmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG9yZWQgPSB4NjRXb3JkLm9yKGFub3RoZXJYNjRXb3JkKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICAvLyBvcjogZnVuY3Rpb24gKHdvcmQpIHtcblx0ICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmhpZ2ggfCB3b3JkLmhpZ2g7XG5cdCAgICAgICAgICAgIC8vIHZhciBsb3cgPSB0aGlzLmxvdyB8IHdvcmQubG93O1xuXG5cdCAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBCaXR3aXNlIFhPUnMgdGhpcyB3b3JkIHdpdGggdGhlIHBhc3NlZCB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBYT1Igd2l0aCB0aGlzIHdvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgWE9SaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgeG9yZWQgPSB4NjRXb3JkLnhvcihhbm90aGVyWDY0V29yZCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgLy8geG9yOiBmdW5jdGlvbiAod29yZCkge1xuXHQgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCBeIHdvcmQuaGlnaDtcblx0ICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93IF4gd29yZC5sb3c7XG5cblx0ICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7XG5cdCAgICAgICAgLy8gfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFNoaWZ0cyB0aGlzIHdvcmQgbiBiaXRzIHRvIHRoZSBsZWZ0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHNoaWZ0aW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc2hpZnRlZCA9IHg2NFdvcmQuc2hpZnRMKDI1KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICAvLyBzaGlmdEw6IGZ1bmN0aW9uIChuKSB7XG5cdCAgICAgICAgICAgIC8vIGlmIChuIDwgMzIpIHtcblx0ICAgICAgICAgICAgICAgIC8vIHZhciBoaWdoID0gKHRoaXMuaGlnaCA8PCBuKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbikpO1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93IDw8IG47XG5cdCAgICAgICAgICAgIC8vIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IHRoaXMubG93IDw8IChuIC0gMzIpO1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IDA7XG5cdCAgICAgICAgICAgIC8vIH1cblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogU2hpZnRzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIHJpZ2h0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHNoaWZ0aW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc2hpZnRlZCA9IHg2NFdvcmQuc2hpZnRSKDcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIHNoaWZ0UjogZnVuY3Rpb24gKG4pIHtcblx0ICAgICAgICAgICAgLy8gaWYgKG4gPCAzMikge1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9ICh0aGlzLmxvdyA+Pj4gbikgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG4pKTtcblx0ICAgICAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5oaWdoID4+PiBuO1xuXHQgICAgICAgICAgICAvLyB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMuaGlnaCA+Pj4gKG4gLSAzMik7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IDA7XG5cdCAgICAgICAgICAgIC8vIH1cblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUm90YXRlcyB0aGlzIHdvcmQgbiBiaXRzIHRvIHRoZSBsZWZ0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciByb3RhdGluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHJvdGF0ZWQgPSB4NjRXb3JkLnJvdEwoMjUpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIHJvdEw6IGZ1bmN0aW9uIChuKSB7XG5cdCAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLnNoaWZ0TChuKS5vcih0aGlzLnNoaWZ0Uig2NCAtIG4pKTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUm90YXRlcyB0aGlzIHdvcmQgbiBiaXRzIHRvIHRoZSByaWdodC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byByb3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgcm90YXRpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciByb3RhdGVkID0geDY0V29yZC5yb3RSKDcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIHJvdFI6IGZ1bmN0aW9uIChuKSB7XG5cdCAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLnNoaWZ0UihuKS5vcih0aGlzLnNoaWZ0TCg2NCAtIG4pKTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1g2NFdvcmR9IHdvcmQgVGhlIHg2NC1Xb3JkIHRvIGFkZCB3aXRoIHRoaXMgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBhZGRpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBhZGRlZCA9IHg2NFdvcmQuYWRkKGFub3RoZXJYNjRXb3JkKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICAvLyBhZGQ6IGZ1bmN0aW9uICh3b3JkKSB7XG5cdCAgICAgICAgICAgIC8vIHZhciBsb3cgPSAodGhpcy5sb3cgKyB3b3JkLmxvdykgfCAwO1xuXHQgICAgICAgICAgICAvLyB2YXIgY2FycnkgPSAobG93ID4+PiAwKSA8ICh0aGlzLmxvdyA+Pj4gMCkgPyAxIDogMDtcblx0ICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSAodGhpcy5oaWdoICsgd29yZC5oaWdoICsgY2FycnkpIHwgMDtcblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbiBhcnJheSBvZiA2NC1iaXQgd29yZHMuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIENyeXB0b0pTLng2NC5Xb3JkIG9iamVjdHMuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gc2lnQnl0ZXMgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgKi9cblx0ICAgIHZhciBYNjRXb3JkQXJyYXkgPSBDX3g2NC5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIENyeXB0b0pTLng2NC5Xb3JkIG9iamVjdHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy54NjQuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy54NjQuV29yZEFycmF5LmNyZWF0ZShbXG5cdCAgICAgICAgICogICAgICAgICBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgwMDAxMDIwMywgMHgwNDA1MDYwNyksXG5cdCAgICAgICAgICogICAgICAgICBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgxODE5MWExYiwgMHgxYzFkMWUxZilcblx0ICAgICAgICAgKiAgICAgXSk7XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKFtcblx0ICAgICAgICAgKiAgICAgICAgIENyeXB0b0pTLng2NC5Xb3JkLmNyZWF0ZSgweDAwMDEwMjAzLCAweDA0MDUwNjA3KSxcblx0ICAgICAgICAgKiAgICAgICAgIENyeXB0b0pTLng2NC5Xb3JkLmNyZWF0ZSgweDE4MTkxYTFiLCAweDFjMWQxZTFmKVxuXHQgICAgICAgICAqICAgICBdLCAxMCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogODtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIDY0LWJpdCB3b3JkIGFycmF5IHRvIGEgMzItYml0IHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDcnlwdG9KUy5saWIuV29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkncyBkYXRhIGFzIGEgMzItYml0IHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB4MzJXb3JkQXJyYXkgPSB4NjRXb3JkQXJyYXkudG9YMzIoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB0b1gzMjogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHg2NFdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHg2NFdvcmRzTGVuZ3RoID0geDY0V29yZHMubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHgzMldvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeDY0V29yZHNMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIHg2NFdvcmQgPSB4NjRXb3Jkc1tpXTtcblx0ICAgICAgICAgICAgICAgIHgzMldvcmRzLnB1c2goeDY0V29yZC5oaWdoKTtcblx0ICAgICAgICAgICAgICAgIHgzMldvcmRzLnB1c2goeDY0V29yZC5sb3cpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIFgzMldvcmRBcnJheS5jcmVhdGUoeDMyV29yZHMsIHRoaXMuc2lnQnl0ZXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkQXJyYXl9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0geDY0V29yZEFycmF5LmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIENsb25lIFwid29yZHNcIiBhcnJheVxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBjbG9uZS53b3JkcyA9IHRoaXMud29yZHMuc2xpY2UoMCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2xvbmUgZWFjaCBYNjRXb3JkIG9iamVjdFxuXHQgICAgICAgICAgICB2YXIgd29yZHNMZW5ndGggPSB3b3Jkcy5sZW5ndGg7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHNMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaV0gPSB3b3Jkc1tpXS5jbG9uZSgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTO1xuXG59KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_crypto-js@3.1.9-1@crypto-js/x64-core.js\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css":
/*!*******************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css ***!
\*******************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"/**\\n * Swiper 4.5.1\\n * Most modern mobile touch slider and framework with hardware accelerated transitions\\n * http://www.idangero.us/swiper/\\n *\\n * Copyright 2014-2019 Vladimir Kharlampidi\\n *\\n * Released under the MIT License\\n *\\n * Released on: September 13, 2019\\n */\\n.swiper-container {\\n margin-left: auto;\\n margin-right: auto;\\n position: relative;\\n overflow: hidden;\\n list-style: none;\\n padding: 0;\\n /* Fix of Webkit flickering */\\n z-index: 1;\\n}\\n.swiper-container-no-flexbox .swiper-slide {\\n float: left;\\n}\\n.swiper-container-vertical > .swiper-wrapper {\\n -webkit-box-orient: vertical;\\n -webkit-box-direction: normal;\\n -webkit-flex-direction: column;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n}\\n.swiper-wrapper {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n z-index: 1;\\n display: -webkit-box;\\n display: -webkit-flex;\\n display: -ms-flexbox;\\n display: flex;\\n -webkit-transition-property: -webkit-transform;\\n transition-property: -webkit-transform;\\n -o-transition-property: transform;\\n transition-property: transform;\\n transition-property: transform, -webkit-transform;\\n -webkit-box-sizing: content-box;\\n box-sizing: content-box;\\n}\\n.swiper-container-android .swiper-slide,\\n.swiper-wrapper {\\n -webkit-transform: translate3d(0px, 0, 0);\\n transform: translate3d(0px, 0, 0);\\n}\\n.swiper-container-multirow > .swiper-wrapper {\\n -webkit-flex-wrap: wrap;\\n -ms-flex-wrap: wrap;\\n flex-wrap: wrap;\\n}\\n.swiper-container-free-mode > .swiper-wrapper {\\n -webkit-transition-timing-function: ease-out;\\n -o-transition-timing-function: ease-out;\\n transition-timing-function: ease-out;\\n margin: 0 auto;\\n}\\n.swiper-slide {\\n -webkit-flex-shrink: 0;\\n -ms-flex-negative: 0;\\n flex-shrink: 0;\\n width: 100%;\\n height: 100%;\\n position: relative;\\n -webkit-transition-property: -webkit-transform;\\n transition-property: -webkit-transform;\\n -o-transition-property: transform;\\n transition-property: transform;\\n transition-property: transform, -webkit-transform;\\n}\\n.swiper-slide-invisible-blank {\\n visibility: hidden;\\n}\\n/* Auto Height */\\n.swiper-container-autoheight,\\n.swiper-container-autoheight .swiper-slide {\\n height: auto;\\n}\\n.swiper-container-autoheight .swiper-wrapper {\\n -webkit-box-align: start;\\n -webkit-align-items: flex-start;\\n -ms-flex-align: start;\\n align-items: flex-start;\\n -webkit-transition-property: height, -webkit-transform;\\n transition-property: height, -webkit-transform;\\n -o-transition-property: transform, height;\\n transition-property: transform, height;\\n transition-property: transform, height, -webkit-transform;\\n}\\n/* 3D Effects */\\n.swiper-container-3d {\\n -webkit-perspective: 1200px;\\n perspective: 1200px;\\n}\\n.swiper-container-3d .swiper-wrapper,\\n.swiper-container-3d .swiper-slide,\\n.swiper-container-3d .swiper-slide-shadow-left,\\n.swiper-container-3d .swiper-slide-shadow-right,\\n.swiper-container-3d .swiper-slide-shadow-top,\\n.swiper-container-3d .swiper-slide-shadow-bottom,\\n.swiper-container-3d .swiper-cube-shadow {\\n -webkit-transform-style: preserve-3d;\\n transform-style: preserve-3d;\\n}\\n.swiper-container-3d .swiper-slide-shadow-left,\\n.swiper-container-3d .swiper-slide-shadow-right,\\n.swiper-container-3d .swiper-slide-shadow-top,\\n.swiper-container-3d .swiper-slide-shadow-bottom {\\n position: absolute;\\n left: 0;\\n top: 0;\\n width: 100%;\\n height: 100%;\\n pointer-events: none;\\n z-index: 10;\\n}\\n.swiper-container-3d .swiper-slide-shadow-left {\\n background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-right {\\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-top {\\n background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-bottom {\\n background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n/* IE10 Windows Phone 8 Fixes */\\n.swiper-container-wp8-horizontal,\\n.swiper-container-wp8-horizontal > .swiper-wrapper {\\n -ms-touch-action: pan-y;\\n touch-action: pan-y;\\n}\\n.swiper-container-wp8-vertical,\\n.swiper-container-wp8-vertical > .swiper-wrapper {\\n -ms-touch-action: pan-x;\\n touch-action: pan-x;\\n}\\n.swiper-button-prev,\\n.swiper-button-next {\\n position: absolute;\\n top: 50%;\\n width: 27px;\\n height: 44px;\\n margin-top: -22px;\\n z-index: 10;\\n cursor: pointer;\\n background-size: 27px 44px;\\n background-position: center;\\n background-repeat: no-repeat;\\n}\\n.swiper-button-prev.swiper-button-disabled,\\n.swiper-button-next.swiper-button-disabled {\\n opacity: 0.35;\\n cursor: auto;\\n pointer-events: none;\\n}\\n.swiper-button-prev,\\n.swiper-container-rtl .swiper-button-next {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E\\\");\\n left: 10px;\\n right: auto;\\n}\\n.swiper-button-next,\\n.swiper-container-rtl .swiper-button-prev {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E\\\");\\n right: 10px;\\n left: auto;\\n}\\n.swiper-button-prev.swiper-button-white,\\n.swiper-container-rtl .swiper-button-next.swiper-button-white {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-next.swiper-button-white,\\n.swiper-container-rtl .swiper-button-prev.swiper-button-white {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-prev.swiper-button-black,\\n.swiper-container-rtl .swiper-button-next.swiper-button-black {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-next.swiper-button-black,\\n.swiper-container-rtl .swiper-button-prev.swiper-button-black {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-lock {\\n display: none;\\n}\\n.swiper-pagination {\\n position: absolute;\\n text-align: center;\\n -webkit-transition: 300ms opacity;\\n -o-transition: 300ms opacity;\\n transition: 300ms opacity;\\n -webkit-transform: translate3d(0, 0, 0);\\n transform: translate3d(0, 0, 0);\\n z-index: 10;\\n}\\n.swiper-pagination.swiper-pagination-hidden {\\n opacity: 0;\\n}\\n/* Common Styles */\\n.swiper-pagination-fraction,\\n.swiper-pagination-custom,\\n.swiper-container-horizontal > .swiper-pagination-bullets {\\n bottom: 10px;\\n left: 0;\\n width: 100%;\\n}\\n/* Bullets */\\n.swiper-pagination-bullets-dynamic {\\n overflow: hidden;\\n font-size: 0;\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n -webkit-transform: scale(0.33);\\n -ms-transform: scale(0.33);\\n transform: scale(0.33);\\n position: relative;\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {\\n -webkit-transform: scale(1);\\n -ms-transform: scale(1);\\n transform: scale(1);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main {\\n -webkit-transform: scale(1);\\n -ms-transform: scale(1);\\n transform: scale(1);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {\\n -webkit-transform: scale(0.66);\\n -ms-transform: scale(0.66);\\n transform: scale(0.66);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {\\n -webkit-transform: scale(0.33);\\n -ms-transform: scale(0.33);\\n transform: scale(0.33);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {\\n -webkit-transform: scale(0.66);\\n -ms-transform: scale(0.66);\\n transform: scale(0.66);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {\\n -webkit-transform: scale(0.33);\\n -ms-transform: scale(0.33);\\n transform: scale(0.33);\\n}\\n.swiper-pagination-bullet {\\n width: 8px;\\n height: 8px;\\n display: inline-block;\\n border-radius: 100%;\\n background: #000;\\n opacity: 0.2;\\n}\\nbutton.swiper-pagination-bullet {\\n border: none;\\n margin: 0;\\n padding: 0;\\n -webkit-box-shadow: none;\\n box-shadow: none;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n}\\n.swiper-pagination-clickable .swiper-pagination-bullet {\\n cursor: pointer;\\n}\\n.swiper-pagination-bullet-active {\\n opacity: 1;\\n background: #007aff;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets {\\n right: 10px;\\n top: 50%;\\n -webkit-transform: translate3d(0px, -50%, 0);\\n transform: translate3d(0px, -50%, 0);\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet {\\n margin: 6px 0;\\n display: block;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {\\n top: 50%;\\n -webkit-transform: translateY(-50%);\\n -ms-transform: translateY(-50%);\\n transform: translateY(-50%);\\n width: 8px;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n display: inline-block;\\n -webkit-transition: 200ms top, 200ms -webkit-transform;\\n transition: 200ms top, 200ms -webkit-transform;\\n -o-transition: 200ms transform, 200ms top;\\n transition: 200ms transform, 200ms top;\\n transition: 200ms transform, 200ms top, 200ms -webkit-transform;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet {\\n margin: 0 4px;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {\\n left: 50%;\\n -webkit-transform: translateX(-50%);\\n -ms-transform: translateX(-50%);\\n transform: translateX(-50%);\\n white-space: nowrap;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n -webkit-transition: 200ms left, 200ms -webkit-transform;\\n transition: 200ms left, 200ms -webkit-transform;\\n -o-transition: 200ms transform, 200ms left;\\n transition: 200ms transform, 200ms left;\\n transition: 200ms transform, 200ms left, 200ms -webkit-transform;\\n}\\n.swiper-container-horizontal.swiper-container-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n -webkit-transition: 200ms right, 200ms -webkit-transform;\\n transition: 200ms right, 200ms -webkit-transform;\\n -o-transition: 200ms transform, 200ms right;\\n transition: 200ms transform, 200ms right;\\n transition: 200ms transform, 200ms right, 200ms -webkit-transform;\\n}\\n/* Progress */\\n.swiper-pagination-progressbar {\\n background: rgba(0, 0, 0, 0.25);\\n position: absolute;\\n}\\n.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {\\n background: #007aff;\\n position: absolute;\\n left: 0;\\n top: 0;\\n width: 100%;\\n height: 100%;\\n -webkit-transform: scale(0);\\n -ms-transform: scale(0);\\n transform: scale(0);\\n -webkit-transform-origin: left top;\\n -ms-transform-origin: left top;\\n transform-origin: left top;\\n}\\n.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill {\\n -webkit-transform-origin: right top;\\n -ms-transform-origin: right top;\\n transform-origin: right top;\\n}\\n.swiper-container-horizontal > .swiper-pagination-progressbar,\\n.swiper-container-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite {\\n width: 100%;\\n height: 4px;\\n left: 0;\\n top: 0;\\n}\\n.swiper-container-vertical > .swiper-pagination-progressbar,\\n.swiper-container-horizontal > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite {\\n width: 4px;\\n height: 100%;\\n left: 0;\\n top: 0;\\n}\\n.swiper-pagination-white .swiper-pagination-bullet-active {\\n background: #ffffff;\\n}\\n.swiper-pagination-progressbar.swiper-pagination-white {\\n background: rgba(255, 255, 255, 0.25);\\n}\\n.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill {\\n background: #ffffff;\\n}\\n.swiper-pagination-black .swiper-pagination-bullet-active {\\n background: #000000;\\n}\\n.swiper-pagination-progressbar.swiper-pagination-black {\\n background: rgba(0, 0, 0, 0.25);\\n}\\n.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill {\\n background: #000000;\\n}\\n.swiper-pagination-lock {\\n display: none;\\n}\\n/* Scrollbar */\\n.swiper-scrollbar {\\n border-radius: 10px;\\n position: relative;\\n -ms-touch-action: none;\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.swiper-container-horizontal > .swiper-scrollbar {\\n position: absolute;\\n left: 1%;\\n bottom: 3px;\\n z-index: 50;\\n height: 5px;\\n width: 98%;\\n}\\n.swiper-container-vertical > .swiper-scrollbar {\\n position: absolute;\\n right: 3px;\\n top: 1%;\\n z-index: 50;\\n width: 5px;\\n height: 98%;\\n}\\n.swiper-scrollbar-drag {\\n height: 100%;\\n width: 100%;\\n position: relative;\\n background: rgba(0, 0, 0, 0.5);\\n border-radius: 10px;\\n left: 0;\\n top: 0;\\n}\\n.swiper-scrollbar-cursor-drag {\\n cursor: move;\\n}\\n.swiper-scrollbar-lock {\\n display: none;\\n}\\n.swiper-zoom-container {\\n width: 100%;\\n height: 100%;\\n display: -webkit-box;\\n display: -webkit-flex;\\n display: -ms-flexbox;\\n display: flex;\\n -webkit-box-pack: center;\\n -webkit-justify-content: center;\\n -ms-flex-pack: center;\\n justify-content: center;\\n -webkit-box-align: center;\\n -webkit-align-items: center;\\n -ms-flex-align: center;\\n align-items: center;\\n text-align: center;\\n}\\n.swiper-zoom-container > img,\\n.swiper-zoom-container > svg,\\n.swiper-zoom-container > canvas {\\n max-width: 100%;\\n max-height: 100%;\\n -o-object-fit: contain;\\n object-fit: contain;\\n}\\n.swiper-slide-zoomed {\\n cursor: move;\\n}\\n/* Preloader */\\n.swiper-lazy-preloader {\\n width: 42px;\\n height: 42px;\\n position: absolute;\\n left: 50%;\\n top: 50%;\\n margin-left: -21px;\\n margin-top: -21px;\\n z-index: 10;\\n -webkit-transform-origin: 50%;\\n -ms-transform-origin: 50%;\\n transform-origin: 50%;\\n -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;\\n animation: swiper-preloader-spin 1s steps(12, end) infinite;\\n}\\n.swiper-lazy-preloader:after {\\n display: block;\\n content: '';\\n width: 100%;\\n height: 100%;\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\\\");\\n background-position: 50%;\\n background-size: 100%;\\n background-repeat: no-repeat;\\n}\\n.swiper-lazy-preloader-white:after {\\n background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\\\");\\n}\\n@-webkit-keyframes swiper-preloader-spin {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n@keyframes swiper-preloader-spin {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n/* a11y */\\n.swiper-container .swiper-notification {\\n position: absolute;\\n left: 0;\\n top: 0;\\n pointer-events: none;\\n opacity: 0;\\n z-index: -1000;\\n}\\n.swiper-container-fade.swiper-container-free-mode .swiper-slide {\\n -webkit-transition-timing-function: ease-out;\\n -o-transition-timing-function: ease-out;\\n transition-timing-function: ease-out;\\n}\\n.swiper-container-fade .swiper-slide {\\n pointer-events: none;\\n -webkit-transition-property: opacity;\\n -o-transition-property: opacity;\\n transition-property: opacity;\\n}\\n.swiper-container-fade .swiper-slide .swiper-slide {\\n pointer-events: none;\\n}\\n.swiper-container-fade .swiper-slide-active,\\n.swiper-container-fade .swiper-slide-active .swiper-slide-active {\\n pointer-events: auto;\\n}\\n.swiper-container-cube {\\n overflow: visible;\\n}\\n.swiper-container-cube .swiper-slide {\\n pointer-events: none;\\n -webkit-backface-visibility: hidden;\\n backface-visibility: hidden;\\n z-index: 1;\\n visibility: hidden;\\n -webkit-transform-origin: 0 0;\\n -ms-transform-origin: 0 0;\\n transform-origin: 0 0;\\n width: 100%;\\n height: 100%;\\n}\\n.swiper-container-cube .swiper-slide .swiper-slide {\\n pointer-events: none;\\n}\\n.swiper-container-cube.swiper-container-rtl .swiper-slide {\\n -webkit-transform-origin: 100% 0;\\n -ms-transform-origin: 100% 0;\\n transform-origin: 100% 0;\\n}\\n.swiper-container-cube .swiper-slide-active,\\n.swiper-container-cube .swiper-slide-active .swiper-slide-active {\\n pointer-events: auto;\\n}\\n.swiper-container-cube .swiper-slide-active,\\n.swiper-container-cube .swiper-slide-next,\\n.swiper-container-cube .swiper-slide-prev,\\n.swiper-container-cube .swiper-slide-next + .swiper-slide {\\n pointer-events: auto;\\n visibility: visible;\\n}\\n.swiper-container-cube .swiper-slide-shadow-top,\\n.swiper-container-cube .swiper-slide-shadow-bottom,\\n.swiper-container-cube .swiper-slide-shadow-left,\\n.swiper-container-cube .swiper-slide-shadow-right {\\n z-index: 0;\\n -webkit-backface-visibility: hidden;\\n backface-visibility: hidden;\\n}\\n.swiper-container-cube .swiper-cube-shadow {\\n position: absolute;\\n left: 0;\\n bottom: 0px;\\n width: 100%;\\n height: 100%;\\n background: #000;\\n opacity: 0.6;\\n -webkit-filter: blur(50px);\\n filter: blur(50px);\\n z-index: 0;\\n}\\n.swiper-container-flip {\\n overflow: visible;\\n}\\n.swiper-container-flip .swiper-slide {\\n pointer-events: none;\\n -webkit-backface-visibility: hidden;\\n backface-visibility: hidden;\\n z-index: 1;\\n}\\n.swiper-container-flip .swiper-slide .swiper-slide {\\n pointer-events: none;\\n}\\n.swiper-container-flip .swiper-slide-active,\\n.swiper-container-flip .swiper-slide-active .swiper-slide-active {\\n pointer-events: auto;\\n}\\n.swiper-container-flip .swiper-slide-shadow-top,\\n.swiper-container-flip .swiper-slide-shadow-bottom,\\n.swiper-container-flip .swiper-slide-shadow-left,\\n.swiper-container-flip .swiper-slide-shadow-right {\\n z-index: 0;\\n -webkit-backface-visibility: hidden;\\n backface-visibility: hidden;\\n}\\n.swiper-container-coverflow .swiper-wrapper {\\n /* Windows 8 IE 10 fix */\\n -ms-perspective: 1200px;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9jc3Mvc3dpcGVyLmNzcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fc3dpcGVyQDQuNS4xQHN3aXBlci9kaXN0L2Nzcy9zd2lwZXIuY3NzPzQ3ZTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi8qKlxcbiAqIFN3aXBlciA0LjUuMVxcbiAqIE1vc3QgbW9kZXJuIG1vYmlsZSB0b3VjaCBzbGlkZXIgYW5kIGZyYW1ld29yayB3aXRoIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHRyYW5zaXRpb25zXFxuICogaHR0cDovL3d3dy5pZGFuZ2Vyby51cy9zd2lwZXIvXFxuICpcXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE5IFZsYWRpbWlyIEtoYXJsYW1waWRpXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcXG4gKlxcbiAqIFJlbGVhc2VkIG9uOiBTZXB0ZW1iZXIgMTMsIDIwMTlcXG4gKi9cXG4uc3dpcGVyLWNvbnRhaW5lciB7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgcGFkZGluZzogMDtcXG4gIC8qIEZpeCBvZiBXZWJraXQgZmxpY2tlcmluZyAqL1xcbiAgei1pbmRleDogMTtcXG59XFxuLnN3aXBlci1jb250YWluZXItbm8tZmxleGJveCAuc3dpcGVyLXNsaWRlIHtcXG4gIGZsb2F0OiBsZWZ0O1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItd3JhcHBlciB7XFxuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XFxuICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxufVxcbi5zd2lwZXItd3JhcHBlciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHotaW5kZXg6IDE7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcXG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgLXdlYmtpdC10cmFuc2Zvcm07XFxuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWFuZHJvaWQgLnN3aXBlci1zbGlkZSxcXG4uc3dpcGVyLXdyYXBwZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgMCwgMCk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgMCwgMCk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLW11bHRpcm93ID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xcbiAgLW1zLWZsZXgtd3JhcDogd3JhcDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZnJlZS1tb2RlID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgLW8tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgbWFyZ2luOiAwIGF1dG87XFxufVxcbi5zd2lwZXItc2xpZGUge1xcbiAgLXdlYmtpdC1mbGV4LXNocmluazogMDtcXG4gIC1tcy1mbGV4LW5lZ2F0aXZlOiAwO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgLXdlYmtpdC10cmFuc2Zvcm07XFxufVxcbi5zd2lwZXItc2xpZGUtaW52aXNpYmxlLWJsYW5rIHtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG59XFxuLyogQXV0byBIZWlnaHQgKi9cXG4uc3dpcGVyLWNvbnRhaW5lci1hdXRvaGVpZ2h0LFxcbi5zd2lwZXItY29udGFpbmVyLWF1dG9oZWlnaHQgLnN3aXBlci1zbGlkZSB7XFxuICBoZWlnaHQ6IGF1dG87XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWF1dG9oZWlnaHQgLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7XFxuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogaGVpZ2h0LCAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGhlaWdodCwgLXdlYmtpdC10cmFuc2Zvcm07XFxuICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGhlaWdodDtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgaGVpZ2h0O1xcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBoZWlnaHQsIC13ZWJraXQtdHJhbnNmb3JtO1xcbn1cXG4vKiAzRCBFZmZlY3RzICovXFxuLnN3aXBlci1jb250YWluZXItM2Qge1xcbiAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xcbiAgcGVyc3BlY3RpdmU6IDEyMDBweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci13cmFwcGVyLFxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItc2xpZGUsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLFxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItY3ViZS1zaGFkb3cge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xcbiAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgei1pbmRleDogMTA7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIHJpZ2h0IHRvcCwgbGVmdCB0b3AsIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCByaWdodCB0b3AsIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3Age1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgYm90dG9tLCBsZWZ0IHRvcCwgZnJvbShyZ2JhKDAsIDAsIDAsIDAuNSkpLCB0byhyZ2JhKDAsIDAsIDAsIDApKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxufVxcbi8qIElFMTAgV2luZG93cyBQaG9uZSA4IEZpeGVzICovXFxuLnN3aXBlci1jb250YWluZXItd3A4LWhvcml6b250YWwsXFxuLnN3aXBlci1jb250YWluZXItd3A4LWhvcml6b250YWwgPiAuc3dpcGVyLXdyYXBwZXIge1xcbiAgLW1zLXRvdWNoLWFjdGlvbjogcGFuLXk7XFxuICB0b3VjaC1hY3Rpb246IHBhbi15O1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci13cDgtdmVydGljYWwsXFxuLnN3aXBlci1jb250YWluZXItd3A4LXZlcnRpY2FsID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC1tcy10b3VjaC1hY3Rpb246IHBhbi14O1xcbiAgdG91Y2gtYWN0aW9uOiBwYW4teDtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldixcXG4uc3dpcGVyLWJ1dHRvbi1uZXh0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNTAlO1xcbiAgd2lkdGg6IDI3cHg7XFxuICBoZWlnaHQ6IDQ0cHg7XFxuICBtYXJnaW4tdG9wOiAtMjJweDtcXG4gIHotaW5kZXg6IDEwO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1zaXplOiAyN3B4IDQ0cHg7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1wcmV2LnN3aXBlci1idXR0b24tZGlzYWJsZWQsXFxuLnN3aXBlci1idXR0b24tbmV4dC5zd2lwZXItYnV0dG9uLWRpc2FibGVkIHtcXG4gIG9wYWNpdHk6IDAuMzU7XFxuICBjdXJzb3I6IGF1dG87XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldixcXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tbmV4dCB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMCUyQzIyTDIyJTJDMGwyLjElMkMyLjFMNC4yJTJDMjJsMTkuOSUyQzE5LjlMMjIlMkM0NEwwJTJDMjJMMCUyQzIyTDAlMkMyMnonJTIwZmlsbCUzRCclMjMwMDdhZmYnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxuICBsZWZ0OiAxMHB4O1xcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5zd2lwZXItYnV0dG9uLW5leHQsXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLXByZXYge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmclMjB4bWxucyUzRCdodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmcnJTIwdmlld0JveCUzRCcwJTIwMCUyMDI3JTIwNDQnJTNFJTNDcGF0aCUyMGQlM0QnTTI3JTJDMjJMMjclMkMyMkw1JTJDNDRsLTIuMS0yLjFMMjIuOCUyQzIyTDIuOSUyQzIuMUw1JTJDMEwyNyUyQzIyTDI3JTJDMjJ6JyUyMGZpbGwlM0QnJTIzMDA3YWZmJyUyRiUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbiAgcmlnaHQ6IDEwcHg7XFxuICBsZWZ0OiBhdXRvO1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1wcmV2LnN3aXBlci1idXR0b24td2hpdGUsXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLW5leHQuc3dpcGVyLWJ1dHRvbi13aGl0ZSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMCUyQzIyTDIyJTJDMGwyLjElMkMyLjFMNC4yJTJDMjJsMTkuOSUyQzE5LjlMMjIlMkM0NEwwJTJDMjJMMCUyQzIyTDAlMkMyMnonJTIwZmlsbCUzRCclMjNmZmZmZmYnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxufVxcbi5zd2lwZXItYnV0dG9uLW5leHQuc3dpcGVyLWJ1dHRvbi13aGl0ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tcHJldi5zd2lwZXItYnV0dG9uLXdoaXRlIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHZpZXdCb3glM0QnMCUyMDAlMjAyNyUyMDQ0JyUzRSUzQ3BhdGglMjBkJTNEJ00yNyUyQzIyTDI3JTJDMjJMNSUyQzQ0bC0yLjEtMi4xTDIyLjglMkMyMkwyLjklMkMyLjFMNSUyQzBMMjclMkMyMkwyNyUyQzIyeiclMjBmaWxsJTNEJyUyM2ZmZmZmZiclMkYlM0UlM0MlMkZzdmclM0VcXFwiKTtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldi5zd2lwZXItYnV0dG9uLWJsYWNrLFxcbi5zd2lwZXItY29udGFpbmVyLXJ0bCAuc3dpcGVyLWJ1dHRvbi1uZXh0LnN3aXBlci1idXR0b24tYmxhY2sge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmclMjB4bWxucyUzRCdodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmcnJTIwdmlld0JveCUzRCcwJTIwMCUyMDI3JTIwNDQnJTNFJTNDcGF0aCUyMGQlM0QnTTAlMkMyMkwyMiUyQzBsMi4xJTJDMi4xTDQuMiUyQzIybDE5LjklMkMxOS45TDIyJTJDNDRMMCUyQzIyTDAlMkMyMkwwJTJDMjJ6JyUyMGZpbGwlM0QnJTIzMDAwMDAwJyUyRiUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1uZXh0LnN3aXBlci1idXR0b24tYmxhY2ssXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLXByZXYuc3dpcGVyLWJ1dHRvbi1ibGFjayB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMjclMkMyMkwyNyUyQzIyTDUlMkM0NGwtMi4xLTIuMUwyMi44JTJDMjJMMi45JTJDMi4xTDUlMkMwTDI3JTJDMjJMMjclMkMyMnonJTIwZmlsbCUzRCclMjMwMDAwMDAnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxufVxcbi5zd2lwZXItYnV0dG9uLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXMgb3BhY2l0eTtcXG4gIC1vLXRyYW5zaXRpb246IDMwMG1zIG9wYWNpdHk7XFxuICB0cmFuc2l0aW9uOiAzMDBtcyBvcGFjaXR5O1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcXG4gIHotaW5kZXg6IDEwO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24uc3dpcGVyLXBhZ2luYXRpb24taGlkZGVuIHtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi8qIENvbW1vbiBTdHlsZXMgKi9cXG4uc3dpcGVyLXBhZ2luYXRpb24tZnJhY3Rpb24sXFxuLnN3aXBlci1wYWdpbmF0aW9uLWN1c3RvbSxcXG4uc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMge1xcbiAgYm90dG9tOiAxMHB4O1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4vKiBCdWxsZXRzICovXFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyB7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgZm9udC1zaXplOiAwO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1tYWluIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1wcmV2IHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjY2KTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjY2KTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1wcmV2LXByZXYge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlLW5leHQge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC42Nik7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlLW5leHQtbmV4dCB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjMzKTtcXG4gIHRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgd2lkdGg6IDhweDtcXG4gIGhlaWdodDogOHB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gIGJhY2tncm91bmQ6ICMwMDA7XFxuICBvcGFjaXR5OiAwLjI7XFxufVxcbmJ1dHRvbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tY2xpY2thYmxlIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZSB7XFxuICBvcGFjaXR5OiAxO1xcbiAgYmFja2dyb3VuZDogIzAwN2FmZjtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cyB7XFxuICByaWdodDogMTBweDtcXG4gIHRvcDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgLTUwJSwgMCk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgLTUwJSwgMCk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICBtYXJnaW46IDZweCAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIHtcXG4gIHRvcDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XFxuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcbiAgd2lkdGg6IDhweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLWR5bmFtaWMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IDIwMG1zIHRvcCwgMjAwbXMgLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0b3AsIDIwMG1zIC13ZWJraXQtdHJhbnNmb3JtO1xcbiAgLW8tdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyB0b3A7XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0cmFuc2Zvcm0sIDIwMG1zIHRvcDtcXG4gIHRyYW5zaXRpb246IDIwMG1zIHRyYW5zZm9ybSwgMjAwbXMgdG9wLCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgbWFyZ2luOiAwIDRweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyB7XFxuICBsZWZ0OiA1MCU7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAyMDBtcyBsZWZ0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb246IDIwMG1zIGxlZnQsIDIwMG1zIC13ZWJraXQtdHJhbnNmb3JtO1xcbiAgLW8tdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbC5zd2lwZXItY29udGFpbmVyLXJ0bCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLWR5bmFtaWMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IDIwMG1zIHJpZ2h0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb246IDIwMG1zIHJpZ2h0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb246IDIwMG1zIHRyYW5zZm9ybSwgMjAwbXMgcmlnaHQ7XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0cmFuc2Zvcm0sIDIwMG1zIHJpZ2h0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyByaWdodCwgMjAwbXMgLXdlYmtpdC10cmFuc2Zvcm07XFxufVxcbi8qIFByb2dyZXNzICovXFxuLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhciAuc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXItZmlsbCB7XFxuICBiYWNrZ3JvdW5kOiAjMDA3YWZmO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1maWxsIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhcixcXG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1vcHBvc2l0ZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNHB4O1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIsXFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1vcHBvc2l0ZSB7XFxuICB3aWR0aDogNHB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLXdoaXRlIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi13aGl0ZSB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIuc3dpcGVyLXBhZ2luYXRpb24td2hpdGUgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyLWZpbGwge1xcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJsYWNrIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICMwMDAwMDA7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1ibGFjayB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIuc3dpcGVyLXBhZ2luYXRpb24tYmxhY2sgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyLWZpbGwge1xcbiAgYmFja2dyb3VuZDogIzAwMDAwMDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLyogU2Nyb2xsYmFyICovXFxuLnN3aXBlci1zY3JvbGxiYXIge1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC1tcy10b3VjaC1hY3Rpb246IG5vbmU7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMSk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWhvcml6b250YWwgPiAuc3dpcGVyLXNjcm9sbGJhciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAxJTtcXG4gIGJvdHRvbTogM3B4O1xcbiAgei1pbmRleDogNTA7XFxuICBoZWlnaHQ6IDVweDtcXG4gIHdpZHRoOiA5OCU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1zY3JvbGxiYXIge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDNweDtcXG4gIHRvcDogMSU7XFxuICB6LWluZGV4OiA1MDtcXG4gIHdpZHRoOiA1cHg7XFxuICBoZWlnaHQ6IDk4JTtcXG59XFxuLnN3aXBlci1zY3JvbGxiYXItZHJhZyB7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbn1cXG4uc3dpcGVyLXNjcm9sbGJhci1jdXJzb3ItZHJhZyB7XFxuICBjdXJzb3I6IG1vdmU7XFxufVxcbi5zd2lwZXItc2Nyb2xsYmFyLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLnN3aXBlci16b29tLWNvbnRhaW5lciB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uc3dpcGVyLXpvb20tY29udGFpbmVyID4gaW1nLFxcbi5zd2lwZXItem9vbS1jb250YWluZXIgPiBzdmcsXFxuLnN3aXBlci16b29tLWNvbnRhaW5lciA+IGNhbnZhcyB7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBtYXgtaGVpZ2h0OiAxMDAlO1xcbiAgLW8tb2JqZWN0LWZpdDogY29udGFpbjtcXG4gIG9iamVjdC1maXQ6IGNvbnRhaW47XFxufVxcbi5zd2lwZXItc2xpZGUtem9vbWVkIHtcXG4gIGN1cnNvcjogbW92ZTtcXG59XFxuLyogUHJlbG9hZGVyICovXFxuLnN3aXBlci1sYXp5LXByZWxvYWRlciB7XFxuICB3aWR0aDogNDJweDtcXG4gIGhlaWdodDogNDJweDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRvcDogNTAlO1xcbiAgbWFyZ2luLWxlZnQ6IC0yMXB4O1xcbiAgbWFyZ2luLXRvcDogLTIxcHg7XFxuICB6LWluZGV4OiAxMDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDUwJTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDUwJTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzd2lwZXItcHJlbG9hZGVyLXNwaW4gMXMgc3RlcHMoMTIsIGVuZCkgaW5maW5pdGU7XFxuICBhbmltYXRpb246IHN3aXBlci1wcmVsb2FkZXItc3BpbiAxcyBzdGVwcygxMiwgZW5kKSBpbmZpbml0ZTtcXG59XFxuLnN3aXBlci1sYXp5LXByZWxvYWRlcjphZnRlciB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGNvbnRlbnQ6ICcnO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHZpZXdCb3glM0QnMCUyMDAlMjAxMjAlMjAxMjAnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHhtbG5zJTNBeGxpbmslM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmsnJTNFJTNDZGVmcyUzRSUzQ2xpbmUlMjBpZCUzRCdsJyUyMHgxJTNEJzYwJyUyMHgyJTNEJzYwJyUyMHkxJTNEJzcnJTIweTIlM0QnMjcnJTIwc3Ryb2tlJTNEJyUyMzZjNmM2YyclMjBzdHJva2Utd2lkdGglM0QnMTEnJTIwc3Ryb2tlLWxpbmVjYXAlM0Qncm91bmQnJTJGJTNFJTNDJTJGZGVmcyUzRSUzQ2clM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMjcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSg2MCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoOTAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDEyMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMTUwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMzcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgxODAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy40NiclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDIxMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjU2JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMjQwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuNjYnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgyNzAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy43NSclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjg1JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMzMwJTIwNjAlMkM2MCknJTJGJTNFJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlO1xcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuLnN3aXBlci1sYXp5LXByZWxvYWRlci13aGl0ZTphZnRlciB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHZpZXdCb3glM0QnMCUyMDAlMjAxMjAlMjAxMjAnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHhtbG5zJTNBeGxpbmslM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmsnJTNFJTNDZGVmcyUzRSUzQ2xpbmUlMjBpZCUzRCdsJyUyMHgxJTNEJzYwJyUyMHgyJTNEJzYwJyUyMHkxJTNEJzcnJTIweTIlM0QnMjcnJTIwc3Ryb2tlJTNEJyUyM2ZmZiclMjBzdHJva2Utd2lkdGglM0QnMTEnJTIwc3Ryb2tlLWxpbmVjYXAlM0Qncm91bmQnJTJGJTNFJTNDJTJGZGVmcyUzRSUzQ2clM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMjcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSg2MCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoOTAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDEyMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMTUwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMzcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgxODAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy40NiclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDIxMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjU2JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMjQwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuNjYnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgyNzAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy43NSclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjg1JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMzMwJTIwNjAlMkM2MCknJTJGJTNFJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgc3dpcGVyLXByZWxvYWRlci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3dpcGVyLXByZWxvYWRlci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbi8qIGExMXkgKi9cXG4uc3dpcGVyLWNvbnRhaW5lciAuc3dpcGVyLW5vdGlmaWNhdGlvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBvcGFjaXR5OiAwO1xcbiAgei1pbmRleDogLTEwMDA7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUuc3dpcGVyLWNvbnRhaW5lci1mcmVlLW1vZGUgLnN3aXBlci1zbGlkZSB7XFxuICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG4gIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmFkZSAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xcbiAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUgLnN3aXBlci1zbGlkZSAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mYWRlIC5zd2lwZXItc2xpZGUtYWN0aXZlLFxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUgLnN3aXBlci1zbGlkZS1hY3RpdmUgLnN3aXBlci1zbGlkZS1hY3RpdmUge1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUge1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgei1pbmRleDogMTtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDAgMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZS5zd2lwZXItY29udGFpbmVyLXJ0bCAuc3dpcGVyLXNsaWRlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZSAuc3dpcGVyLXNsaWRlLWFjdGl2ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtYWN0aXZlIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtYWN0aXZlLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1uZXh0LFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1wcmV2LFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1uZXh0ICsgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogYXV0bztcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0IHtcXG4gIHotaW5kZXg6IDA7XFxuICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZSAuc3dpcGVyLWN1YmUtc2hhZG93IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICBib3R0b206IDBweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYmFja2dyb3VuZDogIzAwMDtcXG4gIG9wYWNpdHk6IDAuNjtcXG4gIC13ZWJraXQtZmlsdGVyOiBibHVyKDUwcHgpO1xcbiAgZmlsdGVyOiBibHVyKDUwcHgpO1xcbiAgei1pbmRleDogMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCB7XFxuICBvdmVyZmxvdzogdmlzaWJsZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICB6LWluZGV4OiAxO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlLWFjdGl2ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtYWN0aXZlIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbSxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQsXFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCB7XFxuICB6LWluZGV4OiAwO1xcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWNvdmVyZmxvdyAuc3dpcGVyLXdyYXBwZXIge1xcbiAgLyogV2luZG93cyA4IElFIDEwIGZpeCAqL1xcbiAgLW1zLXBlcnNwZWN0aXZlOiAxMjAwcHg7XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css":
/*!***********************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css ***!
\***********************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".van-collapse-item__title .van-cell__right-icon::before{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.van-collapse-item__title::after{visibility:hidden}.van-collapse-item__title--expanded .van-cell__right-icon::before{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.van-collapse-item__title--expanded::after{visibility:visible}.van-collapse-item__title--disabled,.van-collapse-item__title--disabled .van-cell__right-icon{color:#c8c9cc}.van-collapse-item__title--disabled:active{background-color:#fff}.van-collapse-item__wrapper{overflow:hidden;-webkit-transition:height .3s ease-in-out;transition:height .3s ease-in-out;will-change:height}.van-collapse-item__content{padding:16px;color:#969799;font-size:13px;line-height:1.5;background-color:#fff}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3M/N2MyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZSAudmFuLWNlbGxfX3JpZ2h0LWljb246OmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuM3M7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcywtd2Via2l0LXRyYW5zZm9ybSAuM3N9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZTo6YWZ0ZXJ7dmlzaWJpbGl0eTpoaWRkZW59LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZXhwYW5kZWQgLnZhbi1jZWxsX19yaWdodC1pY29uOjpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfS52YW4tY29sbGFwc2UtaXRlbV9fdGl0bGUtLWV4cGFuZGVkOjphZnRlcnt2aXNpYmlsaXR5OnZpc2libGV9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQsLnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQgLnZhbi1jZWxsX19yaWdodC1pY29ue2NvbG9yOiNjOGM5Y2N9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQ6YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNvbGxhcHNlLWl0ZW1fX3dyYXBwZXJ7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdHJhbnNpdGlvbjpoZWlnaHQgLjNzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlLWluLW91dDt3aWxsLWNoYW5nZTpoZWlnaHR9LnZhbi1jb2xsYXBzZS1pdGVtX19jb250ZW50e3BhZGRpbmc6MTZweDtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9XCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css":
/*!***************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/image/index.css ***!
\***************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".van-image{position:relative;display:inline-block}.van-image--round{overflow:hidden;border-radius:50%}.van-image--round img{border-radius:inherit}.van-image__error,.van-image__img,.van-image__loading{display:block;width:100%;height:100%}.van-image__error,.van-image__loading{position:absolute;top:0;left:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;color:#969799;font-size:14px;background-color:#f8f8f8}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2ltYWdlL2luZGV4LmNzcz81ZmJhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIudmFuLWltYWdle3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS52YW4taW1hZ2UtLXJvdW5ke292ZXJmbG93OmhpZGRlbjtib3JkZXItcmFkaXVzOjUwJX0udmFuLWltYWdlLS1yb3VuZCBpbWd7Ym9yZGVyLXJhZGl1czppbmhlcml0fS52YW4taW1hZ2VfX2Vycm9yLC52YW4taW1hZ2VfX2ltZywudmFuLWltYWdlX19sb2FkaW5ne2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udmFuLWltYWdlX19lcnJvciwudmFuLWltYWdlX19sb2FkaW5ne3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjstd2Via2l0LWJveC1wYWNrOmNlbnRlcjstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxNHB4O2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmOH1cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css":
/*!**************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/style/base.css ***!
\**************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@-webkit-keyframes van-slide-up-enter{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes van-slide-up-enter{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@-webkit-keyframes van-slide-up-leave{to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes van-slide-up-leave{to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@-webkit-keyframes van-slide-down-enter{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes van-slide-down-enter{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@-webkit-keyframes van-slide-down-leave{to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes van-slide-down-leave{to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@-webkit-keyframes van-slide-left-enter{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes van-slide-left-enter{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes van-slide-left-leave{to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes van-slide-left-leave{to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes van-slide-right-enter{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes van-slide-right-enter{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes van-slide-right-leave{to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes van-slide-right-leave{to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes van-fade-in{0%{opacity:0}to{opacity:1}}@keyframes van-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes van-fade-out{0%{opacity:1}to{opacity:0}}@keyframes van-fade-out{0%{opacity:1}to{opacity:0}}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes van-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}@keyframes van-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}html{-webkit-tap-highlight-color:transparent}body{margin:0}a{text-decoration:none}[class*=van-]:focus,a:focus,button:focus,input:focus,textarea:focus{outline:0}ol,ul{margin:0;padding:0;list-style:none}button,input,textarea{color:inherit;font:inherit}.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix::after{display:table;clear:both;content:''}[class*=van-hairline]::after{position:absolute;box-sizing:border-box;content:' ';pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #ebedf0;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--top::after{border-top-width:1px}.van-hairline--left::after{border-left-width:1px}.van-hairline--right::after{border-right-width:1px}.van-hairline--bottom::after{border-bottom-width:1px}.van-hairline--top-bottom::after,.van-hairline-unset--top-bottom::after{border-width:1px 0}.van-hairline--surround::after{border-width:1px}.van-fade-enter-active{-webkit-animation:.3s van-fade-in;animation:.3s van-fade-in}.van-fade-leave-active{-webkit-animation:.3s van-fade-out;animation:.3s van-fade-out}.van-slide-up-enter-active{-webkit-animation:van-slide-up-enter .3s both ease;animation:van-slide-up-enter .3s both ease}.van-slide-up-leave-active{-webkit-animation:van-slide-up-leave .3s both ease;animation:van-slide-up-leave .3s both ease}.van-slide-down-enter-active{-webkit-animation:van-slide-down-enter .3s both ease;animation:van-slide-down-enter .3s both ease}.van-slide-down-leave-active{-webkit-animation:van-slide-down-leave .3s both ease;animation:van-slide-down-leave .3s both ease}.van-slide-left-enter-active{-webkit-animation:van-slide-left-enter .3s both ease;animation:van-slide-left-enter .3s both ease}.van-slide-left-leave-active{-webkit-animation:van-slide-left-leave .3s both ease;animation:van-slide-left-leave .3s both ease}.van-slide-right-enter-active{-webkit-animation:van-slide-right-enter .3s both ease;animation:van-slide-right-enter .3s both ease}.van-slide-right-leave-active{-webkit-animation:van-slide-right-leave .3s both ease;animation:van-slide-right-leave .3s both ease}.van-info{position:absolute;top:0;right:0;box-sizing:border-box;min-width:16px;padding:0 3px;color:#fff;font-weight:500;font-size:12px;font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;line-height:14px;text-align:center;background-color:#ee0a24;border:1px solid #fff;border-radius:16px;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%}.van-info--dot{width:8px;min-width:0;height:8px;background-color:#ee0a24;border-radius:100%}@font-face{font-weight:400;font-family:'vant-icon';font-style:normal;font-display:auto;src:url(https://img.yzcdn.cn/vant/vant-icon-0bc654.woff2) format('woff2'),url(https://img.yzcdn.cn/vant/vant-icon-0bc654.woff) format('woff'),url(https://img.yzcdn.cn/vant/vant-icon-0bc654.ttf) format('truetype')}.van-icon{position:relative;font:14px/1 \\\"vant-icon\\\";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.van-icon,.van-icon::before{display:inline-block}.van-icon-add-o:before{content:\\\"\\\\F000\\\"}.van-icon-add-square:before{content:\\\"\\\\F001\\\"}.van-icon-add:before{content:\\\"\\\\F002\\\"}.van-icon-after-sale:before{content:\\\"\\\\F003\\\"}.van-icon-aim:before{content:\\\"\\\\F004\\\"}.van-icon-alipay:before{content:\\\"\\\\F005\\\"}.van-icon-apps-o:before{content:\\\"\\\\F006\\\"}.van-icon-arrow-down:before{content:\\\"\\\\F007\\\"}.van-icon-arrow-left:before{content:\\\"\\\\F008\\\"}.van-icon-arrow-up:before{content:\\\"\\\\F009\\\"}.van-icon-arrow:before{content:\\\"\\\\F00A\\\"}.van-icon-ascending:before{content:\\\"\\\\F00B\\\"}.van-icon-audio:before{content:\\\"\\\\F00C\\\"}.van-icon-award-o:before{content:\\\"\\\\F00D\\\"}.van-icon-award:before{content:\\\"\\\\F00E\\\"}.van-icon-bag-o:before{content:\\\"\\\\F00F\\\"}.van-icon-bag:before{content:\\\"\\\\F010\\\"}.van-icon-balance-list-o:before{content:\\\"\\\\F011\\\"}.van-icon-balance-list:before{content:\\\"\\\\F012\\\"}.van-icon-balance-o:before{content:\\\"\\\\F013\\\"}.van-icon-balance-pay:before{content:\\\"\\\\F014\\\"}.van-icon-bar-chart-o:before{content:\\\"\\\\F015\\\"}.van-icon-bars:before{content:\\\"\\\\F016\\\"}.van-icon-bell:before{content:\\\"\\\\F017\\\"}.van-icon-bill-o:before{content:\\\"\\\\F018\\\"}.van-icon-bill:before{content:\\\"\\\\F019\\\"}.van-icon-birthday-cake-o:before{content:\\\"\\\\F01A\\\"}.van-icon-bookmark-o:before{content:\\\"\\\\F01B\\\"}.van-icon-bookmark:before{content:\\\"\\\\F01C\\\"}.van-icon-browsing-history-o:before{content:\\\"\\\\F01D\\\"}.van-icon-browsing-history:before{content:\\\"\\\\F01E\\\"}.van-icon-brush-o:before{content:\\\"\\\\F01F\\\"}.van-icon-bulb-o:before{content:\\\"\\\\F020\\\"}.van-icon-bullhorn-o:before{content:\\\"\\\\F021\\\"}.van-icon-calender-o:before{content:\\\"\\\\F022\\\"}.van-icon-card:before{content:\\\"\\\\F023\\\"}.van-icon-cart-circle-o:before{content:\\\"\\\\F024\\\"}.van-icon-cart-circle:before{content:\\\"\\\\F025\\\"}.van-icon-cart-o:before{content:\\\"\\\\F026\\\"}.van-icon-cart:before{content:\\\"\\\\F027\\\"}.van-icon-cash-back-record:before{content:\\\"\\\\F028\\\"}.van-icon-cash-on-deliver:before{content:\\\"\\\\F029\\\"}.van-icon-cashier-o:before{content:\\\"\\\\F02A\\\"}.van-icon-certificate:before{content:\\\"\\\\F02B\\\"}.van-icon-chart-trending-o:before{content:\\\"\\\\F02C\\\"}.van-icon-chat-o:before{content:\\\"\\\\F02D\\\"}.van-icon-chat:before{content:\\\"\\\\F02E\\\"}.van-icon-checked:before{content:\\\"\\\\F02F\\\"}.van-icon-circle:before{content:\\\"\\\\F030\\\"}.van-icon-clear:before{content:\\\"\\\\F031\\\"}.van-icon-clock-o:before{content:\\\"\\\\F032\\\"}.van-icon-clock:before{content:\\\"\\\\F033\\\"}.van-icon-close:before{content:\\\"\\\\F034\\\"}.van-icon-closed-eye:before{content:\\\"\\\\F035\\\"}.van-icon-cluster-o:before{content:\\\"\\\\F036\\\"}.van-icon-cluster:before{content:\\\"\\\\F037\\\"}.van-icon-column:before{content:\\\"\\\\F038\\\"}.van-icon-comment-circle-o:before{content:\\\"\\\\F039\\\"}.van-icon-comment-circle:before{content:\\\"\\\\F03A\\\"}.van-icon-comment-o:before{content:\\\"\\\\F03B\\\"}.van-icon-comment:before{content:\\\"\\\\F03C\\\"}.van-icon-completed:before{content:\\\"\\\\F03D\\\"}.van-icon-contact:before{content:\\\"\\\\F03E\\\"}.van-icon-coupon-o:before{content:\\\"\\\\F03F\\\"}.van-icon-coupon:before{content:\\\"\\\\F040\\\"}.van-icon-credit-pay:before{content:\\\"\\\\F041\\\"}.van-icon-cross:before{content:\\\"\\\\F042\\\"}.van-icon-debit-pay:before{content:\\\"\\\\F043\\\"}.van-icon-delete:before{content:\\\"\\\\F044\\\"}.van-icon-descending:before{content:\\\"\\\\F045\\\"}.van-icon-description:before{content:\\\"\\\\F046\\\"}.van-icon-desktop-o:before{content:\\\"\\\\F047\\\"}.van-icon-diamond-o:before{content:\\\"\\\\F048\\\"}.van-icon-diamond:before{content:\\\"\\\\F049\\\"}.van-icon-discount:before{content:\\\"\\\\F04A\\\"}.van-icon-down:before{content:\\\"\\\\F04B\\\"}.van-icon-ecard-pay:before{content:\\\"\\\\F04C\\\"}.van-icon-edit:before{content:\\\"\\\\F04D\\\"}.van-icon-ellipsis:before{content:\\\"\\\\F04E\\\"}.van-icon-empty:before{content:\\\"\\\\F04F\\\"}.van-icon-envelop-o:before{content:\\\"\\\\F050\\\"}.van-icon-exchange:before{content:\\\"\\\\F051\\\"}.van-icon-expand-o:before{content:\\\"\\\\F052\\\"}.van-icon-expand:before{content:\\\"\\\\F053\\\"}.van-icon-eye-o:before{content:\\\"\\\\F054\\\"}.van-icon-eye:before{content:\\\"\\\\F055\\\"}.van-icon-fail:before{content:\\\"\\\\F056\\\"}.van-icon-failure:before{content:\\\"\\\\F057\\\"}.van-icon-filter-o:before{content:\\\"\\\\F058\\\"}.van-icon-fire-o:before{content:\\\"\\\\F059\\\"}.van-icon-fire:before{content:\\\"\\\\F05A\\\"}.van-icon-flag-o:before{content:\\\"\\\\F05B\\\"}.van-icon-flower-o:before{content:\\\"\\\\F05C\\\"}.van-icon-free-postage:before{content:\\\"\\\\F05D\\\"}.van-icon-friends-o:before{content:\\\"\\\\F05E\\\"}.van-icon-friends:before{content:\\\"\\\\F05F\\\"}.van-icon-gem-o:before{content:\\\"\\\\F060\\\"}.van-icon-gem:before{content:\\\"\\\\F061\\\"}.van-icon-gift-card-o:before{content:\\\"\\\\F062\\\"}.van-icon-gift-card:before{content:\\\"\\\\F063\\\"}.van-icon-gift-o:before{content:\\\"\\\\F064\\\"}.van-icon-gift:before{content:\\\"\\\\F065\\\"}.van-icon-gold-coin-o:before{content:\\\"\\\\F066\\\"}.van-icon-gold-coin:before{content:\\\"\\\\F067\\\"}.van-icon-good-job-o:before{content:\\\"\\\\F068\\\"}.van-icon-good-job:before{content:\\\"\\\\F069\\\"}.van-icon-goods-collect-o:before{content:\\\"\\\\F06A\\\"}.van-icon-goods-collect:before{content:\\\"\\\\F06B\\\"}.van-icon-graphic:before{content:\\\"\\\\F06C\\\"}.van-icon-home-o:before{content:\\\"\\\\F06D\\\"}.van-icon-hot-o:before{content:\\\"\\\\F06E\\\"}.van-icon-hot-sale-o:before{content:\\\"\\\\F06F\\\"}.van-icon-hot-sale:before{content:\\\"\\\\F070\\\"}.van-icon-hot:before{content:\\\"\\\\F071\\\"}.van-icon-hotel-o:before{content:\\\"\\\\F072\\\"}.van-icon-idcard:before{content:\\\"\\\\F073\\\"}.van-icon-info-o:before{content:\\\"\\\\F074\\\"}.van-icon-info:before{content:\\\"\\\\F075\\\"}.van-icon-invition:before{content:\\\"\\\\F076\\\"}.van-icon-label-o:before{content:\\\"\\\\F077\\\"}.van-icon-label:before{content:\\\"\\\\F078\\\"}.van-icon-like-o:before{content:\\\"\\\\F079\\\"}.van-icon-like:before{content:\\\"\\\\F07A\\\"}.van-icon-live:before{content:\\\"\\\\F07B\\\"}.van-icon-location-o:before{content:\\\"\\\\F07C\\\"}.van-icon-location:before{content:\\\"\\\\F07D\\\"}.van-icon-lock:before{content:\\\"\\\\F07E\\\"}.van-icon-logistics:before{content:\\\"\\\\F07F\\\"}.van-icon-manager-o:before{content:\\\"\\\\F080\\\"}.van-icon-manager:before{content:\\\"\\\\F081\\\"}.van-icon-map-marked:before{content:\\\"\\\\F082\\\"}.van-icon-medel-o:before{content:\\\"\\\\F083\\\"}.van-icon-medel:before{content:\\\"\\\\F084\\\"}.van-icon-more-o:before{content:\\\"\\\\F085\\\"}.van-icon-more:before{content:\\\"\\\\F086\\\"}.van-icon-music-o:before{content:\\\"\\\\F087\\\"}.van-icon-music:before{content:\\\"\\\\F088\\\"}.van-icon-new-arrival-o:before{content:\\\"\\\\F089\\\"}.van-icon-new-arrival:before{content:\\\"\\\\F08A\\\"}.van-icon-new-o:before{content:\\\"\\\\F08B\\\"}.van-icon-new:before{content:\\\"\\\\F08C\\\"}.van-icon-newspaper-o:before{content:\\\"\\\\F08D\\\"}.van-icon-notes-o:before{content:\\\"\\\\F08E\\\"}.van-icon-orders-o:before{content:\\\"\\\\F08F\\\"}.van-icon-other-pay:before{content:\\\"\\\\F090\\\"}.van-icon-paid:before{content:\\\"\\\\F091\\\"}.van-icon-passed:before{content:\\\"\\\\F092\\\"}.van-icon-pause-circle-o:before{content:\\\"\\\\F093\\\"}.van-icon-pause-circle:before{content:\\\"\\\\F094\\\"}.van-icon-pause:before{content:\\\"\\\\F095\\\"}.van-icon-peer-pay:before{content:\\\"\\\\F096\\\"}.van-icon-pending-payment:before{content:\\\"\\\\F097\\\"}.van-icon-phone-circle-o:before{content:\\\"\\\\F098\\\"}.van-icon-phone-circle:before{content:\\\"\\\\F099\\\"}.van-icon-phone-o:before{content:\\\"\\\\F09A\\\"}.van-icon-phone:before{content:\\\"\\\\F09B\\\"}.van-icon-photo-o:before{content:\\\"\\\\F09C\\\"}.van-icon-photo:before{content:\\\"\\\\F09D\\\"}.van-icon-photograph:before{content:\\\"\\\\F09E\\\"}.van-icon-play-circle-o:before{content:\\\"\\\\F09F\\\"}.van-icon-play-circle:before{content:\\\"\\\\F0A0\\\"}.van-icon-play:before{content:\\\"\\\\F0A1\\\"}.van-icon-plus:before{content:\\\"\\\\F0A2\\\"}.van-icon-point-gift-o:before{content:\\\"\\\\F0A3\\\"}.van-icon-point-gift:before{content:\\\"\\\\F0A4\\\"}.van-icon-points:before{content:\\\"\\\\F0A5\\\"}.van-icon-printer:before{content:\\\"\\\\F0A6\\\"}.van-icon-qr-invalid:before{content:\\\"\\\\F0A7\\\"}.van-icon-qr:before{content:\\\"\\\\F0A8\\\"}.van-icon-question-o:before{content:\\\"\\\\F0A9\\\"}.van-icon-question:before{content:\\\"\\\\F0AA\\\"}.van-icon-records:before{content:\\\"\\\\F0AB\\\"}.van-icon-refund-o:before{content:\\\"\\\\F0AC\\\"}.van-icon-replay:before{content:\\\"\\\\F0AD\\\"}.van-icon-scan:before{content:\\\"\\\\F0AE\\\"}.van-icon-search:before{content:\\\"\\\\F0AF\\\"}.van-icon-send-gift-o:before{content:\\\"\\\\F0B0\\\"}.van-icon-send-gift:before{content:\\\"\\\\F0B1\\\"}.van-icon-service-o:before{content:\\\"\\\\F0B2\\\"}.van-icon-service:before{content:\\\"\\\\F0B3\\\"}.van-icon-setting-o:before{content:\\\"\\\\F0B4\\\"}.van-icon-setting:before{content:\\\"\\\\F0B5\\\"}.van-icon-share:before{content:\\\"\\\\F0B6\\\"}.van-icon-shop-collect-o:before{content:\\\"\\\\F0B7\\\"}.van-icon-shop-collect:before{content:\\\"\\\\F0B8\\\"}.van-icon-shop-o:before{content:\\\"\\\\F0B9\\\"}.van-icon-shop:before{content:\\\"\\\\F0BA\\\"}.van-icon-shopping-cart-o:before{content:\\\"\\\\F0BB\\\"}.van-icon-shopping-cart:before{content:\\\"\\\\F0BC\\\"}.van-icon-shrink:before{content:\\\"\\\\F0BD\\\"}.van-icon-sign:before{content:\\\"\\\\F0BE\\\"}.van-icon-smile-comment-o:before{content:\\\"\\\\F0BF\\\"}.van-icon-smile-comment:before{content:\\\"\\\\F0C0\\\"}.van-icon-smile-o:before{content:\\\"\\\\F0C1\\\"}.van-icon-smile:before{content:\\\"\\\\F0C2\\\"}.van-icon-star-o:before{content:\\\"\\\\F0C3\\\"}.van-icon-star:before{content:\\\"\\\\F0C4\\\"}.van-icon-stop-circle-o:before{content:\\\"\\\\F0C5\\\"}.van-icon-stop-circle:before{content:\\\"\\\\F0C6\\\"}.van-icon-stop:before{content:\\\"\\\\F0C7\\\"}.van-icon-success:before{content:\\\"\\\\F0C8\\\"}.van-icon-thumb-circle-o:before{content:\\\"\\\\F0C9\\\"}.van-icon-thumb-circle:before{content:\\\"\\\\F0CA\\\"}.van-icon-todo-list-o:before{content:\\\"\\\\F0CB\\\"}.van-icon-todo-list:before{content:\\\"\\\\F0CC\\\"}.van-icon-tosend:before{content:\\\"\\\\F0CD\\\"}.van-icon-tv-o:before{content:\\\"\\\\F0CE\\\"}.van-icon-umbrella-circle:before{content:\\\"\\\\F0CF\\\"}.van-icon-underway-o:before{content:\\\"\\\\F0D0\\\"}.van-icon-underway:before{content:\\\"\\\\F0D1\\\"}.van-icon-upgrade:before{content:\\\"\\\\F0D2\\\"}.van-icon-user-circle-o:before{content:\\\"\\\\F0D3\\\"}.van-icon-user-o:before{content:\\\"\\\\F0D4\\\"}.van-icon-video-o:before{content:\\\"\\\\F0D5\\\"}.van-icon-video:before{content:\\\"\\\\F0D6\\\"}.van-icon-vip-card-o:before{content:\\\"\\\\F0D7\\\"}.van-icon-vip-card:before{content:\\\"\\\\F0D8\\\"}.van-icon-volume-o:before{content:\\\"\\\\F0D9\\\"}.van-icon-volume:before{content:\\\"\\\\F0DA\\\"}.van-icon-wap-home-o:before{content:\\\"\\\\F0DB\\\"}.van-icon-wap-home:before{content:\\\"\\\\F0DC\\\"}.van-icon-wap-nav:before{content:\\\"\\\\F0DD\\\"}.van-icon-warn-o:before{content:\\\"\\\\F0DE\\\"}.van-icon-warning-o:before{content:\\\"\\\\F0DF\\\"}.van-icon-warning:before{content:\\\"\\\\F0E0\\\"}.van-icon-weapp-nav:before{content:\\\"\\\\F0E1\\\"}.van-icon-wechat:before{content:\\\"\\\\F0E2\\\"}.van-icon-youzan-shield:before{content:\\\"\\\\F0E3\\\"}.van-icon__image{width:1em;height:1em}.van-loading,.van-loading__spinner{position:relative;vertical-align:middle}.van-loading{color:#c8c9cc;font-size:0}.van-loading__spinner{display:inline-block;width:30px;max-width:100%;height:30px;max-height:100%;-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--spinner i{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__spinner--spinner i::before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:' '}.van-loading__spinner--circular{-webkit-animation-duration:2s;animation-duration:2s}.van-loading__circular{display:block;width:100%;height:100%}.van-loading__circular circle{-webkit-animation:van-circular 1.5s ease-in-out infinite;animation:van-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:3;stroke-linecap:round}.van-loading__text{display:inline-block;margin-left:8px;color:#969799;font-size:14px;vertical-align:middle}.van-loading--vertical{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.van-loading--vertical .van-loading__text{margin:8px 0 0}.van-loading__spinner--spinner i:nth-of-type(1){-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__spinner--spinner i:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__spinner--spinner i:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__spinner--spinner i:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__spinner--spinner i:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__spinner--spinner i:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__spinner--spinner i:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__spinner--spinner i:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__spinner--spinner i:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__spinner--spinner i:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__spinner--spinner i:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__spinner--spinner i:nth-of-type(12){-webkit-transform:rotate(360deg);transform:rotate(360deg);opacity:.3125}.van-button{position:relative;display:inline-block;box-sizing:border-box;height:44px;margin:0;padding:0;font-size:16px;line-height:42px;text-align:center;border-radius:2px;-webkit-transition:opacity .2s;transition:opacity .2s;-webkit-appearance:none;-webkit-text-size-adjust:100%}.van-button::before{position:absolute;top:50%;left:50%;width:100%;height:100%;background-color:#000;border:inherit;border-color:#000;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:' '}.van-button:active::before{opacity:.1}.van-button--disabled::before,.van-button--loading::before{display:none}.van-button--default{color:#323233;background-color:#fff;border:1px solid #ebedf0}.van-button--primary{color:#fff;background-color:#07c160;border:1px solid #07c160}.van-button--info{color:#fff;background-color:#1989fa;border:1px solid #1989fa}.van-button--danger{color:#fff;background-color:#ee0a24;border:1px solid #ee0a24}.van-button--warning{color:#fff;background-color:#ff976a;border:1px solid #ff976a}.van-button--plain{background-color:#fff}.van-button--plain.van-button--primary{color:#07c160}.van-button--plain.van-button--info{color:#1989fa}.van-button--plain.van-button--danger{color:#ee0a24}.van-button--plain.van-button--warning{color:#ff976a}.van-button--large{width:100%;height:50px;line-height:48px}.van-button--normal{padding:0 15px;font-size:14px}.van-button--small{min-width:60px;height:30px;padding:0 8px;font-size:12px;line-height:28px}.van-button__loading{display:inline-block;color:inherit;vertical-align:top}.van-button--mini{display:inline-block;min-width:50px;height:22px;font-size:10px;line-height:20px}.van-button--mini+.van-button--mini{margin-left:4px}.van-button--block{display:block;width:100%}.van-button--disabled{opacity:.5}.van-button--hairline.van-button--round::after,.van-button--round{border-radius:999px}.van-button--hairline.van-button--square::after,.van-button--square{border-radius:0}.van-button__icon{min-width:1em;font-size:1.2em;line-height:inherit;vertical-align:top}.van-button__icon+.van-button__text,.van-button__loading+.van-button__text{display:inline-block;margin-left:5px;vertical-align:top}.van-button--hairline{border-width:0}.van-button--hairline::after{border-color:inherit;border-radius:4px}.van-cell{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;box-sizing:border-box;width:100%;padding:10px 16px;overflow:hidden;color:#323233;font-size:14px;line-height:24px;background-color:#fff}.van-cell:not(:last-child)::after{position:absolute;box-sizing:border-box;content:' ';pointer-events:none;right:0;bottom:0;left:16px;border-bottom:1px solid #ebedf0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.van-cell--borderless::after{display:none}.van-cell__label{margin-top:3px;color:#969799;font-size:12px;line-height:18px}.van-cell__title,.van-cell__value{-webkit-box-flex:1;-webkit-flex:1;flex:1}.van-cell__value{position:relative;overflow:hidden;color:#969799;text-align:right;vertical-align:middle;word-wrap:break-word}.van-cell__value--alone{color:#323233;text-align:left}.van-cell__left-icon,.van-cell__right-icon{min-width:1em;height:24px;font-size:16px;line-height:24px}.van-cell__left-icon{margin-right:5px}.van-cell__right-icon{margin-left:5px;color:#969799}.van-cell--clickable:active{background-color:#f2f3f5}.van-cell--required{overflow:visible}.van-cell--required::before{position:absolute;left:8px;color:#ee0a24;font-size:14px;content:'*'}.van-cell--center{-webkit-box-align:center;-webkit-align-items:center;align-items:center}.van-cell--large{padding-top:12px;padding-bottom:12px}.van-cell--large .van-cell__title{font-size:16px}.van-cell--large .van-cell__label{font-size:14px}.van-cell-group{background-color:#fff}.van-cell-group__title{padding:16px 16px 8px;color:#969799;font-size:14px;line-height:16px}.van-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7)}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3M/MWEyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiQC13ZWJraXQta2V5ZnJhbWVzIHZhbi1zbGlkZS11cC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtdXAtZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tc2xpZGUtdXAtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUBrZXlmcmFtZXMgdmFuLXNsaWRlLXVwLWxlYXZle3Rvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWRvd24tZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtZG93bi1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWRvd24tbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtZG93bi1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWxlZnQtZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtbGVmdC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWxlZnQtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtbGVmdC1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLXJpZ2h0LWVudGVyezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIHZhbi1zbGlkZS1yaWdodC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIHZhbi1zbGlkZS1yaWdodC1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtcmlnaHQtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tZmFkZS1pbnswJXtvcGFjaXR5OjB9dG97b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHZhbi1mYWRlLWluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tZmFkZS1vdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MH19QGtleWZyYW1lcyB2YW4tZmFkZS1vdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHZhbi1yb3RhdGV7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHZhbi1yb3RhdGV7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLWNpcmN1bGFyezAle3N0cm9rZS1kYXNoYXJyYXk6MSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MH01MCV7c3Ryb2tlLWRhc2hhcnJheTo5MCwxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTQwfXRve3N0cm9rZS1kYXNoYXJyYXk6OTAsMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xMjB9fUBrZXlmcmFtZXMgdmFuLWNpcmN1bGFyezAle3N0cm9rZS1kYXNoYXJyYXk6MSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MH01MCV7c3Ryb2tlLWRhc2hhcnJheTo5MCwxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTQwfXRve3N0cm9rZS1kYXNoYXJyYXk6OTAsMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xMjB9fWh0bWx7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fWJvZHl7bWFyZ2luOjB9YXt0ZXh0LWRlY29yYXRpb246bm9uZX1bY2xhc3MqPXZhbi1dOmZvY3VzLGE6Zm9jdXMsYnV0dG9uOmZvY3VzLGlucHV0OmZvY3VzLHRleHRhcmVhOmZvY3Vze291dGxpbmU6MH1vbCx1bHttYXJnaW46MDtwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lfWJ1dHRvbixpbnB1dCx0ZXh0YXJlYXtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdH0udmFuLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpc30udmFuLW11bHRpLWVsbGlwc2lzLS1sMiwudmFuLW11bHRpLWVsbGlwc2lzLS1sM3tkaXNwbGF5Oi13ZWJraXQtYm94O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOy13ZWJraXQtbGluZS1jbGFtcDoyOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbH0udmFuLW11bHRpLWVsbGlwc2lzLS1sM3std2Via2l0LWxpbmUtY2xhbXA6M30udmFuLWNsZWFyZml4OjphZnRlcntkaXNwbGF5OnRhYmxlO2NsZWFyOmJvdGg7Y29udGVudDonJ31bY2xhc3MqPXZhbi1oYWlybGluZV06OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb250ZW50OicgJztwb2ludGVyLWV2ZW50czpub25lO3RvcDotNTAlO3JpZ2h0Oi01MCU7Ym90dG9tOi01MCU7bGVmdDotNTAlO2JvcmRlcjowIHNvbGlkICNlYmVkZjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9LnZhbi1oYWlybGluZSwudmFuLWhhaXJsaW5lLS1ib3R0b20sLnZhbi1oYWlybGluZS0tbGVmdCwudmFuLWhhaXJsaW5lLS1yaWdodCwudmFuLWhhaXJsaW5lLS1zdXJyb3VuZCwudmFuLWhhaXJsaW5lLS10b3AsLnZhbi1oYWlybGluZS0tdG9wLWJvdHRvbXtwb3NpdGlvbjpyZWxhdGl2ZX0udmFuLWhhaXJsaW5lLS10b3A6OmFmdGVye2JvcmRlci10b3Atd2lkdGg6MXB4fS52YW4taGFpcmxpbmUtLWxlZnQ6OmFmdGVye2JvcmRlci1sZWZ0LXdpZHRoOjFweH0udmFuLWhhaXJsaW5lLS1yaWdodDo6YWZ0ZXJ7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweH0udmFuLWhhaXJsaW5lLS1ib3R0b206OmFmdGVye2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS52YW4taGFpcmxpbmUtLXRvcC1ib3R0b206OmFmdGVyLC52YW4taGFpcmxpbmUtdW5zZXQtLXRvcC1ib3R0b206OmFmdGVye2JvcmRlci13aWR0aDoxcHggMH0udmFuLWhhaXJsaW5lLS1zdXJyb3VuZDo6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOjFweH0udmFuLWZhZGUtZW50ZXItYWN0aXZley13ZWJraXQtYW5pbWF0aW9uOi4zcyB2YW4tZmFkZS1pbjthbmltYXRpb246LjNzIHZhbi1mYWRlLWlufS52YW4tZmFkZS1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246LjNzIHZhbi1mYWRlLW91dDthbmltYXRpb246LjNzIHZhbi1mYWRlLW91dH0udmFuLXNsaWRlLXVwLWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtdXAtZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLXVwLWVudGVyIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS11cC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLXVwLWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS11cC1sZWF2ZSAuM3MgYm90aCBlYXNlfS52YW4tc2xpZGUtZG93bi1lbnRlci1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLWRvd24tZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLWRvd24tZW50ZXIgLjNzIGJvdGggZWFzZX0udmFuLXNsaWRlLWRvd24tbGVhdmUtYWN0aXZley13ZWJraXQtYW5pbWF0aW9uOnZhbi1zbGlkZS1kb3duLWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS1kb3duLWxlYXZlIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS1sZWZ0LWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtbGVmdC1lbnRlciAuM3MgYm90aCBlYXNlO2FuaW1hdGlvbjp2YW4tc2xpZGUtbGVmdC1lbnRlciAuM3MgYm90aCBlYXNlfS52YW4tc2xpZGUtbGVmdC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLWxlZnQtbGVhdmUgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLWxlZnQtbGVhdmUgLjNzIGJvdGggZWFzZX0udmFuLXNsaWRlLXJpZ2h0LWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtcmlnaHQtZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLXJpZ2h0LWVudGVyIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS1yaWdodC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLXJpZ2h0LWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS1yaWdodC1sZWF2ZSAuM3MgYm90aCBlYXNlfS52YW4taW5mb3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4td2lkdGg6MTZweDtwYWRkaW5nOjAgM3B4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlBpbmdGYW5nIFNDLEhlbHZldGljYSBOZXVlLEFyaWFsLHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNlZTBhMjQ7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO2JvcmRlci1yYWRpdXM6MTZweDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNTAlLC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNTAlLC01MCUpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjoxMDAlO3RyYW5zZm9ybS1vcmlnaW46MTAwJX0udmFuLWluZm8tLWRvdHt3aWR0aDo4cHg7bWluLXdpZHRoOjA7aGVpZ2h0OjhweDtiYWNrZ3JvdW5kLWNvbG9yOiNlZTBhMjQ7Ym9yZGVyLXJhZGl1czoxMDAlfUBmb250LWZhY2V7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtZmFtaWx5Oid2YW50LWljb24nO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTphdXRvO3NyYzp1cmwoaHR0cHM6Ly9pbWcueXpjZG4uY24vdmFudC92YW50LWljb24tMGJjNjU0LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyksdXJsKGh0dHBzOi8vaW1nLnl6Y2RuLmNuL3ZhbnQvdmFudC1pY29uLTBiYzY1NC53b2ZmKSBmb3JtYXQoJ3dvZmYnKSx1cmwoaHR0cHM6Ly9pbWcueXpjZG4uY24vdmFudC92YW50LWljb24tMGJjNjU0LnR0ZikgZm9ybWF0KCd0cnVldHlwZScpfS52YW4taWNvbntwb3NpdGlvbjpyZWxhdGl2ZTtmb250OjE0cHgvMSBcXFwidmFudC1pY29uXFxcIjtmb250LXNpemU6aW5oZXJpdDt0ZXh0LXJlbmRlcmluZzphdXRvOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9LnZhbi1pY29uLC52YW4taWNvbjo6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS52YW4taWNvbi1hZGQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDBcXFwifS52YW4taWNvbi1hZGQtc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwMVxcXCJ9LnZhbi1pY29uLWFkZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDJcXFwifS52YW4taWNvbi1hZnRlci1zYWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwM1xcXCJ9LnZhbi1pY29uLWFpbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDRcXFwifS52YW4taWNvbi1hbGlwYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDA1XFxcIn0udmFuLWljb24tYXBwcy1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwNlxcXCJ9LnZhbi1pY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDA3XFxcIn0udmFuLWljb24tYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDhcXFwifS52YW4taWNvbi1hcnJvdy11cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDlcXFwifS52YW4taWNvbi1hcnJvdzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEFcXFwifS52YW4taWNvbi1hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDBCXFxcIn0udmFuLWljb24tYXVkaW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDBDXFxcIn0udmFuLWljb24tYXdhcmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMERcXFwifS52YW4taWNvbi1hd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEVcXFwifS52YW4taWNvbi1iYWctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEZcXFwifS52YW4taWNvbi1iYWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDEwXFxcIn0udmFuLWljb24tYmFsYW5jZS1saXN0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDExXFxcIn0udmFuLWljb24tYmFsYW5jZS1saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxMlxcXCJ9LnZhbi1pY29uLWJhbGFuY2UtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTNcXFwifS52YW4taWNvbi1iYWxhbmNlLXBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTRcXFwifS52YW4taWNvbi1iYXItY2hhcnQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTVcXFwifS52YW4taWNvbi1iYXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxNlxcXCJ9LnZhbi1pY29uLWJlbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDE3XFxcIn0udmFuLWljb24tYmlsbC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxOFxcXCJ9LnZhbi1pY29uLWJpbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDE5XFxcIn0udmFuLWljb24tYmlydGhkYXktY2FrZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxQVxcXCJ9LnZhbi1pY29uLWJvb2ttYXJrLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFCXFxcIn0udmFuLWljb24tYm9va21hcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFDXFxcIn0udmFuLWljb24tYnJvd3NpbmctaGlzdG9yeS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxRFxcXCJ9LnZhbi1pY29uLWJyb3dzaW5nLWhpc3Rvcnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFFXFxcIn0udmFuLWljb24tYnJ1c2gtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMUZcXFwifS52YW4taWNvbi1idWxiLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDIwXFxcIn0udmFuLWljb24tYnVsbGhvcm4tbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjFcXFwifS52YW4taWNvbi1jYWxlbmRlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyMlxcXCJ9LnZhbi1pY29uLWNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDIzXFxcIn0udmFuLWljb24tY2FydC1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjRcXFwifS52YW4taWNvbi1jYXJ0LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjVcXFwifS52YW4taWNvbi1jYXJ0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDI2XFxcIn0udmFuLWljb24tY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjdcXFwifS52YW4taWNvbi1jYXNoLWJhY2stcmVjb3JkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyOFxcXCJ9LnZhbi1pY29uLWNhc2gtb24tZGVsaXZlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjlcXFwifS52YW4taWNvbi1jYXNoaWVyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJBXFxcIn0udmFuLWljb24tY2VydGlmaWNhdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJCXFxcIn0udmFuLWljb24tY2hhcnQtdHJlbmRpbmctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMkNcXFwifS52YW4taWNvbi1jaGF0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJEXFxcIn0udmFuLWljb24tY2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMkVcXFwifS52YW4taWNvbi1jaGVja2VkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyRlxcXCJ9LnZhbi1pY29uLWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMzBcXFwifS52YW4taWNvbi1jbGVhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMzFcXFwifS52YW4taWNvbi1jbG9jay1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzMlxcXCJ9LnZhbi1pY29uLWNsb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzM1xcXCJ9LnZhbi1pY29uLWNsb3NlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzNFxcXCJ9LnZhbi1pY29uLWNsb3NlZC1leWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM1XFxcIn0udmFuLWljb24tY2x1c3Rlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzNlxcXCJ9LnZhbi1pY29uLWNsdXN0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM3XFxcIn0udmFuLWljb24tY29sdW1uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzOFxcXCJ9LnZhbi1pY29uLWNvbW1lbnQtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM5XFxcIn0udmFuLWljb24tY29tbWVudC1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNBXFxcIn0udmFuLWljb24tY29tbWVudC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzQlxcXCJ9LnZhbi1pY29uLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNDXFxcIn0udmFuLWljb24tY29tcGxldGVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzRFxcXCJ9LnZhbi1pY29uLWNvbnRhY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNFXFxcIn0udmFuLWljb24tY291cG9uLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNGXFxcIn0udmFuLWljb24tY291cG9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0MFxcXCJ9LnZhbi1pY29uLWNyZWRpdC1wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQxXFxcIn0udmFuLWljb24tY3Jvc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQyXFxcIn0udmFuLWljb24tZGViaXQtcGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0M1xcXCJ9LnZhbi1pY29uLWRlbGV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDRcXFwifS52YW4taWNvbi1kZXNjZW5kaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0NVxcXCJ9LnZhbi1pY29uLWRlc2NyaXB0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0NlxcXCJ9LnZhbi1pY29uLWRlc2t0b3AtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDdcXFwifS52YW4taWNvbi1kaWFtb25kLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQ4XFxcIn0udmFuLWljb24tZGlhbW9uZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDlcXFwifS52YW4taWNvbi1kaXNjb3VudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNEFcXFwifS52YW4taWNvbi1kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0QlxcXCJ9LnZhbi1pY29uLWVjYXJkLXBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNENcXFwifS52YW4taWNvbi1lZGl0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RFxcXCJ9LnZhbi1pY29uLWVsbGlwc2lzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RVxcXCJ9LnZhbi1pY29uLWVtcHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RlxcXCJ9LnZhbi1pY29uLWVudmVsb3AtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTBcXFwifS52YW4taWNvbi1leGNoYW5nZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTFcXFwifS52YW4taWNvbi1leHBhbmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTJcXFwifS52YW4taWNvbi1leHBhbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDUzXFxcIn0udmFuLWljb24tZXllLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU0XFxcIn0udmFuLWljb24tZXllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1NVxcXCJ9LnZhbi1pY29uLWZhaWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU2XFxcIn0udmFuLWljb24tZmFpbHVyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTdcXFwifS52YW4taWNvbi1maWx0ZXItbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNThcXFwifS52YW4taWNvbi1maXJlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU5XFxcIn0udmFuLWljb24tZmlyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNUFcXFwifS52YW4taWNvbi1mbGFnLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDVCXFxcIn0udmFuLWljb24tZmxvd2VyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDVDXFxcIn0udmFuLWljb24tZnJlZS1wb3N0YWdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1RFxcXCJ9LnZhbi1pY29uLWZyaWVuZHMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNUVcXFwifS52YW4taWNvbi1mcmllbmRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1RlxcXCJ9LnZhbi1pY29uLWdlbS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2MFxcXCJ9LnZhbi1pY29uLWdlbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNjFcXFwifS52YW4taWNvbi1naWZ0LWNhcmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNjJcXFwifS52YW4taWNvbi1naWZ0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDYzXFxcIn0udmFuLWljb24tZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2NFxcXCJ9LnZhbi1pY29uLWdpZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY1XFxcIn0udmFuLWljb24tZ29sZC1jb2luLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY2XFxcIn0udmFuLWljb24tZ29sZC1jb2luOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2N1xcXCJ9LnZhbi1pY29uLWdvb2Qtam9iLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY4XFxcIn0udmFuLWljb24tZ29vZC1qb2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY5XFxcIn0udmFuLWljb24tZ29vZHMtY29sbGVjdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2QVxcXCJ9LnZhbi1pY29uLWdvb2RzLWNvbGxlY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZCXFxcIn0udmFuLWljb24tZ3JhcGhpYzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNkNcXFwifS52YW4taWNvbi1ob21lLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZEXFxcIn0udmFuLWljb24taG90LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZFXFxcIn0udmFuLWljb24taG90LXNhbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNkZcXFwifS52YW4taWNvbi1ob3Qtc2FsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzBcXFwifS52YW4taWNvbi1ob3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDcxXFxcIn0udmFuLWljb24taG90ZWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzJcXFwifS52YW4taWNvbi1pZGNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDczXFxcIn0udmFuLWljb24taW5mby1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA3NFxcXCJ9LnZhbi1pY29uLWluZm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc1XFxcIn0udmFuLWljb24taW52aXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc2XFxcIn0udmFuLWljb24tbGFiZWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzdcXFwifS52YW4taWNvbi1sYWJlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzhcXFwifS52YW4taWNvbi1saWtlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc5XFxcIn0udmFuLWljb24tbGlrZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwN0FcXFwifS52YW4taWNvbi1saXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA3QlxcXCJ9LnZhbi1pY29uLWxvY2F0aW9uLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdDXFxcIn0udmFuLWljb24tbG9jYXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdEXFxcIn0udmFuLWljb24tbG9jazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwN0VcXFwifS52YW4taWNvbi1sb2dpc3RpY3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdGXFxcIn0udmFuLWljb24tbWFuYWdlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4MFxcXCJ9LnZhbi1pY29uLW1hbmFnZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDgxXFxcIn0udmFuLWljb24tbWFwLW1hcmtlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODJcXFwifS52YW4taWNvbi1tZWRlbC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4M1xcXCJ9LnZhbi1pY29uLW1lZGVsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4NFxcXCJ9LnZhbi1pY29uLW1vcmUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODVcXFwifS52YW4taWNvbi1tb3JlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4NlxcXCJ9LnZhbi1pY29uLW11c2ljLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDg3XFxcIn0udmFuLWljb24tbXVzaWM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDg4XFxcIn0udmFuLWljb24tbmV3LWFycml2YWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODlcXFwifS52YW4taWNvbi1uZXctYXJyaXZhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEFcXFwifS52YW4taWNvbi1uZXctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEJcXFwifS52YW4taWNvbi1uZXc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDhDXFxcIn0udmFuLWljb24tbmV3c3BhcGVyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDhEXFxcIn0udmFuLWljb24tbm90ZXMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEVcXFwifS52YW4taWNvbi1vcmRlcnMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEZcXFwifS52YW4taWNvbi1vdGhlci1wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkwXFxcIn0udmFuLWljb24tcGFpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOTFcXFwifS52YW4taWNvbi1wYXNzZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkyXFxcIn0udmFuLWljb24tcGF1c2UtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkzXFxcIn0udmFuLWljb24tcGF1c2UtY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NFxcXCJ9LnZhbi1pY29uLXBhdXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NVxcXCJ9LnZhbi1pY29uLXBlZXItcGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NlxcXCJ9LnZhbi1pY29uLXBlbmRpbmctcGF5bWVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOTdcXFwifS52YW4taWNvbi1waG9uZS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOThcXFwifS52YW4taWNvbi1waG9uZS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDk5XFxcIn0udmFuLWljb24tcGhvbmUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUFcXFwifS52YW4taWNvbi1waG9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUJcXFwifS52YW4taWNvbi1waG90by1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5Q1xcXCJ9LnZhbi1pY29uLXBob3RvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5RFxcXCJ9LnZhbi1pY29uLXBob3RvZ3JhcGg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDlFXFxcIn0udmFuLWljb24tcGxheS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUZcXFwifS52YW4taWNvbi1wbGF5LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQTBcXFwifS52YW4taWNvbi1wbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBMVxcXCJ9LnZhbi1pY29uLXBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEEyXFxcIn0udmFuLWljb24tcG9pbnQtZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBM1xcXCJ9LnZhbi1pY29uLXBvaW50LWdpZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEE0XFxcIn0udmFuLWljb24tcG9pbnRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBNVxcXCJ9LnZhbi1pY29uLXByaW50ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEE2XFxcIn0udmFuLWljb24tcXItaW52YWxpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQTdcXFwifS52YW4taWNvbi1xcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQThcXFwifS52YW4taWNvbi1xdWVzdGlvbi1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBOVxcXCJ9LnZhbi1pY29uLXF1ZXN0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBQVxcXCJ9LnZhbi1pY29uLXJlY29yZHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFCXFxcIn0udmFuLWljb24tcmVmdW5kLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFDXFxcIn0udmFuLWljb24tcmVwbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBRFxcXCJ9LnZhbi1pY29uLXNjYW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFFXFxcIn0udmFuLWljb24tc2VhcmNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBRlxcXCJ9LnZhbi1pY29uLXNlbmQtZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCMFxcXCJ9LnZhbi1pY29uLXNlbmQtZ2lmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjFcXFwifS52YW4taWNvbi1zZXJ2aWNlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEIyXFxcIn0udmFuLWljb24tc2VydmljZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjNcXFwifS52YW4taWNvbi1zZXR0aW5nLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEI0XFxcIn0udmFuLWljb24tc2V0dGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjVcXFwifS52YW4taWNvbi1zaGFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjZcXFwifS52YW4taWNvbi1zaG9wLWNvbGxlY3QtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjdcXFwifS52YW4taWNvbi1zaG9wLWNvbGxlY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEI4XFxcIn0udmFuLWljb24tc2hvcC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCOVxcXCJ9LnZhbi1pY29uLXNob3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJBXFxcIn0udmFuLWljb24tc2hvcHBpbmctY2FydC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCQlxcXCJ9LnZhbi1pY29uLXNob3BwaW5nLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJDXFxcIn0udmFuLWljb24tc2hyaW5rOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCRFxcXCJ9LnZhbi1pY29uLXNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJFXFxcIn0udmFuLWljb24tc21pbGUtY29tbWVudC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCRlxcXCJ9LnZhbi1pY29uLXNtaWxlLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEMwXFxcIn0udmFuLWljb24tc21pbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzFcXFwifS52YW4taWNvbi1zbWlsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzJcXFwifS52YW4taWNvbi1zdGFyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEMzXFxcIn0udmFuLWljb24tc3RhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzRcXFwifS52YW4taWNvbi1zdG9wLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDNVxcXCJ9LnZhbi1pY29uLXN0b3AtY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDNlxcXCJ9LnZhbi1pY29uLXN0b3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEM3XFxcIn0udmFuLWljb24tc3VjY2VzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzhcXFwifS52YW4taWNvbi10aHVtYi1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzlcXFwifS52YW4taWNvbi10aHVtYi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMENBXFxcIn0udmFuLWljb24tdG9kby1saXN0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMENCXFxcIn0udmFuLWljb24tdG9kby1saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDQ1xcXCJ9LnZhbi1pY29uLXRvc2VuZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQ0RcXFwifS52YW4taWNvbi10di1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDRVxcXCJ9LnZhbi1pY29uLXVtYnJlbGxhLWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQ0ZcXFwifS52YW4taWNvbi11bmRlcndheS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEMFxcXCJ9LnZhbi1pY29uLXVuZGVyd2F5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEMVxcXCJ9LnZhbi1pY29uLXVwZ3JhZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEQyXFxcIn0udmFuLWljb24tdXNlci1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDNcXFwifS52YW4taWNvbi11c2VyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEQ0XFxcIn0udmFuLWljb24tdmlkZW8tbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDVcXFwifS52YW4taWNvbi12aWRlbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDZcXFwifS52YW4taWNvbi12aXAtY2FyZC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEN1xcXCJ9LnZhbi1pY29uLXZpcC1jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEOFxcXCJ9LnZhbi1pY29uLXZvbHVtZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEOVxcXCJ9LnZhbi1pY29uLXZvbHVtZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwREFcXFwifS52YW4taWNvbi13YXAtaG9tZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEQlxcXCJ9LnZhbi1pY29uLXdhcC1ob21lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEQ1xcXCJ9LnZhbi1pY29uLXdhcC1uYXY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEREXFxcIn0udmFuLWljb24td2Fybi1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBERVxcXCJ9LnZhbi1pY29uLXdhcm5pbmctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwREZcXFwifS52YW4taWNvbi13YXJuaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBFMFxcXCJ9LnZhbi1pY29uLXdlYXBwLW5hdjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRTFcXFwifS52YW4taWNvbi13ZWNoYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEUyXFxcIn0udmFuLWljb24teW91emFuLXNoaWVsZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRTNcXFwifS52YW4taWNvbl9faW1hZ2V7d2lkdGg6MWVtO2hlaWdodDoxZW19LnZhbi1sb2FkaW5nLC52YW4tbG9hZGluZ19fc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnZhbi1sb2FkaW5ne2NvbG9yOiNjOGM5Y2M7Zm9udC1zaXplOjB9LnZhbi1sb2FkaW5nX19zcGlubmVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjMwcHg7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OjMwcHg7bWF4LWhlaWdodDoxMDAlOy13ZWJraXQtYW5pbWF0aW9uOnZhbi1yb3RhdGUgLjhzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246dmFuLXJvdGF0ZSAuOHMgbGluZWFyIGluZmluaXRlfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lcnstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246c3RlcHMoMTIpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246c3RlcHMoMTIpfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpe3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOjpiZWZvcmV7ZGlzcGxheTpibG9jazt3aWR0aDoycHg7aGVpZ2h0OjI1JTttYXJnaW46MCBhdXRvO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yO2JvcmRlci1yYWRpdXM6NDAlO2NvbnRlbnQ6JyAnfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tY2lyY3VsYXJ7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MnM7YW5pbWF0aW9uLWR1cmF0aW9uOjJzfS52YW4tbG9hZGluZ19fY2lyY3VsYXJ7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS52YW4tbG9hZGluZ19fY2lyY3VsYXIgY2lyY2xley13ZWJraXQtYW5pbWF0aW9uOnZhbi1jaXJjdWxhciAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO2FuaW1hdGlvbjp2YW4tY2lyY3VsYXIgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTtzdHJva2U6Y3VycmVudENvbG9yO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnJvdW5kfS52YW4tbG9hZGluZ19fdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDo4cHg7Y29sb3I6Izk2OTc5OTtmb250LXNpemU6MTRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnZhbi1sb2FkaW5nLS12ZXJ0aWNhbHtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0udmFuLWxvYWRpbmctLXZlcnRpY2FsIC52YW4tbG9hZGluZ19fdGV4dHttYXJnaW46OHB4IDAgMH0udmFuLWxvYWRpbmdfX3NwaW5uZXItLXNwaW5uZXIgaTpudGgtb2YtdHlwZSgxKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzBkZWcpO29wYWNpdHk6MX0udmFuLWxvYWRpbmdfX3NwaW5uZXItLXNwaW5uZXIgaTpudGgtb2YtdHlwZSgyKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO29wYWNpdHk6LjkzNzV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoMyl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKTtvcGFjaXR5Oi44NzV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoNCl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDEyMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxMjBkZWcpO29wYWNpdHk6LjgxMjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoNSl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxNTBkZWcpO29wYWNpdHk6Ljc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDYpey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTtvcGFjaXR5Oi42ODc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDcpey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgyMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMjEwZGVnKTtvcGFjaXR5Oi42MjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoOCl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDI0MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgyNDBkZWcpO29wYWNpdHk6LjU2MjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoOSl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDI3MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpO29wYWNpdHk6LjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoMTApey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzAwZGVnKTtvcGFjaXR5Oi40Mzc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDExKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzMwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDMzMGRlZyk7b3BhY2l0eTouMzc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDEyKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7b3BhY2l0eTouMzEyNX0udmFuLWJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjQ0cHg7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjQycHg7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3RyYW5zaXRpb246b3BhY2l0eSAuMnM7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCV9LnZhbi1idXR0b246OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojMDAwO2JvcmRlcjppbmhlcml0O2JvcmRlci1jb2xvcjojMDAwO2JvcmRlci1yYWRpdXM6aW5oZXJpdDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7b3BhY2l0eTowO2NvbnRlbnQ6JyAnfS52YW4tYnV0dG9uOmFjdGl2ZTo6YmVmb3Jle29wYWNpdHk6LjF9LnZhbi1idXR0b24tLWRpc2FibGVkOjpiZWZvcmUsLnZhbi1idXR0b24tLWxvYWRpbmc6OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnZhbi1idXR0b24tLWRlZmF1bHR7Y29sb3I6IzMyMzIzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZWJlZGYwfS52YW4tYnV0dG9uLS1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDdjMTYwO2JvcmRlcjoxcHggc29saWQgIzA3YzE2MH0udmFuLWJ1dHRvbi0taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzE5ODlmYTtib3JkZXI6MXB4IHNvbGlkICMxOTg5ZmF9LnZhbi1idXR0b24tLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2VlMGEyNDtib3JkZXI6MXB4IHNvbGlkICNlZTBhMjR9LnZhbi1idXR0b24tLXdhcm5pbmd7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk3NmE7Ym9yZGVyOjFweCBzb2xpZCAjZmY5NzZhfS52YW4tYnV0dG9uLS1wbGFpbntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnZhbi1idXR0b24tLXBsYWluLnZhbi1idXR0b24tLXByaW1hcnl7Y29sb3I6IzA3YzE2MH0udmFuLWJ1dHRvbi0tcGxhaW4udmFuLWJ1dHRvbi0taW5mb3tjb2xvcjojMTk4OWZhfS52YW4tYnV0dG9uLS1wbGFpbi52YW4tYnV0dG9uLS1kYW5nZXJ7Y29sb3I6I2VlMGEyNH0udmFuLWJ1dHRvbi0tcGxhaW4udmFuLWJ1dHRvbi0td2FybmluZ3tjb2xvcjojZmY5NzZhfS52YW4tYnV0dG9uLS1sYXJnZXt3aWR0aDoxMDAlO2hlaWdodDo1MHB4O2xpbmUtaGVpZ2h0OjQ4cHh9LnZhbi1idXR0b24tLW5vcm1hbHtwYWRkaW5nOjAgMTVweDtmb250LXNpemU6MTRweH0udmFuLWJ1dHRvbi0tc21hbGx7bWluLXdpZHRoOjYwcHg7aGVpZ2h0OjMwcHg7cGFkZGluZzowIDhweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoyOHB4fS52YW4tYnV0dG9uX19sb2FkaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOmluaGVyaXQ7dmVydGljYWwtYWxpZ246dG9wfS52YW4tYnV0dG9uLS1taW5pe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo1MHB4O2hlaWdodDoyMnB4O2ZvbnQtc2l6ZToxMHB4O2xpbmUtaGVpZ2h0OjIwcHh9LnZhbi1idXR0b24tLW1pbmkrLnZhbi1idXR0b24tLW1pbml7bWFyZ2luLWxlZnQ6NHB4fS52YW4tYnV0dG9uLS1ibG9ja3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnZhbi1idXR0b24tLWRpc2FibGVke29wYWNpdHk6LjV9LnZhbi1idXR0b24tLWhhaXJsaW5lLnZhbi1idXR0b24tLXJvdW5kOjphZnRlciwudmFuLWJ1dHRvbi0tcm91bmR7Ym9yZGVyLXJhZGl1czo5OTlweH0udmFuLWJ1dHRvbi0taGFpcmxpbmUudmFuLWJ1dHRvbi0tc3F1YXJlOjphZnRlciwudmFuLWJ1dHRvbi0tc3F1YXJle2JvcmRlci1yYWRpdXM6MH0udmFuLWJ1dHRvbl9faWNvbnttaW4td2lkdGg6MWVtO2ZvbnQtc2l6ZToxLjJlbTtsaW5lLWhlaWdodDppbmhlcml0O3ZlcnRpY2FsLWFsaWduOnRvcH0udmFuLWJ1dHRvbl9faWNvbisudmFuLWJ1dHRvbl9fdGV4dCwudmFuLWJ1dHRvbl9fbG9hZGluZysudmFuLWJ1dHRvbl9fdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDo1cHg7dmVydGljYWwtYWxpZ246dG9wfS52YW4tYnV0dG9uLS1oYWlybGluZXtib3JkZXItd2lkdGg6MH0udmFuLWJ1dHRvbi0taGFpcmxpbmU6OmFmdGVye2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1yYWRpdXM6NHB4fS52YW4tY2VsbHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtwYWRkaW5nOjEwcHggMTZweDtvdmVyZmxvdzpoaWRkZW47Y29sb3I6IzMyMzIzMztmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyNHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNlbGw6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O2NvbnRlbnQ6JyAnO3BvaW50ZXItZXZlbnRzOm5vbmU7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjE2cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWRmMDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoLjUpO3RyYW5zZm9ybTpzY2FsZVkoLjUpfS52YW4tY2VsbC0tYm9yZGVybGVzczo6YWZ0ZXJ7ZGlzcGxheTpub25lfS52YW4tY2VsbF9fbGFiZWx7bWFyZ2luLXRvcDozcHg7Y29sb3I6Izk2OTc5OTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxOHB4fS52YW4tY2VsbF9fdGl0bGUsLnZhbi1jZWxsX192YWx1ZXstd2Via2l0LWJveC1mbGV4OjE7LXdlYmtpdC1mbGV4OjE7ZmxleDoxfS52YW4tY2VsbF9fdmFsdWV7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuO2NvbG9yOiM5Njk3OTk7dGV4dC1hbGlnbjpyaWdodDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d29yZC13cmFwOmJyZWFrLXdvcmR9LnZhbi1jZWxsX192YWx1ZS0tYWxvbmV7Y29sb3I6IzMyMzIzMzt0ZXh0LWFsaWduOmxlZnR9LnZhbi1jZWxsX19sZWZ0LWljb24sLnZhbi1jZWxsX19yaWdodC1pY29ue21pbi13aWR0aDoxZW07aGVpZ2h0OjI0cHg7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweH0udmFuLWNlbGxfX2xlZnQtaWNvbnttYXJnaW4tcmlnaHQ6NXB4fS52YW4tY2VsbF9fcmlnaHQtaWNvbnttYXJnaW4tbGVmdDo1cHg7Y29sb3I6Izk2OTc5OX0udmFuLWNlbGwtLWNsaWNrYWJsZTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZjJmM2Y1fS52YW4tY2VsbC0tcmVxdWlyZWR7b3ZlcmZsb3c6dmlzaWJsZX0udmFuLWNlbGwtLXJlcXVpcmVkOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Y29sb3I6I2VlMGEyNDtmb250LXNpemU6MTRweDtjb250ZW50OicqJ30udmFuLWNlbGwtLWNlbnRlcnstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LXdlYmtpdC1hbGlnbi1pdGVtczpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS52YW4tY2VsbC0tbGFyZ2V7cGFkZGluZy10b3A6MTJweDtwYWRkaW5nLWJvdHRvbToxMnB4fS52YW4tY2VsbC0tbGFyZ2UgLnZhbi1jZWxsX190aXRsZXtmb250LXNpemU6MTZweH0udmFuLWNlbGwtLWxhcmdlIC52YW4tY2VsbF9fbGFiZWx7Zm9udC1zaXplOjE0cHh9LnZhbi1jZWxsLWdyb3Vwe2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNlbGwtZ3JvdXBfX3RpdGxle3BhZGRpbmc6MTZweCAxNnB4IDhweDtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjE2cHh9LnZhbi1vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNyl9XCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css":
/*!*********************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css ***!
\*********************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("exports = module.exports = __webpack_require__(/*! ../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n.vjs-modal-dialog .vjs-modal-dialog-content, .video-js .vjs-modal-dialog, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n text-align: center;\\n}\\n\\n@font-face {\\n font-family: VideoJS;\\n src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABDkAAsAAAAAG6gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV3hY21hcAAAAYQAAADaAAADPv749/pnbHlmAAACYAAAC3AAABHQZg6OcWhlYWQAAA3QAAAAKwAAADYZw251aGhlYQAADfwAAAAdAAAAJA+RCLFobXR4AAAOHAAAABMAAACM744AAGxvY2EAAA4wAAAASAAAAEhF6kqubWF4cAAADngAAAAfAAAAIAE0AIFuYW1lAAAOmAAAASUAAAIK1cf1oHBvc3QAAA/AAAABJAAAAdPExYuNeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGS7wTiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGJHcRdyA4RZgQRADK3CxEAAHic7dFZbsMgAEXRS0ycyZnnOeG7y+qC8pU1dHusIOXxuoxaOlwZYWQB0Aea4quIEN4E9LzKbKjzDeM6H/mua6Lmc/p8yhg0lvdYx15ZG8uOLQOGjMp3EzqmzJizYMmKNRu27Nhz4MiJMxeu3Ljz4Ekqm7T8P52G8PP3lnTOVk++Z6iN6QZzNN1F7ptuN7eGOjDUoaGODHVsuvU8MdTO9Hd5aqgzQ50b6sJQl4a6MtS1oW4MdWuoO0PdG+rBUI+GejLUs6FeDPVqqDdDvRvqw1CfhpqM9At0iFLaAAB4nJ1YDXBTVRZ+5/22TUlJ8we0pHlJm7RJf5O8F2j6EymlSPkpxaL8U2xpa3DKj0CBhc2IW4eWKSokIoLsuMqssM64f+jA4HSdWXXXscBq67IOs3FXZ1ZYWVyRFdo899yXtIBQZ90k7717zz3v3HPPOfd854YCCj9cL9dL0RQFOqCbGJnrHb5EayiKIWN8iA/hWBblo6hUWm8TtCDwE80WMJus/irwyxOdxeB0MDb14VNJHnXYoLLSl6FfCUYO9nYPTA8Epg9090LprfbBbZ2hY0UlJUXHQp3/vtWkS6EBv8+rPMq5u9692f/dNxJNiqwC1xPE9TCUgCsSdQWgE3XQD25lkG4CN2xmTcOXWBOyser6RN6KnGbKSbmQ3+d0OI1m2W8QzLLkI2sykrWAgJJEtA8vGGW/2Q+CmT3n8zS9wZwu2DCvtuZKZN3xkrLh36yCZuUomQSqGpY8t/25VfHVhw8z4ebGBtfLb0ya9PCaDc+8dGTvk2dsh6z7WzvowlXKUSWo9MJ15a3KrEP2loOr2Ojhw6iW6hf2BDdEccQvZGpaAy7YovSwq8kr7HGllxpd71rkS6G0Sf11sl9OvMK1+jwPPODxjUwkOim9CU3ix1wNjXDfmJSEn618Bs6lpWwUpU+8PCqLMY650zjq8VhCIP17NEKTx3eaLL+s5Pi6yJWaWjTHLR1jYzPSV9VF/6Ojdb/1kO3Mk3uhHC0x6gc1BjlKQ+nQFxTYdaJkZ7ySVxLBbhR1dsboNXp1tCYKW2LRaEzpYcIx2BKNxaL0ZaUnSqfFoiNhHKR/GkX6PWUSAaJelQaqZL1EpoHNsajSEyPSoJ9IjhIxTdjHLmwZvhRDOiFTY/YeQnvrVZmiTQtGncECXtFTBZLOVwwMRgoXHAkXzMzPn1nAJJ8jYSbMDaqN2waGLzNhih/bZynUBMpIWSg7VYi7DRx2m8ALkIdRCJwI6ArJx2EI8kaDWeTQKeAFk9fjl/1AvwktjQ1P7NjyMGQyfd4vjipX6M/i52D7Cq80kqlcxEcGXRr/FEcgs0u5uGgB4VWuMFfpdn2Re6Hi3PqzmxWKsz6+ae2Pn9hXXw/fqM859UiGC0oKYYILJBqJrsn1Z1E5qOs9rQCiUQRREjm8yJcbHF5cUJufX1vAHlefw0XgUoboS3ETfQlTxBC4SOtuE8VPRJTBSCQSjZCpk7Gqzu+masaZ2y7Zjehho4F3g82BNDkAHpORG4+OCS+f6JTPmtRn/PH1kch6d04sp7AQb25aQ/pqUyXeQ8vrebG8OYQdXOQ+585u0sdW9rqalzRURiJ+9F4MweRFrKUjl1GUYhH1A27WOHw5cTFSFPMo9EeUIGnQTZHIaJ7AHLaOKsOODaNF9jkBjYG2QEsQ2xjMUAx2bBEbeTBWMHwskBjngq56S/yfgkBnWBa4K9sqKtq2t1UI8S9He5XuBRbawAdatrQEAi30Aks2+LM8WeCbalVZkWNylvJ+dqJnzVb+OHlSoKW8nPCP7Rd+CcZ2DdWAGqJ2CBFOphgywFFCFBNtfAbGtNPBCwxvygHeYMZMY9ZboBqwq/pVrsbgN5tkv152ODlbMfiqwGMBgxa4Exz3QhovRIUp6acqZmQzRq0ypDXS2TPLT02YIkQETnOE445oOGxOmXAqUJNNG7XgupMjPq2ua9asrj5yY/yuKteO1Kx0YNJTufrirLe1mZnat7OL6rnUdCWenpW6I8mAnbsY8KWs1PuSovCW9A/Z25PQ24a7cNOqgmTkLmBMgh4THgc4b9k2IVv1/g/F5nGljwPLfOgHAzJzh45V/4+WenTzmMtR5Z7us2Tys909UHqrPY7KbckoxRvRHhmVc3cJGE97uml0R1S0jdULVl7EvZtDFVBF35N9cEdjpgmAiOlFZ+Dtoh93+D3zzHr8RRNZQhnCNMNbcegOvpEwZoL+06cJQ07h+th3fZ/7PVbVC6ngTAV/KoLFuO6+2KFcU651gEb5ugPSIb1D+Xp8V4+k3sEIGnw5mYe4If4k1lFYr6SCzmM2EQ8iWtmwjnBI9kTwe1TlfAmXh7H02by9fW2gsjKwtv0aaURKil4OdV7rDL1MXIFNrhdxohcZXYTnq47WisrKitaObbf5+yvkLi5J6lCNZZ+B6GC38VNBZBDidSS/+mSvh6s+srgC8pyKMvDtt+de3c9fU76ZPfuM8ud4Kv0fyP/LqfepMT/3oZxSqpZaTa1DaQYLY8TFsHYbWYsPoRhRWfL5eSSQbhUGgGC3YLbVMk6PitTFNGpAsNrC6D1VNBKgBHMejaiuRWEWGgsSDBTJjqWIl8kJLlsaLJ2tXDr6xGfT85bM2Q06a46x2HTgvdnV8z5YDy/27J4zt6x2VtkzjoYpkq36kaBr4eQSg7tyiVweWubXZugtadl58ydapfbORfKsDTuZ0OBgx4cfdjCf5tbWNITnL120fdOi1RV1C3uKGzNdwYLcMvZ3BxoPyTOCD1XvXTp7U10gWCVmTV9b3r2z0SkGWovb2hp9I89O8a2smlyaO8muMU+dRmtzp60IzAoFpjLr1n388boLyf0dRvxhsHZ0qbWqDkwqvvpkj4l0fY6EIXRi5sQSrAvsVYwXRy4qJ2EVtD1AN7a0HWth9ymvL1xc3WTUKK/TAHA/bXDVtVWfOMfuGxGZv4Ln/jVr9jc3j1yMv0tndmyt9Vq88Y9gH1wtLX3KWjot5++jWHgAoZZkQ14wGQ20Fli71UmKJAy4xKMSTGbVdybW7FDDAut9XpD5AzWrYO7zQ8qffqF8+Ynd/clrHcdyxGy3a/3+mfNnzC/cBsveTjnTvXf1o6vzOlZw7WtqtdmPK/Errz/6NNtD72zmNOZfbmYdTGHfoofqI79Oc+R2n1lrnL6pOm0Up7kwxhTW12Amm7WYkXR2qYrF2AmgmbAsxZjwy1xpg/m1Je2vrp8v/nz2xpmlBg4E9hrMU341wVpTOh/OfmGvAnra8q6uctr60ZQHV3Q+WMQJykMj8ZsWn2QBOmmHMB+m5pDIpTFonYigiaKAhGEiAHF7EliVnQkjoLVIMPtJpBKHYd3A8GYH9jJzrWwmHx5Qjp7vDAX0suGRym1vtm/9W1/HyR8vczfMs6Sk8DSv855/5dlX9oQq52hT8syyp2rx5Id17IAyAM3wIjQPMOHzytEB64q6D5zT91yNbnx3V/nqnd017S9Y0605k3izoXLpsxde2n38yoOV9s1LcjwzNjbdX6asnBVaBj/6/DwKwPkpcqbDG7BnsXoSqWnUAmottYF6jMSdVyYZh3zVXCjwTiwwHH6sGuRiEHQGzuRX6whZkp123oy1BWE2mEfJ/tvIRtM4ZM5bDXiMsPMaAKOTyc5uL57rqyyc5y5JE5pm1i2S2iUX0CcaQ6lC6Zog7JqSqZmYlosl2K6pwNA84zRnQW6SaALYZQGW5lhCtU/W34N6o+bKfZ8cf3/Cl/+iTX3wBzpOY4mRkeNf3rptycGSshQWgGbYt5jFc2e0+DglIrwl6DVWQ7BuwaJ3Xk1J4VL5urnLl/Wf+gHU/hZoZdKNym6lG+I34FaNeZKcSpJIo2IeCVvpdsDGfKvzJnAwmeD37Ow65ZWwSowpgwX5T69s/rB55dP5BcpgDKFV8p7q2sn/1uc93bVzT/w6UrCqDTWvfCq/oCD/qZXNoUj8BL5Kp6GU017frfNXkAtiiyf/SOCEeLqnd8R/Ql9GlCRfctS6k5chvIBuQ1zCCjoCHL2DHNHIXxMJ3kQeO8lbsUXONeSfA5EjcG6/E+KdhN4bP04vBhdi883+BFBzQbxFbvZzQeY9LNBZc0FNfn5NwfDn6rCTnTw6R8o+gfpf5hCom33cRuiTlss3KHmZjD+BPN+5gXuA2ziS/Q73mLxUkpbKN/eqwz5uK0X9F3h2d1V4nGNgZGBgAOJd776+iue3+crAzc4AAje5Bfcg0xz9YHEOBiYQBQA8FQlFAHicY2BkYGBnAAGOPgaG//85+hkYGVCBMgBGGwNYAAAAeJxjYGBgYB8EmKOPgQEAQ04BfgAAAAAAAA4AaAB+AMwA4AECAUIBbAGYAcICGAJYArQC4AMwA7AD3gQwBJYE3AUkBWYFigYgBmYGtAbqB1gIEghYCG4IhAi2COh4nGNgZGBgUGYoZWBnAAEmIOYCQgaG/2A+AwAYCQG2AHicXZBNaoNAGIZfE5PQCKFQ2lUps2oXBfOzzAESyDKBQJdGR2NQR3QSSE/QE/QEPUUPUHqsvsrXjTMw83zPvPMNCuAWP3DQDAejdm1GjzwS7pMmwi75XngAD4/CQ/oX4TFe4Qt7uMMbOzjuDc0EmXCP/C7cJ38Iu+RP4QEe8CU8pP8WHmOPX2EPz87TPo202ey2OjlnQSXV/6arOjWFmvszMWtd6CqwOlKHq6ovycLaWMWVydXKFFZnmVFlZU46tP7R2nI5ncbi/dDkfDtFBA2DDXbYkhKc+V0Bqs5Zt9JM1HQGBRTm/EezTmZNKtpcAMs9Yu6AK9caF76zoLWIWcfMGOSkVduvSWechqZsz040Ib2PY3urxBJTzriT95lipz+TN1fmAAAAeJxtkMl2wjAMRfOAhABlKm2h80C3+ajgCKKDY6cegP59TYBzukAL+z1Zsq8ctaJTTKPrsUQLbXQQI0EXKXroY4AbDDHCGBNMcYsZ7nCPB8yxwCOe8IwXvOIN7/jAJ76wxHfUqWX+OzgumWAjJMV17i0Ndlr6irLKO+qftdT7i6y4uFSUvCknay+lFYZIZaQcmfH/xIFdYn98bqhra1aKTM/6lWMnyaYirx1rFUQZFBkb2zJUtoXeJCeg0WnLtHeSFc3OtrnozNwqi0TkSpBMDB1nSde5oJXW23hTS2/T0LilglXX7dmFVxLnq5U0vYATHFk3zX3BOisoQHNDFDeZnqKDy9hRNawN7Vh727hFzcJ5c8TILrKZfH7tIPxAFP0BpLeJPA==) format(\\\"woff\\\");\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F101\\\";\\n}\\n\\n.vjs-icon-play-circle {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-play-circle:before {\\n content: \\\"\\\\F102\\\";\\n}\\n\\n.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before {\\n content: \\\"\\\\F103\\\";\\n}\\n\\n.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before {\\n content: \\\"\\\\F104\\\";\\n}\\n\\n.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before {\\n content: \\\"\\\\F105\\\";\\n}\\n\\n.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before {\\n content: \\\"\\\\F106\\\";\\n}\\n\\n.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before {\\n content: \\\"\\\\F107\\\";\\n}\\n\\n.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before {\\n content: \\\"\\\\F108\\\";\\n}\\n\\n.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before {\\n content: \\\"\\\\F109\\\";\\n}\\n\\n.vjs-icon-square {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-square:before {\\n content: \\\"\\\\F10A\\\";\\n}\\n\\n.vjs-icon-spinner {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-spinner:before {\\n content: \\\"\\\\F10B\\\";\\n}\\n\\n.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F10C\\\";\\n}\\n\\n.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F10D\\\";\\n}\\n\\n.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F10E\\\";\\n}\\n\\n.vjs-icon-share {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-share:before {\\n content: \\\"\\\\F10F\\\";\\n}\\n\\n.vjs-icon-cog {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-cog:before {\\n content: \\\"\\\\F110\\\";\\n}\\n\\n.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before {\\n content: \\\"\\\\F111\\\";\\n}\\n\\n.vjs-icon-circle-outline {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-circle-outline:before {\\n content: \\\"\\\\F112\\\";\\n}\\n\\n.vjs-icon-circle-inner-circle {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-circle-inner-circle:before {\\n content: \\\"\\\\F113\\\";\\n}\\n\\n.vjs-icon-hd {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-hd:before {\\n content: \\\"\\\\F114\\\";\\n}\\n\\n.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F115\\\";\\n}\\n\\n.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before {\\n content: \\\"\\\\F116\\\";\\n}\\n\\n.vjs-icon-facebook {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-facebook:before {\\n content: \\\"\\\\F117\\\";\\n}\\n\\n.vjs-icon-gplus {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-gplus:before {\\n content: \\\"\\\\F118\\\";\\n}\\n\\n.vjs-icon-linkedin {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-linkedin:before {\\n content: \\\"\\\\F119\\\";\\n}\\n\\n.vjs-icon-twitter {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-twitter:before {\\n content: \\\"\\\\F11A\\\";\\n}\\n\\n.vjs-icon-tumblr {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-tumblr:before {\\n content: \\\"\\\\F11B\\\";\\n}\\n\\n.vjs-icon-pinterest {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-pinterest:before {\\n content: \\\"\\\\F11C\\\";\\n}\\n\\n.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F11D\\\";\\n}\\n\\n.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before {\\n content: \\\"\\\\F11E\\\";\\n}\\n\\n.vjs-icon-next-item {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-next-item:before {\\n content: \\\"\\\\F11F\\\";\\n}\\n\\n.vjs-icon-previous-item {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-previous-item:before {\\n content: \\\"\\\\F120\\\";\\n}\\n\\n.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\\n content: \\\"\\\\F121\\\";\\n}\\n\\n.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder {\\n font-family: VideoJS;\\n font-weight: normal;\\n font-style: normal;\\n}\\n.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\\n content: \\\"\\\\F122\\\";\\n}\\n\\n.video-js {\\n display: block;\\n vertical-align: top;\\n box-sizing: border-box;\\n color: #fff;\\n background-color: #000;\\n position: relative;\\n padding: 0;\\n font-size: 10px;\\n line-height: 1;\\n font-weight: normal;\\n font-style: normal;\\n font-family: Arial, Helvetica, sans-serif;\\n word-break: initial;\\n}\\n.video-js:-moz-full-screen {\\n position: absolute;\\n}\\n.video-js:-webkit-full-screen {\\n width: 100% !important;\\n height: 100% !important;\\n}\\n\\n.video-js[tabindex=\\\"-1\\\"] {\\n outline: none;\\n}\\n\\n.video-js *,\\n.video-js *:before,\\n.video-js *:after {\\n box-sizing: inherit;\\n}\\n\\n.video-js ul {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n list-style-position: outside;\\n margin-left: 0;\\n margin-right: 0;\\n margin-top: 0;\\n margin-bottom: 0;\\n}\\n\\n.video-js.vjs-fluid,\\n.video-js.vjs-16-9,\\n.video-js.vjs-4-3 {\\n width: 100%;\\n max-width: 100%;\\n height: 0;\\n}\\n\\n.video-js.vjs-16-9 {\\n padding-top: 56.25%;\\n}\\n\\n.video-js.vjs-4-3 {\\n padding-top: 75%;\\n}\\n\\n.video-js.vjs-fill {\\n width: 100%;\\n height: 100%;\\n}\\n\\n.video-js .vjs-tech {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n\\nbody.vjs-full-window {\\n padding: 0;\\n margin: 0;\\n height: 100%;\\n}\\n\\n.vjs-full-window .video-js.vjs-fullscreen {\\n position: fixed;\\n overflow: hidden;\\n z-index: 1000;\\n left: 0;\\n top: 0;\\n bottom: 0;\\n right: 0;\\n}\\n\\n.video-js.vjs-fullscreen {\\n width: 100% !important;\\n height: 100% !important;\\n padding-top: 0 !important;\\n}\\n\\n.video-js.vjs-fullscreen.vjs-user-inactive {\\n cursor: none;\\n}\\n\\n.vjs-hidden {\\n display: none !important;\\n}\\n\\n.vjs-disabled {\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n.video-js .vjs-offscreen {\\n height: 1px;\\n left: -9999px;\\n position: absolute;\\n top: 0;\\n width: 1px;\\n}\\n\\n.vjs-lock-showing {\\n display: block !important;\\n opacity: 1;\\n visibility: visible;\\n}\\n\\n.vjs-no-js {\\n padding: 20px;\\n color: #fff;\\n background-color: #000;\\n font-size: 18px;\\n font-family: Arial, Helvetica, sans-serif;\\n text-align: center;\\n width: 300px;\\n height: 150px;\\n margin: 0px auto;\\n}\\n\\n.vjs-no-js a,\\n.vjs-no-js a:visited {\\n color: #66A8CC;\\n}\\n\\n.video-js .vjs-big-play-button {\\n font-size: 3em;\\n line-height: 1.5em;\\n height: 1.63332em;\\n width: 3em;\\n display: block;\\n position: absolute;\\n top: 10px;\\n left: 10px;\\n padding: 0;\\n cursor: pointer;\\n opacity: 1;\\n border: 0.06666em solid #fff;\\n background-color: #2B333F;\\n background-color: rgba(43, 51, 63, 0.7);\\n border-radius: 0.3em;\\n transition: all 0.4s;\\n}\\n.vjs-big-play-centered .vjs-big-play-button {\\n top: 50%;\\n left: 50%;\\n margin-top: -0.81666em;\\n margin-left: -1.5em;\\n}\\n\\n.video-js:hover .vjs-big-play-button,\\n.video-js .vjs-big-play-button:focus {\\n border-color: #fff;\\n background-color: #73859f;\\n background-color: rgba(115, 133, 159, 0.5);\\n transition: all 0s;\\n}\\n\\n.vjs-controls-disabled .vjs-big-play-button,\\n.vjs-has-started .vjs-big-play-button,\\n.vjs-using-native-controls .vjs-big-play-button,\\n.vjs-error .vjs-big-play-button {\\n display: none;\\n}\\n\\n.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button {\\n display: block;\\n}\\n\\n.video-js button {\\n background: none;\\n border: none;\\n color: inherit;\\n display: inline-block;\\n font-size: inherit;\\n line-height: inherit;\\n text-transform: none;\\n text-decoration: none;\\n transition: none;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n}\\n\\n.vjs-control .vjs-button {\\n width: 100%;\\n height: 100%;\\n}\\n\\n.video-js .vjs-control.vjs-close-button {\\n cursor: pointer;\\n height: 3em;\\n position: absolute;\\n right: 0;\\n top: 0.5em;\\n z-index: 2;\\n}\\n.video-js .vjs-modal-dialog {\\n background: rgba(0, 0, 0, 0.8);\\n background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));\\n overflow: auto;\\n}\\n\\n.video-js .vjs-modal-dialog > * {\\n box-sizing: border-box;\\n}\\n\\n.vjs-modal-dialog .vjs-modal-dialog-content {\\n font-size: 1.2em;\\n line-height: 1.5;\\n padding: 20px 24px;\\n z-index: 1;\\n}\\n\\n.vjs-menu-button {\\n cursor: pointer;\\n}\\n\\n.vjs-menu-button.vjs-disabled {\\n cursor: default;\\n}\\n\\n.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu {\\n display: none;\\n}\\n\\n.vjs-menu .vjs-menu-content {\\n display: block;\\n padding: 0;\\n margin: 0;\\n font-family: Arial, Helvetica, sans-serif;\\n overflow: auto;\\n}\\n\\n.vjs-menu .vjs-menu-content > * {\\n box-sizing: border-box;\\n}\\n\\n.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu {\\n display: none;\\n}\\n\\n.vjs-menu li {\\n list-style: none;\\n margin: 0;\\n padding: 0.2em 0;\\n line-height: 1.4em;\\n font-size: 1.2em;\\n text-align: center;\\n text-transform: lowercase;\\n}\\n\\n.vjs-menu li.vjs-menu-item:focus,\\n.vjs-menu li.vjs-menu-item:hover,\\n.js-focus-visible .vjs-menu li.vjs-menu-item:hover {\\n background-color: #73859f;\\n background-color: rgba(115, 133, 159, 0.5);\\n}\\n\\n.vjs-menu li.vjs-selected,\\n.vjs-menu li.vjs-selected:focus,\\n.vjs-menu li.vjs-selected:hover,\\n.js-focus-visible .vjs-menu li.vjs-selected:hover {\\n background-color: #fff;\\n color: #2B333F;\\n}\\n\\n.vjs-menu li.vjs-menu-title {\\n text-align: center;\\n text-transform: uppercase;\\n font-size: 1em;\\n line-height: 2em;\\n padding: 0;\\n margin: 0 0 0.3em 0;\\n font-weight: bold;\\n cursor: default;\\n}\\n\\n.vjs-menu-button-popup .vjs-menu {\\n display: none;\\n position: absolute;\\n bottom: 0;\\n width: 10em;\\n left: -3em;\\n height: 0em;\\n margin-bottom: 1.5em;\\n border-top-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n background-color: #2B333F;\\n background-color: rgba(43, 51, 63, 0.7);\\n position: absolute;\\n width: 100%;\\n bottom: 1.5em;\\n max-height: 15em;\\n}\\n\\n.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n max-height: 5em;\\n}\\n\\n.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n max-height: 10em;\\n}\\n\\n.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n max-height: 14em;\\n}\\n\\n.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n max-height: 25em;\\n}\\n\\n.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,\\n.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {\\n display: block;\\n}\\n\\n.video-js .vjs-menu-button-inline {\\n transition: all 0.4s;\\n overflow: hidden;\\n}\\n\\n.video-js .vjs-menu-button-inline:before {\\n width: 2.222222222em;\\n}\\n\\n.video-js .vjs-menu-button-inline:hover,\\n.video-js .vjs-menu-button-inline:focus,\\n.video-js .vjs-menu-button-inline.vjs-slider-active,\\n.video-js.vjs-no-flex .vjs-menu-button-inline {\\n width: 12em;\\n}\\n\\n.vjs-menu-button-inline .vjs-menu {\\n opacity: 0;\\n height: 100%;\\n width: auto;\\n position: absolute;\\n left: 4em;\\n top: 0;\\n padding: 0;\\n margin: 0;\\n transition: all 0.4s;\\n}\\n\\n.vjs-menu-button-inline:hover .vjs-menu,\\n.vjs-menu-button-inline:focus .vjs-menu,\\n.vjs-menu-button-inline.vjs-slider-active .vjs-menu {\\n display: block;\\n opacity: 1;\\n}\\n\\n.vjs-no-flex .vjs-menu-button-inline .vjs-menu {\\n display: block;\\n opacity: 1;\\n position: relative;\\n width: auto;\\n}\\n\\n.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,\\n.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,\\n.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {\\n width: auto;\\n}\\n\\n.vjs-menu-button-inline .vjs-menu-content {\\n width: auto;\\n height: 100%;\\n margin: 0;\\n overflow: hidden;\\n}\\n\\n.video-js .vjs-control-bar {\\n display: none;\\n width: 100%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n height: 3em;\\n background-color: #2B333F;\\n background-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.vjs-has-started .vjs-control-bar {\\n display: flex;\\n visibility: visible;\\n opacity: 1;\\n transition: visibility 0.1s, opacity 0.1s;\\n}\\n\\n.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\\n visibility: visible;\\n opacity: 0;\\n transition: visibility 1s, opacity 1s;\\n}\\n\\n.vjs-controls-disabled .vjs-control-bar,\\n.vjs-using-native-controls .vjs-control-bar,\\n.vjs-error .vjs-control-bar {\\n display: none !important;\\n}\\n\\n.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\\n opacity: 1;\\n visibility: visible;\\n}\\n\\n.vjs-has-started.vjs-no-flex .vjs-control-bar {\\n display: table;\\n}\\n\\n.video-js .vjs-control {\\n position: relative;\\n text-align: center;\\n margin: 0;\\n padding: 0;\\n height: 100%;\\n width: 4em;\\n flex: none;\\n}\\n\\n.vjs-button > .vjs-icon-placeholder:before {\\n font-size: 1.8em;\\n line-height: 1.67;\\n}\\n\\n.video-js .vjs-control:focus:before,\\n.video-js .vjs-control:hover:before,\\n.video-js .vjs-control:focus {\\n text-shadow: 0em 0em 1em white;\\n}\\n\\n.video-js .vjs-control-text {\\n border: 0;\\n clip: rect(0 0 0 0);\\n height: 1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.vjs-no-flex .vjs-control {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n\\n.video-js .vjs-custom-control-spacer {\\n display: none;\\n}\\n\\n.video-js .vjs-progress-control {\\n cursor: pointer;\\n flex: auto;\\n display: flex;\\n align-items: center;\\n min-width: 4em;\\n touch-action: none;\\n}\\n\\n.video-js .vjs-progress-control.disabled {\\n cursor: default;\\n}\\n\\n.vjs-live .vjs-progress-control {\\n display: none;\\n}\\n\\n.vjs-liveui .vjs-progress-control {\\n display: flex;\\n align-items: center;\\n}\\n\\n.vjs-no-flex .vjs-progress-control {\\n width: auto;\\n}\\n\\n.video-js .vjs-progress-holder {\\n flex: auto;\\n transition: all 0.2s;\\n height: 0.3em;\\n}\\n\\n.video-js .vjs-progress-control .vjs-progress-holder {\\n margin: 0 10px;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-progress-holder {\\n font-size: 1.6666666667em;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled {\\n font-size: 1em;\\n}\\n\\n.video-js .vjs-progress-holder .vjs-play-progress,\\n.video-js .vjs-progress-holder .vjs-load-progress,\\n.video-js .vjs-progress-holder .vjs-load-progress div {\\n position: absolute;\\n display: block;\\n height: 100%;\\n margin: 0;\\n padding: 0;\\n width: 0;\\n}\\n\\n.video-js .vjs-play-progress {\\n background-color: #fff;\\n}\\n.video-js .vjs-play-progress:before {\\n font-size: 0.9em;\\n position: absolute;\\n right: -0.5em;\\n top: -0.3333333333em;\\n z-index: 1;\\n}\\n\\n.video-js .vjs-load-progress {\\n background: rgba(115, 133, 159, 0.5);\\n}\\n\\n.video-js .vjs-load-progress div {\\n background: rgba(115, 133, 159, 0.75);\\n}\\n\\n.video-js .vjs-time-tooltip {\\n background-color: #fff;\\n background-color: rgba(255, 255, 255, 0.8);\\n border-radius: 0.3em;\\n color: #000;\\n float: right;\\n font-family: Arial, Helvetica, sans-serif;\\n font-size: 1em;\\n padding: 6px 8px 8px 8px;\\n pointer-events: none;\\n position: absolute;\\n top: -3.4em;\\n visibility: hidden;\\n z-index: 1;\\n}\\n\\n.video-js .vjs-progress-holder:focus .vjs-time-tooltip {\\n display: none;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-time-tooltip,\\n.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip {\\n display: block;\\n font-size: 0.6em;\\n visibility: visible;\\n}\\n\\n.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip {\\n font-size: 1em;\\n}\\n\\n.video-js .vjs-progress-control .vjs-mouse-display {\\n display: none;\\n position: absolute;\\n width: 1px;\\n height: 100%;\\n background-color: #000;\\n z-index: 1;\\n}\\n\\n.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\\n z-index: 0;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-mouse-display {\\n display: block;\\n}\\n\\n.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display {\\n visibility: hidden;\\n opacity: 0;\\n transition: visibility 1s, opacity 1s;\\n}\\n\\n.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\\n display: none;\\n}\\n\\n.vjs-mouse-display .vjs-time-tooltip {\\n color: #fff;\\n background-color: #000;\\n background-color: rgba(0, 0, 0, 0.8);\\n}\\n\\n.video-js .vjs-slider {\\n position: relative;\\n cursor: pointer;\\n padding: 0;\\n margin: 0 0.45em 0 0.45em;\\n /* iOS Safari */\\n -webkit-touch-callout: none;\\n /* Safari */\\n -webkit-user-select: none;\\n /* Konqueror HTML */\\n /* Firefox */\\n -moz-user-select: none;\\n /* Internet Explorer/Edge */\\n -ms-user-select: none;\\n /* Non-prefixed version, currently supported by Chrome and Opera */\\n user-select: none;\\n background-color: #73859f;\\n background-color: rgba(115, 133, 159, 0.5);\\n}\\n\\n.video-js .vjs-slider.disabled {\\n cursor: default;\\n}\\n\\n.video-js .vjs-slider:focus {\\n text-shadow: 0em 0em 1em white;\\n box-shadow: 0 0 1em #fff;\\n}\\n\\n.video-js .vjs-mute-control {\\n cursor: pointer;\\n flex: none;\\n}\\n.video-js .vjs-volume-control {\\n cursor: pointer;\\n margin-right: 1em;\\n display: flex;\\n}\\n\\n.video-js .vjs-volume-control.vjs-volume-horizontal {\\n width: 5em;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control {\\n visibility: visible;\\n opacity: 0;\\n width: 1px;\\n height: 1px;\\n margin-left: -1px;\\n}\\n\\n.video-js .vjs-volume-panel {\\n transition: width 1s;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active {\\n visibility: visible;\\n opacity: 1;\\n position: relative;\\n transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {\\n width: 5em;\\n height: 3em;\\n margin-right: 0;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical {\\n left: -3.5em;\\n transition: left 0s;\\n}\\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\\n width: 10em;\\n transition: width 0.1s;\\n}\\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only {\\n width: 4em;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\\n height: 8em;\\n width: 3em;\\n left: -3000em;\\n transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\\n transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\\n}\\n\\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\\n width: 5em;\\n height: 3em;\\n visibility: visible;\\n opacity: 1;\\n position: relative;\\n transition: none;\\n}\\n\\n.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,\\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\\n position: absolute;\\n bottom: 3em;\\n left: 0.5em;\\n}\\n\\n.video-js .vjs-volume-panel {\\n display: flex;\\n}\\n\\n.video-js .vjs-volume-bar {\\n margin: 1.35em 0.45em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-horizontal {\\n width: 5em;\\n height: 0.3em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-vertical {\\n width: 0.3em;\\n height: 5em;\\n margin: 1.35em auto;\\n}\\n\\n.video-js .vjs-volume-level {\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n background-color: #fff;\\n}\\n.video-js .vjs-volume-level:before {\\n position: absolute;\\n font-size: 0.9em;\\n}\\n\\n.vjs-slider-vertical .vjs-volume-level {\\n width: 0.3em;\\n}\\n.vjs-slider-vertical .vjs-volume-level:before {\\n top: -0.5em;\\n left: -0.3em;\\n}\\n\\n.vjs-slider-horizontal .vjs-volume-level {\\n height: 0.3em;\\n}\\n.vjs-slider-horizontal .vjs-volume-level:before {\\n top: -0.3em;\\n right: -0.5em;\\n}\\n\\n.video-js .vjs-volume-panel.vjs-volume-panel-vertical {\\n width: 4em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {\\n height: 100%;\\n}\\n\\n.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {\\n width: 100%;\\n}\\n\\n.video-js .vjs-volume-vertical {\\n width: 3em;\\n height: 8em;\\n bottom: 8em;\\n background-color: #2B333F;\\n background-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.video-js .vjs-volume-horizontal .vjs-menu {\\n left: -2em;\\n}\\n\\n.vjs-poster {\\n display: inline-block;\\n vertical-align: middle;\\n background-repeat: no-repeat;\\n background-position: 50% 50%;\\n background-size: contain;\\n background-color: #000000;\\n cursor: pointer;\\n margin: 0;\\n padding: 0;\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n height: 100%;\\n}\\n\\n.vjs-has-started .vjs-poster {\\n display: none;\\n}\\n\\n.vjs-audio.vjs-has-started .vjs-poster {\\n display: block;\\n}\\n\\n.vjs-using-native-controls .vjs-poster {\\n display: none;\\n}\\n\\n.video-js .vjs-live-control {\\n display: flex;\\n align-items: flex-start;\\n flex: auto;\\n font-size: 1em;\\n line-height: 3em;\\n}\\n\\n.vjs-no-flex .vjs-live-control {\\n display: table-cell;\\n width: auto;\\n text-align: left;\\n}\\n\\n.video-js:not(.vjs-live) .vjs-live-control,\\n.video-js.vjs-liveui .vjs-live-control {\\n display: none;\\n}\\n\\n.video-js .vjs-seek-to-live-control {\\n cursor: pointer;\\n flex: none;\\n display: inline-flex;\\n height: 100%;\\n padding-left: 0.5em;\\n padding-right: 0.5em;\\n font-size: 1em;\\n line-height: 3em;\\n width: auto;\\n min-width: 4em;\\n}\\n\\n.vjs-no-flex .vjs-seek-to-live-control {\\n display: table-cell;\\n width: auto;\\n text-align: left;\\n}\\n\\n.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,\\n.video-js:not(.vjs-live) .vjs-seek-to-live-control {\\n display: none;\\n}\\n\\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge {\\n cursor: auto;\\n}\\n\\n.vjs-seek-to-live-control .vjs-icon-placeholder {\\n margin-right: 0.5em;\\n color: #888;\\n}\\n\\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder {\\n color: red;\\n}\\n\\n.video-js .vjs-time-control {\\n flex: none;\\n font-size: 1em;\\n line-height: 3em;\\n min-width: 2em;\\n width: auto;\\n padding-left: 1em;\\n padding-right: 1em;\\n}\\n\\n.vjs-live .vjs-time-control {\\n display: none;\\n}\\n\\n.video-js .vjs-current-time,\\n.vjs-no-flex .vjs-current-time {\\n display: none;\\n}\\n\\n.video-js .vjs-duration,\\n.vjs-no-flex .vjs-duration {\\n display: none;\\n}\\n\\n.vjs-time-divider {\\n display: none;\\n line-height: 3em;\\n}\\n\\n.vjs-live .vjs-time-divider {\\n display: none;\\n}\\n\\n.video-js .vjs-play-control {\\n cursor: pointer;\\n}\\n\\n.video-js .vjs-play-control .vjs-icon-placeholder {\\n flex: none;\\n}\\n\\n.vjs-text-track-display {\\n position: absolute;\\n bottom: 3em;\\n left: 0;\\n right: 0;\\n top: 0;\\n pointer-events: none;\\n}\\n\\n.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {\\n bottom: 1em;\\n}\\n\\n.video-js .vjs-text-track {\\n font-size: 1.4em;\\n text-align: center;\\n margin-bottom: 0.1em;\\n}\\n\\n.vjs-subtitles {\\n color: #fff;\\n}\\n\\n.vjs-captions {\\n color: #fc6;\\n}\\n\\n.vjs-tt-cue {\\n display: block;\\n}\\n\\nvideo::-webkit-media-text-track-display {\\n transform: translateY(-3em);\\n}\\n\\n.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {\\n transform: translateY(-1.5em);\\n}\\n\\n.video-js .vjs-picture-in-picture-control {\\n cursor: pointer;\\n flex: none;\\n}\\n.video-js .vjs-fullscreen-control {\\n cursor: pointer;\\n flex: none;\\n}\\n.vjs-playback-rate > .vjs-menu-button,\\n.vjs-playback-rate .vjs-playback-rate-value {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.vjs-playback-rate .vjs-playback-rate-value {\\n pointer-events: none;\\n font-size: 1.5em;\\n line-height: 2;\\n text-align: center;\\n}\\n\\n.vjs-playback-rate .vjs-menu {\\n width: 4em;\\n left: 0em;\\n}\\n\\n.vjs-error .vjs-error-display .vjs-modal-dialog-content {\\n font-size: 1.4em;\\n text-align: center;\\n}\\n\\n.vjs-error .vjs-error-display:before {\\n color: #fff;\\n content: \\\"X\\\";\\n font-family: Arial, Helvetica, sans-serif;\\n font-size: 4em;\\n left: 0;\\n line-height: 1;\\n margin-top: -0.5em;\\n position: absolute;\\n text-shadow: 0.05em 0.05em 0.1em #000;\\n text-align: center;\\n top: 50%;\\n vertical-align: middle;\\n width: 100%;\\n}\\n\\n.vjs-loading-spinner {\\n display: none;\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n margin: -25px 0 0 -25px;\\n opacity: 0.85;\\n text-align: left;\\n border: 6px solid rgba(43, 51, 63, 0.7);\\n box-sizing: border-box;\\n background-clip: padding-box;\\n width: 50px;\\n height: 50px;\\n border-radius: 25px;\\n visibility: hidden;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner,\\n.vjs-waiting .vjs-loading-spinner {\\n display: block;\\n -webkit-animation: vjs-spinner-show 0s linear 0.3s forwards;\\n animation: vjs-spinner-show 0s linear 0.3s forwards;\\n}\\n\\n.vjs-loading-spinner:before,\\n.vjs-loading-spinner:after {\\n content: \\\"\\\";\\n position: absolute;\\n margin: -6px;\\n box-sizing: inherit;\\n width: inherit;\\n height: inherit;\\n border-radius: inherit;\\n opacity: 1;\\n border: inherit;\\n border-color: transparent;\\n border-top-color: white;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:before,\\n.vjs-seeking .vjs-loading-spinner:after,\\n.vjs-waiting .vjs-loading-spinner:before,\\n.vjs-waiting .vjs-loading-spinner:after {\\n -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\\n animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:before,\\n.vjs-waiting .vjs-loading-spinner:before {\\n border-top-color: white;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:after,\\n.vjs-waiting .vjs-loading-spinner:after {\\n border-top-color: white;\\n -webkit-animation-delay: 0.44s;\\n animation-delay: 0.44s;\\n}\\n\\n@keyframes vjs-spinner-show {\\n to {\\n visibility: visible;\\n }\\n}\\n@-webkit-keyframes vjs-spinner-show {\\n to {\\n visibility: visible;\\n }\\n}\\n@keyframes vjs-spinner-spin {\\n 100% {\\n transform: rotate(360deg);\\n }\\n}\\n@-webkit-keyframes vjs-spinner-spin {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n }\\n}\\n@keyframes vjs-spinner-fade {\\n 0% {\\n border-top-color: #73859f;\\n }\\n 20% {\\n border-top-color: #73859f;\\n }\\n 35% {\\n border-top-color: white;\\n }\\n 60% {\\n border-top-color: #73859f;\\n }\\n 100% {\\n border-top-color: #73859f;\\n }\\n}\\n@-webkit-keyframes vjs-spinner-fade {\\n 0% {\\n border-top-color: #73859f;\\n }\\n 20% {\\n border-top-color: #73859f;\\n }\\n 35% {\\n border-top-color: white;\\n }\\n 60% {\\n border-top-color: #73859f;\\n }\\n 100% {\\n border-top-color: #73859f;\\n }\\n}\\n.vjs-chapters-button .vjs-menu ul {\\n width: 24em;\\n}\\n\\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\\n vertical-align: middle;\\n display: inline-block;\\n margin-bottom: -0.1em;\\n}\\n\\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\\n font-family: VideoJS;\\n content: \\\"\\\\F10D\\\";\\n font-size: 1.5em;\\n line-height: inherit;\\n}\\n\\n.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\\n vertical-align: middle;\\n display: inline-block;\\n margin-bottom: -0.1em;\\n}\\n\\n.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\\n font-family: VideoJS;\\n content: \\\" \\\\F11D\\\";\\n font-size: 1.5em;\\n line-height: inherit;\\n}\\n\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-control, .video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-control, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-control {\\n display: none;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\\n width: auto;\\n width: initial;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-liveui) .vjs-subs-caps-button, .video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-live) .vjs-subs-caps-button, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subs-caps-button {\\n display: none;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-custom-control-spacer, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-custom-control-spacer {\\n flex: auto;\\n display: block;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui.vjs-no-flex .vjs-custom-control-spacer, .video-js:not(.vjs-fullscreen).vjs-layout-tiny.vjs-no-flex .vjs-custom-control-spacer {\\n width: auto;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-progress-control, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-progress-control {\\n display: none;\\n}\\n\\n.vjs-modal-dialog.vjs-text-track-settings {\\n background-color: #2B333F;\\n background-color: rgba(43, 51, 63, 0.75);\\n color: #fff;\\n height: 70%;\\n}\\n\\n.vjs-text-track-settings .vjs-modal-dialog-content {\\n display: table;\\n}\\n\\n.vjs-text-track-settings .vjs-track-settings-colors,\\n.vjs-text-track-settings .vjs-track-settings-font,\\n.vjs-text-track-settings .vjs-track-settings-controls {\\n display: table-cell;\\n}\\n\\n.vjs-text-track-settings .vjs-track-settings-controls {\\n text-align: right;\\n vertical-align: bottom;\\n}\\n\\n@supports (display: grid) {\\n .vjs-text-track-settings .vjs-modal-dialog-content {\\n display: grid;\\n grid-template-columns: 1fr 1fr;\\n grid-template-rows: 1fr;\\n padding: 20px 24px 0px 24px;\\n }\\n\\n .vjs-track-settings-controls .vjs-default-button {\\n margin-bottom: 20px;\\n }\\n\\n .vjs-text-track-settings .vjs-track-settings-controls {\\n grid-column: 1/-1;\\n }\\n\\n .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,\\n.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,\\n.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content {\\n grid-template-columns: 1fr;\\n }\\n}\\n.vjs-track-setting > select {\\n margin-right: 1em;\\n margin-bottom: 0.5em;\\n}\\n\\n.vjs-text-track-settings fieldset {\\n margin: 5px;\\n padding: 3px;\\n border: none;\\n}\\n\\n.vjs-text-track-settings fieldset span {\\n display: inline-block;\\n}\\n\\n.vjs-text-track-settings fieldset span > select {\\n max-width: 7.3em;\\n}\\n\\n.vjs-text-track-settings legend {\\n color: #fff;\\n margin: 0 0 5px 0;\\n}\\n\\n.vjs-text-track-settings .vjs-label {\\n position: absolute;\\n clip: rect(1px 1px 1px 1px);\\n clip: rect(1px, 1px, 1px, 1px);\\n display: block;\\n margin: 0 0 5px 0;\\n padding: 0;\\n border: 0;\\n height: 1px;\\n width: 1px;\\n overflow: hidden;\\n}\\n\\n.vjs-track-settings-controls button:focus,\\n.vjs-track-settings-controls button:active {\\n outline-style: solid;\\n outline-width: medium;\\n background-image: linear-gradient(0deg, #fff 88%, #73859f 100%);\\n}\\n\\n.vjs-track-settings-controls button:hover {\\n color: rgba(43, 51, 63, 0.75);\\n}\\n\\n.vjs-track-settings-controls button {\\n background-color: #fff;\\n background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%);\\n color: #2B333F;\\n cursor: pointer;\\n border-radius: 2px;\\n}\\n\\n.vjs-track-settings-controls .vjs-default-button {\\n margin-right: 1em;\\n}\\n\\n@media print {\\n .video-js > *:not(.vjs-tech):not(.vjs-poster) {\\n visibility: hidden;\\n }\\n}\\n.vjs-resize-manager {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n border: none;\\n z-index: -1000;\\n}\\n\\n.js-focus-visible .video-js *:focus:not(.focus-visible) {\\n outline: none;\\n background: none;\\n}\\n\\n.video-js *:focus:not(:focus-visible),\\n.video-js .vjs-menu *:focus:not(:focus-visible) {\\n outline: none;\\n background: none;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDcuNi42QHZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlby5qc0A3LjYuNkB2aWRlby5qcy9kaXN0L3ZpZGVvLWpzLmNzcz9kZTg4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi52anMtbW9kYWwtZGlhbG9nIC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQsIC52aWRlby1qcyAudmpzLW1vZGFsLWRpYWxvZywgLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcbi52anMtYnV0dG9uID4gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUJEa0FBc0FBQUFBRzZnQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJIVTFWQ0FBQUJDQUFBQURzQUFBQlVJSXNsZWs5VEx6SUFBQUZFQUFBQVBnQUFBRlpSaVYzaFkyMWhjQUFBQVlRQUFBRGFBQUFEUHY3NDkvcG5iSGxtQUFBQ1lBQUFDM0FBQUJIUVpnNk9jV2hsWVdRQUFBM1FBQUFBS3dBQUFEWVp3MjUxYUdobFlRQUFEZndBQUFBZEFBQUFKQStSQ0xGb2JYUjRBQUFPSEFBQUFCTUFBQUNNNzQ0QUFHeHZZMkVBQUE0d0FBQUFTQUFBQUVoRjZrcXViV0Y0Y0FBQURuZ0FBQUFmQUFBQUlBRTBBSUZ1WVcxbEFBQU9tQUFBQVNVQUFBSUsxY2Yxb0hCdmMzUUFBQS9BQUFBQkpBQUFBZFBFeFl1TmVKeGpZR1JnWU9CaU1HQ3dZMkJ5Y2ZNSlllRExTU3pKWTVCaVlHR0FBSkE4TXBzeEp6TTlrWUVEeGdQS3NZQnBEaUJtZzRnQ0FDWTdCVWdBZUp4allHUzd3VGlCZ1pXQmdhV1E1UmtEQThNdkNNMGN3eERPZUk2QmdZbUJsWmtCS3doSWMwMWhjUGpJK0ZHSkhjUmR5QTRSWmdRUkFESzNDeEVBQUhpYzdkRlpic01nQUVYUlMweWN5Wm5uT2VHN3krcUM4cFUxZEh1c0lPWHh1b3hhT2x3WllXUUIwQWVhNHF1SUVONEU5THpLYktqekRlTTZIL211YTZMbWMvcDh5aGcwbHZkWXgxNVpHOHVPTFFPR2pNcDNFenFtekppellNbUtOUnUyN05oejRNaUpNeGV1M0xqejRFa3FtN1Q4UDUyRzhQUDNsblRPVmsrK1o2aU42UVp6Tk4xRjdwdHVON2VHT2pEVW9hR09ESFZzdXZVOE1kVE85SGQ1YXFnelE1MGI2c0pRbDRhNk10UzFvVzRNZFd1b08wUGRHK3JCVUkrR2VqTFVzNkZlRFBWcXFEZER2UnZxdzFDZmhwcU05QXQwaUZMYUFBQjRuSjFZRFhCVFZSWis1LzIyVFVsSjh3ZTBwSGxKbTdSSmY1TzhGMmo2RXltbFNQa3B4YUw4VTJ4cGEzREtqMENCaGMySVc0ZVdLU29rSW9Mc3VNcXNzTTY0ZitqQTRIU2RXWFhYc2NCcTY3SU9zM0ZYWjFaWVdWeVJGZG84OTl5WHRJQlFaOTBrNzcxN3p6M3YzSFBQT2ZkODU0WUNDajljTDlkTDBSUUZPcUNiR0puckhiNUVheWlLSVdOOGlBL2hXQmJsbzZoVVdtOFR0Q0R3RTgwV01KdXMvaXJ3eXhPZHhlQjBNRGIxNFZOSkhuWFlvTExTbDZGZkNVWU85bllQVEE4RXBnOTA5MExwcmZiQmJaMmhZMFVsSlVYSFFwMy92dFdrUzZFQnY4K3JQTXE1dTk2OTJmL2ROeEpOaXF3QzF4UEU5VENVZ0NzU2RRV2dFM1hRRDI1bGtHNENOMnhtVGNPWFdCT3lzZXI2Uk42S25HYktTYm1RMytkME9JMW0yVzhRekxMa0kyc3lrcldBZ0pKRXRBOHZHR1cvMlErQ21UM244elM5d1p3dTJEQ3Z0dVpLWk4zeGtyTGgzNnlDWnVVb21RU3FHcFk4dC8yNVZmSFZodzh6NGViR0J0ZkxiMHlhOVBDYURjKzhkR1R2azJkc2g2ejdXenZvd2xYS1VTV285TUoxNWEzS3JFUDJsb09yMk9qaHc2aVc2aGYyQkRkRWNjUXZaR3BhQXk3WW92U3dxOGtyN0hHbGx4cGQ3MXJrUzZHMFNmMTFzbDlPdk1LMStqd1BQT0R4alV3a09pbTlDVTNpeDF3TmpYRGZtSlNFbjYxOEJzNmxwV3dVcFUrOFBDcUxNWTY1MHpqcThWaENJUDE3TkVLVHgzZWFMTCtzNVBpNnlKV2FXalRITFIxall6UFNWOVZGLzZPamRiLzFrTzNNazN1aEhDMHg2Z2MxQmpsS1ErblFGeFRZZGFKa1o3eVNWeExCYmhSMWRzYm9OWHAxdENZS1cyTFJhRXpwWWNJeDJCS054YUwwWmFVblNxZkZvaU5oSEtSL0drWDZQV1VTQWFKZWxRYXFaTDFFcG9ITnNhalNFeVBTb0o5SWpoSXhUZGpITG13WnZoUkRPaUZUWS9ZZVFudnJWWm1pVFF0R25jRUNYdEZUQlpMT1Z3d01SZ29YSEFrWHpNelBuMW5BSko4allTYk1EYXFOMndhR0x6TmhpaC9iWnluVUJNcElXU2c3VllpN0RSeDJtOEFMa0lkUkNKd0k2QXJKeDJFSThrYURXZVRRS2VBRms5ZmpsLzFBdndrdGpRMVA3Tmp5TUdReWZkNHZqaXBYNk0vaTUyRDdDcTgwa3FsY3hFY0dYUnIvRkVjZ3MwdTV1R2dCNFZXdU1GZnBkbjJSZTZIaTNQcXpteFdLc3o2K2FlMlBuOWhYWHcvZnFNODU5VWlHQzBvS1lZSUxKQnFKcnNuMVoxRTVxT3M5clFDaVVRUlJFam04eUpjYkhGNWNVSnVmWDF2QUhsZWZ3MFhnVW9ib1MzRVRmUWxUeEJDNFNPdHVFOFZQUkpUQlNDUVNqWkNwazdHcXp1K21hc2FaMnk3WmplaGhvNEYzZzgyQk5Ea0FIcE9SRzQrT0NTK2Y2SlRQbXRSbi9QSDFrY2g2ZDA0c3A3QVFiMjVhUS9wcVV5WGVROHZyZWJHOE9ZUWRYT1ErNTg1dTBzZFc5cnFhbHpSVVJpSis5RjRNd2VSRnJLVWpsMUdVWWhIMUEyN1dPSHc1Y1RGU0ZQTW85RWVVSUduUVRaSElhSjdBSExhT0tzT09EYU5GOWprQmpZRzJRRXNRMnhqTVVBeDJiQkViZVRCV01Id3NrQmpuZ3E1NlMveWZna0JuV0JhNEs5c3FLdHEydDFVSThTOUhlNVh1QlJiYXdBZGF0clFFQWkzMEFrczIrTE04V2VDYmFsVlprV055bHZKK2RxSm56VmIrT0hsU29LVzhuUENQN1JkK0NjWjJEZFdBR3FKMkNCRk9waGd5d0ZGQ0ZCTnRmQWJHdE5QQkN3eHZ5Z0hlWU1aTVk5WmJvQnF3cS9wVnJzYmdONXRrdjE1Mk9EbGJNZmlxd0dNQmd4YTRFeHozUWhvdlJJVXA2YWNxWm1RelJxMHlwRFhTMlRQTFQwMllJa1FFVG5PRTQ0NW9PR3hPbVhBcVVKTk5HN1hndXBNalBxMnVhOWFzcmo1eVkveXVLdGVPMUt4MFlOSlR1ZnJpckxlMW1abmF0N09MNnJuVWRDV2VucFc2SThtQW5ic1k4S1dzMVB1U292Q1c5QS9aMjVQUTI0YTdjTk9xZ21Ua0xtQk1naDRUSGdjNGI5azJJVnYxL2cvRjVuR2xqd1BMZk9nSEF6SnpoNDVWLzQrV2VuVHptTXRSNVo3dXMyVHlzOTA5VUhxclBZN0tiY2tveFJ2UkhobVZjM2NKR0U5N3VtbDBSMVMwamRVTFZsN0V2WnRERlZCRjM1TjljRWRqcGdtQWlPbEZaK0R0b2g5MytEM3p6SHI4UlJOWlFobkNOTU5iY2VnT3ZwRXdab0wrMDZjSlEwN2grdGgzZlovN1BWYlZDNm5nVEFWL0tvTEZ1TzYrMktGY1U2NTFnRWI1dWdQU0liMUQrWHA4VjQrazNzRUlHbnc1bVllNElmNGsxbEZZcjZTQ3ptTTJFUThpV3Rtd2puQkk5a1R3ZTFUbGZBbVhoN0gwMmJ5OWZXMmdzakt3dHYwYWFVUktpbDRPZFY3ckRMMU1YSUZOcmhkeG9oY1pYWVRucTQ3V2lzcktpdGFPYmJmNSt5dmtMaTVKNmxDTlpaK0I2R0MzOFZOQlpCRGlkU1MvK21Tdmg2cytzcmdDOHB5S012RHR0K2RlM2M5ZlU3NlpQZnVNOHVkNEt2MGZ5UC9McWZlcE1ULzNvWnhTcXBaYVRhMURhUVlMWThURnNIWWJXWXNQb1JoUldmTDVlU1NRYmhVR2dHQzNZTGJWTWs2UGl0VEZOR3BBc05yQzZEMVZOQktnQkhNZWphaXVSV0VXR2dzU0RCVEpqcVdJbDhrSkxsc2FMSjJ0WERyNnhHZlQ4NWJNMlEwNmE0NngySFRndmRuVjh6NVlEeS8yN0o0enQ2eDJWdGt6am9ZcGtxMzZrYUJyNGVRU2c3dHlpVndlV3ViWFp1Z3RhZGw1OHlkYXBmYk9SZktzRFR1WjBPQmd4NGNmZGpDZjV0YldOSVRuTDEyMGZkT2kxUlYxQzN1S0d6TmR3WUxjTXZaM0J4b1B5VE9DRDFYdlhUcDdVMTBnV0NWbVRWOWIzcjJ6MFNrR1dvdmIyaHA5STg5TzhhMnNtbHlhTzhtdU1VK2RSbXR6cDYwSXpBb0ZwakxyMW4zODhib0x5ZjBkUnZ4aHNIWjBxYldxRGt3cXZ2cGtqNGwwZlk2RUlYUmk1c1FTckF2c1ZZd1hSeTRxSjJFVnREMUFON2EwSFd0aDl5bXZMMXhjM1dUVUtLL1RBSEEvYlhEVnRWV2ZPTWZ1R3hHWnY0TG4valZyOWpjM2oxeU12MHRuZG15dDlWcTg4WTlnSDF3dExYM0tXam90NSsraldIZ0FvWlprUTE0d0dRMjBGbGk3MVVtS0pBeTR4S01TVEdiVmR5Ylc3RkREQXV0OVhwRDVBeldyWU83elE4cWZmcUY4K1luZC9jbHJIY2R5eEd5M2EvMyttZk5uekMvY0JzdmVUam5UdlhmMW82dnpPbFp3N1d0cXRkbVBLL0VycnovNk5OdEQ3MnptTk9aZmJtWWRUR0hmb29mcUk3OU9jK1IybjFscm5MNnBPbTBVcDdrd3hoVFcxMkFtbTdXWWtYUjJxWXJGMkFtZ21iQXN4Wmp3eTF4cGcvbTFKZTJ2cnA4di9uejJ4cG1sQmc0RTlock1VMzQxd1ZwVE9oL09mbUd2QW5yYThxNnVjdHI2MFpRSFYzUStXTVFKeWtNajhac1duMlFCT21tSE1CK201cERJcFRGb25ZaWdpYUtBaEdFaUFIRjdFbGlWblFram9MVklNUHRKcEJLSFlkM0E4R1lIOWpKenJXd21IeDVRanA3dkRBWDBzdUdSeW0xdnRtLzlXMS9IeVI4dmN6Zk1zNlNrOERTdjg1NS81ZGxYOW9RcTUyaFQ4c3l5cDJyeDVJZDE3SUF5QU0zd0lqUVBNT0h6eXRFQjY0cTZENXpUOTF5TmJueDNWL25xbmQwMTdTOVkwNjA1azNpem9YTHBzeGRlMm4zOHlvT1Y5czFMY2p3ek5qYmRYNmFzbkJWYUJqLzYvRHdLd1BrcGNxYkRHN0Juc1hvU3FXblVBbW90dFlGNmpNU2RWeVlaaDN6VlhDandUaXd3SEg2c0d1UmlFSFFHenVSWDZ3aFprcDEyM295MUJXRTJtRWZKL3R2SVJ0TTRaTTViRFhpTXNQTWFBS09UeWM1dUw1N3JxeXljNXk1SkU1cG0xaTJTMmlVWDBDY2FRNmxDNlpvZzdKcVNxWm1ZbG9zbDJLNnB3TkE4NHpSblFXNlNhQUxZWlFHVzVsaEN0VS9XMzRONm8rYktmWjhjZjMvQ2wvK2lUWDN3QnpwT1k0bVJrZU5mM3JwdHljR1NzaFFXZ0diWXQ1akZjMmUwK0RnbElyd2w2RFZXUTdCdXdhSjNYazFKNFZMNXVybkxsL1dmK2dIVS9oWm9aZEtOeW02bEcrSTM0RmFOZVpLY1NwSklvMkllQ1Z2cGRzREdmS3Z6Sm5Bd21lRDM3T3c2NVpXd1Nvd3Bnd1g1VDY5cy9yQjU1ZFA1QmNwZ0RLRlY4cDdxMnNuLzF1YzkzYlZ6VC93NlVyQ3FEVFd2ZkNxL29DRC9xWlhOb1VqOEJMNUtwNkdVMDE3ZnJmTlhrQXRpaXlmL1NPQ0VlTHFuZDhSL1FsOUdsQ1JmY3RTNms1Y2h2SUJ1UTF6Q0Nqb0NITDJESE5ISVh4TUoza1FlTzhsYnNVWE9OZVNmQTVFamNHNi9FK0tkaE40YlAwNHZCaGRpODgzK0JGQnpRYnhGYnZaelFlWTlMTkJaYzBGTmZuNU53ZkRuNnJDVG5UdzZSOG8rZ2ZwZjVoQ29tMzNjUnVpVGxzczNLSG1aakQrQlBOKzVnWHVBMnppUy9RNzNtTHhVa3BiS04vZXF3ejV1SzBYOUYzaDJkMVY0bkdOZ1pHQmdBT0pkNzc2K2l1ZTMrY3JBemM0QUFqZTVCZmNnMHh6OVlIRU9CaVlRQlFBOEZRbEZBSGljWTJCa1lHQm5BQUdPUGdhRy8vODUraGtZR1ZDQk1nQkdHd05ZQUFBQWVKeGpZR0JnWUI4RW1LT1BnUUVBUTA0QmZnQUFBQUFBQUE0QWFBQitBTXdBNEFFQ0FVSUJiQUdZQWNJQ0dBSllBclFDNEFNd0E3QUQzZ1F3QkpZRTNBVWtCV1lGaWdZZ0JtWUd0QWJxQjFnSUVnaFlDRzRJaEFpMkNPaDRuR05nWkdCZ1VHWW9aV0JuQUFFbUlPWUNRZ2FHLzJBK0F3QVlDUUcyQUhpY1haQk5hb05BR0laZkU1UFFDS0ZRMmxVcHMyb1hCZk96ekFFU3lES0JRSmRHUjJOUVIzUVNTRS9RRS9RRVBVVVBVSHFzdnNyWGpUTXc4M3pQdlBNTkN1QVdQM0RRREFlamRtMUdqendTN3BNbXdpNzVYbmdBRDQvQ1Evb1g0VEZlNFF0N3VNTWJPemp1RGMwRW1YQ1AvQzdjSjM4SXUrUlA0UUVlOENVOHBQOFdIbU9QWDJFUHo4N1RQbzIwMmV5Mk9qbG5RU1hWLzZhck9qV0ZtdnN6TVd0ZDZDcXdPbEtIcTZvdnljTGFXTVdWeWRYS0ZGWm5tVkZsWlU0NnRQN1Iybkk1bmNiaS9kRGtmRHRGQkEyRERYYllraEtjK1YwQnFzNVp0OUpNMUhRR0JSVG0vRWV6VG1aTkt0cGNBTXM5WXU2QUs5Y2FGNzZ6b0xXSVdjZk1HT1NrVmR1dlNXZWNocVpzejA0MEliMlBZM3VyeEJKVHpyaVQ5NWxpcHorVE4xZm1BQUFBZUp4dGtNbDJ3akFNUmZPQWhBQmxLbTJoODBDMythamdDS0tEWTZjZWdQNTlUWUJ6dWtBTCt6MVpzcThjdGFKVFRLUHJzVVFMYlhRUUkwRVhLWHJvWTRBYkRESENHQk5NY1lzWjduQ1BCOHl4d0NPZThJd1h2T0lONy9qQUo3Nnd4SGZVcVdYK096Z3VtV0FqSk1WMTdpME5kbHI2aXJMS08rcWZ0ZFQ3aTZ5NHVGU1V2Q2tuYXkrbEZZWklaYVFjbWZIL3hJRmRZbjk4YnFocmExYUtUTS82bFdNbnlhWWlyeDFyRlVRWkZCa2IyekpVdG9YZUpDZWcwV25MdEhlU0ZjM090cm5vek53cWkwVGtTcEJNREIxblNkZTVvSlhXMjNoVFMyL1QwTGlsZ2xYWDdkbUZWeExucTVVMHZZQVRIRmszelgzQk9pc29RSE5ERkRlWm5xS0R5OWhSTmF3TjdWaDcyN2hGemNKNWM4VElMcktaZkg3dElQeEFGUDBCcExlSlBBPT0pIGZvcm1hdChcXFwid29mZlxcXCIpO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXksIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXIsIC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXk6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTAxXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBsYXktY2lyY2xlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXktY2lyY2xlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tcGF1c2UsIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtcGxheWluZyAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcGF1c2U6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDNcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tdm9sdW1lLW11dGUsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTAgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXZvbHVtZS1tdXRlOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNFxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtbG93LCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0xIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtbG93OmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMSAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNVxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtbWlkLCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0yIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtbWlkOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNlxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtaGlnaCwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtaGlnaDpiZWZvcmUsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwN1xcXCI7XFxufVxcblxcbi52anMtaWNvbi1mdWxsc2NyZWVuLWVudGVyLCAudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWZ1bGxzY3JlZW4tZW50ZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDhcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tZnVsbHNjcmVlbi1leGl0LCAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4gLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWZ1bGxzY3JlZW4tZXhpdDpiZWZvcmUsIC52aWRlby1qcy52anMtZnVsbHNjcmVlbiAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwOVxcXCI7XFxufVxcblxcbi52anMtaWNvbi1zcXVhcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc3F1YXJlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEFcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc3Bpbm5lciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1zcGlubmVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc3VidGl0bGVzLCAudmlkZW8tanMgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1HQikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1JRSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1BVSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1OWikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciwgLnZpZGVvLWpzIC52anMtc3VidGl0bGVzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc3VidGl0bGVzOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLFxcbi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLUdCKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSxcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1JRSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsXFxuLnZpZGVvLWpzLnZpZGVvLWpzOmxhbmcoZW4tQVUpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLFxcbi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLU5aKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtc3VidGl0bGVzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwQ1xcXCI7XFxufVxcblxcbi52anMtaWNvbi1jYXB0aW9ucywgLnZpZGVvLWpzOmxhbmcoZW4pIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsXFxuLnZpZGVvLWpzOmxhbmcoZnItQ0EpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsIC52aWRlby1qcyAudmpzLWNhcHRpb25zLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2FwdGlvbnM6YmVmb3JlLCAudmlkZW8tanM6bGFuZyhlbikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsXFxuLnZpZGVvLWpzOmxhbmcoZnItQ0EpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1jYXB0aW9ucy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMERcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2hhcHRlcnMsIC52aWRlby1qcyAudmpzLWNoYXB0ZXJzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2hhcHRlcnM6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1jaGFwdGVycy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEVcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc2hhcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc2hhcmU6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwRlxcXCI7XFxufVxcblxcbi52anMtaWNvbi1jb2cge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY29nOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTBcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2lyY2xlLCAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciwgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsLCAudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWNpcmNsZTpiZWZvcmUsIC52anMtc2Vlay10by1saXZlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzczpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTExXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWNpcmNsZS1vdXRsaW5lIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWNpcmNsZS1vdXRsaW5lOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2lyY2xlLWlubmVyLWNpcmNsZSB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1jaXJjbGUtaW5uZXItY2lyY2xlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTNcXFwiO1xcbn1cXG5cXG4udmpzLWljb24taGQge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24taGQ6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExNFxcXCI7XFxufVxcblxcbi52anMtaWNvbi1jYW5jZWwsIC52aWRlby1qcyAudmpzLWNvbnRyb2wudmpzLWNsb3NlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2FuY2VsOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTE1XFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXJlcGxheSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1lbmRlZCAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcmVwbGF5OmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1lbmRlZCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExNlxcXCI7XFxufVxcblxcbi52anMtaWNvbi1mYWNlYm9vayB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1mYWNlYm9vazpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTE3XFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWdwbHVzIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWdwbHVzOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMThcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tbGlua2VkaW4ge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tbGlua2VkaW46YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExOVxcXCI7XFxufVxcblxcbi52anMtaWNvbi10d2l0dGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXR3aXR0ZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExQVxcXCI7XFxufVxcblxcbi52anMtaWNvbi10dW1ibHIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tdHVtYmxyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMUJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tcGludGVyZXN0IHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBpbnRlcmVzdDpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTFDXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWF1ZGlvLWRlc2NyaXB0aW9uLCAudmlkZW8tanMgLnZqcy1kZXNjcmlwdGlvbnMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1hdWRpby1kZXNjcmlwdGlvbjpiZWZvcmUsIC52aWRlby1qcyAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMURcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tYXVkaW8sIC52aWRlby1qcyAudmpzLWF1ZGlvLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tYXVkaW86YmVmb3JlLCAudmlkZW8tanMgLnZqcy1hdWRpby1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMUVcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tbmV4dC1pdGVtIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLW5leHQtaXRlbTpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTFGXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXByZXZpb3VzLWl0ZW0ge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcHJldmlvdXMtaXRlbTpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTIwXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1lbnRlciwgLnZpZGVvLWpzIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1lbnRlcjpiZWZvcmUsIC52aWRlby1qcyAudmpzLXBpY3R1cmUtaW4tcGljdHVyZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTIxXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1leGl0LCAudmlkZW8tanMudmpzLXBpY3R1cmUtaW4tcGljdHVyZSAudmpzLXBpY3R1cmUtaW4tcGljdHVyZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1waWN0dXJlLWluLXBpY3R1cmUtZXhpdDpiZWZvcmUsIC52aWRlby1qcy52anMtcGljdHVyZS1pbi1waWN0dXJlIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMjJcXFwiO1xcbn1cXG5cXG4udmlkZW8tanMge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBhZGRpbmc6IDA7XFxuICBmb250LXNpemU6IDEwcHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIHdvcmQtYnJlYWs6IGluaXRpYWw7XFxufVxcbi52aWRlby1qczotbW96LWZ1bGwtc2NyZWVuIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLnZpZGVvLWpzOi13ZWJraXQtZnVsbC1zY3JlZW4ge1xcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4udmlkZW8tanNbdGFiaW5kZXg9XFxcIi0xXFxcIl0ge1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuLnZpZGVvLWpzICosXFxuLnZpZGVvLWpzICo6YmVmb3JlLFxcbi52aWRlby1qcyAqOmFmdGVyIHtcXG4gIGJveC1zaXppbmc6IGluaGVyaXQ7XFxufVxcblxcbi52aWRlby1qcyB1bCB7XFxuICBmb250LWZhbWlseTogaW5oZXJpdDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xcbiAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTtcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi52aWRlby1qcy52anMtZmx1aWQsXFxuLnZpZGVvLWpzLnZqcy0xNi05LFxcbi52aWRlby1qcy52anMtNC0zIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAwO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLTE2LTkge1xcbiAgcGFkZGluZy10b3A6IDU2LjI1JTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy00LTMge1xcbiAgcGFkZGluZy10b3A6IDc1JTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy1maWxsIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy10ZWNoIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuYm9keS52anMtZnVsbC13aW5kb3cge1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbjogMDtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZqcy1mdWxsLXdpbmRvdyAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4ge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHotaW5kZXg6IDEwMDA7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxufVxcblxcbi52aWRlby1qcy52anMtZnVsbHNjcmVlbiB7XFxuICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XFxuICBwYWRkaW5nLXRvcDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4udmlkZW8tanMudmpzLWZ1bGxzY3JlZW4udmpzLXVzZXItaW5hY3RpdmUge1xcbiAgY3Vyc29yOiBub25lO1xcbn1cXG5cXG4udmpzLWhpZGRlbiB7XFxuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi52anMtZGlzYWJsZWQge1xcbiAgb3BhY2l0eTogMC41O1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1vZmZzY3JlZW4ge1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBsZWZ0OiAtOTk5OXB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDFweDtcXG59XFxuXFxuLnZqcy1sb2NrLXNob3dpbmcge1xcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcXG4gIG9wYWNpdHk6IDE7XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbn1cXG5cXG4udmpzLW5vLWpzIHtcXG4gIHBhZGRpbmc6IDIwcHg7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHdpZHRoOiAzMDBweDtcXG4gIGhlaWdodDogMTUwcHg7XFxuICBtYXJnaW46IDBweCBhdXRvO1xcbn1cXG5cXG4udmpzLW5vLWpzIGEsXFxuLnZqcy1uby1qcyBhOnZpc2l0ZWQge1xcbiAgY29sb3I6ICM2NkE4Q0M7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7XFxuICBmb250LXNpemU6IDNlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXG4gIGhlaWdodDogMS42MzMzMmVtO1xcbiAgd2lkdGg6IDNlbTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxMHB4O1xcbiAgbGVmdDogMTBweDtcXG4gIHBhZGRpbmc6IDA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBvcGFjaXR5OiAxO1xcbiAgYm9yZGVyOiAwLjA2NjY2ZW0gc29saWQgI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQzLCA1MSwgNjMsIDAuNyk7XFxuICBib3JkZXItcmFkaXVzOiAwLjNlbTtcXG4gIHRyYW5zaXRpb246IGFsbCAwLjRzO1xcbn1cXG4udmpzLWJpZy1wbGF5LWNlbnRlcmVkIC52anMtYmlnLXBsYXktYnV0dG9uIHtcXG4gIHRvcDogNTAlO1xcbiAgbGVmdDogNTAlO1xcbiAgbWFyZ2luLXRvcDogLTAuODE2NjZlbTtcXG4gIG1hcmdpbi1sZWZ0OiAtMS41ZW07XFxufVxcblxcbi52aWRlby1qczpob3ZlciAudmpzLWJpZy1wbGF5LWJ1dHRvbixcXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b246Zm9jdXMge1xcbiAgYm9yZGVyLWNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzczODU5ZjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC41KTtcXG4gIHRyYW5zaXRpb246IGFsbCAwcztcXG59XFxuXFxuLnZqcy1jb250cm9scy1kaXNhYmxlZCAudmpzLWJpZy1wbGF5LWJ1dHRvbixcXG4udmpzLWhhcy1zdGFydGVkIC52anMtYmlnLXBsYXktYnV0dG9uLFxcbi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtYmlnLXBsYXktYnV0dG9uLFxcbi52anMtZXJyb3IgLnZqcy1iaWctcGxheS1idXR0b24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtcGF1c2VkLnZqcy1zaG93LWJpZy1wbGF5LWJ1dHRvbi1vbi1wYXVzZSAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnZpZGVvLWpzIGJ1dHRvbiB7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgdHJhbnNpdGlvbjogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcXG4gIGFwcGVhcmFuY2U6IG5vbmU7XFxufVxcblxcbi52anMtY29udHJvbCAudmpzLWJ1dHRvbiB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGhlaWdodDogM2VtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDA7XFxuICB0b3A6IDAuNWVtO1xcbiAgei1pbmRleDogMjtcXG59XFxuLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMCwgMCwgMCwgMC44KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSk7XFxuICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nID4gKiB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4udmpzLW1vZGFsLWRpYWxvZyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50IHtcXG4gIGZvbnQtc2l6ZTogMS4yZW07XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgcGFkZGluZzogMjBweCAyNHB4O1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbiB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi52anMtbWVudS1idXR0b24udmpzLWRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLnZqcy13b3JraW5naG92ZXIgLnZqcy1tZW51LWJ1dHRvbi52anMtZGlzYWJsZWQ6aG92ZXIgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQgPiAqIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi52anMtc2NydWJiaW5nIC52anMtY29udHJvbC52anMtbWVudS1idXR0b246aG92ZXIgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbWVudSBsaSB7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMC4yZW0gMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjRlbTtcXG4gIGZvbnQtc2l6ZTogMS4yZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xcbn1cXG5cXG4udmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpmb2N1cyxcXG4udmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpob3ZlcixcXG4uanMtZm9jdXMtdmlzaWJsZSAudmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMTUsIDEzMywgMTU5LCAwLjUpO1xcbn1cXG5cXG4udmpzLW1lbnUgbGkudmpzLXNlbGVjdGVkLFxcbi52anMtbWVudSBsaS52anMtc2VsZWN0ZWQ6Zm9jdXMsXFxuLnZqcy1tZW51IGxpLnZqcy1zZWxlY3RlZDpob3ZlcixcXG4uanMtZm9jdXMtdmlzaWJsZSAudmpzLW1lbnUgbGkudmpzLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBjb2xvcjogIzJCMzMzRjtcXG59XFxuXFxuLnZqcy1tZW51IGxpLnZqcy1tZW51LXRpdGxlIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyZW07XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwIDAgMC4zZW0gMDtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAwO1xcbiAgd2lkdGg6IDEwZW07XFxuICBsZWZ0OiAtM2VtO1xcbiAgaGVpZ2h0OiAwZW07XFxuICBtYXJnaW4tYm90dG9tOiAxLjVlbTtcXG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm90dG9tOiAxLjVlbTtcXG4gIG1heC1oZWlnaHQ6IDE1ZW07XFxufVxcblxcbi52anMtbGF5b3V0LXRpbnkgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQsXFxuLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBtYXgtaGVpZ2h0OiA1ZW07XFxufVxcblxcbi52anMtbGF5b3V0LXNtYWxsIC52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHtcXG4gIG1heC1oZWlnaHQ6IDEwZW07XFxufVxcblxcbi52anMtbGF5b3V0LW1lZGl1bSAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBtYXgtaGVpZ2h0OiAxNGVtO1xcbn1cXG5cXG4udmpzLWxheW91dC1sYXJnZSAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCxcXG4udmpzLWxheW91dC14LWxhcmdlIC52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50LFxcbi52anMtbGF5b3V0LWh1Z2UgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgbWF4LWhlaWdodDogMjVlbTtcXG59XFxuXFxuLnZqcy13b3JraW5naG92ZXIgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cC52anMtaG92ZXIgLnZqcy1tZW51LFxcbi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51LnZqcy1sb2NrLXNob3dpbmcge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZSB7XFxuICB0cmFuc2l0aW9uOiBhbGwgMC40cztcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpiZWZvcmUge1xcbiAgd2lkdGg6IDIuMjIyMjIyMjIyZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpob3ZlcixcXG4udmlkZW8tanMgLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6Zm9jdXMsXFxuLnZpZGVvLWpzIC52anMtbWVudS1idXR0b24taW5saW5lLnZqcy1zbGlkZXItYWN0aXZlLFxcbi52aWRlby1qcy52anMtbm8tZmxleCAudmpzLW1lbnUtYnV0dG9uLWlubGluZSB7XFxuICB3aWR0aDogMTJlbTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHtcXG4gIG9wYWNpdHk6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogYXV0bztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDRlbTtcXG4gIHRvcDogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICB0cmFuc2l0aW9uOiBhbGwgMC40cztcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6aG92ZXIgLnZqcy1tZW51LFxcbi52anMtbWVudS1idXR0b24taW5saW5lOmZvY3VzIC52anMtbWVudSxcXG4udmpzLW1lbnUtYnV0dG9uLWlubGluZS52anMtc2xpZGVyLWFjdGl2ZSAudmpzLW1lbnUge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgb3BhY2l0eTogMTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiBhdXRvO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6aG92ZXIgLnZqcy1tZW51LFxcbi52anMtbm8tZmxleCAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpmb2N1cyAudmpzLW1lbnUsXFxuLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lLnZqcy1zbGlkZXItYWN0aXZlIC52anMtbWVudSB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgd2lkdGg6IGF1dG87XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBtYXJnaW46IDA7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1jb250cm9sLWJhciB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBoZWlnaHQ6IDNlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQzLCA1MSwgNjMsIDAuNyk7XFxufVxcblxcbi52anMtaGFzLXN0YXJ0ZWQgLnZqcy1jb250cm9sLWJhciB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMXMsIG9wYWNpdHkgMC4xcztcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtdXNlci1pbmFjdGl2ZS52anMtcGxheWluZyAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcztcXG59XFxuXFxuLnZqcy1jb250cm9scy1kaXNhYmxlZCAudmpzLWNvbnRyb2wtYmFyLFxcbi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtY29udHJvbC1iYXIsXFxuLnZqcy1lcnJvciAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnZqcy1hdWRpby52anMtaGFzLXN0YXJ0ZWQudmpzLXVzZXItaW5hY3RpdmUudmpzLXBsYXlpbmcgLnZqcy1jb250cm9sLWJhciB7XFxuICBvcGFjaXR5OiAxO1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtbm8tZmxleCAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIGRpc3BsYXk6IHRhYmxlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1jb250cm9sIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogNGVtO1xcbiAgZmxleDogbm9uZTtcXG59XFxuXFxuLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGZvbnQtc2l6ZTogMS44ZW07XFxuICBsaW5lLWhlaWdodDogMS42NztcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpmb2N1czpiZWZvcmUsXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpob3ZlcjpiZWZvcmUsXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpmb2N1cyB7XFxuICB0ZXh0LXNoYWRvdzogMGVtIDBlbSAxZW0gd2hpdGU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWNvbnRyb2wtdGV4dCB7XFxuICBib3JkZXI6IDA7XFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgcGFkZGluZzogMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxcHg7XFxufVxcblxcbi52anMtbm8tZmxleCAudmpzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGZsZXg6IGF1dG87XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIG1pbi13aWR0aDogNGVtO1xcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sLmRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLnZqcy1saXZlIC52anMtcHJvZ3Jlc3MtY29udHJvbCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmpzLWxpdmV1aSAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi52anMtbm8tZmxleCAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgd2lkdGg6IGF1dG87XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWhvbGRlciB7XFxuICBmbGV4OiBhdXRvO1xcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHtcXG4gIG1hcmdpbjogMCAxMHB4O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHtcXG4gIGZvbnQtc2l6ZTogMS42NjY2NjY2NjY3ZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy1wcm9ncmVzcy1ob2xkZXIuZGlzYWJsZWQge1xcbiAgZm9udC1zaXplOiAxZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWhvbGRlciAudmpzLXBsYXktcHJvZ3Jlc3MsXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIC52anMtbG9hZC1wcm9ncmVzcyxcXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1ob2xkZXIgLnZqcy1sb2FkLXByb2dyZXNzIGRpdiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICB3aWR0aDogMDtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzcyB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbn1cXG4udmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzOmJlZm9yZSB7XFxuICBmb250LXNpemU6IDAuOWVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IC0wLjVlbTtcXG4gIHRvcDogLTAuMzMzMzMzMzMzM2VtO1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtbG9hZC1wcm9ncmVzcyB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDExNSwgMTMzLCAxNTksIDAuNSk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWxvYWQtcHJvZ3Jlc3MgZGl2IHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC43NSk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zZW07XFxuICBjb2xvcjogIzAwMDtcXG4gIGZsb2F0OiByaWdodDtcXG4gIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxZW07XFxuICBwYWRkaW5nOiA2cHggOHB4IDhweCA4cHg7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogLTMuNGVtO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyOmZvY3VzIC52anMtdGltZS10b29sdGlwIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy10aW1lLXRvb2x0aXAsXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbDpob3ZlciAudmpzLXByb2dyZXNzLWhvbGRlcjpmb2N1cyAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGZvbnQtc2l6ZTogMC42ZW07XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sLmRpc2FibGVkOmhvdmVyIC52anMtdGltZS10b29sdGlwIHtcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtbW91c2UtZGlzcGxheSB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDFweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICB6LWluZGV4OiAxO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtbW91c2UtZGlzcGxheSB7XFxuICB6LWluZGV4OiAwO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtbW91c2UtZGlzcGxheSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLW1vdXNlLWRpc3BsYXkge1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7XFxufVxcblxcbi52aWRlby1qcy52anMtdXNlci1pbmFjdGl2ZS52anMtbm8tZmxleCAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbW91c2UtZGlzcGxheSAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXNsaWRlciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwIDAuNDVlbSAwIDAuNDVlbTtcXG4gIC8qIGlPUyBTYWZhcmkgKi9cXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcXG4gIC8qIFNhZmFyaSAqL1xcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC8qIEtvbnF1ZXJvciBIVE1MICovXFxuICAvKiBGaXJlZm94ICovXFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLyogSW50ZXJuZXQgRXhwbG9yZXIvRWRnZSAqL1xcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqL1xcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMTUsIDEzMywgMTU5LCAwLjUpO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zbGlkZXIuZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zbGlkZXI6Zm9jdXMge1xcbiAgdGV4dC1zaGFkb3c6IDBlbSAwZW0gMWVtIHdoaXRlO1xcbiAgYm94LXNoYWRvdzogMCAwIDFlbSAjZmZmO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgZmxleDogbm9uZTtcXG59XFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgbWFyZ2luLXJpZ2h0OiAxZW07XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wge1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDA7XFxuICB3aWR0aDogMXB4O1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIHtcXG4gIHRyYW5zaXRpb246IHdpZHRoIDFzO1xcbn1cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmFjdGl2ZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy1ob3ZlciAudmpzLW11dGUtY29udHJvbCB+IC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy1zbGlkZXItYWN0aXZlIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAxO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXMsIGhlaWdodCAwLjFzLCB3aWR0aCAwLjFzLCBsZWZ0IDBzLCB0b3AgMHM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtaG92ZXIgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpmb2N1cyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtaG9yaXpvbnRhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6YWN0aXZlLnZqcy12b2x1bWUtaG9yaXpvbnRhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy1ob3ZlciAudmpzLW11dGUtY29udHJvbCB+IC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS1ob3Jpem9udGFsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG4gIGhlaWdodDogM2VtO1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbn1cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmFjdGl2ZSAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpmb2N1cyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmFjdGl2ZS52anMtdm9sdW1lLXZlcnRpY2FsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtbXV0ZS1jb250cm9sIH4gLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLXZlcnRpY2FsIHtcXG4gIGxlZnQ6IC0zLjVlbTtcXG4gIHRyYW5zaXRpb246IGxlZnQgMHM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLWhvdmVyLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsOmFjdGl2ZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbC52anMtc2xpZGVyLWFjdGl2ZSB7XFxuICB3aWR0aDogMTBlbTtcXG4gIHRyYW5zaXRpb246IHdpZHRoIDAuMXM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLW11dGUtdG9nZ2xlLW9ubHkge1xcbiAgd2lkdGg6IDRlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCB7XFxuICBoZWlnaHQ6IDhlbTtcXG4gIHdpZHRoOiAzZW07XFxuICBsZWZ0OiAtMzAwMGVtO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcyAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG4gIGhlaWdodDogM2VtO1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0cmFuc2l0aW9uOiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLFxcbi52aWRlby1qcy52anMtbm8tZmxleCAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAzZW07XFxuICBsZWZ0OiAwLjVlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1iYXIge1xcbiAgbWFyZ2luOiAxLjM1ZW0gMC40NWVtO1xcbn1cXG5cXG4udmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci1ob3Jpem9udGFsIHtcXG4gIHdpZHRoOiA1ZW07XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG5cXG4udmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci12ZXJ0aWNhbCB7XFxuICB3aWR0aDogMC4zZW07XFxuICBoZWlnaHQ6IDVlbTtcXG4gIG1hcmdpbjogMS4zNWVtIGF1dG87XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG59XFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LXNpemU6IDAuOWVtO1xcbn1cXG5cXG4udmpzLXNsaWRlci12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICB3aWR0aDogMC4zZW07XFxufVxcbi52anMtc2xpZGVyLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICB0b3A6IC0wLjVlbTtcXG4gIGxlZnQ6IC0wLjNlbTtcXG59XFxuXFxuLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG4udmpzLXNsaWRlci1ob3Jpem9udGFsIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICB0b3A6IC0wLjNlbTtcXG4gIHJpZ2h0OiAtMC41ZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLXZlcnRpY2FsIHtcXG4gIHdpZHRoOiA0ZW07XFxufVxcblxcbi52anMtdm9sdW1lLWJhci52anMtc2xpZGVyLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsIHtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXZlcnRpY2FsIHtcXG4gIHdpZHRoOiAzZW07XFxuICBoZWlnaHQ6IDhlbTtcXG4gIGJvdHRvbTogOGVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWhvcml6b250YWwgLnZqcy1tZW51IHtcXG4gIGxlZnQ6IC0yZW07XFxufVxcblxcbi52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTtcXG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG4udmpzLWhhcy1zdGFydGVkIC52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtYXVkaW8udmpzLWhhcy1zdGFydGVkIC52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scyAudmpzLXBvc3RlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1saXZlLWNvbnRyb2wge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbiAgZmxleDogYXV0bztcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbiAgbGluZS1oZWlnaHQ6IDNlbTtcXG59XFxuXFxuLnZqcy1uby1mbGV4IC52anMtbGl2ZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxuICB3aWR0aDogYXV0bztcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblxcbi52aWRlby1qczpub3QoLnZqcy1saXZlKSAudmpzLWxpdmUtY29udHJvbCxcXG4udmlkZW8tanMudmpzLWxpdmV1aSAudmpzLWxpdmUtY29udHJvbCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbCB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBmbGV4OiBub25lO1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwYWRkaW5nLWxlZnQ6IDAuNWVtO1xcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGxpbmUtaGVpZ2h0OiAzZW07XFxuICB3aWR0aDogYXV0bztcXG4gIG1pbi13aWR0aDogNGVtO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbCB7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgd2lkdGg6IGF1dG87XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG5cXG4udmlkZW8tanMudmpzLWxpdmU6bm90KC52anMtbGl2ZXVpKSAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sLFxcbi52aWRlby1qczpub3QoLnZqcy1saXZlKSAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtc2Vlay10by1saXZlLWNvbnRyb2wudmpzLWNvbnRyb2wudmpzLWF0LWxpdmUtZWRnZSB7XFxuICBjdXJzb3I6IGF1dG87XFxufVxcblxcbi52anMtc2Vlay10by1saXZlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIG1hcmdpbi1yaWdodDogMC41ZW07XFxuICBjb2xvcjogIzg4ODtcXG59XFxuXFxuLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbC52anMtY29udHJvbC52anMtYXQtbGl2ZS1lZGdlIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBjb2xvcjogcmVkO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy10aW1lLWNvbnRyb2wge1xcbiAgZmxleDogbm9uZTtcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbiAgbGluZS1oZWlnaHQ6IDNlbTtcXG4gIG1pbi13aWR0aDogMmVtO1xcbiAgd2lkdGg6IGF1dG87XFxuICBwYWRkaW5nLWxlZnQ6IDFlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDFlbTtcXG59XFxuXFxuLnZqcy1saXZlIC52anMtdGltZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWN1cnJlbnQtdGltZSxcXG4udmpzLW5vLWZsZXggLnZqcy1jdXJyZW50LXRpbWUge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtZHVyYXRpb24sXFxuLnZqcy1uby1mbGV4IC52anMtZHVyYXRpb24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy10aW1lLWRpdmlkZXIge1xcbiAgZGlzcGxheTogbm9uZTtcXG4gIGxpbmUtaGVpZ2h0OiAzZW07XFxufVxcblxcbi52anMtbGl2ZSAudmpzLXRpbWUtZGl2aWRlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZsZXg6IG5vbmU7XFxufVxcblxcbi52anMtdGV4dC10cmFjay1kaXNwbGF5IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogM2VtO1xcbiAgbGVmdDogMDtcXG4gIHJpZ2h0OiAwO1xcbiAgdG9wOiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcy52anMtdXNlci1pbmFjdGl2ZS52anMtcGxheWluZyAudmpzLXRleHQtdHJhY2stZGlzcGxheSB7XFxuICBib3R0b206IDFlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdGV4dC10cmFjayB7XFxuICBmb250LXNpemU6IDEuNGVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luLWJvdHRvbTogMC4xZW07XFxufVxcblxcbi52anMtc3VidGl0bGVzIHtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG5cXG4udmpzLWNhcHRpb25zIHtcXG4gIGNvbG9yOiAjZmM2O1xcbn1cXG5cXG4udmpzLXR0LWN1ZSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxudmlkZW86Oi13ZWJraXQtbWVkaWEtdGV4dC10cmFjay1kaXNwbGF5IHtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM2VtKTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlLnZqcy1wbGF5aW5nIHZpZGVvOjotd2Via2l0LW1lZGlhLXRleHQtdHJhY2stZGlzcGxheSB7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNWVtKTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgZmxleDogbm9uZTtcXG59XFxuLnZpZGVvLWpzIC52anMtZnVsbHNjcmVlbi1jb250cm9sIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGZsZXg6IG5vbmU7XFxufVxcbi52anMtcGxheWJhY2stcmF0ZSA+IC52anMtbWVudS1idXR0b24sXFxuLnZqcy1wbGF5YmFjay1yYXRlIC52anMtcGxheWJhY2stcmF0ZS12YWx1ZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcbi52anMtcGxheWJhY2stcmF0ZSAudmpzLXBsYXliYWNrLXJhdGUtdmFsdWUge1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBmb250LXNpemU6IDEuNWVtO1xcbiAgbGluZS1oZWlnaHQ6IDI7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi52anMtcGxheWJhY2stcmF0ZSAudmpzLW1lbnUge1xcbiAgd2lkdGg6IDRlbTtcXG4gIGxlZnQ6IDBlbTtcXG59XFxuXFxuLnZqcy1lcnJvciAudmpzLWVycm9yLWRpc3BsYXkgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCB7XFxuICBmb250LXNpemU6IDEuNGVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4udmpzLWVycm9yIC52anMtZXJyb3ItZGlzcGxheTpiZWZvcmUge1xcbiAgY29sb3I6ICNmZmY7XFxuICBjb250ZW50OiBcXFwiWFxcXCI7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogNGVtO1xcbiAgbGVmdDogMDtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbiAgbWFyZ2luLXRvcDogLTAuNWVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdGV4dC1zaGFkb3c6IDAuMDVlbSAwLjA1ZW0gMC4xZW0gIzAwMDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRvcDogNTAlO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udmpzLWxvYWRpbmctc3Bpbm5lciB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICBtYXJnaW46IC0yNXB4IDAgMCAtMjVweDtcXG4gIG9wYWNpdHk6IDAuODU7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgYm9yZGVyOiA2cHggc29saWQgcmdiYSg0MywgNTEsIDYzLCAwLjcpO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICB3aWR0aDogNTBweDtcXG4gIGhlaWdodDogNTBweDtcXG4gIGJvcmRlci1yYWRpdXM6IDI1cHg7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxufVxcblxcbi52anMtc2Vla2luZyAudmpzLWxvYWRpbmctc3Bpbm5lcixcXG4udmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXIge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogdmpzLXNwaW5uZXItc2hvdyAwcyBsaW5lYXIgMC4zcyBmb3J3YXJkcztcXG4gICAgICAgICAgYW5pbWF0aW9uOiB2anMtc3Bpbm5lci1zaG93IDBzIGxpbmVhciAwLjNzIGZvcndhcmRzO1xcbn1cXG5cXG4udmpzLWxvYWRpbmctc3Bpbm5lcjpiZWZvcmUsXFxuLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBtYXJnaW46IC02cHg7XFxuICBib3gtc2l6aW5nOiBpbmhlcml0O1xcbiAgd2lkdGg6IGluaGVyaXQ7XFxuICBoZWlnaHQ6IGluaGVyaXQ7XFxuICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbiAgb3BhY2l0eTogMTtcXG4gIGJvcmRlcjogaW5oZXJpdDtcXG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnZqcy1zZWVraW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSxcXG4udmpzLXNlZWtpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIsXFxuLnZqcy13YWl0aW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSxcXG4udmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IHZqcy1zcGlubmVyLXNwaW4gMS4xcyBjdWJpYy1iZXppZXIoMC42LCAwLjIsIDAsIDAuOCkgaW5maW5pdGUsIHZqcy1zcGlubmVyLWZhZGUgMS4xcyBsaW5lYXIgaW5maW5pdGU7XFxuICBhbmltYXRpb246IHZqcy1zcGlubmVyLXNwaW4gMS4xcyBjdWJpYy1iZXppZXIoMC42LCAwLjIsIDAsIDAuOCkgaW5maW5pdGUsIHZqcy1zcGlubmVyLWZhZGUgMS4xcyBsaW5lYXIgaW5maW5pdGU7XFxufVxcblxcbi52anMtc2Vla2luZyAudmpzLWxvYWRpbmctc3Bpbm5lcjpiZWZvcmUsXFxuLnZqcy13YWl0aW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSB7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnZqcy1zZWVraW5nIC52anMtbG9hZGluZy1zcGlubmVyOmFmdGVyLFxcbi52anMtd2FpdGluZyAudmpzLWxvYWRpbmctc3Bpbm5lcjphZnRlciB7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjQ0cztcXG4gIGFuaW1hdGlvbi1kZWxheTogMC40NHM7XFxufVxcblxcbkBrZXlmcmFtZXMgdmpzLXNwaW5uZXItc2hvdyB7XFxuICB0byB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICB9XFxufVxcbkAtd2Via2l0LWtleWZyYW1lcyB2anMtc3Bpbm5lci1zaG93IHtcXG4gIHRvIHtcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyB2anMtc3Bpbm5lci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgdmpzLXNwaW5uZXItc3BpbiB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5Aa2V5ZnJhbWVzIHZqcy1zcGlubmVyLWZhZGUge1xcbiAgMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMjAlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjtcXG4gIH1cXG4gIDM1JSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6IHdoaXRlO1xcbiAgfVxcbiAgNjAlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjtcXG4gIH1cXG4gIDEwMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgdmpzLXNwaW5uZXItZmFkZSB7XFxuICAwJSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7XFxuICB9XFxuICAyMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMzUlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogd2hpdGU7XFxuICB9XFxuICA2MCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMTAwJSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7XFxuICB9XFxufVxcbi52anMtY2hhcHRlcnMtYnV0dG9uIC52anMtbWVudSB1bCB7XFxuICB3aWR0aDogMjRlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiArIC52anMtbWVudSAudmpzLWNhcHRpb25zLW1lbnUtaXRlbSAudmpzLW1lbnUtaXRlbS10ZXh0IC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luLWJvdHRvbTogLTAuMWVtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zdWJzLWNhcHMtYnV0dG9uICsgLnZqcy1tZW51IC52anMtY2FwdGlvbnMtbWVudS1pdGVtIC52anMtbWVudS1pdGVtLXRleHQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwRFxcXCI7XFxuICBmb250LXNpemU6IDEuNWVtO1xcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWF1ZGlvLWJ1dHRvbiArIC52anMtbWVudSAudmpzLW1haW4tZGVzYy1tZW51LWl0ZW0gLnZqcy1tZW51LWl0ZW0tdGV4dCAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbi1ib3R0b206IC0wLjFlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtYXVkaW8tYnV0dG9uICsgLnZqcy1tZW51IC52anMtbWFpbi1kZXNjLW1lbnUtaXRlbSAudmpzLW1lbnUtaXRlbS10ZXh0IC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBjb250ZW50OiBcXFwiIFxcXFxGMTFEXFxcIjtcXG4gIGZvbnQtc2l6ZTogMS41ZW07XFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG59XFxuXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1jdXJyZW50LXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy10aW1lLWRpdmlkZXIsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1kdXJhdGlvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLXJlbWFpbmluZy10aW1lLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtcGxheWJhY2stcmF0ZSxcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLWNoYXB0ZXJzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1jYXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtYXVkaW8tYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1jdXJyZW50LXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXRpbWUtZGl2aWRlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtZHVyYXRpb24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXJlbWFpbmluZy10aW1lLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1wbGF5YmFjay1yYXRlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1jaGFwdGVycy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLWNhcHRpb25zLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtc3VidGl0bGVzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtYXVkaW8tYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy12b2x1bWUtY29udHJvbCwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWN1cnJlbnQtdGltZSxcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdGltZS1kaXZpZGVyLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1kdXJhdGlvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtcmVtYWluaW5nLXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXBsYXliYWNrLXJhdGUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWNoYXB0ZXJzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtY2FwdGlvbnMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1hdWRpby1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXZvbHVtZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDpob3ZlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6YWN0aXZlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbC52anMtc2xpZGVyLWFjdGl2ZSwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6aG92ZXIsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6YWN0aXZlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsLnZqcy1zbGlkZXItYWN0aXZlLCAudmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDpob3ZlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDphY3RpdmUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLXNsaWRlci1hY3RpdmUge1xcbiAgd2lkdGg6IGF1dG87XFxuICB3aWR0aDogaW5pdGlhbDtcXG59XFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1saXZldWkpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1saXZlKSAudmpzLXN1YnMtY2Fwcy1idXR0b24sIC52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwudmpzLWxpdmV1aSAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICBmbGV4OiBhdXRvO1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwudmpzLWxpdmV1aS52anMtbm8tZmxleCAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueS52anMtbm8tZmxleCAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbC52anMtbGl2ZXVpIC52anMtcHJvZ3Jlc3MtY29udHJvbCwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy1tb2RhbC1kaWFsb2cudmpzLXRleHQtdHJhY2stc2V0dGluZ3Mge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43NSk7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGhlaWdodDogNzAlO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCB7XFxuICBkaXNwbGF5OiB0YWJsZTtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29sb3JzLFxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWZvbnQsXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMge1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGRpc3BsYXk6IGdyaWQpIHtcXG4gIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50IHtcXG4gICAgZGlzcGxheTogZ3JpZDtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjtcXG4gICAgcGFkZGluZzogMjBweCAyNHB4IDBweCAyNHB4O1xcbiAgfVxcblxcbiAgLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyAudmpzLWRlZmF1bHQtYnV0dG9uIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gIH1cXG5cXG4gIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIHtcXG4gICAgZ3JpZC1jb2x1bW46IDEvLTE7XFxuICB9XFxuXFxuICAudmpzLWxheW91dC1zbWFsbCAudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCxcXG4udmpzLWxheW91dC14LXNtYWxsIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50LFxcbi52anMtbGF5b3V0LXRpbnkgLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQge1xcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXG4gIH1cXG59XFxuLnZqcy10cmFjay1zZXR0aW5nID4gc2VsZWN0IHtcXG4gIG1hcmdpbi1yaWdodDogMWVtO1xcbiAgbWFyZ2luLWJvdHRvbTogMC41ZW07XFxufVxcblxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyBmaWVsZHNldCB7XFxuICBtYXJnaW46IDVweDtcXG4gIHBhZGRpbmc6IDNweDtcXG4gIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIGZpZWxkc2V0IHNwYW4ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgZmllbGRzZXQgc3BhbiA+IHNlbGVjdCB7XFxuICBtYXgtd2lkdGg6IDcuM2VtO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgbGVnZW5kIHtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgbWFyZ2luOiAwIDAgNXB4IDA7XFxufVxcblxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLWxhYmVsIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTtcXG4gIGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwIDAgNXB4IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICB3aWR0aDogMXB4O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b246Zm9jdXMsXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b246YWN0aXZlIHtcXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xcbiAgb3V0bGluZS13aWR0aDogbWVkaXVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDBkZWcsICNmZmYgODglLCAjNzM4NTlmIDEwMCUpO1xcbn1cXG5cXG4udmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIGJ1dHRvbjpob3ZlciB7XFxuICBjb2xvcjogcmdiYSg0MywgNTEsIDYzLCAwLjc1KTtcXG59XFxuXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgtMTgwZGVnLCAjZmZmIDg4JSwgIzczODU5ZiAxMDAlKTtcXG4gIGNvbG9yOiAjMkIzMzNGO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbn1cXG5cXG4udmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIC52anMtZGVmYXVsdC1idXR0b24ge1xcbiAgbWFyZ2luLXJpZ2h0OiAxZW07XFxufVxcblxcbkBtZWRpYSBwcmludCB7XFxuICAudmlkZW8tanMgPiAqOm5vdCgudmpzLXRlY2gpOm5vdCgudmpzLXBvc3Rlcikge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICB9XFxufVxcbi52anMtcmVzaXplLW1hbmFnZXIge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgei1pbmRleDogLTEwMDA7XFxufVxcblxcbi5qcy1mb2N1cy12aXNpYmxlIC52aWRlby1qcyAqOmZvY3VzOm5vdCguZm9jdXMtdmlzaWJsZSkge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAqOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSksXFxuLnZpZGVvLWpzIC52anMtbWVudSAqOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSkge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=scss& ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl {\\n display: flex;\\n}\\n.flc {\\n display: flex;\\n justify-content: center;\\n}\\n.flb {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla {\\n display: flex;\\n align-items: center;\\n}\\n.fcc {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb, .alert, .ipt-wrap .ipt {\\n box-sizing: border-box;\\n}\\n.fullp {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer {\\n cursor: pointer;\\n}\\n.text-l {\\n text-align: left;\\n}\\n.text-r {\\n text-align: right;\\n}\\n.text-c {\\n text-align: center;\\n}\\n.bc {\\n text-align: center;\\n}\\n.flex1 {\\n flex: 1;\\n}\\n.disabled {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange {\\n color: #f05a23;\\n}\\n.cGreen {\\n color: #006441;\\n}\\n.cGray {\\n color: #bfbfbf;\\n}\\n.cDark {\\n color: #dcdcdc;\\n}\\n.alert {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn {\\n color: #f05a23;\\n}\\n.alert .close {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh:before {\\n content: '\\\\E874';\\n}\\n.iconempty:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose:before {\\n content: '\\\\E849';\\n}\\nhtml {\\n font-family: \\\"Microsoft YaHei\\\", \\\"Arial\\\";\\n font-size: 12px;\\n word-spacing: 1px;\\n word-break: break-word;\\n text-rendering: optimizeLegibility;\\n color: #4c4948;\\n background-color: #ffffff;\\n box-sizing: border-box;\\n}\\nbody {\\n font-size: 14px;\\n}\\nhtml,\\nbody {\\n -webkit-text-size-adjust: none;\\n}\\nbody,\\ndiv {\\n border: 0;\\n margin: 0;\\n padding: 0;\\n}\\n*,\\n*:before,\\n*:after {\\n box-sizing: border-box;\\n margin: 0;\\n}\\nbody,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6,\\nhr,\\np,\\nblockquote,\\ndl,\\ndt,\\ndd,\\nul,\\nol,\\nli,\\npre,\\nform,\\nfieldset,\\nlegend,\\nbutton,\\ninput,\\ntextarea,\\nth,\\ntd,\\niframe {\\n margin: 0;\\n padding: 0;\\n}\\nimg,\\narticle,\\naside,\\ndetails,\\nfigcaption,\\nfigure,\\nfooter,\\nheader,\\nmenu,\\nnav,\\nsection,\\nsummary,\\ntime,\\nmark,\\naudio,\\nvideo {\\n display: block;\\n margin: 0;\\n padding: 0;\\n}\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: 100%;\\n}\\nfieldset,\\nimg {\\n border: 0;\\n}\\naddress,\\ncaption,\\ncite,\\ndfn,\\nem,\\nth,\\nvar,\\ni,\\nem {\\n font-style: normal;\\n font-weight: normal;\\n}\\nol,\\nul {\\n list-style: none;\\n}\\na {\\n text-decoration: none;\\n color: inherit;\\n}\\na:hover {\\n text-decoration: none;\\n}\\na,\\nlabel,\\nbutton,\\ninput,\\nselect {\\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\ninput,\\nselect,\\nbutton {\\n vertical-align: baseline;\\n border-radius: 0;\\n background-color: transparent;\\n}\\nselect {\\n outline: none;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n}\\nselect::-ms-expand {\\n display: none;\\n}\\ninput {\\n background: none;\\n outline: none;\\n border: none;\\n}\\nbutton::-moz-focus-inner,\\ninput,\\ninput[type=\\\"reset\\\"]::-moz-focus-inner,\\ninput[type=\\\"button\\\"]::-moz-focus-inner,\\ninput[type=\\\"submit\\\"]::-moz-focus-inner,\\ninput[type=\\\"file\\\"] > input[type=\\\"button\\\"]::-moz-focus-inner {\\n border: none;\\n}\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n vertical-align: middle;\\n}\\ninput[type=\\\"number\\\"]::-webkit-outer-spin-button,\\ninput[type=\\\"number\\\"]::-webkit-inner-spin-button {\\n -webkit-appearance: none !important;\\n -moz-appearance: none !important;\\n margin: 0;\\n}\\ninput:-webkit-autofill {\\n -webkit-box-shadow: 0 0 0 1000px white inset;\\n}\\ninput[type=\\\"search\\\"],\\ninput[type=\\\"tel\\\"],\\ninput[type=\\\"text\\\"],\\ninput {\\n -webkit-appearance: none;\\n /*去除系统默认的样式*/\\n -webkit-box-sizing: content-box;\\n font-size: 100%;\\n box-sizing: border-box;\\n}\\ninput::-webkit-search-decoration,\\ninput::-webkit-search-cancel-button {\\n display: none;\\n}\\n::-webkit-input-placeholder {\\n color: #bfbfbf;\\n opacity: 1;\\n}\\n:-moz-placeholder {\\n color: #bfbfbf;\\n opacity: 1;\\n}\\n::-moz-placeholder {\\n color: #bfbfbf;\\n opacity: 1;\\n}\\n:-ms-input-placeholder {\\n color: #bfbfbf;\\n opacity: 1;\\n}\\nselect,\\ninput,\\noption {\\n color: #333333;\\n}\\ntextarea {\\n outline: none;\\n border-radius: 0;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n overflow: auto;\\n resize: none;\\n color: #333333;\\n}\\n#app {\\n border: 0;\\n margin: 0;\\n padding: 0;\\n}\\n.main-container {\\n position: relative;\\n margin: 0 auto;\\n width: 100%;\\n}\\n.main-container::after {\\n display: table;\\n content: \\\"\\\";\\n clear: both;\\n}\\n.content {\\n max-width: 1200px;\\n width: 100%;\\n margin: 0 auto;\\n}\\n.box-w {\\n max-width: 1200px;\\n width: 100%;\\n margin: 0 auto;\\n}\\n.box {\\n max-width: 1200px;\\n width: 100%;\\n margin: 0 auto;\\n}\\n.m-width {\\n box-sizing: border-box;\\n padding: 0 4%;\\n}\\n.focus {\\n border: 1px solid #f05a23;\\n}\\n.video-js {\\n background-color: transparent !important;\\n border-radius: 5px;\\n}\\n.video-js .vjs-tech,\\n.video-js .vjs-poster {\\n border-radius: 5px;\\n}\\n.video-js .vjs-big-play-button {\\n top: 0 !important;\\n bottom: 0 !important;\\n left: 0 !important;\\n right: 0 !important;\\n margin: auto !important;\\n}\\n.video-js .vjs-slider {\\n background-color: #f05a23 !important;\\n}\\n.video-js .vjs-poster {\\n background-color: transparent !important;\\n}\\n.v-header .van-cell {\\n padding: 16px 16px !important;\\n}\\n.v-header .van-collapse-item__content {\\n padding: 0;\\n}\\n.v-header .van-cell:not(:last-child)::after {\\n left: 0;\\n}\\n.flex-center {\\n display: flex;\\n justify-content: center;\\n}\\n@media (max-width: 1200px) {\\n.page-index .video-js {\\n width: 100% !important;\\n max-width: 100% !important;\\n}\\n#app .header {\\n position: fixed;\\n width: 100%;\\n}\\n#app .main-container {\\n padding-top: 72px;\\n}\\n}\\n@media (max-width: 768px) {\\n.main-container {\\n margin-bottom: 20px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT9iZjcwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlc2NhcGUgPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL3VybC9lc2NhcGUuanNcIik7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICog5pSv5oyB5paH5Lu2XFxuICog6ZyA6KaB5byV55So55qE5Zyw5pa55Z2H6ZyA6KaB5Yqg5LiK6L+Z5Liq5pSv5oyB5paH5Lu2XFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3MgTWlueGluc1xcbiAqXFxuICog5Y+C6ICD5pS26ZuG77yaXFxuICogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwLXNhc3MvdHJlZS9tYXN0ZXIvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnNcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3Mg5Y+Y6YePXFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi5iaXMge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmwge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuLmZsYyB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi5mbGIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmZjYyB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmIsIC5hbGVydCwgLmlwdC13cmFwIC5pcHQge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLmZ1bGxwIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi50ZXh0LWwge1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnRleHQtciB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtYyB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5iYyB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5mbGV4MSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XFxuICBjb2xvcjogIzRjNDk0OCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4uY09yYW5nZSB7XFxuICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmNHcmVlbiB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5IHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbn1cXG4uY0Rhcmsge1xcbiAgY29sb3I6ICNkY2RjZGM7XFxufVxcbi5hbGVydCB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb24ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uYWxlcnQgLmJ0biB7XFxuICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uYWxlcnQgLmNsb3NlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHQge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQuNXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDQuNXJlbTtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBwYWRkaW5nOiAwIDJyZW07XFxuICBmbGV4OiAxO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMXJlbTtcXG59XFxuLmlwdC13cmFwIC5kb3duLWFycm93IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMi4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDFyZW07XFxuICBoZWlnaHQ6IC42NjY2NjdyZW07XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3Qge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vbi5wbmdcIikpICsgXCIpO1xcbn1cXG4uaXB0OmZvY3VzIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uaXB0LmVyciB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLmFsZXJ0IHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnQge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCcgIWltcG9ydGFudDtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuLmljb25yZWZyZXNoOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NzQnO1xcbn1cXG4uaWNvbmVtcHR5OmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NDknO1xcbn1cXG5odG1sIHtcXG4gIGZvbnQtZmFtaWx5OiBcXFwiTWljcm9zb2Z0IFlhSGVpXFxcIiwgXFxcIkFyaWFsXFxcIjtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIHdvcmQtc3BhY2luZzogMXB4O1xcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XFxuICBjb2xvcjogIzRjNDk0ODtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5ib2R5IHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuaHRtbCxcXG5ib2R5IHtcXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogbm9uZTtcXG59XFxuYm9keSxcXG5kaXYge1xcbiAgYm9yZGVyOiAwO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG59XFxuKixcXG4qOmJlZm9yZSxcXG4qOmFmdGVyIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtYXJnaW46IDA7XFxufVxcbmJvZHksXFxuaDEsXFxuaDIsXFxuaDMsXFxuaDQsXFxuaDUsXFxuaDYsXFxuaHIsXFxucCxcXG5ibG9ja3F1b3RlLFxcbmRsLFxcbmR0LFxcbmRkLFxcbnVsLFxcbm9sLFxcbmxpLFxcbnByZSxcXG5mb3JtLFxcbmZpZWxkc2V0LFxcbmxlZ2VuZCxcXG5idXR0b24sXFxuaW5wdXQsXFxudGV4dGFyZWEsXFxudGgsXFxudGQsXFxuaWZyYW1lIHtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxufVxcbmltZyxcXG5hcnRpY2xlLFxcbmFzaWRlLFxcbmRldGFpbHMsXFxuZmlnY2FwdGlvbixcXG5maWd1cmUsXFxuZm9vdGVyLFxcbmhlYWRlcixcXG5tZW51LFxcbm5hdixcXG5zZWN0aW9uLFxcbnN1bW1hcnksXFxudGltZSxcXG5tYXJrLFxcbmF1ZGlvLFxcbnZpZGVvIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG59XFxuaDEsXFxuaDIsXFxuaDMsXFxuaDQsXFxuaDUsXFxuaDYge1xcbiAgZm9udC1zaXplOiAxMDAlO1xcbn1cXG5maWVsZHNldCxcXG5pbWcge1xcbiAgYm9yZGVyOiAwO1xcbn1cXG5hZGRyZXNzLFxcbmNhcHRpb24sXFxuY2l0ZSxcXG5kZm4sXFxuZW0sXFxudGgsXFxudmFyLFxcbmksXFxuZW0ge1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxub2wsXFxudWwge1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuYSB7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG59XFxuYTpob3ZlciB7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG59XFxuYSxcXG5sYWJlbCxcXG5idXR0b24sXFxuaW5wdXQsXFxuc2VsZWN0IHtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcXG59XFxuaW5wdXQsXFxuc2VsZWN0LFxcbmJ1dHRvbiB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxuICBib3JkZXItcmFkaXVzOiAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcbnNlbGVjdCB7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5zZWxlY3Q6Oi1tcy1leHBhbmQge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuaW5wdXQge1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICBib3JkZXI6IG5vbmU7XFxufVxcbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcXG5pbnB1dCxcXG5pbnB1dFt0eXBlPVxcXCJyZXNldFxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcImJ1dHRvblxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcInN1Ym1pdFxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcImZpbGVcXFwiXSA+IGlucHV0W3R5cGU9XFxcImJ1dHRvblxcXCJdOjotbW96LWZvY3VzLWlubmVyIHtcXG4gIGJvcmRlcjogbm9uZTtcXG59XFxuaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSxcXG5pbnB1dFt0eXBlPVxcXCJyYWRpb1xcXCJdIHtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcbmlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxcbmlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XFxuICBtYXJnaW46IDA7XFxufVxcbmlucHV0Oi13ZWJraXQtYXV0b2ZpbGwge1xcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMCAxMDAwcHggd2hpdGUgaW5zZXQ7XFxufVxcbmlucHV0W3R5cGU9XFxcInNlYXJjaFxcXCJdLFxcbmlucHV0W3R5cGU9XFxcInRlbFxcXCJdLFxcbmlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXG5pbnB1dCB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAvKuWOu+mZpOezu+e7n+m7mOiupOeahOagt+W8jyovXFxuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbiAgZm9udC1zaXplOiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuaW5wdXQ6Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24sXFxuaW5wdXQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbiAgb3BhY2l0eTogMTtcXG59XFxuOi1tb3otcGxhY2Vob2xkZXIge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG46Oi1tb3otcGxhY2Vob2xkZXIge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG46LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbiAgb3BhY2l0eTogMTtcXG59XFxuc2VsZWN0LFxcbmlucHV0LFxcbm9wdGlvbiB7XFxuICBjb2xvcjogIzMzMzMzMztcXG59XFxudGV4dGFyZWEge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJvcmRlci1yYWRpdXM6IDA7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBvdmVyZmxvdzogYXV0bztcXG4gIHJlc2l6ZTogbm9uZTtcXG4gIGNvbG9yOiAjMzMzMzMzO1xcbn1cXG4jYXBwIHtcXG4gIGJvcmRlcjogMDtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxufVxcbi5tYWluLWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBtYXJnaW46IDAgYXV0bztcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4ubWFpbi1jb250YWluZXI6OmFmdGVyIHtcXG4gICAgZGlzcGxheTogdGFibGU7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuLmNvbnRlbnQge1xcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4uYm94LXcge1xcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4uYm94IHtcXG4gIG1heC13aWR0aDogMTIwMHB4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtYXJnaW46IDAgYXV0bztcXG59XFxuLm0td2lkdGgge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDAgNCU7XFxufVxcbi5mb2N1cyB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjZjA1YTIzO1xcbn1cXG4udmlkZW8tanMge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG59XFxuLnZpZGVvLWpzIC52anMtdGVjaCxcXG4udmlkZW8tanMgLnZqcy1wb3N0ZXIge1xcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcbn1cXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24ge1xcbiAgdG9wOiAwICFpbXBvcnRhbnQ7XFxuICBib3R0b206IDAgIWltcG9ydGFudDtcXG4gIGxlZnQ6IDAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OiAwICFpbXBvcnRhbnQ7XFxuICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcXG59XFxuLnZpZGVvLWpzIC52anMtc2xpZGVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnZpZGVvLWpzIC52anMtcG9zdGVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XFxufVxcbi52LWhlYWRlciAudmFuLWNlbGwge1xcbiAgcGFkZGluZzogMTZweCAxNnB4ICFpbXBvcnRhbnQ7XFxufVxcbi52LWhlYWRlciAudmFuLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xcbiAgcGFkZGluZzogMDtcXG59XFxuLnYtaGVhZGVyIC52YW4tY2VsbDpub3QoOmxhc3QtY2hpbGQpOjphZnRlciB7XFxuICBsZWZ0OiAwO1xcbn1cXG4uZmxleC1jZW50ZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XFxuLnBhZ2UtaW5kZXggLnZpZGVvLWpzIHtcXG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcbiNhcHAgLmhlYWRlciB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbiNhcHAgLm1haW4tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZy10b3A6IDcycHg7XFxufVxcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4ubWFpbi1jb250YWluZXIge1xcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbn1cXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
\********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-3b4f35af] {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl[data-v-3b4f35af] {\\n display: flex;\\n}\\n.flc[data-v-3b4f35af] {\\n display: flex;\\n justify-content: center;\\n}\\n.flb[data-v-3b4f35af] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla[data-v-3b4f35af] {\\n display: flex;\\n align-items: center;\\n}\\n.fcc[data-v-3b4f35af] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb[data-v-3b4f35af], .alert[data-v-3b4f35af], .ipt-wrap .ipt[data-v-3b4f35af] {\\n box-sizing: border-box;\\n}\\n.fullp[data-v-3b4f35af] {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer[data-v-3b4f35af] {\\n cursor: pointer;\\n}\\n.text-l[data-v-3b4f35af] {\\n text-align: left;\\n}\\n.text-r[data-v-3b4f35af] {\\n text-align: right;\\n}\\n.text-c[data-v-3b4f35af] {\\n text-align: center;\\n}\\n.bc[data-v-3b4f35af] {\\n text-align: center;\\n}\\n.flex1[data-v-3b4f35af] {\\n flex: 1;\\n}\\n.disabled[data-v-3b4f35af] {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange[data-v-3b4f35af] {\\n color: #f05a23;\\n}\\n.cGreen[data-v-3b4f35af] {\\n color: #006441;\\n}\\n.cGray[data-v-3b4f35af] {\\n color: #bfbfbf;\\n}\\n.cDark[data-v-3b4f35af] {\\n color: #dcdcdc;\\n}\\n.alert[data-v-3b4f35af] {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon[data-v-3b4f35af] {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn[data-v-3b4f35af] {\\n color: #f05a23;\\n}\\n.alert .close[data-v-3b4f35af] {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-3b4f35af] {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-3b4f35af] {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye[data-v-3b4f35af] {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-3b4f35af] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-3b4f35af]:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-3b4f35af] {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-3b4f35af] {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-3b4f35af] {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-3b4f35af] {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-3b4f35af] {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-3b4f35af]:before {\\n content: '\\\\E874';\\n}\\n.iconempty[data-v-3b4f35af]:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose[data-v-3b4f35af]:before {\\n content: '\\\\E849';\\n}\\n.drop-list[data-v-3b4f35af] {\\n display: inline-block;\\n min-width: 10rem;\\n position: relative;\\n margin: 0 1rem;\\n font-size: 16px;\\n}\\n.drop-list .list[data-v-3b4f35af] {\\n position: absolute;\\n width: 110%;\\n left: 0;\\n right: 0;\\n margin: 0 auto;\\n font-size: 14px;\\n}\\n.drop-list .list .space[data-v-3b4f35af] {\\n height: 1.5rem;\\n}\\n.drop-list span[data-v-3b4f35af] {\\n display: block;\\n text-align: center;\\n}\\n.drop-list ul[data-v-3b4f35af] {\\n display: none;\\n overflow: hidden;\\n box-shadow: 0 0 1.5rem 0 rgba(255, 87, 0, 0.15);\\n border-radius: .5rem;\\n}\\n.drop-list ul li[data-v-3b4f35af] {\\n background: #ffffff;\\n text-align: center;\\n padding: 1.5rem 0;\\n position: relative;\\n}\\n.drop-list ul li[data-v-3b4f35af]:after {\\n content: \\\"\\\";\\n width: 7rem;\\n height: 1px;\\n background: #f1f1f1;\\n position: absolute;\\n bottom: 0;\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.drop-list ul li[data-v-3b4f35af]:last-child {\\n border-bottom: none;\\n}\\n.drop-list ul li[data-v-3b4f35af]:last-child:after {\\n background: transparent;\\n}\\n.drop-list ul li[data-v-3b4f35af]:hover {\\n color: #f05a23;\\n}\\n.user[data-v-3b4f35af] {\\n width: 9.25rem;\\n height: 3rem;\\n border-radius: 3rem;\\n background-color: #f05a23;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n color: #ffffff;\\n margin: 0 auto;\\n}\\n.user span[data-v-3b4f35af] {\\n max-width: 4.25rem;\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n}\\n.user .icon-img[data-v-3b4f35af] {\\n margin: 0 .5rem;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT83NGE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBlc2NhcGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL3VybC9lc2NhcGUuanNcIik7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICog5pSv5oyB5paH5Lu2XFxuICog6ZyA6KaB5byV55So55qE5Zyw5pa55Z2H6ZyA6KaB5Yqg5LiK6L+Z5Liq5pSv5oyB5paH5Lu2XFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3MgTWlueGluc1xcbiAqXFxuICog5Y+C6ICD5pS26ZuG77yaXFxuICogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwLXNhc3MvdHJlZS9tYXN0ZXIvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnNcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3Mg5Y+Y6YePXFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi5iaXNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7XFxufVxcbi5mbFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcbi5mbGNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi5mbGJbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbn1cXG4uZmxhW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5mY2NbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmJbZGF0YS12LTNiNGYzNWFmXSwgLmFsZXJ0W2RhdGEtdi0zYjRmMzVhZl0sIC5pcHQtd3JhcCAuaXB0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLmZ1bGxwW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcbi5wb2ludGVyW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4udGV4dC1sW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnRleHQtcltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG4udGV4dC1jW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uYmNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5mbGV4MVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGZsZXg6IDE7XFxufVxcbi5kaXNhYmxlZFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xcbiAgY29sb3I6ICM0YzQ5NDggIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDtcXG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuLmNPcmFuZ2VbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmNHcmVlbltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGNvbG9yOiAjMDA2NDQxO1xcbn1cXG4uY0dyYXlbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBjb2xvcjogI2JmYmZiZjtcXG59XFxuLmNEYXJrW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgY29sb3I6ICNkY2RjZGM7XFxufVxcbi5hbGVydFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7XFxuICBtYXJnaW46IDAgYXV0byAxMnB4O1xcbiAgcGFkZGluZzogNnB4IDM2cHg7XFxufVxcbi5hbGVydCAuaWNvbltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmFsZXJ0IC5idG5bZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uYWxlcnQgLmNsb3NlW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxN3B4O1xcbn1cXG4uaXB0LXdyYXAgLmlwdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA0LjVyZW07XFxuICBib3JkZXItcmFkaXVzOiA0LjVyZW07XFxuICBib3JkZXI6IHNvbGlkIDFweCAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgcGFkZGluZzogMCAycmVtO1xcbiAgZmxleDogMTtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjFyZW07XFxufVxcbi5pcHQtd3JhcCAuZG93bi1hcnJvd1tkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMi4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDFyZW07XFxuICBoZWlnaHQ6IC42NjY2NjdyZW07XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWVbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDEuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vZmYucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAyN3B4O1xcbiAgaGVpZ2h0OiAyNHB4O1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllLWFjdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb24ucG5nXCIpKSArIFwiKTtcXG59XFxuLmlwdFtkYXRhLXYtM2I0ZjM1YWZdOmZvY3VzIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uaXB0LmVycltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDFyZW0gIWltcG9ydGFudDtcXG4gIGhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJhY2tncm91bmQ6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLmFsZXJ0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBwYWRkaW5nOiA0cHggMzZweCA0cHggMTJweDtcXG59XFxufVxcblxcbi8qIOWbvueJh+Wtl+S9kyAqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCc7XFxuICBzcmM6IHVybChcXFwiZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUFTRUFBc0FBQUFBQ1NBQUFBUTNBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUhFSUdWZ0NEU0FxRkdJUW5BVFlDSkFNWUN3NEFCQ0FGaEcwSFZCdlpCeEdWbk52SWZoellEVitCQWU5d3RKaUdPTlRHWXVIQlovT2g3N1EzT3h1cEl0T2VGRlRjUWpwUlh3SytBSWJuMDhuZTc2NlhwcHNpd1JLUGtzUVRqN0FPNHhBT3YzZk9BZHNKYzBLTlpPM0lvODlMZjhLOUJrWStjZSs0ZGY0RG1zK3lYTWFjTk5iRUFPT0FBdHJiRjFtQnhBbHF5L0RxOHVxd3JnTUJpUEdBRDRnNmRiZ0dRaFNzZVFSQUtzdEs4aUZNbUZBVkJNSFNkc0ZXRnBrTkhoWXpoYmtFWUpiM2VmSUdRVVFJRENhRnRYUTBsMUtFaE9mS1YrRzAxOUFyeTdHZ2J6Z0hBR0VYVUlBUEFCWklaNkdyR1RTSStvQmlhNy9BNGdWQWlvV0JlcTU4dnZIbGtKZU5yOElOQmhJeXkwZHd3Vjhlc0pnNE1CQWdmR0NWbEtVTmovSGd1Wklhd0dycWpaZ0xQSGc1eEFDSzFZMllDd3k4Q3BkY2xvNC9ZSU1JY0JMQU5aaDlZR2tJUEh0YTJOb3JUS3hVU2xVTlY3S296Mnpzd28wbVJmTk5SczlmYkZxOFlKcjV1RVhMV283Y0VkKzZwYmw5VzN2M3JqNGc3dHpScFUrN0hhdVIwWWJtSjIrZGFsTEVMWnk2dWRlMHVHaCs3NVpwNWlYRkN4Wk1XMlErMElRT0tzYTdTTUpJS0gxOGgzeTloV1krbU40dEV0VzBiWVQybWVtV3BrMWRiN0w4MXRRN2RnczNpc1VidDFycmwwa1UweXkxU3phN1pDdzBtNGxDSXpGTUYyd3cxNStRcDF1NDNzUmsvaEpUN1lKTjV1YUxsdW9sUFpTVHZxMW00dm1iZ1I3dmVNMTE2T2pCR3AySzIxb01ia1JHbnZxZ2xuQ0xWaGFydUFNNmdsK3RvVE5ZUFpzNWRveVpEWHlIYngvUlN2Wk10NnROdHg3Umx6a1dsY3lzV1F5U1YySStQaW8wMDhOcDhtUXZML2owQ0VWTExJSXRsb2lFSVBJRm5DQkRON1pwQzZuM2kvZXJFMHVYSUNUL3QrMjY5clZyang0ZGUrd3J3eW5mam8xQmFOL3RYUW16SjN3SUY5a3JnaFVIcU4xZUZCNGZNdnVDUk9ybnZWd2RrVWVXTGZmMms3MElpTzhmczJ5T2FiWHBISGRsdlgrQTVybUs2ZHg0cGlYbGJIdW5pYitpTmVWTStVblhGdldaalIydWxlVkYvanNiSzEyd284T1dEcFkrVFJIMGpQOHN5THMwV0lsT0FJRGhGSE9QK2dJQTFURjNrQ09CT2NiYWo5RmpnWUNKOTdDRUZ2d3QzNUdmS1oyWXE0ajVKaUdVc0FDK0p1dTdzYVNaYXZESzFXZ3MvamVhYWdCL1EwV1VzdVl1dFRPZElLRGxtVExoQVRhMDNNc2tOMCtHMHQxdmNqeUVUQ01NQXJZNENMbVFpdWFEU1NJRVRTZ2VtN2RCdTAvRzZvMlJFZ0dlSmlBUVNydkFrRHNLU3VreWlhVTlCbytaZCtCVFpnd3hYZFpIU3JqRnJvNFpvcUtsZ2orVlNlNFVzZGFWWDNpRGZnZVI0MUtQOFVJdU5rQ0JmZ0hweEJVZDhoQXJHajc2MEZnVmNaa2pwYUxiRUFKVGJXWUhXVGVsdGZhTnZ6OVg5S0pOSWNmQlNySU1oQXBhcE1BZktTT3hqbko2VjZ2TSsyOUFld3VFWE5GUjQzMkJyTENEazBCK0FocVFycXF1VWNlbGpHN3dvUjAwcWhRN2k1T3hpS1JpQndTSU1sSmJQTWtCcWRvbzdSRHVOZnlaYmx4VDFXWjZUYnpMZmJCWjUzUVlRZ2xMZUlSUEJCQjloUFRISDlvTE1oUTVyNWlwREZ3d01Sd3hSZXpyZnpBQUFBPT1cXFwiKSBmb3JtYXQoXFxcIndvZmYyXFxcIik7XFxufVxcbi5pY29uZm9udFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnICFpbXBvcnRhbnQ7XFxuICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxufVxcbi5pY29ucmVmcmVzaFtkYXRhLXYtM2I0ZjM1YWZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NzQnO1xcbn1cXG4uaWNvbmVtcHR5W2RhdGEtdi0zYjRmMzVhZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTZBNic7XFxufVxcbi5pY29uY2xvc2VbZGF0YS12LTNiNGYzNWFmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODQ5JztcXG59XFxuLmRyb3AtbGlzdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1pbi13aWR0aDogMTByZW07XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBtYXJnaW46IDAgMXJlbTtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG59XFxuLmRyb3AtbGlzdCAubGlzdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTEwJTtcXG4gICAgbGVmdDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIG1hcmdpbjogMCBhdXRvO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxufVxcbi5kcm9wLWxpc3QgLmxpc3QgLnNwYWNlW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICAgIGhlaWdodDogMS41cmVtO1xcbn1cXG4uZHJvcC1saXN0IHNwYW5bZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kcm9wLWxpc3QgdWxbZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGJveC1zaGFkb3c6IDAgMCAxLjVyZW0gMCByZ2JhKDI1NSwgODcsIDAsIDAuMTUpO1xcbiAgICBib3JkZXItcmFkaXVzOiAuNXJlbTtcXG59XFxuLmRyb3AtbGlzdCB1bCBsaVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICBwYWRkaW5nOiAxLjVyZW0gMDtcXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5kcm9wLWxpc3QgdWwgbGlbZGF0YS12LTNiNGYzNWFmXTphZnRlciB7XFxuICAgICAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gICAgICAgIHdpZHRoOiA3cmVtO1xcbiAgICAgICAgaGVpZ2h0OiAxcHg7XFxuICAgICAgICBiYWNrZ3JvdW5kOiAjZjFmMWYxO1xcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICAgICAgYm90dG9tOiAwO1xcbiAgICAgICAgbGVmdDogNTAlO1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xcbn1cXG4uZHJvcC1saXN0IHVsIGxpW2RhdGEtdi0zYjRmMzVhZl06bGFzdC1jaGlsZCB7XFxuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcXG59XFxuLmRyb3AtbGlzdCB1bCBsaVtkYXRhLXYtM2I0ZjM1YWZdOmxhc3QtY2hpbGQ6YWZ0ZXIge1xcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxufVxcbi5kcm9wLWxpc3QgdWwgbGlbZGF0YS12LTNiNGYzNWFmXTpob3ZlciB7XFxuICAgICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi51c2VyW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDkuMjVyZW07XFxuICBoZWlnaHQ6IDNyZW07XFxuICBib3JkZXItcmFkaXVzOiAzcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwNWEyMztcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBjb2xvcjogI2ZmZmZmZjtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4udXNlciBzcGFuW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBtYXgtd2lkdGg6IDQuMjVyZW07XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbn1cXG4udXNlciAuaWNvbi1pbWdbZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIG1hcmdpbjogMCAuNXJlbTtcXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-f678fc22] {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl[data-v-f678fc22] {\\n display: flex;\\n}\\n.flc[data-v-f678fc22] {\\n display: flex;\\n justify-content: center;\\n}\\n.flb[data-v-f678fc22] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla[data-v-f678fc22] {\\n display: flex;\\n align-items: center;\\n}\\n.fcc[data-v-f678fc22] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb[data-v-f678fc22], .alert[data-v-f678fc22], .ipt-wrap .ipt[data-v-f678fc22] {\\n box-sizing: border-box;\\n}\\n.fullp[data-v-f678fc22] {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer[data-v-f678fc22] {\\n cursor: pointer;\\n}\\n.text-l[data-v-f678fc22] {\\n text-align: left;\\n}\\n.text-r[data-v-f678fc22] {\\n text-align: right;\\n}\\n.text-c[data-v-f678fc22] {\\n text-align: center;\\n}\\n.bc[data-v-f678fc22] {\\n text-align: center;\\n}\\n.flex1[data-v-f678fc22] {\\n flex: 1;\\n}\\n.disabled[data-v-f678fc22] {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange[data-v-f678fc22] {\\n color: #f05a23;\\n}\\n.cGreen[data-v-f678fc22] {\\n color: #006441;\\n}\\n.cGray[data-v-f678fc22] {\\n color: #bfbfbf;\\n}\\n.cDark[data-v-f678fc22] {\\n color: #dcdcdc;\\n}\\n.alert[data-v-f678fc22] {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon[data-v-f678fc22] {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn[data-v-f678fc22] {\\n color: #f05a23;\\n}\\n.alert .close[data-v-f678fc22] {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-f678fc22] {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-f678fc22] {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye[data-v-f678fc22] {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-f678fc22] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-f678fc22]:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-f678fc22] {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-f678fc22] {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-f678fc22] {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-f678fc22] {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-f678fc22] {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-f678fc22]:before {\\n content: '\\\\E874';\\n}\\n.iconempty[data-v-f678fc22]:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose[data-v-f678fc22]:before {\\n content: '\\\\E849';\\n}\\n.v-footer[data-v-f678fc22] {\\n color: #ffffff;\\n background-color: #2e2b2a;\\n font-size: 14px;\\n}\\n.v-footer .footer-containter[data-v-f678fc22] {\\n margin: 0 auto;\\n max-width: 1200px;\\n}\\n.v-footer .footer-containter .cont .logo-wrap[data-v-f678fc22] {\\n padding: 2.166667rem 0;\\n}\\n.v-footer .footer-containter .cont .logo-wrap .logo-img[data-v-f678fc22] {\\n cursor: pointer;\\n}\\n.v-footer .footer-containter .cont .line[data-v-f678fc22] {\\n width: 100%;\\n height: 1px;\\n opacity: 0.2;\\n background-color: #ffffff;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n padding: 2rem 0 2rem;\\n display: flex;\\n}\\n.v-footer .footer-containter .cont .info .hotline[data-v-f678fc22] {\\n min-width: 24.5rem;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact .n-item[data-v-f678fc22] {\\n margin-bottom: 0.6rem;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact .phone[data-v-f678fc22] {\\n color: #f05a23;\\n font-size: 16px;\\n font-weight: bold;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact[data-v-f678fc22]:first-child {\\n margin-bottom: 2rem;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n display: flex;\\n}\\n.v-footer .footer-containter .cont .info .nav .n-item[data-v-f678fc22] {\\n cursor: pointer;\\n min-width: 14.75rem;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n display: none;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n position: relative;\\n text-align: left;\\n margin-left: 5.32rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap[data-v-f678fc22] {\\n text-align: center;\\n margin-top: 0.3rem;\\n width: 8.416667rem;\\n height: 8.833333rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap .c1[data-v-f678fc22] {\\n margin-top: 0.3rem;\\n}\\n.v-footer .footer-containter .cont .info .public .icon[data-v-f678fc22] {\\n margin-top: .75rem;\\n margin-right: 1rem;\\n display: inline-block;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22] {\\n margin-bottom: 2rem;\\n color: #dcdddd;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:first-child {\\n margin-bottom: 2.666667rem;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:last-child {\\n margin-bottom: 0;\\n}\\n.v-footer .footer-containter .cont .copyright[data-v-f678fc22] {\\n color: rgba(179, 177, 168, 0.5);\\n padding: 1.5rem 0;\\n line-height: 1.58;\\n font-size: 12px;\\n}\\n@media (max-width: 1200px) {\\n.v-footer[data-v-f678fc22] {\\n box-sizing: border-box;\\n padding: 0 4%;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n display: block;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n margin-top: 2rem;\\n display: flex;\\n}\\n.v-footer .footer-containter .cont .info .nav .nav-v[data-v-f678fc22] {\\n width: 100%;\\n}\\n.v-footer .footer-containter .cont .info .nav .n-item[data-v-f678fc22] {\\n min-width: 0;\\n margin-right: 0;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n display: none;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n margin: 0;\\n margin-top: 3rem;\\n text-align: left;\\n min-height: 12rem;\\n}\\n.v-footer .footer-containter .cont .copyright[data-v-f678fc22] {\\n box-sizing: border-box;\\n padding-right: 2rem;\\n}\\n}\\n@media (max-width: 768px) {\\n.v-footer[data-v-f678fc22] {\\n font-size: 12px;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.v-footer .footer-containter .cont .info .hotline[data-v-f678fc22] {\\n min-width: 0;\\n}\\n.v-footer .footer-containter .cont .info .hotline .phone[data-v-f678fc22] {\\n font-size: 12px !important;\\n font-weight: bold !important;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n display: none;\\n margin-top: 0;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n display: block;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n margin: 0;\\n min-width: 9rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap img[data-v-f678fc22] {\\n width: 7rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap .c1[data-v-f678fc22] {\\n display: none;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22] {\\n margin-bottom: 2rem;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:first-child {\\n margin-bottom: 2rem;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/NzhjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmJiW2RhdGEtdi1mNjc4ZmMyMl0sIC5hbGVydFtkYXRhLXYtZjY3OGZjMjJdLCAuaXB0LXdyYXAgLmlwdFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRleHQtbFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi50ZXh0LXJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtY1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZmxleDFbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcXG4gIGNvbG9yOiAjNGM0OTQ4ICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XFxuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxufVxcbi5jT3JhbmdlW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jR3JlZW5bZGF0YS12LWY2NzhmYzIyXSB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5W2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxufVxcbi5jRGFya1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGNvbG9yOiAjZGNkY2RjO1xcbn1cXG4uYWxlcnRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb25bZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5hbGVydCAuYnRuW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmFsZXJ0IC5jbG9zZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNC41cmVtO1xcbiAgYm9yZGVyLXJhZGl1czogNC41cmVtO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIHBhZGRpbmc6IDAgMnJlbTtcXG4gIGZsZXg6IDE7XFxuICBsZXR0ZXItc3BhY2luZzogMC4xcmVtO1xcbn1cXG4uaXB0LXdyYXAgLmRvd24tYXJyb3dbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2Rvd24tYXJyb3cucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAxcmVtO1xcbiAgaGVpZ2h0OiAuNjY2NjY3cmVtO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3RbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZ1wiKSkgKyBcIik7XFxufVxcbi5pcHRbZGF0YS12LWY2NzhmYzIyXTpmb2N1cyB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLmlwdC5lcnJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHdpZHRoOiAxcmVtICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5hbGVydFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JyAhaW1wb3J0YW50O1xcbiAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG4uaWNvbnJlZnJlc2hbZGF0YS12LWY2NzhmYzIyXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODc0JztcXG59XFxuLmljb25lbXB0eVtkYXRhLXYtZjY3OGZjMjJdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlW2RhdGEtdi1mNjc4ZmMyMl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg0OSc7XFxufVxcbi52LWZvb3RlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGNvbG9yOiAjZmZmZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJlMmIyYTtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgbWFyZ2luOiAwIGF1dG87XFxuICAgIG1heC13aWR0aDogMTIwMHB4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5sb2dvLXdyYXBbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgcGFkZGluZzogMi4xNjY2NjdyZW0gMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAubG9nby13cmFwIC5sb2dvLWltZ1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAubGluZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgICBoZWlnaHQ6IDFweDtcXG4gICAgICBvcGFjaXR5OiAwLjI7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mb1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBwYWRkaW5nOiAycmVtIDAgMnJlbTtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgbWluLXdpZHRoOiAyNC41cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lIC5jb250YWN0IC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNnJlbTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZSAuY29udGFjdCAucGhvbmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGNvbG9yOiAjZjA1YTIzO1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lIC5jb250YWN0W2RhdGEtdi1mNjc4ZmMyMl06Zmlyc3QtY2hpbGQge1xcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAycmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXYgLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICAgICAgICBtaW4td2lkdGg6IDE0Ljc1cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXYyW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAucHVibGljW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA1LjMycmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWMgLnFyY29kZS13cmFwW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDAuM3JlbTtcXG4gICAgICAgICAgd2lkdGg6IDguNDE2NjY3cmVtO1xcbiAgICAgICAgICBoZWlnaHQ6IDguODMzMzMzcmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWMgLnFyY29kZS13cmFwIC5jMVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwLjNyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpYyAuaWNvbltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogLjc1cmVtO1xcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDFyZW07XFxuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubi1pdGVtW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXG4gICAgICAgIGNvbG9yOiAjZGNkZGRkO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXTpmaXJzdC1jaGlsZCB7XFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIuNjY2NjY3cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXTpsYXN0LWNoaWxkIHtcXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuY29weXJpZ2h0W2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgIGNvbG9yOiByZ2JhKDE3OSwgMTc3LCAxNjgsIDAuNSk7XFxuICAgICAgcGFkZGluZzogMS41cmVtIDA7XFxuICAgICAgbGluZS1oZWlnaHQ6IDEuNTg7XFxuICAgICAgZm9udC1zaXplOiAxMnB4O1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XFxuLnYtZm9vdGVyW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBwYWRkaW5nOiAwIDQlO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBtYXJnaW4tdG9wOiAycmVtO1xcbiAgICAgICAgZGlzcGxheTogZmxleDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2IC5uYXYtdltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgd2lkdGg6IDEwMCU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm5hdiAubi1pdGVtW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICBtaW4td2lkdGg6IDA7XFxuICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2MltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpY1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1hcmdpbjogMDtcXG4gICAgICAgIG1hcmdpbi10b3A6IDNyZW07XFxuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICAgICAgbWluLWhlaWdodDogMTJyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmNvcHlyaWdodFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDJyZW07XFxufVxcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4udi1mb290ZXJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mb1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1pbi13aWR0aDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZSAucGhvbmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBkaXNwbGF5OiBub25lO1xcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2MltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWNbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICBtaW4td2lkdGg6IDlyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpYyAucXJjb2RlLXdyYXAgaW1nW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICB3aWR0aDogN3JlbTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAucHVibGljIC5xcmNvZGUtd3JhcCAuYzFbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDJyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdOmZpcnN0LWNoaWxkIHtcXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXG59XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-6fba8daf] {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl[data-v-6fba8daf] {\\n display: flex;\\n}\\n.flc[data-v-6fba8daf] {\\n display: flex;\\n justify-content: center;\\n}\\n.flb[data-v-6fba8daf] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla[data-v-6fba8daf] {\\n display: flex;\\n align-items: center;\\n}\\n.fcc[data-v-6fba8daf] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb[data-v-6fba8daf], .alert[data-v-6fba8daf], .ipt-wrap .ipt[data-v-6fba8daf] {\\n box-sizing: border-box;\\n}\\n.fullp[data-v-6fba8daf] {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer[data-v-6fba8daf] {\\n cursor: pointer;\\n}\\n.text-l[data-v-6fba8daf] {\\n text-align: left;\\n}\\n.text-r[data-v-6fba8daf] {\\n text-align: right;\\n}\\n.text-c[data-v-6fba8daf] {\\n text-align: center;\\n}\\n.bc[data-v-6fba8daf] {\\n text-align: center;\\n}\\n.flex1[data-v-6fba8daf] {\\n flex: 1;\\n}\\n.disabled[data-v-6fba8daf] {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange[data-v-6fba8daf] {\\n color: #f05a23;\\n}\\n.cGreen[data-v-6fba8daf] {\\n color: #006441;\\n}\\n.cGray[data-v-6fba8daf] {\\n color: #bfbfbf;\\n}\\n.cDark[data-v-6fba8daf] {\\n color: #dcdcdc;\\n}\\n.alert[data-v-6fba8daf] {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon[data-v-6fba8daf] {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn[data-v-6fba8daf] {\\n color: #f05a23;\\n}\\n.alert .close[data-v-6fba8daf] {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-6fba8daf] {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-6fba8daf] {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye[data-v-6fba8daf] {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-6fba8daf] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-6fba8daf]:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-6fba8daf] {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-6fba8daf] {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-6fba8daf] {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-6fba8daf] {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-6fba8daf] {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-6fba8daf]:before {\\n content: '\\\\E874';\\n}\\n.iconempty[data-v-6fba8daf]:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose[data-v-6fba8daf]:before {\\n content: '\\\\E849';\\n}\\n.v-header[data-v-6fba8daf] {\\n height: 7.66667rem;\\n background-color: #fff;\\n color: #4c4948;\\n position: relative;\\n z-index: 11;\\n font-size: 14px;\\n}\\n.v-header .header-container[data-v-6fba8daf] {\\n max-width: 1200px;\\n height: 100%;\\n margin: auto;\\n display: flex;\\n align-items: center;\\n position: relative;\\n}\\n.v-header .main-nav[data-v-6fba8daf] {\\n height: 100%;\\n flex: 1 0 auto;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n margin-right: 2rem;\\n max-width: 17.75rem;\\n cursor: pointer;\\n}\\n.v-header .nav-list[data-v-6fba8daf] {\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: flex-end;\\n position: relative;\\n}\\n.v-header .nav-item[data-v-6fba8daf] {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n margin: 0;\\n -ms-flex-pack: center;\\n justify-content: center;\\n position: relative;\\n cursor: pointer;\\n}\\n.v-header .main-nav-list[data-v-6fba8daf] {\\n display: flex;\\n cursor: pointer;\\n}\\n.v-header .nav-item.link-item[data-v-6fba8daf] {\\n padding: 0 50px;\\n height: 5rem;\\n}\\n.v-header .nav-item.search[data-v-6fba8daf] {\\n flex: 1 1 auto;\\n}\\n.v-header .nav-item.auth[data-v-6fba8daf] {\\n color: #ffffff;\\n}\\n.v-header .nav-item.auth .user[data-v-6fba8daf] {\\n width: 7.333333rem;\\n height: 2.25rem;\\n background-color: #f05a23;\\n border-radius: 1.333333rem;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.v-header .nav-item.auth .user .icon-img[data-v-6fba8daf] {\\n margin: 0 .5rem;\\n}\\n.v-header .nav-item.auth .lang[data-v-6fba8daf] {\\n color: #f05a23;\\n}\\n.pc[data-v-6fba8daf] {\\n display: block;\\n}\\n.mobile[data-v-6fba8daf] {\\n display: none;\\n}\\n.mobile-nav-list[data-v-6fba8daf] {\\n position: absolute;\\n right: 0;\\n top: 24px;\\n display: flex;\\n align-items: center;\\n}\\n.mobile-nav-list img[data-v-6fba8daf] {\\n width: 20px;\\n margin-left: 20px;\\n}\\n@media (max-width: 1200px) {\\n.v-header[data-v-6fba8daf] {\\n box-sizing: border-box;\\n padding: 0 4%;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n max-width: 17.75rem;\\n margin: 0;\\n}\\n.v-header .pc[data-v-6fba8daf] {\\n display: none;\\n}\\n.v-header .mobile[data-v-6fba8daf] {\\n display: block;\\n}\\n.v-header .mobile-nav-list[data-v-6fba8daf] {\\n top: 32px;\\n}\\n}\\n@media (max-width: 768px) {\\n.v-header[data-v-6fba8daf] {\\n height: 72px;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n width: 15.5rem;\\n margin: 0;\\n}\\n.v-header .mobile[data-v-6fba8daf] {\\n display: block;\\n}\\n.v-header .mobile-nav-list[data-v-6fba8daf] {\\n top: 24px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/MDZjOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmJiW2RhdGEtdi02ZmJhOGRhZl0sIC5hbGVydFtkYXRhLXYtNmZiYThkYWZdLCAuaXB0LXdyYXAgLmlwdFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRleHQtbFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi50ZXh0LXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtY1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZmxleDFbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcXG4gIGNvbG9yOiAjNGM0OTQ4ICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XFxuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxufVxcbi5jT3JhbmdlW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jR3JlZW5bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxufVxcbi5jRGFya1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGNvbG9yOiAjZGNkY2RjO1xcbn1cXG4uYWxlcnRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb25bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5hbGVydCAuYnRuW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmFsZXJ0IC5jbG9zZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNC41cmVtO1xcbiAgYm9yZGVyLXJhZGl1czogNC41cmVtO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIHBhZGRpbmc6IDAgMnJlbTtcXG4gIGZsZXg6IDE7XFxuICBsZXR0ZXItc3BhY2luZzogMC4xcmVtO1xcbn1cXG4uaXB0LXdyYXAgLmRvd24tYXJyb3dbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2Rvd24tYXJyb3cucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAxcmVtO1xcbiAgaGVpZ2h0OiAuNjY2NjY3cmVtO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZ1wiKSkgKyBcIik7XFxufVxcbi5pcHRbZGF0YS12LTZmYmE4ZGFmXTpmb2N1cyB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLmlwdC5lcnJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHdpZHRoOiAxcmVtICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5hbGVydFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JyAhaW1wb3J0YW50O1xcbiAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG4uaWNvbnJlZnJlc2hbZGF0YS12LTZmYmE4ZGFmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODc0JztcXG59XFxuLmljb25lbXB0eVtkYXRhLXYtNmZiYThkYWZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlW2RhdGEtdi02ZmJhOGRhZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg0OSc7XFxufVxcbi52LWhlYWRlcltkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGhlaWdodDogNy42NjY2N3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBjb2xvcjogIzRjNDk0ODtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHotaW5kZXg6IDExO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG4udi1oZWFkZXIgLmhlYWRlci1jb250YWluZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIG1heC13aWR0aDogMTIwMHB4O1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIG1hcmdpbjogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4udi1oZWFkZXIgLm1haW4tbmF2W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGZsZXg6IDEgMCBhdXRvO1xcbn1cXG4udi1oZWFkZXIgLmxvZ28taW1nW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDJyZW07XFxuICAgIG1heC13aWR0aDogMTcuNzVyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5uYXYtbGlzdFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi52LWhlYWRlciAubmF2LWl0ZW1bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5tYWluLW5hdi1saXN0W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi52LWhlYWRlciAubmF2LWl0ZW0ubGluay1pdGVtW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBwYWRkaW5nOiAwIDUwcHg7XFxuICAgIGhlaWdodDogNXJlbTtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5zZWFyY2hbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbn1cXG4udi1oZWFkZXIgLm5hdi1pdGVtLmF1dGhbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcbn1cXG4udi1oZWFkZXIgLm5hdi1pdGVtLmF1dGggLnVzZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDcuMzMzMzMzcmVtO1xcbiAgICAgIGhlaWdodDogMi4yNXJlbTtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjA1YTIzO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEuMzMzMzMzcmVtO1xcbiAgICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5hdXRoIC51c2VyIC5pY29uLWltZ1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgICAgIG1hcmdpbjogMCAuNXJlbTtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5hdXRoIC5sYW5nW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4ucGNbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLm1vYmlsZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5tb2JpbGUtbmF2LWxpc3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHRvcDogMjRweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLm1vYmlsZS1uYXYtbGlzdCBpbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDIwcHg7XFxuICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiAxMjAwcHgpIHtcXG4udi1oZWFkZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBhZGRpbmc6IDAgNCU7XFxufVxcbi52LWhlYWRlciAubG9nby1pbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgbWF4LXdpZHRoOiAxNy43NXJlbTtcXG4gICAgICBtYXJnaW46IDA7XFxufVxcbi52LWhlYWRlciAucGNbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgZGlzcGxheTogbm9uZTtcXG59XFxuLnYtaGVhZGVyIC5tb2JpbGVbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgZGlzcGxheTogYmxvY2s7XFxufVxcbi52LWhlYWRlciAubW9iaWxlLW5hdi1saXN0W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICAgICAgdG9wOiAzMnB4O1xcbn1cXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLnYtaGVhZGVyW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBoZWlnaHQ6IDcycHg7XFxufVxcbi52LWhlYWRlciAubG9nby1pbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDE1LjVyZW07XFxuICAgICAgbWFyZ2luOiAwO1xcbn1cXG4udi1oZWFkZXIgLm1vYmlsZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnYtaGVhZGVyIC5tb2JpbGUtbmF2LWxpc3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgICB0b3A6IDI0cHg7XFxufVxcbn1cXG5cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-04c55e2f], .plus-icon[data-v-04c55e2f], .arrow-icon[data-v-04c55e2f] {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl[data-v-04c55e2f] {\\n display: flex;\\n}\\n.flc[data-v-04c55e2f] {\\n display: flex;\\n justify-content: center;\\n}\\n.flb[data-v-04c55e2f] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla[data-v-04c55e2f] {\\n display: flex;\\n align-items: center;\\n}\\n.fcc[data-v-04c55e2f], .panel .lang-item[data-v-04c55e2f], .icon-wrap[data-v-04c55e2f] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb[data-v-04c55e2f], .alert[data-v-04c55e2f], .ipt-wrap .ipt[data-v-04c55e2f], .list-item[data-v-04c55e2f] {\\n box-sizing: border-box;\\n}\\n.fullp[data-v-04c55e2f] {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer[data-v-04c55e2f] {\\n cursor: pointer;\\n}\\n.text-l[data-v-04c55e2f] {\\n text-align: left;\\n}\\n.text-r[data-v-04c55e2f] {\\n text-align: right;\\n}\\n.text-c[data-v-04c55e2f] {\\n text-align: center;\\n}\\n.bc[data-v-04c55e2f] {\\n text-align: center;\\n}\\n.flex1[data-v-04c55e2f] {\\n flex: 1;\\n}\\n.disabled[data-v-04c55e2f] {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange[data-v-04c55e2f] {\\n color: #f05a23;\\n}\\n.cGreen[data-v-04c55e2f] {\\n color: #006441;\\n}\\n.cGray[data-v-04c55e2f] {\\n color: #bfbfbf;\\n}\\n.cDark[data-v-04c55e2f] {\\n color: #dcdcdc;\\n}\\n.alert[data-v-04c55e2f] {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon[data-v-04c55e2f] {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn[data-v-04c55e2f] {\\n color: #f05a23;\\n}\\n.alert .close[data-v-04c55e2f] {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-04c55e2f] {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-04c55e2f] {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye[data-v-04c55e2f] {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-04c55e2f] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-04c55e2f]:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-04c55e2f] {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-04c55e2f] {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-04c55e2f] {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-04c55e2f] {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-04c55e2f] {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-04c55e2f]:before {\\n content: '\\\\E874';\\n}\\n.iconempty[data-v-04c55e2f]:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose[data-v-04c55e2f]:before {\\n content: '\\\\E849';\\n}\\n.panel[data-v-04c55e2f] {\\n z-index: 9999;\\n display: block;\\n left: 0;\\n top: 72px;\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n background-color: #ffffff;\\n overflow: scroll;\\n padding-bottom: 200px;\\n}\\n.panel .mask[data-v-04c55e2f] {\\n width: 100%;\\n height: 100%;\\n position: fixed;\\n z-index: 1001;\\n left: 0;\\n top: 0;\\n}\\n.panel .list[data-v-04c55e2f] {\\n position: relative;\\n z-index: 2001;\\n padding: 0 20px;\\n}\\n.panel .lang[data-v-04c55e2f] {\\n position: relative;\\n z-index: 2002;\\n display: flex;\\n background-color: #ffffff;\\n padding: 20px 36px;\\n}\\n.panel .lang-item[data-v-04c55e2f] {\\n border-right: solid 1px #ebedf0;\\n padding: 0 12px;\\n}\\n.panel .lang-item[data-v-04c55e2f]:first-child {\\n padding: 0 10px 0 0;\\n}\\n.panel .lang-item-act[data-v-04c55e2f] {\\n color: #f05a23;\\n}\\n.coll-item-act[data-v-04c55e2f] {\\n color: #f05a23;\\n}\\n.list-item[data-v-04c55e2f] {\\n display: flex;\\n align-items: center;\\n padding: 16px 16px;\\n position: relative;\\n border-bottom: 1px solid #ebedf0;\\n font-size: 14px;\\n color: #4c4948;\\n background-color: #fff;\\n}\\n.list-item .txt[data-v-04c55e2f] {\\n flex: 1;\\n}\\n.icon-wrap[data-v-04c55e2f] {\\n height: 100%;\\n}\\n.plus-icon[data-v-04c55e2f] {\\n width: 21px;\\n height: 21px;\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-plus.png */ \"./src/assets/images/home/icon-head-plus.png\")) + \") no-repeat center;\\n transform: scale(0.6);\\n}\\n.arrow-icon[data-v-04c55e2f] {\\n width: 21px;\\n height: 21px;\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-right-arrow.png */ \"./src/assets/images/home/icon-head-right-arrow.png\")) + \") no-repeat center;\\n transform: scale(0.6);\\n}\\n.plus-icon-act[data-v-04c55e2f] {\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-plus-act.png */ \"./src/assets/images/home/icon-head-plus-act.png\")) + \") no-repeat center;\\n}\\n.hide[data-v-04c55e2f] {\\n display: none;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlP2M2ZGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGVzY2FwZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvdXJsL2VzY2FwZS5qc1wiKTtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiQGNoYXJzZXQgXFxcIlVURi04XFxcIjtcXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiDmlK/mjIHmlofku7ZcXG4gKiDpnIDopoHlvJXnlKjnmoTlnLDmlrnlnYfpnIDopoHliqDkuIrov5nkuKrmlK/mjIHmlofku7ZcXG4gKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICogU2FzcyBNaW54aW5zXFxuICpcXG4gKiDlj4LogIPmlLbpm4bvvJpcXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAtc2Fzcy90cmVlL21hc3Rlci9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGluc1xcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICogU2FzcyDlj5jph49cXG4gKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLmJpc1tkYXRhLXYtMDRjNTVlMmZdLCAucGx1cy1pY29uW2RhdGEtdi0wNGM1NWUyZl0sIC5hcnJvdy1pY29uW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi0wNGM1NWUyZl0sIC5wYW5lbCAubGFuZy1pdGVtW2RhdGEtdi0wNGM1NWUyZl0sIC5pY29uLXdyYXBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmJbZGF0YS12LTA0YzU1ZTJmXSwgLmFsZXJ0W2RhdGEtdi0wNGM1NWUyZl0sIC5pcHQtd3JhcCAuaXB0W2RhdGEtdi0wNGM1NWUyZl0sIC5saXN0LWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4uZnVsbHBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuLnBvaW50ZXJbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi50ZXh0LWxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG4udGV4dC1yW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxufVxcbi50ZXh0LWNbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5iY1tkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmZsZXgxW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZmxleDogMTtcXG59XFxuLmRpc2FibGVkW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XFxuICBjb2xvcjogIzRjNDk0OCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4uY09yYW5nZVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uY0dyZWVuW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY29sb3I6ICMwMDY0NDE7XFxufVxcbi5jR3JheVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbn1cXG4uY0RhcmtbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBjb2xvcjogI2RjZGNkYztcXG59XFxuLmFsZXJ0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICBib3JkZXI6IHNvbGlkIDFweCAjZGNkZGRkO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjtcXG4gIG1hcmdpbjogMCBhdXRvIDEycHg7XFxuICBwYWRkaW5nOiA2cHggMzZweDtcXG59XFxuLmFsZXJ0IC5pY29uW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uYWxlcnQgLmJ0bltkYXRhLXYtMDRjNTVlMmZdIHtcXG4gICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5hbGVydCAuY2xvc2VbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDE3cHg7XFxufVxcbi5pcHQtd3JhcCAuaXB0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQuNXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDQuNXJlbTtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBwYWRkaW5nOiAwIDJyZW07XFxuICBmbGV4OiAxO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMXJlbTtcXG59XFxuLmlwdC13cmFwIC5kb3duLWFycm93W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAyLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9kb3duLWFycm93LnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMXJlbTtcXG4gIGhlaWdodDogLjY2NjY2N3JlbTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMS4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDI3cHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWUtYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vbi5wbmdcIikpICsgXCIpO1xcbn1cXG4uaXB0W2RhdGEtdi0wNGM1NWUyZl06Zm9jdXMge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5pcHQuZXJyW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZDogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4uYWxlcnRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIHBhZGRpbmc6IDRweCAzNnB4IDRweCAxMnB4O1xcbn1cXG59XFxuXFxuLyog5Zu+54mH5a2X5L2TICovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JztcXG4gIHNyYzogdXJsKFxcXCJkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQVNFQUFzQUFBQUFDU0FBQUFRM0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSEVJR1ZnQ0RTQXFGR0lRbkFUWUNKQU1ZQ3c0QUJDQUZoRzBIVkJ2WkJ4R1ZuTnZJZmh6WURWK0JBZTl3dEppR09OVEdZdUhCWi9PaDc3UTNPeHVwSXRPZUZGVGNRanBSWHdLK0FJYm4wOG5lNzY2WHBwc2l3UktQa3NRVGo3QU80eEFPdjNmT0Fkc0pjMEtOWk8zSW84OUxmOEs5QmtZK2NlKzRkZjREbXMreVhNYWNOTmJFQU9PQUF0cmJGMW1CeEFscXkvRHE4dXF3cmdNQmlQR0FENGc2ZGJnR1FoU3NlUVJBS3N0SzhpRk1tRkFWQk1IU2RzRldGcGtOSGhZemhia0VZSmIzZWZJR1FVUUlEQ2FGdFhRMGwxS0VoT2ZLVitHMDE5QXJ5N0dnYnpnSEFHRVhVSUFQQUJaSVo2R3JHVFNJK29CaWE3L0E0Z1ZBaW9XQmVxNTh2dkhsa0plTnI4SU5CaEl5eTBkd3dWOGVzSmc0TUJBZ2ZHQ1ZsS1VOai9IZ3VaSWF3R3JxalpnTFBIZzV4QUNLMVkyWUN3eThDcGRjbG80L1lJTUljQkxBTlpoOVlHa0lQSHRhMk5vclRLeFVTbFVOVjdLb3oyenN3bzBtUmZOTlJzOWZiRnE4WUpyNXVFWExXbzdjRWQrNnBibDlXM3Yzcmo0Zzd0elJwVSs3SGF1UjBZYm1KMitkYWxMRUxaeTZ1ZGUwdUdoKzc1WnA1aVhGQ3haTVcyUSswSVFPS3NhN1NNSklLSDE4aDN5OWhXWSttTjR0RXRXMGJZVDJtZW1XcGsxZGI3TDgxdFE3ZGdzM2lzVWJ0MXJybDBrVTB5eTFTemE3WkN3MG00bENJekZNRjJ3dzE1K1FwMXU0M3NSay9oSlQ3WUpONXVhTGx1b2xQWlNUdnExbTR2bWJnUjd2ZU0xMTZPakJHcDJLMjFvTWJrUkdudnFnbG5DTFZoYXJ1QU02Z2wrdG9UTllQWnM1ZG95WkRYeUhieC9SU3ZaTXQ2dE50eDdSbHprV2xjeXNXUXlTVjJJK1BpbzAwOE5wOG1RdkwvajBDRVZMTElJdGxvaUVJUElGbkNCRE43WnBDNm4zaS9lckUwdVhJQ1QvdCsyNjlyVnJqeDRkZSt3cnd5bmZqbzFCYU4vdFhRbXpKM3dJRjlrcmdoVUhxTjFlRkI0Zk12dUNST3JudlZ3ZGtVZVdMZmYyazcwSWlPOGZzMnlPYWJYcEhIZGx2WCtBNXJtSzZkeDRwaVhsYkh1bmliK2lOZVZNK1VuWEZ2V1pqUjJ1bGVWRi9qc2JLMTJ3bzhPV0RwWStUUkgwalA4c3lMczBXSWxPQUlEaEZIT1ArZ0lBMVRGM2tDT0JPY2JhajlGamdZQ0o5N0NFRnZ3dDM1R2ZLWjJZcTRqNUppR1VzQUMrSnV1N3NhU1phdkRLMVdncy9qZWFhZ0IvUTBXVXN1WXV0VE9kSUtEbG1UTGhBVGEwM01za04wK0cwdDF2Y2p5RVRDTU1Bclk0Q0xtUWl1YURTU0lFVFNnZW03ZEJ1MC9HNm8yUkVnR2VKaUFRU3J2QWtEc0tTdWt5aWFVOUJvK1pkK0JUWmd3eFhkWkhTcmpGcm80Wm9xS2xnaitWU2U0VXNkYVZYM2lEZmdlUjQxS1A4VUl1TmtDQmZnSHB4QlVkOGhBckdqNzYwRmdWY1pranBhTGJFQUpUYldZSFdUZWx0ZmFOdno5WDlLSk5JY2ZCU3JJTWhBcGFwTUFmS1NPeGpuSjZWNnZNKzI5QWV3dUVYTkZSNDMyQnJMQ0RrMEIrQWhxUXJxcXVVY2Vsakc3d29SMDBxaFE3aTVPeGlLUmlCd1NJTWxKYlBNa0JxZG9vN1JEdU5meVpibHhUMVdaNlRiekxmYkJaNTNRWVFnbExlSVJQQkJCOWhQVEhIOW9MTWhRNXI1aXBERnd3TVJ3eFJlenJmekFBQUE9PVxcXCIpIGZvcm1hdChcXFwid29mZjJcXFwiKTtcXG59XFxuLmljb25mb250W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCcgIWltcG9ydGFudDtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuLmljb25yZWZyZXNoW2RhdGEtdi0wNGM1NWUyZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg3NCc7XFxufVxcbi5pY29uZW1wdHlbZGF0YS12LTA0YzU1ZTJmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFNkE2JztcXG59XFxuLmljb25jbG9zZVtkYXRhLXYtMDRjNTVlMmZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NDknO1xcbn1cXG4ucGFuZWxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB6LWluZGV4OiA5OTk5O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiA3MnB4O1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcXG4gIHBhZGRpbmctYm90dG9tOiAyMDBweDtcXG59XFxuLnBhbmVsIC5tYXNrW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHotaW5kZXg6IDEwMDE7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHRvcDogMDtcXG59XFxuLnBhbmVsIC5saXN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHotaW5kZXg6IDIwMDE7XFxuICAgIHBhZGRpbmc6IDAgMjBweDtcXG59XFxuLnBhbmVsIC5sYW5nW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHotaW5kZXg6IDIwMDI7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICAgIHBhZGRpbmc6IDIwcHggMzZweDtcXG59XFxuLnBhbmVsIC5sYW5nLWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI2ViZWRmMDtcXG4gICAgICBwYWRkaW5nOiAwIDEycHg7XFxufVxcbi5wYW5lbCAubGFuZy1pdGVtW2RhdGEtdi0wNGM1NWUyZl06Zmlyc3QtY2hpbGQge1xcbiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDtcXG59XFxuLnBhbmVsIC5sYW5nLWl0ZW0tYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICAgICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jb2xsLWl0ZW0tYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5saXN0LWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDE2cHggMTZweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWJlZGYwO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbiAgY29sb3I6ICM0YzQ5NDg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbn1cXG4ubGlzdC1pdGVtIC50eHRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIGZsZXg6IDE7XFxufVxcbi5pY29uLXdyYXBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcbi5wbHVzLWljb25bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMjFweDtcXG4gIGhlaWdodDogMjFweDtcXG4gIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xcbn1cXG4uYXJyb3ctaWNvbltkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHdpZHRoOiAyMXB4O1xcbiAgaGVpZ2h0OiAyMXB4O1xcbiAgYmFja2dyb3VuZDogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWhlYWQtcmlnaHQtYXJyb3cucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xcbn1cXG4ucGx1cy1pY29uLWFjdFtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMtYWN0LnBuZ1wiKSkgKyBcIikgbm8tcmVwZWF0IGNlbnRlcjtcXG59XFxuLmhpZGVbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var escape = __webpack_require__(/*! ../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-1badc801] {\\n background-repeat: no-repeat;\\n background-size: 100% 100%;\\n}\\n.fl[data-v-1badc801] {\\n display: flex;\\n}\\n.flc[data-v-1badc801] {\\n display: flex;\\n justify-content: center;\\n}\\n.flb[data-v-1badc801] {\\n display: flex;\\n justify-content: space-between;\\n}\\n.fla[data-v-1badc801] {\\n display: flex;\\n align-items: center;\\n}\\n.fcc[data-v-1badc801], .detail .txt[data-v-1badc801] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.bb[data-v-1badc801], .alert[data-v-1badc801], .ipt-wrap .ipt[data-v-1badc801], .banner-pc .btn-wrap .banner-btn[data-v-1badc801], .recommend-item[data-v-1badc801], .detail .txt[data-v-1badc801] {\\n box-sizing: border-box;\\n}\\n.fullp[data-v-1badc801] {\\n width: 100%;\\n height: 100%;\\n}\\n.pointer[data-v-1badc801], .banner-pc .btn-wrap .banner-btn[data-v-1badc801], .banner-mobile .btn-wrap .banner-btn[data-v-1badc801] {\\n cursor: pointer;\\n}\\n.text-l[data-v-1badc801] {\\n text-align: left;\\n}\\n.text-r[data-v-1badc801] {\\n text-align: right;\\n}\\n.text-c[data-v-1badc801] {\\n text-align: center;\\n}\\n.bc[data-v-1badc801] {\\n text-align: center;\\n}\\n.flex1[data-v-1badc801] {\\n flex: 1;\\n}\\n.disabled[data-v-1badc801] {\\n cursor: default !important;\\n color: #4c4948 !important;\\n background-color: #dcdddd !important;\\n background-image: none !important;\\n box-shadow: none !important;\\n}\\n.cOrange[data-v-1badc801] {\\n color: #f05a23;\\n}\\n.cGreen[data-v-1badc801] {\\n color: #006441;\\n}\\n.cGray[data-v-1badc801] {\\n color: #bfbfbf;\\n}\\n.cDark[data-v-1badc801] {\\n color: #dcdcdc;\\n}\\n.alert[data-v-1badc801] {\\n display: flex;\\n align-items: center;\\n position: relative;\\n width: 100%;\\n border-radius: 10px;\\n border: solid 1px #dcdddd;\\n background-color: #f2f2f2;\\n margin: 0 auto 12px;\\n padding: 6px 36px;\\n}\\n.alert .icon[data-v-1badc801] {\\n margin-right: 5px;\\n display: inline-block;\\n}\\n.alert .btn[data-v-1badc801] {\\n color: #f05a23;\\n}\\n.alert .close[data-v-1badc801] {\\n position: absolute;\\n right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-1badc801] {\\n width: 100%;\\n height: 4.5rem;\\n border-radius: 4.5rem;\\n border: solid 1px #dcdddd !important;\\n background-color: #ffffff;\\n padding: 0 2rem;\\n flex: 1;\\n letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-1badc801] {\\n position: absolute;\\n top: 2.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n width: 1rem;\\n height: .666667rem;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye[data-v-1badc801] {\\n position: absolute;\\n top: 1.2rem;\\n right: 2rem;\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n width: 27px;\\n height: 24px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-1badc801] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-1badc801]:focus {\\n border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-1badc801] {\\n border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-1badc801] {\\n width: 1rem !important;\\n height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-1badc801] {\\n background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-1badc801] {\\n padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n font-family: 'iconfont';\\n src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-1badc801] {\\n font-family: 'iconfont' !important;\\n font-size: 16px;\\n font-style: normal;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-1badc801]:before {\\n content: '\\\\E874';\\n}\\n.iconempty[data-v-1badc801]:before {\\n content: '\\\\E6A6';\\n}\\n.iconclose[data-v-1badc801]:before {\\n content: '\\\\E849';\\n}\\n.content[data-v-1badc801] {\\n padding-bottom: 2.25rem;\\n}\\n.top-space[data-v-1badc801] {\\n height: 2.25rem;\\n}\\n.box[data-v-1badc801] {\\n position: relative;\\n margin-top: 28px;\\n}\\n.banner-contaner[data-v-1badc801] {\\n width: 100%;\\n height: 470px;\\n margin: 0 auto;\\n position: relative;\\n z-index: 1;\\n overflow: hidden;\\n}\\n.banner-pc[data-v-1badc801] {\\n display: block;\\n position: absolute;\\n z-index: 1;\\n left: 50%;\\n margin-left: -960px;\\n top: 0;\\n width: 1920px;\\n height: 100%;\\n overflow: hidden;\\n}\\n.banner-pc .banner-img[data-v-1badc801] {\\n width: 100%;\\n height: 100%;\\n}\\n.banner-pc .btn-wrap[data-v-1badc801] {\\n position: absolute;\\n z-index: 1;\\n top: 295px;\\n right: 432px;\\n display: flex;\\n}\\n.banner-pc .btn-wrap .banner-btn[data-v-1badc801] {\\n width: 126px;\\n height: 48px;\\n line-height: 48px;\\n font-size: 16px;\\n border-radius: 48px;\\n text-align: center;\\n color: #ffffff;\\n background-color: #f05a23;\\n box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2);\\n background-blend-mode: soft-light;\\n background-image: linear-gradient(to bottom, #ec6429, #ec6429), linear-gradient(to top, #000000, #ffffff);\\n width: auto;\\n padding: 0 24px;\\n min-width: 126px;\\n margin-left: 12px;\\n background-image: none;\\n}\\n.banner-mobile[data-v-1badc801] {\\n display: none;\\n}\\n.banner-mobile .banner-img[data-v-1badc801] {\\n width: 100%;\\n}\\n.banner-mobile .btn-wrap[data-v-1badc801] {\\n position: absolute;\\n z-index: 1;\\n top: 87%;\\n left: 0;\\n right: 0;\\n margin: 0 auto;\\n display: flex;\\n justify-content: center;\\n}\\n.banner-mobile .btn-wrap .banner-btn[data-v-1badc801] {\\n padding: 0 12px;\\n color: #f05a23;\\n}\\n.recommend[data-v-1badc801] {\\n display: flex;\\n text-align: center;\\n justify-content: space-between;\\n flex-wrap: wrap;\\n}\\n.recommend-item[data-v-1badc801] {\\n margin-right: 10px;\\n position: relative;\\n width: 24.25rem;\\n height: 32.75rem;\\n border-radius: 5px;\\n background-color: #fbfbfb;\\n}\\n.recommend-item[data-v-1badc801]:last-child {\\n margin-right: 0;\\n}\\n.recommend-item .img[data-v-1badc801] {\\n width: 100%;\\n height: 24.25rem;\\n background-size: cover;\\n}\\n.recommend-item .img1[data-v-1badc801] {\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-1.png */ \"./src/assets/images/index/recommend-1.png\")) + \") no-repeat center;\\n background-size: cover;\\n}\\n.recommend-item .img2[data-v-1badc801] {\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-2.png */ \"./src/assets/images/index/recommend-2.png\")) + \") no-repeat center;\\n background-size: cover;\\n}\\n.recommend-item .img3[data-v-1badc801] {\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-3.png */ \"./src/assets/images/index/recommend-3.png\")) + \") no-repeat center;\\n background-size: cover;\\n}\\n.recommend-item .img4[data-v-1badc801] {\\n background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-4.png */ \"./src/assets/images/index/recommend-4.png\")) + \") no-repeat center;\\n background-size: cover;\\n}\\n.recommend-item .btn[data-v-1badc801] {\\n position: absolute;\\n left: 0;\\n right: 0;\\n bottom: 3rem;\\n margin: 0 auto;\\n width: 13.5rem;\\n height: 4rem;\\n line-height: 4rem;\\n font-size: 16px;\\n border-radius: 4rem;\\n text-align: center;\\n color: #ffffff;\\n background-color: #f05a23;\\n box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2);\\n background-blend-mode: soft-light;\\n background-image: linear-gradient(to bottom, #ec6429, #ec6429), linear-gradient(to top, #000000, #ffffff);\\n}\\n.recommend-item img[data-v-1badc801] {\\n width: 100%;\\n border-top-right-radius: 8px;\\n border-top-left-radius: 8px;\\n}\\n.recommend-item[data-v-1badc801]:first-child {\\n padding-left: 0;\\n}\\n.recommend-item[data-v-1badc801]:last-child {\\n padding-right: 0;\\n}\\n.detail[data-v-1badc801] {\\n display: flex;\\n max-width: 1200px;\\n}\\n.detail .txt[data-v-1badc801] {\\n position: relative;\\n display: -webkit-box;\\n word-break: break-all;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 14;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n padding-left: 2.166667rem;\\n flex: 1;\\n line-height: 2.3;\\n letter-spacing: 1.4px;\\n}\\n.swiper-button-prev[data-v-1badc801] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/button-prev.png */ \"./src/assets/images/common/button-prev.png\")) + \");\\n left: 360px;\\n}\\n.swiper-button-next[data-v-1badc801] {\\n background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/button-next.png */ \"./src/assets/images/common/button-next.png\")) + \");\\n right: 360px;\\n}\\n.swiper-pagination-fraction[data-v-1badc801],\\n.swiper-pagination-custom[data-v-1badc801],\\n.swiper-container-horizontal > .swiper-pagination-bullets[data-v-1badc801] {\\n bottom: 48px;\\n}\\n.swiper-pagination-bullet[data-v-1badc801] {\\n width: 12px;\\n height: 12px;\\n background-color: #dcdddd;\\n}\\n.swiper-pagination-bullet-active[data-v-1badc801] {\\n width: 12px;\\n height: 12px;\\n background-color: #f05a23;\\n}\\n.box-shadow[data-v-1badc801], .recommend-item[data-v-1badc801] {\\n box-shadow: 0 0 1.5rem 0 rgba(255, 87, 0, 0.15);\\n}\\n@media (max-width: 1200px) {\\n.content[data-v-1badc801] {\\n box-sizing: border-box;\\n padding: 0 4%;\\n}\\n.recommend[data-v-1badc801] {\\n justify-content: center;\\n}\\n.recommend-item[data-v-1badc801] {\\n width: 46% !important;\\n padding: 0 !important;\\n margin: 2% !important;\\n}\\n.detail[data-v-1badc801] {\\n display: block;\\n}\\n.detail .vjs-custom-skin[data-v-1badc801] {\\n width: 100%;\\n}\\n.detail .txt[data-v-1badc801] {\\n padding: 0;\\n margin: 10px 0 28px;\\n}\\n}\\n@media (max-width: 768px) {\\n.banner-contaner[data-v-1badc801] {\\n height: auto;\\n}\\n.banner-pc[data-v-1badc801] {\\n display: none;\\n}\\n.banner-mobile[data-v-1badc801] {\\n display: block;\\n}\\n.recommend-item[data-v-1badc801] {\\n width: 100% !important;\\n margin: 10px auto !important;\\n}\\n.box-shadow[data-v-1badc801], .recommend-item[data-v-1badc801] {\\n box-shadow: none;\\n}\\n.swiper-pagination-fraction[data-v-1badc801],\\n .swiper-pagination-custom[data-v-1badc801],\\n .swiper-container-horizontal > .swiper-pagination-bullets[data-v-1badc801] {\\n bottom: 2px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MDQ1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTFiYWRjODAxXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi0xYmFkYzgwMV0sIC5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5iYltkYXRhLXYtMWJhZGM4MDFdLCAuYWxlcnRbZGF0YS12LTFiYWRjODAxXSwgLmlwdC13cmFwIC5pcHRbZGF0YS12LTFiYWRjODAxXSwgLmJhbm5lci1wYyAuYnRuLXdyYXAgLmJhbm5lci1idG5bZGF0YS12LTFiYWRjODAxXSwgLnJlY29tbWVuZC1pdGVtW2RhdGEtdi0xYmFkYzgwMV0sIC5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtMWJhZGM4MDFdLCAuYmFubmVyLXBjIC5idG4td3JhcCAuYmFubmVyLWJ0bltkYXRhLXYtMWJhZGM4MDFdLCAuYmFubmVyLW1vYmlsZSAuYnRuLXdyYXAgLmJhbm5lci1idG5bZGF0YS12LTFiYWRjODAxXSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi50ZXh0LWxbZGF0YS12LTFiYWRjODAxXSB7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG4udGV4dC1yW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxufVxcbi50ZXh0LWNbZGF0YS12LTFiYWRjODAxXSB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5iY1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmZsZXgxW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZmxleDogMTtcXG59XFxuLmRpc2FibGVkW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XFxuICBjb2xvcjogIzRjNDk0OCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4uY09yYW5nZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uY0dyZWVuW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgY29sb3I6ICMwMDY0NDE7XFxufVxcbi5jR3JheVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbn1cXG4uY0RhcmtbZGF0YS12LTFiYWRjODAxXSB7XFxuICBjb2xvcjogI2RjZGNkYztcXG59XFxuLmFsZXJ0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICBib3JkZXI6IHNvbGlkIDFweCAjZGNkZGRkO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjtcXG4gIG1hcmdpbjogMCBhdXRvIDEycHg7XFxuICBwYWRkaW5nOiA2cHggMzZweDtcXG59XFxuLmFsZXJ0IC5pY29uW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uYWxlcnQgLmJ0bltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5hbGVydCAuY2xvc2VbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDE3cHg7XFxufVxcbi5pcHQtd3JhcCAuaXB0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQuNXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDQuNXJlbTtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBwYWRkaW5nOiAwIDJyZW07XFxuICBmbGV4OiAxO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMXJlbTtcXG59XFxuLmlwdC13cmFwIC5kb3duLWFycm93W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAyLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9kb3duLWFycm93LnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMXJlbTtcXG4gIGhlaWdodDogLjY2NjY2N3JlbTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMS4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDI3cHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWUtYWN0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vbi5wbmdcIikpICsgXCIpO1xcbn1cXG4uaXB0W2RhdGEtdi0xYmFkYzgwMV06Zm9jdXMge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5pcHQuZXJyW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRbZGF0YS12LTFiYWRjODAxXSB7XFxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYmFja2dyb3VuZDogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4uYWxlcnRbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIHBhZGRpbmc6IDRweCAzNnB4IDRweCAxMnB4O1xcbn1cXG59XFxuXFxuLyog5Zu+54mH5a2X5L2TICovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JztcXG4gIHNyYzogdXJsKFxcXCJkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQVNFQUFzQUFBQUFDU0FBQUFRM0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSEVJR1ZnQ0RTQXFGR0lRbkFUWUNKQU1ZQ3c0QUJDQUZoRzBIVkJ2WkJ4R1ZuTnZJZmh6WURWK0JBZTl3dEppR09OVEdZdUhCWi9PaDc3UTNPeHVwSXRPZUZGVGNRanBSWHdLK0FJYm4wOG5lNzY2WHBwc2l3UktQa3NRVGo3QU80eEFPdjNmT0Fkc0pjMEtOWk8zSW84OUxmOEs5QmtZK2NlKzRkZjREbXMreVhNYWNOTmJFQU9PQUF0cmJGMW1CeEFscXkvRHE4dXF3cmdNQmlQR0FENGc2ZGJnR1FoU3NlUVJBS3N0SzhpRk1tRkFWQk1IU2RzRldGcGtOSGhZemhia0VZSmIzZWZJR1FVUUlEQ2FGdFhRMGwxS0VoT2ZLVitHMDE5QXJ5N0dnYnpnSEFHRVhVSUFQQUJaSVo2R3JHVFNJK29CaWE3L0E0Z1ZBaW9XQmVxNTh2dkhsa0plTnI4SU5CaEl5eTBkd3dWOGVzSmc0TUJBZ2ZHQ1ZsS1VOai9IZ3VaSWF3R3JxalpnTFBIZzV4QUNLMVkyWUN3eThDcGRjbG80L1lJTUljQkxBTlpoOVlHa0lQSHRhMk5vclRLeFVTbFVOVjdLb3oyenN3bzBtUmZOTlJzOWZiRnE4WUpyNXVFWExXbzdjRWQrNnBibDlXM3Yzcmo0Zzd0elJwVSs3SGF1UjBZYm1KMitkYWxMRUxaeTZ1ZGUwdUdoKzc1WnA1aVhGQ3haTVcyUSswSVFPS3NhN1NNSklLSDE4aDN5OWhXWSttTjR0RXRXMGJZVDJtZW1XcGsxZGI3TDgxdFE3ZGdzM2lzVWJ0MXJybDBrVTB5eTFTemE3WkN3MG00bENJekZNRjJ3dzE1K1FwMXU0M3NSay9oSlQ3WUpONXVhTGx1b2xQWlNUdnExbTR2bWJnUjd2ZU0xMTZPakJHcDJLMjFvTWJrUkdudnFnbG5DTFZoYXJ1QU02Z2wrdG9UTllQWnM1ZG95WkRYeUhieC9SU3ZaTXQ2dE50eDdSbHprV2xjeXNXUXlTVjJJK1BpbzAwOE5wOG1RdkwvajBDRVZMTElJdGxvaUVJUElGbkNCRE43WnBDNm4zaS9lckUwdVhJQ1QvdCsyNjlyVnJqeDRkZSt3cnd5bmZqbzFCYU4vdFhRbXpKM3dJRjlrcmdoVUhxTjFlRkI0Zk12dUNST3JudlZ3ZGtVZVdMZmYyazcwSWlPOGZzMnlPYWJYcEhIZGx2WCtBNXJtSzZkeDRwaVhsYkh1bmliK2lOZVZNK1VuWEZ2V1pqUjJ1bGVWRi9qc2JLMTJ3bzhPV0RwWStUUkgwalA4c3lMczBXSWxPQUlEaEZIT1ArZ0lBMVRGM2tDT0JPY2JhajlGamdZQ0o5N0NFRnZ3dDM1R2ZLWjJZcTRqNUppR1VzQUMrSnV1N3NhU1phdkRLMVdncy9qZWFhZ0IvUTBXVXN1WXV0VE9kSUtEbG1UTGhBVGEwM01za04wK0cwdDF2Y2p5RVRDTU1Bclk0Q0xtUWl1YURTU0lFVFNnZW03ZEJ1MC9HNm8yUkVnR2VKaUFRU3J2QWtEc0tTdWt5aWFVOUJvK1pkK0JUWmd3eFhkWkhTcmpGcm80Wm9xS2xnaitWU2U0VXNkYVZYM2lEZmdlUjQxS1A4VUl1TmtDQmZnSHB4QlVkOGhBckdqNzYwRmdWY1pranBhTGJFQUpUYldZSFdUZWx0ZmFOdno5WDlLSk5JY2ZCU3JJTWhBcGFwTUFmS1NPeGpuSjZWNnZNKzI5QWV3dUVYTkZSNDMyQnJMQ0RrMEIrQWhxUXJxcXVVY2Vsakc3d29SMDBxaFE3aTVPeGlLUmlCd1NJTWxKYlBNa0JxZG9vN1JEdU5meVpibHhUMVdaNlRiekxmYkJaNTNRWVFnbExlSVJQQkJCOWhQVEhIOW9MTWhRNXI1aXBERnd3TVJ3eFJlenJmekFBQUE9PVxcXCIpIGZvcm1hdChcXFwid29mZjJcXFwiKTtcXG59XFxuLmljb25mb250W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCcgIWltcG9ydGFudDtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuLmljb25yZWZyZXNoW2RhdGEtdi0xYmFkYzgwMV06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg3NCc7XFxufVxcbi5pY29uZW1wdHlbZGF0YS12LTFiYWRjODAxXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFNkE2JztcXG59XFxuLmljb25jbG9zZVtkYXRhLXYtMWJhZGM4MDFdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NDknO1xcbn1cXG4uY29udGVudFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHBhZGRpbmctYm90dG9tOiAyLjI1cmVtO1xcbn1cXG4udG9wLXNwYWNlW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgaGVpZ2h0OiAyLjI1cmVtO1xcbn1cXG4uYm94W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbWFyZ2luLXRvcDogMjhweDtcXG59XFxuLmJhbm5lci1jb250YW5lcltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA0NzBweDtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgei1pbmRleDogMTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5iYW5uZXItcGNbZGF0YS12LTFiYWRjODAxXSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHotaW5kZXg6IDE7XFxuICBsZWZ0OiA1MCU7XFxuICBtYXJnaW4tbGVmdDogLTk2MHB4O1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDE5MjBweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5iYW5uZXItcGMgLmJhbm5lci1pbWdbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxufVxcbi5iYW5uZXItcGMgLmJ0bi13cmFwW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHotaW5kZXg6IDE7XFxuICAgIHRvcDogMjk1cHg7XFxuICAgIHJpZ2h0OiA0MzJweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG59XFxuLmJhbm5lci1wYyAuYnRuLXdyYXAgLmJhbm5lci1idG5bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgd2lkdGg6IDEyNnB4O1xcbiAgICAgIGhlaWdodDogNDhweDtcXG4gICAgICBsaW5lLWhlaWdodDogNDhweDtcXG4gICAgICBmb250LXNpemU6IDE2cHg7XFxuICAgICAgYm9yZGVyLXJhZGl1czogNDhweDtcXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgY29sb3I6ICNmZmZmZmY7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwNWEyMztcXG4gICAgICBib3gtc2hhZG93OiAwcHggMTBweCAxM3B4IDAgcmdiYSgyMzYsIDEwMCwgNDEsIDAuMik7XFxuICAgICAgYmFja2dyb3VuZC1ibGVuZC1tb2RlOiBzb2Z0LWxpZ2h0O1xcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlYzY0MjksICNlYzY0MjkpLCBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCAjMDAwMDAwLCAjZmZmZmZmKTtcXG4gICAgICB3aWR0aDogYXV0bztcXG4gICAgICBwYWRkaW5nOiAwIDI0cHg7XFxuICAgICAgbWluLXdpZHRoOiAxMjZweDtcXG4gICAgICBtYXJnaW4tbGVmdDogMTJweDtcXG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbn1cXG4uYmFubmVyLW1vYmlsZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5iYW5uZXItbW9iaWxlIC5iYW5uZXItaW1nW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuLmJhbm5lci1tb2JpbGUgLmJ0bi13cmFwW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHotaW5kZXg6IDE7XFxuICAgIHRvcDogODclO1xcbiAgICBsZWZ0OiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgbWFyZ2luOiAwIGF1dG87XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uYmFubmVyLW1vYmlsZSAuYnRuLXdyYXAgLmJhbm5lci1idG5bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgcGFkZGluZzogMCAxMnB4O1xcbiAgICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4ucmVjb21tZW5kW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG59XFxuLnJlY29tbWVuZC1pdGVtW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDI0LjI1cmVtO1xcbiAgICBoZWlnaHQ6IDMyLjc1cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmYmZiZmI7XFxufVxcbi5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdOmxhc3QtY2hpbGQge1xcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcXG59XFxuLnJlY29tbWVuZC1pdGVtIC5pbWdbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgd2lkdGg6IDEwMCU7XFxuICAgICAgaGVpZ2h0OiAyNC4yNXJlbTtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW0gLmltZzFbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgYmFja2dyb3VuZDogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvcmVjb21tZW5kLTEucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XFxufVxcbi5yZWNvbW1lbmQtaXRlbSAuaW1nMltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICBiYWNrZ3JvdW5kOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMi5wbmdcIikpICsgXCIpIG5vLXJlcGVhdCBjZW50ZXI7XFxuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcXG59XFxuLnJlY29tbWVuZC1pdGVtIC5pbWczW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2luZGV4L3JlY29tbWVuZC0zLnBuZ1wiKSkgKyBcIikgbm8tcmVwZWF0IGNlbnRlcjtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW0gLmltZzRbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgYmFja2dyb3VuZDogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvcmVjb21tZW5kLTQucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XFxufVxcbi5yZWNvbW1lbmQtaXRlbSAuYnRuW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgICBsZWZ0OiAwO1xcbiAgICAgIHJpZ2h0OiAwO1xcbiAgICAgIGJvdHRvbTogM3JlbTtcXG4gICAgICBtYXJnaW46IDAgYXV0bztcXG4gICAgICB3aWR0aDogMTMuNXJlbTtcXG4gICAgICBoZWlnaHQ6IDRyZW07XFxuICAgICAgbGluZS1oZWlnaHQ6IDRyZW07XFxuICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRyZW07XFxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMDVhMjM7XFxuICAgICAgYm94LXNoYWRvdzogMHB4IDEwcHggMTNweCAwIHJnYmEoMjM2LCAxMDAsIDQxLCAwLjIpO1xcbiAgICAgIGJhY2tncm91bmQtYmxlbmQtbW9kZTogc29mdC1saWdodDtcXG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZWM2NDI5LCAjZWM2NDI5KSwgbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgIzAwMDAwMCwgI2ZmZmZmZik7XFxufVxcbi5yZWNvbW1lbmQtaXRlbSBpbWdbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgd2lkdGg6IDEwMCU7XFxuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDtcXG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA4cHg7XFxufVxcbi5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdOmZpcnN0LWNoaWxkIHtcXG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XFxufVxcbi5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdOmxhc3QtY2hpbGQge1xcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XFxufVxcbi5kZXRhaWxbZGF0YS12LTFiYWRjODAxXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxufVxcbi5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgd29yZC1icmVhazogYnJlYWstYWxsO1xcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcbiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDE0O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gICAgcGFkZGluZy1sZWZ0OiAyLjE2NjY2N3JlbTtcXG4gICAgZmxleDogMTtcXG4gICAgbGluZS1oZWlnaHQ6IDIuMztcXG4gICAgbGV0dGVyLXNwYWNpbmc6IDEuNHB4O1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1wcmV2W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2J1dHRvbi1wcmV2LnBuZ1wiKSkgKyBcIik7XFxuICBsZWZ0OiAzNjBweDtcXG59XFxuLnN3aXBlci1idXR0b24tbmV4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9idXR0b24tbmV4dC5wbmdcIikpICsgXCIpO1xcbiAgcmlnaHQ6IDM2MHB4O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tZnJhY3Rpb25bZGF0YS12LTFiYWRjODAxXSxcXG4uc3dpcGVyLXBhZ2luYXRpb24tY3VzdG9tW2RhdGEtdi0xYmFkYzgwMV0sXFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYm90dG9tOiA0OHB4O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgd2lkdGg6IDEycHg7XFxuICBoZWlnaHQ6IDEycHg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxMnB4O1xcbiAgaGVpZ2h0OiAxMnB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwNWEyMztcXG59XFxuLmJveC1zaGFkb3dbZGF0YS12LTFiYWRjODAxXSwgLnJlY29tbWVuZC1pdGVtW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYm94LXNoYWRvdzogMCAwIDEuNXJlbSAwIHJnYmEoMjU1LCA4NywgMCwgMC4xNSk7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiAxMjAwcHgpIHtcXG4uY29udGVudFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcGFkZGluZzogMCA0JTtcXG59XFxuLnJlY29tbWVuZFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICB3aWR0aDogNDYlICFpbXBvcnRhbnQ7XFxuICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICAgIG1hcmdpbjogMiUgIWltcG9ydGFudDtcXG59XFxuLmRldGFpbFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5kZXRhaWwgLnZqcy1jdXN0b20tc2tpbltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG59XFxuLmRldGFpbCAudHh0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgbWFyZ2luOiAxMHB4IDAgMjhweDtcXG59XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5iYW5uZXItY29udGFuZXJbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGhlaWdodDogYXV0bztcXG59XFxuLmJhbm5lci1wY1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuLmJhbm5lci1tb2JpbGVbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbjogMTBweCBhdXRvICFpbXBvcnRhbnQ7XFxufVxcbi5ib3gtc2hhZG93W2RhdGEtdi0xYmFkYzgwMV0sIC5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgYm94LXNoYWRvdzogbm9uZTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWZyYWN0aW9uW2RhdGEtdi0xYmFkYzgwMV0sXFxuICAuc3dpcGVyLXBhZ2luYXRpb24tY3VzdG9tW2RhdGEtdi0xYmFkYzgwMV0sXFxuICAuc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHNbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGJvdHRvbTogMnB4O1xcbn1cXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js":
/*!*******************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanM/NjkwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odXNlU291cmNlTWFwKSB7XG5cdHZhciBsaXN0ID0gW107XG5cblx0Ly8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHR2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKTtcblx0XHRcdGlmKGl0ZW1bMl0pIHtcblx0XHRcdFx0cmV0dXJuIFwiQG1lZGlhIFwiICsgaXRlbVsyXSArIFwie1wiICsgY29udGVudCArIFwifVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0fSkuam9pbihcIlwiKTtcblx0fTtcblxuXHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuXHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG5cdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XG5cdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcblx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcblx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuXHRcdH1cblx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XG5cdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXG5cdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xuXHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cblx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXG5cdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuXHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XG5cdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBsaXN0O1xufTtcblxuZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApIHtcblx0dmFyIGNvbnRlbnQgPSBpdGVtWzFdIHx8ICcnO1xuXHR2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cdGlmICghY3NzTWFwcGluZykge1xuXHRcdHJldHVybiBjb250ZW50O1xuXHR9XG5cblx0aWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuXHRcdHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG5cdFx0XHRyZXR1cm4gJy8qIyBzb3VyY2VVUkw9JyArIGNzc01hcHBpbmcuc291cmNlUm9vdCArIHNvdXJjZSArICcgKi8nXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHJldHVybiBbY29udGVudF0uam9pbignXFxuJyk7XG59XG5cbi8vIEFkYXB0ZWQgZnJvbSBjb252ZXJ0LXNvdXJjZS1tYXAgKE1JVClcbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cdHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuXHR2YXIgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYmFzZTY0O1xuXG5cdHJldHVybiAnLyojICcgKyBkYXRhICsgJyAqLyc7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\n");
/***/ }),
/***/ "./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js":
/*!*********************************************************************!*\
!*** ./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = function escape(url) {\n if (typeof url !== 'string') {\n return url\n }\n // If url is already wrapped in quotes, remove them\n if (/^['\"].*['\"]$/.test(url)) {\n url = url.slice(1, -1);\n }\n // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n if (/[\"'() \\t\\n]/.test(url)) {\n return '\"' + url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n') + '\"'\n }\n\n return url\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvdXJsL2VzY2FwZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzPzU0NTQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlc2NhcGUodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICB9XG4gICAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gICAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgICAvLyBTZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuICAgIGlmICgvW1wiJygpIFxcdFxcbl0vLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csICdcXFxcbicpICsgJ1wiJ1xuICAgIH1cblxuICAgIHJldHVybiB1cmxcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\n");
/***/ }),
/***/ "./node_modules/_deep-equal@1.1.0@deep-equal/index.js":
/*!************************************************************!*\
!*** ./node_modules/_deep-equal@1.1.0@deep-equal/index.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var objectKeys = __webpack_require__(/*! object-keys */ \"./node_modules/_object-keys@1.1.1@object-keys/index.js\");\nvar isArguments = __webpack_require__(/*! is-arguments */ \"./node_modules/_is-arguments@1.0.4@is-arguments/index.js\");\nvar is = __webpack_require__(/*! object-is */ \"./node_modules/_object-is@1.0.1@object-is/index.js\");\nvar isRegex = __webpack_require__(/*! is-regex */ \"./node_modules/_is-regex@1.0.4@is-regex/index.js\");\nvar flags = __webpack_require__(/*! regexp.prototype.flags */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js\");\nvar isDate = __webpack_require__(/*! is-date-object */ \"./node_modules/_is-date-object@1.0.1@is-date-object/index.js\");\n\nvar getTime = Date.prototype.getTime;\n\nfunction deepEqual(actual, expected, options) {\n var opts = options || {};\n\n // 7.1. All identical values are equivalent, as determined by ===.\n if (opts.strict ? is(actual, expected) : actual === expected) {\n return true;\n }\n\n // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.\n if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {\n return opts.strict ? is(actual, expected) : actual == expected;\n }\n\n /*\n * 7.4. For all other Object pairs, including Array objects, equivalence is\n * determined by having the same number of owned properties (as verified\n * with Object.prototype.hasOwnProperty.call), the same set of keys\n * (although not necessarily the same order), equivalent values for every\n * corresponding key, and an identical 'prototype' property. Note: this\n * accounts for both named and indexed properties on Arrays.\n */\n // eslint-disable-next-line no-use-before-define\n return objEquiv(actual, expected, opts);\n}\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer(x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') {\n return false;\n }\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') {\n return false;\n }\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n /* eslint max-statements: [2, 50] */\n var i, key;\n if (typeof a !== typeof b) { return false; }\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }\n\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) { return false; }\n\n if (isArguments(a) !== isArguments(b)) { return false; }\n\n var aIsRegex = isRegex(a);\n var bIsRegex = isRegex(b);\n if (aIsRegex !== bIsRegex) { return false; }\n if (aIsRegex || bIsRegex) {\n return a.source === b.source && flags(a) === flags(b);\n }\n\n if (isDate(a) && isDate(b)) {\n return getTime.call(a) === getTime.call(b);\n }\n\n var aIsBuffer = isBuffer(a);\n var bIsBuffer = isBuffer(b);\n if (aIsBuffer !== bIsBuffer) { return false; }\n if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here\n if (a.length !== b.length) { return false; }\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) { return false; }\n }\n return true;\n }\n\n if (typeof a !== typeof b) { return false; }\n\n try {\n var ka = objectKeys(a);\n var kb = objectKeys(b);\n } catch (e) { // happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates hasOwnProperty)\n if (ka.length !== kb.length) { return false; }\n\n // the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n // ~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i]) { return false; }\n }\n // equivalent values for every corresponding key, and ~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) { return false; }\n }\n\n return true;\n}\n\nmodule.exports = deepEqual;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2RlZXAtZXF1YWxAMS4xLjBAZGVlcC1lcXVhbC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZGVlcC1lcXVhbEAxLjEuMEBkZWVwLWVxdWFsL2luZGV4LmpzPzUxMzEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnaXMtYXJndW1lbnRzJyk7XG52YXIgaXMgPSByZXF1aXJlKCdvYmplY3QtaXMnKTtcbnZhciBpc1JlZ2V4ID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcbnZhciBmbGFncyA9IHJlcXVpcmUoJ3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MnKTtcbnZhciBpc0RhdGUgPSByZXF1aXJlKCdpcy1kYXRlLW9iamVjdCcpO1xuXG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKG9wdHMuc3RyaWN0ID8gaXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyA3LjMuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCAodHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBpcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PSBleHBlY3RlZDtcbiAgfVxuXG4gIC8qXG4gICAqIDcuNC4gRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgICogd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAgKiAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gICAqIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gICAqIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHgpIHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgeC5sZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeC5jb3B5ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4LnNsaWNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHhbMF0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBvcHRzKSB7XG4gIC8qIGVzbGludCBtYXgtc3RhdGVtZW50czogWzIsIDUwXSAqL1xuICB2YXIgaSwga2V5O1xuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmIChpc0FyZ3VtZW50cyhhKSAhPT0gaXNBcmd1bWVudHMoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgdmFyIGFJc1JlZ2V4ID0gaXNSZWdleChhKTtcbiAgdmFyIGJJc1JlZ2V4ID0gaXNSZWdleChiKTtcbiAgaWYgKGFJc1JlZ2V4ICE9PSBiSXNSZWdleCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGFJc1JlZ2V4IHx8IGJJc1JlZ2V4KSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBmbGFncyhhKSA9PT0gZmxhZ3MoYik7XG4gIH1cblxuICBpZiAoaXNEYXRlKGEpICYmIGlzRGF0ZShiKSkge1xuICAgIHJldHVybiBnZXRUaW1lLmNhbGwoYSkgPT09IGdldFRpbWUuY2FsbChiKTtcbiAgfVxuXG4gIHZhciBhSXNCdWZmZXIgPSBpc0J1ZmZlcihhKTtcbiAgdmFyIGJJc0J1ZmZlciA9IGlzQnVmZmVyKGIpO1xuICBpZiAoYUlzQnVmZmVyICE9PSBiSXNCdWZmZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNCdWZmZXIgfHwgYklzQnVmZmVyKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgeyByZXR1cm4gZmFsc2U7IH1cblxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gICAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgeyAvLyBoYXBwZW5zIHdoZW4gb25lIGlzIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHRoZSBvdGhlciBpc24ndFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvLyB+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuICAvLyBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZCB+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIG9wdHMpKSB7IHJldHVybiBmYWxzZTsgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_deep-equal@1.1.0@deep-equal/index.js\n");
/***/ }),
/***/ "./node_modules/_define-properties@1.1.3@define-properties/index.js":
/*!**************************************************************************!*\
!*** ./node_modules/_define-properties@1.1.3@define-properties/index.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar keys = __webpack_require__(/*! object-keys */ \"./node_modules/_object-keys@1.1.1@object-keys/index.js\");\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\torigDefineProperty(obj, 'x', { enumerable: false, value: obj });\n\t\t// eslint-disable-next-line no-unused-vars, no-restricted-syntax\n\t\tfor (var _ in obj) { // jscs:ignore disallowUnusedVariables\n\t\t\treturn false;\n\t\t}\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2RlZmluZS1wcm9wZXJ0aWVzQDEuMS4zQGRlZmluZS1wcm9wZXJ0aWVzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19kZWZpbmUtcHJvcGVydGllc0AxLjEuM0BkZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcz9jODkyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2woJ2ZvbycpID09PSAnc3ltYm9sJztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyIG9yaWdEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2JqID0ge307XG5cdHRyeSB7XG5cdFx0b3JpZ0RlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqIH0pO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0XHRmb3IgKHZhciBfIGluIG9iaikgeyAvLyBqc2NzOmlnbm9yZSBkaXNhbGxvd1VudXNlZFZhcmlhYmxlc1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gb2JqLnggPT09IG9iajtcblx0fSBjYXRjaCAoZSkgeyAvKiB0aGlzIGlzIElFIDguICovXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSBvcmlnRGVmaW5lUHJvcGVydHkgJiYgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCgpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCB2YWx1ZSwgcHJlZGljYXRlKSB7XG5cdGlmIChuYW1lIGluIG9iamVjdCAmJiAoIWlzRnVuY3Rpb24ocHJlZGljYXRlKSB8fCAhcHJlZGljYXRlKCkpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG5cdFx0b3JpZ0RlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9iamVjdFtuYW1lXSA9IHZhbHVlO1xuXHR9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmplY3QsIG1hcCkge1xuXHR2YXIgcHJlZGljYXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDoge307XG5cdHZhciBwcm9wcyA9IGtleXMobWFwKTtcblx0aWYgKGhhc1N5bWJvbHMpIHtcblx0XHRwcm9wcyA9IGNvbmNhdC5jYWxsKHByb3BzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1hcCkpO1xuXHR9XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BzW2ldLCBtYXBbcHJvcHNbaV1dLCBwcmVkaWNhdGVzW3Byb3BzW2ldXSk7XG5cdH1cbn07XG5cbmRlZmluZVByb3BlcnRpZXMuc3VwcG9ydHNEZXNjcmlwdG9ycyA9ICEhc3VwcG9ydHNEZXNjcmlwdG9ycztcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0aWVzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_define-properties@1.1.3@define-properties/index.js\n");
/***/ }),
/***/ "./node_modules/_function-bind@1.1.1@function-bind/implementation.js":
/*!***************************************************************************!*\
!*** ./node_modules/_function-bind@1.1.1@function-bind/implementation.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Z1bmN0aW9uLWJpbmRAMS4xLjFAZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZnVuY3Rpb24tYmluZEAxLjEuMUBmdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzP2E5NWYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmNhbGwodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IE1hdGgubWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3MucHVzaCgnJCcgKyBpKTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYm91bmRBcmdzLmpvaW4oJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_function-bind@1.1.1@function-bind/implementation.js\n");
/***/ }),
/***/ "./node_modules/_function-bind@1.1.1@function-bind/index.js":
/*!******************************************************************!*\
!*** ./node_modules/_function-bind@1.1.1@function-bind/index.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_function-bind@1.1.1@function-bind/implementation.js\");\n\nmodule.exports = Function.prototype.bind || implementation;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Z1bmN0aW9uLWJpbmRAMS4xLjFAZnVuY3Rpb24tYmluZC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZnVuY3Rpb24tYmluZEAxLjEuMUBmdW5jdGlvbi1iaW5kL2luZGV4LmpzPzNjZWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_function-bind@1.1.1@function-bind/index.js\n");
/***/ }),
/***/ "./node_modules/_global@4.3.2@global/document.js":
/*!*******************************************************!*\
!*** ./node_modules/_global@4.3.2@global/document.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/* WEBPACK VAR INJECTION */(function(global) {var topLevel = typeof global !== 'undefined' ? global :\n typeof window !== 'undefined' ? window : {}\nvar minDoc = __webpack_require__(/*! min-document */ 1);\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n doccy = document;\n} else {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n if (!doccy) {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n }\n}\n\nmodule.exports = doccy;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvZG9jdW1lbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvZG9jdW1lbnQuanM/MDMzNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG52YXIgZG9jY3k7XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZG9jY3kgPSBkb2N1bWVudDtcbn0gZWxzZSB7XG4gICAgZG9jY3kgPSB0b3BMZXZlbFsnX19HTE9CQUxfRE9DVU1FTlRfQ0FDSEVANCddO1xuXG4gICAgaWYgKCFkb2NjeSkge1xuICAgICAgICBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J10gPSBtaW5Eb2M7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_global@4.3.2@global/document.js\n");
/***/ }),
/***/ "./node_modules/_global@4.3.2@global/window.js":
/*!*****************************************************!*\
!*** ./node_modules/_global@4.3.2@global/window.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/* WEBPACK VAR INJECTION */(function(global) {var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvd2luZG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19nbG9iYWxANC4zLjJAZ2xvYmFsL3dpbmRvdy5qcz9lY2RjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgd2luID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgd2luID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2luO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_global@4.3.2@global/window.js\n");
/***/ }),
/***/ "./node_modules/_global@4.4.0@global/window.js":
/*!*****************************************************!*\
!*** ./node_modules/_global@4.4.0@global/window.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/* WEBPACK VAR INJECTION */(function(global) {var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjQuMEBnbG9iYWwvd2luZG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19nbG9iYWxANC40LjBAZ2xvYmFsL3dpbmRvdy5qcz82YTlmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgd2luID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgd2luID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2luO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_global@4.4.0@global/window.js\n");
/***/ }),
/***/ "./node_modules/_has@1.0.3@has/src/index.js":
/*!**************************************************!*\
!*** ./node_modules/_has@1.0.3@has/src/index.js ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar bind = __webpack_require__(/*! function-bind */ \"./node_modules/_function-bind@1.1.1@function-bind/index.js\");\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2hhc0AxLjAuM0BoYXMvc3JjL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19oYXNAMS4wLjNAaGFzL3NyYy9pbmRleC5qcz9mYjgxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_has@1.0.3@has/src/index.js\n");
/***/ }),
/***/ "./node_modules/_is-arguments@1.0.4@is-arguments/index.js":
/*!****************************************************************!*\
!*** ./node_modules/_is-arguments@1.0.4@is-arguments/index.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\nvar toStr = Object.prototype.toString;\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn toStr.call(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\ttoStr.call(value) !== '[object Array]' &&\n\t\ttoStr.call(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWFyZ3VtZW50c0AxLjAuNEBpcy1hcmd1bWVudHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2lzLWFyZ3VtZW50c0AxLjAuNEBpcy1hcmd1bWVudHMvaW5kZXguanM/ZmI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdGlmIChoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHR0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdHRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKTtcbn0oKSk7XG5cbmlzU3RhbmRhcmRBcmd1bWVudHMuaXNMZWdhY3lBcmd1bWVudHMgPSBpc0xlZ2FjeUFyZ3VtZW50czsgLy8gZm9yIHRlc3RzXG5cbm1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_is-arguments@1.0.4@is-arguments/index.js\n");
/***/ }),
/***/ "./node_modules/_is-buffer@2.0.4@is-buffer/index.js":
/*!**********************************************************!*\
!*** ./node_modules/_is-buffer@2.0.4@is-buffer/index.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n return obj != null && obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWJ1ZmZlckAyLjAuNEBpcy1idWZmZXIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2lzLWJ1ZmZlckAyLjAuNEBpcy1idWZmZXIvaW5kZXguanM/ZWJlNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_is-buffer@2.0.4@is-buffer/index.js\n");
/***/ }),
/***/ "./node_modules/_is-date-object@1.0.1@is-date-object/index.js":
/*!********************************************************************!*\
!*** ./node_modules/_is-date-object@1.0.1@is-date-object/index.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateObject(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) { return false; }\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWRhdGUtb2JqZWN0QDEuMC4xQGlzLWRhdGUtb2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1kYXRlLW9iamVjdEAxLjAuMUBpcy1kYXRlLW9iamVjdC9pbmRleC5qcz9iNTdmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGdldERheSA9IERhdGUucHJvdG90eXBlLmdldERheTtcbnZhciB0cnlEYXRlT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkgOiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gZGF0ZUNsYXNzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_is-date-object@1.0.1@is-date-object/index.js\n");
/***/ }),
/***/ "./node_modules/_is-function@1.0.1@is-function/index.js":
/*!**************************************************************!*\
!*** ./node_modules/_is-function@1.0.1@is-function/index.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n var string = toString.call(fn)\n return string === '[object Function]' ||\n (typeof fn === 'function' && string !== '[object RegExp]') ||\n (typeof window !== 'undefined' &&\n // IE8 and below\n (fn === window.setTimeout ||\n fn === window.alert ||\n fn === window.confirm ||\n fn === window.prompt))\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWZ1bmN0aW9uQDEuMC4xQGlzLWZ1bmN0aW9uL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1mdW5jdGlvbkAxLjAuMUBpcy1mdW5jdGlvbi9pbmRleC5qcz84MzZkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvblxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHZhciBzdHJpbmcgPSB0b1N0cmluZy5jYWxsKGZuKVxuICByZXR1cm4gc3RyaW5nID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8XG4gICAgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiBzdHJpbmcgIT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB8fFxuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAvLyBJRTggYW5kIGJlbG93XG4gICAgIChmbiA9PT0gd2luZG93LnNldFRpbWVvdXQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuYWxlcnQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuY29uZmlybSB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5wcm9tcHQpKVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_is-function@1.0.1@is-function/index.js\n");
/***/ }),
/***/ "./node_modules/_is-regex@1.0.4@is-regex/index.js":
/*!********************************************************!*\
!*** ./node_modules/_is-regex@1.0.4@is-regex/index.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar has = __webpack_require__(/*! has */ \"./node_modules/_has@1.0.3@has/src/index.js\");\nvar regexExec = RegExp.prototype.exec;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar tryRegexExecCall = function tryRegexExec(value) {\n\ttry {\n\t\tvar lastIndex = value.lastIndex;\n\t\tvalue.lastIndex = 0;\n\n\t\tregexExec.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\tvalue.lastIndex = lastIndex;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar regexClass = '[object RegExp]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isRegex(value) {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\tif (!hasToStringTag) {\n\t\treturn toStr.call(value) === regexClass;\n\t}\n\n\tvar descriptor = gOPD(value, 'lastIndex');\n\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\tif (!hasLastIndexDataProperty) {\n\t\treturn false;\n\t}\n\n\treturn tryRegexExecCall(value);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLXJlZ2V4QDEuMC40QGlzLXJlZ2V4L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1yZWdleEAxLjAuNEBpcy1yZWdleC9pbmRleC5qcz84ZmVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIHRyeVJlZ2V4RXhlY0NhbGwgPSBmdW5jdGlvbiB0cnlSZWdleEV4ZWModmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgbGFzdEluZGV4ID0gdmFsdWUubGFzdEluZGV4O1xuXHRcdHZhbHVlLmxhc3RJbmRleCA9IDA7XG5cblx0XHRyZWdleEV4ZWMuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH1cblxuXHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0cnlSZWdleEV4ZWNDYWxsKHZhbHVlKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_is-regex@1.0.4@is-regex/index.js\n");
/***/ }),
/***/ "./node_modules/_jsencrypt@3.0.0-rc.1@jsencrypt/bin/jsencrypt.js":
/*!***********************************************************************!*\
!*** ./node_modules/_jsencrypt@3.0.0-rc.1@jsencrypt/bin/jsencrypt.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("(function (global, factory) {\n\t true ? factory(exports) :\n\tundefined;\n}(this, (function (exports) { 'use strict';\n\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nfunction int2char(n) {\n return BI_RM.charAt(n);\n}\n//#region BIT_OPERATIONS\n// (public) this & a\nfunction op_and(x, y) {\n return x & y;\n}\n// (public) this | a\nfunction op_or(x, y) {\n return x | y;\n}\n// (public) this ^ a\nfunction op_xor(x, y) {\n return x ^ y;\n}\n// (public) this & ~a\nfunction op_andnot(x, y) {\n return x & ~y;\n}\n// return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\n if (x == 0) {\n return -1;\n }\n var r = 0;\n if ((x & 0xffff) == 0) {\n x >>= 16;\n r += 16;\n }\n if ((x & 0xff) == 0) {\n x >>= 8;\n r += 8;\n }\n if ((x & 0xf) == 0) {\n x >>= 4;\n r += 4;\n }\n if ((x & 3) == 0) {\n x >>= 2;\n r += 2;\n }\n if ((x & 1) == 0) {\n ++r;\n }\n return r;\n}\n// return number of 1 bits in x\nfunction cbit(x) {\n var r = 0;\n while (x != 0) {\n x &= x - 1;\n ++r;\n }\n return r;\n}\n//#endregion BIT_OPERATIONS\n\nvar b64map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar b64pad = \"=\";\nfunction hex2b64(h) {\n var i;\n var c;\n var ret = \"\";\n for (i = 0; i + 3 <= h.length; i += 3) {\n c = parseInt(h.substring(i, i + 3), 16);\n ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);\n }\n if (i + 1 == h.length) {\n c = parseInt(h.substring(i, i + 1), 16);\n ret += b64map.charAt(c << 2);\n }\n else if (i + 2 == h.length) {\n c = parseInt(h.substring(i, i + 2), 16);\n ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);\n }\n while ((ret.length & 3) > 0) {\n ret += b64pad;\n }\n return ret;\n}\n// convert a base64 string to hex\nfunction b64tohex(s) {\n var ret = \"\";\n var i;\n var k = 0; // b64 state, 0-3\n var slop = 0;\n for (i = 0; i < s.length; ++i) {\n if (s.charAt(i) == b64pad) {\n break;\n }\n var v = b64map.indexOf(s.charAt(i));\n if (v < 0) {\n continue;\n }\n if (k == 0) {\n ret += int2char(v >> 2);\n slop = v & 3;\n k = 1;\n }\n else if (k == 1) {\n ret += int2char((slop << 2) | (v >> 4));\n slop = v & 0xf;\n k = 2;\n }\n else if (k == 2) {\n ret += int2char(slop);\n ret += int2char(v >> 2);\n slop = v & 3;\n k = 3;\n }\n else {\n ret += int2char((slop << 2) | (v >> 4));\n ret += int2char(v & 0xf);\n k = 0;\n }\n }\n if (k == 1) {\n ret += int2char(slop << 2);\n }\n return ret;\n}\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\n\n// Hex JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder;\nvar Hex = {\n decode: function (a) {\n var i;\n if (decoder === undefined) {\n var hex = \"0123456789ABCDEF\";\n var ignore = \" \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n decoder = {};\n for (i = 0; i < 16; ++i) {\n decoder[hex.charAt(i)] = i;\n }\n hex = hex.toLowerCase();\n for (i = 10; i < 16; ++i) {\n decoder[hex.charAt(i)] = i;\n }\n for (i = 0; i < ignore.length; ++i) {\n decoder[ignore.charAt(i)] = -1;\n }\n }\n var out = [];\n var bits = 0;\n var char_count = 0;\n for (i = 0; i < a.length; ++i) {\n var c = a.charAt(i);\n if (c == \"=\") {\n break;\n }\n c = decoder[c];\n if (c == -1) {\n continue;\n }\n if (c === undefined) {\n throw new Error(\"Illegal character at offset \" + i);\n }\n bits |= c;\n if (++char_count >= 2) {\n out[out.length] = bits;\n bits = 0;\n char_count = 0;\n }\n else {\n bits <<= 4;\n }\n }\n if (char_count) {\n throw new Error(\"Hex encoding incomplete: 4 bits missing\");\n }\n return out;\n }\n};\n\n// Base64 JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder$1;\nvar Base64 = {\n decode: function (a) {\n var i;\n if (decoder$1 === undefined) {\n var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n var ignore = \"= \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n decoder$1 = Object.create(null);\n for (i = 0; i < 64; ++i) {\n decoder$1[b64.charAt(i)] = i;\n }\n for (i = 0; i < ignore.length; ++i) {\n decoder$1[ignore.charAt(i)] = -1;\n }\n }\n var out = [];\n var bits = 0;\n var char_count = 0;\n for (i = 0; i < a.length; ++i) {\n var c = a.charAt(i);\n if (c == \"=\") {\n break;\n }\n c = decoder$1[c];\n if (c == -1) {\n continue;\n }\n if (c === undefined) {\n throw new Error(\"Illegal character at offset \" + i);\n }\n bits |= c;\n if (++char_count >= 4) {\n out[out.length] = (bits >> 16);\n out[out.length] = (bits >> 8) & 0xFF;\n out[out.length] = bits & 0xFF;\n bits = 0;\n char_count = 0;\n }\n else {\n bits <<= 6;\n }\n }\n switch (char_count) {\n case 1:\n throw new Error(\"Base64 encoding incomplete: at least 2 bits missing\");\n case 2:\n out[out.length] = (bits >> 10);\n break;\n case 3:\n out[out.length] = (bits >> 16);\n out[out.length] = (bits >> 8) & 0xFF;\n break;\n }\n return out;\n },\n re: /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n unarmor: function (a) {\n var m = Base64.re.exec(a);\n if (m) {\n if (m[1]) {\n a = m[1];\n }\n else if (m[2]) {\n a = m[2];\n }\n else {\n throw new Error(\"RegExp out of sync\");\n }\n }\n return Base64.decode(a);\n }\n};\n\n// Big integer base-10 printing library\n// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256\nvar Int10 = /** @class */ (function () {\n function Int10(value) {\n this.buf = [+value || 0];\n }\n Int10.prototype.mulAdd = function (m, c) {\n // assert(m <= 256)\n var b = this.buf;\n var l = b.length;\n var i;\n var t;\n for (i = 0; i < l; ++i) {\n t = b[i] * m + c;\n if (t < max) {\n c = 0;\n }\n else {\n c = 0 | (t / max);\n t -= c * max;\n }\n b[i] = t;\n }\n if (c > 0) {\n b[i] = c;\n }\n };\n Int10.prototype.sub = function (c) {\n // assert(m <= 256)\n var b = this.buf;\n var l = b.length;\n var i;\n var t;\n for (i = 0; i < l; ++i) {\n t = b[i] - c;\n if (t < 0) {\n t += max;\n c = 1;\n }\n else {\n c = 0;\n }\n b[i] = t;\n }\n while (b[b.length - 1] === 0) {\n b.pop();\n }\n };\n Int10.prototype.toString = function (base) {\n if ((base || 10) != 10) {\n throw new Error(\"only base 10 is supported\");\n }\n var b = this.buf;\n var s = b[b.length - 1].toString();\n for (var i = b.length - 2; i >= 0; --i) {\n s += (max + b[i]).toString().substring(1);\n }\n return s;\n };\n Int10.prototype.valueOf = function () {\n var b = this.buf;\n var v = 0;\n for (var i = b.length - 1; i >= 0; --i) {\n v = v * max + b[i];\n }\n return v;\n };\n Int10.prototype.simplify = function () {\n var b = this.buf;\n return (b.length == 1) ? b[0] : this;\n };\n return Int10;\n}());\n\n// ASN.1 JavaScript decoder\nvar ellipsis = \"\\u2026\";\nvar reTimeS = /^(\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nvar reTimeL = /^(\\d\\d\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nfunction stringCut(str, len) {\n if (str.length > len) {\n str = str.substring(0, len) + ellipsis;\n }\n return str;\n}\nvar Stream = /** @class */ (function () {\n function Stream(enc, pos) {\n this.hexDigits = \"0123456789ABCDEF\";\n if (enc instanceof Stream) {\n this.enc = enc.enc;\n this.pos = enc.pos;\n }\n else {\n // enc should be an array or a binary string\n this.enc = enc;\n this.pos = pos;\n }\n }\n Stream.prototype.get = function (pos) {\n if (pos === undefined) {\n pos = this.pos++;\n }\n if (pos >= this.enc.length) {\n throw new Error(\"Requesting byte offset \" + pos + \" on a stream of length \" + this.enc.length);\n }\n return (\"string\" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];\n };\n Stream.prototype.hexByte = function (b) {\n return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);\n };\n Stream.prototype.hexDump = function (start, end, raw) {\n var s = \"\";\n for (var i = start; i < end; ++i) {\n s += this.hexByte(this.get(i));\n if (raw !== true) {\n switch (i & 0xF) {\n case 0x7:\n s += \" \";\n break;\n case 0xF:\n s += \"\\n\";\n break;\n default:\n s += \" \";\n }\n }\n }\n return s;\n };\n Stream.prototype.isASCII = function (start, end) {\n for (var i = start; i < end; ++i) {\n var c = this.get(i);\n if (c < 32 || c > 176) {\n return false;\n }\n }\n return true;\n };\n Stream.prototype.parseStringISO = function (start, end) {\n var s = \"\";\n for (var i = start; i < end; ++i) {\n s += String.fromCharCode(this.get(i));\n }\n return s;\n };\n Stream.prototype.parseStringUTF = function (start, end) {\n var s = \"\";\n for (var i = start; i < end;) {\n var c = this.get(i++);\n if (c < 128) {\n s += String.fromCharCode(c);\n }\n else if ((c > 191) && (c < 224)) {\n s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));\n }\n else {\n s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F));\n }\n }\n return s;\n };\n Stream.prototype.parseStringBMP = function (start, end) {\n var str = \"\";\n var hi;\n var lo;\n for (var i = start; i < end;) {\n hi = this.get(i++);\n lo = this.get(i++);\n str += String.fromCharCode((hi << 8) | lo);\n }\n return str;\n };\n Stream.prototype.parseTime = function (start, end, shortYear) {\n var s = this.parseStringISO(start, end);\n var m = (shortYear ? reTimeS : reTimeL).exec(s);\n if (!m) {\n return \"Unrecognized time: \" + s;\n }\n if (shortYear) {\n // to avoid querying the timer, use the fixed range [1970, 2069]\n // it will conform with ITU X.400 [-10, +40] sliding window until 2030\n m[1] = +m[1];\n m[1] += (+m[1] < 70) ? 2000 : 1900;\n }\n s = m[1] + \"-\" + m[2] + \"-\" + m[3] + \" \" + m[4];\n if (m[5]) {\n s += \":\" + m[5];\n if (m[6]) {\n s += \":\" + m[6];\n if (m[7]) {\n s += \".\" + m[7];\n }\n }\n }\n if (m[8]) {\n s += \" UTC\";\n if (m[8] != \"Z\") {\n s += m[8];\n if (m[9]) {\n s += \":\" + m[9];\n }\n }\n }\n return s;\n };\n Stream.prototype.parseInteger = function (start, end) {\n var v = this.get(start);\n var neg = (v > 127);\n var pad = neg ? 255 : 0;\n var len;\n var s = \"\";\n // skip unuseful bits (not allowed in DER)\n while (v == pad && ++start < end) {\n v = this.get(start);\n }\n len = end - start;\n if (len === 0) {\n return neg ? -1 : 0;\n }\n // show bit length of huge integers\n if (len > 4) {\n s = v;\n len <<= 3;\n while (((+s ^ pad) & 0x80) == 0) {\n s = +s << 1;\n --len;\n }\n s = \"(\" + len + \" bit)\\n\";\n }\n // decode the integer\n if (neg) {\n v = v - 256;\n }\n var n = new Int10(v);\n for (var i = start + 1; i < end; ++i) {\n n.mulAdd(256, this.get(i));\n }\n return s + n.toString();\n };\n Stream.prototype.parseBitString = function (start, end, maxLength) {\n var unusedBit = this.get(start);\n var lenBit = ((end - start - 1) << 3) - unusedBit;\n var intro = \"(\" + lenBit + \" bit)\\n\";\n var s = \"\";\n for (var i = start + 1; i < end; ++i) {\n var b = this.get(i);\n var skip = (i == end - 1) ? unusedBit : 0;\n for (var j = 7; j >= skip; --j) {\n s += (b >> j) & 1 ? \"1\" : \"0\";\n }\n if (s.length > maxLength) {\n return intro + stringCut(s, maxLength);\n }\n }\n return intro + s;\n };\n Stream.prototype.parseOctetString = function (start, end, maxLength) {\n if (this.isASCII(start, end)) {\n return stringCut(this.parseStringISO(start, end), maxLength);\n }\n var len = end - start;\n var s = \"(\" + len + \" byte)\\n\";\n maxLength /= 2; // we work in bytes\n if (len > maxLength) {\n end = start + maxLength;\n }\n for (var i = start; i < end; ++i) {\n s += this.hexByte(this.get(i));\n }\n if (len > maxLength) {\n s += ellipsis;\n }\n return s;\n };\n Stream.prototype.parseOID = function (start, end, maxLength) {\n var s = \"\";\n var n = new Int10();\n var bits = 0;\n for (var i = start; i < end; ++i) {\n var v = this.get(i);\n n.mulAdd(128, v & 0x7F);\n bits += 7;\n if (!(v & 0x80)) { // finished\n if (s === \"\") {\n n = n.simplify();\n if (n instanceof Int10) {\n n.sub(80);\n s = \"2.\" + n.toString();\n }\n else {\n var m = n < 80 ? n < 40 ? 0 : 1 : 2;\n s = m + \".\" + (n - m * 40);\n }\n }\n else {\n s += \".\" + n.toString();\n }\n if (s.length > maxLength) {\n return stringCut(s, maxLength);\n }\n n = new Int10();\n bits = 0;\n }\n }\n if (bits > 0) {\n s += \".incomplete\";\n }\n return s;\n };\n return Stream;\n}());\nvar ASN1 = /** @class */ (function () {\n function ASN1(stream, header, length, tag, sub) {\n if (!(tag instanceof ASN1Tag)) {\n throw new Error(\"Invalid tag value.\");\n }\n this.stream = stream;\n this.header = header;\n this.length = length;\n this.tag = tag;\n this.sub = sub;\n }\n ASN1.prototype.typeName = function () {\n switch (this.tag.tagClass) {\n case 0: // universal\n switch (this.tag.tagNumber) {\n case 0x00:\n return \"EOC\";\n case 0x01:\n return \"BOOLEAN\";\n case 0x02:\n return \"INTEGER\";\n case 0x03:\n return \"BIT_STRING\";\n case 0x04:\n return \"OCTET_STRING\";\n case 0x05:\n return \"NULL\";\n case 0x06:\n return \"OBJECT_IDENTIFIER\";\n case 0x07:\n return \"ObjectDescriptor\";\n case 0x08:\n return \"EXTERNAL\";\n case 0x09:\n return \"REAL\";\n case 0x0A:\n return \"ENUMERATED\";\n case 0x0B:\n return \"EMBEDDED_PDV\";\n case 0x0C:\n return \"UTF8String\";\n case 0x10:\n return \"SEQUENCE\";\n case 0x11:\n return \"SET\";\n case 0x12:\n return \"NumericString\";\n case 0x13:\n return \"PrintableString\"; // ASCII subset\n case 0x14:\n return \"TeletexString\"; // aka T61String\n case 0x15:\n return \"VideotexString\";\n case 0x16:\n return \"IA5String\"; // ASCII\n case 0x17:\n return \"UTCTime\";\n case 0x18:\n return \"GeneralizedTime\";\n case 0x19:\n return \"GraphicString\";\n case 0x1A:\n return \"VisibleString\"; // ASCII subset\n case 0x1B:\n return \"GeneralString\";\n case 0x1C:\n return \"UniversalString\";\n case 0x1E:\n return \"BMPString\";\n }\n return \"Universal_\" + this.tag.tagNumber.toString();\n case 1:\n return \"Application_\" + this.tag.tagNumber.toString();\n case 2:\n return \"[\" + this.tag.tagNumber.toString() + \"]\"; // Context\n case 3:\n return \"Private_\" + this.tag.tagNumber.toString();\n }\n };\n ASN1.prototype.content = function (maxLength) {\n if (this.tag === undefined) {\n return null;\n }\n if (maxLength === undefined) {\n maxLength = Infinity;\n }\n var content = this.posContent();\n var len = Math.abs(this.length);\n if (!this.tag.isUniversal()) {\n if (this.sub !== null) {\n return \"(\" + this.sub.length + \" elem)\";\n }\n return this.stream.parseOctetString(content, content + len, maxLength);\n }\n switch (this.tag.tagNumber) {\n case 0x01: // BOOLEAN\n return (this.stream.get(content) === 0) ? \"false\" : \"true\";\n case 0x02: // INTEGER\n return this.stream.parseInteger(content, content + len);\n case 0x03: // BIT_STRING\n return this.sub ? \"(\" + this.sub.length + \" elem)\" :\n this.stream.parseBitString(content, content + len, maxLength);\n case 0x04: // OCTET_STRING\n return this.sub ? \"(\" + this.sub.length + \" elem)\" :\n this.stream.parseOctetString(content, content + len, maxLength);\n // case 0x05: // NULL\n case 0x06: // OBJECT_IDENTIFIER\n return this.stream.parseOID(content, content + len, maxLength);\n // case 0x07: // ObjectDescriptor\n // case 0x08: // EXTERNAL\n // case 0x09: // REAL\n // case 0x0A: // ENUMERATED\n // case 0x0B: // EMBEDDED_PDV\n case 0x10: // SEQUENCE\n case 0x11: // SET\n if (this.sub !== null) {\n return \"(\" + this.sub.length + \" elem)\";\n }\n else {\n return \"(no elem)\";\n }\n case 0x0C: // UTF8String\n return stringCut(this.stream.parseStringUTF(content, content + len), maxLength);\n case 0x12: // NumericString\n case 0x13: // PrintableString\n case 0x14: // TeletexString\n case 0x15: // VideotexString\n case 0x16: // IA5String\n // case 0x19: // GraphicString\n case 0x1A: // VisibleString\n // case 0x1B: // GeneralString\n // case 0x1C: // UniversalString\n return stringCut(this.stream.parseStringISO(content, content + len), maxLength);\n case 0x1E: // BMPString\n return stringCut(this.stream.parseStringBMP(content, content + len), maxLength);\n case 0x17: // UTCTime\n case 0x18: // GeneralizedTime\n return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17));\n }\n return null;\n };\n ASN1.prototype.toString = function () {\n return this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" + ((this.sub === null) ? \"null\" : this.sub.length) + \"]\";\n };\n ASN1.prototype.toPrettyString = function (indent) {\n if (indent === undefined) {\n indent = \"\";\n }\n var s = indent + this.typeName() + \" @\" + this.stream.pos;\n if (this.length >= 0) {\n s += \"+\";\n }\n s += this.length;\n if (this.tag.tagConstructed) {\n s += \" (constructed)\";\n }\n else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) {\n s += \" (encapsulates)\";\n }\n s += \"\\n\";\n if (this.sub !== null) {\n indent += \" \";\n for (var i = 0, max = this.sub.length; i < max; ++i) {\n s += this.sub[i].toPrettyString(indent);\n }\n }\n return s;\n };\n ASN1.prototype.posStart = function () {\n return this.stream.pos;\n };\n ASN1.prototype.posContent = function () {\n return this.stream.pos + this.header;\n };\n ASN1.prototype.posEnd = function () {\n return this.stream.pos + this.header + Math.abs(this.length);\n };\n ASN1.prototype.toHexString = function () {\n return this.stream.hexDump(this.posStart(), this.posEnd(), true);\n };\n ASN1.decodeLength = function (stream) {\n var buf = stream.get();\n var len = buf & 0x7F;\n if (len == buf) {\n return len;\n }\n // no reason to use Int10, as it would be a huge buffer anyways\n if (len > 6) {\n throw new Error(\"Length over 48 bits not supported at position \" + (stream.pos - 1));\n }\n if (len === 0) {\n return null;\n } // undefined\n buf = 0;\n for (var i = 0; i < len; ++i) {\n buf = (buf * 256) + stream.get();\n }\n return buf;\n };\n /**\n * Retrieve the hexadecimal value (as a string) of the current ASN.1 element\n * @returns {string}\n * @public\n */\n ASN1.prototype.getHexStringValue = function () {\n var hexString = this.toHexString();\n var offset = this.header * 2;\n var length = this.length * 2;\n return hexString.substr(offset, length);\n };\n ASN1.decode = function (str) {\n var stream;\n if (!(str instanceof Stream)) {\n stream = new Stream(str, 0);\n }\n else {\n stream = str;\n }\n var streamStart = new Stream(stream);\n var tag = new ASN1Tag(stream);\n var len = ASN1.decodeLength(stream);\n var start = stream.pos;\n var header = start - streamStart.pos;\n var sub = null;\n var getSub = function () {\n var ret = [];\n if (len !== null) {\n // definite length\n var end = start + len;\n while (stream.pos < end) {\n ret[ret.length] = ASN1.decode(stream);\n }\n if (stream.pos != end) {\n throw new Error(\"Content size is not correct for container starting at offset \" + start);\n }\n }\n else {\n // undefined length\n try {\n for (;;) {\n var s = ASN1.decode(stream);\n if (s.tag.isEOC()) {\n break;\n }\n ret[ret.length] = s;\n }\n len = start - stream.pos; // undefined lengths are represented as negative values\n }\n catch (e) {\n throw new Error(\"Exception while decoding undefined length content: \" + e);\n }\n }\n return ret;\n };\n if (tag.tagConstructed) {\n // must have valid content\n sub = getSub();\n }\n else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) {\n // sometimes BitString and OctetString are used to encapsulate ASN.1\n try {\n if (tag.tagNumber == 0x03) {\n if (stream.get() != 0) {\n throw new Error(\"BIT STRINGs with unused bits cannot encapsulate.\");\n }\n }\n sub = getSub();\n for (var i = 0; i < sub.length; ++i) {\n if (sub[i].tag.isEOC()) {\n throw new Error(\"EOC is not supposed to be actual content.\");\n }\n }\n }\n catch (e) {\n // but silently ignore when they don't\n sub = null;\n }\n }\n if (sub === null) {\n if (len === null) {\n throw new Error(\"We can't skip over an invalid tag with undefined length at offset \" + start);\n }\n stream.pos = start + Math.abs(len);\n }\n return new ASN1(streamStart, header, len, tag, sub);\n };\n return ASN1;\n}());\nvar ASN1Tag = /** @class */ (function () {\n function ASN1Tag(stream) {\n var buf = stream.get();\n this.tagClass = buf >> 6;\n this.tagConstructed = ((buf & 0x20) !== 0);\n this.tagNumber = buf & 0x1F;\n if (this.tagNumber == 0x1F) { // long tag\n var n = new Int10();\n do {\n buf = stream.get();\n n.mulAdd(128, buf & 0x7F);\n } while (buf & 0x80);\n this.tagNumber = n.simplify();\n }\n }\n ASN1Tag.prototype.isUniversal = function () {\n return this.tagClass === 0x00;\n };\n ASN1Tag.prototype.isEOC = function () {\n return this.tagClass === 0x00 && this.tagNumber === 0x00;\n };\n return ASN1Tag;\n}());\n\n// Copyright (c) 2005 Tom Wu\n// Bits per digit\nvar dbits;\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary & 0xffffff) == 0xefcafe);\n//#region\nvar lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];\nvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n//#endregion\n// (public) Constructor\nvar BigInteger = /** @class */ (function () {\n function BigInteger(a, b, c) {\n if (a != null) {\n if (\"number\" == typeof a) {\n this.fromNumber(a, b, c);\n }\n else if (b == null && \"string\" != typeof a) {\n this.fromString(a, 256);\n }\n else {\n this.fromString(a, b);\n }\n }\n }\n //#region PUBLIC\n // BigInteger.prototype.toString = bnToString;\n // (public) return string representation in given radix\n BigInteger.prototype.toString = function (b) {\n if (this.s < 0) {\n return \"-\" + this.negate().toString(b);\n }\n var k;\n if (b == 16) {\n k = 4;\n }\n else if (b == 8) {\n k = 3;\n }\n else if (b == 2) {\n k = 1;\n }\n else if (b == 32) {\n k = 5;\n }\n else if (b == 4) {\n k = 2;\n }\n else {\n return this.toRadix(b);\n }\n var km = (1 << k) - 1;\n var d;\n var m = false;\n var r = \"\";\n var i = this.t;\n var p = this.DB - (i * this.DB) % k;\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) > 0) {\n m = true;\n r = int2char(d);\n }\n while (i >= 0) {\n if (p < k) {\n d = (this[i] & ((1 << p) - 1)) << (k - p);\n d |= this[--i] >> (p += this.DB - k);\n }\n else {\n d = (this[i] >> (p -= k)) & km;\n if (p <= 0) {\n p += this.DB;\n --i;\n }\n }\n if (d > 0) {\n m = true;\n }\n if (m) {\n r += int2char(d);\n }\n }\n }\n return m ? r : \"0\";\n };\n // BigInteger.prototype.negate = bnNegate;\n // (public) -this\n BigInteger.prototype.negate = function () {\n var r = nbi();\n BigInteger.ZERO.subTo(this, r);\n return r;\n };\n // BigInteger.prototype.abs = bnAbs;\n // (public) |this|\n BigInteger.prototype.abs = function () {\n return (this.s < 0) ? this.negate() : this;\n };\n // BigInteger.prototype.compareTo = bnCompareTo;\n // (public) return + if this > a, - if this < a, 0 if equal\n BigInteger.prototype.compareTo = function (a) {\n var r = this.s - a.s;\n if (r != 0) {\n return r;\n }\n var i = this.t;\n r = i - a.t;\n if (r != 0) {\n return (this.s < 0) ? -r : r;\n }\n while (--i >= 0) {\n if ((r = this[i] - a[i]) != 0) {\n return r;\n }\n }\n return 0;\n };\n // BigInteger.prototype.bitLength = bnBitLength;\n // (public) return the number of bits in \"this\"\n BigInteger.prototype.bitLength = function () {\n if (this.t <= 0) {\n return 0;\n }\n return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));\n };\n // BigInteger.prototype.mod = bnMod;\n // (public) this mod a\n BigInteger.prototype.mod = function (a) {\n var r = nbi();\n this.abs().divRemTo(a, null, r);\n if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {\n a.subTo(r, r);\n }\n return r;\n };\n // BigInteger.prototype.modPowInt = bnModPowInt;\n // (public) this^e % m, 0 <= e < 2^32\n BigInteger.prototype.modPowInt = function (e, m) {\n var z;\n if (e < 256 || m.isEven()) {\n z = new Classic(m);\n }\n else {\n z = new Montgomery(m);\n }\n return this.exp(e, z);\n };\n // BigInteger.prototype.clone = bnClone;\n // (public)\n BigInteger.prototype.clone = function () {\n var r = nbi();\n this.copyTo(r);\n return r;\n };\n // BigInteger.prototype.intValue = bnIntValue;\n // (public) return value as integer\n BigInteger.prototype.intValue = function () {\n if (this.s < 0) {\n if (this.t == 1) {\n return this[0] - this.DV;\n }\n else if (this.t == 0) {\n return -1;\n }\n }\n else if (this.t == 1) {\n return this[0];\n }\n else if (this.t == 0) {\n return 0;\n }\n // assumes 16 < DB < 32\n return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];\n };\n // BigInteger.prototype.byteValue = bnByteValue;\n // (public) return value as byte\n BigInteger.prototype.byteValue = function () {\n return (this.t == 0) ? this.s : (this[0] << 24) >> 24;\n };\n // BigInteger.prototype.shortValue = bnShortValue;\n // (public) return value as short (assumes DB>=16)\n BigInteger.prototype.shortValue = function () {\n return (this.t == 0) ? this.s : (this[0] << 16) >> 16;\n };\n // BigInteger.prototype.signum = bnSigNum;\n // (public) 0 if this == 0, 1 if this > 0\n BigInteger.prototype.signum = function () {\n if (this.s < 0) {\n return -1;\n }\n else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {\n return 0;\n }\n else {\n return 1;\n }\n };\n // BigInteger.prototype.toByteArray = bnToByteArray;\n // (public) convert to bigendian byte array\n BigInteger.prototype.toByteArray = function () {\n var i = this.t;\n var r = [];\n r[0] = this.s;\n var p = this.DB - (i * this.DB) % 8;\n var d;\n var k = 0;\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {\n r[k++] = d | (this.s << (this.DB - p));\n }\n while (i >= 0) {\n if (p < 8) {\n d = (this[i] & ((1 << p) - 1)) << (8 - p);\n d |= this[--i] >> (p += this.DB - 8);\n }\n else {\n d = (this[i] >> (p -= 8)) & 0xff;\n if (p <= 0) {\n p += this.DB;\n --i;\n }\n }\n if ((d & 0x80) != 0) {\n d |= -256;\n }\n if (k == 0 && (this.s & 0x80) != (d & 0x80)) {\n ++k;\n }\n if (k > 0 || d != this.s) {\n r[k++] = d;\n }\n }\n }\n return r;\n };\n // BigInteger.prototype.equals = bnEquals;\n BigInteger.prototype.equals = function (a) {\n return (this.compareTo(a) == 0);\n };\n // BigInteger.prototype.min = bnMin;\n BigInteger.prototype.min = function (a) {\n return (this.compareTo(a) < 0) ? this : a;\n };\n // BigInteger.prototype.max = bnMax;\n BigInteger.prototype.max = function (a) {\n return (this.compareTo(a) > 0) ? this : a;\n };\n // BigInteger.prototype.and = bnAnd;\n BigInteger.prototype.and = function (a) {\n var r = nbi();\n this.bitwiseTo(a, op_and, r);\n return r;\n };\n // BigInteger.prototype.or = bnOr;\n BigInteger.prototype.or = function (a) {\n var r = nbi();\n this.bitwiseTo(a, op_or, r);\n return r;\n };\n // BigInteger.prototype.xor = bnXor;\n BigInteger.prototype.xor = function (a) {\n var r = nbi();\n this.bitwiseTo(a, op_xor, r);\n return r;\n };\n // BigInteger.prototype.andNot = bnAndNot;\n BigInteger.prototype.andNot = function (a) {\n var r = nbi();\n this.bitwiseTo(a, op_andnot, r);\n return r;\n };\n // BigInteger.prototype.not = bnNot;\n // (public) ~this\n BigInteger.prototype.not = function () {\n var r = nbi();\n for (var i = 0; i < this.t; ++i) {\n r[i] = this.DM & ~this[i];\n }\n r.t = this.t;\n r.s = ~this.s;\n return r;\n };\n // BigInteger.prototype.shiftLeft = bnShiftLeft;\n // (public) this << n\n BigInteger.prototype.shiftLeft = function (n) {\n var r = nbi();\n if (n < 0) {\n this.rShiftTo(-n, r);\n }\n else {\n this.lShiftTo(n, r);\n }\n return r;\n };\n // BigInteger.prototype.shiftRight = bnShiftRight;\n // (public) this >> n\n BigInteger.prototype.shiftRight = function (n) {\n var r = nbi();\n if (n < 0) {\n this.lShiftTo(-n, r);\n }\n else {\n this.rShiftTo(n, r);\n }\n return r;\n };\n // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n // (public) returns index of lowest 1-bit (or -1 if none)\n BigInteger.prototype.getLowestSetBit = function () {\n for (var i = 0; i < this.t; ++i) {\n if (this[i] != 0) {\n return i * this.DB + lbit(this[i]);\n }\n }\n if (this.s < 0) {\n return this.t * this.DB;\n }\n return -1;\n };\n // BigInteger.prototype.bitCount = bnBitCount;\n // (public) return number of set bits\n BigInteger.prototype.bitCount = function () {\n var r = 0;\n var x = this.s & this.DM;\n for (var i = 0; i < this.t; ++i) {\n r += cbit(this[i] ^ x);\n }\n return r;\n };\n // BigInteger.prototype.testBit = bnTestBit;\n // (public) true iff nth bit is set\n BigInteger.prototype.testBit = function (n) {\n var j = Math.floor(n / this.DB);\n if (j >= this.t) {\n return (this.s != 0);\n }\n return ((this[j] & (1 << (n % this.DB))) != 0);\n };\n // BigInteger.prototype.setBit = bnSetBit;\n // (public) this | (1<<n)\n BigInteger.prototype.setBit = function (n) {\n return this.changeBit(n, op_or);\n };\n // BigInteger.prototype.clearBit = bnClearBit;\n // (public) this & ~(1<<n)\n BigInteger.prototype.clearBit = function (n) {\n return this.changeBit(n, op_andnot);\n };\n // BigInteger.prototype.flipBit = bnFlipBit;\n // (public) this ^ (1<<n)\n BigInteger.prototype.flipBit = function (n) {\n return this.changeBit(n, op_xor);\n };\n // BigInteger.prototype.add = bnAdd;\n // (public) this + a\n BigInteger.prototype.add = function (a) {\n var r = nbi();\n this.addTo(a, r);\n return r;\n };\n // BigInteger.prototype.subtract = bnSubtract;\n // (public) this - a\n BigInteger.prototype.subtract = function (a) {\n var r = nbi();\n this.subTo(a, r);\n return r;\n };\n // BigInteger.prototype.multiply = bnMultiply;\n // (public) this * a\n BigInteger.prototype.multiply = function (a) {\n var r = nbi();\n this.multiplyTo(a, r);\n return r;\n };\n // BigInteger.prototype.divide = bnDivide;\n // (public) this / a\n BigInteger.prototype.divide = function (a) {\n var r = nbi();\n this.divRemTo(a, r, null);\n return r;\n };\n // BigInteger.prototype.remainder = bnRemainder;\n // (public) this % a\n BigInteger.prototype.remainder = function (a) {\n var r = nbi();\n this.divRemTo(a, null, r);\n return r;\n };\n // BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n // (public) [this/a,this%a]\n BigInteger.prototype.divideAndRemainder = function (a) {\n var q = nbi();\n var r = nbi();\n this.divRemTo(a, q, r);\n return [q, r];\n };\n // BigInteger.prototype.modPow = bnModPow;\n // (public) this^e % m (HAC 14.85)\n BigInteger.prototype.modPow = function (e, m) {\n var i = e.bitLength();\n var k;\n var r = nbv(1);\n var z;\n if (i <= 0) {\n return r;\n }\n else if (i < 18) {\n k = 1;\n }\n else if (i < 48) {\n k = 3;\n }\n else if (i < 144) {\n k = 4;\n }\n else if (i < 768) {\n k = 5;\n }\n else {\n k = 6;\n }\n if (i < 8) {\n z = new Classic(m);\n }\n else if (m.isEven()) {\n z = new Barrett(m);\n }\n else {\n z = new Montgomery(m);\n }\n // precomputation\n var g = [];\n var n = 3;\n var k1 = k - 1;\n var km = (1 << k) - 1;\n g[1] = z.convert(this);\n if (k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1], g2);\n while (n <= km) {\n g[n] = nbi();\n z.mulTo(g2, g[n - 2], g[n]);\n n += 2;\n }\n }\n var j = e.t - 1;\n var w;\n var is1 = true;\n var r2 = nbi();\n var t;\n i = nbits(e[j]) - 1;\n while (j >= 0) {\n if (i >= k1) {\n w = (e[j] >> (i - k1)) & km;\n }\n else {\n w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);\n if (j > 0) {\n w |= e[j - 1] >> (this.DB + i - k1);\n }\n }\n n = k;\n while ((w & 1) == 0) {\n w >>= 1;\n --n;\n }\n if ((i -= n) < 0) {\n i += this.DB;\n --j;\n }\n if (is1) { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else {\n while (n > 1) {\n z.sqrTo(r, r2);\n z.sqrTo(r2, r);\n n -= 2;\n }\n if (n > 0) {\n z.sqrTo(r, r2);\n }\n else {\n t = r;\n r = r2;\n r2 = t;\n }\n z.mulTo(r2, g[w], r);\n }\n while (j >= 0 && (e[j] & (1 << i)) == 0) {\n z.sqrTo(r, r2);\n t = r;\n r = r2;\n r2 = t;\n if (--i < 0) {\n i = this.DB - 1;\n --j;\n }\n }\n }\n return z.revert(r);\n };\n // BigInteger.prototype.modInverse = bnModInverse;\n // (public) 1/this % m (HAC 14.61)\n BigInteger.prototype.modInverse = function (m) {\n var ac = m.isEven();\n if ((this.isEven() && ac) || m.signum() == 0) {\n return BigInteger.ZERO;\n }\n var u = m.clone();\n var v = this.clone();\n var a = nbv(1);\n var b = nbv(0);\n var c = nbv(0);\n var d = nbv(1);\n while (u.signum() != 0) {\n while (u.isEven()) {\n u.rShiftTo(1, u);\n if (ac) {\n if (!a.isEven() || !b.isEven()) {\n a.addTo(this, a);\n b.subTo(m, b);\n }\n a.rShiftTo(1, a);\n }\n else if (!b.isEven()) {\n b.subTo(m, b);\n }\n b.rShiftTo(1, b);\n }\n while (v.isEven()) {\n v.rShiftTo(1, v);\n if (ac) {\n if (!c.isEven() || !d.isEven()) {\n c.addTo(this, c);\n d.subTo(m, d);\n }\n c.rShiftTo(1, c);\n }\n else if (!d.isEven()) {\n d.subTo(m, d);\n }\n d.rShiftTo(1, d);\n }\n if (u.compareTo(v) >= 0) {\n u.subTo(v, u);\n if (ac) {\n a.subTo(c, a);\n }\n b.subTo(d, b);\n }\n else {\n v.subTo(u, v);\n if (ac) {\n c.subTo(a, c);\n }\n d.subTo(b, d);\n }\n }\n if (v.compareTo(BigInteger.ONE) != 0) {\n return BigInteger.ZERO;\n }\n if (d.compareTo(m) >= 0) {\n return d.subtract(m);\n }\n if (d.signum() < 0) {\n d.addTo(m, d);\n }\n else {\n return d;\n }\n if (d.signum() < 0) {\n return d.add(m);\n }\n else {\n return d;\n }\n };\n // BigInteger.prototype.pow = bnPow;\n // (public) this^e\n BigInteger.prototype.pow = function (e) {\n return this.exp(e, new NullExp());\n };\n // BigInteger.prototype.gcd = bnGCD;\n // (public) gcd(this,a) (HAC 14.54)\n BigInteger.prototype.gcd = function (a) {\n var x = (this.s < 0) ? this.negate() : this.clone();\n var y = (a.s < 0) ? a.negate() : a.clone();\n if (x.compareTo(y) < 0) {\n var t = x;\n x = y;\n y = t;\n }\n var i = x.getLowestSetBit();\n var g = y.getLowestSetBit();\n if (g < 0) {\n return x;\n }\n if (i < g) {\n g = i;\n }\n if (g > 0) {\n x.rShiftTo(g, x);\n y.rShiftTo(g, y);\n }\n while (x.signum() > 0) {\n if ((i = x.getLowestSetBit()) > 0) {\n x.rShiftTo(i, x);\n }\n if ((i = y.getLowestSetBit()) > 0) {\n y.rShiftTo(i, y);\n }\n if (x.compareTo(y) >= 0) {\n x.subTo(y, x);\n x.rShiftTo(1, x);\n }\n else {\n y.subTo(x, y);\n y.rShiftTo(1, y);\n }\n }\n if (g > 0) {\n y.lShiftTo(g, y);\n }\n return y;\n };\n // BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n // (public) test primality with certainty >= 1-.5^t\n BigInteger.prototype.isProbablePrime = function (t) {\n var i;\n var x = this.abs();\n if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {\n for (i = 0; i < lowprimes.length; ++i) {\n if (x[0] == lowprimes[i]) {\n return true;\n }\n }\n return false;\n }\n if (x.isEven()) {\n return false;\n }\n i = 1;\n while (i < lowprimes.length) {\n var m = lowprimes[i];\n var j = i + 1;\n while (j < lowprimes.length && m < lplim) {\n m *= lowprimes[j++];\n }\n m = x.modInt(m);\n while (i < j) {\n if (m % lowprimes[i++] == 0) {\n return false;\n }\n }\n }\n return x.millerRabin(t);\n };\n //#endregion PUBLIC\n //#region PROTECTED\n // BigInteger.prototype.copyTo = bnpCopyTo;\n // (protected) copy this to r\n BigInteger.prototype.copyTo = function (r) {\n for (var i = this.t - 1; i >= 0; --i) {\n r[i] = this[i];\n }\n r.t = this.t;\n r.s = this.s;\n };\n // BigInteger.prototype.fromInt = bnpFromInt;\n // (protected) set from integer value x, -DV <= x < DV\n BigInteger.prototype.fromInt = function (x) {\n this.t = 1;\n this.s = (x < 0) ? -1 : 0;\n if (x > 0) {\n this[0] = x;\n }\n else if (x < -1) {\n this[0] = x + this.DV;\n }\n else {\n this.t = 0;\n }\n };\n // BigInteger.prototype.fromString = bnpFromString;\n // (protected) set from string and radix\n BigInteger.prototype.fromString = function (s, b) {\n var k;\n if (b == 16) {\n k = 4;\n }\n else if (b == 8) {\n k = 3;\n }\n else if (b == 256) {\n k = 8;\n /* byte array */\n }\n else if (b == 2) {\n k = 1;\n }\n else if (b == 32) {\n k = 5;\n }\n else if (b == 4) {\n k = 2;\n }\n else {\n this.fromRadix(s, b);\n return;\n }\n this.t = 0;\n this.s = 0;\n var i = s.length;\n var mi = false;\n var sh = 0;\n while (--i >= 0) {\n var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);\n if (x < 0) {\n if (s.charAt(i) == \"-\") {\n mi = true;\n }\n continue;\n }\n mi = false;\n if (sh == 0) {\n this[this.t++] = x;\n }\n else if (sh + k > this.DB) {\n this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;\n this[this.t++] = (x >> (this.DB - sh));\n }\n else {\n this[this.t - 1] |= x << sh;\n }\n sh += k;\n if (sh >= this.DB) {\n sh -= this.DB;\n }\n }\n if (k == 8 && ((+s[0]) & 0x80) != 0) {\n this.s = -1;\n if (sh > 0) {\n this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;\n }\n }\n this.clamp();\n if (mi) {\n BigInteger.ZERO.subTo(this, this);\n }\n };\n // BigInteger.prototype.clamp = bnpClamp;\n // (protected) clamp off excess high words\n BigInteger.prototype.clamp = function () {\n var c = this.s & this.DM;\n while (this.t > 0 && this[this.t - 1] == c) {\n --this.t;\n }\n };\n // BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n // (protected) r = this << n*DB\n BigInteger.prototype.dlShiftTo = function (n, r) {\n var i;\n for (i = this.t - 1; i >= 0; --i) {\n r[i + n] = this[i];\n }\n for (i = n - 1; i >= 0; --i) {\n r[i] = 0;\n }\n r.t = this.t + n;\n r.s = this.s;\n };\n // BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n // (protected) r = this >> n*DB\n BigInteger.prototype.drShiftTo = function (n, r) {\n for (var i = n; i < this.t; ++i) {\n r[i - n] = this[i];\n }\n r.t = Math.max(this.t - n, 0);\n r.s = this.s;\n };\n // BigInteger.prototype.lShiftTo = bnpLShiftTo;\n // (protected) r = this << n\n BigInteger.prototype.lShiftTo = function (n, r) {\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << cbs) - 1;\n var ds = Math.floor(n / this.DB);\n var c = (this.s << bs) & this.DM;\n for (var i = this.t - 1; i >= 0; --i) {\n r[i + ds + 1] = (this[i] >> cbs) | c;\n c = (this[i] & bm) << bs;\n }\n for (var i = ds - 1; i >= 0; --i) {\n r[i] = 0;\n }\n r[ds] = c;\n r.t = this.t + ds + 1;\n r.s = this.s;\n r.clamp();\n };\n // BigInteger.prototype.rShiftTo = bnpRShiftTo;\n // (protected) r = this >> n\n BigInteger.prototype.rShiftTo = function (n, r) {\n r.s = this.s;\n var ds = Math.floor(n / this.DB);\n if (ds >= this.t) {\n r.t = 0;\n return;\n }\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << bs) - 1;\n r[0] = this[ds] >> bs;\n for (var i = ds + 1; i < this.t; ++i) {\n r[i - ds - 1] |= (this[i] & bm) << cbs;\n r[i - ds] = this[i] >> bs;\n }\n if (bs > 0) {\n r[this.t - ds - 1] |= (this.s & bm) << cbs;\n }\n r.t = this.t - ds;\n r.clamp();\n };\n // BigInteger.prototype.subTo = bnpSubTo;\n // (protected) r = this - a\n BigInteger.prototype.subTo = function (a, r) {\n var i = 0;\n var c = 0;\n var m = Math.min(a.t, this.t);\n while (i < m) {\n c += this[i] - a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n if (a.t < this.t) {\n c -= a.s;\n while (i < this.t) {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while (i < a.t) {\n c -= a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c < 0) ? -1 : 0;\n if (c < -1) {\n r[i++] = this.DV + c;\n }\n else if (c > 0) {\n r[i++] = c;\n }\n r.t = i;\n r.clamp();\n };\n // BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n BigInteger.prototype.multiplyTo = function (a, r) {\n var x = this.abs();\n var y = a.abs();\n var i = x.t;\n r.t = i + y.t;\n while (--i >= 0) {\n r[i] = 0;\n }\n for (i = 0; i < y.t; ++i) {\n r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\n }\n r.s = 0;\n r.clamp();\n if (this.s != a.s) {\n BigInteger.ZERO.subTo(r, r);\n }\n };\n // BigInteger.prototype.squareTo = bnpSquareTo;\n // (protected) r = this^2, r != this (HAC 14.16)\n BigInteger.prototype.squareTo = function (r) {\n var x = this.abs();\n var i = r.t = 2 * x.t;\n while (--i >= 0) {\n r[i] = 0;\n }\n for (i = 0; i < x.t - 1; ++i) {\n var c = x.am(i, x[i], r, 2 * i, 0, 1);\n if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\n r[i + x.t] -= x.DV;\n r[i + x.t + 1] = 1;\n }\n }\n if (r.t > 0) {\n r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\n }\n r.s = 0;\n r.clamp();\n };\n // BigInteger.prototype.divRemTo = bnpDivRemTo;\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n BigInteger.prototype.divRemTo = function (m, q, r) {\n var pm = m.abs();\n if (pm.t <= 0) {\n return;\n }\n var pt = this.abs();\n if (pt.t < pm.t) {\n if (q != null) {\n q.fromInt(0);\n }\n if (r != null) {\n this.copyTo(r);\n }\n return;\n }\n if (r == null) {\n r = nbi();\n }\n var y = nbi();\n var ts = this.s;\n var ms = m.s;\n var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus\n if (nsh > 0) {\n pm.lShiftTo(nsh, y);\n pt.lShiftTo(nsh, r);\n }\n else {\n pm.copyTo(y);\n pt.copyTo(r);\n }\n var ys = y.t;\n var y0 = y[ys - 1];\n if (y0 == 0) {\n return;\n }\n var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);\n var d1 = this.FV / yt;\n var d2 = (1 << this.F1) / yt;\n var e = 1 << this.F2;\n var i = r.t;\n var j = i - ys;\n var t = (q == null) ? nbi() : q;\n y.dlShiftTo(j, t);\n if (r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t, r);\n }\n BigInteger.ONE.dlShiftTo(ys, t);\n t.subTo(y, y); // \"negative\" y so we can replace sub with am later\n while (y.t < ys) {\n y[y.t++] = 0;\n }\n while (--j >= 0) {\n // Estimate quotient digit\n var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\n if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out\n y.dlShiftTo(j, t);\n r.subTo(t, r);\n while (r[i] < --qd) {\n r.subTo(t, r);\n }\n }\n }\n if (q != null) {\n r.drShiftTo(ys, q);\n if (ts != ms) {\n BigInteger.ZERO.subTo(q, q);\n }\n }\n r.t = ys;\n r.clamp();\n if (nsh > 0) {\n r.rShiftTo(nsh, r);\n } // Denormalize remainder\n if (ts < 0) {\n BigInteger.ZERO.subTo(r, r);\n }\n };\n // BigInteger.prototype.invDigit = bnpInvDigit;\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n // justification:\n // xy == 1 (mod m)\n // xy = 1+km\n // xy(2-xy) = (1+km)(1-km)\n // x[y(2-xy)] = 1-k^2m^2\n // x[y(2-xy)] == 1 (mod m^2)\n // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n BigInteger.prototype.invDigit = function () {\n if (this.t < 1) {\n return 0;\n }\n var x = this[0];\n if ((x & 1) == 0) {\n return 0;\n }\n var y = x & 3; // y == 1/x mod 2^2\n y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4\n y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8\n y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y > 0) ? this.DV - y : -y;\n };\n // BigInteger.prototype.isEven = bnpIsEven;\n // (protected) true iff this is even\n BigInteger.prototype.isEven = function () {\n return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;\n };\n // BigInteger.prototype.exp = bnpExp;\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n BigInteger.prototype.exp = function (e, z) {\n if (e > 0xffffffff || e < 1) {\n return BigInteger.ONE;\n }\n var r = nbi();\n var r2 = nbi();\n var g = z.convert(this);\n var i = nbits(e) - 1;\n g.copyTo(r);\n while (--i >= 0) {\n z.sqrTo(r, r2);\n if ((e & (1 << i)) > 0) {\n z.mulTo(r2, g, r);\n }\n else {\n var t = r;\n r = r2;\n r2 = t;\n }\n }\n return z.revert(r);\n };\n // BigInteger.prototype.chunkSize = bnpChunkSize;\n // (protected) return x s.t. r^x < DV\n BigInteger.prototype.chunkSize = function (r) {\n return Math.floor(Math.LN2 * this.DB / Math.log(r));\n };\n // BigInteger.prototype.toRadix = bnpToRadix;\n // (protected) convert to radix string\n BigInteger.prototype.toRadix = function (b) {\n if (b == null) {\n b = 10;\n }\n if (this.signum() == 0 || b < 2 || b > 36) {\n return \"0\";\n }\n var cs = this.chunkSize(b);\n var a = Math.pow(b, cs);\n var d = nbv(a);\n var y = nbi();\n var z = nbi();\n var r = \"\";\n this.divRemTo(d, y, z);\n while (y.signum() > 0) {\n r = (a + z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d, y, z);\n }\n return z.intValue().toString(b) + r;\n };\n // BigInteger.prototype.fromRadix = bnpFromRadix;\n // (protected) convert from radix string\n BigInteger.prototype.fromRadix = function (s, b) {\n this.fromInt(0);\n if (b == null) {\n b = 10;\n }\n var cs = this.chunkSize(b);\n var d = Math.pow(b, cs);\n var mi = false;\n var j = 0;\n var w = 0;\n for (var i = 0; i < s.length; ++i) {\n var x = intAt(s, i);\n if (x < 0) {\n if (s.charAt(i) == \"-\" && this.signum() == 0) {\n mi = true;\n }\n continue;\n }\n w = b * w + x;\n if (++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w, 0);\n j = 0;\n w = 0;\n }\n }\n if (j > 0) {\n this.dMultiply(Math.pow(b, j));\n this.dAddOffset(w, 0);\n }\n if (mi) {\n BigInteger.ZERO.subTo(this, this);\n }\n };\n // BigInteger.prototype.fromNumber = bnpFromNumber;\n // (protected) alternate constructor\n BigInteger.prototype.fromNumber = function (a, b, c) {\n if (\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if (a < 2) {\n this.fromInt(1);\n }\n else {\n this.fromNumber(a, c);\n if (!this.testBit(a - 1)) {\n // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n }\n if (this.isEven()) {\n this.dAddOffset(1, 0);\n } // force odd\n while (!this.isProbablePrime(b)) {\n this.dAddOffset(2, 0);\n if (this.bitLength() > a) {\n this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\n }\n }\n }\n }\n else {\n // new BigInteger(int,RNG)\n var x = [];\n var t = a & 7;\n x.length = (a >> 3) + 1;\n b.nextBytes(x);\n if (t > 0) {\n x[0] &= ((1 << t) - 1);\n }\n else {\n x[0] = 0;\n }\n this.fromString(x, 256);\n }\n };\n // BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n // (protected) r = this op a (bitwise)\n BigInteger.prototype.bitwiseTo = function (a, op, r) {\n var i;\n var f;\n var m = Math.min(a.t, this.t);\n for (i = 0; i < m; ++i) {\n r[i] = op(this[i], a[i]);\n }\n if (a.t < this.t) {\n f = a.s & this.DM;\n for (i = m; i < this.t; ++i) {\n r[i] = op(this[i], f);\n }\n r.t = this.t;\n }\n else {\n f = this.s & this.DM;\n for (i = m; i < a.t; ++i) {\n r[i] = op(f, a[i]);\n }\n r.t = a.t;\n }\n r.s = op(this.s, a.s);\n r.clamp();\n };\n // BigInteger.prototype.changeBit = bnpChangeBit;\n // (protected) this op (1<<n)\n BigInteger.prototype.changeBit = function (n, op) {\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r, op, r);\n return r;\n };\n // BigInteger.prototype.addTo = bnpAddTo;\n // (protected) r = this + a\n BigInteger.prototype.addTo = function (a, r) {\n var i = 0;\n var c = 0;\n var m = Math.min(a.t, this.t);\n while (i < m) {\n c += this[i] + a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n if (a.t < this.t) {\n c += a.s;\n while (i < this.t) {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while (i < a.t) {\n c += a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c < 0) ? -1 : 0;\n if (c > 0) {\n r[i++] = c;\n }\n else if (c < -1) {\n r[i++] = this.DV + c;\n }\n r.t = i;\n r.clamp();\n };\n // BigInteger.prototype.dMultiply = bnpDMultiply;\n // (protected) this *= n, this >= 0, 1 < n < DV\n BigInteger.prototype.dMultiply = function (n) {\n this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);\n ++this.t;\n this.clamp();\n };\n // BigInteger.prototype.dAddOffset = bnpDAddOffset;\n // (protected) this += n << w words, this >= 0\n BigInteger.prototype.dAddOffset = function (n, w) {\n if (n == 0) {\n return;\n }\n while (this.t <= w) {\n this[this.t++] = 0;\n }\n this[w] += n;\n while (this[w] >= this.DV) {\n this[w] -= this.DV;\n if (++w >= this.t) {\n this[this.t++] = 0;\n }\n ++this[w];\n }\n };\n // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n // (protected) r = lower n words of \"this * a\", a.t <= n\n // \"this\" should be the larger one if appropriate.\n BigInteger.prototype.multiplyLowerTo = function (a, n, r) {\n var i = Math.min(this.t + a.t, n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while (i > 0) {\n r[--i] = 0;\n }\n for (var j = r.t - this.t; i < j; ++i) {\n r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);\n }\n for (var j = Math.min(a.t, n); i < j; ++i) {\n this.am(0, a[i], r, i, 0, n - i);\n }\n r.clamp();\n };\n // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n // (protected) r = \"this * a\" without lower n words, n > 0\n // \"this\" should be the larger one if appropriate.\n BigInteger.prototype.multiplyUpperTo = function (a, n, r) {\n --n;\n var i = r.t = this.t + a.t - n;\n r.s = 0; // assumes a,this >= 0\n while (--i >= 0) {\n r[i] = 0;\n }\n for (i = Math.max(n - this.t, 0); i < a.t; ++i) {\n r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);\n }\n r.clamp();\n r.drShiftTo(1, r);\n };\n // BigInteger.prototype.modInt = bnpModInt;\n // (protected) this % n, n < 2^26\n BigInteger.prototype.modInt = function (n) {\n if (n <= 0) {\n return 0;\n }\n var d = this.DV % n;\n var r = (this.s < 0) ? n - 1 : 0;\n if (this.t > 0) {\n if (d == 0) {\n r = this[0] % n;\n }\n else {\n for (var i = this.t - 1; i >= 0; --i) {\n r = (d * r + this[i]) % n;\n }\n }\n }\n return r;\n };\n // BigInteger.prototype.millerRabin = bnpMillerRabin;\n // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n BigInteger.prototype.millerRabin = function (t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if (k <= 0) {\n return false;\n }\n var r = n1.shiftRight(k);\n t = (t + 1) >> 1;\n if (t > lowprimes.length) {\n t = lowprimes.length;\n }\n var a = nbi();\n for (var i = 0; i < t; ++i) {\n // Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);\n var y = a.modPow(r, this);\n if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while (j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2, this);\n if (y.compareTo(BigInteger.ONE) == 0) {\n return false;\n }\n }\n if (y.compareTo(n1) != 0) {\n return false;\n }\n }\n }\n return true;\n };\n // BigInteger.prototype.square = bnSquare;\n // (public) this^2\n BigInteger.prototype.square = function () {\n var r = nbi();\n this.squareTo(r);\n return r;\n };\n //#region ASYNC\n // Public API method\n BigInteger.prototype.gcda = function (a, callback) {\n var x = (this.s < 0) ? this.negate() : this.clone();\n var y = (a.s < 0) ? a.negate() : a.clone();\n if (x.compareTo(y) < 0) {\n var t = x;\n x = y;\n y = t;\n }\n var i = x.getLowestSetBit();\n var g = y.getLowestSetBit();\n if (g < 0) {\n callback(x);\n return;\n }\n if (i < g) {\n g = i;\n }\n if (g > 0) {\n x.rShiftTo(g, x);\n y.rShiftTo(g, y);\n }\n // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.\n var gcda1 = function () {\n if ((i = x.getLowestSetBit()) > 0) {\n x.rShiftTo(i, x);\n }\n if ((i = y.getLowestSetBit()) > 0) {\n y.rShiftTo(i, y);\n }\n if (x.compareTo(y) >= 0) {\n x.subTo(y, x);\n x.rShiftTo(1, x);\n }\n else {\n y.subTo(x, y);\n y.rShiftTo(1, y);\n }\n if (!(x.signum() > 0)) {\n if (g > 0) {\n y.lShiftTo(g, y);\n }\n setTimeout(function () { callback(y); }, 0); // escape\n }\n else {\n setTimeout(gcda1, 0);\n }\n };\n setTimeout(gcda1, 10);\n };\n // (protected) alternate constructor\n BigInteger.prototype.fromNumberAsync = function (a, b, c, callback) {\n if (\"number\" == typeof b) {\n if (a < 2) {\n this.fromInt(1);\n }\n else {\n this.fromNumber(a, c);\n if (!this.testBit(a - 1)) {\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n }\n if (this.isEven()) {\n this.dAddOffset(1, 0);\n }\n var bnp_1 = this;\n var bnpfn1_1 = function () {\n bnp_1.dAddOffset(2, 0);\n if (bnp_1.bitLength() > a) {\n bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);\n }\n if (bnp_1.isProbablePrime(b)) {\n setTimeout(function () { callback(); }, 0); // escape\n }\n else {\n setTimeout(bnpfn1_1, 0);\n }\n };\n setTimeout(bnpfn1_1, 0);\n }\n }\n else {\n var x = [];\n var t = a & 7;\n x.length = (a >> 3) + 1;\n b.nextBytes(x);\n if (t > 0) {\n x[0] &= ((1 << t) - 1);\n }\n else {\n x[0] = 0;\n }\n this.fromString(x, 256);\n }\n };\n return BigInteger;\n}());\n//#region REDUCERS\n//#region NullExp\nvar NullExp = /** @class */ (function () {\n function NullExp() {\n }\n // NullExp.prototype.convert = nNop;\n NullExp.prototype.convert = function (x) {\n return x;\n };\n // NullExp.prototype.revert = nNop;\n NullExp.prototype.revert = function (x) {\n return x;\n };\n // NullExp.prototype.mulTo = nMulTo;\n NullExp.prototype.mulTo = function (x, y, r) {\n x.multiplyTo(y, r);\n };\n // NullExp.prototype.sqrTo = nSqrTo;\n NullExp.prototype.sqrTo = function (x, r) {\n x.squareTo(r);\n };\n return NullExp;\n}());\n// Modular reduction using \"classic\" algorithm\nvar Classic = /** @class */ (function () {\n function Classic(m) {\n this.m = m;\n }\n // Classic.prototype.convert = cConvert;\n Classic.prototype.convert = function (x) {\n if (x.s < 0 || x.compareTo(this.m) >= 0) {\n return x.mod(this.m);\n }\n else {\n return x;\n }\n };\n // Classic.prototype.revert = cRevert;\n Classic.prototype.revert = function (x) {\n return x;\n };\n // Classic.prototype.reduce = cReduce;\n Classic.prototype.reduce = function (x) {\n x.divRemTo(this.m, null, x);\n };\n // Classic.prototype.mulTo = cMulTo;\n Classic.prototype.mulTo = function (x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n };\n // Classic.prototype.sqrTo = cSqrTo;\n Classic.prototype.sqrTo = function (x, r) {\n x.squareTo(r);\n this.reduce(r);\n };\n return Classic;\n}());\n//#endregion\n//#region Montgomery\n// Montgomery reduction\nvar Montgomery = /** @class */ (function () {\n function Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp & 0x7fff;\n this.mph = this.mp >> 15;\n this.um = (1 << (m.DB - 15)) - 1;\n this.mt2 = 2 * m.t;\n }\n // Montgomery.prototype.convert = montConvert;\n // xR mod m\n Montgomery.prototype.convert = function (x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t, r);\n r.divRemTo(this.m, null, r);\n if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {\n this.m.subTo(r, r);\n }\n return r;\n };\n // Montgomery.prototype.revert = montRevert;\n // x/R mod m\n Montgomery.prototype.revert = function (x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n };\n // Montgomery.prototype.reduce = montReduce;\n // x = x/R mod m (HAC 14.32)\n Montgomery.prototype.reduce = function (x) {\n while (x.t <= this.mt2) {\n // pad x so am has enough room later\n x[x.t++] = 0;\n }\n for (var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i] & 0x7fff;\n var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i + this.m.t;\n x[j] += this.m.am(0, u0, x, i, 0, this.m.t);\n // propagate carry\n while (x[j] >= x.DV) {\n x[j] -= x.DV;\n x[++j]++;\n }\n }\n x.clamp();\n x.drShiftTo(this.m.t, x);\n if (x.compareTo(this.m) >= 0) {\n x.subTo(this.m, x);\n }\n };\n // Montgomery.prototype.mulTo = montMulTo;\n // r = \"xy/R mod m\"; x,y != r\n Montgomery.prototype.mulTo = function (x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n };\n // Montgomery.prototype.sqrTo = montSqrTo;\n // r = \"x^2/R mod m\"; x != r\n Montgomery.prototype.sqrTo = function (x, r) {\n x.squareTo(r);\n this.reduce(r);\n };\n return Montgomery;\n}());\n//#endregion Montgomery\n//#region Barrett\n// Barrett modular reduction\nvar Barrett = /** @class */ (function () {\n function Barrett(m) {\n this.m = m;\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);\n this.mu = this.r2.divide(m);\n }\n // Barrett.prototype.convert = barrettConvert;\n Barrett.prototype.convert = function (x) {\n if (x.s < 0 || x.t > 2 * this.m.t) {\n return x.mod(this.m);\n }\n else if (x.compareTo(this.m) < 0) {\n return x;\n }\n else {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n };\n // Barrett.prototype.revert = barrettRevert;\n Barrett.prototype.revert = function (x) {\n return x;\n };\n // Barrett.prototype.reduce = barrettReduce;\n // x = x mod m (HAC 14.42)\n Barrett.prototype.reduce = function (x) {\n x.drShiftTo(this.m.t - 1, this.r2);\n if (x.t > this.m.t + 1) {\n x.t = this.m.t + 1;\n x.clamp();\n }\n this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);\n this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);\n while (x.compareTo(this.r2) < 0) {\n x.dAddOffset(1, this.m.t + 1);\n }\n x.subTo(this.r2, x);\n while (x.compareTo(this.m) >= 0) {\n x.subTo(this.m, x);\n }\n };\n // Barrett.prototype.mulTo = barrettMulTo;\n // r = x*y mod m; x,y != r\n Barrett.prototype.mulTo = function (x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n };\n // Barrett.prototype.sqrTo = barrettSqrTo;\n // r = x^2 mod m; x != r\n Barrett.prototype.sqrTo = function (x, r) {\n x.squareTo(r);\n this.reduce(r);\n };\n return Barrett;\n}());\n//#endregion\n//#endregion REDUCERS\n// return new, unset BigInteger\nfunction nbi() { return new BigInteger(null); }\nfunction parseBigInt(str, r) {\n return new BigInteger(str, r);\n}\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i, x, w, j, c, n) {\n while (--n >= 0) {\n var v = x * this[i++] + w[j] + c;\n c = Math.floor(v / 0x4000000);\n w[j++] = v & 0x3ffffff;\n }\n return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i, x, w, j, c, n) {\n var xl = x & 0x7fff;\n var xh = x >> 15;\n while (--n >= 0) {\n var l = this[i] & 0x7fff;\n var h = this[i++] >> 15;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\n c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\n w[j++] = l & 0x3fffffff;\n }\n return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i, x, w, j, c, n) {\n var xl = x & 0x3fff;\n var xh = x >> 14;\n while (--n >= 0) {\n var l = this[i] & 0x3fff;\n var h = this[i++] >> 14;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\n c = (l >> 28) + (m >> 14) + xh * h;\n w[j++] = l & 0xfffffff;\n }\n return c;\n}\nif (j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n BigInteger.prototype.am = am2;\n dbits = 30;\n}\nelse if (j_lm && (navigator.appName != \"Netscape\")) {\n BigInteger.prototype.am = am1;\n dbits = 26;\n}\nelse { // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n}\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1 << dbits) - 1);\nBigInteger.prototype.DV = (1 << dbits);\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2, BI_FP);\nBigInteger.prototype.F1 = BI_FP - dbits;\nBigInteger.prototype.F2 = 2 * dbits - BI_FP;\n// Digit conversions\nvar BI_RC = [];\nvar rr;\nvar vv;\nrr = \"0\".charCodeAt(0);\nfor (vv = 0; vv <= 9; ++vv) {\n BI_RC[rr++] = vv;\n}\nrr = \"a\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) {\n BI_RC[rr++] = vv;\n}\nrr = \"A\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) {\n BI_RC[rr++] = vv;\n}\nfunction intAt(s, i) {\n var c = BI_RC[s.charCodeAt(i)];\n return (c == null) ? -1 : c;\n}\n// return bigint initialized to value\nfunction nbv(i) {\n var r = nbi();\n r.fromInt(i);\n return r;\n}\n// returns bit length of the integer x\nfunction nbits(x) {\n var r = 1;\n var t;\n if ((t = x >>> 16) != 0) {\n x = t;\n r += 16;\n }\n if ((t = x >> 8) != 0) {\n x = t;\n r += 8;\n }\n if ((t = x >> 4) != 0) {\n x = t;\n r += 4;\n }\n if ((t = x >> 2) != 0) {\n x = t;\n r += 2;\n }\n if ((t = x >> 1) != 0) {\n x = t;\n r += 1;\n }\n return r;\n}\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n\n// prng4.js - uses Arcfour as a PRNG\nvar Arcfour = /** @class */ (function () {\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = [];\n }\n // Arcfour.prototype.init = ARC4init;\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n Arcfour.prototype.init = function (key) {\n var i;\n var j;\n var t;\n for (i = 0; i < 256; ++i) {\n this.S[i] = i;\n }\n j = 0;\n for (i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n };\n // Arcfour.prototype.next = ARC4next;\n Arcfour.prototype.next = function () {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n };\n return Arcfour;\n}());\n// Plug in your RNG constructor here\nfunction prng_newstate() {\n return new Arcfour();\n}\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nvar rng_psize = 256;\n\n// Random number generator - requires a PRNG backend, e.g. prng4.js\nvar rng_state;\nvar rng_pool = null;\nvar rng_pptr;\n// Initialize the pool with junk if needed.\nif (rng_pool == null) {\n rng_pool = [];\n rng_pptr = 0;\n var t = void 0;\n if (window.crypto && window.crypto.getRandomValues) {\n // Extract entropy (2048 bits) from RNG if available\n var z = new Uint32Array(256);\n window.crypto.getRandomValues(z);\n for (t = 0; t < z.length; ++t) {\n rng_pool[rng_pptr++] = z[t] & 255;\n }\n }\n // Use mouse events for entropy, if we do not have enough entropy by the time\n // we need it, entropy will be generated by Math.random.\n var onMouseMoveListener_1 = function (ev) {\n this.count = this.count || 0;\n if (this.count >= 256 || rng_pptr >= rng_psize) {\n if (window.removeEventListener) {\n window.removeEventListener(\"mousemove\", onMouseMoveListener_1, false);\n }\n else if (window.detachEvent) {\n window.detachEvent(\"onmousemove\", onMouseMoveListener_1);\n }\n return;\n }\n try {\n var mouseCoordinates = ev.x + ev.y;\n rng_pool[rng_pptr++] = mouseCoordinates & 255;\n this.count += 1;\n }\n catch (e) {\n // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.\n }\n };\n if (window.addEventListener) {\n window.addEventListener(\"mousemove\", onMouseMoveListener_1, false);\n }\n else if (window.attachEvent) {\n window.attachEvent(\"onmousemove\", onMouseMoveListener_1);\n }\n}\nfunction rng_get_byte() {\n if (rng_state == null) {\n rng_state = prng_newstate();\n // At this point, we may not have collected enough entropy. If not, fall back to Math.random\n while (rng_pptr < rng_psize) {\n var random = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = random & 255;\n }\n rng_state.init(rng_pool);\n for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {\n rng_pool[rng_pptr] = 0;\n }\n rng_pptr = 0;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n}\nvar SecureRandom = /** @class */ (function () {\n function SecureRandom() {\n }\n SecureRandom.prototype.nextBytes = function (ba) {\n for (var i = 0; i < ba.length; ++i) {\n ba[i] = rng_get_byte();\n }\n };\n return SecureRandom;\n}());\n\n// Depends on jsbn.js and rng.js\n// function linebrk(s,n) {\n// var ret = \"\";\n// var i = 0;\n// while(i + n < s.length) {\n// ret += s.substring(i,i+n) + \"\\n\";\n// i += n;\n// }\n// return ret + s.substring(i,s.length);\n// }\n// function byte2Hex(b) {\n// if(b < 0x10)\n// return \"0\" + b.toString(16);\n// else\n// return b.toString(16);\n// }\nfunction pkcs1pad1(s, n) {\n if (n < s.length + 22) {\n console.error(\"Message too long for RSA\");\n return null;\n }\n var len = n - s.length - 6;\n var filler = \"\";\n for (var f = 0; f < len; f += 2) {\n filler += \"ff\";\n }\n var m = \"0001\" + filler + \"00\" + s;\n return parseBigInt(m, 16);\n}\n// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint\nfunction pkcs1pad2(s, n) {\n if (n < s.length + 11) { // TODO: fix for utf-8\n console.error(\"Message too long for RSA\");\n return null;\n }\n var ba = [];\n var i = s.length - 1;\n while (i >= 0 && n > 0) {\n var c = s.charCodeAt(i--);\n if (c < 128) { // encode using utf-8\n ba[--n] = c;\n }\n else if ((c > 127) && (c < 2048)) {\n ba[--n] = (c & 63) | 128;\n ba[--n] = (c >> 6) | 192;\n }\n else {\n ba[--n] = (c & 63) | 128;\n ba[--n] = ((c >> 6) & 63) | 128;\n ba[--n] = (c >> 12) | 224;\n }\n }\n ba[--n] = 0;\n var rng = new SecureRandom();\n var x = [];\n while (n > 2) { // random non-zero pad\n x[0] = 0;\n while (x[0] == 0) {\n rng.nextBytes(x);\n }\n ba[--n] = x[0];\n }\n ba[--n] = 2;\n ba[--n] = 0;\n return new BigInteger(ba);\n}\n// \"empty\" RSA key constructor\nvar RSAKey = /** @class */ (function () {\n function RSAKey() {\n this.n = null;\n this.e = 0;\n this.d = null;\n this.p = null;\n this.q = null;\n this.dmp1 = null;\n this.dmq1 = null;\n this.coeff = null;\n }\n //#region PROTECTED\n // protected\n // RSAKey.prototype.doPublic = RSADoPublic;\n // Perform raw public operation on \"x\": return x^e (mod n)\n RSAKey.prototype.doPublic = function (x) {\n return x.modPowInt(this.e, this.n);\n };\n // RSAKey.prototype.doPrivate = RSADoPrivate;\n // Perform raw private operation on \"x\": return x^d (mod n)\n RSAKey.prototype.doPrivate = function (x) {\n if (this.p == null || this.q == null) {\n return x.modPow(this.d, this.n);\n }\n // TODO: re-calculate any missing CRT params\n var xp = x.mod(this.p).modPow(this.dmp1, this.p);\n var xq = x.mod(this.q).modPow(this.dmq1, this.q);\n while (xp.compareTo(xq) < 0) {\n xp = xp.add(this.p);\n }\n return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);\n };\n //#endregion PROTECTED\n //#region PUBLIC\n // RSAKey.prototype.setPublic = RSASetPublic;\n // Set the public key fields N and e from hex strings\n RSAKey.prototype.setPublic = function (N, E) {\n if (N != null && E != null && N.length > 0 && E.length > 0) {\n this.n = parseBigInt(N, 16);\n this.e = parseInt(E, 16);\n }\n else {\n console.error(\"Invalid RSA public key\");\n }\n };\n // RSAKey.prototype.encrypt = RSAEncrypt;\n // Return the PKCS#1 RSA encryption of \"text\" as an even-length hex string\n RSAKey.prototype.encrypt = function (text) {\n var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);\n if (m == null) {\n return null;\n }\n var c = this.doPublic(m);\n if (c == null) {\n return null;\n }\n var h = c.toString(16);\n if ((h.length & 1) == 0) {\n return h;\n }\n else {\n return \"0\" + h;\n }\n };\n // RSAKey.prototype.setPrivate = RSASetPrivate;\n // Set the private key fields N, e, and d from hex strings\n RSAKey.prototype.setPrivate = function (N, E, D) {\n if (N != null && E != null && N.length > 0 && E.length > 0) {\n this.n = parseBigInt(N, 16);\n this.e = parseInt(E, 16);\n this.d = parseBigInt(D, 16);\n }\n else {\n console.error(\"Invalid RSA private key\");\n }\n };\n // RSAKey.prototype.setPrivateEx = RSASetPrivateEx;\n // Set the private key fields N, e, d and CRT params from hex strings\n RSAKey.prototype.setPrivateEx = function (N, E, D, P, Q, DP, DQ, C) {\n if (N != null && E != null && N.length > 0 && E.length > 0) {\n this.n = parseBigInt(N, 16);\n this.e = parseInt(E, 16);\n this.d = parseBigInt(D, 16);\n this.p = parseBigInt(P, 16);\n this.q = parseBigInt(Q, 16);\n this.dmp1 = parseBigInt(DP, 16);\n this.dmq1 = parseBigInt(DQ, 16);\n this.coeff = parseBigInt(C, 16);\n }\n else {\n console.error(\"Invalid RSA private key\");\n }\n };\n // RSAKey.prototype.generate = RSAGenerate;\n // Generate a new random private key B bits long, using public expt E\n RSAKey.prototype.generate = function (B, E) {\n var rng = new SecureRandom();\n var qs = B >> 1;\n this.e = parseInt(E, 16);\n var ee = new BigInteger(E, 16);\n for (;;) {\n for (;;) {\n this.p = new BigInteger(B - qs, 1, rng);\n if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {\n break;\n }\n }\n for (;;) {\n this.q = new BigInteger(qs, 1, rng);\n if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {\n break;\n }\n }\n if (this.p.compareTo(this.q) <= 0) {\n var t = this.p;\n this.p = this.q;\n this.q = t;\n }\n var p1 = this.p.subtract(BigInteger.ONE);\n var q1 = this.q.subtract(BigInteger.ONE);\n var phi = p1.multiply(q1);\n if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {\n this.n = this.p.multiply(this.q);\n this.d = ee.modInverse(phi);\n this.dmp1 = this.d.mod(p1);\n this.dmq1 = this.d.mod(q1);\n this.coeff = this.q.modInverse(this.p);\n break;\n }\n }\n };\n // RSAKey.prototype.decrypt = RSADecrypt;\n // Return the PKCS#1 RSA decryption of \"ctext\".\n // \"ctext\" is an even-length hex string and the output is a plain string.\n RSAKey.prototype.decrypt = function (ctext) {\n var c = parseBigInt(ctext, 16);\n var m = this.doPrivate(c);\n if (m == null) {\n return null;\n }\n return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);\n };\n // Generate a new random private key B bits long, using public expt E\n RSAKey.prototype.generateAsync = function (B, E, callback) {\n var rng = new SecureRandom();\n var qs = B >> 1;\n this.e = parseInt(E, 16);\n var ee = new BigInteger(E, 16);\n var rsa = this;\n // These functions have non-descript names because they were originally for(;;) loops.\n // I don't know about cryptography to give them better names than loop1-4.\n var loop1 = function () {\n var loop4 = function () {\n if (rsa.p.compareTo(rsa.q) <= 0) {\n var t = rsa.p;\n rsa.p = rsa.q;\n rsa.q = t;\n }\n var p1 = rsa.p.subtract(BigInteger.ONE);\n var q1 = rsa.q.subtract(BigInteger.ONE);\n var phi = p1.multiply(q1);\n if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {\n rsa.n = rsa.p.multiply(rsa.q);\n rsa.d = ee.modInverse(phi);\n rsa.dmp1 = rsa.d.mod(p1);\n rsa.dmq1 = rsa.d.mod(q1);\n rsa.coeff = rsa.q.modInverse(rsa.p);\n setTimeout(function () { callback(); }, 0); // escape\n }\n else {\n setTimeout(loop1, 0);\n }\n };\n var loop3 = function () {\n rsa.q = nbi();\n rsa.q.fromNumberAsync(qs, 1, rng, function () {\n rsa.q.subtract(BigInteger.ONE).gcda(ee, function (r) {\n if (r.compareTo(BigInteger.ONE) == 0 && rsa.q.isProbablePrime(10)) {\n setTimeout(loop4, 0);\n }\n else {\n setTimeout(loop3, 0);\n }\n });\n });\n };\n var loop2 = function () {\n rsa.p = nbi();\n rsa.p.fromNumberAsync(B - qs, 1, rng, function () {\n rsa.p.subtract(BigInteger.ONE).gcda(ee, function (r) {\n if (r.compareTo(BigInteger.ONE) == 0 && rsa.p.isProbablePrime(10)) {\n setTimeout(loop3, 0);\n }\n else {\n setTimeout(loop2, 0);\n }\n });\n });\n };\n setTimeout(loop2, 0);\n };\n setTimeout(loop1, 0);\n };\n RSAKey.prototype.sign = function (text, digestMethod, digestName) {\n var header = getDigestHeader(digestName);\n var digest = header + digestMethod(text).toString();\n var m = pkcs1pad1(digest, this.n.bitLength() / 4);\n if (m == null) {\n return null;\n }\n var c = this.doPrivate(m);\n if (c == null) {\n return null;\n }\n var h = c.toString(16);\n if ((h.length & 1) == 0) {\n return h;\n }\n else {\n return \"0\" + h;\n }\n };\n RSAKey.prototype.verify = function (text, signature, digestMethod) {\n var c = parseBigInt(signature, 16);\n var m = this.doPublic(c);\n if (m == null) {\n return null;\n }\n var unpadded = m.toString(16).replace(/^1f+00/, \"\");\n var digest = removeDigestHeader(unpadded);\n return digest == digestMethod(text).toString();\n };\n return RSAKey;\n}());\n// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext\nfunction pkcs1unpad2(d, n) {\n var b = d.toByteArray();\n var i = 0;\n while (i < b.length && b[i] == 0) {\n ++i;\n }\n if (b.length - i != n - 1 || b[i] != 2) {\n return null;\n }\n ++i;\n while (b[i] != 0) {\n if (++i >= b.length) {\n return null;\n }\n }\n var ret = \"\";\n while (++i < b.length) {\n var c = b[i] & 255;\n if (c < 128) { // utf-8 decode\n ret += String.fromCharCode(c);\n }\n else if ((c > 191) && (c < 224)) {\n ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));\n ++i;\n }\n else {\n ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));\n i += 2;\n }\n }\n return ret;\n}\n// https://tools.ietf.org/html/rfc3447#page-43\nvar DIGEST_HEADERS = {\n md2: \"3020300c06082a864886f70d020205000410\",\n md5: \"3020300c06082a864886f70d020505000410\",\n sha1: \"3021300906052b0e03021a05000414\",\n sha224: \"302d300d06096086480165030402040500041c\",\n sha256: \"3031300d060960864801650304020105000420\",\n sha384: \"3041300d060960864801650304020205000430\",\n sha512: \"3051300d060960864801650304020305000440\",\n ripemd160: \"3021300906052b2403020105000414\",\n};\nfunction getDigestHeader(name) {\n return DIGEST_HEADERS[name] || \"\";\n}\nfunction removeDigestHeader(str) {\n for (var name_1 in DIGEST_HEADERS) {\n if (DIGEST_HEADERS.hasOwnProperty(name_1)) {\n var header = DIGEST_HEADERS[name_1];\n var len = header.length;\n if (str.substr(0, len) == header) {\n return str.substr(len);\n }\n }\n }\n return str;\n}\n// Return the PKCS#1 RSA encryption of \"text\" as a Base64-encoded string\n// function RSAEncryptB64(text) {\n// var h = this.encrypt(text);\n// if(h) return hex2b64(h); else return null;\n// }\n// public\n// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;\n\n/*!\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttp://developer.yahoo.com/yui/license.html\nversion: 2.9.0\n*/\nvar YAHOO = {};\nYAHOO.lang = {\n /**\n * Utility to set up the prototype, constructor and superclass properties to\n * support an inheritance strategy that can chain constructors and methods.\n * Static members will not be inherited.\n *\n * @method extend\n * @static\n * @param {Function} subc the object to modify\n * @param {Function} superc the object to inherit\n * @param {Object} overrides additional properties/methods to add to the\n * subclass prototype. These will override the\n * matching items obtained from the superclass\n * if present.\n */\n extend: function(subc, superc, overrides) {\n if (! superc || ! subc) {\n throw new Error(\"YAHOO.lang.extend failed, please check that \" +\n \"all dependencies are included.\");\n }\n\n var F = function() {};\n F.prototype = superc.prototype;\n subc.prototype = new F();\n subc.prototype.constructor = subc;\n subc.superclass = superc.prototype;\n\n if (superc.prototype.constructor == Object.prototype.constructor) {\n superc.prototype.constructor = superc;\n }\n\n if (overrides) {\n var i;\n for (i in overrides) {\n subc.prototype[i] = overrides[i];\n }\n\n /*\n * IE will not enumerate native functions in a derived object even if the\n * function was overridden. This is a workaround for specific functions\n * we care about on the Object prototype.\n * @property _IEEnumFix\n * @param {Function} r the object to receive the augmentation\n * @param {Function} s the object that supplies the properties to augment\n * @static\n * @private\n */\n var _IEEnumFix = function() {},\n ADD = [\"toString\", \"valueOf\"];\n try {\n if (/MSIE/.test(navigator.userAgent)) {\n _IEEnumFix = function(r, s) {\n for (i = 0; i < ADD.length; i = i + 1) {\n var fname = ADD[i], f = s[fname];\n if (typeof f === 'function' && f != Object.prototype[fname]) {\n r[fname] = f;\n }\n }\n };\n }\n } catch (ex) {} _IEEnumFix(subc.prototype, overrides);\n }\n }\n};\n\n/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license\n */\n\n/**\n * @fileOverview\n * @name asn1-1.0.js\n * @author Kenji Urushima kenji.urushima@gmail.com\n * @version asn1 1.0.13 (2017-Jun-02)\n * @since jsrsasign 2.1\n * @license <a href=\"https://kjur.github.io/jsrsasign/license/\">MIT License</a>\n */\n\n/**\n * kjur's class library name space\n * <p>\n * This name space provides following name spaces:\n * <ul>\n * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>\n * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>\n * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature\n * class and utilities</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.\n * @name KJUR\n * @namespace kjur's class library name space\n */\nvar KJUR = {};\n\n/**\n * kjur's ASN.1 class library name space\n * <p>\n * This is ITU-T X.690 ASN.1 DER encoder class library and\n * class structure and methods is very similar to\n * org.bouncycastle.asn1 package of\n * well known BouncyCaslte Cryptography Library.\n * <h4>PROVIDING ASN.1 PRIMITIVES</h4>\n * Here are ASN.1 DER primitive classes.\n * <ul>\n * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>\n * <li>0x02 {@link KJUR.asn1.DERInteger}</li>\n * <li>0x03 {@link KJUR.asn1.DERBitString}</li>\n * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>\n * <li>0x05 {@link KJUR.asn1.DERNull}</li>\n * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>\n * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>\n * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>\n * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>\n * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>\n * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>\n * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>\n * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>\n * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>\n * <li>0x30 {@link KJUR.asn1.DERSequence}</li>\n * <li>0x31 {@link KJUR.asn1.DERSet}</li>\n * </ul>\n * <h4>OTHER ASN.1 CLASSES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.ASN1Object}</li>\n * <li>{@link KJUR.asn1.DERAbstractString}</li>\n * <li>{@link KJUR.asn1.DERAbstractTime}</li>\n * <li>{@link KJUR.asn1.DERAbstractStructured}</li>\n * <li>{@link KJUR.asn1.DERTaggedObject}</li>\n * </ul>\n * <h4>SUB NAME SPACES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>\n * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>\n * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>\n * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>\n * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace.\n * This caused by a bug of jsdoc2.\n * @name KJUR.asn1\n * @namespace\n */\nif (typeof KJUR.asn1 == \"undefined\" || !KJUR.asn1) KJUR.asn1 = {};\n\n/**\n * ASN1 utilities class\n * @name KJUR.asn1.ASN1Util\n * @class ASN1 utilities class\n * @since asn1 1.0.2\n */\nKJUR.asn1.ASN1Util = new function() {\n this.integerToByteHex = function(i) {\n var h = i.toString(16);\n if ((h.length % 2) == 1) h = '0' + h;\n return h;\n };\n this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) {\n var h = bigIntegerValue.toString(16);\n if (h.substr(0, 1) != '-') {\n if (h.length % 2 == 1) {\n h = '0' + h;\n } else {\n if (! h.match(/^[0-7]/)) {\n h = '00' + h;\n }\n }\n } else {\n var hPos = h.substr(1);\n var xorLen = hPos.length;\n if (xorLen % 2 == 1) {\n xorLen += 1;\n } else {\n if (! h.match(/^[0-7]/)) {\n xorLen += 2;\n }\n }\n var hMask = '';\n for (var i = 0; i < xorLen; i++) {\n hMask += 'f';\n }\n var biMask = new BigInteger(hMask, 16);\n var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);\n h = biNeg.toString(16).replace(/^-/, '');\n }\n return h;\n };\n /**\n * get PEM string from hexadecimal data and header string\n * @name getPEMStringFromHex\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {String} dataHex hexadecimal string of PEM body\n * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')\n * @return {String} PEM formatted string of input data\n * @description\n * This method converts a hexadecimal string to a PEM string with\n * a specified header. Its line break will be CRLF(\"\\r\\n\").\n * @example\n * var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');\n * // value of pem will be:\n * -----BEGIN PRIVATE KEY-----\n * YWFh\n * -----END PRIVATE KEY-----\n */\n this.getPEMStringFromHex = function(dataHex, pemHeader) {\n return hextopem(dataHex, pemHeader);\n };\n\n /**\n * generate ASN1Object specifed by JSON parameters\n * @name newObject\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {Array} param JSON parameter to generate ASN1Object\n * @return {KJUR.asn1.ASN1Object} generated object\n * @since asn1 1.0.3\n * @description\n * generate any ASN1Object specified by JSON param\n * including ASN.1 primitive or structured.\n * Generally 'param' can be described as follows:\n * <blockquote>\n * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}\n * </blockquote>\n * 'TYPE-OF-ASN1OBJ' can be one of following symbols:\n * <ul>\n * <li>'bool' - DERBoolean</li>\n * <li>'int' - DERInteger</li>\n * <li>'bitstr' - DERBitString</li>\n * <li>'octstr' - DEROctetString</li>\n * <li>'null' - DERNull</li>\n * <li>'oid' - DERObjectIdentifier</li>\n * <li>'enum' - DEREnumerated</li>\n * <li>'utf8str' - DERUTF8String</li>\n * <li>'numstr' - DERNumericString</li>\n * <li>'prnstr' - DERPrintableString</li>\n * <li>'telstr' - DERTeletexString</li>\n * <li>'ia5str' - DERIA5String</li>\n * <li>'utctime' - DERUTCTime</li>\n * <li>'gentime' - DERGeneralizedTime</li>\n * <li>'seq' - DERSequence</li>\n * <li>'set' - DERSet</li>\n * <li>'tag' - DERTaggedObject</li>\n * </ul>\n * @example\n * newObject({'prnstr': 'aaa'});\n * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})\n * // ASN.1 Tagged Object\n * newObject({'tag': {'tag': 'a1',\n * 'explicit': true,\n * 'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});\n * // more simple representation of ASN.1 Tagged Object\n * newObject({'tag': ['a1',\n * true,\n * {'seq': [\n * {'int': 3},\n * {'prnstr': 'aaa'}]}\n * ]});\n */\n this.newObject = function(param) {\n var _KJUR = KJUR,\n _KJUR_asn1 = _KJUR.asn1,\n _DERBoolean = _KJUR_asn1.DERBoolean,\n _DERInteger = _KJUR_asn1.DERInteger,\n _DERBitString = _KJUR_asn1.DERBitString,\n _DEROctetString = _KJUR_asn1.DEROctetString,\n _DERNull = _KJUR_asn1.DERNull,\n _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier,\n _DEREnumerated = _KJUR_asn1.DEREnumerated,\n _DERUTF8String = _KJUR_asn1.DERUTF8String,\n _DERNumericString = _KJUR_asn1.DERNumericString,\n _DERPrintableString = _KJUR_asn1.DERPrintableString,\n _DERTeletexString = _KJUR_asn1.DERTeletexString,\n _DERIA5String = _KJUR_asn1.DERIA5String,\n _DERUTCTime = _KJUR_asn1.DERUTCTime,\n _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime,\n _DERSequence = _KJUR_asn1.DERSequence,\n _DERSet = _KJUR_asn1.DERSet,\n _DERTaggedObject = _KJUR_asn1.DERTaggedObject,\n _newObject = _KJUR_asn1.ASN1Util.newObject;\n\n var keys = Object.keys(param);\n if (keys.length != 1)\n throw \"key of param shall be only one.\";\n var key = keys[0];\n\n if (\":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:\".indexOf(\":\" + key + \":\") == -1)\n throw \"undefined key: \" + key;\n\n if (key == \"bool\") return new _DERBoolean(param[key]);\n if (key == \"int\") return new _DERInteger(param[key]);\n if (key == \"bitstr\") return new _DERBitString(param[key]);\n if (key == \"octstr\") return new _DEROctetString(param[key]);\n if (key == \"null\") return new _DERNull(param[key]);\n if (key == \"oid\") return new _DERObjectIdentifier(param[key]);\n if (key == \"enum\") return new _DEREnumerated(param[key]);\n if (key == \"utf8str\") return new _DERUTF8String(param[key]);\n if (key == \"numstr\") return new _DERNumericString(param[key]);\n if (key == \"prnstr\") return new _DERPrintableString(param[key]);\n if (key == \"telstr\") return new _DERTeletexString(param[key]);\n if (key == \"ia5str\") return new _DERIA5String(param[key]);\n if (key == \"utctime\") return new _DERUTCTime(param[key]);\n if (key == \"gentime\") return new _DERGeneralizedTime(param[key]);\n\n if (key == \"seq\") {\n var paramList = param[key];\n var a = [];\n for (var i = 0; i < paramList.length; i++) {\n var asn1Obj = _newObject(paramList[i]);\n a.push(asn1Obj);\n }\n return new _DERSequence({'array': a});\n }\n\n if (key == \"set\") {\n var paramList = param[key];\n var a = [];\n for (var i = 0; i < paramList.length; i++) {\n var asn1Obj = _newObject(paramList[i]);\n a.push(asn1Obj);\n }\n return new _DERSet({'array': a});\n }\n\n if (key == \"tag\") {\n var tagParam = param[key];\n if (Object.prototype.toString.call(tagParam) === '[object Array]' &&\n tagParam.length == 3) {\n var obj = _newObject(tagParam[2]);\n return new _DERTaggedObject({tag: tagParam[0],\n explicit: tagParam[1],\n obj: obj});\n } else {\n var newParam = {};\n if (tagParam.explicit !== undefined)\n newParam.explicit = tagParam.explicit;\n if (tagParam.tag !== undefined)\n newParam.tag = tagParam.tag;\n if (tagParam.obj === undefined)\n throw \"obj shall be specified for 'tag'.\";\n newParam.obj = _newObject(tagParam.obj);\n return new _DERTaggedObject(newParam);\n }\n }\n };\n\n /**\n * get encoded hexadecimal string of ASN1Object specifed by JSON parameters\n * @name jsonToASN1HEX\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {Array} param JSON parameter to generate ASN1Object\n * @return hexadecimal string of ASN1Object\n * @since asn1 1.0.4\n * @description\n * As for ASN.1 object representation of JSON object,\n * please see {@link newObject}.\n * @example\n * jsonToASN1HEX({'prnstr': 'aaa'});\n */\n this.jsonToASN1HEX = function(param) {\n var asn1Obj = this.newObject(param);\n return asn1Obj.getEncodedHex();\n };\n};\n\n/**\n * get dot noted oid number string from hexadecimal value of OID\n * @name oidHexToInt\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {String} hex hexadecimal value of object identifier\n * @return {String} dot noted string of object identifier\n * @since jsrsasign 4.8.3 asn1 1.0.7\n * @description\n * This static method converts from hexadecimal string representation of\n * ASN.1 value of object identifier to oid number string.\n * @example\n * KJUR.asn1.ASN1Util.oidHexToInt('550406') → \"2.5.4.6\"\n */\nKJUR.asn1.ASN1Util.oidHexToInt = function(hex) {\n var s = \"\";\n var i01 = parseInt(hex.substr(0, 2), 16);\n var i0 = Math.floor(i01 / 40);\n var i1 = i01 % 40;\n var s = i0 + \".\" + i1;\n\n var binbuf = \"\";\n for (var i = 2; i < hex.length; i += 2) {\n var value = parseInt(hex.substr(i, 2), 16);\n var bin = (\"00000000\" + value.toString(2)).slice(- 8);\n binbuf = binbuf + bin.substr(1, 7);\n if (bin.substr(0, 1) == \"0\") {\n var bi = new BigInteger(binbuf, 2);\n s = s + \".\" + bi.toString(10);\n binbuf = \"\";\n }\n }\n return s;\n};\n\n/**\n * get hexadecimal value of object identifier from dot noted oid value\n * @name oidIntToHex\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {String} oidString dot noted string of object identifier\n * @return {String} hexadecimal value of object identifier\n * @since jsrsasign 4.8.3 asn1 1.0.7\n * @description\n * This static method converts from object identifier value string.\n * to hexadecimal string representation of it.\n * @example\n * KJUR.asn1.ASN1Util.oidIntToHex(\"2.5.4.6\") → \"550406\"\n */\nKJUR.asn1.ASN1Util.oidIntToHex = function(oidString) {\n var itox = function(i) {\n var h = i.toString(16);\n if (h.length == 1) h = '0' + h;\n return h;\n };\n\n var roidtox = function(roid) {\n var h = '';\n var bi = new BigInteger(roid, 10);\n var b = bi.toString(2);\n var padLen = 7 - b.length % 7;\n if (padLen == 7) padLen = 0;\n var bPad = '';\n for (var i = 0; i < padLen; i++) bPad += '0';\n b = bPad + b;\n for (var i = 0; i < b.length - 1; i += 7) {\n var b8 = b.substr(i, 7);\n if (i != b.length - 7) b8 = '1' + b8;\n h += itox(parseInt(b8, 2));\n }\n return h;\n };\n\n if (! oidString.match(/^[0-9.]+$/)) {\n throw \"malformed oid string: \" + oidString;\n }\n var h = '';\n var a = oidString.split('.');\n var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);\n h += itox(i0);\n a.splice(0, 2);\n for (var i = 0; i < a.length; i++) {\n h += roidtox(a[i]);\n }\n return h;\n};\n\n\n// ********************************************************************\n// Abstract ASN.1 Classes\n// ********************************************************************\n\n// ********************************************************************\n\n/**\n * base class for ASN.1 DER encoder object\n * @name KJUR.asn1.ASN1Object\n * @class base class for ASN.1 DER encoder object\n * @property {Boolean} isModified flag whether internal data was changed\n * @property {String} hTLV hexadecimal string of ASN.1 TLV\n * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)\n * @property {String} hL hexadecimal string of ASN.1 TLV length(L)\n * @property {String} hV hexadecimal string of ASN.1 TLV value(V)\n * @description\n */\nKJUR.asn1.ASN1Object = function() {\n var hV = '';\n\n /**\n * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)\n * @name getLengthHexFromValue\n * @memberOf KJUR.asn1.ASN1Object#\n * @function\n * @return {String} hexadecimal string of ASN.1 TLV length(L)\n */\n this.getLengthHexFromValue = function() {\n if (typeof this.hV == \"undefined\" || this.hV == null) {\n throw \"this.hV is null or undefined.\";\n }\n if (this.hV.length % 2 == 1) {\n throw \"value hex must be even length: n=\" + hV.length + \",v=\" + this.hV;\n }\n var n = this.hV.length / 2;\n var hN = n.toString(16);\n if (hN.length % 2 == 1) {\n hN = \"0\" + hN;\n }\n if (n < 128) {\n return hN;\n } else {\n var hNlen = hN.length / 2;\n if (hNlen > 15) {\n throw \"ASN.1 length too long to represent by 8x: n = \" + n.toString(16);\n }\n var head = 128 + hNlen;\n return head.toString(16) + hN;\n }\n };\n\n /**\n * get hexadecimal string of ASN.1 TLV bytes\n * @name getEncodedHex\n * @memberOf KJUR.asn1.ASN1Object#\n * @function\n * @return {String} hexadecimal string of ASN.1 TLV\n */\n this.getEncodedHex = function() {\n if (this.hTLV == null || this.isModified) {\n this.hV = this.getFreshValueHex();\n this.hL = this.getLengthHexFromValue();\n this.hTLV = this.hT + this.hL + this.hV;\n this.isModified = false;\n //alert(\"first time: \" + this.hTLV);\n }\n return this.hTLV;\n };\n\n /**\n * get hexadecimal string of ASN.1 TLV value(V) bytes\n * @name getValueHex\n * @memberOf KJUR.asn1.ASN1Object#\n * @function\n * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes\n */\n this.getValueHex = function() {\n this.getEncodedHex();\n return this.hV;\n };\n\n this.getFreshValueHex = function() {\n return '';\n };\n};\n\n// == BEGIN DERAbstractString ================================================\n/**\n * base class for ASN.1 DER string classes\n * @name KJUR.asn1.DERAbstractString\n * @class base class for ASN.1 DER string classes\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @property {String} s internal string of value\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERAbstractString = function(params) {\n KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n\n /**\n * get string value of this string object\n * @name getString\n * @memberOf KJUR.asn1.DERAbstractString#\n * @function\n * @return {String} string value of this string object\n */\n this.getString = function() {\n return this.s;\n };\n\n /**\n * set value by a string\n * @name setString\n * @memberOf KJUR.asn1.DERAbstractString#\n * @function\n * @param {String} newS value by a string to set\n */\n this.setString = function(newS) {\n this.hTLV = null;\n this.isModified = true;\n this.s = newS;\n this.hV = stohex(this.s);\n };\n\n /**\n * set value by a hexadecimal string\n * @name setStringHex\n * @memberOf KJUR.asn1.DERAbstractString#\n * @function\n * @param {String} newHexString value by a hexadecimal string to set\n */\n this.setStringHex = function(newHexString) {\n this.hTLV = null;\n this.isModified = true;\n this.s = null;\n this.hV = newHexString;\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params == \"string\") {\n this.setString(params);\n } else if (typeof params['str'] != \"undefined\") {\n this.setString(params['str']);\n } else if (typeof params['hex'] != \"undefined\") {\n this.setStringHex(params['hex']);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);\n// == END DERAbstractString ================================================\n\n// == BEGIN DERAbstractTime ==================================================\n/**\n * base class for ASN.1 DER Generalized/UTCTime class\n * @name KJUR.asn1.DERAbstractTime\n * @class base class for ASN.1 DER Generalized/UTCTime class\n * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERAbstractTime = function(params) {\n KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);\n\n // --- PRIVATE METHODS --------------------\n this.localDateToUTC = function(d) {\n utc = d.getTime() + (d.getTimezoneOffset() * 60000);\n var utcDate = new Date(utc);\n return utcDate;\n };\n\n /*\n * format date string by Data object\n * @name formatDate\n * @memberOf KJUR.asn1.AbstractTime;\n * @param {Date} dateObject\n * @param {string} type 'utc' or 'gen'\n * @param {boolean} withMillis flag for with millisections or not\n * @description\n * 'withMillis' flag is supported from asn1 1.0.6.\n */\n this.formatDate = function(dateObject, type, withMillis) {\n var pad = this.zeroPadding;\n var d = this.localDateToUTC(dateObject);\n var year = String(d.getFullYear());\n if (type == 'utc') year = year.substr(2, 2);\n var month = pad(String(d.getMonth() + 1), 2);\n var day = pad(String(d.getDate()), 2);\n var hour = pad(String(d.getHours()), 2);\n var min = pad(String(d.getMinutes()), 2);\n var sec = pad(String(d.getSeconds()), 2);\n var s = year + month + day + hour + min + sec;\n if (withMillis === true) {\n var millis = d.getMilliseconds();\n if (millis != 0) {\n var sMillis = pad(String(millis), 3);\n sMillis = sMillis.replace(/[0]+$/, \"\");\n s = s + \".\" + sMillis;\n }\n }\n return s + \"Z\";\n };\n\n this.zeroPadding = function(s, len) {\n if (s.length >= len) return s;\n return new Array(len - s.length + 1).join('0') + s;\n };\n\n // --- PUBLIC METHODS --------------------\n /**\n * get string value of this string object\n * @name getString\n * @memberOf KJUR.asn1.DERAbstractTime#\n * @function\n * @return {String} string value of this time object\n */\n this.getString = function() {\n return this.s;\n };\n\n /**\n * set value by a string\n * @name setString\n * @memberOf KJUR.asn1.DERAbstractTime#\n * @function\n * @param {String} newS value by a string to set such like \"130430235959Z\"\n */\n this.setString = function(newS) {\n this.hTLV = null;\n this.isModified = true;\n this.s = newS;\n this.hV = stohex(newS);\n };\n\n /**\n * set value by a Date object\n * @name setByDateValue\n * @memberOf KJUR.asn1.DERAbstractTime#\n * @function\n * @param {Integer} year year of date (ex. 2013)\n * @param {Integer} month month of date between 1 and 12 (ex. 12)\n * @param {Integer} day day of month\n * @param {Integer} hour hours of date\n * @param {Integer} min minutes of date\n * @param {Integer} sec seconds of date\n */\n this.setByDateValue = function(year, month, day, hour, min, sec) {\n var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));\n this.setByDate(dateObject);\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n};\nYAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);\n// == END DERAbstractTime ==================================================\n\n// == BEGIN DERAbstractStructured ============================================\n/**\n * base class for ASN.1 DER structured class\n * @name KJUR.asn1.DERAbstractStructured\n * @class base class for ASN.1 DER structured class\n * @property {Array} asn1Array internal array of ASN1Object\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERAbstractStructured = function(params) {\n KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n\n /**\n * set value by array of ASN1Object\n * @name setByASN1ObjectArray\n * @memberOf KJUR.asn1.DERAbstractStructured#\n * @function\n * @param {array} asn1ObjectArray array of ASN1Object to set\n */\n this.setByASN1ObjectArray = function(asn1ObjectArray) {\n this.hTLV = null;\n this.isModified = true;\n this.asn1Array = asn1ObjectArray;\n };\n\n /**\n * append an ASN1Object to internal array\n * @name appendASN1Object\n * @memberOf KJUR.asn1.DERAbstractStructured#\n * @function\n * @param {ASN1Object} asn1Object to add\n */\n this.appendASN1Object = function(asn1Object) {\n this.hTLV = null;\n this.isModified = true;\n this.asn1Array.push(asn1Object);\n };\n\n this.asn1Array = new Array();\n if (typeof params != \"undefined\") {\n if (typeof params['array'] != \"undefined\") {\n this.asn1Array = params['array'];\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);\n\n\n// ********************************************************************\n// ASN.1 Object Classes\n// ********************************************************************\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Boolean\n * @name KJUR.asn1.DERBoolean\n * @class class for ASN.1 DER Boolean\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERBoolean = function() {\n KJUR.asn1.DERBoolean.superclass.constructor.call(this);\n this.hT = \"01\";\n this.hTLV = \"0101ff\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Integer\n * @name KJUR.asn1.DERInteger\n * @class class for ASN.1 DER Integer\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>int - specify initial ASN.1 value(V) by integer value</li>\n * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERInteger = function(params) {\n KJUR.asn1.DERInteger.superclass.constructor.call(this);\n this.hT = \"02\";\n\n /**\n * set value by Tom Wu's BigInteger object\n * @name setByBigInteger\n * @memberOf KJUR.asn1.DERInteger#\n * @function\n * @param {BigInteger} bigIntegerValue to set\n */\n this.setByBigInteger = function(bigIntegerValue) {\n this.hTLV = null;\n this.isModified = true;\n this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);\n };\n\n /**\n * set value by integer value\n * @name setByInteger\n * @memberOf KJUR.asn1.DERInteger\n * @function\n * @param {Integer} integer value to set\n */\n this.setByInteger = function(intValue) {\n var bi = new BigInteger(String(intValue), 10);\n this.setByBigInteger(bi);\n };\n\n /**\n * set value by integer value\n * @name setValueHex\n * @memberOf KJUR.asn1.DERInteger#\n * @function\n * @param {String} hexadecimal string of integer value\n * @description\n * <br/>\n * NOTE: Value shall be represented by minimum octet length of\n * two's complement representation.\n * @example\n * new KJUR.asn1.DERInteger(123);\n * new KJUR.asn1.DERInteger({'int': 123});\n * new KJUR.asn1.DERInteger({'hex': '1fad'});\n */\n this.setValueHex = function(newHexString) {\n this.hV = newHexString;\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params['bigint'] != \"undefined\") {\n this.setByBigInteger(params['bigint']);\n } else if (typeof params['int'] != \"undefined\") {\n this.setByInteger(params['int']);\n } else if (typeof params == \"number\") {\n this.setByInteger(params);\n } else if (typeof params['hex'] != \"undefined\") {\n this.setValueHex(params['hex']);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER encoded BitString primitive\n * @name KJUR.asn1.DERBitString\n * @class class for ASN.1 DER encoded BitString primitive\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>bin - specify binary string (ex. '10111')</li>\n * <li>array - specify array of boolean (ex. [true,false,true,true])</li>\n * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>\n * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}\n * argument for \"BitString encapsulates\" structure.</li>\n * </ul>\n * NOTE1: 'params' can be omitted.<br/>\n * NOTE2: 'obj' parameter have been supported since\n * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>\n * @example\n * // default constructor\n * o = new KJUR.asn1.DERBitString();\n * // initialize with binary string\n * o = new KJUR.asn1.DERBitString({bin: \"1011\"});\n * // initialize with boolean array\n * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});\n * // initialize with hexadecimal string (04 is unused bits)\n * o = new KJUR.asn1.DEROctetString({hex: \"04bac0\"});\n * // initialize with ASN1Util.newObject argument for encapsulated\n * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});\n * // above generates a ASN.1 data like this:\n * // BIT STRING, encapsulates {\n * // SEQUENCE {\n * // INTEGER 3\n * // PrintableString 'aaa'\n * // }\n * // }\n */\nKJUR.asn1.DERBitString = function(params) {\n if (params !== undefined && typeof params.obj !== \"undefined\") {\n var o = KJUR.asn1.ASN1Util.newObject(params.obj);\n params.hex = \"00\" + o.getEncodedHex();\n }\n KJUR.asn1.DERBitString.superclass.constructor.call(this);\n this.hT = \"03\";\n\n /**\n * set ASN.1 value(V) by a hexadecimal string including unused bits\n * @name setHexValueIncludingUnusedBits\n * @memberOf KJUR.asn1.DERBitString#\n * @function\n * @param {String} newHexStringIncludingUnusedBits\n */\n this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) {\n this.hTLV = null;\n this.isModified = true;\n this.hV = newHexStringIncludingUnusedBits;\n };\n\n /**\n * set ASN.1 value(V) by unused bit and hexadecimal string of value\n * @name setUnusedBitsAndHexValue\n * @memberOf KJUR.asn1.DERBitString#\n * @function\n * @param {Integer} unusedBits\n * @param {String} hValue\n */\n this.setUnusedBitsAndHexValue = function(unusedBits, hValue) {\n if (unusedBits < 0 || 7 < unusedBits) {\n throw \"unused bits shall be from 0 to 7: u = \" + unusedBits;\n }\n var hUnusedBits = \"0\" + unusedBits;\n this.hTLV = null;\n this.isModified = true;\n this.hV = hUnusedBits + hValue;\n };\n\n /**\n * set ASN.1 DER BitString by binary string<br/>\n * @name setByBinaryString\n * @memberOf KJUR.asn1.DERBitString#\n * @function\n * @param {String} binaryString binary value string (i.e. '10111')\n * @description\n * Its unused bits will be calculated automatically by length of\n * 'binaryValue'. <br/>\n * NOTE: Trailing zeros '0' will be ignored.\n * @example\n * o = new KJUR.asn1.DERBitString();\n * o.setByBooleanArray(\"01011\");\n */\n this.setByBinaryString = function(binaryString) {\n binaryString = binaryString.replace(/0+$/, '');\n var unusedBits = 8 - binaryString.length % 8;\n if (unusedBits == 8) unusedBits = 0;\n for (var i = 0; i <= unusedBits; i++) {\n binaryString += '0';\n }\n var h = '';\n for (var i = 0; i < binaryString.length - 1; i += 8) {\n var b = binaryString.substr(i, 8);\n var x = parseInt(b, 2).toString(16);\n if (x.length == 1) x = '0' + x;\n h += x;\n }\n this.hTLV = null;\n this.isModified = true;\n this.hV = '0' + unusedBits + h;\n };\n\n /**\n * set ASN.1 TLV value(V) by an array of boolean<br/>\n * @name setByBooleanArray\n * @memberOf KJUR.asn1.DERBitString#\n * @function\n * @param {array} booleanArray array of boolean (ex. [true, false, true])\n * @description\n * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.\n * @example\n * o = new KJUR.asn1.DERBitString();\n * o.setByBooleanArray([false, true, false, true, true]);\n */\n this.setByBooleanArray = function(booleanArray) {\n var s = '';\n for (var i = 0; i < booleanArray.length; i++) {\n if (booleanArray[i] == true) {\n s += '1';\n } else {\n s += '0';\n }\n }\n this.setByBinaryString(s);\n };\n\n /**\n * generate an array of falses with specified length<br/>\n * @name newFalseArray\n * @memberOf KJUR.asn1.DERBitString\n * @function\n * @param {Integer} nLength length of array to generate\n * @return {array} array of boolean falses\n * @description\n * This static method may be useful to initialize boolean array.\n * @example\n * o = new KJUR.asn1.DERBitString();\n * o.newFalseArray(3) → [false, false, false]\n */\n this.newFalseArray = function(nLength) {\n var a = new Array(nLength);\n for (var i = 0; i < nLength; i++) {\n a[i] = false;\n }\n return a;\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params == \"string\" && params.toLowerCase().match(/^[0-9a-f]+$/)) {\n this.setHexValueIncludingUnusedBits(params);\n } else if (typeof params['hex'] != \"undefined\") {\n this.setHexValueIncludingUnusedBits(params['hex']);\n } else if (typeof params['bin'] != \"undefined\") {\n this.setByBinaryString(params['bin']);\n } else if (typeof params['array'] != \"undefined\") {\n this.setByBooleanArray(params['array']);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER OctetString<br/>\n * @name KJUR.asn1.DEROctetString\n * @class class for ASN.1 DER OctetString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * This class provides ASN.1 OctetString simple type.<br/>\n * Supported \"params\" attributes are:\n * <ul>\n * <li>str - to set a string as a value</li>\n * <li>hex - to set a hexadecimal string as a value</li>\n * <li>obj - to set a encapsulated ASN.1 value by JSON object\n * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>\n * </ul>\n * NOTE: A parameter 'obj' have been supported\n * for \"OCTET STRING, encapsulates\" structure.\n * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).\n * @see KJUR.asn1.DERAbstractString - superclass\n * @example\n * // default constructor\n * o = new KJUR.asn1.DEROctetString();\n * // initialize with string\n * o = new KJUR.asn1.DEROctetString({str: \"aaa\"});\n * // initialize with hexadecimal string\n * o = new KJUR.asn1.DEROctetString({hex: \"616161\"});\n * // initialize with ASN1Util.newObject argument\n * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});\n * // above generates a ASN.1 data like this:\n * // OCTET STRING, encapsulates {\n * // SEQUENCE {\n * // INTEGER 3\n * // PrintableString 'aaa'\n * // }\n * // }\n */\nKJUR.asn1.DEROctetString = function(params) {\n if (params !== undefined && typeof params.obj !== \"undefined\") {\n var o = KJUR.asn1.ASN1Util.newObject(params.obj);\n params.hex = o.getEncodedHex();\n }\n KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);\n this.hT = \"04\";\n};\nYAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Null\n * @name KJUR.asn1.DERNull\n * @class class for ASN.1 DER Null\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERNull = function() {\n KJUR.asn1.DERNull.superclass.constructor.call(this);\n this.hT = \"05\";\n this.hTLV = \"0500\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER ObjectIdentifier\n * @name KJUR.asn1.DERObjectIdentifier\n * @class class for ASN.1 DER ObjectIdentifier\n * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERObjectIdentifier = function(params) {\n var itox = function(i) {\n var h = i.toString(16);\n if (h.length == 1) h = '0' + h;\n return h;\n };\n var roidtox = function(roid) {\n var h = '';\n var bi = new BigInteger(roid, 10);\n var b = bi.toString(2);\n var padLen = 7 - b.length % 7;\n if (padLen == 7) padLen = 0;\n var bPad = '';\n for (var i = 0; i < padLen; i++) bPad += '0';\n b = bPad + b;\n for (var i = 0; i < b.length - 1; i += 7) {\n var b8 = b.substr(i, 7);\n if (i != b.length - 7) b8 = '1' + b8;\n h += itox(parseInt(b8, 2));\n }\n return h;\n };\n\n KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);\n this.hT = \"06\";\n\n /**\n * set value by a hexadecimal string\n * @name setValueHex\n * @memberOf KJUR.asn1.DERObjectIdentifier#\n * @function\n * @param {String} newHexString hexadecimal value of OID bytes\n */\n this.setValueHex = function(newHexString) {\n this.hTLV = null;\n this.isModified = true;\n this.s = null;\n this.hV = newHexString;\n };\n\n /**\n * set value by a OID string<br/>\n * @name setValueOidString\n * @memberOf KJUR.asn1.DERObjectIdentifier#\n * @function\n * @param {String} oidString OID string (ex. 2.5.4.13)\n * @example\n * o = new KJUR.asn1.DERObjectIdentifier();\n * o.setValueOidString(\"2.5.4.13\");\n */\n this.setValueOidString = function(oidString) {\n if (! oidString.match(/^[0-9.]+$/)) {\n throw \"malformed oid string: \" + oidString;\n }\n var h = '';\n var a = oidString.split('.');\n var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);\n h += itox(i0);\n a.splice(0, 2);\n for (var i = 0; i < a.length; i++) {\n h += roidtox(a[i]);\n }\n this.hTLV = null;\n this.isModified = true;\n this.s = null;\n this.hV = h;\n };\n\n /**\n * set value by a OID name\n * @name setValueName\n * @memberOf KJUR.asn1.DERObjectIdentifier#\n * @function\n * @param {String} oidName OID name (ex. 'serverAuth')\n * @since 1.0.1\n * @description\n * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.\n * Otherwise raise error.\n * @example\n * o = new KJUR.asn1.DERObjectIdentifier();\n * o.setValueName(\"serverAuth\");\n */\n this.setValueName = function(oidName) {\n var oid = KJUR.asn1.x509.OID.name2oid(oidName);\n if (oid !== '') {\n this.setValueOidString(oid);\n } else {\n throw \"DERObjectIdentifier oidName undefined: \" + oidName;\n }\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (params !== undefined) {\n if (typeof params === \"string\") {\n if (params.match(/^[0-2].[0-9.]+$/)) {\n this.setValueOidString(params);\n } else {\n this.setValueName(params);\n }\n } else if (params.oid !== undefined) {\n this.setValueOidString(params.oid);\n } else if (params.hex !== undefined) {\n this.setValueHex(params.hex);\n } else if (params.name !== undefined) {\n this.setValueName(params.name);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Enumerated\n * @name KJUR.asn1.DEREnumerated\n * @class class for ASN.1 DER Enumerated\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>int - specify initial ASN.1 value(V) by integer value</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n * @example\n * new KJUR.asn1.DEREnumerated(123);\n * new KJUR.asn1.DEREnumerated({int: 123});\n * new KJUR.asn1.DEREnumerated({hex: '1fad'});\n */\nKJUR.asn1.DEREnumerated = function(params) {\n KJUR.asn1.DEREnumerated.superclass.constructor.call(this);\n this.hT = \"0a\";\n\n /**\n * set value by Tom Wu's BigInteger object\n * @name setByBigInteger\n * @memberOf KJUR.asn1.DEREnumerated#\n * @function\n * @param {BigInteger} bigIntegerValue to set\n */\n this.setByBigInteger = function(bigIntegerValue) {\n this.hTLV = null;\n this.isModified = true;\n this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);\n };\n\n /**\n * set value by integer value\n * @name setByInteger\n * @memberOf KJUR.asn1.DEREnumerated#\n * @function\n * @param {Integer} integer value to set\n */\n this.setByInteger = function(intValue) {\n var bi = new BigInteger(String(intValue), 10);\n this.setByBigInteger(bi);\n };\n\n /**\n * set value by integer value\n * @name setValueHex\n * @memberOf KJUR.asn1.DEREnumerated#\n * @function\n * @param {String} hexadecimal string of integer value\n * @description\n * <br/>\n * NOTE: Value shall be represented by minimum octet length of\n * two's complement representation.\n */\n this.setValueHex = function(newHexString) {\n this.hV = newHexString;\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params['int'] != \"undefined\") {\n this.setByInteger(params['int']);\n } else if (typeof params == \"number\") {\n this.setByInteger(params);\n } else if (typeof params['hex'] != \"undefined\") {\n this.setValueHex(params['hex']);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER UTF8String\n * @name KJUR.asn1.DERUTF8String\n * @class class for ASN.1 DER UTF8String\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERUTF8String = function(params) {\n KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);\n this.hT = \"0c\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER NumericString\n * @name KJUR.asn1.DERNumericString\n * @class class for ASN.1 DER NumericString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERNumericString = function(params) {\n KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);\n this.hT = \"12\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER PrintableString\n * @name KJUR.asn1.DERPrintableString\n * @class class for ASN.1 DER PrintableString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERPrintableString = function(params) {\n KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);\n this.hT = \"13\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER TeletexString\n * @name KJUR.asn1.DERTeletexString\n * @class class for ASN.1 DER TeletexString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERTeletexString = function(params) {\n KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);\n this.hT = \"14\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER IA5String\n * @name KJUR.asn1.DERIA5String\n * @class class for ASN.1 DER IA5String\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERIA5String = function(params) {\n KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);\n this.hT = \"16\";\n};\nYAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER UTCTime\n * @name KJUR.asn1.DERUTCTime\n * @class class for ASN.1 DER UTCTime\n * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})\n * @extends KJUR.asn1.DERAbstractTime\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * <li>date - specify Date object.</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n * <h4>EXAMPLES</h4>\n * @example\n * d1 = new KJUR.asn1.DERUTCTime();\n * d1.setString('130430125959Z');\n *\n * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});\n * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});\n * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');\n */\nKJUR.asn1.DERUTCTime = function(params) {\n KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);\n this.hT = \"17\";\n\n /**\n * set value by a Date object<br/>\n * @name setByDate\n * @memberOf KJUR.asn1.DERUTCTime#\n * @function\n * @param {Date} dateObject Date object to set ASN.1 value(V)\n * @example\n * o = new KJUR.asn1.DERUTCTime();\n * o.setByDate(new Date(\"2016/12/31\"));\n */\n this.setByDate = function(dateObject) {\n this.hTLV = null;\n this.isModified = true;\n this.date = dateObject;\n this.s = this.formatDate(this.date, 'utc');\n this.hV = stohex(this.s);\n };\n\n this.getFreshValueHex = function() {\n if (typeof this.date == \"undefined\" && typeof this.s == \"undefined\") {\n this.date = new Date();\n this.s = this.formatDate(this.date, 'utc');\n this.hV = stohex(this.s);\n }\n return this.hV;\n };\n\n if (params !== undefined) {\n if (params.str !== undefined) {\n this.setString(params.str);\n } else if (typeof params == \"string\" && params.match(/^[0-9]{12}Z$/)) {\n this.setString(params);\n } else if (params.hex !== undefined) {\n this.setStringHex(params.hex);\n } else if (params.date !== undefined) {\n this.setByDate(params.date);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER GeneralizedTime\n * @name KJUR.asn1.DERGeneralizedTime\n * @class class for ASN.1 DER GeneralizedTime\n * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})\n * @property {Boolean} withMillis flag to show milliseconds or not\n * @extends KJUR.asn1.DERAbstractTime\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * <li>date - specify Date object.</li>\n * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>\n * </ul>\n * NOTE1: 'params' can be omitted.\n * NOTE2: 'withMillis' property is supported from asn1 1.0.6.\n */\nKJUR.asn1.DERGeneralizedTime = function(params) {\n KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);\n this.hT = \"18\";\n this.withMillis = false;\n\n /**\n * set value by a Date object\n * @name setByDate\n * @memberOf KJUR.asn1.DERGeneralizedTime#\n * @function\n * @param {Date} dateObject Date object to set ASN.1 value(V)\n * @example\n * When you specify UTC time, use 'Date.UTC' method like this:<br/>\n * o1 = new DERUTCTime();\n * o1.setByDate(date);\n *\n * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59\n */\n this.setByDate = function(dateObject) {\n this.hTLV = null;\n this.isModified = true;\n this.date = dateObject;\n this.s = this.formatDate(this.date, 'gen', this.withMillis);\n this.hV = stohex(this.s);\n };\n\n this.getFreshValueHex = function() {\n if (this.date === undefined && this.s === undefined) {\n this.date = new Date();\n this.s = this.formatDate(this.date, 'gen', this.withMillis);\n this.hV = stohex(this.s);\n }\n return this.hV;\n };\n\n if (params !== undefined) {\n if (params.str !== undefined) {\n this.setString(params.str);\n } else if (typeof params == \"string\" && params.match(/^[0-9]{14}Z$/)) {\n this.setString(params);\n } else if (params.hex !== undefined) {\n this.setStringHex(params.hex);\n } else if (params.date !== undefined) {\n this.setByDate(params.date);\n }\n if (params.millis === true) {\n this.withMillis = true;\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Sequence\n * @name KJUR.asn1.DERSequence\n * @class class for ASN.1 DER Sequence\n * @extends KJUR.asn1.DERAbstractStructured\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>array - specify array of ASN1Object to set elements of content</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERSequence = function(params) {\n KJUR.asn1.DERSequence.superclass.constructor.call(this, params);\n this.hT = \"30\";\n this.getFreshValueHex = function() {\n var h = '';\n for (var i = 0; i < this.asn1Array.length; i++) {\n var asn1Obj = this.asn1Array[i];\n h += asn1Obj.getEncodedHex();\n }\n this.hV = h;\n return this.hV;\n };\n};\nYAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER Set\n * @name KJUR.asn1.DERSet\n * @class class for ASN.1 DER Set\n * @extends KJUR.asn1.DERAbstractStructured\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>array - specify array of ASN1Object to set elements of content</li>\n * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>\n * </ul>\n * NOTE1: 'params' can be omitted.<br/>\n * NOTE2: sortflag is supported since 1.0.5.\n */\nKJUR.asn1.DERSet = function(params) {\n KJUR.asn1.DERSet.superclass.constructor.call(this, params);\n this.hT = \"31\";\n this.sortFlag = true; // item shall be sorted only in ASN.1 DER\n this.getFreshValueHex = function() {\n var a = new Array();\n for (var i = 0; i < this.asn1Array.length; i++) {\n var asn1Obj = this.asn1Array[i];\n a.push(asn1Obj.getEncodedHex());\n }\n if (this.sortFlag == true) a.sort();\n this.hV = a.join('');\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params.sortflag != \"undefined\" &&\n params.sortflag == false)\n this.sortFlag = false;\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);\n\n// ********************************************************************\n/**\n * class for ASN.1 DER TaggedObject\n * @name KJUR.asn1.DERTaggedObject\n * @class class for ASN.1 DER TaggedObject\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.\n * For example, if you find '[1]' tag in a ASN.1 dump,\n * 'tagNoHex' will be 'a1'.\n * <br/>\n * As for optional argument 'params' for constructor, you can specify *ANY* of\n * following properties:\n * <ul>\n * <li>explicit - specify true if this is explicit tag otherwise false\n * (default is 'true').</li>\n * <li>tag - specify tag (default is 'a0' which means [0])</li>\n * <li>obj - specify ASN1Object which is tagged</li>\n * </ul>\n * @example\n * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});\n * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});\n * hex = d2.getEncodedHex();\n */\nKJUR.asn1.DERTaggedObject = function(params) {\n KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);\n this.hT = \"a0\";\n this.hV = '';\n this.isExplicit = true;\n this.asn1Object = null;\n\n /**\n * set value by an ASN1Object\n * @name setString\n * @memberOf KJUR.asn1.DERTaggedObject#\n * @function\n * @param {Boolean} isExplicitFlag flag for explicit/implicit tag\n * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag\n * @param {ASN1Object} asn1Object ASN.1 to encapsulate\n */\n this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) {\n this.hT = tagNoHex;\n this.isExplicit = isExplicitFlag;\n this.asn1Object = asn1Object;\n if (this.isExplicit) {\n this.hV = this.asn1Object.getEncodedHex();\n this.hTLV = null;\n this.isModified = true;\n } else {\n this.hV = null;\n this.hTLV = asn1Object.getEncodedHex();\n this.hTLV = this.hTLV.replace(/^../, tagNoHex);\n this.isModified = false;\n }\n };\n\n this.getFreshValueHex = function() {\n return this.hV;\n };\n\n if (typeof params != \"undefined\") {\n if (typeof params['tag'] != \"undefined\") {\n this.hT = params['tag'];\n }\n if (typeof params['explicit'] != \"undefined\") {\n this.isExplicit = params['explicit'];\n }\n if (typeof params['obj'] != \"undefined\") {\n this.asn1Object = params['obj'];\n this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);\n }\n }\n};\nYAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);\n\n/**\n * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.\n * This object is just a decorator for parsing the key parameter\n * @param {string|Object} key - The key in string format, or an object containing\n * the parameters needed to build a RSAKey object.\n * @constructor\n */\nvar JSEncryptRSAKey = /** @class */ (function (_super) {\n __extends(JSEncryptRSAKey, _super);\n function JSEncryptRSAKey(key) {\n var _this = _super.call(this) || this;\n // Call the super constructor.\n // RSAKey.call(this);\n // If a key key was provided.\n if (key) {\n // If this is a string...\n if (typeof key === \"string\") {\n _this.parseKey(key);\n }\n else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||\n JSEncryptRSAKey.hasPublicKeyProperty(key)) {\n // Set the values for the key.\n _this.parsePropertiesFrom(key);\n }\n }\n return _this;\n }\n /**\n * Method to parse a pem encoded string containing both a public or private key.\n * The method will translate the pem encoded string in a der encoded string and\n * will parse private key and public key parameters. This method accepts public key\n * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).\n *\n * @todo Check how many rsa formats use the same format of pkcs #1.\n *\n * The format is defined as:\n * PublicKeyInfo ::= SEQUENCE {\n * algorithm AlgorithmIdentifier,\n * PublicKey BIT STRING\n * }\n * Where AlgorithmIdentifier is:\n * AlgorithmIdentifier ::= SEQUENCE {\n * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm\n * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)\n * }\n * and PublicKey is a SEQUENCE encapsulated in a BIT STRING\n * RSAPublicKey ::= SEQUENCE {\n * modulus INTEGER, -- n\n * publicExponent INTEGER -- e\n * }\n * it's possible to examine the structure of the keys obtained from openssl using\n * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/\n * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer\n * @private\n */\n JSEncryptRSAKey.prototype.parseKey = function (pem) {\n try {\n var modulus = 0;\n var public_exponent = 0;\n var reHex = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/;\n var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);\n var asn1 = ASN1.decode(der);\n // Fixes a bug with OpenSSL 1.0+ private keys\n if (asn1.sub.length === 3) {\n asn1 = asn1.sub[2].sub[0];\n }\n if (asn1.sub.length === 9) {\n // Parse the private key.\n modulus = asn1.sub[1].getHexStringValue(); // bigint\n this.n = parseBigInt(modulus, 16);\n public_exponent = asn1.sub[2].getHexStringValue(); // int\n this.e = parseInt(public_exponent, 16);\n var private_exponent = asn1.sub[3].getHexStringValue(); // bigint\n this.d = parseBigInt(private_exponent, 16);\n var prime1 = asn1.sub[4].getHexStringValue(); // bigint\n this.p = parseBigInt(prime1, 16);\n var prime2 = asn1.sub[5].getHexStringValue(); // bigint\n this.q = parseBigInt(prime2, 16);\n var exponent1 = asn1.sub[6].getHexStringValue(); // bigint\n this.dmp1 = parseBigInt(exponent1, 16);\n var exponent2 = asn1.sub[7].getHexStringValue(); // bigint\n this.dmq1 = parseBigInt(exponent2, 16);\n var coefficient = asn1.sub[8].getHexStringValue(); // bigint\n this.coeff = parseBigInt(coefficient, 16);\n }\n else if (asn1.sub.length === 2) {\n // Parse the public key.\n var bit_string = asn1.sub[1];\n var sequence = bit_string.sub[0];\n modulus = sequence.sub[0].getHexStringValue();\n this.n = parseBigInt(modulus, 16);\n public_exponent = sequence.sub[1].getHexStringValue();\n this.e = parseInt(public_exponent, 16);\n }\n else {\n return false;\n }\n return true;\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Translate rsa parameters in a hex encoded string representing the rsa key.\n *\n * The translation follow the ASN.1 notation :\n * RSAPrivateKey ::= SEQUENCE {\n * version Version,\n * modulus INTEGER, -- n\n * publicExponent INTEGER, -- e\n * privateExponent INTEGER, -- d\n * prime1 INTEGER, -- p\n * prime2 INTEGER, -- q\n * exponent1 INTEGER, -- d mod (p1)\n * exponent2 INTEGER, -- d mod (q-1)\n * coefficient INTEGER, -- (inverse of q) mod p\n * }\n * @returns {string} DER Encoded String representing the rsa private key\n * @private\n */\n JSEncryptRSAKey.prototype.getPrivateBaseKey = function () {\n var options = {\n array: [\n new KJUR.asn1.DERInteger({ int: 0 }),\n new KJUR.asn1.DERInteger({ bigint: this.n }),\n new KJUR.asn1.DERInteger({ int: this.e }),\n new KJUR.asn1.DERInteger({ bigint: this.d }),\n new KJUR.asn1.DERInteger({ bigint: this.p }),\n new KJUR.asn1.DERInteger({ bigint: this.q }),\n new KJUR.asn1.DERInteger({ bigint: this.dmp1 }),\n new KJUR.asn1.DERInteger({ bigint: this.dmq1 }),\n new KJUR.asn1.DERInteger({ bigint: this.coeff })\n ]\n };\n var seq = new KJUR.asn1.DERSequence(options);\n return seq.getEncodedHex();\n };\n /**\n * base64 (pem) encoded version of the DER encoded representation\n * @returns {string} pem encoded representation without header and footer\n * @public\n */\n JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () {\n return hex2b64(this.getPrivateBaseKey());\n };\n /**\n * Translate rsa parameters in a hex encoded string representing the rsa public key.\n * The representation follow the ASN.1 notation :\n * PublicKeyInfo ::= SEQUENCE {\n * algorithm AlgorithmIdentifier,\n * PublicKey BIT STRING\n * }\n * Where AlgorithmIdentifier is:\n * AlgorithmIdentifier ::= SEQUENCE {\n * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm\n * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)\n * }\n * and PublicKey is a SEQUENCE encapsulated in a BIT STRING\n * RSAPublicKey ::= SEQUENCE {\n * modulus INTEGER, -- n\n * publicExponent INTEGER -- e\n * }\n * @returns {string} DER Encoded String representing the rsa public key\n * @private\n */\n JSEncryptRSAKey.prototype.getPublicBaseKey = function () {\n var first_sequence = new KJUR.asn1.DERSequence({\n array: [\n new KJUR.asn1.DERObjectIdentifier({ oid: \"1.2.840.113549.1.1.1\" }),\n new KJUR.asn1.DERNull()\n ]\n });\n var second_sequence = new KJUR.asn1.DERSequence({\n array: [\n new KJUR.asn1.DERInteger({ bigint: this.n }),\n new KJUR.asn1.DERInteger({ int: this.e })\n ]\n });\n var bit_string = new KJUR.asn1.DERBitString({\n hex: \"00\" + second_sequence.getEncodedHex()\n });\n var seq = new KJUR.asn1.DERSequence({\n array: [\n first_sequence,\n bit_string\n ]\n });\n return seq.getEncodedHex();\n };\n /**\n * base64 (pem) encoded version of the DER encoded representation\n * @returns {string} pem encoded representation without header and footer\n * @public\n */\n JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () {\n return hex2b64(this.getPublicBaseKey());\n };\n /**\n * wrap the string in block of width chars. The default value for rsa keys is 64\n * characters.\n * @param {string} str the pem encoded string without header and footer\n * @param {Number} [width=64] - the length the string has to be wrapped at\n * @returns {string}\n * @private\n */\n JSEncryptRSAKey.wordwrap = function (str, width) {\n width = width || 64;\n if (!str) {\n return str;\n }\n var regex = \"(.{1,\" + width + \"})( +|$\\n?)|(.{1,\" + width + \"})\";\n return str.match(RegExp(regex, \"g\")).join(\"\\n\");\n };\n /**\n * Retrieve the pem encoded private key\n * @returns {string} the pem encoded private key with header/footer\n * @public\n */\n JSEncryptRSAKey.prototype.getPrivateKey = function () {\n var key = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\";\n key += \"-----END RSA PRIVATE KEY-----\";\n return key;\n };\n /**\n * Retrieve the pem encoded public key\n * @returns {string} the pem encoded public key with header/footer\n * @public\n */\n JSEncryptRSAKey.prototype.getPublicKey = function () {\n var key = \"-----BEGIN PUBLIC KEY-----\\n\";\n key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\";\n key += \"-----END PUBLIC KEY-----\";\n return key;\n };\n /**\n * Check if the object contains the necessary parameters to populate the rsa modulus\n * and public exponent parameters.\n * @param {Object} [obj={}] - An object that may contain the two public key\n * parameters\n * @returns {boolean} true if the object contains both the modulus and the public exponent\n * properties (n and e)\n * @todo check for types of n and e. N should be a parseable bigInt object, E should\n * be a parseable integer number\n * @private\n */\n JSEncryptRSAKey.hasPublicKeyProperty = function (obj) {\n obj = obj || {};\n return (obj.hasOwnProperty(\"n\") &&\n obj.hasOwnProperty(\"e\"));\n };\n /**\n * Check if the object contains ALL the parameters of an RSA key.\n * @param {Object} [obj={}] - An object that may contain nine rsa key\n * parameters\n * @returns {boolean} true if the object contains all the parameters needed\n * @todo check for types of the parameters all the parameters but the public exponent\n * should be parseable bigint objects, the public exponent should be a parseable integer number\n * @private\n */\n JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) {\n obj = obj || {};\n return (obj.hasOwnProperty(\"n\") &&\n obj.hasOwnProperty(\"e\") &&\n obj.hasOwnProperty(\"d\") &&\n obj.hasOwnProperty(\"p\") &&\n obj.hasOwnProperty(\"q\") &&\n obj.hasOwnProperty(\"dmp1\") &&\n obj.hasOwnProperty(\"dmq1\") &&\n obj.hasOwnProperty(\"coeff\"));\n };\n /**\n * Parse the properties of obj in the current rsa object. Obj should AT LEAST\n * include the modulus and public exponent (n, e) parameters.\n * @param {Object} obj - the object containing rsa parameters\n * @private\n */\n JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) {\n this.n = obj.n;\n this.e = obj.e;\n if (obj.hasOwnProperty(\"d\")) {\n this.d = obj.d;\n this.p = obj.p;\n this.q = obj.q;\n this.dmp1 = obj.dmp1;\n this.dmq1 = obj.dmq1;\n this.coeff = obj.coeff;\n }\n };\n return JSEncryptRSAKey;\n}(RSAKey));\n\n/**\n *\n * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour\n * possible parameters are:\n * - default_key_size {number} default: 1024 the key size in bit\n * - default_public_exponent {string} default: '010001' the hexadecimal representation of the public exponent\n * - log {boolean} default: false whether log warn/error or not\n * @constructor\n */\nvar JSEncrypt = /** @class */ (function () {\n function JSEncrypt(options) {\n options = options || {};\n this.default_key_size = parseInt(options.default_key_size, 10) || 1024;\n this.default_public_exponent = options.default_public_exponent || \"010001\"; // 65537 default openssl public exponent for rsa key type\n this.log = options.log || false;\n // The private and public key.\n this.key = null;\n }\n /**\n * Method to set the rsa key parameter (one method is enough to set both the public\n * and the private key, since the private key contains the public key paramenters)\n * Log a warning if logs are enabled\n * @param {Object|string} key the pem encoded string or an object (with or without header/footer)\n * @public\n */\n JSEncrypt.prototype.setKey = function (key) {\n if (this.log && this.key) {\n console.warn(\"A key was already set, overriding existing.\");\n }\n this.key = new JSEncryptRSAKey(key);\n };\n /**\n * Proxy method for setKey, for api compatibility\n * @see setKey\n * @public\n */\n JSEncrypt.prototype.setPrivateKey = function (privkey) {\n // Create the key.\n this.setKey(privkey);\n };\n /**\n * Proxy method for setKey, for api compatibility\n * @see setKey\n * @public\n */\n JSEncrypt.prototype.setPublicKey = function (pubkey) {\n // Sets the public key.\n this.setKey(pubkey);\n };\n /**\n * Proxy method for RSAKey object's decrypt, decrypt the string using the private\n * components of the rsa key object. Note that if the object was not set will be created\n * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n * @param {string} str base64 encoded crypted string to decrypt\n * @return {string} the decrypted string\n * @public\n */\n JSEncrypt.prototype.decrypt = function (str) {\n // Return the decrypted string.\n try {\n return this.getKey().decrypt(b64tohex(str));\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Proxy method for RSAKey object's encrypt, encrypt the string using the public\n * components of the rsa key object. Note that if the object was not set will be created\n * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n * @param {string} str the string to encrypt\n * @return {string} the encrypted string encoded in base64\n * @public\n */\n JSEncrypt.prototype.encrypt = function (str) {\n // Return the encrypted string.\n try {\n return hex2b64(this.getKey().encrypt(str));\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Proxy method for RSAKey object's sign.\n * @param {string} str the string to sign\n * @param {function} digestMethod hash method\n * @param {string} digestName the name of the hash algorithm\n * @return {string} the signature encoded in base64\n * @public\n */\n JSEncrypt.prototype.sign = function (str, digestMethod, digestName) {\n // return the RSA signature of 'str' in 'hex' format.\n try {\n return hex2b64(this.getKey().sign(str, digestMethod, digestName));\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Proxy method for RSAKey object's verify.\n * @param {string} str the string to verify\n * @param {string} signature the signature encoded in base64 to compare the string to\n * @param {function} digestMethod hash method\n * @return {boolean} whether the data and signature match\n * @public\n */\n JSEncrypt.prototype.verify = function (str, signature, digestMethod) {\n // Return the decrypted 'digest' of the signature.\n try {\n return this.getKey().verify(str, b64tohex(signature), digestMethod);\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object\n * will be created and returned\n * @param {callback} [cb] the callback to be called if we want the key to be generated\n * in an async fashion\n * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object\n * @public\n */\n JSEncrypt.prototype.getKey = function (cb) {\n // Only create new if it does not exist.\n if (!this.key) {\n // Get a new private key.\n this.key = new JSEncryptRSAKey();\n if (cb && {}.toString.call(cb) === \"[object Function]\") {\n this.key.generateAsync(this.default_key_size, this.default_public_exponent, cb);\n return;\n }\n // Generate the key.\n this.key.generate(this.default_key_size, this.default_public_exponent);\n }\n return this.key;\n };\n /**\n * Returns the pem encoded representation of the private key\n * If the key doesn't exists a new key will be created\n * @returns {string} pem encoded representation of the private key WITH header and footer\n * @public\n */\n JSEncrypt.prototype.getPrivateKey = function () {\n // Return the private representation of this key.\n return this.getKey().getPrivateKey();\n };\n /**\n * Returns the pem encoded representation of the private key\n * If the key doesn't exists a new key will be created\n * @returns {string} pem encoded representation of the private key WITHOUT header and footer\n * @public\n */\n JSEncrypt.prototype.getPrivateKeyB64 = function () {\n // Return the private representation of this key.\n return this.getKey().getPrivateBaseKeyB64();\n };\n /**\n * Returns the pem encoded representation of the public key\n * If the key doesn't exists a new key will be created\n * @returns {string} pem encoded representation of the public key WITH header and footer\n * @public\n */\n JSEncrypt.prototype.getPublicKey = function () {\n // Return the private representation of this key.\n return this.getKey().getPublicKey();\n };\n /**\n * Returns the pem encoded representation of the public key\n * If the key doesn't exists a new key will be created\n * @returns {string} pem encoded representation of the public key WITHOUT header and footer\n * @public\n */\n JSEncrypt.prototype.getPublicKeyB64 = function () {\n // Return the private representation of this key.\n return this.getKey().getPublicBaseKeyB64();\n };\n JSEncrypt.version = \"3.0.0-rc.1\";\n return JSEncrypt;\n}());\n\nwindow.JSEncrypt = JSEncrypt;\n\nexports.JSEncrypt = JSEncrypt;\nexports.default = JSEncrypt;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2pzZW5jcnlwdEAzLjAuMC1yYy4xQGpzZW5jcnlwdC9iaW4vanNlbmNyeXB0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19qc2VuY3J5cHRAMy4wLjAtcmMuMUBqc2VuY3J5cHQvYmluL2pzZW5jcnlwdC5qcz81MDlmIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcblx0KGZhY3RvcnkoKGdsb2JhbC5KU0VuY3J5cHQgPSB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIEJJX1JNID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbmZ1bmN0aW9uIGludDJjaGFyKG4pIHtcbiAgICByZXR1cm4gQklfUk0uY2hhckF0KG4pO1xufVxuLy8jcmVnaW9uIEJJVF9PUEVSQVRJT05TXG4vLyAocHVibGljKSB0aGlzICYgYVxuZnVuY3Rpb24gb3BfYW5kKHgsIHkpIHtcbiAgICByZXR1cm4geCAmIHk7XG59XG4vLyAocHVibGljKSB0aGlzIHwgYVxuZnVuY3Rpb24gb3Bfb3IoeCwgeSkge1xuICAgIHJldHVybiB4IHwgeTtcbn1cbi8vIChwdWJsaWMpIHRoaXMgXiBhXG5mdW5jdGlvbiBvcF94b3IoeCwgeSkge1xuICAgIHJldHVybiB4IF4geTtcbn1cbi8vIChwdWJsaWMpIHRoaXMgJiB+YVxuZnVuY3Rpb24gb3BfYW5kbm90KHgsIHkpIHtcbiAgICByZXR1cm4geCAmIH55O1xufVxuLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuZnVuY3Rpb24gbGJpdCh4KSB7XG4gICAgaWYgKHggPT0gMCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHggJiAweGZmZmYpID09IDApIHtcbiAgICAgICAgeCA+Pj0gMTY7XG4gICAgICAgIHIgKz0gMTY7XG4gICAgfVxuICAgIGlmICgoeCAmIDB4ZmYpID09IDApIHtcbiAgICAgICAgeCA+Pj0gODtcbiAgICAgICAgciArPSA4O1xuICAgIH1cbiAgICBpZiAoKHggJiAweGYpID09IDApIHtcbiAgICAgICAgeCA+Pj0gNDtcbiAgICAgICAgciArPSA0O1xuICAgIH1cbiAgICBpZiAoKHggJiAzKSA9PSAwKSB7XG4gICAgICAgIHggPj49IDI7XG4gICAgICAgIHIgKz0gMjtcbiAgICB9XG4gICAgaWYgKCh4ICYgMSkgPT0gMCkge1xuICAgICAgICArK3I7XG4gICAgfVxuICAgIHJldHVybiByO1xufVxuLy8gcmV0dXJuIG51bWJlciBvZiAxIGJpdHMgaW4geFxuZnVuY3Rpb24gY2JpdCh4KSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHdoaWxlICh4ICE9IDApIHtcbiAgICAgICAgeCAmPSB4IC0gMTtcbiAgICAgICAgKytyO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbn1cbi8vI2VuZHJlZ2lvbiBCSVRfT1BFUkFUSU9OU1xuXG52YXIgYjY0bWFwID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG52YXIgYjY0cGFkID0gXCI9XCI7XG5mdW5jdGlvbiBoZXgyYjY0KGgpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgYztcbiAgICB2YXIgcmV0ID0gXCJcIjtcbiAgICBmb3IgKGkgPSAwOyBpICsgMyA8PSBoLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGMgPSBwYXJzZUludChoLnN1YnN0cmluZyhpLCBpICsgMyksIDE2KTtcbiAgICAgICAgcmV0ICs9IGI2NG1hcC5jaGFyQXQoYyA+PiA2KSArIGI2NG1hcC5jaGFyQXQoYyAmIDYzKTtcbiAgICB9XG4gICAgaWYgKGkgKyAxID09IGgubGVuZ3RoKSB7XG4gICAgICAgIGMgPSBwYXJzZUludChoLnN1YnN0cmluZyhpLCBpICsgMSksIDE2KTtcbiAgICAgICAgcmV0ICs9IGI2NG1hcC5jaGFyQXQoYyA8PCAyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaSArIDIgPT0gaC5sZW5ndGgpIHtcbiAgICAgICAgYyA9IHBhcnNlSW50KGguc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpO1xuICAgICAgICByZXQgKz0gYjY0bWFwLmNoYXJBdChjID4+IDIpICsgYjY0bWFwLmNoYXJBdCgoYyAmIDMpIDw8IDQpO1xuICAgIH1cbiAgICB3aGlsZSAoKHJldC5sZW5ndGggJiAzKSA+IDApIHtcbiAgICAgICAgcmV0ICs9IGI2NHBhZDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIGNvbnZlcnQgYSBiYXNlNjQgc3RyaW5nIHRvIGhleFxuZnVuY3Rpb24gYjY0dG9oZXgocykge1xuICAgIHZhciByZXQgPSBcIlwiO1xuICAgIHZhciBpO1xuICAgIHZhciBrID0gMDsgLy8gYjY0IHN0YXRlLCAwLTNcbiAgICB2YXIgc2xvcCA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHMuY2hhckF0KGkpID09IGI2NHBhZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHYgPSBiNjRtYXAuaW5kZXhPZihzLmNoYXJBdChpKSk7XG4gICAgICAgIGlmICh2IDwgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPT0gMCkge1xuICAgICAgICAgICAgcmV0ICs9IGludDJjaGFyKHYgPj4gMik7XG4gICAgICAgICAgICBzbG9wID0gdiAmIDM7XG4gICAgICAgICAgICBrID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrID09IDEpIHtcbiAgICAgICAgICAgIHJldCArPSBpbnQyY2hhcigoc2xvcCA8PCAyKSB8ICh2ID4+IDQpKTtcbiAgICAgICAgICAgIHNsb3AgPSB2ICYgMHhmO1xuICAgICAgICAgICAgayA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoayA9PSAyKSB7XG4gICAgICAgICAgICByZXQgKz0gaW50MmNoYXIoc2xvcCk7XG4gICAgICAgICAgICByZXQgKz0gaW50MmNoYXIodiA+PiAyKTtcbiAgICAgICAgICAgIHNsb3AgPSB2ICYgMztcbiAgICAgICAgICAgIGsgPSAzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0ICs9IGludDJjaGFyKChzbG9wIDw8IDIpIHwgKHYgPj4gNCkpO1xuICAgICAgICAgICAgcmV0ICs9IGludDJjaGFyKHYgJiAweGYpO1xuICAgICAgICAgICAgayA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGsgPT0gMSkge1xuICAgICAgICByZXQgKz0gaW50MmNoYXIoc2xvcCA8PCAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxuXG4vLyBIZXggSmF2YVNjcmlwdCBkZWNvZGVyXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMyBMYXBvIEx1Y2hpbmkgPGxhcG9AbGFwby5pdD5cbi8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuLy8gcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuLy8gV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1Jcbi8vIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbi8vIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0Zcbi8vIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIGltbWVkOiB0cnVlLCBsYXRlZGVmOiB0cnVlLCB1bmRlZjogdHJ1ZSwgcmVnZXhkYXNoOiBmYWxzZSAqL1xudmFyIGRlY29kZXI7XG52YXIgSGV4ID0ge1xuICAgIGRlY29kZTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGlmIChkZWNvZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBoZXggPSBcIjAxMjM0NTY3ODlBQkNERUZcIjtcbiAgICAgICAgICAgIHZhciBpZ25vcmUgPSBcIiBcXGZcXG5cXHJcXHRcXHUwMEEwXFx1MjAyOFxcdTIwMjlcIjtcbiAgICAgICAgICAgIGRlY29kZXIgPSB7fTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcltoZXguY2hhckF0KGkpXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZXggPSBoZXgudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDEwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICAgICAgICAgIGRlY29kZXJbaGV4LmNoYXJBdChpKV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlnbm9yZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGRlY29kZXJbaWdub3JlLmNoYXJBdChpKV0gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIHZhciBiaXRzID0gMDtcbiAgICAgICAgdmFyIGNoYXJfY291bnQgPSAwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGMgPSBhLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGlmIChjID09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjID0gZGVjb2RlcltjXTtcbiAgICAgICAgICAgIGlmIChjID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBjaGFyYWN0ZXIgYXQgb2Zmc2V0IFwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIHw9IGM7XG4gICAgICAgICAgICBpZiAoKytjaGFyX2NvdW50ID49IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRbb3V0Lmxlbmd0aF0gPSBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgICAgIGNoYXJfY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYml0cyA8PD0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcl9jb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGV4IGVuY29kaW5nIGluY29tcGxldGU6IDQgYml0cyBtaXNzaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuLy8gQmFzZTY0IEphdmFTY3JpcHQgZGVjb2RlclxuLy8gQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMgTGFwbyBMdWNoaW5pIDxsYXBvQGxhcG8uaXQ+XG4vLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbi8vIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmVcbi8vIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVNcbi8vIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SXG4vLyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTXG4vLyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU5cbi8vIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GXG4vLyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgc3RyaWN0OiB0cnVlLCBpbW1lZDogdHJ1ZSwgbGF0ZWRlZjogdHJ1ZSwgdW5kZWY6IHRydWUsIHJlZ2V4ZGFzaDogZmFsc2UgKi9cbnZhciBkZWNvZGVyJDE7XG52YXIgQmFzZTY0ID0ge1xuICAgIGRlY29kZTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGlmIChkZWNvZGVyJDEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGI2NCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xuICAgICAgICAgICAgdmFyIGlnbm9yZSA9IFwiPSBcXGZcXG5cXHJcXHRcXHUwMEEwXFx1MjAyOFxcdTIwMjlcIjtcbiAgICAgICAgICAgIGRlY29kZXIkMSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGRlY29kZXIkMVtiNjQuY2hhckF0KGkpXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWdub3JlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlciQxW2lnbm9yZS5jaGFyQXQoaSldID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICB2YXIgYml0cyA9IDA7XG4gICAgICAgIHZhciBjaGFyX2NvdW50ID0gMDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjID0gYS5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoYyA9PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYyA9IGRlY29kZXIkMVtjXTtcbiAgICAgICAgICAgIGlmIChjID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBjaGFyYWN0ZXIgYXQgb2Zmc2V0IFwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIHw9IGM7XG4gICAgICAgICAgICBpZiAoKytjaGFyX2NvdW50ID49IDQpIHtcbiAgICAgICAgICAgICAgICBvdXRbb3V0Lmxlbmd0aF0gPSAoYml0cyA+PiAxNik7XG4gICAgICAgICAgICAgICAgb3V0W291dC5sZW5ndGhdID0gKGJpdHMgPj4gOCkgJiAweEZGO1xuICAgICAgICAgICAgICAgIG91dFtvdXQubGVuZ3RoXSA9IGJpdHMgJiAweEZGO1xuICAgICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgICAgIGNoYXJfY291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYml0cyA8PD0gNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGNoYXJfY291bnQpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlNjQgZW5jb2RpbmcgaW5jb21wbGV0ZTogYXQgbGVhc3QgMiBiaXRzIG1pc3NpbmdcIik7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgb3V0W291dC5sZW5ndGhdID0gKGJpdHMgPj4gMTApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIG91dFtvdXQubGVuZ3RoXSA9IChiaXRzID4+IDE2KTtcbiAgICAgICAgICAgICAgICBvdXRbb3V0Lmxlbmd0aF0gPSAoYml0cyA+PiA4KSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9LFxuICAgIHJlOiAvLS0tLS1CRUdJTiBbXi1dKy0tLS0tKFtBLVphLXowLTkrXFwvPVxcc10rKS0tLS0tRU5EIFteLV0rLS0tLS18YmVnaW4tYmFzZTY0W15cXG5dK1xcbihbQS1aYS16MC05K1xcLz1cXHNdKyk9PT09LyxcbiAgICB1bmFybW9yOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgbSA9IEJhc2U2NC5yZS5leGVjKGEpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgaWYgKG1bMV0pIHtcbiAgICAgICAgICAgICAgICBhID0gbVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1bMl0pIHtcbiAgICAgICAgICAgICAgICBhID0gbVsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlZ0V4cCBvdXQgb2Ygc3luY1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShhKTtcbiAgICB9XG59O1xuXG4vLyBCaWcgaW50ZWdlciBiYXNlLTEwIHByaW50aW5nIGxpYnJhcnlcbi8vIENvcHlyaWdodCAoYykgMjAxNCBMYXBvIEx1Y2hpbmkgPGxhcG9AbGFwby5pdD5cbi8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuLy8gcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuLy8gV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1Jcbi8vIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbi8vIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0Zcbi8vIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIGltbWVkOiB0cnVlLCBsYXRlZGVmOiB0cnVlLCB1bmRlZjogdHJ1ZSwgcmVnZXhkYXNoOiBmYWxzZSAqL1xudmFyIG1heCA9IDEwMDAwMDAwMDAwMDAwOyAvLyBiaWdnZXN0IGludGVnZXIgdGhhdCBjYW4gc3RpbGwgZml0IDJeNTMgd2hlbiBtdWx0aXBsaWVkIGJ5IDI1NlxudmFyIEludDEwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEludDEwKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmID0gWyt2YWx1ZSB8fCAwXTtcbiAgICB9XG4gICAgSW50MTAucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIChtLCBjKSB7XG4gICAgICAgIC8vIGFzc2VydChtIDw9IDI1NilcbiAgICAgICAgdmFyIGIgPSB0aGlzLmJ1ZjtcbiAgICAgICAgdmFyIGwgPSBiLmxlbmd0aDtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciB0O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICB0ID0gYltpXSAqIG0gKyBjO1xuICAgICAgICAgICAgaWYgKHQgPCBtYXgpIHtcbiAgICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGMgPSAwIHwgKHQgLyBtYXgpO1xuICAgICAgICAgICAgICAgIHQgLT0gYyAqIG1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID4gMCkge1xuICAgICAgICAgICAgYltpXSA9IGM7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEludDEwLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICAvLyBhc3NlcnQobSA8PSAyNTYpXG4gICAgICAgIHZhciBiID0gdGhpcy5idWY7XG4gICAgICAgIHZhciBsID0gYi5sZW5ndGg7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgdCA9IGJbaV0gLSBjO1xuICAgICAgICAgICAgaWYgKHQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdCArPSBtYXg7XG4gICAgICAgICAgICAgICAgYyA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChiW2IubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgICAgIGIucG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEludDEwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gICAgICAgIGlmICgoYmFzZSB8fCAxMCkgIT0gMTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9ubHkgYmFzZSAxMCBpcyBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGIgPSB0aGlzLmJ1ZjtcbiAgICAgICAgdmFyIHMgPSBiW2IubGVuZ3RoIC0gMV0udG9TdHJpbmcoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGIubGVuZ3RoIC0gMjsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHMgKz0gKG1heCArIGJbaV0pLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH07XG4gICAgSW50MTAucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiID0gdGhpcy5idWY7XG4gICAgICAgIHZhciB2ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IGIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHYgPSB2ICogbWF4ICsgYltpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9O1xuICAgIEludDEwLnByb3RvdHlwZS5zaW1wbGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIgPSB0aGlzLmJ1ZjtcbiAgICAgICAgcmV0dXJuIChiLmxlbmd0aCA9PSAxKSA/IGJbMF0gOiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEludDEwO1xufSgpKTtcblxuLy8gQVNOLjEgSmF2YVNjcmlwdCBkZWNvZGVyXG52YXIgZWxsaXBzaXMgPSBcIlxcdTIwMjZcIjtcbnZhciByZVRpbWVTID0gL14oXFxkXFxkKSgwWzEtOV18MVswLTJdKSgwWzEtOV18WzEyXVxcZHwzWzAxXSkoWzAxXVxcZHwyWzAtM10pKD86KFswLTVdXFxkKSg/OihbMC01XVxcZCkoPzpbLixdKFxcZHsxLDN9KSk/KT8pPyhafFstK10oPzpbMF1cXGR8MVswLTJdKShbMC01XVxcZCk/KT8kLztcbnZhciByZVRpbWVMID0gL14oXFxkXFxkXFxkXFxkKSgwWzEtOV18MVswLTJdKSgwWzEtOV18WzEyXVxcZHwzWzAxXSkoWzAxXVxcZHwyWzAtM10pKD86KFswLTVdXFxkKSg/OihbMC01XVxcZCkoPzpbLixdKFxcZHsxLDN9KSk/KT8pPyhafFstK10oPzpbMF1cXGR8MVswLTJdKShbMC01XVxcZCk/KT8kLztcbmZ1bmN0aW9uIHN0cmluZ0N1dChzdHIsIGxlbikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gbGVuKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgbGVuKSArIGVsbGlwc2lzO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxudmFyIFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJlYW0oZW5jLCBwb3MpIHtcbiAgICAgICAgdGhpcy5oZXhEaWdpdHMgPSBcIjAxMjM0NTY3ODlBQkNERUZcIjtcbiAgICAgICAgaWYgKGVuYyBpbnN0YW5jZW9mIFN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5lbmMgPSBlbmMuZW5jO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmMucG9zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jIHNob3VsZCBiZSBhbiBhcnJheSBvciBhIGJpbmFyeSBzdHJpbmdcbiAgICAgICAgICAgIHRoaXMuZW5jID0gZW5jO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcG9zID0gdGhpcy5wb3MrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID49IHRoaXMuZW5jLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGluZyBieXRlIG9mZnNldCBcIiArIHBvcyArIFwiIG9uIGEgc3RyZWFtIG9mIGxlbmd0aCBcIiArIHRoaXMuZW5jLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcInN0cmluZ1wiID09PSB0eXBlb2YgdGhpcy5lbmMpID8gdGhpcy5lbmMuY2hhckNvZGVBdChwb3MpIDogdGhpcy5lbmNbcG9zXTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuaGV4Qnl0ZSA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhleERpZ2l0cy5jaGFyQXQoKGIgPj4gNCkgJiAweEYpICsgdGhpcy5oZXhEaWdpdHMuY2hhckF0KGIgJiAweEYpO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5oZXhEdW1wID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHJhdykge1xuICAgICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBzICs9IHRoaXMuaGV4Qnl0ZSh0aGlzLmdldChpKSk7XG4gICAgICAgICAgICBpZiAocmF3ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChpICYgMHhGKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBcIiAgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweEY6XG4gICAgICAgICAgICAgICAgICAgICAgICBzICs9IFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5pc0FTQ0lJID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoYyA8IDMyIHx8IGMgPiAxNzYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBhcnNlU3RyaW5nSVNPID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuZ2V0KGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGFyc2VTdHJpbmdVVEYgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDspIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5nZXQoaSsrKTtcbiAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKGMgPiAxOTEpICYmIChjIDwgMjI0KSkge1xuICAgICAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDFGKSA8PCA2KSB8ICh0aGlzLmdldChpKyspICYgMHgzRikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDB4MEYpIDw8IDEyKSB8ICgodGhpcy5nZXQoaSsrKSAmIDB4M0YpIDw8IDYpIHwgKHRoaXMuZ2V0KGkrKykgJiAweDNGKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBhcnNlU3RyaW5nQk1QID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHZhciBoaTtcbiAgICAgICAgdmFyIGxvO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7KSB7XG4gICAgICAgICAgICBoaSA9IHRoaXMuZ2V0KGkrKyk7XG4gICAgICAgICAgICBsbyA9IHRoaXMuZ2V0KGkrKyk7XG4gICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoaGkgPDwgOCkgfCBsbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGFyc2VUaW1lID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIHNob3J0WWVhcikge1xuICAgICAgICB2YXIgcyA9IHRoaXMucGFyc2VTdHJpbmdJU08oc3RhcnQsIGVuZCk7XG4gICAgICAgIHZhciBtID0gKHNob3J0WWVhciA/IHJlVGltZVMgOiByZVRpbWVMKS5leGVjKHMpO1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBcIlVucmVjb2duaXplZCB0aW1lOiBcIiArIHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3J0WWVhcikge1xuICAgICAgICAgICAgLy8gdG8gYXZvaWQgcXVlcnlpbmcgdGhlIHRpbWVyLCB1c2UgdGhlIGZpeGVkIHJhbmdlIFsxOTcwLCAyMDY5XVxuICAgICAgICAgICAgLy8gaXQgd2lsbCBjb25mb3JtIHdpdGggSVRVIFguNDAwIFstMTAsICs0MF0gc2xpZGluZyB3aW5kb3cgdW50aWwgMjAzMFxuICAgICAgICAgICAgbVsxXSA9ICttWzFdO1xuICAgICAgICAgICAgbVsxXSArPSAoK21bMV0gPCA3MCkgPyAyMDAwIDogMTkwMDtcbiAgICAgICAgfVxuICAgICAgICBzID0gbVsxXSArIFwiLVwiICsgbVsyXSArIFwiLVwiICsgbVszXSArIFwiIFwiICsgbVs0XTtcbiAgICAgICAgaWYgKG1bNV0pIHtcbiAgICAgICAgICAgIHMgKz0gXCI6XCIgKyBtWzVdO1xuICAgICAgICAgICAgaWYgKG1bNl0pIHtcbiAgICAgICAgICAgICAgICBzICs9IFwiOlwiICsgbVs2XTtcbiAgICAgICAgICAgICAgICBpZiAobVs3XSkge1xuICAgICAgICAgICAgICAgICAgICBzICs9IFwiLlwiICsgbVs3XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1bOF0pIHtcbiAgICAgICAgICAgIHMgKz0gXCIgVVRDXCI7XG4gICAgICAgICAgICBpZiAobVs4XSAhPSBcIlpcIikge1xuICAgICAgICAgICAgICAgIHMgKz0gbVs4XTtcbiAgICAgICAgICAgICAgICBpZiAobVs5XSkge1xuICAgICAgICAgICAgICAgICAgICBzICs9IFwiOlwiICsgbVs5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBhcnNlSW50ZWdlciA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5nZXQoc3RhcnQpO1xuICAgICAgICB2YXIgbmVnID0gKHYgPiAxMjcpO1xuICAgICAgICB2YXIgcGFkID0gbmVnID8gMjU1IDogMDtcbiAgICAgICAgdmFyIGxlbjtcbiAgICAgICAgdmFyIHMgPSBcIlwiO1xuICAgICAgICAvLyBza2lwIHVudXNlZnVsIGJpdHMgKG5vdCBhbGxvd2VkIGluIERFUilcbiAgICAgICAgd2hpbGUgKHYgPT0gcGFkICYmICsrc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgICAgIHYgPSB0aGlzLmdldChzdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZWcgPyAtMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2hvdyBiaXQgbGVuZ3RoIG9mIGh1Z2UgaW50ZWdlcnNcbiAgICAgICAgaWYgKGxlbiA+IDQpIHtcbiAgICAgICAgICAgIHMgPSB2O1xuICAgICAgICAgICAgbGVuIDw8PSAzO1xuICAgICAgICAgICAgd2hpbGUgKCgoK3MgXiBwYWQpICYgMHg4MCkgPT0gMCkge1xuICAgICAgICAgICAgICAgIHMgPSArcyA8PCAxO1xuICAgICAgICAgICAgICAgIC0tbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcyA9IFwiKFwiICsgbGVuICsgXCIgYml0KVxcblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlY29kZSB0aGUgaW50ZWdlclxuICAgICAgICBpZiAobmVnKSB7XG4gICAgICAgICAgICB2ID0gdiAtIDI1NjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbiA9IG5ldyBJbnQxMCh2KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBuLm11bEFkZCgyNTYsIHRoaXMuZ2V0KGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcyArIG4udG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGFyc2VCaXRTdHJpbmcgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciB1bnVzZWRCaXQgPSB0aGlzLmdldChzdGFydCk7XG4gICAgICAgIHZhciBsZW5CaXQgPSAoKGVuZCAtIHN0YXJ0IC0gMSkgPDwgMykgLSB1bnVzZWRCaXQ7XG4gICAgICAgIHZhciBpbnRybyA9IFwiKFwiICsgbGVuQml0ICsgXCIgYml0KVxcblwiO1xuICAgICAgICB2YXIgcyA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIGIgPSB0aGlzLmdldChpKTtcbiAgICAgICAgICAgIHZhciBza2lwID0gKGkgPT0gZW5kIC0gMSkgPyB1bnVzZWRCaXQgOiAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDc7IGogPj0gc2tpcDsgLS1qKSB7XG4gICAgICAgICAgICAgICAgcyArPSAoYiA+PiBqKSAmIDEgPyBcIjFcIiA6IFwiMFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGludHJvICsgc3RyaW5nQ3V0KHMsIG1heExlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludHJvICsgcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGFyc2VPY3RldFN0cmluZyA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBtYXhMZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBU0NJSShzdGFydCwgZW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0N1dCh0aGlzLnBhcnNlU3RyaW5nSVNPKHN0YXJ0LCBlbmQpLCBtYXhMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgdmFyIHMgPSBcIihcIiArIGxlbiArIFwiIGJ5dGUpXFxuXCI7XG4gICAgICAgIG1heExlbmd0aCAvPSAyOyAvLyB3ZSB3b3JrIGluIGJ5dGVzXG4gICAgICAgIGlmIChsZW4gPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgbWF4TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBzICs9IHRoaXMuaGV4Qnl0ZSh0aGlzLmdldChpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgcyArPSBlbGxpcHNpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGFyc2VPSUQgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciBzID0gXCJcIjtcbiAgICAgICAgdmFyIG4gPSBuZXcgSW50MTAoKTtcbiAgICAgICAgdmFyIGJpdHMgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmdldChpKTtcbiAgICAgICAgICAgIG4ubXVsQWRkKDEyOCwgdiAmIDB4N0YpO1xuICAgICAgICAgICAgYml0cyArPSA3O1xuICAgICAgICAgICAgaWYgKCEodiAmIDB4ODApKSB7IC8vIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgaWYgKHMgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbiA9IG4uc2ltcGxpZnkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBJbnQxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbi5zdWIoODApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IFwiMi5cIiArIG4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gbiA8IDgwID8gbiA8IDQwID8gMCA6IDEgOiAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG0gKyBcIi5cIiArIChuIC0gbSAqIDQwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcyArPSBcIi5cIiArIG4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHMubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdDdXQocywgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBJbnQxMCgpO1xuICAgICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzID4gMCkge1xuICAgICAgICAgICAgcyArPSBcIi5pbmNvbXBsZXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcbiAgICByZXR1cm4gU3RyZWFtO1xufSgpKTtcbnZhciBBU04xID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFTTjEoc3RyZWFtLCBoZWFkZXIsIGxlbmd0aCwgdGFnLCBzdWIpIHtcbiAgICAgICAgaWYgKCEodGFnIGluc3RhbmNlb2YgQVNOMVRhZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFnIHZhbHVlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5zdWIgPSBzdWI7XG4gICAgfVxuICAgIEFTTjEucHJvdG90eXBlLnR5cGVOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudGFnLnRhZ0NsYXNzKSB7XG4gICAgICAgICAgICBjYXNlIDA6IC8vIHVuaXZlcnNhbFxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy50YWcudGFnTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIkVPQ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIklOVEVHRVJcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiQklUX1NUUklOR1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJPQ1RFVF9TVFJJTkdcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiTlVMTFwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJPQkpFQ1RfSURFTlRJRklFUlwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJPYmplY3REZXNjcmlwdG9yXCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwODpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIkVYVEVSTkFMXCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlJFQUxcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBBOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiRU5VTUVSQVRFRFwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJFTUJFRERFRF9QRFZcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBDOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVVRGOFN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJTRVFVRU5DRVwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJTRVRcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiTnVtZXJpY1N0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJQcmludGFibGVTdHJpbmdcIjsgLy8gQVNDSUkgc3Vic2V0XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlRlbGV0ZXhTdHJpbmdcIjsgLy8gYWthIFQ2MVN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJWaWRlb3RleFN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJJQTVTdHJpbmdcIjsgLy8gQVNDSUlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVVRDVGltZVwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTg6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJHZW5lcmFsaXplZFRpbWVcIjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE5OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiR3JhcGhpY1N0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJWaXNpYmxlU3RyaW5nXCI7IC8vIEFTQ0lJIHN1YnNldFxuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJHZW5lcmFsU3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxQzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVuaXZlcnNhbFN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJCTVBTdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5pdmVyc2FsX1wiICsgdGhpcy50YWcudGFnTnVtYmVyLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQXBwbGljYXRpb25fXCIgKyB0aGlzLnRhZy50YWdOdW1iZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJbXCIgKyB0aGlzLnRhZy50YWdOdW1iZXIudG9TdHJpbmcoKSArIFwiXVwiOyAvLyBDb250ZXh0XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUHJpdmF0ZV9cIiArIHRoaXMudGFnLnRhZ051bWJlci50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBU04xLnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gKG1heExlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy50YWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMucG9zQ29udGVudCgpO1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5hYnModGhpcy5sZW5ndGgpO1xuICAgICAgICBpZiAoIXRoaXMudGFnLmlzVW5pdmVyc2FsKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIihcIiArIHRoaXMuc3ViLmxlbmd0aCArIFwiIGVsZW0pXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucGFyc2VPY3RldFN0cmluZyhjb250ZW50LCBjb250ZW50ICsgbGVuLCBtYXhMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy50YWcudGFnTnVtYmVyKSB7XG4gICAgICAgICAgICBjYXNlIDB4MDE6IC8vIEJPT0xFQU5cbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc3RyZWFtLmdldChjb250ZW50KSA9PT0gMCkgPyBcImZhbHNlXCIgOiBcInRydWVcIjtcbiAgICAgICAgICAgIGNhc2UgMHgwMjogLy8gSU5URUdFUlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wYXJzZUludGVnZXIoY29udGVudCwgY29udGVudCArIGxlbik7XG4gICAgICAgICAgICBjYXNlIDB4MDM6IC8vIEJJVF9TVFJJTkdcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWIgPyBcIihcIiArIHRoaXMuc3ViLmxlbmd0aCArIFwiIGVsZW0pXCIgOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS5wYXJzZUJpdFN0cmluZyhjb250ZW50LCBjb250ZW50ICsgbGVuLCBtYXhMZW5ndGgpO1xuICAgICAgICAgICAgY2FzZSAweDA0OiAvLyBPQ1RFVF9TVFJJTkdcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWIgPyBcIihcIiArIHRoaXMuc3ViLmxlbmd0aCArIFwiIGVsZW0pXCIgOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS5wYXJzZU9jdGV0U3RyaW5nKGNvbnRlbnQsIGNvbnRlbnQgKyBsZW4sIG1heExlbmd0aCk7XG4gICAgICAgICAgICAvLyBjYXNlIDB4MDU6IC8vIE5VTExcbiAgICAgICAgICAgIGNhc2UgMHgwNjogLy8gT0JKRUNUX0lERU5USUZJRVJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucGFyc2VPSUQoY29udGVudCwgY29udGVudCArIGxlbiwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIGNhc2UgMHgwNzogLy8gT2JqZWN0RGVzY3JpcHRvclxuICAgICAgICAgICAgLy8gY2FzZSAweDA4OiAvLyBFWFRFUk5BTFxuICAgICAgICAgICAgLy8gY2FzZSAweDA5OiAvLyBSRUFMXG4gICAgICAgICAgICAvLyBjYXNlIDB4MEE6IC8vIEVOVU1FUkFURURcbiAgICAgICAgICAgIC8vIGNhc2UgMHgwQjogLy8gRU1CRURERURfUERWXG4gICAgICAgICAgICBjYXNlIDB4MTA6IC8vIFNFUVVFTkNFXG4gICAgICAgICAgICBjYXNlIDB4MTE6IC8vIFNFVFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1YiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIoXCIgKyB0aGlzLnN1Yi5sZW5ndGggKyBcIiBlbGVtKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKG5vIGVsZW0pXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAweDBDOiAvLyBVVEY4U3RyaW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0N1dCh0aGlzLnN0cmVhbS5wYXJzZVN0cmluZ1VURihjb250ZW50LCBjb250ZW50ICsgbGVuKSwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICAgIGNhc2UgMHgxMjogLy8gTnVtZXJpY1N0cmluZ1xuICAgICAgICAgICAgY2FzZSAweDEzOiAvLyBQcmludGFibGVTdHJpbmdcbiAgICAgICAgICAgIGNhc2UgMHgxNDogLy8gVGVsZXRleFN0cmluZ1xuICAgICAgICAgICAgY2FzZSAweDE1OiAvLyBWaWRlb3RleFN0cmluZ1xuICAgICAgICAgICAgY2FzZSAweDE2OiAvLyBJQTVTdHJpbmdcbiAgICAgICAgICAgIC8vIGNhc2UgMHgxOTogLy8gR3JhcGhpY1N0cmluZ1xuICAgICAgICAgICAgY2FzZSAweDFBOiAvLyBWaXNpYmxlU3RyaW5nXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAweDFCOiAvLyBHZW5lcmFsU3RyaW5nXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAweDFDOiAvLyBVbml2ZXJzYWxTdHJpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nQ3V0KHRoaXMuc3RyZWFtLnBhcnNlU3RyaW5nSVNPKGNvbnRlbnQsIGNvbnRlbnQgKyBsZW4pLCBtYXhMZW5ndGgpO1xuICAgICAgICAgICAgY2FzZSAweDFFOiAvLyBCTVBTdHJpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nQ3V0KHRoaXMuc3RyZWFtLnBhcnNlU3RyaW5nQk1QKGNvbnRlbnQsIGNvbnRlbnQgKyBsZW4pLCBtYXhMZW5ndGgpO1xuICAgICAgICAgICAgY2FzZSAweDE3OiAvLyBVVENUaW1lXG4gICAgICAgICAgICBjYXNlIDB4MTg6IC8vIEdlbmVyYWxpemVkVGltZVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wYXJzZVRpbWUoY29udGVudCwgY29udGVudCArIGxlbiwgKHRoaXMudGFnLnRhZ051bWJlciA9PSAweDE3KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBU04xLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZU5hbWUoKSArIFwiQFwiICsgdGhpcy5zdHJlYW0ucG9zICsgXCJbaGVhZGVyOlwiICsgdGhpcy5oZWFkZXIgKyBcIixsZW5ndGg6XCIgKyB0aGlzLmxlbmd0aCArIFwiLHN1YjpcIiArICgodGhpcy5zdWIgPT09IG51bGwpID8gXCJudWxsXCIgOiB0aGlzLnN1Yi5sZW5ndGgpICsgXCJdXCI7XG4gICAgfTtcbiAgICBBU04xLnByb3RvdHlwZS50b1ByZXR0eVN0cmluZyA9IGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgaWYgKGluZGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbmRlbnQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzID0gaW5kZW50ICsgdGhpcy50eXBlTmFtZSgpICsgXCIgQFwiICsgdGhpcy5zdHJlYW0ucG9zO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgcyArPSBcIitcIjtcbiAgICAgICAgfVxuICAgICAgICBzICs9IHRoaXMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy50YWcudGFnQ29uc3RydWN0ZWQpIHtcbiAgICAgICAgICAgIHMgKz0gXCIgKGNvbnN0cnVjdGVkKVwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCh0aGlzLnRhZy5pc1VuaXZlcnNhbCgpICYmICgodGhpcy50YWcudGFnTnVtYmVyID09IDB4MDMpIHx8ICh0aGlzLnRhZy50YWdOdW1iZXIgPT0gMHgwNCkpKSAmJiAodGhpcy5zdWIgIT09IG51bGwpKSB7XG4gICAgICAgICAgICBzICs9IFwiIChlbmNhcHN1bGF0ZXMpXCI7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSBcIlxcblwiO1xuICAgICAgICBpZiAodGhpcy5zdWIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGluZGVudCArPSBcIiAgXCI7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbWF4ID0gdGhpcy5zdWIubGVuZ3RoOyBpIDwgbWF4OyArK2kpIHtcbiAgICAgICAgICAgICAgICBzICs9IHRoaXMuc3ViW2ldLnRvUHJldHR5U3RyaW5nKGluZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcbiAgICBBU04xLnByb3RvdHlwZS5wb3NTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvcztcbiAgICB9O1xuICAgIEFTTjEucHJvdG90eXBlLnBvc0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wb3MgKyB0aGlzLmhlYWRlcjtcbiAgICB9O1xuICAgIEFTTjEucHJvdG90eXBlLnBvc0VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvcyArIHRoaXMuaGVhZGVyICsgTWF0aC5hYnModGhpcy5sZW5ndGgpO1xuICAgIH07XG4gICAgQVNOMS5wcm90b3R5cGUudG9IZXhTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5oZXhEdW1wKHRoaXMucG9zU3RhcnQoKSwgdGhpcy5wb3NFbmQoKSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBBU04xLmRlY29kZUxlbmd0aCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgdmFyIGJ1ZiA9IHN0cmVhbS5nZXQoKTtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZiAmIDB4N0Y7XG4gICAgICAgIGlmIChsZW4gPT0gYnVmKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vIHJlYXNvbiB0byB1c2UgSW50MTAsIGFzIGl0IHdvdWxkIGJlIGEgaHVnZSBidWZmZXIgYW55d2F5c1xuICAgICAgICBpZiAobGVuID4gNikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTGVuZ3RoIG92ZXIgNDggYml0cyBub3Qgc3VwcG9ydGVkIGF0IHBvc2l0aW9uIFwiICsgKHN0cmVhbS5wb3MgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gLy8gdW5kZWZpbmVkXG4gICAgICAgIGJ1ZiA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZiA9IChidWYgKiAyNTYpICsgc3RyZWFtLmdldCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgKGFzIGEgc3RyaW5nKSBvZiB0aGUgY3VycmVudCBBU04uMSBlbGVtZW50XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgQVNOMS5wcm90b3R5cGUuZ2V0SGV4U3RyaW5nVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoZXhTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLmhlYWRlciAqIDI7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCAqIDI7XG4gICAgICAgIHJldHVybiBoZXhTdHJpbmcuc3Vic3RyKG9mZnNldCwgbGVuZ3RoKTtcbiAgICB9O1xuICAgIEFTTjEuZGVjb2RlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICB2YXIgc3RyZWFtO1xuICAgICAgICBpZiAoIShzdHIgaW5zdGFuY2VvZiBTdHJlYW0pKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBuZXcgU3RyZWFtKHN0ciwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0cmVhbVN0YXJ0ID0gbmV3IFN0cmVhbShzdHJlYW0pO1xuICAgICAgICB2YXIgdGFnID0gbmV3IEFTTjFUYWcoc3RyZWFtKTtcbiAgICAgICAgdmFyIGxlbiA9IEFTTjEuZGVjb2RlTGVuZ3RoKHN0cmVhbSk7XG4gICAgICAgIHZhciBzdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgICAgIHZhciBoZWFkZXIgPSBzdGFydCAtIHN0cmVhbVN0YXJ0LnBvcztcbiAgICAgICAgdmFyIHN1YiA9IG51bGw7XG4gICAgICAgIHZhciBnZXRTdWIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmV0ID0gW107XG4gICAgICAgICAgICBpZiAobGVuICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmaW5pdGUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IHN0YXJ0ICsgbGVuO1xuICAgICAgICAgICAgICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IEFTTjEuZGVjb2RlKHN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0ucG9zICE9IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZW50IHNpemUgaXMgbm90IGNvcnJlY3QgZm9yIGNvbnRhaW5lciBzdGFydGluZyBhdCBvZmZzZXQgXCIgKyBzdGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIGxlbmd0aFxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gQVNOMS5kZWNvZGUoc3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnRhZy5pc0VPQygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0YXJ0IC0gc3RyZWFtLnBvczsgLy8gdW5kZWZpbmVkIGxlbmd0aHMgYXJlIHJlcHJlc2VudGVkIGFzIG5lZ2F0aXZlIHZhbHVlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gd2hpbGUgZGVjb2RpbmcgdW5kZWZpbmVkIGxlbmd0aCBjb250ZW50OiBcIiArIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0YWcudGFnQ29uc3RydWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIG11c3QgaGF2ZSB2YWxpZCBjb250ZW50XG4gICAgICAgICAgICBzdWIgPSBnZXRTdWIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0YWcuaXNVbml2ZXJzYWwoKSAmJiAoKHRhZy50YWdOdW1iZXIgPT0gMHgwMykgfHwgKHRhZy50YWdOdW1iZXIgPT0gMHgwNCkpKSB7XG4gICAgICAgICAgICAvLyBzb21ldGltZXMgQml0U3RyaW5nIGFuZCBPY3RldFN0cmluZyBhcmUgdXNlZCB0byBlbmNhcHN1bGF0ZSBBU04uMVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ051bWJlciA9PSAweDAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQklUIFNUUklOR3Mgd2l0aCB1bnVzZWQgYml0cyBjYW5ub3QgZW5jYXBzdWxhdGUuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN1YiA9IGdldFN1YigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ViLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJbaV0udGFnLmlzRU9DKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVPQyBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgYWN0dWFsIGNvbnRlbnQuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBidXQgc2lsZW50bHkgaWdub3JlIHdoZW4gdGhleSBkb24ndFxuICAgICAgICAgICAgICAgIHN1YiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1YiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGxlbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldlIGNhbid0IHNraXAgb3ZlciBhbiBpbnZhbGlkIHRhZyB3aXRoIHVuZGVmaW5lZCBsZW5ndGggYXQgb2Zmc2V0IFwiICsgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXJ0ICsgTWF0aC5hYnMobGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFTTjEoc3RyZWFtU3RhcnQsIGhlYWRlciwgbGVuLCB0YWcsIHN1Yik7XG4gICAgfTtcbiAgICByZXR1cm4gQVNOMTtcbn0oKSk7XG52YXIgQVNOMVRhZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBU04xVGFnKHN0cmVhbSkge1xuICAgICAgICB2YXIgYnVmID0gc3RyZWFtLmdldCgpO1xuICAgICAgICB0aGlzLnRhZ0NsYXNzID0gYnVmID4+IDY7XG4gICAgICAgIHRoaXMudGFnQ29uc3RydWN0ZWQgPSAoKGJ1ZiAmIDB4MjApICE9PSAwKTtcbiAgICAgICAgdGhpcy50YWdOdW1iZXIgPSBidWYgJiAweDFGO1xuICAgICAgICBpZiAodGhpcy50YWdOdW1iZXIgPT0gMHgxRikgeyAvLyBsb25nIHRhZ1xuICAgICAgICAgICAgdmFyIG4gPSBuZXcgSW50MTAoKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBidWYgPSBzdHJlYW0uZ2V0KCk7XG4gICAgICAgICAgICAgICAgbi5tdWxBZGQoMTI4LCBidWYgJiAweDdGKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGJ1ZiAmIDB4ODApO1xuICAgICAgICAgICAgdGhpcy50YWdOdW1iZXIgPSBuLnNpbXBsaWZ5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQVNOMVRhZy5wcm90b3R5cGUuaXNVbml2ZXJzYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ0NsYXNzID09PSAweDAwO1xuICAgIH07XG4gICAgQVNOMVRhZy5wcm90b3R5cGUuaXNFT0MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ0NsYXNzID09PSAweDAwICYmIHRoaXMudGFnTnVtYmVyID09PSAweDAwO1xuICAgIH07XG4gICAgcmV0dXJuIEFTTjFUYWc7XG59KCkpO1xuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDUgIFRvbSBXdVxuLy8gQml0cyBwZXIgZGlnaXRcbnZhciBkYml0cztcbi8vIEphdmFTY3JpcHQgZW5naW5lIGFuYWx5c2lzXG52YXIgY2FuYXJ5ID0gMHhkZWFkYmVlZmNhZmU7XG52YXIgal9sbSA9ICgoY2FuYXJ5ICYgMHhmZmZmZmYpID09IDB4ZWZjYWZlKTtcbi8vI3JlZ2lvblxudmFyIGxvd3ByaW1lcyA9IFsyLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzcsIDQxLCA0MywgNDcsIDUzLCA1OSwgNjEsIDY3LCA3MSwgNzMsIDc5LCA4MywgODksIDk3LCAxMDEsIDEwMywgMTA3LCAxMDksIDExMywgMTI3LCAxMzEsIDEzNywgMTM5LCAxNDksIDE1MSwgMTU3LCAxNjMsIDE2NywgMTczLCAxNzksIDE4MSwgMTkxLCAxOTMsIDE5NywgMTk5LCAyMTEsIDIyMywgMjI3LCAyMjksIDIzMywgMjM5LCAyNDEsIDI1MSwgMjU3LCAyNjMsIDI2OSwgMjcxLCAyNzcsIDI4MSwgMjgzLCAyOTMsIDMwNywgMzExLCAzMTMsIDMxNywgMzMxLCAzMzcsIDM0NywgMzQ5LCAzNTMsIDM1OSwgMzY3LCAzNzMsIDM3OSwgMzgzLCAzODksIDM5NywgNDAxLCA0MDksIDQxOSwgNDIxLCA0MzEsIDQzMywgNDM5LCA0NDMsIDQ0OSwgNDU3LCA0NjEsIDQ2MywgNDY3LCA0NzksIDQ4NywgNDkxLCA0OTksIDUwMywgNTA5LCA1MjEsIDUyMywgNTQxLCA1NDcsIDU1NywgNTYzLCA1NjksIDU3MSwgNTc3LCA1ODcsIDU5MywgNTk5LCA2MDEsIDYwNywgNjEzLCA2MTcsIDYxOSwgNjMxLCA2NDEsIDY0MywgNjQ3LCA2NTMsIDY1OSwgNjYxLCA2NzMsIDY3NywgNjgzLCA2OTEsIDcwMSwgNzA5LCA3MTksIDcyNywgNzMzLCA3MzksIDc0MywgNzUxLCA3NTcsIDc2MSwgNzY5LCA3NzMsIDc4NywgNzk3LCA4MDksIDgxMSwgODIxLCA4MjMsIDgyNywgODI5LCA4MzksIDg1MywgODU3LCA4NTksIDg2MywgODc3LCA4ODEsIDg4MywgODg3LCA5MDcsIDkxMSwgOTE5LCA5MjksIDkzNywgOTQxLCA5NDcsIDk1MywgOTY3LCA5NzEsIDk3NywgOTgzLCA5OTEsIDk5N107XG52YXIgbHBsaW0gPSAoMSA8PCAyNikgLyBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aCAtIDFdO1xuLy8jZW5kcmVnaW9uXG4vLyAocHVibGljKSBDb25zdHJ1Y3RvclxudmFyIEJpZ0ludGVnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmlnSW50ZWdlcihhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tTnVtYmVyKGEsIGIsIGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYiA9PSBudWxsICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21TdHJpbmcoYSwgMjU2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyhhLCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyNyZWdpb24gUFVCTElDXG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nO1xuICAgIC8vIChwdWJsaWMpIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZ2l2ZW4gcmFkaXhcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIGlmICh0aGlzLnMgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItXCIgKyB0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrO1xuICAgICAgICBpZiAoYiA9PSAxNikge1xuICAgICAgICAgICAgayA9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYiA9PSA4KSB7XG4gICAgICAgICAgICBrID0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09IDIpIHtcbiAgICAgICAgICAgIGsgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT0gMzIpIHtcbiAgICAgICAgICAgIGsgPSA1O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgPT0gNCkge1xuICAgICAgICAgICAgayA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b1JhZGl4KGIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrbSA9ICgxIDw8IGspIC0gMTtcbiAgICAgICAgdmFyIGQ7XG4gICAgICAgIHZhciBtID0gZmFsc2U7XG4gICAgICAgIHZhciByID0gXCJcIjtcbiAgICAgICAgdmFyIGkgPSB0aGlzLnQ7XG4gICAgICAgIHZhciBwID0gdGhpcy5EQiAtIChpICogdGhpcy5EQikgJSBrO1xuICAgICAgICBpZiAoaS0tID4gMCkge1xuICAgICAgICAgICAgaWYgKHAgPCB0aGlzLkRCICYmIChkID0gdGhpc1tpXSA+PiBwKSA+IDApIHtcbiAgICAgICAgICAgICAgICBtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByID0gaW50MmNoYXIoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHAgPCBrKSB7XG4gICAgICAgICAgICAgICAgICAgIGQgPSAodGhpc1tpXSAmICgoMSA8PCBwKSAtIDEpKSA8PCAoayAtIHApO1xuICAgICAgICAgICAgICAgICAgICBkIHw9IHRoaXNbLS1pXSA+PiAocCArPSB0aGlzLkRCIC0gayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkID0gKHRoaXNbaV0gPj4gKHAgLT0gaykpICYga207XG4gICAgICAgICAgICAgICAgICAgIGlmIChwIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gdGhpcy5EQjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0taTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgICAgICAgIHIgKz0gaW50MmNoYXIoZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtID8gciA6IFwiMFwiO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gYm5OZWdhdGU7XG4gICAgLy8gKHB1YmxpYykgLXRoaXNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLCByKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBibkFicztcbiAgICAvLyAocHVibGljKSB8dGhpc3xcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zIDwgMCkgPyB0aGlzLm5lZ2F0ZSgpIDogdGhpcztcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvO1xuICAgIC8vIChwdWJsaWMpIHJldHVybiArIGlmIHRoaXMgPiBhLCAtIGlmIHRoaXMgPCBhLCAwIGlmIGVxdWFsXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY29tcGFyZVRvID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLnMgLSBhLnM7XG4gICAgICAgIGlmIChyICE9IDApIHtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gdGhpcy50O1xuICAgICAgICByID0gaSAtIGEudDtcbiAgICAgICAgaWYgKHIgIT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnMgPCAwKSA/IC1yIDogcjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICgociA9IHRoaXNbaV0gLSBhW2ldKSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGggPSBibkJpdExlbmd0aDtcbiAgICAvLyAocHVibGljKSByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIFwidGhpc1wiXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkRCICogKHRoaXMudCAtIDEpICsgbmJpdHModGhpc1t0aGlzLnQgLSAxXSBeICh0aGlzLnMgJiB0aGlzLkRNKSk7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2QgPSBibk1vZDtcbiAgICAvLyAocHVibGljKSB0aGlzIG1vZCBhXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgICAgdGhpcy5hYnMoKS5kaXZSZW1UbyhhLCBudWxsLCByKTtcbiAgICAgICAgaWYgKHRoaXMucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIHtcbiAgICAgICAgICAgIGEuc3ViVG8ociwgcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQgPSBibk1vZFBvd0ludDtcbiAgICAvLyAocHVibGljKSB0aGlzXmUgJSBtLCAwIDw9IGUgPCAyXjMyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93SW50ID0gZnVuY3Rpb24gKGUsIG0pIHtcbiAgICAgICAgdmFyIHo7XG4gICAgICAgIGlmIChlIDwgMjU2IHx8IG0uaXNFdmVuKCkpIHtcbiAgICAgICAgICAgIHogPSBuZXcgQ2xhc3NpYyhtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHogPSBuZXcgTW9udGdvbWVyeShtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHAoZSwgeik7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7XG4gICAgLy8gKHB1YmxpYylcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgICAgdGhpcy5jb3B5VG8ocik7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBpbnRlZ2VyXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnMgPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50ID09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1swXSAtIHRoaXMuRFY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnQgPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy50ID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8IDMyXG4gICAgICAgIHJldHVybiAoKHRoaXNbMV0gJiAoKDEgPDwgKDMyIC0gdGhpcy5EQikpIC0gMSkpIDw8IHRoaXMuREIpIHwgdGhpc1swXTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBieXRlXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudCA9PSAwKSA/IHRoaXMucyA6ICh0aGlzWzBdIDw8IDI0KSA+PiAyNDtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7XG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIHNob3J0IChhc3N1bWVzIERCPj0xNilcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudCA9PSAwKSA/IHRoaXMucyA6ICh0aGlzWzBdIDw8IDE2KSA+PiAxNjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnNpZ251bSA9IGJuU2lnTnVtO1xuICAgIC8vIChwdWJsaWMpIDAgaWYgdGhpcyA9PSAwLCAxIGlmIHRoaXMgPiAwXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudCA8PSAwIHx8ICh0aGlzLnQgPT0gMSAmJiB0aGlzWzBdIDw9IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7XG4gICAgLy8gKHB1YmxpYykgY29udmVydCB0byBiaWdlbmRpYW4gYnl0ZSBhcnJheVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvQnl0ZUFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaSA9IHRoaXMudDtcbiAgICAgICAgdmFyIHIgPSBbXTtcbiAgICAgICAgclswXSA9IHRoaXMucztcbiAgICAgICAgdmFyIHAgPSB0aGlzLkRCIC0gKGkgKiB0aGlzLkRCKSAlIDg7XG4gICAgICAgIHZhciBkO1xuICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgIGlmIChpLS0gPiAwKSB7XG4gICAgICAgICAgICBpZiAocCA8IHRoaXMuREIgJiYgKGQgPSB0aGlzW2ldID4+IHApICE9ICh0aGlzLnMgJiB0aGlzLkRNKSA+PiBwKSB7XG4gICAgICAgICAgICAgICAgcltrKytdID0gZCB8ICh0aGlzLnMgPDwgKHRoaXMuREIgLSBwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHAgPCA4KSB7XG4gICAgICAgICAgICAgICAgICAgIGQgPSAodGhpc1tpXSAmICgoMSA8PCBwKSAtIDEpKSA8PCAoOCAtIHApO1xuICAgICAgICAgICAgICAgICAgICBkIHw9IHRoaXNbLS1pXSA+PiAocCArPSB0aGlzLkRCIC0gOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkID0gKHRoaXNbaV0gPj4gKHAgLT0gOCkpICYgMHhmZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcCArPSB0aGlzLkRCO1xuICAgICAgICAgICAgICAgICAgICAgICAgLS1pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoZCAmIDB4ODApICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZCB8PSAtMjU2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoayA9PSAwICYmICh0aGlzLnMgJiAweDgwKSAhPSAoZCAmIDB4ODApKSB7XG4gICAgICAgICAgICAgICAgICAgICsraztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJbaysrXSA9IGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gYm5FcXVhbHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbXBhcmVUbyhhKSA9PSAwKTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb21wYXJlVG8oYSkgPCAwKSA/IHRoaXMgOiBhO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gYm5NYXg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbXBhcmVUbyhhKSA+IDApID8gdGhpcyA6IGE7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQgPSBibkFuZDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB0aGlzLmJpdHdpc2VUbyhhLCBvcF9hbmQsIHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMuYml0d2lzZVRvKGEsIG9wX29yLCByKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB0aGlzLmJpdHdpc2VUbyhhLCBvcF94b3IsIHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdCA9IGJuQW5kTm90O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMuYml0d2lzZVRvKGEsIG9wX2FuZG5vdCwgcik7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUubm90ID0gYm5Ob3Q7XG4gICAgLy8gKHB1YmxpYykgfnRoaXNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICAgICAgICAgIHJbaV0gPSB0aGlzLkRNICYgfnRoaXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgci50ID0gdGhpcy50O1xuICAgICAgICByLnMgPSB+dGhpcy5zO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJuU2hpZnRMZWZ0O1xuICAgIC8vIChwdWJsaWMpIHRoaXMgPDwgblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIGlmIChuIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5yU2hpZnRUbygtbiwgcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxTaGlmdFRvKG4sIHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodCA9IGJuU2hpZnRSaWdodDtcbiAgICAvLyAocHVibGljKSB0aGlzID4+IG5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmxTaGlmdFRvKC1uLCByKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuclNoaWZ0VG8obiwgcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQgPSBibkdldExvd2VzdFNldEJpdDtcbiAgICAvLyAocHVibGljKSByZXR1cm5zIGluZGV4IG9mIGxvd2VzdCAxLWJpdCAob3IgLTEgaWYgbm9uZSlcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2ldICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIHRoaXMuREIgKyBsYml0KHRoaXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnMgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ICogdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRDb3VudCA9IGJuQml0Q291bnQ7XG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIG51bWJlciBvZiBzZXQgYml0c1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IDA7XG4gICAgICAgIHZhciB4ID0gdGhpcy5zICYgdGhpcy5ETTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkge1xuICAgICAgICAgICAgciArPSBjYml0KHRoaXNbaV0gXiB4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQgPSBiblRlc3RCaXQ7XG4gICAgLy8gKHB1YmxpYykgdHJ1ZSBpZmYgbnRoIGJpdCBpcyBzZXRcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0ID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKG4gLyB0aGlzLkRCKTtcbiAgICAgICAgaWYgKGogPj0gdGhpcy50KSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucyAhPSAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCh0aGlzW2pdICYgKDEgPDwgKG4gJSB0aGlzLkRCKSkpICE9IDApO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0ID0gYm5TZXRCaXQ7XG4gICAgLy8gKHB1YmxpYykgdGhpcyB8ICgxPDxuKVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZUJpdChuLCBvcF9vcik7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGVhckJpdCA9IGJuQ2xlYXJCaXQ7XG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIH4oMTw8bilcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGVhckJpdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZUJpdChuLCBvcF9hbmRub3QpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdCA9IGJuRmxpcEJpdDtcbiAgICAvLyAocHVibGljKSB0aGlzIF4gKDE8PG4pXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZUJpdChuLCBvcF94b3IpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkID0gYm5BZGQ7XG4gICAgLy8gKHB1YmxpYykgdGhpcyArIGFcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB0aGlzLmFkZFRvKGEsIHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbiAgICAvLyAocHVibGljKSB0aGlzIC0gYVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgICAgdGhpcy5zdWJUbyhhLCByKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7XG4gICAgLy8gKHB1YmxpYykgdGhpcyAqIGFcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMubXVsdGlwbHlUbyhhLCByKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGUgPSBibkRpdmlkZTtcbiAgICAvLyAocHVibGljKSB0aGlzIC8gYVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMuZGl2UmVtVG8oYSwgciwgbnVsbCk7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG4gICAgLy8gKHB1YmxpYykgdGhpcyAlIGFcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXIgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB0aGlzLmRpdlJlbVRvKGEsIG51bGwsIHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlciA9IGJuRGl2aWRlQW5kUmVtYWluZGVyO1xuICAgIC8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBxID0gbmJpKCk7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMuZGl2UmVtVG8oYSwgcSwgcik7XG4gICAgICAgIHJldHVybiBbcSwgcl07XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3cgPSBibk1vZFBvdztcbiAgICAvLyAocHVibGljKSB0aGlzXmUgJSBtIChIQUMgMTQuODUpXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gZnVuY3Rpb24gKGUsIG0pIHtcbiAgICAgICAgdmFyIGkgPSBlLmJpdExlbmd0aCgpO1xuICAgICAgICB2YXIgaztcbiAgICAgICAgdmFyIHIgPSBuYnYoMSk7XG4gICAgICAgIHZhciB6O1xuICAgICAgICBpZiAoaSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpIDwgMTgpIHtcbiAgICAgICAgICAgIGsgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPCA0OCkge1xuICAgICAgICAgICAgayA9IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA8IDE0NCkge1xuICAgICAgICAgICAgayA9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA8IDc2OCkge1xuICAgICAgICAgICAgayA9IDU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBrID0gNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IDgpIHtcbiAgICAgICAgICAgIHogPSBuZXcgQ2xhc3NpYyhtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtLmlzRXZlbigpKSB7XG4gICAgICAgICAgICB6ID0gbmV3IEJhcnJldHQobSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJlY29tcHV0YXRpb25cbiAgICAgICAgdmFyIGcgPSBbXTtcbiAgICAgICAgdmFyIG4gPSAzO1xuICAgICAgICB2YXIgazEgPSBrIC0gMTtcbiAgICAgICAgdmFyIGttID0gKDEgPDwgaykgLSAxO1xuICAgICAgICBnWzFdID0gei5jb252ZXJ0KHRoaXMpO1xuICAgICAgICBpZiAoayA+IDEpIHtcbiAgICAgICAgICAgIHZhciBnMiA9IG5iaSgpO1xuICAgICAgICAgICAgei5zcXJUbyhnWzFdLCBnMik7XG4gICAgICAgICAgICB3aGlsZSAobiA8PSBrbSkge1xuICAgICAgICAgICAgICAgIGdbbl0gPSBuYmkoKTtcbiAgICAgICAgICAgICAgICB6Lm11bFRvKGcyLCBnW24gLSAyXSwgZ1tuXSk7XG4gICAgICAgICAgICAgICAgbiArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gZS50IC0gMTtcbiAgICAgICAgdmFyIHc7XG4gICAgICAgIHZhciBpczEgPSB0cnVlO1xuICAgICAgICB2YXIgcjIgPSBuYmkoKTtcbiAgICAgICAgdmFyIHQ7XG4gICAgICAgIGkgPSBuYml0cyhlW2pdKSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDApIHtcbiAgICAgICAgICAgIGlmIChpID49IGsxKSB7XG4gICAgICAgICAgICAgICAgdyA9IChlW2pdID4+IChpIC0gazEpKSAmIGttO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdyA9IChlW2pdICYgKCgxIDw8IChpICsgMSkpIC0gMSkpIDw8IChrMSAtIGkpO1xuICAgICAgICAgICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB3IHw9IGVbaiAtIDFdID4+ICh0aGlzLkRCICsgaSAtIGsxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuID0gaztcbiAgICAgICAgICAgIHdoaWxlICgodyAmIDEpID09IDApIHtcbiAgICAgICAgICAgICAgICB3ID4+PSAxO1xuICAgICAgICAgICAgICAgIC0tbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoaSAtPSBuKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpICs9IHRoaXMuREI7XG4gICAgICAgICAgICAgICAgLS1qO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzMSkgeyAvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICAgICAgICAgICAgZ1t3XS5jb3B5VG8ocik7XG4gICAgICAgICAgICAgICAgaXMxID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgei5zcXJUbyhyLCByMik7XG4gICAgICAgICAgICAgICAgICAgIHouc3FyVG8ocjIsIHIpO1xuICAgICAgICAgICAgICAgICAgICBuIC09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB6LnNxclRvKHIsIHIyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSByO1xuICAgICAgICAgICAgICAgICAgICByID0gcjI7XG4gICAgICAgICAgICAgICAgICAgIHIyID0gdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgei5tdWxUbyhyMiwgZ1t3XSwgcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaiA+PSAwICYmIChlW2pdICYgKDEgPDwgaSkpID09IDApIHtcbiAgICAgICAgICAgICAgICB6LnNxclRvKHIsIHIyKTtcbiAgICAgICAgICAgICAgICB0ID0gcjtcbiAgICAgICAgICAgICAgICByID0gcjI7XG4gICAgICAgICAgICAgICAgcjIgPSB0O1xuICAgICAgICAgICAgICAgIGlmICgtLWkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLkRCIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgLS1qO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gei5yZXZlcnQocik7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZlcnNlO1xuICAgIC8vIChwdWJsaWMpIDEvdGhpcyAlIG0gKEhBQyAxNC42MSlcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgICAgICAgaWYgKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHUgPSBtLmNsb25lKCk7XG4gICAgICAgIHZhciB2ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICB2YXIgYSA9IG5idigxKTtcbiAgICAgICAgdmFyIGIgPSBuYnYoMCk7XG4gICAgICAgIHZhciBjID0gbmJ2KDApO1xuICAgICAgICB2YXIgZCA9IG5idigxKTtcbiAgICAgICAgd2hpbGUgKHUuc2lnbnVtKCkgIT0gMCkge1xuICAgICAgICAgICAgd2hpbGUgKHUuaXNFdmVuKCkpIHtcbiAgICAgICAgICAgICAgICB1LnJTaGlmdFRvKDEsIHUpO1xuICAgICAgICAgICAgICAgIGlmIChhYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWEuaXNFdmVuKCkgfHwgIWIuaXNFdmVuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWRkVG8odGhpcywgYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnN1YlRvKG0sIGIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGEuclNoaWZ0VG8oMSwgYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFiLmlzRXZlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGIuc3ViVG8obSwgYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGIuclNoaWZ0VG8oMSwgYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAodi5pc0V2ZW4oKSkge1xuICAgICAgICAgICAgICAgIHYuclNoaWZ0VG8oMSwgdik7XG4gICAgICAgICAgICAgICAgaWYgKGFjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYy5pc0V2ZW4oKSB8fCAhZC5pc0V2ZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5hZGRUbyh0aGlzLCBjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuc3ViVG8obSwgZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYy5yU2hpZnRUbygxLCBjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWQuaXNFdmVuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zdWJUbyhtLCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZC5yU2hpZnRUbygxLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdS5zdWJUbyh2LCB1KTtcbiAgICAgICAgICAgICAgICBpZiAoYWMpIHtcbiAgICAgICAgICAgICAgICAgICAgYS5zdWJUbyhjLCBhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYi5zdWJUbyhkLCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHYuc3ViVG8odSwgdik7XG4gICAgICAgICAgICAgICAgaWYgKGFjKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuc3ViVG8oYSwgYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGQuc3ViVG8oYiwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkLmNvbXBhcmVUbyhtKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5zaWdudW0oKSA8IDApIHtcbiAgICAgICAgICAgIGQuYWRkVG8obSwgZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5zaWdudW0oKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkLmFkZChtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdztcbiAgICAvLyAocHVibGljKSB0aGlzXmVcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHAoZSwgbmV3IE51bGxFeHAoKSk7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbiAgICAvLyAocHVibGljKSBnY2QodGhpcyxhKSAoSEFDIDE0LjU0KVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciB4ID0gKHRoaXMucyA8IDApID8gdGhpcy5uZWdhdGUoKSA6IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgdmFyIHkgPSAoYS5zIDwgMCkgPyBhLm5lZ2F0ZSgpIDogYS5jbG9uZSgpO1xuICAgICAgICBpZiAoeC5jb21wYXJlVG8oeSkgPCAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHg7XG4gICAgICAgICAgICB4ID0geTtcbiAgICAgICAgICAgIHkgPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0geC5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgICAgdmFyIGcgPSB5LmdldExvd2VzdFNldEJpdCgpO1xuICAgICAgICBpZiAoZyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgZykge1xuICAgICAgICAgICAgZyA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGcgPiAwKSB7XG4gICAgICAgICAgICB4LnJTaGlmdFRvKGcsIHgpO1xuICAgICAgICAgICAgeS5yU2hpZnRUbyhnLCB5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoeC5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgICAgIGlmICgoaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkge1xuICAgICAgICAgICAgICAgIHguclNoaWZ0VG8oaSwgeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHtcbiAgICAgICAgICAgICAgICB5LnJTaGlmdFRvKGksIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHguY29tcGFyZVRvKHkpID49IDApIHtcbiAgICAgICAgICAgICAgICB4LnN1YlRvKHksIHgpO1xuICAgICAgICAgICAgICAgIHguclNoaWZ0VG8oMSwgeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5LnN1YlRvKHgsIHkpO1xuICAgICAgICAgICAgICAgIHkuclNoaWZ0VG8oMSwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGcgPiAwKSB7XG4gICAgICAgICAgICB5LmxTaGlmdFRvKGcsIHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lID0gYm5Jc1Byb2JhYmxlUHJpbWU7XG4gICAgLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNQcm9iYWJsZVByaW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciB4ID0gdGhpcy5hYnMoKTtcbiAgICAgICAgaWYgKHgudCA9PSAxICYmIHhbMF0gPD0gbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGggLSAxXSkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvd3ByaW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh4WzBdID09IGxvd3ByaW1lc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHguaXNFdmVuKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpID0gMTtcbiAgICAgICAgd2hpbGUgKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbSA9IGxvd3ByaW1lc1tpXTtcbiAgICAgICAgICAgIHZhciBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxvd3ByaW1lcy5sZW5ndGggJiYgbSA8IGxwbGltKSB7XG4gICAgICAgICAgICAgICAgbSAqPSBsb3dwcmltZXNbaisrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgICAgIGlmIChtICUgbG93cHJpbWVzW2krK10gPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4Lm1pbGxlclJhYmluKHQpO1xuICAgIH07XG4gICAgLy8jZW5kcmVnaW9uIFBVQkxJQ1xuICAgIC8vI3JlZ2lvbiBQUk9URUNURURcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG8gPSBibnBDb3B5VG87XG4gICAgLy8gKHByb3RlY3RlZCkgY29weSB0aGlzIHRvIHJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG8gPSBmdW5jdGlvbiAocikge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHJbaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgICAgci5zID0gdGhpcy5zO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbUludCA9IGJucEZyb21JbnQ7XG4gICAgLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gaW50ZWdlciB2YWx1ZSB4LCAtRFYgPD0geCA8IERWXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbUludCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHRoaXMudCA9IDE7XG4gICAgICAgIHRoaXMucyA9ICh4IDwgMCkgPyAtMSA6IDA7XG4gICAgICAgIGlmICh4ID4gMCkge1xuICAgICAgICAgICAgdGhpc1swXSA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoeCA8IC0xKSB7XG4gICAgICAgICAgICB0aGlzWzBdID0geCArIHRoaXMuRFY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnQgPSAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nID0gYm5wRnJvbVN0cmluZztcbiAgICAvLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBzdHJpbmcgYW5kIHJhZGl4XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzLCBiKSB7XG4gICAgICAgIHZhciBrO1xuICAgICAgICBpZiAoYiA9PSAxNikge1xuICAgICAgICAgICAgayA9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYiA9PSA4KSB7XG4gICAgICAgICAgICBrID0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09IDI1Nikge1xuICAgICAgICAgICAgayA9IDg7XG4gICAgICAgICAgICAvKiBieXRlIGFycmF5ICovXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYiA9PSAyKSB7XG4gICAgICAgICAgICBrID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09IDMyKSB7XG4gICAgICAgICAgICBrID0gNTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiID09IDQpIHtcbiAgICAgICAgICAgIGsgPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mcm9tUmFkaXgocywgYik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ID0gMDtcbiAgICAgICAgdGhpcy5zID0gMDtcbiAgICAgICAgdmFyIGkgPSBzLmxlbmd0aDtcbiAgICAgICAgdmFyIG1pID0gZmFsc2U7XG4gICAgICAgIHZhciBzaCA9IDA7XG4gICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIHggPSAoayA9PSA4KSA/ICgrc1tpXSkgJiAweGZmIDogaW50QXQocywgaSk7XG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbWkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2ggPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXNbdGhpcy50KytdID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNoICsgayA+IHRoaXMuREIpIHtcbiAgICAgICAgICAgICAgICB0aGlzW3RoaXMudCAtIDFdIHw9ICh4ICYgKCgxIDw8ICh0aGlzLkRCIC0gc2gpKSAtIDEpKSA8PCBzaDtcbiAgICAgICAgICAgICAgICB0aGlzW3RoaXMudCsrXSA9ICh4ID4+ICh0aGlzLkRCIC0gc2gpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbdGhpcy50IC0gMV0gfD0geCA8PCBzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoICs9IGs7XG4gICAgICAgICAgICBpZiAoc2ggPj0gdGhpcy5EQikge1xuICAgICAgICAgICAgICAgIHNoIC09IHRoaXMuREI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPT0gOCAmJiAoKCtzWzBdKSAmIDB4ODApICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMucyA9IC0xO1xuICAgICAgICAgICAgaWYgKHNoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXNbdGhpcy50IC0gMV0gfD0gKCgxIDw8ICh0aGlzLkRCIC0gc2gpKSAtIDEpIDw8IHNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xhbXAoKTtcbiAgICAgICAgaWYgKG1pKSB7XG4gICAgICAgICAgICBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcywgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wID0gYm5wQ2xhbXA7XG4gICAgLy8gKHByb3RlY3RlZCkgY2xhbXAgb2ZmIGV4Y2VzcyBoaWdoIHdvcmRzXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjID0gdGhpcy5zICYgdGhpcy5ETTtcbiAgICAgICAgd2hpbGUgKHRoaXMudCA+IDAgJiYgdGhpc1t0aGlzLnQgLSAxXSA9PSBjKSB7XG4gICAgICAgICAgICAtLXRoaXMudDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvID0gYm5wRExTaGlmdFRvO1xuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG4qREJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kbFNoaWZ0VG8gPSBmdW5jdGlvbiAobiwgcikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gdGhpcy50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHJbaSArIG5dID0gdGhpc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHJbaV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHIudCA9IHRoaXMudCArIG47XG4gICAgICAgIHIucyA9IHRoaXMucztcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmRyU2hpZnRUbyA9IGJucERSU2hpZnRUbztcbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuKkRCXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gZnVuY3Rpb24gKG4sIHIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IG47IGkgPCB0aGlzLnQ7ICsraSkge1xuICAgICAgICAgICAgcltpIC0gbl0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHIudCA9IE1hdGgubWF4KHRoaXMudCAtIG4sIDApO1xuICAgICAgICByLnMgPSB0aGlzLnM7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbyA9IGJucExTaGlmdFRvO1xuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbyA9IGZ1bmN0aW9uIChuLCByKSB7XG4gICAgICAgIHZhciBicyA9IG4gJSB0aGlzLkRCO1xuICAgICAgICB2YXIgY2JzID0gdGhpcy5EQiAtIGJzO1xuICAgICAgICB2YXIgYm0gPSAoMSA8PCBjYnMpIC0gMTtcbiAgICAgICAgdmFyIGRzID0gTWF0aC5mbG9vcihuIC8gdGhpcy5EQik7XG4gICAgICAgIHZhciBjID0gKHRoaXMucyA8PCBicykgJiB0aGlzLkRNO1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIHJbaSArIGRzICsgMV0gPSAodGhpc1tpXSA+PiBjYnMpIHwgYztcbiAgICAgICAgICAgIGMgPSAodGhpc1tpXSAmIGJtKSA8PCBicztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gZHMgLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgcltpXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcltkc10gPSBjO1xuICAgICAgICByLnQgPSB0aGlzLnQgKyBkcyArIDE7XG4gICAgICAgIHIucyA9IHRoaXMucztcbiAgICAgICAgci5jbGFtcCgpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuclNoaWZ0VG8gPSBibnBSU2hpZnRUbztcbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuclNoaWZ0VG8gPSBmdW5jdGlvbiAobiwgcikge1xuICAgICAgICByLnMgPSB0aGlzLnM7XG4gICAgICAgIHZhciBkcyA9IE1hdGguZmxvb3IobiAvIHRoaXMuREIpO1xuICAgICAgICBpZiAoZHMgPj0gdGhpcy50KSB7XG4gICAgICAgICAgICByLnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBicyA9IG4gJSB0aGlzLkRCO1xuICAgICAgICB2YXIgY2JzID0gdGhpcy5EQiAtIGJzO1xuICAgICAgICB2YXIgYm0gPSAoMSA8PCBicykgLSAxO1xuICAgICAgICByWzBdID0gdGhpc1tkc10gPj4gYnM7XG4gICAgICAgIGZvciAodmFyIGkgPSBkcyArIDE7IGkgPCB0aGlzLnQ7ICsraSkge1xuICAgICAgICAgICAgcltpIC0gZHMgLSAxXSB8PSAodGhpc1tpXSAmIGJtKSA8PCBjYnM7XG4gICAgICAgICAgICByW2kgLSBkc10gPSB0aGlzW2ldID4+IGJzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicyA+IDApIHtcbiAgICAgICAgICAgIHJbdGhpcy50IC0gZHMgLSAxXSB8PSAodGhpcy5zICYgYm0pIDw8IGNicztcbiAgICAgICAgfVxuICAgICAgICByLnQgPSB0aGlzLnQgLSBkcztcbiAgICAgICAgci5jbGFtcCgpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuc3ViVG8gPSBibnBTdWJUbztcbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGFcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGZ1bmN0aW9uIChhLCByKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgdmFyIGMgPSAwO1xuICAgICAgICB2YXIgbSA9IE1hdGgubWluKGEudCwgdGhpcy50KTtcbiAgICAgICAgd2hpbGUgKGkgPCBtKSB7XG4gICAgICAgICAgICBjICs9IHRoaXNbaV0gLSBhW2ldO1xuICAgICAgICAgICAgcltpKytdID0gYyAmIHRoaXMuRE07XG4gICAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgICAgIGMgLT0gYS5zO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgICAgICAgcltpKytdID0gYyAmIHRoaXMuRE07XG4gICAgICAgICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IGEudCkge1xuICAgICAgICAgICAgICAgIGMgLT0gYVtpXTtcbiAgICAgICAgICAgICAgICByW2krK10gPSBjICYgdGhpcy5ETTtcbiAgICAgICAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYyAtPSBhLnM7XG4gICAgICAgIH1cbiAgICAgICAgci5zID0gKGMgPCAwKSA/IC0xIDogMDtcbiAgICAgICAgaWYgKGMgPCAtMSkge1xuICAgICAgICAgICAgcltpKytdID0gdGhpcy5EViArIGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA+IDApIHtcbiAgICAgICAgICAgIHJbaSsrXSA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgci50ID0gaTtcbiAgICAgICAgci5jbGFtcCgpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbyA9IGJucE11bHRpcGx5VG87XG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKiBhLCByICE9IHRoaXMsYSAoSEFDIDE0LjEyKVxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvID0gZnVuY3Rpb24gKGEsIHIpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLmFicygpO1xuICAgICAgICB2YXIgeSA9IGEuYWJzKCk7XG4gICAgICAgIHZhciBpID0geC50O1xuICAgICAgICByLnQgPSBpICsgeS50O1xuICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIHJbaV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB5LnQ7ICsraSkge1xuICAgICAgICAgICAgcltpICsgeC50XSA9IHguYW0oMCwgeVtpXSwgciwgaSwgMCwgeC50KTtcbiAgICAgICAgfVxuICAgICAgICByLnMgPSAwO1xuICAgICAgICByLmNsYW1wKCk7XG4gICAgICAgIGlmICh0aGlzLnMgIT0gYS5zKSB7XG4gICAgICAgICAgICBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ociwgcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZVRvID0gYm5wU3F1YXJlVG87XG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXNeMiwgciAhPSB0aGlzIChIQUMgMTQuMTYpXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG8gPSBmdW5jdGlvbiAocikge1xuICAgICAgICB2YXIgeCA9IHRoaXMuYWJzKCk7XG4gICAgICAgIHZhciBpID0gci50ID0gMiAqIHgudDtcbiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICByW2ldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeC50IC0gMTsgKytpKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHguYW0oaSwgeFtpXSwgciwgMiAqIGksIDAsIDEpO1xuICAgICAgICAgICAgaWYgKChyW2kgKyB4LnRdICs9IHguYW0oaSArIDEsIDIgKiB4W2ldLCByLCAyICogaSArIDEsIGMsIHgudCAtIGkgLSAxKSkgPj0geC5EVikge1xuICAgICAgICAgICAgICAgIHJbaSArIHgudF0gLT0geC5EVjtcbiAgICAgICAgICAgICAgICByW2kgKyB4LnQgKyAxXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIudCA+IDApIHtcbiAgICAgICAgICAgIHJbci50IC0gMV0gKz0geC5hbShpLCB4W2ldLCByLCAyICogaSwgMCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgci5zID0gMDtcbiAgICAgICAgci5jbGFtcCgpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbztcbiAgICAvLyAocHJvdGVjdGVkKSBkaXZpZGUgdGhpcyBieSBtLCBxdW90aWVudCBhbmQgcmVtYWluZGVyIHRvIHEsIHIgKEhBQyAxNC4yMClcbiAgICAvLyByICE9IHEsIHRoaXMgIT0gbS4gIHEgb3IgciBtYXkgYmUgbnVsbC5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1UbyA9IGZ1bmN0aW9uIChtLCBxLCByKSB7XG4gICAgICAgIHZhciBwbSA9IG0uYWJzKCk7XG4gICAgICAgIGlmIChwbS50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHQgPSB0aGlzLmFicygpO1xuICAgICAgICBpZiAocHQudCA8IHBtLnQpIHtcbiAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBxLmZyb21JbnQoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAociAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5VG8ocik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgciA9IG5iaSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB5ID0gbmJpKCk7XG4gICAgICAgIHZhciB0cyA9IHRoaXMucztcbiAgICAgICAgdmFyIG1zID0gbS5zO1xuICAgICAgICB2YXIgbnNoID0gdGhpcy5EQiAtIG5iaXRzKHBtW3BtLnQgLSAxXSk7IC8vIG5vcm1hbGl6ZSBtb2R1bHVzXG4gICAgICAgIGlmIChuc2ggPiAwKSB7XG4gICAgICAgICAgICBwbS5sU2hpZnRUbyhuc2gsIHkpO1xuICAgICAgICAgICAgcHQubFNoaWZ0VG8obnNoLCByKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBtLmNvcHlUbyh5KTtcbiAgICAgICAgICAgIHB0LmNvcHlUbyhyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeXMgPSB5LnQ7XG4gICAgICAgIHZhciB5MCA9IHlbeXMgLSAxXTtcbiAgICAgICAgaWYgKHkwID09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeXQgPSB5MCAqICgxIDw8IHRoaXMuRjEpICsgKCh5cyA+IDEpID8geVt5cyAtIDJdID4+IHRoaXMuRjIgOiAwKTtcbiAgICAgICAgdmFyIGQxID0gdGhpcy5GViAvIHl0O1xuICAgICAgICB2YXIgZDIgPSAoMSA8PCB0aGlzLkYxKSAvIHl0O1xuICAgICAgICB2YXIgZSA9IDEgPDwgdGhpcy5GMjtcbiAgICAgICAgdmFyIGkgPSByLnQ7XG4gICAgICAgIHZhciBqID0gaSAtIHlzO1xuICAgICAgICB2YXIgdCA9IChxID09IG51bGwpID8gbmJpKCkgOiBxO1xuICAgICAgICB5LmRsU2hpZnRUbyhqLCB0KTtcbiAgICAgICAgaWYgKHIuY29tcGFyZVRvKHQpID49IDApIHtcbiAgICAgICAgICAgIHJbci50KytdID0gMTtcbiAgICAgICAgICAgIHIuc3ViVG8odCwgcik7XG4gICAgICAgIH1cbiAgICAgICAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLCB0KTtcbiAgICAgICAgdC5zdWJUbyh5LCB5KTsgLy8gXCJuZWdhdGl2ZVwiIHkgc28gd2UgY2FuIHJlcGxhY2Ugc3ViIHdpdGggYW0gbGF0ZXJcbiAgICAgICAgd2hpbGUgKHkudCA8IHlzKSB7XG4gICAgICAgICAgICB5W3kudCsrXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKC0taiA+PSAwKSB7XG4gICAgICAgICAgICAvLyBFc3RpbWF0ZSBxdW90aWVudCBkaWdpdFxuICAgICAgICAgICAgdmFyIHFkID0gKHJbLS1pXSA9PSB5MCkgPyB0aGlzLkRNIDogTWF0aC5mbG9vcihyW2ldICogZDEgKyAocltpIC0gMV0gKyBlKSAqIGQyKTtcbiAgICAgICAgICAgIGlmICgocltpXSArPSB5LmFtKDAsIHFkLCByLCBqLCAwLCB5cykpIDwgcWQpIHsgLy8gVHJ5IGl0IG91dFxuICAgICAgICAgICAgICAgIHkuZGxTaGlmdFRvKGosIHQpO1xuICAgICAgICAgICAgICAgIHIuc3ViVG8odCwgcik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJbaV0gPCAtLXFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHIuc3ViVG8odCwgcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChxICE9IG51bGwpIHtcbiAgICAgICAgICAgIHIuZHJTaGlmdFRvKHlzLCBxKTtcbiAgICAgICAgICAgIGlmICh0cyAhPSBtcykge1xuICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLCBxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnQgPSB5cztcbiAgICAgICAgci5jbGFtcCgpO1xuICAgICAgICBpZiAobnNoID4gMCkge1xuICAgICAgICAgICAgci5yU2hpZnRUbyhuc2gsIHIpO1xuICAgICAgICB9IC8vIERlbm9ybWFsaXplIHJlbWFpbmRlclxuICAgICAgICBpZiAodHMgPCAwKSB7XG4gICAgICAgICAgICBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ociwgcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gYm5wSW52RGlnaXQ7XG4gICAgLy8gKHByb3RlY3RlZCkgcmV0dXJuIFwiLTEvdGhpcyAlIDJeREJcIjsgdXNlZnVsIGZvciBNb250LiByZWR1Y3Rpb25cbiAgICAvLyBqdXN0aWZpY2F0aW9uOlxuICAgIC8vICAgICAgICAgeHkgPT0gMSAobW9kIG0pXG4gICAgLy8gICAgICAgICB4eSA9ICAxK2ttXG4gICAgLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKVxuICAgIC8vIHhbeSgyLXh5KV0gPSAxLWteMm1eMlxuICAgIC8vIHhbeSgyLXh5KV0gPT0gMSAobW9kIG1eMilcbiAgICAvLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5KDIteHkpIGlzIDEveCBtb2QgbV4yXG4gICAgLy8gc2hvdWxkIHJlZHVjZSB4IGFuZCB5KDIteHkpIGJ5IG1eMiBhdCBlYWNoIHN0ZXAgdG8ga2VlcCBzaXplIGJvdW5kZWQuXG4gICAgLy8gSlMgbXVsdGlwbHkgXCJvdmVyZmxvd3NcIiBkaWZmZXJlbnRseSBmcm9tIEMvQysrLCBzbyBjYXJlIGlzIG5lZWRlZCBoZXJlLlxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50IDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHggPSB0aGlzWzBdO1xuICAgICAgICBpZiAoKHggJiAxKSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeSA9IHggJiAzOyAvLyB5ID09IDEveCBtb2QgMl4yXG4gICAgICAgIHkgPSAoeSAqICgyIC0gKHggJiAweGYpICogeSkpICYgMHhmOyAvLyB5ID09IDEveCBtb2QgMl40XG4gICAgICAgIHkgPSAoeSAqICgyIC0gKHggJiAweGZmKSAqIHkpKSAmIDB4ZmY7IC8vIHkgPT0gMS94IG1vZCAyXjhcbiAgICAgICAgeSA9ICh5ICogKDIgLSAoKCh4ICYgMHhmZmZmKSAqIHkpICYgMHhmZmZmKSkpICYgMHhmZmZmOyAvLyB5ID09IDEveCBtb2QgMl4xNlxuICAgICAgICAvLyBsYXN0IHN0ZXAgLSBjYWxjdWxhdGUgaW52ZXJzZSBtb2QgRFYgZGlyZWN0bHk7XG4gICAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8PSAzMiBhbmQgYXNzdW1lcyBhYmlsaXR5IHRvIGhhbmRsZSA0OC1iaXQgaW50c1xuICAgICAgICB5ID0gKHkgKiAoMiAtIHggKiB5ICUgdGhpcy5EVikpICUgdGhpcy5EVjsgLy8geSA9PSAxL3ggbW9kIDJeZGJpdHNcbiAgICAgICAgLy8gd2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UsIGFuZCAtRFYgPCB5IDwgRFZcbiAgICAgICAgcmV0dXJuICh5ID4gMCkgPyB0aGlzLkRWIC0geSA6IC15O1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuID0gYm5wSXNFdmVuO1xuICAgIC8vIChwcm90ZWN0ZWQpIHRydWUgaWZmIHRoaXMgaXMgZXZlblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICgodGhpcy50ID4gMCkgPyAodGhpc1swXSAmIDEpIDogdGhpcy5zKSA9PSAwO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZXhwID0gYm5wRXhwO1xuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXNeZSwgZSA8IDJeMzIsIGRvaW5nIHNxciBhbmQgbXVsIHdpdGggXCJyXCIgKEhBQyAxNC43OSlcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBmdW5jdGlvbiAoZSwgeikge1xuICAgICAgICBpZiAoZSA+IDB4ZmZmZmZmZmYgfHwgZSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB2YXIgcjIgPSBuYmkoKTtcbiAgICAgICAgdmFyIGcgPSB6LmNvbnZlcnQodGhpcyk7XG4gICAgICAgIHZhciBpID0gbmJpdHMoZSkgLSAxO1xuICAgICAgICBnLmNvcHlUbyhyKTtcbiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICB6LnNxclRvKHIsIHIyKTtcbiAgICAgICAgICAgIGlmICgoZSAmICgxIDw8IGkpKSA+IDApIHtcbiAgICAgICAgICAgICAgICB6Lm11bFRvKHIyLCBnLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gcjtcbiAgICAgICAgICAgICAgICByID0gcjI7XG4gICAgICAgICAgICAgICAgcjIgPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZSA9IGJucENodW5rU2l6ZTtcbiAgICAvLyAocHJvdGVjdGVkKSByZXR1cm4geCBzLnQuIHJeeCA8IERWXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIgKiB0aGlzLkRCIC8gTWF0aC5sb2cocikpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeCA9IGJucFRvUmFkaXg7XG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCB0byByYWRpeCBzdHJpbmdcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1JhZGl4ID0gZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDEwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNpZ251bSgpID09IDAgfHwgYiA8IDIgfHwgYiA+IDM2KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIwXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gICAgICAgIHZhciBhID0gTWF0aC5wb3coYiwgY3MpO1xuICAgICAgICB2YXIgZCA9IG5idihhKTtcbiAgICAgICAgdmFyIHkgPSBuYmkoKTtcbiAgICAgICAgdmFyIHogPSBuYmkoKTtcbiAgICAgICAgdmFyIHIgPSBcIlwiO1xuICAgICAgICB0aGlzLmRpdlJlbVRvKGQsIHksIHopO1xuICAgICAgICB3aGlsZSAoeS5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgICAgIHIgPSAoYSArIHouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpICsgcjtcbiAgICAgICAgICAgIHkuZGl2UmVtVG8oZCwgeSwgeik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKSArIHI7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXggPSBibnBGcm9tUmFkaXg7XG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCBmcm9tIHJhZGl4IHN0cmluZ1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeCA9IGZ1bmN0aW9uIChzLCBiKSB7XG4gICAgICAgIHRoaXMuZnJvbUludCgwKTtcbiAgICAgICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgYiA9IDEwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICAgICAgICB2YXIgZCA9IE1hdGgucG93KGIsIGNzKTtcbiAgICAgICAgdmFyIG1pID0gZmFsc2U7XG4gICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgdmFyIHcgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciB4ID0gaW50QXQocywgaSk7XG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gXCItXCIgJiYgdGhpcy5zaWdudW0oKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3ID0gYiAqIHcgKyB4O1xuICAgICAgICAgICAgaWYgKCsraiA+PSBjcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZE11bHRpcGx5KGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LCAwKTtcbiAgICAgICAgICAgICAgICBqID0gMDtcbiAgICAgICAgICAgICAgICB3ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZE11bHRpcGx5KE1hdGgucG93KGIsIGopKTtcbiAgICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWkpIHtcbiAgICAgICAgICAgIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlciA9IGJucEZyb21OdW1iZXI7XG4gICAgLy8gKHByb3RlY3RlZCkgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlciA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBiKSB7XG4gICAgICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsaW50LFJORylcbiAgICAgICAgICAgIGlmIChhIDwgMikge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbUludCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbU51bWJlcihhLCBjKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGVzdEJpdChhIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgTVNCIHNldFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYSAtIDEpLCBvcF9vciwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRXZlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCgxLCAwKTtcbiAgICAgICAgICAgICAgICB9IC8vIGZvcmNlIG9kZFxuICAgICAgICAgICAgICAgIHdoaWxlICghdGhpcy5pc1Byb2JhYmxlUHJpbWUoYikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iaXRMZW5ndGgoKSA+IGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEgLSAxKSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsUk5HKVxuICAgICAgICAgICAgdmFyIHggPSBbXTtcbiAgICAgICAgICAgIHZhciB0ID0gYSAmIDc7XG4gICAgICAgICAgICB4Lmxlbmd0aCA9IChhID4+IDMpICsgMTtcbiAgICAgICAgICAgIGIubmV4dEJ5dGVzKHgpO1xuICAgICAgICAgICAgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgeFswXSAmPSAoKDEgPDwgdCkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHhbMF0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHgsIDI1Nik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbyA9IGJucEJpdHdpc2VUbztcbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyBvcCBhIChiaXR3aXNlKVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbyA9IGZ1bmN0aW9uIChhLCBvcCwgcikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIGY7XG4gICAgICAgIHZhciBtID0gTWF0aC5taW4oYS50LCB0aGlzLnQpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7XG4gICAgICAgICAgICByW2ldID0gb3AodGhpc1tpXSwgYVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEudCA8IHRoaXMudCkge1xuICAgICAgICAgICAgZiA9IGEucyAmIHRoaXMuRE07XG4gICAgICAgICAgICBmb3IgKGkgPSBtOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICAgICAgICAgICAgICByW2ldID0gb3AodGhpc1tpXSwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmID0gdGhpcy5zICYgdGhpcy5ETTtcbiAgICAgICAgICAgIGZvciAoaSA9IG07IGkgPCBhLnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHJbaV0gPSBvcChmLCBhW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIudCA9IGEudDtcbiAgICAgICAgfVxuICAgICAgICByLnMgPSBvcCh0aGlzLnMsIGEucyk7XG4gICAgICAgIHIuY2xhbXAoKTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdCA9IGJucENoYW5nZUJpdDtcbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdCA9IGZ1bmN0aW9uIChuLCBvcCkge1xuICAgICAgICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgICAgICAgdGhpcy5iaXR3aXNlVG8ociwgb3AsIHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKyBhXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG8gPSBmdW5jdGlvbiAoYSwgcikge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHZhciBjID0gMDtcbiAgICAgICAgdmFyIG0gPSBNYXRoLm1pbihhLnQsIHRoaXMudCk7XG4gICAgICAgIHdoaWxlIChpIDwgbSkge1xuICAgICAgICAgICAgYyArPSB0aGlzW2ldICsgYVtpXTtcbiAgICAgICAgICAgIHJbaSsrXSA9IGMgJiB0aGlzLkRNO1xuICAgICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS50IDwgdGhpcy50KSB7XG4gICAgICAgICAgICBjICs9IGEucztcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy50KSB7XG4gICAgICAgICAgICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgICAgICAgICAgIHJbaSsrXSA9IGMgJiB0aGlzLkRNO1xuICAgICAgICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjICs9IHRoaXMucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBhLnQpIHtcbiAgICAgICAgICAgICAgICBjICs9IGFbaV07XG4gICAgICAgICAgICAgICAgcltpKytdID0gYyAmIHRoaXMuRE07XG4gICAgICAgICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGMgKz0gYS5zO1xuICAgICAgICB9XG4gICAgICAgIHIucyA9IChjIDwgMCkgPyAtMSA6IDA7XG4gICAgICAgIGlmIChjID4gMCkge1xuICAgICAgICAgICAgcltpKytdID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgLTEpIHtcbiAgICAgICAgICAgIHJbaSsrXSA9IHRoaXMuRFYgKyBjO1xuICAgICAgICB9XG4gICAgICAgIHIudCA9IGk7XG4gICAgICAgIHIuY2xhbXAoKTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLmRNdWx0aXBseSA9IGJucERNdWx0aXBseTtcbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICo9IG4sIHRoaXMgPj0gMCwgMSA8IG4gPCBEVlxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRNdWx0aXBseSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHRoaXNbdGhpcy50XSA9IHRoaXMuYW0oMCwgbiAtIDEsIHRoaXMsIDAsIDAsIHRoaXMudCk7XG4gICAgICAgICsrdGhpcy50O1xuICAgICAgICB0aGlzLmNsYW1wKCk7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0ID0gYm5wREFkZE9mZnNldDtcbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICs9IG4gPDwgdyB3b3JkcywgdGhpcyA+PSAwXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldCA9IGZ1bmN0aW9uIChuLCB3KSB7XG4gICAgICAgIGlmIChuID09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy50IDw9IHcpIHtcbiAgICAgICAgICAgIHRoaXNbdGhpcy50KytdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW3ddICs9IG47XG4gICAgICAgIHdoaWxlICh0aGlzW3ddID49IHRoaXMuRFYpIHtcbiAgICAgICAgICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICAgICAgICAgIGlmICgrK3cgPj0gdGhpcy50KSB7XG4gICAgICAgICAgICAgICAgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKyt0aGlzW3ddO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG8gPSBibnBNdWx0aXBseUxvd2VyVG87XG4gICAgLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG8gPSBmdW5jdGlvbiAoYSwgbiwgcikge1xuICAgICAgICB2YXIgaSA9IE1hdGgubWluKHRoaXMudCArIGEudCwgbik7XG4gICAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgICAgci50ID0gaTtcbiAgICAgICAgd2hpbGUgKGkgPiAwKSB7XG4gICAgICAgICAgICByWy0taV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSByLnQgLSB0aGlzLnQ7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgICAgIHJbaSArIHRoaXMudF0gPSB0aGlzLmFtKDAsIGFbaV0sIHIsIGksIDAsIHRoaXMudCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWluKGEudCwgbik7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMuYW0oMCwgYVtpXSwgciwgaSwgMCwgbiAtIGkpO1xuICAgICAgICB9XG4gICAgICAgIHIuY2xhbXAoKTtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbyA9IGJucE11bHRpcGx5VXBwZXJUbztcbiAgICAvLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlVcHBlclRvID0gZnVuY3Rpb24gKGEsIG4sIHIpIHtcbiAgICAgICAgLS1uO1xuICAgICAgICB2YXIgaSA9IHIudCA9IHRoaXMudCArIGEudCAtIG47XG4gICAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICByW2ldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSBNYXRoLm1heChuIC0gdGhpcy50LCAwKTsgaSA8IGEudDsgKytpKSB7XG4gICAgICAgICAgICByW3RoaXMudCArIGkgLSBuXSA9IHRoaXMuYW0obiAtIGksIGFbaV0sIHIsIDAsIDAsIHRoaXMudCArIGkgLSBuKTtcbiAgICAgICAgfVxuICAgICAgICByLmNsYW1wKCk7XG4gICAgICAgIHIuZHJTaGlmdFRvKDEsIHIpO1xuICAgIH07XG4gICAgLy8gQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50ID0gYm5wTW9kSW50O1xuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgJSBuLCBuIDwgMl4yNlxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIGlmIChuIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gdGhpcy5EViAlIG47XG4gICAgICAgIHZhciByID0gKHRoaXMucyA8IDApID8gbiAtIDEgOiAwO1xuICAgICAgICBpZiAodGhpcy50ID4gMCkge1xuICAgICAgICAgICAgaWYgKGQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHIgPSB0aGlzWzBdICUgbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnQgLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgICAgICByID0gKGQgKiByICsgdGhpc1tpXSkgJSBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBuMSA9IHRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICAgICAgICB2YXIgayA9IG4xLmdldExvd2VzdFNldEJpdCgpO1xuICAgICAgICBpZiAoayA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGspO1xuICAgICAgICB0ID0gKHQgKyAxKSA+PiAxO1xuICAgICAgICBpZiAodCA+IGxvd3ByaW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHQgPSBsb3dwcmltZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhID0gbmJpKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7XG4gICAgICAgICAgICAvLyBQaWNrIGJhc2VzIGF0IHJhbmRvbSwgaW5zdGVhZCBvZiBzdGFydGluZyBhdCAyXG4gICAgICAgICAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGxvd3ByaW1lcy5sZW5ndGgpXSk7XG4gICAgICAgICAgICB2YXIgeSA9IGEubW9kUG93KHIsIHRoaXMpO1xuICAgICAgICAgICAgaWYgKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICAgICAgICAgIHdoaWxlIChqKysgPCBrICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvLyBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmUgPSBiblNxdWFyZTtcbiAgICAvLyAocHVibGljKSB0aGlzXjJcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICAgIHRoaXMuc3F1YXJlVG8ocik7XG4gICAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgLy8jcmVnaW9uIEFTWU5DXG4gICAgLy8gUHVibGljIEFQSSBtZXRob2RcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2RhID0gZnVuY3Rpb24gKGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB4ID0gKHRoaXMucyA8IDApID8gdGhpcy5uZWdhdGUoKSA6IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgdmFyIHkgPSAoYS5zIDwgMCkgPyBhLm5lZ2F0ZSgpIDogYS5jbG9uZSgpO1xuICAgICAgICBpZiAoeC5jb21wYXJlVG8oeSkgPCAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHg7XG4gICAgICAgICAgICB4ID0geTtcbiAgICAgICAgICAgIHkgPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0geC5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgICAgdmFyIGcgPSB5LmdldExvd2VzdFNldEJpdCgpO1xuICAgICAgICBpZiAoZyA8IDApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgZykge1xuICAgICAgICAgICAgZyA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGcgPiAwKSB7XG4gICAgICAgICAgICB4LnJTaGlmdFRvKGcsIHgpO1xuICAgICAgICAgICAgeS5yU2hpZnRUbyhnLCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXb3JraG9yc2Ugb2YgdGhlIGFsZ29yaXRobSwgZ2V0cyBjYWxsZWQgMjAwIC0gODAwIHRpbWVzIHBlciA1MTIgYml0IGtleWdlbi5cbiAgICAgICAgdmFyIGdjZGExID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKChpID0geC5nZXRMb3dlc3RTZXRCaXQoKSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgeC5yU2hpZnRUbyhpLCB4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkge1xuICAgICAgICAgICAgICAgIHkuclNoaWZ0VG8oaSwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeC5jb21wYXJlVG8oeSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHguc3ViVG8oeSwgeCk7XG4gICAgICAgICAgICAgICAgeC5yU2hpZnRUbygxLCB4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHkuc3ViVG8oeCwgeSk7XG4gICAgICAgICAgICAgICAgeS5yU2hpZnRUbygxLCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHguc2lnbnVtKCkgPiAwKSkge1xuICAgICAgICAgICAgICAgIGlmIChnID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB5LmxTaGlmdFRvKGcsIHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2FsbGJhY2soeSk7IH0sIDApOyAvLyBlc2NhcGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZ2NkYTEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXRUaW1lb3V0KGdjZGExLCAxMCk7XG4gICAgfTtcbiAgICAvLyAocHJvdGVjdGVkKSBhbHRlcm5hdGUgY29uc3RydWN0b3JcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyQXN5bmMgPSBmdW5jdGlvbiAoYSwgYiwgYywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGIpIHtcbiAgICAgICAgICAgIGlmIChhIDwgMikge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbUludCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbU51bWJlcihhLCBjKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGVzdEJpdChhIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEgLSAxKSwgb3Bfb3IsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0V2ZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRBZGRPZmZzZXQoMSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBibnBfMSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIGJucGZuMV8xID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBibnBfMS5kQWRkT2Zmc2V0KDIsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYm5wXzEuYml0TGVuZ3RoKCkgPiBhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibnBfMS5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYSAtIDEpLCBibnBfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJucF8xLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKCk7IH0sIDApOyAvLyBlc2NhcGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoYm5wZm4xXzEsIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGJucGZuMV8xLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB4ID0gW107XG4gICAgICAgICAgICB2YXIgdCA9IGEgJiA3O1xuICAgICAgICAgICAgeC5sZW5ndGggPSAoYSA+PiAzKSArIDE7XG4gICAgICAgICAgICBiLm5leHRCeXRlcyh4KTtcbiAgICAgICAgICAgIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgICAgIHhbMF0gJj0gKCgxIDw8IHQpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4WzBdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyh4LCAyNTYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmlnSW50ZWdlcjtcbn0oKSk7XG4vLyNyZWdpb24gUkVEVUNFUlNcbi8vI3JlZ2lvbiBOdWxsRXhwXG52YXIgTnVsbEV4cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOdWxsRXhwKCkge1xuICAgIH1cbiAgICAvLyBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgICAvLyBOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQgPSBuTm9wO1xuICAgIE51bGxFeHAucHJvdG90eXBlLnJldmVydCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG4gICAgLy8gTnVsbEV4cC5wcm90b3R5cGUubXVsVG8gPSBuTXVsVG87XG4gICAgTnVsbEV4cC5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICB4Lm11bHRpcGx5VG8oeSwgcik7XG4gICAgfTtcbiAgICAvLyBOdWxsRXhwLnByb3RvdHlwZS5zcXJUbyA9IG5TcXJUbztcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5zcXJUbyA9IGZ1bmN0aW9uICh4LCByKSB7XG4gICAgICAgIHguc3F1YXJlVG8ocik7XG4gICAgfTtcbiAgICByZXR1cm4gTnVsbEV4cDtcbn0oKSk7XG4vLyBNb2R1bGFyIHJlZHVjdGlvbiB1c2luZyBcImNsYXNzaWNcIiBhbGdvcml0aG1cbnZhciBDbGFzc2ljID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsYXNzaWMobSkge1xuICAgICAgICB0aGlzLm0gPSBtO1xuICAgIH1cbiAgICAvLyBDbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0ID0gY0NvbnZlcnQ7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGlmICh4LnMgPCAwIHx8IHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gQ2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0ID0gY1JldmVydDtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9O1xuICAgIC8vIENsYXNzaWMucHJvdG90eXBlLnJlZHVjZSA9IGNSZWR1Y2U7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgeC5kaXZSZW1Ubyh0aGlzLm0sIG51bGwsIHgpO1xuICAgIH07XG4gICAgLy8gQ2xhc3NpYy5wcm90b3R5cGUubXVsVG8gPSBjTXVsVG87XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICB4Lm11bHRpcGx5VG8oeSwgcik7XG4gICAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgIH07XG4gICAgLy8gQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBjU3FyVG87XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBmdW5jdGlvbiAoeCwgcikge1xuICAgICAgICB4LnNxdWFyZVRvKHIpO1xuICAgICAgICB0aGlzLnJlZHVjZShyKTtcbiAgICB9O1xuICAgIHJldHVybiBDbGFzc2ljO1xufSgpKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIE1vbnRnb21lcnlcbi8vIE1vbnRnb21lcnkgcmVkdWN0aW9uXG52YXIgTW9udGdvbWVyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb250Z29tZXJ5KG0pIHtcbiAgICAgICAgdGhpcy5tID0gbTtcbiAgICAgICAgdGhpcy5tcCA9IG0uaW52RGlnaXQoKTtcbiAgICAgICAgdGhpcy5tcGwgPSB0aGlzLm1wICYgMHg3ZmZmO1xuICAgICAgICB0aGlzLm1waCA9IHRoaXMubXAgPj4gMTU7XG4gICAgICAgIHRoaXMudW0gPSAoMSA8PCAobS5EQiAtIDE1KSkgLSAxO1xuICAgICAgICB0aGlzLm10MiA9IDIgKiBtLnQ7XG4gICAgfVxuICAgIC8vIE1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQgPSBtb250Q29udmVydDtcbiAgICAvLyB4UiBtb2QgbVxuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICB4LmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCwgcik7XG4gICAgICAgIHIuZGl2UmVtVG8odGhpcy5tLCBudWxsLCByKTtcbiAgICAgICAgaWYgKHgucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubS5zdWJUbyhyLCByKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIE1vbnRnb21lcnkucHJvdG90eXBlLnJldmVydCA9IG1vbnRSZXZlcnQ7XG4gICAgLy8geC9SIG1vZCBtXG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgICAgeC5jb3B5VG8ocik7XG4gICAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8vIE1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IG1vbnRSZWR1Y2U7XG4gICAgLy8geCA9IHgvUiBtb2QgbSAoSEFDIDE0LjMyKVxuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHdoaWxlICh4LnQgPD0gdGhpcy5tdDIpIHtcbiAgICAgICAgICAgIC8vIHBhZCB4IHNvIGFtIGhhcyBlbm91Z2ggcm9vbSBsYXRlclxuICAgICAgICAgICAgeFt4LnQrK10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tLnQ7ICsraSkge1xuICAgICAgICAgICAgLy8gZmFzdGVyIHdheSBvZiBjYWxjdWxhdGluZyB1MCA9IHhbaV0qbXAgbW9kIERWXG4gICAgICAgICAgICB2YXIgaiA9IHhbaV0gJiAweDdmZmY7XG4gICAgICAgICAgICB2YXIgdTAgPSAoaiAqIHRoaXMubXBsICsgKCgoaiAqIHRoaXMubXBoICsgKHhbaV0gPj4gMTUpICogdGhpcy5tcGwpICYgdGhpcy51bSkgPDwgMTUpKSAmIHguRE07XG4gICAgICAgICAgICAvLyB1c2UgYW0gdG8gY29tYmluZSB0aGUgbXVsdGlwbHktc2hpZnQtYWRkIGludG8gb25lIGNhbGxcbiAgICAgICAgICAgIGogPSBpICsgdGhpcy5tLnQ7XG4gICAgICAgICAgICB4W2pdICs9IHRoaXMubS5hbSgwLCB1MCwgeCwgaSwgMCwgdGhpcy5tLnQpO1xuICAgICAgICAgICAgLy8gcHJvcGFnYXRlIGNhcnJ5XG4gICAgICAgICAgICB3aGlsZSAoeFtqXSA+PSB4LkRWKSB7XG4gICAgICAgICAgICAgICAgeFtqXSAtPSB4LkRWO1xuICAgICAgICAgICAgICAgIHhbKytqXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHguY2xhbXAoKTtcbiAgICAgICAgeC5kclNoaWZ0VG8odGhpcy5tLnQsIHgpO1xuICAgICAgICBpZiAoeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSB7XG4gICAgICAgICAgICB4LnN1YlRvKHRoaXMubSwgeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIE1vbnRnb21lcnkucHJvdG90eXBlLm11bFRvID0gbW9udE11bFRvO1xuICAgIC8vIHIgPSBcInh5L1IgbW9kIG1cIjsgeCx5ICE9IHJcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHgubXVsdGlwbHlUbyh5LCByKTtcbiAgICAgICAgdGhpcy5yZWR1Y2Uocik7XG4gICAgfTtcbiAgICAvLyBNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbyA9IG1vbnRTcXJUbztcbiAgICAvLyByID0gXCJ4XjIvUiBtb2QgbVwiOyB4ICE9IHJcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbyA9IGZ1bmN0aW9uICh4LCByKSB7XG4gICAgICAgIHguc3F1YXJlVG8ocik7XG4gICAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgIH07XG4gICAgcmV0dXJuIE1vbnRnb21lcnk7XG59KCkpO1xuLy8jZW5kcmVnaW9uIE1vbnRnb21lcnlcbi8vI3JlZ2lvbiBCYXJyZXR0XG4vLyBCYXJyZXR0IG1vZHVsYXIgcmVkdWN0aW9uXG52YXIgQmFycmV0dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCYXJyZXR0KG0pIHtcbiAgICAgICAgdGhpcy5tID0gbTtcbiAgICAgICAgLy8gc2V0dXAgQmFycmV0dFxuICAgICAgICB0aGlzLnIyID0gbmJpKCk7XG4gICAgICAgIHRoaXMucTMgPSBuYmkoKTtcbiAgICAgICAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKDIgKiBtLnQsIHRoaXMucjIpO1xuICAgICAgICB0aGlzLm11ID0gdGhpcy5yMi5kaXZpZGUobSk7XG4gICAgfVxuICAgIC8vIEJhcnJldHQucHJvdG90eXBlLmNvbnZlcnQgPSBiYXJyZXR0Q29udmVydDtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKHgucyA8IDAgfHwgeC50ID4gMiAqIHRoaXMubS50KSB7XG4gICAgICAgICAgICByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh4LmNvbXBhcmVUbyh0aGlzLm0pIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgICAgICAgeC5jb3B5VG8ocik7XG4gICAgICAgICAgICB0aGlzLnJlZHVjZShyKTtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBCYXJyZXR0LnByb3RvdHlwZS5yZXZlcnQgPSBiYXJyZXR0UmV2ZXJ0O1xuICAgIEJhcnJldHQucHJvdG90eXBlLnJldmVydCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG4gICAgLy8gQmFycmV0dC5wcm90b3R5cGUucmVkdWNlID0gYmFycmV0dFJlZHVjZTtcbiAgICAvLyB4ID0geCBtb2QgbSAoSEFDIDE0LjQyKVxuICAgIEJhcnJldHQucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHguZHJTaGlmdFRvKHRoaXMubS50IC0gMSwgdGhpcy5yMik7XG4gICAgICAgIGlmICh4LnQgPiB0aGlzLm0udCArIDEpIHtcbiAgICAgICAgICAgIHgudCA9IHRoaXMubS50ICsgMTtcbiAgICAgICAgICAgIHguY2xhbXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLCB0aGlzLm0udCArIDEsIHRoaXMucTMpO1xuICAgICAgICB0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsIHRoaXMubS50ICsgMSwgdGhpcy5yMik7XG4gICAgICAgIHdoaWxlICh4LmNvbXBhcmVUbyh0aGlzLnIyKSA8IDApIHtcbiAgICAgICAgICAgIHguZEFkZE9mZnNldCgxLCB0aGlzLm0udCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHguc3ViVG8odGhpcy5yMiwgeCk7XG4gICAgICAgIHdoaWxlICh4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHtcbiAgICAgICAgICAgIHguc3ViVG8odGhpcy5tLCB4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gQmFycmV0dC5wcm90b3R5cGUubXVsVG8gPSBiYXJyZXR0TXVsVG87XG4gICAgLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHgubXVsdGlwbHlUbyh5LCByKTtcbiAgICAgICAgdGhpcy5yZWR1Y2Uocik7XG4gICAgfTtcbiAgICAvLyBCYXJyZXR0LnByb3RvdHlwZS5zcXJUbyA9IGJhcnJldHRTcXJUbztcbiAgICAvLyByID0geF4yIG1vZCBtOyB4ICE9IHJcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5zcXJUbyA9IGZ1bmN0aW9uICh4LCByKSB7XG4gICAgICAgIHguc3F1YXJlVG8ocik7XG4gICAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgIH07XG4gICAgcmV0dXJuIEJhcnJldHQ7XG59KCkpO1xuLy8jZW5kcmVnaW9uXG4vLyNlbmRyZWdpb24gUkVEVUNFUlNcbi8vIHJldHVybiBuZXcsIHVuc2V0IEJpZ0ludGVnZXJcbmZ1bmN0aW9uIG5iaSgpIHsgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG51bGwpOyB9XG5mdW5jdGlvbiBwYXJzZUJpZ0ludChzdHIsIHIpIHtcbiAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoc3RyLCByKTtcbn1cbi8vIGFtOiBDb21wdXRlIHdfaiArPSAoeCp0aGlzX2kpLCBwcm9wYWdhdGUgY2Fycmllcyxcbi8vIGMgaXMgaW5pdGlhbCBjYXJyeSwgcmV0dXJucyBmaW5hbCBjYXJyeS5cbi8vIGMgPCAzKmR2YWx1ZSwgeCA8IDIqZHZhbHVlLCB0aGlzX2kgPCBkdmFsdWVcbi8vIFdlIG5lZWQgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0IG9uZSB0aGF0IHdvcmtzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4vLyBhbTE6IHVzZSBhIHNpbmdsZSBtdWx0IGFuZCBkaXZpZGUgdG8gZ2V0IHRoZSBoaWdoIGJpdHMsXG4vLyBtYXggZGlnaXQgYml0cyBzaG91bGQgYmUgMjYgYmVjYXVzZVxuLy8gbWF4IGludGVybmFsIHZhbHVlID0gMipkdmFsdWVeMi0yKmR2YWx1ZSAoPCAyXjUzKVxuZnVuY3Rpb24gYW0xKGksIHgsIHcsIGosIGMsIG4pIHtcbiAgICB3aGlsZSAoLS1uID49IDApIHtcbiAgICAgICAgdmFyIHYgPSB4ICogdGhpc1tpKytdICsgd1tqXSArIGM7XG4gICAgICAgIGMgPSBNYXRoLmZsb29yKHYgLyAweDQwMDAwMDApO1xuICAgICAgICB3W2orK10gPSB2ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICByZXR1cm4gYztcbn1cbi8vIGFtMiBhdm9pZHMgYSBiaWcgbXVsdC1hbmQtZXh0cmFjdCBjb21wbGV0ZWx5LlxuLy8gTWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDw9IDMwIGJlY2F1c2Ugd2UgZG8gYml0d2lzZSBvcHNcbi8vIG9uIHZhbHVlcyB1cCB0byAyKmhkdmFsdWVeMi1oZHZhbHVlLTEgKDwgMl4zMSlcbmZ1bmN0aW9uIGFtMihpLCB4LCB3LCBqLCBjLCBuKSB7XG4gICAgdmFyIHhsID0geCAmIDB4N2ZmZjtcbiAgICB2YXIgeGggPSB4ID4+IDE1O1xuICAgIHdoaWxlICgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgbCA9IHRoaXNbaV0gJiAweDdmZmY7XG4gICAgICAgIHZhciBoID0gdGhpc1tpKytdID4+IDE1O1xuICAgICAgICB2YXIgbSA9IHhoICogbCArIGggKiB4bDtcbiAgICAgICAgbCA9IHhsICogbCArICgobSAmIDB4N2ZmZikgPDwgMTUpICsgd1tqXSArIChjICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGMgPSAobCA+Pj4gMzApICsgKG0gPj4+IDE1KSArIHhoICogaCArIChjID4+PiAzMCk7XG4gICAgICAgIHdbaisrXSA9IGwgJiAweDNmZmZmZmZmO1xuICAgIH1cbiAgICByZXR1cm4gYztcbn1cbi8vIEFsdGVybmF0ZWx5LCBzZXQgbWF4IGRpZ2l0IGJpdHMgdG8gMjggc2luY2Ugc29tZVxuLy8gYnJvd3NlcnMgc2xvdyBkb3duIHdoZW4gZGVhbGluZyB3aXRoIDMyLWJpdCBudW1iZXJzLlxuZnVuY3Rpb24gYW0zKGksIHgsIHcsIGosIGMsIG4pIHtcbiAgICB2YXIgeGwgPSB4ICYgMHgzZmZmO1xuICAgIHZhciB4aCA9IHggPj4gMTQ7XG4gICAgd2hpbGUgKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciBsID0gdGhpc1tpXSAmIDB4M2ZmZjtcbiAgICAgICAgdmFyIGggPSB0aGlzW2krK10gPj4gMTQ7XG4gICAgICAgIHZhciBtID0geGggKiBsICsgaCAqIHhsO1xuICAgICAgICBsID0geGwgKiBsICsgKChtICYgMHgzZmZmKSA8PCAxNCkgKyB3W2pdICsgYztcbiAgICAgICAgYyA9IChsID4+IDI4KSArIChtID4+IDE0KSArIHhoICogaDtcbiAgICAgICAgd1tqKytdID0gbCAmIDB4ZmZmZmZmZjtcbiAgICB9XG4gICAgcmV0dXJuIGM7XG59XG5pZiAoal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gXCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpIHtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMjtcbiAgICBkYml0cyA9IDMwO1xufVxuZWxzZSBpZiAoal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgIT0gXCJOZXRzY2FwZVwiKSkge1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0xO1xuICAgIGRiaXRzID0gMjY7XG59XG5lbHNlIHsgLy8gTW96aWxsYS9OZXRzY2FwZSBzZWVtcyB0byBwcmVmZXIgYW0zXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTM7XG4gICAgZGJpdHMgPSAyODtcbn1cbkJpZ0ludGVnZXIucHJvdG90eXBlLkRCID0gZGJpdHM7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5ETSA9ICgoMSA8PCBkYml0cykgLSAxKTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLkRWID0gKDEgPDwgZGJpdHMpO1xudmFyIEJJX0ZQID0gNTI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5GViA9IE1hdGgucG93KDIsIEJJX0ZQKTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLkYxID0gQklfRlAgLSBkYml0cztcbkJpZ0ludGVnZXIucHJvdG90eXBlLkYyID0gMiAqIGRiaXRzIC0gQklfRlA7XG4vLyBEaWdpdCBjb252ZXJzaW9uc1xudmFyIEJJX1JDID0gW107XG52YXIgcnI7XG52YXIgdnY7XG5yciA9IFwiMFwiLmNoYXJDb2RlQXQoMCk7XG5mb3IgKHZ2ID0gMDsgdnYgPD0gOTsgKyt2dikge1xuICAgIEJJX1JDW3JyKytdID0gdnY7XG59XG5yciA9IFwiYVwiLmNoYXJDb2RlQXQoMCk7XG5mb3IgKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIHtcbiAgICBCSV9SQ1tycisrXSA9IHZ2O1xufVxucnIgPSBcIkFcIi5jaGFyQ29kZUF0KDApO1xuZm9yICh2diA9IDEwOyB2diA8IDM2OyArK3Z2KSB7XG4gICAgQklfUkNbcnIrK10gPSB2djtcbn1cbmZ1bmN0aW9uIGludEF0KHMsIGkpIHtcbiAgICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07XG4gICAgcmV0dXJuIChjID09IG51bGwpID8gLTEgOiBjO1xufVxuLy8gcmV0dXJuIGJpZ2ludCBpbml0aWFsaXplZCB0byB2YWx1ZVxuZnVuY3Rpb24gbmJ2KGkpIHtcbiAgICB2YXIgciA9IG5iaSgpO1xuICAgIHIuZnJvbUludChpKTtcbiAgICByZXR1cm4gcjtcbn1cbi8vIHJldHVybnMgYml0IGxlbmd0aCBvZiB0aGUgaW50ZWdlciB4XG5mdW5jdGlvbiBuYml0cyh4KSB7XG4gICAgdmFyIHIgPSAxO1xuICAgIHZhciB0O1xuICAgIGlmICgodCA9IHggPj4+IDE2KSAhPSAwKSB7XG4gICAgICAgIHggPSB0O1xuICAgICAgICByICs9IDE2O1xuICAgIH1cbiAgICBpZiAoKHQgPSB4ID4+IDgpICE9IDApIHtcbiAgICAgICAgeCA9IHQ7XG4gICAgICAgIHIgKz0gODtcbiAgICB9XG4gICAgaWYgKCh0ID0geCA+PiA0KSAhPSAwKSB7XG4gICAgICAgIHggPSB0O1xuICAgICAgICByICs9IDQ7XG4gICAgfVxuICAgIGlmICgodCA9IHggPj4gMikgIT0gMCkge1xuICAgICAgICB4ID0gdDtcbiAgICAgICAgciArPSAyO1xuICAgIH1cbiAgICBpZiAoKHQgPSB4ID4+IDEpICE9IDApIHtcbiAgICAgICAgeCA9IHQ7XG4gICAgICAgIHIgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG59XG4vLyBcImNvbnN0YW50c1wiXG5CaWdJbnRlZ2VyLlpFUk8gPSBuYnYoMCk7XG5CaWdJbnRlZ2VyLk9ORSA9IG5idigxKTtcblxuLy8gcHJuZzQuanMgLSB1c2VzIEFyY2ZvdXIgYXMgYSBQUk5HXG52YXIgQXJjZm91ciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBcmNmb3VyKCkge1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmogPSAwO1xuICAgICAgICB0aGlzLlMgPSBbXTtcbiAgICB9XG4gICAgLy8gQXJjZm91ci5wcm90b3R5cGUuaW5pdCA9IEFSQzRpbml0O1xuICAgIC8vIEluaXRpYWxpemUgYXJjZm91ciBjb250ZXh0IGZyb20ga2V5LCBhbiBhcnJheSBvZiBpbnRzLCBlYWNoIGZyb20gWzAuLjI1NV1cbiAgICBBcmNmb3VyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIGo7XG4gICAgICAgIHZhciB0O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMuU1tpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICAgICAgaiA9IChqICsgdGhpcy5TW2ldICsga2V5W2kgJSBrZXkubGVuZ3RoXSkgJiAyNTU7XG4gICAgICAgICAgICB0ID0gdGhpcy5TW2ldO1xuICAgICAgICAgICAgdGhpcy5TW2ldID0gdGhpcy5TW2pdO1xuICAgICAgICAgICAgdGhpcy5TW2pdID0gdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmogPSAwO1xuICAgIH07XG4gICAgLy8gQXJjZm91ci5wcm90b3R5cGUubmV4dCA9IEFSQzRuZXh0O1xuICAgIEFyY2ZvdXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0O1xuICAgICAgICB0aGlzLmkgPSAodGhpcy5pICsgMSkgJiAyNTU7XG4gICAgICAgIHRoaXMuaiA9ICh0aGlzLmogKyB0aGlzLlNbdGhpcy5pXSkgJiAyNTU7XG4gICAgICAgIHQgPSB0aGlzLlNbdGhpcy5pXTtcbiAgICAgICAgdGhpcy5TW3RoaXMuaV0gPSB0aGlzLlNbdGhpcy5qXTtcbiAgICAgICAgdGhpcy5TW3RoaXMual0gPSB0O1xuICAgICAgICByZXR1cm4gdGhpcy5TWyh0ICsgdGhpcy5TW3RoaXMuaV0pICYgMjU1XTtcbiAgICB9O1xuICAgIHJldHVybiBBcmNmb3VyO1xufSgpKTtcbi8vIFBsdWcgaW4geW91ciBSTkcgY29uc3RydWN0b3IgaGVyZVxuZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IEFyY2ZvdXIoKTtcbn1cbi8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgZ3JlYXRlciB0aGFuIDMyLlxuLy8gQW4gYXJyYXkgb2YgYnl0ZXMgdGhlIHNpemUgb2YgdGhlIHBvb2wgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpXG52YXIgcm5nX3BzaXplID0gMjU2O1xuXG4vLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciAtIHJlcXVpcmVzIGEgUFJORyBiYWNrZW5kLCBlLmcuIHBybmc0LmpzXG52YXIgcm5nX3N0YXRlO1xudmFyIHJuZ19wb29sID0gbnVsbDtcbnZhciBybmdfcHB0cjtcbi8vIEluaXRpYWxpemUgdGhlIHBvb2wgd2l0aCBqdW5rIGlmIG5lZWRlZC5cbmlmIChybmdfcG9vbCA9PSBudWxsKSB7XG4gICAgcm5nX3Bvb2wgPSBbXTtcbiAgICBybmdfcHB0ciA9IDA7XG4gICAgdmFyIHQgPSB2b2lkIDA7XG4gICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBlbnRyb3B5ICgyMDQ4IGJpdHMpIGZyb20gUk5HIGlmIGF2YWlsYWJsZVxuICAgICAgICB2YXIgeiA9IG5ldyBVaW50MzJBcnJheSgyNTYpO1xuICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh6KTtcbiAgICAgICAgZm9yICh0ID0gMDsgdCA8IHoubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gelt0XSAmIDI1NTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVc2UgbW91c2UgZXZlbnRzIGZvciBlbnRyb3B5LCBpZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggZW50cm9weSBieSB0aGUgdGltZVxuICAgIC8vIHdlIG5lZWQgaXQsIGVudHJvcHkgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgTWF0aC5yYW5kb20uXG4gICAgdmFyIG9uTW91c2VNb3ZlTGlzdGVuZXJfMSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB0aGlzLmNvdW50ID0gdGhpcy5jb3VudCB8fCAwO1xuICAgICAgICBpZiAodGhpcy5jb3VudCA+PSAyNTYgfHwgcm5nX3BwdHIgPj0gcm5nX3BzaXplKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZUxpc3RlbmVyXzEsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdpbmRvdy5kZXRhY2hFdmVudCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5kZXRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsIG9uTW91c2VNb3ZlTGlzdGVuZXJfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBtb3VzZUNvb3JkaW5hdGVzID0gZXYueCArIGV2Lnk7XG4gICAgICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IG1vdXNlQ29vcmRpbmF0ZXMgJiAyNTU7XG4gICAgICAgICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFNvbWV0aW1lcyBGaXJlZm94IHdpbGwgZGVueSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBldmVudCBwcm9wZXJ0aWVzIGZvciBzb21lIHJlYXNvbi4gSWdub3JlLlxuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgb25Nb3VzZU1vdmVMaXN0ZW5lcl8xLCBmYWxzZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCkge1xuICAgICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoXCJvbm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZUxpc3RlbmVyXzEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpIHtcbiAgICBpZiAocm5nX3N0YXRlID09IG51bGwpIHtcbiAgICAgICAgcm5nX3N0YXRlID0gcHJuZ19uZXdzdGF0ZSgpO1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBtYXkgbm90IGhhdmUgY29sbGVjdGVkIGVub3VnaCBlbnRyb3B5LiAgSWYgbm90LCBmYWxsIGJhY2sgdG8gTWF0aC5yYW5kb21cbiAgICAgICAgd2hpbGUgKHJuZ19wcHRyIDwgcm5nX3BzaXplKSB7XG4gICAgICAgICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcig2NTUzNiAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSByYW5kb20gJiAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgcm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO1xuICAgICAgICBmb3IgKHJuZ19wcHRyID0gMDsgcm5nX3BwdHIgPCBybmdfcG9vbC5sZW5ndGg7ICsrcm5nX3BwdHIpIHtcbiAgICAgICAgICAgIHJuZ19wb29sW3JuZ19wcHRyXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcm5nX3BwdHIgPSAwO1xuICAgIH1cbiAgICAvLyBUT0RPOiBhbGxvdyByZXNlZWRpbmcgYWZ0ZXIgZmlyc3QgcmVxdWVzdFxuICAgIHJldHVybiBybmdfc3RhdGUubmV4dCgpO1xufVxudmFyIFNlY3VyZVJhbmRvbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZWN1cmVSYW5kb20oKSB7XG4gICAgfVxuICAgIFNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzID0gZnVuY3Rpb24gKGJhKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGJhW2ldID0gcm5nX2dldF9ieXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTZWN1cmVSYW5kb207XG59KCkpO1xuXG4vLyBEZXBlbmRzIG9uIGpzYm4uanMgYW5kIHJuZy5qc1xuLy8gZnVuY3Rpb24gbGluZWJyayhzLG4pIHtcbi8vICAgdmFyIHJldCA9IFwiXCI7XG4vLyAgIHZhciBpID0gMDtcbi8vICAgd2hpbGUoaSArIG4gPCBzLmxlbmd0aCkge1xuLy8gICAgIHJldCArPSBzLnN1YnN0cmluZyhpLGkrbikgKyBcIlxcblwiO1xuLy8gICAgIGkgKz0gbjtcbi8vICAgfVxuLy8gICByZXR1cm4gcmV0ICsgcy5zdWJzdHJpbmcoaSxzLmxlbmd0aCk7XG4vLyB9XG4vLyBmdW5jdGlvbiBieXRlMkhleChiKSB7XG4vLyAgIGlmKGIgPCAweDEwKVxuLy8gICAgIHJldHVybiBcIjBcIiArIGIudG9TdHJpbmcoMTYpO1xuLy8gICBlbHNlXG4vLyAgICAgcmV0dXJuIGIudG9TdHJpbmcoMTYpO1xuLy8gfVxuZnVuY3Rpb24gcGtjczFwYWQxKHMsIG4pIHtcbiAgICBpZiAobiA8IHMubGVuZ3RoICsgMjIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBsZW4gPSBuIC0gcy5sZW5ndGggLSA2O1xuICAgIHZhciBmaWxsZXIgPSBcIlwiO1xuICAgIGZvciAodmFyIGYgPSAwOyBmIDwgbGVuOyBmICs9IDIpIHtcbiAgICAgICAgZmlsbGVyICs9IFwiZmZcIjtcbiAgICB9XG4gICAgdmFyIG0gPSBcIjAwMDFcIiArIGZpbGxlciArIFwiMDBcIiArIHM7XG4gICAgcmV0dXJuIHBhcnNlQmlnSW50KG0sIDE2KTtcbn1cbi8vIFBLQ1MjMSAodHlwZSAyLCByYW5kb20pIHBhZCBpbnB1dCBzdHJpbmcgcyB0byBuIGJ5dGVzLCBhbmQgcmV0dXJuIGEgYmlnaW50XG5mdW5jdGlvbiBwa2NzMXBhZDIocywgbikge1xuICAgIGlmIChuIDwgcy5sZW5ndGggKyAxMSkgeyAvLyBUT0RPOiBmaXggZm9yIHV0Zi04XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgYmEgPSBbXTtcbiAgICB2YXIgaSA9IHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIG4gPiAwKSB7XG4gICAgICAgIHZhciBjID0gcy5jaGFyQ29kZUF0KGktLSk7XG4gICAgICAgIGlmIChjIDwgMTI4KSB7IC8vIGVuY29kZSB1c2luZyB1dGYtOFxuICAgICAgICAgICAgYmFbLS1uXSA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGMgPiAxMjcpICYmIChjIDwgMjA0OCkpIHtcbiAgICAgICAgICAgIGJhWy0tbl0gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgICAgIGJhWy0tbl0gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJhWy0tbl0gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgICAgIGJhWy0tbl0gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgICBiYVstLW5dID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGJhWy0tbl0gPSAwO1xuICAgIHZhciBybmcgPSBuZXcgU2VjdXJlUmFuZG9tKCk7XG4gICAgdmFyIHggPSBbXTtcbiAgICB3aGlsZSAobiA+IDIpIHsgLy8gcmFuZG9tIG5vbi16ZXJvIHBhZFxuICAgICAgICB4WzBdID0gMDtcbiAgICAgICAgd2hpbGUgKHhbMF0gPT0gMCkge1xuICAgICAgICAgICAgcm5nLm5leHRCeXRlcyh4KTtcbiAgICAgICAgfVxuICAgICAgICBiYVstLW5dID0geFswXTtcbiAgICB9XG4gICAgYmFbLS1uXSA9IDI7XG4gICAgYmFbLS1uXSA9IDA7XG4gICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGJhKTtcbn1cbi8vIFwiZW1wdHlcIiBSU0Ega2V5IGNvbnN0cnVjdG9yXG52YXIgUlNBS2V5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJTQUtleSgpIHtcbiAgICAgICAgdGhpcy5uID0gbnVsbDtcbiAgICAgICAgdGhpcy5lID0gMDtcbiAgICAgICAgdGhpcy5kID0gbnVsbDtcbiAgICAgICAgdGhpcy5wID0gbnVsbDtcbiAgICAgICAgdGhpcy5xID0gbnVsbDtcbiAgICAgICAgdGhpcy5kbXAxID0gbnVsbDtcbiAgICAgICAgdGhpcy5kbXExID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2VmZiA9IG51bGw7XG4gICAgfVxuICAgIC8vI3JlZ2lvbiBQUk9URUNURURcbiAgICAvLyBwcm90ZWN0ZWRcbiAgICAvLyBSU0FLZXkucHJvdG90eXBlLmRvUHVibGljID0gUlNBRG9QdWJsaWM7XG4gICAgLy8gUGVyZm9ybSByYXcgcHVibGljIG9wZXJhdGlvbiBvbiBcInhcIjogcmV0dXJuIHheZSAobW9kIG4pXG4gICAgUlNBS2V5LnByb3RvdHlwZS5kb1B1YmxpYyA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4Lm1vZFBvd0ludCh0aGlzLmUsIHRoaXMubik7XG4gICAgfTtcbiAgICAvLyBSU0FLZXkucHJvdG90eXBlLmRvUHJpdmF0ZSA9IFJTQURvUHJpdmF0ZTtcbiAgICAvLyBQZXJmb3JtIHJhdyBwcml2YXRlIG9wZXJhdGlvbiBvbiBcInhcIjogcmV0dXJuIHheZCAobW9kIG4pXG4gICAgUlNBS2V5LnByb3RvdHlwZS5kb1ByaXZhdGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICBpZiAodGhpcy5wID09IG51bGwgfHwgdGhpcy5xID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB4Lm1vZFBvdyh0aGlzLmQsIHRoaXMubik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmUtY2FsY3VsYXRlIGFueSBtaXNzaW5nIENSVCBwYXJhbXNcbiAgICAgICAgdmFyIHhwID0geC5tb2QodGhpcy5wKS5tb2RQb3codGhpcy5kbXAxLCB0aGlzLnApO1xuICAgICAgICB2YXIgeHEgPSB4Lm1vZCh0aGlzLnEpLm1vZFBvdyh0aGlzLmRtcTEsIHRoaXMucSk7XG4gICAgICAgIHdoaWxlICh4cC5jb21wYXJlVG8oeHEpIDwgMCkge1xuICAgICAgICAgICAgeHAgPSB4cC5hZGQodGhpcy5wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHAuc3VidHJhY3QoeHEpLm11bHRpcGx5KHRoaXMuY29lZmYpLm1vZCh0aGlzLnApLm11bHRpcGx5KHRoaXMucSkuYWRkKHhxKTtcbiAgICB9O1xuICAgIC8vI2VuZHJlZ2lvbiBQUk9URUNURURcbiAgICAvLyNyZWdpb24gUFVCTElDXG4gICAgLy8gUlNBS2V5LnByb3RvdHlwZS5zZXRQdWJsaWMgPSBSU0FTZXRQdWJsaWM7XG4gICAgLy8gU2V0IHRoZSBwdWJsaWMga2V5IGZpZWxkcyBOIGFuZCBlIGZyb20gaGV4IHN0cmluZ3NcbiAgICBSU0FLZXkucHJvdG90eXBlLnNldFB1YmxpYyA9IGZ1bmN0aW9uIChOLCBFKSB7XG4gICAgICAgIGlmIChOICE9IG51bGwgJiYgRSAhPSBudWxsICYmIE4ubGVuZ3RoID4gMCAmJiBFLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubiA9IHBhcnNlQmlnSW50KE4sIDE2KTtcbiAgICAgICAgICAgIHRoaXMuZSA9IHBhcnNlSW50KEUsIDE2KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIFJTQSBwdWJsaWMga2V5XCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBSU0FLZXkucHJvdG90eXBlLmVuY3J5cHQgPSBSU0FFbmNyeXB0O1xuICAgIC8vIFJldHVybiB0aGUgUEtDUyMxIFJTQSBlbmNyeXB0aW9uIG9mIFwidGV4dFwiIGFzIGFuIGV2ZW4tbGVuZ3RoIGhleCBzdHJpbmdcbiAgICBSU0FLZXkucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgbSA9IHBrY3MxcGFkMih0ZXh0LCAodGhpcy5uLmJpdExlbmd0aCgpICsgNykgPj4gMyk7XG4gICAgICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjID0gdGhpcy5kb1B1YmxpYyhtKTtcbiAgICAgICAgaWYgKGMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKChoLmxlbmd0aCAmIDEpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgaDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gUlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlID0gUlNBU2V0UHJpdmF0ZTtcbiAgICAvLyBTZXQgdGhlIHByaXZhdGUga2V5IGZpZWxkcyBOLCBlLCBhbmQgZCBmcm9tIGhleCBzdHJpbmdzXG4gICAgUlNBS2V5LnByb3RvdHlwZS5zZXRQcml2YXRlID0gZnVuY3Rpb24gKE4sIEUsIEQpIHtcbiAgICAgICAgaWYgKE4gIT0gbnVsbCAmJiBFICE9IG51bGwgJiYgTi5sZW5ndGggPiAwICYmIEUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uID0gcGFyc2VCaWdJbnQoTiwgMTYpO1xuICAgICAgICAgICAgdGhpcy5lID0gcGFyc2VJbnQoRSwgMTYpO1xuICAgICAgICAgICAgdGhpcy5kID0gcGFyc2VCaWdJbnQoRCwgMTYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgUlNBIHByaXZhdGUga2V5XCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGVFeCA9IFJTQVNldFByaXZhdGVFeDtcbiAgICAvLyBTZXQgdGhlIHByaXZhdGUga2V5IGZpZWxkcyBOLCBlLCBkIGFuZCBDUlQgcGFyYW1zIGZyb20gaGV4IHN0cmluZ3NcbiAgICBSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGVFeCA9IGZ1bmN0aW9uIChOLCBFLCBELCBQLCBRLCBEUCwgRFEsIEMpIHtcbiAgICAgICAgaWYgKE4gIT0gbnVsbCAmJiBFICE9IG51bGwgJiYgTi5sZW5ndGggPiAwICYmIEUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uID0gcGFyc2VCaWdJbnQoTiwgMTYpO1xuICAgICAgICAgICAgdGhpcy5lID0gcGFyc2VJbnQoRSwgMTYpO1xuICAgICAgICAgICAgdGhpcy5kID0gcGFyc2VCaWdJbnQoRCwgMTYpO1xuICAgICAgICAgICAgdGhpcy5wID0gcGFyc2VCaWdJbnQoUCwgMTYpO1xuICAgICAgICAgICAgdGhpcy5xID0gcGFyc2VCaWdJbnQoUSwgMTYpO1xuICAgICAgICAgICAgdGhpcy5kbXAxID0gcGFyc2VCaWdJbnQoRFAsIDE2KTtcbiAgICAgICAgICAgIHRoaXMuZG1xMSA9IHBhcnNlQmlnSW50KERRLCAxNik7XG4gICAgICAgICAgICB0aGlzLmNvZWZmID0gcGFyc2VCaWdJbnQoQywgMTYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgUlNBIHByaXZhdGUga2V5XCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBSU0FLZXkucHJvdG90eXBlLmdlbmVyYXRlID0gUlNBR2VuZXJhdGU7XG4gICAgLy8gR2VuZXJhdGUgYSBuZXcgcmFuZG9tIHByaXZhdGUga2V5IEIgYml0cyBsb25nLCB1c2luZyBwdWJsaWMgZXhwdCBFXG4gICAgUlNBS2V5LnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIChCLCBFKSB7XG4gICAgICAgIHZhciBybmcgPSBuZXcgU2VjdXJlUmFuZG9tKCk7XG4gICAgICAgIHZhciBxcyA9IEIgPj4gMTtcbiAgICAgICAgdGhpcy5lID0gcGFyc2VJbnQoRSwgMTYpO1xuICAgICAgICB2YXIgZWUgPSBuZXcgQmlnSW50ZWdlcihFLCAxNik7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnAgPSBuZXcgQmlnSW50ZWdlcihCIC0gcXMsIDEsIHJuZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGVlKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDAgJiYgdGhpcy5wLmlzUHJvYmFibGVQcmltZSgxMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIHRoaXMucSA9IG5ldyBCaWdJbnRlZ2VyKHFzLCAxLCBybmcpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChlZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwICYmIHRoaXMucS5pc1Byb2JhYmxlUHJpbWUoMTApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnAuY29tcGFyZVRvKHRoaXMucSkgPD0gMCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5wO1xuICAgICAgICAgICAgICAgIHRoaXMucCA9IHRoaXMucTtcbiAgICAgICAgICAgICAgICB0aGlzLnEgPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHAxID0gdGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgICAgICAgIHZhciBxMSA9IHRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgICAgICAgICB2YXIgcGhpID0gcDEubXVsdGlwbHkocTEpO1xuICAgICAgICAgICAgaWYgKHBoaS5nY2QoZWUpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubiA9IHRoaXMucC5tdWx0aXBseSh0aGlzLnEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZCA9IGVlLm1vZEludmVyc2UocGhpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRtcDEgPSB0aGlzLmQubW9kKHAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRtcTEgPSB0aGlzLmQubW9kKHExKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvZWZmID0gdGhpcy5xLm1vZEludmVyc2UodGhpcy5wKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gUlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0ID0gUlNBRGVjcnlwdDtcbiAgICAvLyBSZXR1cm4gdGhlIFBLQ1MjMSBSU0EgZGVjcnlwdGlvbiBvZiBcImN0ZXh0XCIuXG4gICAgLy8gXCJjdGV4dFwiIGlzIGFuIGV2ZW4tbGVuZ3RoIGhleCBzdHJpbmcgYW5kIHRoZSBvdXRwdXQgaXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgUlNBS2V5LnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKGN0ZXh0KSB7XG4gICAgICAgIHZhciBjID0gcGFyc2VCaWdJbnQoY3RleHQsIDE2KTtcbiAgICAgICAgdmFyIG0gPSB0aGlzLmRvUHJpdmF0ZShjKTtcbiAgICAgICAgaWYgKG0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBrY3MxdW5wYWQyKG0sICh0aGlzLm4uYml0TGVuZ3RoKCkgKyA3KSA+PiAzKTtcbiAgICB9O1xuICAgIC8vIEdlbmVyYXRlIGEgbmV3IHJhbmRvbSBwcml2YXRlIGtleSBCIGJpdHMgbG9uZywgdXNpbmcgcHVibGljIGV4cHQgRVxuICAgIFJTQUtleS5wcm90b3R5cGUuZ2VuZXJhdGVBc3luYyA9IGZ1bmN0aW9uIChCLCBFLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpO1xuICAgICAgICB2YXIgcXMgPSBCID4+IDE7XG4gICAgICAgIHRoaXMuZSA9IHBhcnNlSW50KEUsIDE2KTtcbiAgICAgICAgdmFyIGVlID0gbmV3IEJpZ0ludGVnZXIoRSwgMTYpO1xuICAgICAgICB2YXIgcnNhID0gdGhpcztcbiAgICAgICAgLy8gVGhlc2UgZnVuY3Rpb25zIGhhdmUgbm9uLWRlc2NyaXB0IG5hbWVzIGJlY2F1c2UgdGhleSB3ZXJlIG9yaWdpbmFsbHkgZm9yKDs7KSBsb29wcy5cbiAgICAgICAgLy8gSSBkb24ndCBrbm93IGFib3V0IGNyeXB0b2dyYXBoeSB0byBnaXZlIHRoZW0gYmV0dGVyIG5hbWVzIHRoYW4gbG9vcDEtNC5cbiAgICAgICAgdmFyIGxvb3AxID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxvb3A0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChyc2EucC5jb21wYXJlVG8ocnNhLnEpIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByc2EucDtcbiAgICAgICAgICAgICAgICAgICAgcnNhLnAgPSByc2EucTtcbiAgICAgICAgICAgICAgICAgICAgcnNhLnEgPSB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcDEgPSByc2EucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgICAgICAgICAgICAgdmFyIHExID0gcnNhLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICAgICAgICAgICAgICAgIHZhciBwaGkgPSBwMS5tdWx0aXBseShxMSk7XG4gICAgICAgICAgICAgICAgaWYgKHBoaS5nY2QoZWUpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByc2EubiA9IHJzYS5wLm11bHRpcGx5KHJzYS5xKTtcbiAgICAgICAgICAgICAgICAgICAgcnNhLmQgPSBlZS5tb2RJbnZlcnNlKHBoaSk7XG4gICAgICAgICAgICAgICAgICAgIHJzYS5kbXAxID0gcnNhLmQubW9kKHAxKTtcbiAgICAgICAgICAgICAgICAgICAgcnNhLmRtcTEgPSByc2EuZC5tb2QocTEpO1xuICAgICAgICAgICAgICAgICAgICByc2EuY29lZmYgPSByc2EucS5tb2RJbnZlcnNlKHJzYS5wKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKCk7IH0sIDApOyAvLyBlc2NhcGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQobG9vcDEsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbG9vcDMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnNhLnEgPSBuYmkoKTtcbiAgICAgICAgICAgICAgICByc2EucS5mcm9tTnVtYmVyQXN5bmMocXMsIDEsIHJuZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByc2EucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkYShlZSwgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCAmJiByc2EucS5pc1Byb2JhYmxlUHJpbWUoMTApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChsb29wNCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3AzLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGxvb3AyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJzYS5wID0gbmJpKCk7XG4gICAgICAgICAgICAgICAgcnNhLnAuZnJvbU51bWJlckFzeW5jKEIgLSBxcywgMSwgcm5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJzYS5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2RhKGVlLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwICYmIHJzYS5wLmlzUHJvYmFibGVQcmltZSgxMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3AzLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQobG9vcDIsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3AyLCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dChsb29wMSwgMCk7XG4gICAgfTtcbiAgICBSU0FLZXkucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiAodGV4dCwgZGlnZXN0TWV0aG9kLCBkaWdlc3ROYW1lKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBnZXREaWdlc3RIZWFkZXIoZGlnZXN0TmFtZSk7XG4gICAgICAgIHZhciBkaWdlc3QgPSBoZWFkZXIgKyBkaWdlc3RNZXRob2QodGV4dCkudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIG0gPSBwa2NzMXBhZDEoZGlnZXN0LCB0aGlzLm4uYml0TGVuZ3RoKCkgLyA0KTtcbiAgICAgICAgaWYgKG0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGMgPSB0aGlzLmRvUHJpdmF0ZShtKTtcbiAgICAgICAgaWYgKGMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKChoLmxlbmd0aCAmIDEpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgaDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUlNBS2V5LnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiAodGV4dCwgc2lnbmF0dXJlLCBkaWdlc3RNZXRob2QpIHtcbiAgICAgICAgdmFyIGMgPSBwYXJzZUJpZ0ludChzaWduYXR1cmUsIDE2KTtcbiAgICAgICAgdmFyIG0gPSB0aGlzLmRvUHVibGljKGMpO1xuICAgICAgICBpZiAobSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdW5wYWRkZWQgPSBtLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLCBcIlwiKTtcbiAgICAgICAgdmFyIGRpZ2VzdCA9IHJlbW92ZURpZ2VzdEhlYWRlcih1bnBhZGRlZCk7XG4gICAgICAgIHJldHVybiBkaWdlc3QgPT0gZGlnZXN0TWV0aG9kKHRleHQpLnRvU3RyaW5nKCk7XG4gICAgfTtcbiAgICByZXR1cm4gUlNBS2V5O1xufSgpKTtcbi8vIFVuZG8gUEtDUyMxICh0eXBlIDIsIHJhbmRvbSkgcGFkZGluZyBhbmQsIGlmIHZhbGlkLCByZXR1cm4gdGhlIHBsYWludGV4dFxuZnVuY3Rpb24gcGtjczF1bnBhZDIoZCwgbikge1xuICAgIHZhciBiID0gZC50b0J5dGVBcnJheSgpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGIubGVuZ3RoICYmIGJbaV0gPT0gMCkge1xuICAgICAgICArK2k7XG4gICAgfVxuICAgIGlmIChiLmxlbmd0aCAtIGkgIT0gbiAtIDEgfHwgYltpXSAhPSAyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICArK2k7XG4gICAgd2hpbGUgKGJbaV0gIT0gMCkge1xuICAgICAgICBpZiAoKytpID49IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmV0ID0gXCJcIjtcbiAgICB3aGlsZSAoKytpIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGMgPSBiW2ldICYgMjU1O1xuICAgICAgICBpZiAoYyA8IDEyOCkgeyAvLyB1dGYtOCBkZWNvZGVcbiAgICAgICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHtcbiAgICAgICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChiW2kgKyAxXSAmIDYzKSk7XG4gICAgICAgICAgICArK2k7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAxNSkgPDwgMTIpIHwgKChiW2kgKyAxXSAmIDYzKSA8PCA2KSB8IChiW2kgKyAyXSAmIDYzKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDQ3I3BhZ2UtNDNcbnZhciBESUdFU1RfSEVBREVSUyA9IHtcbiAgICBtZDI6IFwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwMjA1MDAwNDEwXCIsXG4gICAgbWQ1OiBcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLFxuICAgIHNoYTE6IFwiMzAyMTMwMDkwNjA1MmIwZTAzMDIxYTA1MDAwNDE0XCIsXG4gICAgc2hhMjI0OiBcIjMwMmQzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwNDA1MDAwNDFjXCIsXG4gICAgc2hhMjU2OiBcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsXG4gICAgc2hhMzg0OiBcIjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwXCIsXG4gICAgc2hhNTEyOiBcIjMwNTEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMzA1MDAwNDQwXCIsXG4gICAgcmlwZW1kMTYwOiBcIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNFwiLFxufTtcbmZ1bmN0aW9uIGdldERpZ2VzdEhlYWRlcihuYW1lKSB7XG4gICAgcmV0dXJuIERJR0VTVF9IRUFERVJTW25hbWVdIHx8IFwiXCI7XG59XG5mdW5jdGlvbiByZW1vdmVEaWdlc3RIZWFkZXIoc3RyKSB7XG4gICAgZm9yICh2YXIgbmFtZV8xIGluIERJR0VTVF9IRUFERVJTKSB7XG4gICAgICAgIGlmIChESUdFU1RfSEVBREVSUy5oYXNPd25Qcm9wZXJ0eShuYW1lXzEpKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gRElHRVNUX0hFQURFUlNbbmFtZV8xXTtcbiAgICAgICAgICAgIHZhciBsZW4gPSBoZWFkZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHN0ci5zdWJzdHIoMCwgbGVuKSA9PSBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG4vLyBSZXR1cm4gdGhlIFBLQ1MjMSBSU0EgZW5jcnlwdGlvbiBvZiBcInRleHRcIiBhcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuLy8gZnVuY3Rpb24gUlNBRW5jcnlwdEI2NCh0ZXh0KSB7XG4vLyAgdmFyIGggPSB0aGlzLmVuY3J5cHQodGV4dCk7XG4vLyAgaWYoaCkgcmV0dXJuIGhleDJiNjQoaCk7IGVsc2UgcmV0dXJuIG51bGw7XG4vLyB9XG4vLyBwdWJsaWNcbi8vIFJTQUtleS5wcm90b3R5cGUuZW5jcnlwdF9iNjQgPSBSU0FFbmNyeXB0QjY0O1xuXG4vKiFcbkNvcHlyaWdodCAoYykgMjAxMSwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvZGUgbGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlOlxuaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpL2xpY2Vuc2UuaHRtbFxudmVyc2lvbjogMi45LjBcbiovXG52YXIgWUFIT08gPSB7fTtcbllBSE9PLmxhbmcgPSB7XG4gICAgLyoqXG4gICAgICogVXRpbGl0eSB0byBzZXQgdXAgdGhlIHByb3RvdHlwZSwgY29uc3RydWN0b3IgYW5kIHN1cGVyY2xhc3MgcHJvcGVydGllcyB0b1xuICAgICAqIHN1cHBvcnQgYW4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgdGhhdCBjYW4gY2hhaW4gY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLlxuICAgICAqIFN0YXRpYyBtZW1iZXJzIHdpbGwgbm90IGJlIGluaGVyaXRlZC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgZXh0ZW5kXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YmMgICB0aGUgb2JqZWN0IHRvIG1vZGlmeVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyYyB0aGUgb2JqZWN0IHRvIGluaGVyaXRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzICBhZGRpdGlvbmFsIHByb3BlcnRpZXMvbWV0aG9kcyB0byBhZGQgdG8gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcyBwcm90b3R5cGUuICBUaGVzZSB3aWxsIG92ZXJyaWRlIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcgaXRlbXMgb2J0YWluZWQgZnJvbSB0aGUgc3VwZXJjbGFzc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlc2VudC5cbiAgICAgKi9cbiAgICBleHRlbmQ6IGZ1bmN0aW9uKHN1YmMsIHN1cGVyYywgb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmICghIHN1cGVyYyB8fCAhIHN1YmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIllBSE9PLmxhbmcuZXh0ZW5kIGZhaWxlZCwgcGxlYXNlIGNoZWNrIHRoYXQgXCIgK1xuICAgICAgICAgICAgICAgIFwiYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyYy5wcm90b3R5cGU7XG4gICAgICAgIHN1YmMucHJvdG90eXBlID0gbmV3IEYoKTtcbiAgICAgICAgc3ViYy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJjO1xuICAgICAgICBzdWJjLnN1cGVyY2xhc3MgPSBzdXBlcmMucHJvdG90eXBlO1xuXG4gICAgICAgIGlmIChzdXBlcmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHN1cGVyYy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdXBlcmM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICBzdWJjLnByb3RvdHlwZVtpXSA9IG92ZXJyaWRlc1tpXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIElFIHdpbGwgbm90IGVudW1lcmF0ZSBuYXRpdmUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBvYmplY3QgZXZlbiBpZiB0aGVcbiAgICAgICAgICAgICAqIGZ1bmN0aW9uIHdhcyBvdmVycmlkZGVuLiAgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHNwZWNpZmljIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICogd2UgY2FyZSBhYm91dCBvbiB0aGUgT2JqZWN0IHByb3RvdHlwZS5cbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSBfSUVFbnVtRml4XG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByICB0aGUgb2JqZWN0IHRvIHJlY2VpdmUgdGhlIGF1Z21lbnRhdGlvblxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcyAgdGhlIG9iamVjdCB0aGF0IHN1cHBsaWVzIHRoZSBwcm9wZXJ0aWVzIHRvIGF1Z21lbnRcbiAgICAgICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBfSUVFbnVtRml4ID0gZnVuY3Rpb24oKSB7fSxcbiAgICAgICAgICAgICAgICBBREQgPSBbXCJ0b1N0cmluZ1wiLCBcInZhbHVlT2ZcIl07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBfSUVFbnVtRml4ID0gZnVuY3Rpb24ociwgcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFERC5sZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbmFtZSA9IEFERFtpXSwgZiA9IHNbZm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmICE9IE9iamVjdC5wcm90b3R5cGVbZm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbZm5hbWVdID0gZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHt9ICAgICAgICAgICAgX0lFRW51bUZpeChzdWJjLnByb3RvdHlwZSwgb3ZlcnJpZGVzKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qIGFzbjEtMS4wLjEzLmpzIChjKSAyMDEzLTIwMTcgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIEBuYW1lIGFzbjEtMS4wLmpzXG4gKiBAYXV0aG9yIEtlbmppIFVydXNoaW1hIGtlbmppLnVydXNoaW1hQGdtYWlsLmNvbVxuICogQHZlcnNpb24gYXNuMSAxLjAuMTMgKDIwMTctSnVuLTAyKVxuICogQHNpbmNlIGpzcnNhc2lnbiAyLjFcbiAqIEBsaWNlbnNlIDxhIGhyZWY9XCJodHRwczovL2tqdXIuZ2l0aHViLmlvL2pzcnNhc2lnbi9saWNlbnNlL1wiPk1JVCBMaWNlbnNlPC9hPlxuICovXG5cbi8qKlxuICoga2p1cidzIGNsYXNzIGxpYnJhcnkgbmFtZSBzcGFjZVxuICogPHA+XG4gKiBUaGlzIG5hbWUgc3BhY2UgcHJvdmlkZXMgZm9sbG93aW5nIG5hbWUgc3BhY2VzOlxuICogPHVsPlxuICogPGxpPntAbGluayBLSlVSLmFzbjF9IC0gQVNOLjEgcHJpbWl0aXZlIGhleGFkZWNpbWFsIGVuY29kZXI8L2xpPlxuICogPGxpPntAbGluayBLSlVSLmFzbjEueDUwOX0gLSBBU04uMSBzdHJ1Y3R1cmUgZm9yIFguNTA5IGNlcnRpZmljYXRlIGFuZCBDUkw8L2xpPlxuICogPGxpPntAbGluayBLSlVSLmNyeXB0b30gLSBKYXZhIENyeXB0b2dyYXBoaWMgRXh0ZW5zaW9uKEpDRSkgc3R5bGUgTWVzc2FnZURpZ2VzdC9TaWduYXR1cmVcbiAqIGNsYXNzIGFuZCB1dGlsaXRpZXM8L2xpPlxuICogPC91bD5cbiAqIDwvcD5cbiAqIE5PVEU6IFBsZWFzZSBpZ25vcmUgbWV0aG9kIHN1bW1hcnkgYW5kIGRvY3VtZW50IG9mIHRoaXMgbmFtZXNwYWNlLiBUaGlzIGNhdXNlZCBieSBhIGJ1ZyBvZiBqc2RvYzIuXG4gKiBAbmFtZSBLSlVSXG4gKiBAbmFtZXNwYWNlIGtqdXIncyBjbGFzcyBsaWJyYXJ5IG5hbWUgc3BhY2VcbiAqL1xudmFyIEtKVVIgPSB7fTtcblxuLyoqXG4gKiBranVyJ3MgQVNOLjEgY2xhc3MgbGlicmFyeSBuYW1lIHNwYWNlXG4gKiA8cD5cbiAqIFRoaXMgaXMgSVRVLVQgWC42OTAgQVNOLjEgREVSIGVuY29kZXIgY2xhc3MgbGlicmFyeSBhbmRcbiAqIGNsYXNzIHN0cnVjdHVyZSBhbmQgbWV0aG9kcyBpcyB2ZXJ5IHNpbWlsYXIgdG9cbiAqIG9yZy5ib3VuY3ljYXN0bGUuYXNuMSBwYWNrYWdlIG9mXG4gKiB3ZWxsIGtub3duIEJvdW5jeUNhc2x0ZSBDcnlwdG9ncmFwaHkgTGlicmFyeS5cbiAqIDxoND5QUk9WSURJTkcgQVNOLjEgUFJJTUlUSVZFUzwvaDQ+XG4gKiBIZXJlIGFyZSBBU04uMSBERVIgcHJpbWl0aXZlIGNsYXNzZXMuXG4gKiA8dWw+XG4gKiA8bGk+MHgwMSB7QGxpbmsgS0pVUi5hc24xLkRFUkJvb2xlYW59PC9saT5cbiAqIDxsaT4weDAyIHtAbGluayBLSlVSLmFzbjEuREVSSW50ZWdlcn08L2xpPlxuICogPGxpPjB4MDMge0BsaW5rIEtKVVIuYXNuMS5ERVJCaXRTdHJpbmd9PC9saT5cbiAqIDxsaT4weDA0IHtAbGluayBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmd9PC9saT5cbiAqIDxsaT4weDA1IHtAbGluayBLSlVSLmFzbjEuREVSTnVsbH08L2xpPlxuICogPGxpPjB4MDYge0BsaW5rIEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyfTwvbGk+XG4gKiA8bGk+MHgwYSB7QGxpbmsgS0pVUi5hc24xLkRFUkVudW1lcmF0ZWR9PC9saT5cbiAqIDxsaT4weDBjIHtAbGluayBLSlVSLmFzbjEuREVSVVRGOFN0cmluZ308L2xpPlxuICogPGxpPjB4MTIge0BsaW5rIEtKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nfTwvbGk+XG4gKiA8bGk+MHgxMyB7QGxpbmsgS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZ308L2xpPlxuICogPGxpPjB4MTQge0BsaW5rIEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nfTwvbGk+XG4gKiA8bGk+MHgxNiB7QGxpbmsgS0pVUi5hc24xLkRFUklBNVN0cmluZ308L2xpPlxuICogPGxpPjB4MTcge0BsaW5rIEtKVVIuYXNuMS5ERVJVVENUaW1lfTwvbGk+XG4gKiA8bGk+MHgxOCB7QGxpbmsgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZX08L2xpPlxuICogPGxpPjB4MzAge0BsaW5rIEtKVVIuYXNuMS5ERVJTZXF1ZW5jZX08L2xpPlxuICogPGxpPjB4MzEge0BsaW5rIEtKVVIuYXNuMS5ERVJTZXR9PC9saT5cbiAqIDwvdWw+XG4gKiA8aDQ+T1RIRVIgQVNOLjEgQ0xBU1NFUzwvaDQ+XG4gKiA8dWw+XG4gKiA8bGk+e0BsaW5rIEtKVVIuYXNuMS5BU04xT2JqZWN0fTwvbGk+XG4gKiA8bGk+e0BsaW5rIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZ308L2xpPlxuICogPGxpPntAbGluayBLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lfTwvbGk+XG4gKiA8bGk+e0BsaW5rIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWR9PC9saT5cbiAqIDxsaT57QGxpbmsgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdH08L2xpPlxuICogPC91bD5cbiAqIDxoND5TVUIgTkFNRSBTUEFDRVM8L2g0PlxuICogPHVsPlxuICogPGxpPntAbGluayBLSlVSLmFzbjEuY2FkZXN9IC0gQ0FkRVMgbG9uZyB0ZXJtIHNpZ25hdHVyZSBmb3JtYXQ8L2xpPlxuICogPGxpPntAbGluayBLSlVSLmFzbjEuY21zfSAtIENyeXB0b2dyYXBoaWMgTWVzc2FnZSBTeW50YXg8L2xpPlxuICogPGxpPntAbGluayBLSlVSLmFzbjEuY3NyfSAtIENlcnRpZmljYXRlIFNpZ25pbmcgUmVxdWVzdCAoQ1NSL1BLQ1MjMTApPC9saT5cbiAqIDxsaT57QGxpbmsgS0pVUi5hc24xLnRzcH0gLSBSRkMgMzE2MSBUaW1lc3RhbXBpbmcgUHJvdG9jb2wgRm9ybWF0PC9saT5cbiAqIDxsaT57QGxpbmsgS0pVUi5hc24xLng1MDl9IC0gUkZDIDUyODAgWC41MDkgY2VydGlmaWNhdGUgYW5kIENSTDwvbGk+XG4gKiA8L3VsPlxuICogPC9wPlxuICogTk9URTogUGxlYXNlIGlnbm9yZSBtZXRob2Qgc3VtbWFyeSBhbmQgZG9jdW1lbnQgb2YgdGhpcyBuYW1lc3BhY2UuXG4gKiBUaGlzIGNhdXNlZCBieSBhIGJ1ZyBvZiBqc2RvYzIuXG4gKiBAbmFtZSBLSlVSLmFzbjFcbiAqIEBuYW1lc3BhY2VcbiAqL1xuaWYgKHR5cGVvZiBLSlVSLmFzbjEgPT0gXCJ1bmRlZmluZWRcIiB8fCAhS0pVUi5hc24xKSBLSlVSLmFzbjEgPSB7fTtcblxuLyoqXG4gKiBBU04xIHV0aWxpdGllcyBjbGFzc1xuICogQG5hbWUgS0pVUi5hc24xLkFTTjFVdGlsXG4gKiBAY2xhc3MgQVNOMSB1dGlsaXRpZXMgY2xhc3NcbiAqIEBzaW5jZSBhc24xIDEuMC4yXG4gKi9cbktKVVIuYXNuMS5BU04xVXRpbCA9IG5ldyBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmludGVnZXJUb0J5dGVIZXggPSBmdW5jdGlvbihpKSB7XG4gICAgICAgIHZhciBoID0gaS50b1N0cmluZygxNik7XG4gICAgICAgIGlmICgoaC5sZW5ndGggJSAyKSA9PSAxKSBoID0gJzAnICsgaDtcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgfTtcbiAgICB0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4ID0gZnVuY3Rpb24oYmlnSW50ZWdlclZhbHVlKSB7XG4gICAgICAgIHZhciBoID0gYmlnSW50ZWdlclZhbHVlLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKGguc3Vic3RyKDAsIDEpICE9ICctJykge1xuICAgICAgICAgICAgaWYgKGgubGVuZ3RoICUgMiA9PSAxKSB7XG4gICAgICAgICAgICAgICAgaCA9ICcwJyArIGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghIGgubWF0Y2goL15bMC03XS8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGggPSAnMDAnICsgaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaFBvcyA9IGguc3Vic3RyKDEpO1xuICAgICAgICAgICAgdmFyIHhvckxlbiA9IGhQb3MubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHhvckxlbiAlIDIgPT0gMSkge1xuICAgICAgICAgICAgICAgIHhvckxlbiArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoISBoLm1hdGNoKC9eWzAtN10vKSkge1xuICAgICAgICAgICAgICAgICAgICB4b3JMZW4gKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaE1hc2sgPSAnJztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeG9yTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBoTWFzayArPSAnZic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmlNYXNrID0gbmV3IEJpZ0ludGVnZXIoaE1hc2ssIDE2KTtcbiAgICAgICAgICAgIHZhciBiaU5lZyA9IGJpTWFzay54b3IoYmlnSW50ZWdlclZhbHVlKS5hZGQoQmlnSW50ZWdlci5PTkUpO1xuICAgICAgICAgICAgaCA9IGJpTmVnLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eLS8sICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGdldCBQRU0gc3RyaW5nIGZyb20gaGV4YWRlY2ltYWwgZGF0YSBhbmQgaGVhZGVyIHN0cmluZ1xuICAgICAqIEBuYW1lIGdldFBFTVN0cmluZ0Zyb21IZXhcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkFTTjFVdGlsXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGFIZXggaGV4YWRlY2ltYWwgc3RyaW5nIG9mIFBFTSBib2R5XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBlbUhlYWRlciBQRU0gaGVhZGVyIHN0cmluZyAoZXguICdSU0EgUFJJVkFURSBLRVknKVxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUEVNIGZvcm1hdHRlZCBzdHJpbmcgb2YgaW5wdXQgZGF0YVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIGEgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGEgUEVNIHN0cmluZyB3aXRoXG4gICAgICogYSBzcGVjaWZpZWQgaGVhZGVyLiBJdHMgbGluZSBicmVhayB3aWxsIGJlIENSTEYoXCJcXHJcXG5cIikuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcGVtICA9IEtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KCc2MTYxNjEnLCAnUlNBIFBSSVZBVEUgS0VZJyk7XG4gICAgICogLy8gdmFsdWUgb2YgcGVtIHdpbGwgYmU6XG4gICAgICogLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXG4gICAgICogWVdGaFxuICAgICAqIC0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cbiAgICAgKi9cbiAgICB0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXggPSBmdW5jdGlvbihkYXRhSGV4LCBwZW1IZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIGhleHRvcGVtKGRhdGFIZXgsIHBlbUhlYWRlcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlIEFTTjFPYmplY3Qgc3BlY2lmZWQgYnkgSlNPTiBwYXJhbWV0ZXJzXG4gICAgICogQG5hbWUgbmV3T2JqZWN0XG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5BU04xVXRpbFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtIEpTT04gcGFyYW1ldGVyIHRvIGdlbmVyYXRlIEFTTjFPYmplY3RcbiAgICAgKiBAcmV0dXJuIHtLSlVSLmFzbjEuQVNOMU9iamVjdH0gZ2VuZXJhdGVkIG9iamVjdFxuICAgICAqIEBzaW5jZSBhc24xIDEuMC4zXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogZ2VuZXJhdGUgYW55IEFTTjFPYmplY3Qgc3BlY2lmaWVkIGJ5IEpTT04gcGFyYW1cbiAgICAgKiBpbmNsdWRpbmcgQVNOLjEgcHJpbWl0aXZlIG9yIHN0cnVjdHVyZWQuXG4gICAgICogR2VuZXJhbGx5ICdwYXJhbScgY2FuIGJlIGRlc2NyaWJlZCBhcyBmb2xsb3dzOlxuICAgICAqIDxibG9ja3F1b3RlPlxuICAgICAqIHtUWVBFLU9GLUFTTk9CSjogQVNOMU9CSi1QQVJBTUVURVJ9XG4gICAgICogPC9ibG9ja3F1b3RlPlxuICAgICAqICdUWVBFLU9GLUFTTjFPQkonIGNhbiBiZSBvbmUgb2YgZm9sbG93aW5nIHN5bWJvbHM6XG4gICAgICogPHVsPlxuICAgICAqIDxsaT4nYm9vbCcgLSBERVJCb29sZWFuPC9saT5cbiAgICAgKiA8bGk+J2ludCcgLSBERVJJbnRlZ2VyPC9saT5cbiAgICAgKiA8bGk+J2JpdHN0cicgLSBERVJCaXRTdHJpbmc8L2xpPlxuICAgICAqIDxsaT4nb2N0c3RyJyAtIERFUk9jdGV0U3RyaW5nPC9saT5cbiAgICAgKiA8bGk+J251bGwnIC0gREVSTnVsbDwvbGk+XG4gICAgICogPGxpPidvaWQnIC0gREVST2JqZWN0SWRlbnRpZmllcjwvbGk+XG4gICAgICogPGxpPidlbnVtJyAtIERFUkVudW1lcmF0ZWQ8L2xpPlxuICAgICAqIDxsaT4ndXRmOHN0cicgLSBERVJVVEY4U3RyaW5nPC9saT5cbiAgICAgKiA8bGk+J251bXN0cicgLSBERVJOdW1lcmljU3RyaW5nPC9saT5cbiAgICAgKiA8bGk+J3BybnN0cicgLSBERVJQcmludGFibGVTdHJpbmc8L2xpPlxuICAgICAqIDxsaT4ndGVsc3RyJyAtIERFUlRlbGV0ZXhTdHJpbmc8L2xpPlxuICAgICAqIDxsaT4naWE1c3RyJyAtIERFUklBNVN0cmluZzwvbGk+XG4gICAgICogPGxpPid1dGN0aW1lJyAtIERFUlVUQ1RpbWU8L2xpPlxuICAgICAqIDxsaT4nZ2VudGltZScgLSBERVJHZW5lcmFsaXplZFRpbWU8L2xpPlxuICAgICAqIDxsaT4nc2VxJyAtIERFUlNlcXVlbmNlPC9saT5cbiAgICAgKiA8bGk+J3NldCcgLSBERVJTZXQ8L2xpPlxuICAgICAqIDxsaT4ndGFnJyAtIERFUlRhZ2dlZE9iamVjdDwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG5ld09iamVjdCh7J3BybnN0cic6ICdhYWEnfSk7XG4gICAgICogbmV3T2JqZWN0KHsnc2VxJzogW3snaW50JzogM30sIHsncHJuc3RyJzogJ2FhYSd9XX0pXG4gICAgICogLy8gQVNOLjEgVGFnZ2VkIE9iamVjdFxuICAgICAqIG5ld09iamVjdCh7J3RhZyc6IHsndGFnJzogJ2ExJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0JzogdHJ1ZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgJ29iaic6IHsnc2VxJzogW3snaW50JzogM30sIHsncHJuc3RyJzogJ2FhYSd9XX19fSk7XG4gICAgICogLy8gbW9yZSBzaW1wbGUgcmVwcmVzZW50YXRpb24gb2YgQVNOLjEgVGFnZ2VkIE9iamVjdFxuICAgICAqIG5ld09iamVjdCh7J3RhZyc6IFsnYTEnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICB7J3NlcSc6IFtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7J2ludCc6IDN9LFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHsncHJuc3RyJzogJ2FhYSd9XX1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBdfSk7XG4gICAgICovXG4gICAgdGhpcy5uZXdPYmplY3QgPSBmdW5jdGlvbihwYXJhbSkge1xuICAgICAgICB2YXIgX0tKVVIgPSBLSlVSLFxuICAgICAgICAgICAgX0tKVVJfYXNuMSA9IF9LSlVSLmFzbjEsXG4gICAgICAgICAgICBfREVSQm9vbGVhbiA9IF9LSlVSX2FzbjEuREVSQm9vbGVhbixcbiAgICAgICAgICAgIF9ERVJJbnRlZ2VyID0gX0tKVVJfYXNuMS5ERVJJbnRlZ2VyLFxuICAgICAgICAgICAgX0RFUkJpdFN0cmluZyA9IF9LSlVSX2FzbjEuREVSQml0U3RyaW5nLFxuICAgICAgICAgICAgX0RFUk9jdGV0U3RyaW5nID0gX0tKVVJfYXNuMS5ERVJPY3RldFN0cmluZyxcbiAgICAgICAgICAgIF9ERVJOdWxsID0gX0tKVVJfYXNuMS5ERVJOdWxsLFxuICAgICAgICAgICAgX0RFUk9iamVjdElkZW50aWZpZXIgPSBfS0pVUl9hc24xLkRFUk9iamVjdElkZW50aWZpZXIsXG4gICAgICAgICAgICBfREVSRW51bWVyYXRlZCA9IF9LSlVSX2FzbjEuREVSRW51bWVyYXRlZCxcbiAgICAgICAgICAgIF9ERVJVVEY4U3RyaW5nID0gX0tKVVJfYXNuMS5ERVJVVEY4U3RyaW5nLFxuICAgICAgICAgICAgX0RFUk51bWVyaWNTdHJpbmcgPSBfS0pVUl9hc24xLkRFUk51bWVyaWNTdHJpbmcsXG4gICAgICAgICAgICBfREVSUHJpbnRhYmxlU3RyaW5nID0gX0tKVVJfYXNuMS5ERVJQcmludGFibGVTdHJpbmcsXG4gICAgICAgICAgICBfREVSVGVsZXRleFN0cmluZyA9IF9LSlVSX2FzbjEuREVSVGVsZXRleFN0cmluZyxcbiAgICAgICAgICAgIF9ERVJJQTVTdHJpbmcgPSBfS0pVUl9hc24xLkRFUklBNVN0cmluZyxcbiAgICAgICAgICAgIF9ERVJVVENUaW1lID0gX0tKVVJfYXNuMS5ERVJVVENUaW1lLFxuICAgICAgICAgICAgX0RFUkdlbmVyYWxpemVkVGltZSA9IF9LSlVSX2FzbjEuREVSR2VuZXJhbGl6ZWRUaW1lLFxuICAgICAgICAgICAgX0RFUlNlcXVlbmNlID0gX0tKVVJfYXNuMS5ERVJTZXF1ZW5jZSxcbiAgICAgICAgICAgIF9ERVJTZXQgPSBfS0pVUl9hc24xLkRFUlNldCxcbiAgICAgICAgICAgIF9ERVJUYWdnZWRPYmplY3QgPSBfS0pVUl9hc24xLkRFUlRhZ2dlZE9iamVjdCxcbiAgICAgICAgICAgIF9uZXdPYmplY3QgPSBfS0pVUl9hc24xLkFTTjFVdGlsLm5ld09iamVjdDtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9IDEpXG4gICAgICAgICAgICB0aHJvdyBcImtleSBvZiBwYXJhbSBzaGFsbCBiZSBvbmx5IG9uZS5cIjtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbMF07XG5cbiAgICAgICAgaWYgKFwiOmJvb2w6aW50OmJpdHN0cjpvY3RzdHI6bnVsbDpvaWQ6ZW51bTp1dGY4c3RyOm51bXN0cjpwcm5zdHI6dGVsc3RyOmlhNXN0cjp1dGN0aW1lOmdlbnRpbWU6c2VxOnNldDp0YWc6XCIuaW5kZXhPZihcIjpcIiArIGtleSArIFwiOlwiKSA9PSAtMSlcbiAgICAgICAgICAgIHRocm93IFwidW5kZWZpbmVkIGtleTogXCIgKyBrZXk7XG5cbiAgICAgICAgaWYgKGtleSA9PSBcImJvb2xcIikgICAgcmV0dXJuIG5ldyBfREVSQm9vbGVhbihwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcImludFwiKSAgICAgcmV0dXJuIG5ldyBfREVSSW50ZWdlcihwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcImJpdHN0clwiKSAgcmV0dXJuIG5ldyBfREVSQml0U3RyaW5nKHBhcmFtW2tleV0pO1xuICAgICAgICBpZiAoa2V5ID09IFwib2N0c3RyXCIpICByZXR1cm4gbmV3IF9ERVJPY3RldFN0cmluZyhwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcIm51bGxcIikgICAgcmV0dXJuIG5ldyBfREVSTnVsbChwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcIm9pZFwiKSAgICAgcmV0dXJuIG5ldyBfREVST2JqZWN0SWRlbnRpZmllcihwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcImVudW1cIikgICAgcmV0dXJuIG5ldyBfREVSRW51bWVyYXRlZChwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcInV0ZjhzdHJcIikgcmV0dXJuIG5ldyBfREVSVVRGOFN0cmluZyhwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcIm51bXN0clwiKSAgcmV0dXJuIG5ldyBfREVSTnVtZXJpY1N0cmluZyhwYXJhbVtrZXldKTtcbiAgICAgICAgaWYgKGtleSA9PSBcInBybnN0clwiKSAgcmV0dXJuIG5ldyBfREVSUHJpbnRhYmxlU3RyaW5nKHBhcmFtW2tleV0pO1xuICAgICAgICBpZiAoa2V5ID09IFwidGVsc3RyXCIpICByZXR1cm4gbmV3IF9ERVJUZWxldGV4U3RyaW5nKHBhcmFtW2tleV0pO1xuICAgICAgICBpZiAoa2V5ID09IFwiaWE1c3RyXCIpICByZXR1cm4gbmV3IF9ERVJJQTVTdHJpbmcocGFyYW1ba2V5XSk7XG4gICAgICAgIGlmIChrZXkgPT0gXCJ1dGN0aW1lXCIpIHJldHVybiBuZXcgX0RFUlVUQ1RpbWUocGFyYW1ba2V5XSk7XG4gICAgICAgIGlmIChrZXkgPT0gXCJnZW50aW1lXCIpIHJldHVybiBuZXcgX0RFUkdlbmVyYWxpemVkVGltZShwYXJhbVtrZXldKTtcblxuICAgICAgICBpZiAoa2V5ID09IFwic2VxXCIpIHtcbiAgICAgICAgICAgIHZhciBwYXJhbUxpc3QgPSBwYXJhbVtrZXldO1xuICAgICAgICAgICAgdmFyIGEgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFzbjFPYmogPSBfbmV3T2JqZWN0KHBhcmFtTGlzdFtpXSk7XG4gICAgICAgICAgICAgICAgYS5wdXNoKGFzbjFPYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBfREVSU2VxdWVuY2UoeydhcnJheSc6IGF9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT0gXCJzZXRcIikge1xuICAgICAgICAgICAgdmFyIHBhcmFtTGlzdCA9IHBhcmFtW2tleV07XG4gICAgICAgICAgICB2YXIgYSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXNuMU9iaiA9IF9uZXdPYmplY3QocGFyYW1MaXN0W2ldKTtcbiAgICAgICAgICAgICAgICBhLnB1c2goYXNuMU9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IF9ERVJTZXQoeydhcnJheSc6IGF9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT0gXCJ0YWdcIikge1xuICAgICAgICAgICAgdmFyIHRhZ1BhcmFtID0gcGFyYW1ba2V5XTtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGFnUGFyYW0pID09PSAnW29iamVjdCBBcnJheV0nICYmXG4gICAgICAgICAgICAgICAgdGFnUGFyYW0ubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gX25ld09iamVjdCh0YWdQYXJhbVsyXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfREVSVGFnZ2VkT2JqZWN0KHt0YWc6IHRhZ1BhcmFtWzBdLFxuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdDogdGFnUGFyYW1bMV0sXG4gICAgICAgICAgICAgICAgICAgIG9iajogb2JqfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBuZXdQYXJhbSA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICh0YWdQYXJhbS5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5leHBsaWNpdCA9IHRhZ1BhcmFtLmV4cGxpY2l0O1xuICAgICAgICAgICAgICAgIGlmICh0YWdQYXJhbS50YWcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0udGFnID0gdGFnUGFyYW0udGFnO1xuICAgICAgICAgICAgICAgIGlmICh0YWdQYXJhbS5vYmogPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIjtcbiAgICAgICAgICAgICAgICBuZXdQYXJhbS5vYmogPSBfbmV3T2JqZWN0KHRhZ1BhcmFtLm9iaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfREVSVGFnZ2VkT2JqZWN0KG5ld1BhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBnZXQgZW5jb2RlZCBoZXhhZGVjaW1hbCBzdHJpbmcgb2YgQVNOMU9iamVjdCBzcGVjaWZlZCBieSBKU09OIHBhcmFtZXRlcnNcbiAgICAgKiBAbmFtZSBqc29uVG9BU04xSEVYXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5BU04xVXRpbFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtIEpTT04gcGFyYW1ldGVyIHRvIGdlbmVyYXRlIEFTTjFPYmplY3RcbiAgICAgKiBAcmV0dXJuIGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04xT2JqZWN0XG4gICAgICogQHNpbmNlIGFzbjEgMS4wLjRcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBcyBmb3IgQVNOLjEgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIEpTT04gb2JqZWN0LFxuICAgICAqIHBsZWFzZSBzZWUge0BsaW5rIG5ld09iamVjdH0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBqc29uVG9BU04xSEVYKHsncHJuc3RyJzogJ2FhYSd9KTtcbiAgICAgKi9cbiAgICB0aGlzLmpzb25Ub0FTTjFIRVggPSBmdW5jdGlvbihwYXJhbSkge1xuICAgICAgICB2YXIgYXNuMU9iaiA9IHRoaXMubmV3T2JqZWN0KHBhcmFtKTtcbiAgICAgICAgcmV0dXJuIGFzbjFPYmouZ2V0RW5jb2RlZEhleCgpO1xuICAgIH07XG59O1xuXG4vKipcbiAqIGdldCBkb3Qgbm90ZWQgb2lkIG51bWJlciBzdHJpbmcgZnJvbSBoZXhhZGVjaW1hbCB2YWx1ZSBvZiBPSURcbiAqIEBuYW1lIG9pZEhleFRvSW50XG4gKiBAbWVtYmVyT2YgS0pVUi5hc24xLkFTTjFVdGlsXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBoZXggaGV4YWRlY2ltYWwgdmFsdWUgb2Ygb2JqZWN0IGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge1N0cmluZ30gZG90IG5vdGVkIHN0cmluZyBvZiBvYmplY3QgaWRlbnRpZmllclxuICogQHNpbmNlIGpzcnNhc2lnbiA0LjguMyBhc24xIDEuMC43XG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgc3RhdGljIG1ldGhvZCBjb252ZXJ0cyBmcm9tIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZlxuICogQVNOLjEgdmFsdWUgb2Ygb2JqZWN0IGlkZW50aWZpZXIgdG8gb2lkIG51bWJlciBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICogS0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KCc1NTA0MDYnKSAmcmFycjsgXCIyLjUuNC42XCJcbiAqL1xuS0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50ID0gZnVuY3Rpb24oaGV4KSB7XG4gICAgdmFyIHMgPSBcIlwiO1xuICAgIHZhciBpMDEgPSBwYXJzZUludChoZXguc3Vic3RyKDAsIDIpLCAxNik7XG4gICAgdmFyIGkwID0gTWF0aC5mbG9vcihpMDEgLyA0MCk7XG4gICAgdmFyIGkxID0gaTAxICUgNDA7XG4gICAgdmFyIHMgPSBpMCArIFwiLlwiICsgaTE7XG5cbiAgICB2YXIgYmluYnVmID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGhleC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZUludChoZXguc3Vic3RyKGksIDIpLCAxNik7XG4gICAgICAgIHZhciBiaW4gPSAoXCIwMDAwMDAwMFwiICsgdmFsdWUudG9TdHJpbmcoMikpLnNsaWNlKC0gOCk7XG4gICAgICAgIGJpbmJ1ZiA9IGJpbmJ1ZiArIGJpbi5zdWJzdHIoMSwgNyk7XG4gICAgICAgIGlmIChiaW4uc3Vic3RyKDAsIDEpID09IFwiMFwiKSB7XG4gICAgICAgICAgICB2YXIgYmkgPSBuZXcgQmlnSW50ZWdlcihiaW5idWYsIDIpO1xuICAgICAgICAgICAgcyA9IHMgKyBcIi5cIiArIGJpLnRvU3RyaW5nKDEwKTtcbiAgICAgICAgICAgIGJpbmJ1ZiA9IFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHM7XG59O1xuXG4vKipcbiAqIGdldCBoZXhhZGVjaW1hbCB2YWx1ZSBvZiBvYmplY3QgaWRlbnRpZmllciBmcm9tIGRvdCBub3RlZCBvaWQgdmFsdWVcbiAqIEBuYW1lIG9pZEludFRvSGV4XG4gKiBAbWVtYmVyT2YgS0pVUi5hc24xLkFTTjFVdGlsXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBvaWRTdHJpbmcgZG90IG5vdGVkIHN0cmluZyBvZiBvYmplY3QgaWRlbnRpZmllclxuICogQHJldHVybiB7U3RyaW5nfSBoZXhhZGVjaW1hbCB2YWx1ZSBvZiBvYmplY3QgaWRlbnRpZmllclxuICogQHNpbmNlIGpzcnNhc2lnbiA0LjguMyBhc24xIDEuMC43XG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgc3RhdGljIG1ldGhvZCBjb252ZXJ0cyBmcm9tIG9iamVjdCBpZGVudGlmaWVyIHZhbHVlIHN0cmluZy5cbiAqIHRvIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpdC5cbiAqIEBleGFtcGxlXG4gKiBLSlVSLmFzbjEuQVNOMVV0aWwub2lkSW50VG9IZXgoXCIyLjUuNC42XCIpICZyYXJyOyBcIjU1MDQwNlwiXG4gKi9cbktKVVIuYXNuMS5BU04xVXRpbC5vaWRJbnRUb0hleCA9IGZ1bmN0aW9uKG9pZFN0cmluZykge1xuICAgIHZhciBpdG94ID0gZnVuY3Rpb24oaSkge1xuICAgICAgICB2YXIgaCA9IGkudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAoaC5sZW5ndGggPT0gMSkgaCA9ICcwJyArIGg7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG5cbiAgICB2YXIgcm9pZHRveCA9IGZ1bmN0aW9uKHJvaWQpIHtcbiAgICAgICAgdmFyIGggPSAnJztcbiAgICAgICAgdmFyIGJpID0gbmV3IEJpZ0ludGVnZXIocm9pZCwgMTApO1xuICAgICAgICB2YXIgYiA9IGJpLnRvU3RyaW5nKDIpO1xuICAgICAgICB2YXIgcGFkTGVuID0gNyAtIGIubGVuZ3RoICUgNztcbiAgICAgICAgaWYgKHBhZExlbiA9PSA3KSBwYWRMZW4gPSAwO1xuICAgICAgICB2YXIgYlBhZCA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZExlbjsgaSsrKSBiUGFkICs9ICcwJztcbiAgICAgICAgYiA9IGJQYWQgKyBiO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoIC0gMTsgaSArPSA3KSB7XG4gICAgICAgICAgICB2YXIgYjggPSBiLnN1YnN0cihpLCA3KTtcbiAgICAgICAgICAgIGlmIChpICE9IGIubGVuZ3RoIC0gNykgYjggPSAnMScgKyBiODtcbiAgICAgICAgICAgIGggKz0gaXRveChwYXJzZUludChiOCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG5cbiAgICBpZiAoISBvaWRTdHJpbmcubWF0Y2goL15bMC05Ll0rJC8pKSB7XG4gICAgICAgIHRocm93IFwibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiICsgb2lkU3RyaW5nO1xuICAgIH1cbiAgICB2YXIgaCA9ICcnO1xuICAgIHZhciBhID0gb2lkU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgdmFyIGkwID0gcGFyc2VJbnQoYVswXSkgKiA0MCArIHBhcnNlSW50KGFbMV0pO1xuICAgIGggKz0gaXRveChpMCk7XG4gICAgYS5zcGxpY2UoMCwgMik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGggKz0gcm9pZHRveChhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGg7XG59O1xuXG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAgQWJzdHJhY3QgQVNOLjEgQ2xhc3Nlc1xuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuLyoqXG4gKiBiYXNlIGNsYXNzIGZvciBBU04uMSBERVIgZW5jb2RlciBvYmplY3RcbiAqIEBuYW1lIEtKVVIuYXNuMS5BU04xT2JqZWN0XG4gKiBAY2xhc3MgYmFzZSBjbGFzcyBmb3IgQVNOLjEgREVSIGVuY29kZXIgb2JqZWN0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzTW9kaWZpZWQgZmxhZyB3aGV0aGVyIGludGVybmFsIGRhdGEgd2FzIGNoYW5nZWRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBoVExWIGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04uMSBUTFZcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBoVCBoZXhhZGVjaW1hbCBzdHJpbmcgb2YgQVNOLjEgVExWIHRhZyhUKVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGhMIGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04uMSBUTFYgbGVuZ3RoKEwpXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaFYgaGV4YWRlY2ltYWwgc3RyaW5nIG9mIEFTTi4xIFRMViB2YWx1ZShWKVxuICogQGRlc2NyaXB0aW9uXG4gKi9cbktKVVIuYXNuMS5BU04xT2JqZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhWID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBnZXQgaGV4YWRlY2ltYWwgQVNOLjEgVExWIGxlbmd0aChMKSBieXRlcyBmcm9tIFRMViB2YWx1ZShWKVxuICAgICAqIEBuYW1lIGdldExlbmd0aEhleEZyb21WYWx1ZVxuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuQVNOMU9iamVjdCNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04uMSBUTFYgbGVuZ3RoKEwpXG4gICAgICovXG4gICAgdGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhWID09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5oViA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBcInRoaXMuaFYgaXMgbnVsbCBvciB1bmRlZmluZWQuXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaFYubGVuZ3RoICUgMiA9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBcInZhbHVlIGhleCBtdXN0IGJlIGV2ZW4gbGVuZ3RoOiBuPVwiICsgaFYubGVuZ3RoICsgXCIsdj1cIiArIHRoaXMuaFY7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG4gPSB0aGlzLmhWLmxlbmd0aCAvIDI7XG4gICAgICAgIHZhciBoTiA9IG4udG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAoaE4ubGVuZ3RoICUgMiA9PSAxKSB7XG4gICAgICAgICAgICBoTiA9IFwiMFwiICsgaE47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPCAxMjgpIHtcbiAgICAgICAgICAgIHJldHVybiBoTjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBoTmxlbiA9IGhOLmxlbmd0aCAvIDI7XG4gICAgICAgICAgICBpZiAoaE5sZW4gPiAxNSkge1xuICAgICAgICAgICAgICAgIHRocm93IFwiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiICsgbi50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGVhZCA9IDEyOCArIGhObGVuO1xuICAgICAgICAgICAgcmV0dXJuIGhlYWQudG9TdHJpbmcoMTYpICsgaE47XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogZ2V0IGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04uMSBUTFYgYnl0ZXNcbiAgICAgKiBAbmFtZSBnZXRFbmNvZGVkSGV4XG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5BU04xT2JqZWN0I1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gaGV4YWRlY2ltYWwgc3RyaW5nIG9mIEFTTi4xIFRMVlxuICAgICAqL1xuICAgIHRoaXMuZ2V0RW5jb2RlZEhleCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5oVExWID09IG51bGwgfHwgdGhpcy5pc01vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aGlzLmhWID0gdGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7XG4gICAgICAgICAgICB0aGlzLmhMID0gdGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuaFRMViA9IHRoaXMuaFQgKyB0aGlzLmhMICsgdGhpcy5oVjtcbiAgICAgICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy9hbGVydChcImZpcnN0IHRpbWU6IFwiICsgdGhpcy5oVExWKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oVExWO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBnZXQgaGV4YWRlY2ltYWwgc3RyaW5nIG9mIEFTTi4xIFRMViB2YWx1ZShWKSBieXRlc1xuICAgICAqIEBuYW1lIGdldFZhbHVlSGV4XG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5BU04xT2JqZWN0I1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gaGV4YWRlY2ltYWwgc3RyaW5nIG9mIEFTTi4xIFRMViB2YWx1ZShWKSBieXRlc1xuICAgICAqL1xuICAgIHRoaXMuZ2V0VmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5nZXRFbmNvZGVkSGV4KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhWO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG59O1xuXG4vLyA9PSBCRUdJTiBERVJBYnN0cmFjdFN0cmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8qKlxuICogYmFzZSBjbGFzcyBmb3IgQVNOLjEgREVSIHN0cmluZyBjbGFzc2VzXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmdcbiAqIEBjbGFzcyBiYXNlIGNsYXNzIGZvciBBU04uMSBERVIgc3RyaW5nIGNsYXNzZXNcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnYWFhJ30pXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcyBpbnRlcm5hbCBzdHJpbmcgb2YgdmFsdWVcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5BU04xT2JqZWN0XG4gKiBAZGVzY3JpcHRpb25cbiAqIDxici8+XG4gKiBBcyBmb3IgYXJndW1lbnQgJ3BhcmFtcycgZm9yIGNvbnN0cnVjdG9yLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9mXG4gKiBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIDx1bD5cbiAqIDxsaT5zdHIgLSBzcGVjaWZ5IGluaXRpYWwgQVNOLjEgdmFsdWUoVikgYnkgYSBzdHJpbmc8L2xpPlxuICogPGxpPmhleCAtIHNwZWNpZnkgaW5pdGlhbCBBU04uMSB2YWx1ZShWKSBieSBhIGhleGFkZWNpbWFsIHN0cmluZzwvbGk+XG4gKiA8L3VsPlxuICogTk9URTogJ3BhcmFtcycgY2FuIGJlIG9taXR0ZWQuXG4gKi9cbktKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBnZXQgc3RyaW5nIHZhbHVlIG9mIHRoaXMgc3RyaW5nIG9iamVjdFxuICAgICAqIEBuYW1lIGdldFN0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgdmFsdWUgb2YgdGhpcyBzdHJpbmcgb2JqZWN0XG4gICAgICovXG4gICAgdGhpcy5nZXRTdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IGEgc3RyaW5nXG4gICAgICogQG5hbWUgc2V0U3RyaW5nXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmV3UyB2YWx1ZSBieSBhIHN0cmluZyB0byBzZXRcbiAgICAgKi9cbiAgICB0aGlzLnNldFN0cmluZyA9IGZ1bmN0aW9uKG5ld1MpIHtcbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zID0gbmV3UztcbiAgICAgICAgdGhpcy5oViA9IHN0b2hleCh0aGlzLnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBzZXQgdmFsdWUgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmdcbiAgICAgKiBAbmFtZSBzZXRTdHJpbmdIZXhcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuZXdIZXhTdHJpbmcgdmFsdWUgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gc2V0XG4gICAgICovXG4gICAgdGhpcy5zZXRTdHJpbmdIZXggPSBmdW5jdGlvbihuZXdIZXhTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5oViA9IG5ld0hleFN0cmluZztcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRGcmVzaFZhbHVlSGV4ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhWO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RyaW5nKHBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtc1snc3RyJ10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpbmcocGFyYW1zWydzdHInXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtc1snaGV4J10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpbmdIZXgocGFyYW1zWydoZXgnXSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLCBLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vLyA9PSBFTkQgICBERVJBYnN0cmFjdFN0cmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gPT0gQkVHSU4gREVSQWJzdHJhY3RUaW1lID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIGJhc2UgY2xhc3MgZm9yIEFTTi4xIERFUiBHZW5lcmFsaXplZC9VVENUaW1lIGNsYXNzXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lXG4gKiBAY2xhc3MgYmFzZSBjbGFzcyBmb3IgQVNOLjEgREVSIEdlbmVyYWxpemVkL1VUQ1RpbWUgY2xhc3NcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnMTMwNDMwMjM1OTU5Wid9KVxuICogQGV4dGVuZHMgS0pVUi5hc24xLkFTTjFPYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogQHNlZSBLSlVSLmFzbjEuQVNOMU9iamVjdCAtIHN1cGVyY2xhc3NcbiAqL1xuS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuXG4gICAgLy8gLS0tIFBSSVZBVEUgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHRoaXMubG9jYWxEYXRlVG9VVEMgPSBmdW5jdGlvbihkKSB7XG4gICAgICAgIHV0YyA9IGQuZ2V0VGltZSgpICsgKGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwKTtcbiAgICAgICAgdmFyIHV0Y0RhdGUgPSBuZXcgRGF0ZSh1dGMpO1xuICAgICAgICByZXR1cm4gdXRjRGF0ZTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBmb3JtYXQgZGF0ZSBzdHJpbmcgYnkgRGF0YSBvYmplY3RcbiAgICAgKiBAbmFtZSBmb3JtYXREYXRlXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5BYnN0cmFjdFRpbWU7XG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlT2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgJ3V0Yycgb3IgJ2dlbidcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhNaWxsaXMgZmxhZyBmb3Igd2l0aCBtaWxsaXNlY3Rpb25zIG9yIG5vdFxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICd3aXRoTWlsbGlzJyBmbGFnIGlzIHN1cHBvcnRlZCBmcm9tIGFzbjEgMS4wLjYuXG4gICAgICovXG4gICAgdGhpcy5mb3JtYXREYXRlID0gZnVuY3Rpb24oZGF0ZU9iamVjdCwgdHlwZSwgd2l0aE1pbGxpcykge1xuICAgICAgICB2YXIgcGFkID0gdGhpcy56ZXJvUGFkZGluZztcbiAgICAgICAgdmFyIGQgPSB0aGlzLmxvY2FsRGF0ZVRvVVRDKGRhdGVPYmplY3QpO1xuICAgICAgICB2YXIgeWVhciA9IFN0cmluZyhkLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICBpZiAodHlwZSA9PSAndXRjJykgeWVhciA9IHllYXIuc3Vic3RyKDIsIDIpO1xuICAgICAgICB2YXIgbW9udGggPSBwYWQoU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLCAyKTtcbiAgICAgICAgdmFyIGRheSA9IHBhZChTdHJpbmcoZC5nZXREYXRlKCkpLCAyKTtcbiAgICAgICAgdmFyIGhvdXIgPSBwYWQoU3RyaW5nKGQuZ2V0SG91cnMoKSksIDIpO1xuICAgICAgICB2YXIgbWluID0gcGFkKFN0cmluZyhkLmdldE1pbnV0ZXMoKSksIDIpO1xuICAgICAgICB2YXIgc2VjID0gcGFkKFN0cmluZyhkLmdldFNlY29uZHMoKSksIDIpO1xuICAgICAgICB2YXIgcyA9IHllYXIgKyBtb250aCArIGRheSArIGhvdXIgKyBtaW4gKyBzZWM7XG4gICAgICAgIGlmICh3aXRoTWlsbGlzID09PSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbWlsbGlzID0gZC5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICAgICAgICAgIGlmIChtaWxsaXMgIT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzTWlsbGlzID0gcGFkKFN0cmluZyhtaWxsaXMpLCAzKTtcbiAgICAgICAgICAgICAgICBzTWlsbGlzID0gc01pbGxpcy5yZXBsYWNlKC9bMF0rJC8sIFwiXCIpO1xuICAgICAgICAgICAgICAgIHMgPSBzICsgXCIuXCIgKyBzTWlsbGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzICsgXCJaXCI7XG4gICAgfTtcblxuICAgIHRoaXMuemVyb1BhZGRpbmcgPSBmdW5jdGlvbihzLCBsZW4pIHtcbiAgICAgICAgaWYgKHMubGVuZ3RoID49IGxlbikgcmV0dXJuIHM7XG4gICAgICAgIHJldHVybiBuZXcgQXJyYXkobGVuIC0gcy5sZW5ndGggKyAxKS5qb2luKCcwJykgKyBzO1xuICAgIH07XG5cbiAgICAvLyAtLS0gUFVCTElDIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBnZXQgc3RyaW5nIHZhbHVlIG9mIHRoaXMgc3RyaW5nIG9iamVjdFxuICAgICAqIEBuYW1lIGdldFN0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIHZhbHVlIG9mIHRoaXMgdGltZSBvYmplY3RcbiAgICAgKi9cbiAgICB0aGlzLmdldFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBzZXQgdmFsdWUgYnkgYSBzdHJpbmdcbiAgICAgKiBAbmFtZSBzZXRTdHJpbmdcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmV3UyB2YWx1ZSBieSBhIHN0cmluZyB0byBzZXQgc3VjaCBsaWtlIFwiMTMwNDMwMjM1OTU5WlwiXG4gICAgICovXG4gICAgdGhpcy5zZXRTdHJpbmcgPSBmdW5jdGlvbihuZXdTKSB7XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMucyA9IG5ld1M7XG4gICAgICAgIHRoaXMuaFYgPSBzdG9oZXgobmV3Uyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBhIERhdGUgb2JqZWN0XG4gICAgICogQG5hbWUgc2V0QnlEYXRlVmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHllYXIgeWVhciBvZiBkYXRlIChleC4gMjAxMylcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IG1vbnRoIG1vbnRoIG9mIGRhdGUgYmV0d2VlbiAxIGFuZCAxMiAoZXguIDEyKVxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gZGF5IGRheSBvZiBtb250aFxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gaG91ciBob3VycyBvZiBkYXRlXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBtaW4gbWludXRlcyBvZiBkYXRlXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBzZWMgc2Vjb25kcyBvZiBkYXRlXG4gICAgICovXG4gICAgdGhpcy5zZXRCeURhdGVWYWx1ZSA9IGZ1bmN0aW9uKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjKSB7XG4gICAgICAgIHZhciBkYXRlT2JqZWN0ID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbiwgc2VjLCAwKSk7XG4gICAgICAgIHRoaXMuc2V0QnlEYXRlKGRhdGVPYmplY3QpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lLCBLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vLyA9PSBFTkQgICBERVJBYnN0cmFjdFRpbWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gPT0gQkVHSU4gREVSQWJzdHJhY3RTdHJ1Y3R1cmVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIGJhc2UgY2xhc3MgZm9yIEFTTi4xIERFUiBzdHJ1Y3R1cmVkIGNsYXNzXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkXG4gKiBAY2xhc3MgYmFzZSBjbGFzcyBmb3IgQVNOLjEgREVSIHN0cnVjdHVyZWQgY2xhc3NcbiAqIEBwcm9wZXJ0eSB7QXJyYXl9IGFzbjFBcnJheSBpbnRlcm5hbCBhcnJheSBvZiBBU04xT2JqZWN0XG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuQVNOMU9iamVjdFxuICogQGRlc2NyaXB0aW9uXG4gKiBAc2VlIEtKVVIuYXNuMS5BU04xT2JqZWN0IC0gc3VwZXJjbGFzc1xuICovXG5LSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBhcnJheSBvZiBBU04xT2JqZWN0XG4gICAgICogQG5hbWUgc2V0QnlBU04xT2JqZWN0QXJyYXlcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge2FycmF5fSBhc24xT2JqZWN0QXJyYXkgYXJyYXkgb2YgQVNOMU9iamVjdCB0byBzZXRcbiAgICAgKi9cbiAgICB0aGlzLnNldEJ5QVNOMU9iamVjdEFycmF5ID0gZnVuY3Rpb24oYXNuMU9iamVjdEFycmF5KSB7XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYXNuMUFycmF5ID0gYXNuMU9iamVjdEFycmF5O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBhcHBlbmQgYW4gQVNOMU9iamVjdCB0byBpbnRlcm5hbCBhcnJheVxuICAgICAqIEBuYW1lIGFwcGVuZEFTTjFPYmplY3RcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FTTjFPYmplY3R9IGFzbjFPYmplY3QgdG8gYWRkXG4gICAgICovXG4gICAgdGhpcy5hcHBlbmRBU04xT2JqZWN0ID0gZnVuY3Rpb24oYXNuMU9iamVjdCkge1xuICAgICAgICB0aGlzLmhUTFYgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFzbjFBcnJheS5wdXNoKGFzbjFPYmplY3QpO1xuICAgIH07XG5cbiAgICB0aGlzLmFzbjFBcnJheSA9IG5ldyBBcnJheSgpO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNbJ2FycmF5J10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hc24xQXJyYXkgPSBwYXJhbXNbJ2FycmF5J107XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCwgS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuXG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAgQVNOLjEgT2JqZWN0IENsYXNzZXNcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vKipcbiAqIGNsYXNzIGZvciBBU04uMSBERVIgQm9vbGVhblxuICogQG5hbWUgS0pVUi5hc24xLkRFUkJvb2xlYW5cbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIEJvb2xlYW5cbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5BU04xT2JqZWN0XG4gKiBAZGVzY3JpcHRpb25cbiAqIEBzZWUgS0pVUi5hc24xLkFTTjFPYmplY3QgLSBzdXBlcmNsYXNzXG4gKi9cbktKVVIuYXNuMS5ERVJCb29sZWFuID0gZnVuY3Rpb24oKSB7XG4gICAgS0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICAgIHRoaXMuaFQgPSBcIjAxXCI7XG4gICAgdGhpcy5oVExWID0gXCIwMTAxZmZcIjtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbiwgS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIEludGVnZXJcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJJbnRlZ2VyXG4gKiBAY2xhc3MgY2xhc3MgZm9yIEFTTi4xIERFUiBJbnRlZ2VyXG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuQVNOMU9iamVjdFxuICogQGRlc2NyaXB0aW9uXG4gKiA8YnIvPlxuICogQXMgZm9yIGFyZ3VtZW50ICdwYXJhbXMnIGZvciBjb25zdHJ1Y3RvciwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvZlxuICogZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiA8dWw+XG4gKiA8bGk+aW50IC0gc3BlY2lmeSBpbml0aWFsIEFTTi4xIHZhbHVlKFYpIGJ5IGludGVnZXIgdmFsdWU8L2xpPlxuICogPGxpPmJpZ2ludCAtIHNwZWNpZnkgaW5pdGlhbCBBU04uMSB2YWx1ZShWKSBieSBCaWdJbnRlZ2VyIG9iamVjdDwvbGk+XG4gKiA8bGk+aGV4IC0gc3BlY2lmeSBpbml0aWFsIEFTTi4xIHZhbHVlKFYpIGJ5IGEgaGV4YWRlY2ltYWwgc3RyaW5nPC9saT5cbiAqIDwvdWw+XG4gKiBOT1RFOiAncGFyYW1zJyBjYW4gYmUgb21pdHRlZC5cbiAqL1xuS0pVUi5hc24xLkRFUkludGVnZXIgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICBLSlVSLmFzbjEuREVSSW50ZWdlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5oVCA9IFwiMDJcIjtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBUb20gV3UncyBCaWdJbnRlZ2VyIG9iamVjdFxuICAgICAqIEBuYW1lIHNldEJ5QmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVSSW50ZWdlciNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0JpZ0ludGVnZXJ9IGJpZ0ludGVnZXJWYWx1ZSB0byBzZXRcbiAgICAgKi9cbiAgICB0aGlzLnNldEJ5QmlnSW50ZWdlciA9IGZ1bmN0aW9uKGJpZ0ludGVnZXJWYWx1ZSkge1xuICAgICAgICB0aGlzLmhUTFYgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhWID0gS0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGJpZ0ludGVnZXJWYWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBpbnRlZ2VyIHZhbHVlXG4gICAgICogQG5hbWUgc2V0QnlJbnRlZ2VyXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5ERVJJbnRlZ2VyXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBpbnRlZ2VyIHZhbHVlIHRvIHNldFxuICAgICAqL1xuICAgIHRoaXMuc2V0QnlJbnRlZ2VyID0gZnVuY3Rpb24oaW50VmFsdWUpIHtcbiAgICAgICAgdmFyIGJpID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nKGludFZhbHVlKSwgMTApO1xuICAgICAgICB0aGlzLnNldEJ5QmlnSW50ZWdlcihiaSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBpbnRlZ2VyIHZhbHVlXG4gICAgICogQG5hbWUgc2V0VmFsdWVIZXhcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkludGVnZXIjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhleGFkZWNpbWFsIHN0cmluZyBvZiBpbnRlZ2VyIHZhbHVlXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogPGJyLz5cbiAgICAgKiBOT1RFOiBWYWx1ZSBzaGFsbCBiZSByZXByZXNlbnRlZCBieSBtaW5pbXVtIG9jdGV0IGxlbmd0aCBvZlxuICAgICAqIHR3bydzIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoMTIzKTtcbiAgICAgKiBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeydpbnQnOiAxMjN9KTtcbiAgICAgKiBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeydoZXgnOiAnMWZhZCd9KTtcbiAgICAgKi9cbiAgICB0aGlzLnNldFZhbHVlSGV4ID0gZnVuY3Rpb24obmV3SGV4U3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaFYgPSBuZXdIZXhTdHJpbmc7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RnJlc2hWYWx1ZUhleCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oVjtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIHBhcmFtc1snYmlnaW50J10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRCeUJpZ0ludGVnZXIocGFyYW1zWydiaWdpbnQnXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtc1snaW50J10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRCeUludGVnZXIocGFyYW1zWydpbnQnXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcyA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aGlzLnNldEJ5SW50ZWdlcihwYXJhbXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXNbJ2hleCddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVIZXgocGFyYW1zWydoZXgnXSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsIEtKVVIuYXNuMS5BU04xT2JqZWN0KTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBlbmNvZGVkIEJpdFN0cmluZyBwcmltaXRpdmVcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJCaXRTdHJpbmdcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIGVuY29kZWQgQml0U3RyaW5nIHByaW1pdGl2ZVxuICogQGV4dGVuZHMgS0pVUi5hc24xLkFTTjFPYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogPGJyLz5cbiAqIEFzIGZvciBhcmd1bWVudCAncGFyYW1zJyBmb3IgY29uc3RydWN0b3IsIHlvdSBjYW4gc3BlY2lmeSBvbmUgb2ZcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogPHVsPlxuICogPGxpPmJpbiAtIHNwZWNpZnkgYmluYXJ5IHN0cmluZyAoZXguICcxMDExMScpPC9saT5cbiAqIDxsaT5hcnJheSAtIHNwZWNpZnkgYXJyYXkgb2YgYm9vbGVhbiAoZXguIFt0cnVlLGZhbHNlLHRydWUsdHJ1ZV0pPC9saT5cbiAqIDxsaT5oZXggLSBzcGVjaWZ5IGhleGFkZWNpbWFsIHN0cmluZyBvZiBBU04uMSB2YWx1ZShWKSBpbmNsdWRpbmcgdW51c2VkIGJpdHM8L2xpPlxuICogPGxpPm9iaiAtIHNwZWNpZnkge0BsaW5rIEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3R9XG4gKiBhcmd1bWVudCBmb3IgXCJCaXRTdHJpbmcgZW5jYXBzdWxhdGVzXCIgc3RydWN0dXJlLjwvbGk+XG4gKiA8L3VsPlxuICogTk9URTE6ICdwYXJhbXMnIGNhbiBiZSBvbWl0dGVkLjxici8+XG4gKiBOT1RFMjogJ29iaicgcGFyYW1ldGVyIGhhdmUgYmVlbiBzdXBwb3J0ZWQgc2luY2VcbiAqIGFzbjEgMS4wLjExLCBqc3JzYXNpZ24gNi4xLjEgKDIwMTYtU2VwLTI1KS48YnIvPlxuICogQGV4YW1wbGVcbiAqIC8vIGRlZmF1bHQgY29uc3RydWN0b3JcbiAqIG8gPSBuZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZygpO1xuICogLy8gaW5pdGlhbGl6ZSB3aXRoIGJpbmFyeSBzdHJpbmdcbiAqIG8gPSBuZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7YmluOiBcIjEwMTFcIn0pO1xuICogLy8gaW5pdGlhbGl6ZSB3aXRoIGJvb2xlYW4gYXJyYXlcbiAqIG8gPSBuZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7YXJyYXk6IFt0cnVlLGZhbHNlLHRydWUsdHJ1ZV19KTtcbiAqIC8vIGluaXRpYWxpemUgd2l0aCBoZXhhZGVjaW1hbCBzdHJpbmcgKDA0IGlzIHVudXNlZCBiaXRzKVxuICogbyA9IG5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDogXCIwNGJhYzBcIn0pO1xuICogLy8gaW5pdGlhbGl6ZSB3aXRoIEFTTjFVdGlsLm5ld09iamVjdCBhcmd1bWVudCBmb3IgZW5jYXBzdWxhdGVkXG4gKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe29iajoge3NlcTogW3tpbnQ6IDN9LCB7cHJuc3RyOiAnYWFhJ31dfX0pO1xuICogLy8gYWJvdmUgZ2VuZXJhdGVzIGEgQVNOLjEgZGF0YSBsaWtlIHRoaXM6XG4gKiAvLyBCSVQgU1RSSU5HLCBlbmNhcHN1bGF0ZXMge1xuICogLy8gICBTRVFVRU5DRSB7XG4gKiAvLyAgICAgSU5URUdFUiAzXG4gKiAvLyAgICAgUHJpbnRhYmxlU3RyaW5nICdhYWEnXG4gKiAvLyAgICAgfVxuICogLy8gICB9XG4gKi9cbktKVVIuYXNuMS5ERVJCaXRTdHJpbmcgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5vYmogIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmFyIG8gPSBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHBhcmFtcy5vYmopO1xuICAgICAgICBwYXJhbXMuaGV4ID0gXCIwMFwiICsgby5nZXRFbmNvZGVkSGV4KCk7XG4gICAgfVxuICAgIEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICAgIHRoaXMuaFQgPSBcIjAzXCI7XG5cbiAgICAvKipcbiAgICAgKiBzZXQgQVNOLjEgdmFsdWUoVikgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmcgaW5jbHVkaW5nIHVudXNlZCBiaXRzXG4gICAgICogQG5hbWUgc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5ld0hleFN0cmluZ0luY2x1ZGluZ1VudXNlZEJpdHNcbiAgICAgKi9cbiAgICB0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyA9IGZ1bmN0aW9uKG5ld0hleFN0cmluZ0luY2x1ZGluZ1VudXNlZEJpdHMpIHtcbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oViA9IG5ld0hleFN0cmluZ0luY2x1ZGluZ1VudXNlZEJpdHM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCBBU04uMSB2YWx1ZShWKSBieSB1bnVzZWQgYml0IGFuZCBoZXhhZGVjaW1hbCBzdHJpbmcgb2YgdmFsdWVcbiAgICAgKiBAbmFtZSBzZXRVbnVzZWRCaXRzQW5kSGV4VmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkJpdFN0cmluZyNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHVudXNlZEJpdHNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaFZhbHVlXG4gICAgICovXG4gICAgdGhpcy5zZXRVbnVzZWRCaXRzQW5kSGV4VmFsdWUgPSBmdW5jdGlvbih1bnVzZWRCaXRzLCBoVmFsdWUpIHtcbiAgICAgICAgaWYgKHVudXNlZEJpdHMgPCAwIHx8IDcgPCB1bnVzZWRCaXRzKSB7XG4gICAgICAgICAgICB0aHJvdyBcInVudXNlZCBiaXRzIHNoYWxsIGJlIGZyb20gMCB0byA3OiB1ID0gXCIgKyB1bnVzZWRCaXRzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoVW51c2VkQml0cyA9IFwiMFwiICsgdW51c2VkQml0cztcbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oViA9IGhVbnVzZWRCaXRzICsgaFZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBzZXQgQVNOLjEgREVSIEJpdFN0cmluZyBieSBiaW5hcnkgc3RyaW5nPGJyLz5cbiAgICAgKiBAbmFtZSBzZXRCeUJpbmFyeVN0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVSQml0U3RyaW5nI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBiaW5hcnlTdHJpbmcgYmluYXJ5IHZhbHVlIHN0cmluZyAoaS5lLiAnMTAxMTEnKVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIEl0cyB1bnVzZWQgYml0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBieSBsZW5ndGggb2ZcbiAgICAgKiAnYmluYXJ5VmFsdWUnLiA8YnIvPlxuICAgICAqIE5PVEU6IFRyYWlsaW5nIHplcm9zICcwJyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoKTtcbiAgICAgKiBvLnNldEJ5Qm9vbGVhbkFycmF5KFwiMDEwMTFcIik7XG4gICAgICovXG4gICAgdGhpcy5zZXRCeUJpbmFyeVN0cmluZyA9IGZ1bmN0aW9uKGJpbmFyeVN0cmluZykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgPSBiaW5hcnlTdHJpbmcucmVwbGFjZSgvMCskLywgJycpO1xuICAgICAgICB2YXIgdW51c2VkQml0cyA9IDggLSBiaW5hcnlTdHJpbmcubGVuZ3RoICUgODtcbiAgICAgICAgaWYgKHVudXNlZEJpdHMgPT0gOCkgdW51c2VkQml0cyA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHVudXNlZEJpdHM7IGkrKykge1xuICAgICAgICAgICAgYmluYXJ5U3RyaW5nICs9ICcwJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgaCA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeVN0cmluZy5sZW5ndGggLSAxOyBpICs9IDgpIHtcbiAgICAgICAgICAgIHZhciBiID0gYmluYXJ5U3RyaW5nLnN1YnN0cihpLCA4KTtcbiAgICAgICAgICAgIHZhciB4ID0gcGFyc2VJbnQoYiwgMikudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgaWYgKHgubGVuZ3RoID09IDEpIHggPSAnMCcgKyB4O1xuICAgICAgICAgICAgaCArPSB4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaFYgPSAnMCcgKyB1bnVzZWRCaXRzICsgaDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogc2V0IEFTTi4xIFRMViB2YWx1ZShWKSBieSBhbiBhcnJheSBvZiBib29sZWFuPGJyLz5cbiAgICAgKiBAbmFtZSBzZXRCeUJvb2xlYW5BcnJheVxuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVSQml0U3RyaW5nI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGJvb2xlYW5BcnJheSBhcnJheSBvZiBib29sZWFuIChleC4gW3RydWUsIGZhbHNlLCB0cnVlXSlcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBOT1RFOiBUcmFpbGluZyBmYWxzZXMgd2lsbCBiZSBpZ25vcmVkIGluIHRoZSBBU04uMSBERVIgT2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbyA9IG5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKCk7XG4gICAgICogby5zZXRCeUJvb2xlYW5BcnJheShbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlXSk7XG4gICAgICovXG4gICAgdGhpcy5zZXRCeUJvb2xlYW5BcnJheSA9IGZ1bmN0aW9uKGJvb2xlYW5BcnJheSkge1xuICAgICAgICB2YXIgcyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvb2xlYW5BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGJvb2xlYW5BcnJheVtpXSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcyArPSAnMSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHMgKz0gJzAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QnlCaW5hcnlTdHJpbmcocyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlIGFuIGFycmF5IG9mIGZhbHNlcyB3aXRoIHNwZWNpZmllZCBsZW5ndGg8YnIvPlxuICAgICAqIEBuYW1lIG5ld0ZhbHNlQXJyYXlcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkJpdFN0cmluZ1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gbkxlbmd0aCBsZW5ndGggb2YgYXJyYXkgdG8gZ2VuZXJhdGVcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gYXJyYXkgb2YgYm9vbGVhbiBmYWxzZXNcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBUaGlzIHN0YXRpYyBtZXRob2QgbWF5IGJlIHVzZWZ1bCB0byBpbml0aWFsaXplIGJvb2xlYW4gYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoKTtcbiAgICAgKiBvLm5ld0ZhbHNlQXJyYXkoMykgJnJhcnI7IFtmYWxzZSwgZmFsc2UsIGZhbHNlXVxuICAgICAqL1xuICAgIHRoaXMubmV3RmFsc2VBcnJheSA9IGZ1bmN0aW9uKG5MZW5ndGgpIHtcbiAgICAgICAgdmFyIGEgPSBuZXcgQXJyYXkobkxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhW2ldID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RnJlc2hWYWx1ZUhleCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oVjtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PSBcInN0cmluZ1wiICYmIHBhcmFtcy50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eWzAtOWEtZl0rJC8pKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhwYXJhbXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXNbJ2hleCddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKHBhcmFtc1snaGV4J10pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXNbJ2JpbiddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QnlCaW5hcnlTdHJpbmcocGFyYW1zWydiaW4nXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtc1snYXJyYXknXSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLnNldEJ5Qm9vbGVhbkFycmF5KHBhcmFtc1snYXJyYXknXSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZywgS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIE9jdGV0U3RyaW5nPGJyLz5cbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZ1xuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgT2N0ZXRTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnYWFhJ30pXG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmdcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBBU04uMSBPY3RldFN0cmluZyBzaW1wbGUgdHlwZS48YnIvPlxuICogU3VwcG9ydGVkIFwicGFyYW1zXCIgYXR0cmlidXRlcyBhcmU6XG4gKiA8dWw+XG4gKiA8bGk+c3RyIC0gdG8gc2V0IGEgc3RyaW5nIGFzIGEgdmFsdWU8L2xpPlxuICogPGxpPmhleCAtIHRvIHNldCBhIGhleGFkZWNpbWFsIHN0cmluZyBhcyBhIHZhbHVlPC9saT5cbiAqIDxsaT5vYmogLSB0byBzZXQgYSBlbmNhcHN1bGF0ZWQgQVNOLjEgdmFsdWUgYnkgSlNPTiBvYmplY3RcbiAqIHdoaWNoIGlzIGRlZmluZWQgaW4ge0BsaW5rIEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3R9PC9saT5cbiAqIDwvdWw+XG4gKiBOT1RFOiBBIHBhcmFtZXRlciAnb2JqJyBoYXZlIGJlZW4gc3VwcG9ydGVkXG4gKiBmb3IgXCJPQ1RFVCBTVFJJTkcsIGVuY2Fwc3VsYXRlc1wiIHN0cnVjdHVyZS5cbiAqIHNpbmNlIGFzbjEgMS4wLjExLCBqc3JzYXNpZ24gNi4xLjEgKDIwMTYtU2VwLTI1KS5cbiAqIEBzZWUgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nIC0gc3VwZXJjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIGRlZmF1bHQgY29uc3RydWN0b3JcbiAqIG8gPSBuZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKCk7XG4gKiAvLyBpbml0aWFsaXplIHdpdGggc3RyaW5nXG4gKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7c3RyOiBcImFhYVwifSk7XG4gKiAvLyBpbml0aWFsaXplIHdpdGggaGV4YWRlY2ltYWwgc3RyaW5nXG4gKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OiBcIjYxNjE2MVwifSk7XG4gKiAvLyBpbml0aWFsaXplIHdpdGggQVNOMVV0aWwubmV3T2JqZWN0IGFyZ3VtZW50XG4gKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7b2JqOiB7c2VxOiBbe2ludDogM30sIHtwcm5zdHI6ICdhYWEnfV19fSk7XG4gKiAvLyBhYm92ZSBnZW5lcmF0ZXMgYSBBU04uMSBkYXRhIGxpa2UgdGhpczpcbiAqIC8vIE9DVEVUIFNUUklORywgZW5jYXBzdWxhdGVzIHtcbiAqIC8vICAgU0VRVUVOQ0Uge1xuICogLy8gICAgIElOVEVHRVIgM1xuICogLy8gICAgIFByaW50YWJsZVN0cmluZyAnYWFhJ1xuICogLy8gICAgIH1cbiAqIC8vICAgfVxuICovXG5LSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5vYmogIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmFyIG8gPSBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHBhcmFtcy5vYmopO1xuICAgICAgICBwYXJhbXMuaGV4ID0gby5nZXRFbmNvZGVkSGV4KCk7XG4gICAgfVxuICAgIEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyYW1zKTtcbiAgICB0aGlzLmhUID0gXCIwNFwiO1xufTtcbllBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZywgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBOdWxsXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSTnVsbFxuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgTnVsbFxuICogQGV4dGVuZHMgS0pVUi5hc24xLkFTTjFPYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogQHNlZSBLSlVSLmFzbjEuQVNOMU9iamVjdCAtIHN1cGVyY2xhc3NcbiAqL1xuS0pVUi5hc24xLkRFUk51bGwgPSBmdW5jdGlvbigpIHtcbiAgICBLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5oVCA9IFwiMDVcIjtcbiAgICB0aGlzLmhUTFYgPSBcIjA1MDBcIjtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCwgS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIE9iamVjdElkZW50aWZpZXJcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyXG4gKiBAY2xhc3MgY2xhc3MgZm9yIEFTTi4xIERFUiBPYmplY3RJZGVudGlmaWVyXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgcGFyYW1ldGVycyAoZXguIHsnb2lkJzogJzIuNS40LjUnfSlcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5BU04xT2JqZWN0XG4gKiBAZGVzY3JpcHRpb25cbiAqIDxici8+XG4gKiBBcyBmb3IgYXJndW1lbnQgJ3BhcmFtcycgZm9yIGNvbnN0cnVjdG9yLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9mXG4gKiBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIDx1bD5cbiAqIDxsaT5vaWQgLSBzcGVjaWZ5IGluaXRpYWwgQVNOLjEgdmFsdWUoVikgYnkgYSBvaWQgc3RyaW5nIChleC4gMi41LjQuMTMpPC9saT5cbiAqIDxsaT5oZXggLSBzcGVjaWZ5IGluaXRpYWwgQVNOLjEgdmFsdWUoVikgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmc8L2xpPlxuICogPC91bD5cbiAqIE5PVEU6ICdwYXJhbXMnIGNhbiBiZSBvbWl0dGVkLlxuICovXG5LSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIHZhciBpdG94ID0gZnVuY3Rpb24oaSkge1xuICAgICAgICB2YXIgaCA9IGkudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAoaC5sZW5ndGggPT0gMSkgaCA9ICcwJyArIGg7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgdmFyIHJvaWR0b3ggPSBmdW5jdGlvbihyb2lkKSB7XG4gICAgICAgIHZhciBoID0gJyc7XG4gICAgICAgIHZhciBiaSA9IG5ldyBCaWdJbnRlZ2VyKHJvaWQsIDEwKTtcbiAgICAgICAgdmFyIGIgPSBiaS50b1N0cmluZygyKTtcbiAgICAgICAgdmFyIHBhZExlbiA9IDcgLSBiLmxlbmd0aCAlIDc7XG4gICAgICAgIGlmIChwYWRMZW4gPT0gNykgcGFkTGVuID0gMDtcbiAgICAgICAgdmFyIGJQYWQgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRMZW47IGkrKykgYlBhZCArPSAnMCc7XG4gICAgICAgIGIgPSBiUGFkICsgYjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aCAtIDE7IGkgKz0gNykge1xuICAgICAgICAgICAgdmFyIGI4ID0gYi5zdWJzdHIoaSwgNyk7XG4gICAgICAgICAgICBpZiAoaSAhPSBiLmxlbmd0aCAtIDcpIGI4ID0gJzEnICsgYjg7XG4gICAgICAgICAgICBoICs9IGl0b3gocGFyc2VJbnQoYjgsIDIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaDtcbiAgICB9O1xuXG4gICAgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICAgIHRoaXMuaFQgPSBcIjA2XCI7XG5cbiAgICAvKipcbiAgICAgKiBzZXQgdmFsdWUgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmdcbiAgICAgKiBAbmFtZSBzZXRWYWx1ZUhleFxuICAgICAqIEBtZW1iZXJPZiBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllciNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmV3SGV4U3RyaW5nIGhleGFkZWNpbWFsIHZhbHVlIG9mIE9JRCBieXRlc1xuICAgICAqL1xuICAgIHRoaXMuc2V0VmFsdWVIZXggPSBmdW5jdGlvbihuZXdIZXhTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5oViA9IG5ld0hleFN0cmluZztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IGEgT0lEIHN0cmluZzxici8+XG4gICAgICogQG5hbWUgc2V0VmFsdWVPaWRTdHJpbmdcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9pZFN0cmluZyBPSUQgc3RyaW5nIChleC4gMi41LjQuMTMpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBvID0gbmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKCk7XG4gICAgICogby5zZXRWYWx1ZU9pZFN0cmluZyhcIjIuNS40LjEzXCIpO1xuICAgICAqL1xuICAgIHRoaXMuc2V0VmFsdWVPaWRTdHJpbmcgPSBmdW5jdGlvbihvaWRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCEgb2lkU3RyaW5nLm1hdGNoKC9eWzAtOS5dKyQvKSkge1xuICAgICAgICAgICAgdGhyb3cgXCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIgKyBvaWRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGggPSAnJztcbiAgICAgICAgdmFyIGEgPSBvaWRTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGkwID0gcGFyc2VJbnQoYVswXSkgKiA0MCArIHBhcnNlSW50KGFbMV0pO1xuICAgICAgICBoICs9IGl0b3goaTApO1xuICAgICAgICBhLnNwbGljZSgwLCAyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoICs9IHJvaWR0b3goYVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oVExWID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5oViA9IGg7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBhIE9JRCBuYW1lXG4gICAgICogQG5hbWUgc2V0VmFsdWVOYW1lXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvaWROYW1lIE9JRCBuYW1lIChleC4gJ3NlcnZlckF1dGgnKVxuICAgICAqIEBzaW5jZSAxLjAuMVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE9JRCBuYW1lIHNoYWxsIGJlIGRlZmluZWQgaW4gJ0tKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3QnLlxuICAgICAqIE90aGVyd2lzZSByYWlzZSBlcnJvci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG8gPSBuZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoKTtcbiAgICAgKiBvLnNldFZhbHVlTmFtZShcInNlcnZlckF1dGhcIik7XG4gICAgICovXG4gICAgdGhpcy5zZXRWYWx1ZU5hbWUgPSBmdW5jdGlvbihvaWROYW1lKSB7XG4gICAgICAgIHZhciBvaWQgPSBLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWQob2lkTmFtZSk7XG4gICAgICAgIGlmIChvaWQgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlT2lkU3RyaW5nKG9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBcIkRFUk9iamVjdElkZW50aWZpZXIgb2lkTmFtZSB1bmRlZmluZWQ6IFwiICsgb2lkTmFtZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlT2lkU3RyaW5nKHBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVOYW1lKHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLm9pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlT2lkU3RyaW5nKHBhcmFtcy5vaWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5oZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUhleChwYXJhbXMuaGV4KTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlTmFtZShwYXJhbXMubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIsIEtKVVIuYXNuMS5BU04xT2JqZWN0KTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBFbnVtZXJhdGVkXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSRW51bWVyYXRlZFxuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgRW51bWVyYXRlZFxuICogQGV4dGVuZHMgS0pVUi5hc24xLkFTTjFPYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogPGJyLz5cbiAqIEFzIGZvciBhcmd1bWVudCAncGFyYW1zJyBmb3IgY29uc3RydWN0b3IsIHlvdSBjYW4gc3BlY2lmeSBvbmUgb2ZcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogPHVsPlxuICogPGxpPmludCAtIHNwZWNpZnkgaW5pdGlhbCBBU04uMSB2YWx1ZShWKSBieSBpbnRlZ2VyIHZhbHVlPC9saT5cbiAqIDxsaT5oZXggLSBzcGVjaWZ5IGluaXRpYWwgQVNOLjEgdmFsdWUoVikgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmc8L2xpPlxuICogPC91bD5cbiAqIE5PVEU6ICdwYXJhbXMnIGNhbiBiZSBvbWl0dGVkLlxuICogQGV4YW1wbGVcbiAqIG5ldyBLSlVSLmFzbjEuREVSRW51bWVyYXRlZCgxMjMpO1xuICogbmV3IEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkKHtpbnQ6IDEyM30pO1xuICogbmV3IEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkKHtoZXg6ICcxZmFkJ30pO1xuICovXG5LSlVSLmFzbjEuREVSRW51bWVyYXRlZCA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmhUID0gXCIwYVwiO1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IFRvbSBXdSdzIEJpZ0ludGVnZXIgb2JqZWN0XG4gICAgICogQG5hbWUgc2V0QnlCaWdJbnRlZ2VyXG4gICAgICogQG1lbWJlck9mIEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkI1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7QmlnSW50ZWdlcn0gYmlnSW50ZWdlclZhbHVlIHRvIHNldFxuICAgICAqL1xuICAgIHRoaXMuc2V0QnlCaWdJbnRlZ2VyID0gZnVuY3Rpb24oYmlnSW50ZWdlclZhbHVlKSB7XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaFYgPSBLSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYmlnSW50ZWdlclZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IGludGVnZXIgdmFsdWVcbiAgICAgKiBAbmFtZSBzZXRCeUludGVnZXJcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfSBpbnRlZ2VyIHZhbHVlIHRvIHNldFxuICAgICAqL1xuICAgIHRoaXMuc2V0QnlJbnRlZ2VyID0gZnVuY3Rpb24oaW50VmFsdWUpIHtcbiAgICAgICAgdmFyIGJpID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nKGludFZhbHVlKSwgMTApO1xuICAgICAgICB0aGlzLnNldEJ5QmlnSW50ZWdlcihiaSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBpbnRlZ2VyIHZhbHVlXG4gICAgICogQG5hbWUgc2V0VmFsdWVIZXhcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhleGFkZWNpbWFsIHN0cmluZyBvZiBpbnRlZ2VyIHZhbHVlXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogPGJyLz5cbiAgICAgKiBOT1RFOiBWYWx1ZSBzaGFsbCBiZSByZXByZXNlbnRlZCBieSBtaW5pbXVtIG9jdGV0IGxlbmd0aCBvZlxuICAgICAqIHR3bydzIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgdGhpcy5zZXRWYWx1ZUhleCA9IGZ1bmN0aW9uKG5ld0hleFN0cmluZykge1xuICAgICAgICB0aGlzLmhWID0gbmV3SGV4U3RyaW5nO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNbJ2ludCddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QnlJbnRlZ2VyKHBhcmFtc1snaW50J10pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRCeUludGVnZXIocGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zWydoZXgnXSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlSGV4KHBhcmFtc1snaGV4J10pO1xuICAgICAgICB9XG4gICAgfVxufTtcbllBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJFbnVtZXJhdGVkLCBLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vKipcbiAqIGNsYXNzIGZvciBBU04uMSBERVIgVVRGOFN0cmluZ1xuICogQG5hbWUgS0pVUi5hc24xLkRFUlVURjhTdHJpbmdcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIFVURjhTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnYWFhJ30pXG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmdcbiAqIEBkZXNjcmlwdGlvblxuICogQHNlZSBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcgLSBzdXBlcmNsYXNzXG4gKi9cbktKVVIuYXNuMS5ERVJVVEY4U3RyaW5nID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUlVURjhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmFtcyk7XG4gICAgdGhpcy5oVCA9IFwiMGNcIjtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRGOFN0cmluZywgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBOdW1lcmljU3RyaW5nXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZ1xuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgTnVtZXJpY1N0cmluZ1xuICogQHBhcmFtIHtBcnJheX0gcGFyYW1zIGFzc29jaWF0aXZlIGFycmF5IG9mIHBhcmFtZXRlcnMgKGV4LiB7J3N0cic6ICdhYWEnfSlcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBAc2VlIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyAtIHN1cGVyY2xhc3NcbiAqL1xuS0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICBLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyYW1zKTtcbiAgICB0aGlzLmhUID0gXCIxMlwiO1xufTtcbllBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLCBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIFByaW50YWJsZVN0cmluZ1xuICogQG5hbWUgS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZ1xuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgUHJpbnRhYmxlU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgcGFyYW1ldGVycyAoZXguIHsnc3RyJzogJ2FhYSd9KVxuICogQGV4dGVuZHMgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nXG4gKiBAZGVzY3JpcHRpb25cbiAqIEBzZWUgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nIC0gc3VwZXJjbGFzc1xuICovXG5LSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyYW1zKTtcbiAgICB0aGlzLmhUID0gXCIxM1wiO1xufTtcbllBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcsIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vKipcbiAqIGNsYXNzIGZvciBBU04uMSBERVIgVGVsZXRleFN0cmluZ1xuICogQG5hbWUgS0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmdcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIFRlbGV0ZXhTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnYWFhJ30pXG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmdcbiAqIEBkZXNjcmlwdGlvblxuICogQHNlZSBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcgLSBzdXBlcmNsYXNzXG4gKi9cbktKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmFtcyk7XG4gICAgdGhpcy5oVCA9IFwiMTRcIjtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZywgS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBJQTVTdHJpbmdcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJJQTVTdHJpbmdcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIElBNVN0cmluZ1xuICogQHBhcmFtIHtBcnJheX0gcGFyYW1zIGFzc29jaWF0aXZlIGFycmF5IG9mIHBhcmFtZXRlcnMgKGV4LiB7J3N0cic6ICdhYWEnfSlcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBAc2VlIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyAtIHN1cGVyY2xhc3NcbiAqL1xuS0pVUi5hc24xLkRFUklBNVN0cmluZyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmFtcyk7XG4gICAgdGhpcy5oVCA9IFwiMTZcIjtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSUE1U3RyaW5nLCBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIFVUQ1RpbWVcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJVVENUaW1lXG4gKiBAY2xhc3MgY2xhc3MgZm9yIEFTTi4xIERFUiBVVENUaW1lXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgcGFyYW1ldGVycyAoZXguIHsnc3RyJzogJzEzMDQzMDIzNTk1OVonfSlcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWVcbiAqIEBkZXNjcmlwdGlvblxuICogPGJyLz5cbiAqIEFzIGZvciBhcmd1bWVudCAncGFyYW1zJyBmb3IgY29uc3RydWN0b3IsIHlvdSBjYW4gc3BlY2lmeSBvbmUgb2ZcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogPHVsPlxuICogPGxpPnN0ciAtIHNwZWNpZnkgaW5pdGlhbCBBU04uMSB2YWx1ZShWKSBieSBhIHN0cmluZyAoZXguJzEzMDQzMDIzNTk1OVonKTwvbGk+XG4gKiA8bGk+aGV4IC0gc3BlY2lmeSBpbml0aWFsIEFTTi4xIHZhbHVlKFYpIGJ5IGEgaGV4YWRlY2ltYWwgc3RyaW5nPC9saT5cbiAqIDxsaT5kYXRlIC0gc3BlY2lmeSBEYXRlIG9iamVjdC48L2xpPlxuICogPC91bD5cbiAqIE5PVEU6ICdwYXJhbXMnIGNhbiBiZSBvbWl0dGVkLlxuICogPGg0PkVYQU1QTEVTPC9oND5cbiAqIEBleGFtcGxlXG4gKiBkMSA9IG5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpO1xuICogZDEuc2V0U3RyaW5nKCcxMzA0MzAxMjU5NTlaJyk7XG4gKlxuICogZDIgPSBuZXcgS0pVUi5hc24xLkRFUlVUQ1RpbWUoeydzdHInOiAnMTMwNDMwMTI1OTU5Wid9KTtcbiAqIGQzID0gbmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKHsnZGF0ZSc6IG5ldyBEYXRlKERhdGUuVVRDKDIwMTUsIDAsIDMxLCAwLCAwLCAwLCAwKSl9KTtcbiAqIGQ0ID0gbmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKCcxMzA0MzAxMjU5NTlaJyk7XG4gKi9cbktKVVIuYXNuMS5ERVJVVENUaW1lID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUlVUQ1RpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmFtcyk7XG4gICAgdGhpcy5oVCA9IFwiMTdcIjtcblxuICAgIC8qKlxuICAgICAqIHNldCB2YWx1ZSBieSBhIERhdGUgb2JqZWN0PGJyLz5cbiAgICAgKiBAbmFtZSBzZXRCeURhdGVcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUlVUQ1RpbWUjXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlT2JqZWN0IERhdGUgb2JqZWN0IHRvIHNldCBBU04uMSB2YWx1ZShWKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogbyA9IG5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpO1xuICAgICAqIG8uc2V0QnlEYXRlKG5ldyBEYXRlKFwiMjAxNi8xMi8zMVwiKSk7XG4gICAgICovXG4gICAgdGhpcy5zZXRCeURhdGUgPSBmdW5jdGlvbihkYXRlT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGVPYmplY3Q7XG4gICAgICAgIHRoaXMucyA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsICd1dGMnKTtcbiAgICAgICAgdGhpcy5oViA9IHN0b2hleCh0aGlzLnMpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGUgPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGhpcy5zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnMgPSB0aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLCAndXRjJyk7XG4gICAgICAgICAgICB0aGlzLmhWID0gc3RvaGV4KHRoaXMucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocGFyYW1zLnN0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0cmluZyhwYXJhbXMuc3RyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zID09IFwic3RyaW5nXCIgJiYgcGFyYW1zLm1hdGNoKC9eWzAtOV17MTJ9WiQvKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpbmcocGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuaGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RyaW5nSGV4KHBhcmFtcy5oZXgpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5kYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QnlEYXRlKHBhcmFtcy5kYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRDVGltZSwgS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vKipcbiAqIGNsYXNzIGZvciBBU04uMSBERVIgR2VuZXJhbGl6ZWRUaW1lXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lXG4gKiBAY2xhc3MgY2xhc3MgZm9yIEFTTi4xIERFUiBHZW5lcmFsaXplZFRpbWVcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBwYXJhbWV0ZXJzIChleC4geydzdHInOiAnMjAxMzA0MzAyMzU5NTlaJ30pXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHdpdGhNaWxsaXMgZmxhZyB0byBzaG93IG1pbGxpc2Vjb25kcyBvciBub3RcbiAqIEBleHRlbmRzIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWVcbiAqIEBkZXNjcmlwdGlvblxuICogPGJyLz5cbiAqIEFzIGZvciBhcmd1bWVudCAncGFyYW1zJyBmb3IgY29uc3RydWN0b3IsIHlvdSBjYW4gc3BlY2lmeSBvbmUgb2ZcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogPHVsPlxuICogPGxpPnN0ciAtIHNwZWNpZnkgaW5pdGlhbCBBU04uMSB2YWx1ZShWKSBieSBhIHN0cmluZyAoZXguJzIwMTMwNDMwMjM1OTU5WicpPC9saT5cbiAqIDxsaT5oZXggLSBzcGVjaWZ5IGluaXRpYWwgQVNOLjEgdmFsdWUoVikgYnkgYSBoZXhhZGVjaW1hbCBzdHJpbmc8L2xpPlxuICogPGxpPmRhdGUgLSBzcGVjaWZ5IERhdGUgb2JqZWN0LjwvbGk+XG4gKiA8bGk+bWlsbGlzIC0gc3BlY2lmeSBmbGFnIHRvIHNob3cgbWlsbGlzZWNvbmRzIChmcm9tIDEuMC42KTwvbGk+XG4gKiA8L3VsPlxuICogTk9URTE6ICdwYXJhbXMnIGNhbiBiZSBvbWl0dGVkLlxuICogTk9URTI6ICd3aXRoTWlsbGlzJyBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZnJvbSBhc24xIDEuMC42LlxuICovXG5LSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyYW1zKTtcbiAgICB0aGlzLmhUID0gXCIxOFwiO1xuICAgIHRoaXMud2l0aE1pbGxpcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IGEgRGF0ZSBvYmplY3RcbiAgICAgKiBAbmFtZSBzZXRCeURhdGVcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGVPYmplY3QgRGF0ZSBvYmplY3QgdG8gc2V0IEFTTi4xIHZhbHVlKFYpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBXaGVuIHlvdSBzcGVjaWZ5IFVUQyB0aW1lLCB1c2UgJ0RhdGUuVVRDJyBtZXRob2QgbGlrZSB0aGlzOjxici8+XG4gICAgICogbzEgPSBuZXcgREVSVVRDVGltZSgpO1xuICAgICAqIG8xLnNldEJ5RGF0ZShkYXRlKTtcbiAgICAgKlxuICAgICAqIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygyMDE1LCAwLCAzMSwgMjMsIDU5LCA1OSwgMCkpOyAjMjAxNUpBTjMxIDIzOjU5OjU5XG4gICAgICovXG4gICAgdGhpcy5zZXRCeURhdGUgPSBmdW5jdGlvbihkYXRlT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGVPYmplY3Q7XG4gICAgICAgIHRoaXMucyA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsICdnZW4nLCB0aGlzLndpdGhNaWxsaXMpO1xuICAgICAgICB0aGlzLmhWID0gc3RvaGV4KHRoaXMucyk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RnJlc2hWYWx1ZUhleCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnMgPSB0aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLCAnZ2VuJywgdGhpcy53aXRoTWlsbGlzKTtcbiAgICAgICAgICAgIHRoaXMuaFYgPSBzdG9oZXgodGhpcy5zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oVjtcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXJhbXMuc3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RyaW5nKHBhcmFtcy5zdHIpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMgPT0gXCJzdHJpbmdcIiAmJiBwYXJhbXMubWF0Y2goL15bMC05XXsxNH1aJC8pKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0cmluZyhwYXJhbXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5oZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpbmdIZXgocGFyYW1zLmhleCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRCeURhdGUocGFyYW1zLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMubWlsbGlzID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLndpdGhNaWxsaXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufTtcbllBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUsIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIFNlcXVlbmNlXG4gKiBAbmFtZSBLSlVSLmFzbjEuREVSU2VxdWVuY2VcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIFNlcXVlbmNlXG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkXG4gKiBAZGVzY3JpcHRpb25cbiAqIDxici8+XG4gKiBBcyBmb3IgYXJndW1lbnQgJ3BhcmFtcycgZm9yIGNvbnN0cnVjdG9yLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9mXG4gKiBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIDx1bD5cbiAqIDxsaT5hcnJheSAtIHNwZWNpZnkgYXJyYXkgb2YgQVNOMU9iamVjdCB0byBzZXQgZWxlbWVudHMgb2YgY29udGVudDwvbGk+XG4gKiA8L3VsPlxuICogTk9URTogJ3BhcmFtcycgY2FuIGJlIG9taXR0ZWQuXG4gKi9cbktKVVIuYXNuMS5ERVJTZXF1ZW5jZSA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIEtKVVIuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyYW1zKTtcbiAgICB0aGlzLmhUID0gXCIzMFwiO1xuICAgIHRoaXMuZ2V0RnJlc2hWYWx1ZUhleCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaCA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXNuMUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXNuMU9iaiA9IHRoaXMuYXNuMUFycmF5W2ldO1xuICAgICAgICAgICAgaCArPSBhc24xT2JqLmdldEVuY29kZWRIZXgoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhWID0gaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2VxdWVuY2UsIEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLyoqXG4gKiBjbGFzcyBmb3IgQVNOLjEgREVSIFNldFxuICogQG5hbWUgS0pVUi5hc24xLkRFUlNldFxuICogQGNsYXNzIGNsYXNzIGZvciBBU04uMSBERVIgU2V0XG4gKiBAZXh0ZW5kcyBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkXG4gKiBAZGVzY3JpcHRpb25cbiAqIDxici8+XG4gKiBBcyBmb3IgYXJndW1lbnQgJ3BhcmFtcycgZm9yIGNvbnN0cnVjdG9yLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9mXG4gKiBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIDx1bD5cbiAqIDxsaT5hcnJheSAtIHNwZWNpZnkgYXJyYXkgb2YgQVNOMU9iamVjdCB0byBzZXQgZWxlbWVudHMgb2YgY29udGVudDwvbGk+XG4gKiA8bGk+c29ydGZsYWcgLSBmbGFnIGZvciBzb3J0IChkZWZhdWx0OiB0cnVlKS4gQVNOLjEgQkVSIGlzIG5vdCBzb3J0ZWQgaW4gJ1NFVCBPRicuPC9saT5cbiAqIDwvdWw+XG4gKiBOT1RFMTogJ3BhcmFtcycgY2FuIGJlIG9taXR0ZWQuPGJyLz5cbiAqIE5PVEUyOiBzb3J0ZmxhZyBpcyBzdXBwb3J0ZWQgc2luY2UgMS4wLjUuXG4gKi9cbktKVVIuYXNuMS5ERVJTZXQgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICBLSlVSLmFzbjEuREVSU2V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJhbXMpO1xuICAgIHRoaXMuaFQgPSBcIjMxXCI7XG4gICAgdGhpcy5zb3J0RmxhZyA9IHRydWU7IC8vIGl0ZW0gc2hhbGwgYmUgc29ydGVkIG9ubHkgaW4gQVNOLjEgREVSXG4gICAgdGhpcy5nZXRGcmVzaFZhbHVlSGV4ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc24xQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBhc24xT2JqID0gdGhpcy5hc24xQXJyYXlbaV07XG4gICAgICAgICAgICBhLnB1c2goYXNuMU9iai5nZXRFbmNvZGVkSGV4KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvcnRGbGFnID09IHRydWUpIGEuc29ydCgpO1xuICAgICAgICB0aGlzLmhWID0gYS5qb2luKCcnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuc29ydGZsYWcgIT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgcGFyYW1zLnNvcnRmbGFnID09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zb3J0RmxhZyA9IGZhbHNlO1xuICAgIH1cbn07XG5ZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2V0LCBLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8qKlxuICogY2xhc3MgZm9yIEFTTi4xIERFUiBUYWdnZWRPYmplY3RcbiAqIEBuYW1lIEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3RcbiAqIEBjbGFzcyBjbGFzcyBmb3IgQVNOLjEgREVSIFRhZ2dlZE9iamVjdFxuICogQGV4dGVuZHMgS0pVUi5hc24xLkFTTjFPYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogPGJyLz5cbiAqIFBhcmFtZXRlciAndGFnTm9OZXgnIGlzIEFTTi4xIHRhZyhUKSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuXG4gKiBGb3IgZXhhbXBsZSwgaWYgeW91IGZpbmQgJ1sxXScgdGFnIGluIGEgQVNOLjEgZHVtcCxcbiAqICd0YWdOb0hleCcgd2lsbCBiZSAnYTEnLlxuICogPGJyLz5cbiAqIEFzIGZvciBvcHRpb25hbCBhcmd1bWVudCAncGFyYW1zJyBmb3IgY29uc3RydWN0b3IsIHlvdSBjYW4gc3BlY2lmeSAqQU5ZKiBvZlxuICogZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiA8dWw+XG4gKiA8bGk+ZXhwbGljaXQgLSBzcGVjaWZ5IHRydWUgaWYgdGhpcyBpcyBleHBsaWNpdCB0YWcgb3RoZXJ3aXNlIGZhbHNlXG4gKiAgICAgKGRlZmF1bHQgaXMgJ3RydWUnKS48L2xpPlxuICogPGxpPnRhZyAtIHNwZWNpZnkgdGFnIChkZWZhdWx0IGlzICdhMCcgd2hpY2ggbWVhbnMgWzBdKTwvbGk+XG4gKiA8bGk+b2JqIC0gc3BlY2lmeSBBU04xT2JqZWN0IHdoaWNoIGlzIHRhZ2dlZDwvbGk+XG4gKiA8L3VsPlxuICogQGV4YW1wbGVcbiAqIGQxID0gbmV3IEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nKHsnc3RyJzonYSd9KTtcbiAqIGQyID0gbmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3QoeydvYmonOiBkMX0pO1xuICogaGV4ID0gZDIuZ2V0RW5jb2RlZEhleCgpO1xuICovXG5LSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0ID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5oVCA9IFwiYTBcIjtcbiAgICB0aGlzLmhWID0gJyc7XG4gICAgdGhpcy5pc0V4cGxpY2l0ID0gdHJ1ZTtcbiAgICB0aGlzLmFzbjFPYmplY3QgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogc2V0IHZhbHVlIGJ5IGFuIEFTTjFPYmplY3RcbiAgICAgKiBAbmFtZSBzZXRTdHJpbmdcbiAgICAgKiBAbWVtYmVyT2YgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRXhwbGljaXRGbGFnIGZsYWcgZm9yIGV4cGxpY2l0L2ltcGxpY2l0IHRhZ1xuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gdGFnTm9IZXggaGV4YWRlY2ltYWwgc3RyaW5nIG9mIEFTTi4xIHRhZ1xuICAgICAqIEBwYXJhbSB7QVNOMU9iamVjdH0gYXNuMU9iamVjdCBBU04uMSB0byBlbmNhcHN1bGF0ZVxuICAgICAqL1xuICAgIHRoaXMuc2V0QVNOMU9iamVjdCA9IGZ1bmN0aW9uKGlzRXhwbGljaXRGbGFnLCB0YWdOb0hleCwgYXNuMU9iamVjdCkge1xuICAgICAgICB0aGlzLmhUID0gdGFnTm9IZXg7XG4gICAgICAgIHRoaXMuaXNFeHBsaWNpdCA9IGlzRXhwbGljaXRGbGFnO1xuICAgICAgICB0aGlzLmFzbjFPYmplY3QgPSBhc24xT2JqZWN0O1xuICAgICAgICBpZiAodGhpcy5pc0V4cGxpY2l0KSB7XG4gICAgICAgICAgICB0aGlzLmhWID0gdGhpcy5hc24xT2JqZWN0LmdldEVuY29kZWRIZXgoKTtcbiAgICAgICAgICAgIHRoaXMuaFRMViA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmlzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oViA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmhUTFYgPSBhc24xT2JqZWN0LmdldEVuY29kZWRIZXgoKTtcbiAgICAgICAgICAgIHRoaXMuaFRMViA9IHRoaXMuaFRMVi5yZXBsYWNlKC9eLi4vLCB0YWdOb0hleCk7XG4gICAgICAgICAgICB0aGlzLmlzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmdldEZyZXNoVmFsdWVIZXggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaFY7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNbJ3RhZyddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaFQgPSBwYXJhbXNbJ3RhZyddO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zWydleHBsaWNpdCddICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFeHBsaWNpdCA9IHBhcmFtc1snZXhwbGljaXQnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtc1snb2JqJ10gIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hc24xT2JqZWN0ID0gcGFyYW1zWydvYmonXTtcbiAgICAgICAgICAgIHRoaXMuc2V0QVNOMU9iamVjdCh0aGlzLmlzRXhwbGljaXQsIHRoaXMuaFQsIHRoaXMuYXNuMU9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuWUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCwgS0pVUi5hc24xLkFTTjFPYmplY3QpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBKU0VuY3J5cHRSU0FLZXkgdGhhdCBleHRlbmRzIFRvbSBXdSdzIFJTQSBrZXkgb2JqZWN0LlxuICogVGhpcyBvYmplY3QgaXMganVzdCBhIGRlY29yYXRvciBmb3IgcGFyc2luZyB0aGUga2V5IHBhcmFtZXRlclxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBrZXkgLSBUaGUga2V5IGluIHN0cmluZyBmb3JtYXQsIG9yIGFuIG9iamVjdCBjb250YWluaW5nXG4gKiB0aGUgcGFyYW1ldGVycyBuZWVkZWQgdG8gYnVpbGQgYSBSU0FLZXkgb2JqZWN0LlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnZhciBKU0VuY3J5cHRSU0FLZXkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEpTRW5jcnlwdFJTQUtleSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBKU0VuY3J5cHRSU0FLZXkoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIC8vIENhbGwgdGhlIHN1cGVyIGNvbnN0cnVjdG9yLlxuICAgICAgICAvLyAgUlNBS2V5LmNhbGwodGhpcyk7XG4gICAgICAgIC8vIElmIGEga2V5IGtleSB3YXMgcHJvdmlkZWQuXG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdHJpbmcuLi5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucGFyc2VLZXkoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEpTRW5jcnlwdFJTQUtleS5oYXNQcml2YXRlS2V5UHJvcGVydHkoa2V5KSB8fFxuICAgICAgICAgICAgICAgIEpTRW5jcnlwdFJTQUtleS5oYXNQdWJsaWNLZXlQcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBrZXkuXG4gICAgICAgICAgICAgICAgX3RoaXMucGFyc2VQcm9wZXJ0aWVzRnJvbShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRvIHBhcnNlIGEgcGVtIGVuY29kZWQgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCBhIHB1YmxpYyBvciBwcml2YXRlIGtleS5cbiAgICAgKiBUaGUgbWV0aG9kIHdpbGwgdHJhbnNsYXRlIHRoZSBwZW0gZW5jb2RlZCBzdHJpbmcgaW4gYSBkZXIgZW5jb2RlZCBzdHJpbmcgYW5kXG4gICAgICogd2lsbCBwYXJzZSBwcml2YXRlIGtleSBhbmQgcHVibGljIGtleSBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCBhY2NlcHRzIHB1YmxpYyBrZXlcbiAgICAgKiBpbiB0aGUgcnNhZW5jcnlwdGlvbiBwa2NzICMxIGZvcm1hdCAob2lkOiAxLjIuODQwLjExMzU0OS4xLjEuMSkuXG4gICAgICpcbiAgICAgKiBAdG9kbyBDaGVjayBob3cgbWFueSByc2EgZm9ybWF0cyB1c2UgdGhlIHNhbWUgZm9ybWF0IG9mIHBrY3MgIzEuXG4gICAgICpcbiAgICAgKiBUaGUgZm9ybWF0IGlzIGRlZmluZWQgYXM6XG4gICAgICogUHVibGljS2V5SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICAgICAqICAgYWxnb3JpdGhtICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsXG4gICAgICogICBQdWJsaWNLZXkgICAgICAgQklUIFNUUklOR1xuICAgICAqIH1cbiAgICAgKiBXaGVyZSBBbGdvcml0aG1JZGVudGlmaWVyIGlzOlxuICAgICAqIEFsZ29yaXRobUlkZW50aWZpZXIgOjo9IFNFUVVFTkNFIHtcbiAgICAgKiAgIGFsZ29yaXRobSAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwgICAgIHRoZSBPSUQgb2YgdGhlIGVuYyBhbGdvcml0aG1cbiAgICAgKiAgIHBhcmFtZXRlcnMgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwgKE5VTEwgZm9yIFBLQ1MgIzEpXG4gICAgICogfVxuICAgICAqIGFuZCBQdWJsaWNLZXkgaXMgYSBTRVFVRU5DRSBlbmNhcHN1bGF0ZWQgaW4gYSBCSVQgU1RSSU5HXG4gICAgICogUlNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7XG4gICAgICogICBtb2R1bHVzICAgICAgICAgICBJTlRFR0VSLCAgLS0gblxuICAgICAqICAgcHVibGljRXhwb25lbnQgICAgSU5URUdFUiAgIC0tIGVcbiAgICAgKiB9XG4gICAgICogaXQncyBwb3NzaWJsZSB0byBleGFtaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGtleXMgb2J0YWluZWQgZnJvbSBvcGVuc3NsIHVzaW5nXG4gICAgICogYW4gYXNuLjEgZHVtcGVyIGFzIHRoZSBvbmUgdXNlZCBoZXJlIHRvIHBhcnNlIHRoZSBjb21wb25lbnRzOiBodHRwOi8vbGFwby5pdC9hc24xanMvXG4gICAgICogQGFyZ3VtZW50IHtzdHJpbmd9IHBlbSB0aGUgcGVtIGVuY29kZWQgc3RyaW5nLCBjYW4gaW5jbHVkZSB0aGUgQkVHSU4vRU5EIGhlYWRlci9mb290ZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS5wcm90b3R5cGUucGFyc2VLZXkgPSBmdW5jdGlvbiAocGVtKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbW9kdWx1cyA9IDA7XG4gICAgICAgICAgICB2YXIgcHVibGljX2V4cG9uZW50ID0gMDtcbiAgICAgICAgICAgIHZhciByZUhleCA9IC9eXFxzKig/OlswLTlBLUZhLWZdWzAtOUEtRmEtZl1cXHMqKSskLztcbiAgICAgICAgICAgIHZhciBkZXIgPSByZUhleC50ZXN0KHBlbSkgPyBIZXguZGVjb2RlKHBlbSkgOiBCYXNlNjQudW5hcm1vcihwZW0pO1xuICAgICAgICAgICAgdmFyIGFzbjEgPSBBU04xLmRlY29kZShkZXIpO1xuICAgICAgICAgICAgLy8gRml4ZXMgYSBidWcgd2l0aCBPcGVuU1NMIDEuMCsgcHJpdmF0ZSBrZXlzXG4gICAgICAgICAgICBpZiAoYXNuMS5zdWIubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgYXNuMSA9IGFzbjEuc3ViWzJdLnN1YlswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc24xLnN1Yi5sZW5ndGggPT09IDkpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgICAgICAgICAgICAgbW9kdWx1cyA9IGFzbjEuc3ViWzFdLmdldEhleFN0cmluZ1ZhbHVlKCk7IC8vIGJpZ2ludFxuICAgICAgICAgICAgICAgIHRoaXMubiA9IHBhcnNlQmlnSW50KG1vZHVsdXMsIDE2KTtcbiAgICAgICAgICAgICAgICBwdWJsaWNfZXhwb25lbnQgPSBhc24xLnN1YlsyXS5nZXRIZXhTdHJpbmdWYWx1ZSgpOyAvLyBpbnRcbiAgICAgICAgICAgICAgICB0aGlzLmUgPSBwYXJzZUludChwdWJsaWNfZXhwb25lbnQsIDE2KTtcbiAgICAgICAgICAgICAgICB2YXIgcHJpdmF0ZV9leHBvbmVudCA9IGFzbjEuc3ViWzNdLmdldEhleFN0cmluZ1ZhbHVlKCk7IC8vIGJpZ2ludFxuICAgICAgICAgICAgICAgIHRoaXMuZCA9IHBhcnNlQmlnSW50KHByaXZhdGVfZXhwb25lbnQsIDE2KTtcbiAgICAgICAgICAgICAgICB2YXIgcHJpbWUxID0gYXNuMS5zdWJbNF0uZ2V0SGV4U3RyaW5nVmFsdWUoKTsgLy8gYmlnaW50XG4gICAgICAgICAgICAgICAgdGhpcy5wID0gcGFyc2VCaWdJbnQocHJpbWUxLCAxNik7XG4gICAgICAgICAgICAgICAgdmFyIHByaW1lMiA9IGFzbjEuc3ViWzVdLmdldEhleFN0cmluZ1ZhbHVlKCk7IC8vIGJpZ2ludFxuICAgICAgICAgICAgICAgIHRoaXMucSA9IHBhcnNlQmlnSW50KHByaW1lMiwgMTYpO1xuICAgICAgICAgICAgICAgIHZhciBleHBvbmVudDEgPSBhc24xLnN1Yls2XS5nZXRIZXhTdHJpbmdWYWx1ZSgpOyAvLyBiaWdpbnRcbiAgICAgICAgICAgICAgICB0aGlzLmRtcDEgPSBwYXJzZUJpZ0ludChleHBvbmVudDEsIDE2KTtcbiAgICAgICAgICAgICAgICB2YXIgZXhwb25lbnQyID0gYXNuMS5zdWJbN10uZ2V0SGV4U3RyaW5nVmFsdWUoKTsgLy8gYmlnaW50XG4gICAgICAgICAgICAgICAgdGhpcy5kbXExID0gcGFyc2VCaWdJbnQoZXhwb25lbnQyLCAxNik7XG4gICAgICAgICAgICAgICAgdmFyIGNvZWZmaWNpZW50ID0gYXNuMS5zdWJbOF0uZ2V0SGV4U3RyaW5nVmFsdWUoKTsgLy8gYmlnaW50XG4gICAgICAgICAgICAgICAgdGhpcy5jb2VmZiA9IHBhcnNlQmlnSW50KGNvZWZmaWNpZW50LCAxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhc24xLnN1Yi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgcHVibGljIGtleS5cbiAgICAgICAgICAgICAgICB2YXIgYml0X3N0cmluZyA9IGFzbjEuc3ViWzFdO1xuICAgICAgICAgICAgICAgIHZhciBzZXF1ZW5jZSA9IGJpdF9zdHJpbmcuc3ViWzBdO1xuICAgICAgICAgICAgICAgIG1vZHVsdXMgPSBzZXF1ZW5jZS5zdWJbMF0uZ2V0SGV4U3RyaW5nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm4gPSBwYXJzZUJpZ0ludChtb2R1bHVzLCAxNik7XG4gICAgICAgICAgICAgICAgcHVibGljX2V4cG9uZW50ID0gc2VxdWVuY2Uuc3ViWzFdLmdldEhleFN0cmluZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lID0gcGFyc2VJbnQocHVibGljX2V4cG9uZW50LCAxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlIHJzYSBwYXJhbWV0ZXJzIGluIGEgaGV4IGVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnNhIGtleS5cbiAgICAgKlxuICAgICAqIFRoZSB0cmFuc2xhdGlvbiBmb2xsb3cgdGhlIEFTTi4xIG5vdGF0aW9uIDpcbiAgICAgKiBSU0FQcml2YXRlS2V5IDo6PSBTRVFVRU5DRSB7XG4gICAgICogICB2ZXJzaW9uICAgICAgICAgICBWZXJzaW9uLFxuICAgICAqICAgbW9kdWx1cyAgICAgICAgICAgSU5URUdFUiwgIC0tIG5cbiAgICAgKiAgIHB1YmxpY0V4cG9uZW50ICAgIElOVEVHRVIsICAtLSBlXG4gICAgICogICBwcml2YXRlRXhwb25lbnQgICBJTlRFR0VSLCAgLS0gZFxuICAgICAqICAgcHJpbWUxICAgICAgICAgICAgSU5URUdFUiwgIC0tIHBcbiAgICAgKiAgIHByaW1lMiAgICAgICAgICAgIElOVEVHRVIsICAtLSBxXG4gICAgICogICBleHBvbmVudDEgICAgICAgICBJTlRFR0VSLCAgLS0gZCBtb2QgKHAxKVxuICAgICAqICAgZXhwb25lbnQyICAgICAgICAgSU5URUdFUiwgIC0tIGQgbW9kIChxLTEpXG4gICAgICogICBjb2VmZmljaWVudCAgICAgICBJTlRFR0VSLCAgLS0gKGludmVyc2Ugb2YgcSkgbW9kIHBcbiAgICAgKiB9XG4gICAgICogQHJldHVybnMge3N0cmluZ30gIERFUiBFbmNvZGVkIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJzYSBwcml2YXRlIGtleVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSlNFbmNyeXB0UlNBS2V5LnByb3RvdHlwZS5nZXRQcml2YXRlQmFzZUtleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhcnJheTogW1xuICAgICAgICAgICAgICAgIG5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7IGludDogMCB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMubiB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBpbnQ6IHRoaXMuZSB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMuZCB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMucCB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMucSB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMuZG1wMSB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMuZG1xMSB9KSxcbiAgICAgICAgICAgICAgICBuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoeyBiaWdpbnQ6IHRoaXMuY29lZmYgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNlcSA9IG5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBzZXEuZ2V0RW5jb2RlZEhleCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogYmFzZTY0IChwZW0pIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgREVSIGVuY29kZWQgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBwZW0gZW5jb2RlZCByZXByZXNlbnRhdGlvbiB3aXRob3V0IGhlYWRlciBhbmQgZm9vdGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS5wcm90b3R5cGUuZ2V0UHJpdmF0ZUJhc2VLZXlCNjQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoZXgyYjY0KHRoaXMuZ2V0UHJpdmF0ZUJhc2VLZXkoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgcnNhIHBhcmFtZXRlcnMgaW4gYSBoZXggZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByc2EgcHVibGljIGtleS5cbiAgICAgKiBUaGUgcmVwcmVzZW50YXRpb24gZm9sbG93IHRoZSBBU04uMSBub3RhdGlvbiA6XG4gICAgICogUHVibGljS2V5SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICAgICAqICAgYWxnb3JpdGhtICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsXG4gICAgICogICBQdWJsaWNLZXkgICAgICAgQklUIFNUUklOR1xuICAgICAqIH1cbiAgICAgKiBXaGVyZSBBbGdvcml0aG1JZGVudGlmaWVyIGlzOlxuICAgICAqIEFsZ29yaXRobUlkZW50aWZpZXIgOjo9IFNFUVVFTkNFIHtcbiAgICAgKiAgIGFsZ29yaXRobSAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwgICAgIHRoZSBPSUQgb2YgdGhlIGVuYyBhbGdvcml0aG1cbiAgICAgKiAgIHBhcmFtZXRlcnMgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwgKE5VTEwgZm9yIFBLQ1MgIzEpXG4gICAgICogfVxuICAgICAqIGFuZCBQdWJsaWNLZXkgaXMgYSBTRVFVRU5DRSBlbmNhcHN1bGF0ZWQgaW4gYSBCSVQgU1RSSU5HXG4gICAgICogUlNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7XG4gICAgICogICBtb2R1bHVzICAgICAgICAgICBJTlRFR0VSLCAgLS0gblxuICAgICAqICAgcHVibGljRXhwb25lbnQgICAgSU5URUdFUiAgIC0tIGVcbiAgICAgKiB9XG4gICAgICogQHJldHVybnMge3N0cmluZ30gREVSIEVuY29kZWQgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnNhIHB1YmxpYyBrZXlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS5wcm90b3R5cGUuZ2V0UHVibGljQmFzZUtleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpcnN0X3NlcXVlbmNlID0gbmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7XG4gICAgICAgICAgICBhcnJheTogW1xuICAgICAgICAgICAgICAgIG5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7IG9pZDogXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiIH0pLFxuICAgICAgICAgICAgICAgIG5ldyBLSlVSLmFzbjEuREVSTnVsbCgpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc2Vjb25kX3NlcXVlbmNlID0gbmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7XG4gICAgICAgICAgICBhcnJheTogW1xuICAgICAgICAgICAgICAgIG5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7IGJpZ2ludDogdGhpcy5uIH0pLFxuICAgICAgICAgICAgICAgIG5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7IGludDogdGhpcy5lIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYml0X3N0cmluZyA9IG5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtcbiAgICAgICAgICAgIGhleDogXCIwMFwiICsgc2Vjb25kX3NlcXVlbmNlLmdldEVuY29kZWRIZXgoKVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNlcSA9IG5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe1xuICAgICAgICAgICAgYXJyYXk6IFtcbiAgICAgICAgICAgICAgICBmaXJzdF9zZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICBiaXRfc3RyaW5nXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2VxLmdldEVuY29kZWRIZXgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGJhc2U2NCAocGVtKSBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIERFUiBlbmNvZGVkIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gcGVtIGVuY29kZWQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBoZWFkZXIgYW5kIGZvb3RlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHRSU0FLZXkucHJvdG90eXBlLmdldFB1YmxpY0Jhc2VLZXlCNjQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoZXgyYjY0KHRoaXMuZ2V0UHVibGljQmFzZUtleSgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIHdyYXAgdGhlIHN0cmluZyBpbiBibG9jayBvZiB3aWR0aCBjaGFycy4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHJzYSBrZXlzIGlzIDY0XG4gICAgICogY2hhcmFjdGVycy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRoZSBwZW0gZW5jb2RlZCBzdHJpbmcgd2l0aG91dCBoZWFkZXIgYW5kIGZvb3RlclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGg9NjRdIC0gdGhlIGxlbmd0aCB0aGUgc3RyaW5nIGhhcyB0byBiZSB3cmFwcGVkIGF0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS53b3Jkd3JhcCA9IGZ1bmN0aW9uIChzdHIsIHdpZHRoKSB7XG4gICAgICAgIHdpZHRoID0gd2lkdGggfHwgNjQ7XG4gICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZWdleCA9IFwiKC57MSxcIiArIHdpZHRoICsgXCJ9KSggK3wkXFxuPyl8KC57MSxcIiArIHdpZHRoICsgXCJ9KVwiO1xuICAgICAgICByZXR1cm4gc3RyLm1hdGNoKFJlZ0V4cChyZWdleCwgXCJnXCIpKS5qb2luKFwiXFxuXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIHBlbSBlbmNvZGVkIHByaXZhdGUga2V5XG4gICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBlbSBlbmNvZGVkIHByaXZhdGUga2V5IHdpdGggaGVhZGVyL2Zvb3RlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHRSU0FLZXkucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBrZXkgPSBcIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cXG5cIjtcbiAgICAgICAga2V5ICs9IEpTRW5jcnlwdFJTQUtleS53b3Jkd3JhcCh0aGlzLmdldFByaXZhdGVCYXNlS2V5QjY0KCkpICsgXCJcXG5cIjtcbiAgICAgICAga2V5ICs9IFwiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cIjtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBwZW0gZW5jb2RlZCBwdWJsaWMga2V5XG4gICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBlbSBlbmNvZGVkIHB1YmxpYyBrZXkgd2l0aCBoZWFkZXIvZm9vdGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS5wcm90b3R5cGUuZ2V0UHVibGljS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5ID0gXCItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcblwiO1xuICAgICAgICBrZXkgKz0gSlNFbmNyeXB0UlNBS2V5LndvcmR3cmFwKHRoaXMuZ2V0UHVibGljQmFzZUtleUI2NCgpKSArIFwiXFxuXCI7XG4gICAgICAgIGtleSArPSBcIi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVwiO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBjb250YWlucyB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgdG8gcG9wdWxhdGUgdGhlIHJzYSBtb2R1bHVzXG4gICAgICogYW5kIHB1YmxpYyBleHBvbmVudCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqPXt9XSAtIEFuIG9iamVjdCB0aGF0IG1heSBjb250YWluIHRoZSB0d28gcHVibGljIGtleVxuICAgICAqIHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGJvdGggdGhlIG1vZHVsdXMgYW5kIHRoZSBwdWJsaWMgZXhwb25lbnRcbiAgICAgKiBwcm9wZXJ0aWVzIChuIGFuZCBlKVxuICAgICAqIEB0b2RvIGNoZWNrIGZvciB0eXBlcyBvZiBuIGFuZCBlLiBOIHNob3VsZCBiZSBhIHBhcnNlYWJsZSBiaWdJbnQgb2JqZWN0LCBFIHNob3VsZFxuICAgICAqIGJlIGEgcGFyc2VhYmxlIGludGVnZXIgbnVtYmVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBKU0VuY3J5cHRSU0FLZXkuaGFzUHVibGljS2V5UHJvcGVydHkgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIG9iaiA9IG9iaiB8fCB7fTtcbiAgICAgICAgcmV0dXJuIChvYmouaGFzT3duUHJvcGVydHkoXCJuXCIpICYmXG4gICAgICAgICAgICBvYmouaGFzT3duUHJvcGVydHkoXCJlXCIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBvYmplY3QgY29udGFpbnMgQUxMIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIFJTQSBrZXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmo9e31dIC0gQW4gb2JqZWN0IHRoYXQgbWF5IGNvbnRhaW4gbmluZSByc2Ega2V5XG4gICAgICogcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBvYmplY3QgY29udGFpbnMgYWxsIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZFxuICAgICAqIEB0b2RvIGNoZWNrIGZvciB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyBhbGwgdGhlIHBhcmFtZXRlcnMgYnV0IHRoZSBwdWJsaWMgZXhwb25lbnRcbiAgICAgKiBzaG91bGQgYmUgcGFyc2VhYmxlIGJpZ2ludCBvYmplY3RzLCB0aGUgcHVibGljIGV4cG9uZW50IHNob3VsZCBiZSBhIHBhcnNlYWJsZSBpbnRlZ2VyIG51bWJlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSlNFbmNyeXB0UlNBS2V5Lmhhc1ByaXZhdGVLZXlQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgb2JqID0gb2JqIHx8IHt9O1xuICAgICAgICByZXR1cm4gKG9iai5oYXNPd25Qcm9wZXJ0eShcIm5cIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcImVcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcImRcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcInBcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcInFcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcImRtcDFcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcImRtcTFcIikgJiZcbiAgICAgICAgICAgIG9iai5oYXNPd25Qcm9wZXJ0eShcImNvZWZmXCIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBwcm9wZXJ0aWVzIG9mIG9iaiBpbiB0aGUgY3VycmVudCByc2Egb2JqZWN0LiBPYmogc2hvdWxkIEFUIExFQVNUXG4gICAgICogaW5jbHVkZSB0aGUgbW9kdWx1cyBhbmQgcHVibGljIGV4cG9uZW50IChuLCBlKSBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IGNvbnRhaW5pbmcgcnNhIHBhcmFtZXRlcnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEpTRW5jcnlwdFJTQUtleS5wcm90b3R5cGUucGFyc2VQcm9wZXJ0aWVzRnJvbSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgdGhpcy5uID0gb2JqLm47XG4gICAgICAgIHRoaXMuZSA9IG9iai5lO1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KFwiZFwiKSkge1xuICAgICAgICAgICAgdGhpcy5kID0gb2JqLmQ7XG4gICAgICAgICAgICB0aGlzLnAgPSBvYmoucDtcbiAgICAgICAgICAgIHRoaXMucSA9IG9iai5xO1xuICAgICAgICAgICAgdGhpcy5kbXAxID0gb2JqLmRtcDE7XG4gICAgICAgICAgICB0aGlzLmRtcTEgPSBvYmouZG1xMTtcbiAgICAgICAgICAgIHRoaXMuY29lZmYgPSBvYmouY29lZmY7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBKU0VuY3J5cHRSU0FLZXk7XG59KFJTQUtleSkpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMgPSB7fV0gLSBBbiBvYmplY3QgdG8gY3VzdG9taXplIEpTRW5jcnlwdCBiZWhhdmlvdXJcbiAqIHBvc3NpYmxlIHBhcmFtZXRlcnMgYXJlOlxuICogLSBkZWZhdWx0X2tleV9zaXplICAgICAgICB7bnVtYmVyfSAgZGVmYXVsdDogMTAyNCB0aGUga2V5IHNpemUgaW4gYml0XG4gKiAtIGRlZmF1bHRfcHVibGljX2V4cG9uZW50IHtzdHJpbmd9ICBkZWZhdWx0OiAnMDEwMDAxJyB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBleHBvbmVudFxuICogLSBsb2cgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gZGVmYXVsdDogZmFsc2Ugd2hldGhlciBsb2cgd2Fybi9lcnJvciBvciBub3RcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgSlNFbmNyeXB0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEpTRW5jcnlwdChvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLmRlZmF1bHRfa2V5X3NpemUgPSBwYXJzZUludChvcHRpb25zLmRlZmF1bHRfa2V5X3NpemUsIDEwKSB8fCAxMDI0O1xuICAgICAgICB0aGlzLmRlZmF1bHRfcHVibGljX2V4cG9uZW50ID0gb3B0aW9ucy5kZWZhdWx0X3B1YmxpY19leHBvbmVudCB8fCBcIjAxMDAwMVwiOyAvLyA2NTUzNyBkZWZhdWx0IG9wZW5zc2wgcHVibGljIGV4cG9uZW50IGZvciByc2Ega2V5IHR5cGVcbiAgICAgICAgdGhpcy5sb2cgPSBvcHRpb25zLmxvZyB8fCBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHByaXZhdGUgYW5kIHB1YmxpYyBrZXkuXG4gICAgICAgIHRoaXMua2V5ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRvIHNldCB0aGUgcnNhIGtleSBwYXJhbWV0ZXIgKG9uZSBtZXRob2QgaXMgZW5vdWdoIHRvIHNldCBib3RoIHRoZSBwdWJsaWNcbiAgICAgKiBhbmQgdGhlIHByaXZhdGUga2V5LCBzaW5jZSB0aGUgcHJpdmF0ZSBrZXkgY29udGFpbnMgdGhlIHB1YmxpYyBrZXkgcGFyYW1lbnRlcnMpXG4gICAgICogTG9nIGEgd2FybmluZyBpZiBsb2dzIGFyZSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBrZXkgdGhlIHBlbSBlbmNvZGVkIHN0cmluZyBvciBhbiBvYmplY3QgKHdpdGggb3Igd2l0aG91dCBoZWFkZXIvZm9vdGVyKVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLnNldEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nICYmIHRoaXMua2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBIGtleSB3YXMgYWxyZWFkeSBzZXQsIG92ZXJyaWRpbmcgZXhpc3RpbmcuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5ID0gbmV3IEpTRW5jcnlwdFJTQUtleShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJveHkgbWV0aG9kIGZvciBzZXRLZXksIGZvciBhcGkgY29tcGF0aWJpbGl0eVxuICAgICAqIEBzZWUgc2V0S2V5XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdC5wcm90b3R5cGUuc2V0UHJpdmF0ZUtleSA9IGZ1bmN0aW9uIChwcml2a2V5KSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUga2V5LlxuICAgICAgICB0aGlzLnNldEtleShwcml2a2V5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByb3h5IG1ldGhvZCBmb3Igc2V0S2V5LCBmb3IgYXBpIGNvbXBhdGliaWxpdHlcbiAgICAgKiBAc2VlIHNldEtleVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLnNldFB1YmxpY0tleSA9IGZ1bmN0aW9uIChwdWJrZXkpIHtcbiAgICAgICAgLy8gU2V0cyB0aGUgcHVibGljIGtleS5cbiAgICAgICAgdGhpcy5zZXRLZXkocHVia2V5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByb3h5IG1ldGhvZCBmb3IgUlNBS2V5IG9iamVjdCdzIGRlY3J5cHQsIGRlY3J5cHQgdGhlIHN0cmluZyB1c2luZyB0aGUgcHJpdmF0ZVxuICAgICAqIGNvbXBvbmVudHMgb2YgdGhlIHJzYSBrZXkgb2JqZWN0LiBOb3RlIHRoYXQgaWYgdGhlIG9iamVjdCB3YXMgbm90IHNldCB3aWxsIGJlIGNyZWF0ZWRcbiAgICAgKiBvbiB0aGUgZmx5IChieSB0aGUgZ2V0S2V5IG1ldGhvZCkgdXNpbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBKU0VuY3J5cHQgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIGJhc2U2NCBlbmNvZGVkIGNyeXB0ZWQgc3RyaW5nIHRvIGRlY3J5cHRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBkZWNyeXB0ZWQgc3RyaW5nXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdC5wcm90b3R5cGUuZGVjcnlwdCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBkZWNyeXB0ZWQgc3RyaW5nLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0S2V5KCkuZGVjcnlwdChiNjR0b2hleChzdHIpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJveHkgbWV0aG9kIGZvciBSU0FLZXkgb2JqZWN0J3MgZW5jcnlwdCwgZW5jcnlwdCB0aGUgc3RyaW5nIHVzaW5nIHRoZSBwdWJsaWNcbiAgICAgKiBjb21wb25lbnRzIG9mIHRoZSByc2Ega2V5IG9iamVjdC4gTm90ZSB0aGF0IGlmIHRoZSBvYmplY3Qgd2FzIG5vdCBzZXQgd2lsbCBiZSBjcmVhdGVkXG4gICAgICogb24gdGhlIGZseSAoYnkgdGhlIGdldEtleSBtZXRob2QpIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbiB0aGUgSlNFbmNyeXB0IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGVuY3J5cHRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlbmNyeXB0ZWQgc3RyaW5nIGVuY29kZWQgaW4gYmFzZTY0XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdC5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBlbmNyeXB0ZWQgc3RyaW5nLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhleDJiNjQodGhpcy5nZXRLZXkoKS5lbmNyeXB0KHN0cikpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcm94eSBtZXRob2QgZm9yIFJTQUtleSBvYmplY3QncyBzaWduLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBzaWduXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZGlnZXN0TWV0aG9kIGhhc2ggbWV0aG9kXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRpZ2VzdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGhhc2ggYWxnb3JpdGhtXG4gICAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgc2lnbmF0dXJlIGVuY29kZWQgaW4gYmFzZTY0XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdC5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIChzdHIsIGRpZ2VzdE1ldGhvZCwgZGlnZXN0TmFtZSkge1xuICAgICAgICAvLyByZXR1cm4gdGhlIFJTQSBzaWduYXR1cmUgb2YgJ3N0cicgaW4gJ2hleCcgZm9ybWF0LlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhleDJiNjQodGhpcy5nZXRLZXkoKS5zaWduKHN0ciwgZGlnZXN0TWV0aG9kLCBkaWdlc3ROYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByb3h5IG1ldGhvZCBmb3IgUlNBS2V5IG9iamVjdCdzIHZlcmlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdmVyaWZ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIGVuY29kZWQgaW4gYmFzZTY0IHRvIGNvbXBhcmUgdGhlIHN0cmluZyB0b1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGRpZ2VzdE1ldGhvZCBoYXNoIG1ldGhvZFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGRhdGEgYW5kIHNpZ25hdHVyZSBtYXRjaFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIChzdHIsIHNpZ25hdHVyZSwgZGlnZXN0TWV0aG9kKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgZGVjcnlwdGVkICdkaWdlc3QnIG9mIHRoZSBzaWduYXR1cmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRLZXkoKS52ZXJpZnkoc3RyLCBiNjR0b2hleChzaWduYXR1cmUpLCBkaWdlc3RNZXRob2QpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXR0ZXIgZm9yIHRoZSBjdXJyZW50IEpTRW5jcnlwdFJTQUtleSBvYmplY3QuIElmIGl0IGRvZXNuJ3QgZXhpc3RzIGEgbmV3IG9iamVjdFxuICAgICAqIHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWRcbiAgICAgKiBAcGFyYW0ge2NhbGxiYWNrfSBbY2JdIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgaWYgd2Ugd2FudCB0aGUga2V5IHRvIGJlIGdlbmVyYXRlZFxuICAgICAqIGluIGFuIGFzeW5jIGZhc2hpb25cbiAgICAgKiBAcmV0dXJucyB7SlNFbmNyeXB0UlNBS2V5fSB0aGUgSlNFbmNyeXB0UlNBS2V5IG9iamVjdFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLmdldEtleSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAvLyBPbmx5IGNyZWF0ZSBuZXcgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICAgIGlmICghdGhpcy5rZXkpIHtcbiAgICAgICAgICAgIC8vIEdldCBhIG5ldyBwcml2YXRlIGtleS5cbiAgICAgICAgICAgIHRoaXMua2V5ID0gbmV3IEpTRW5jcnlwdFJTQUtleSgpO1xuICAgICAgICAgICAgaWYgKGNiICYmIHt9LnRvU3RyaW5nLmNhbGwoY2IpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleS5nZW5lcmF0ZUFzeW5jKHRoaXMuZGVmYXVsdF9rZXlfc2l6ZSwgdGhpcy5kZWZhdWx0X3B1YmxpY19leHBvbmVudCwgY2IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBrZXkuXG4gICAgICAgICAgICB0aGlzLmtleS5nZW5lcmF0ZSh0aGlzLmRlZmF1bHRfa2V5X3NpemUsIHRoaXMuZGVmYXVsdF9wdWJsaWNfZXhwb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmtleTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBlbSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleVxuICAgICAqIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdHMgYSBuZXcga2V5IHdpbGwgYmUgY3JlYXRlZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHBlbSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleSBXSVRIIGhlYWRlciBhbmQgZm9vdGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIEpTRW5jcnlwdC5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwcml2YXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQcml2YXRlS2V5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwZW0gZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICAgKiBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3RzIGEgbmV3IGtleSB3aWxsIGJlIGNyZWF0ZWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBwZW0gZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpdmF0ZSBrZXkgV0lUSE9VVCBoZWFkZXIgYW5kIGZvb3RlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLmdldFByaXZhdGVLZXlCNjQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcHJpdmF0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGtleS5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0S2V5KCkuZ2V0UHJpdmF0ZUJhc2VLZXlCNjQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBlbSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMga2V5XG4gICAgICogSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0cyBhIG5ldyBrZXkgd2lsbCBiZSBjcmVhdGVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gcGVtIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgV0lUSCBoZWFkZXIgYW5kIGZvb3RlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwcml2YXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQdWJsaWNLZXkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBlbSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMga2V5XG4gICAgICogSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0cyBhIG5ldyBrZXkgd2lsbCBiZSBjcmVhdGVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gcGVtIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgV0lUSE9VVCBoZWFkZXIgYW5kIGZvb3RlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBKU0VuY3J5cHQucHJvdG90eXBlLmdldFB1YmxpY0tleUI2NCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwcml2YXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5LlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRLZXkoKS5nZXRQdWJsaWNCYXNlS2V5QjY0KCk7XG4gICAgfTtcbiAgICBKU0VuY3J5cHQudmVyc2lvbiA9IFwiMy4wLjAtcmMuMVwiO1xuICAgIHJldHVybiBKU0VuY3J5cHQ7XG59KCkpO1xuXG53aW5kb3cuSlNFbmNyeXB0ID0gSlNFbmNyeXB0O1xuXG5leHBvcnRzLkpTRW5jcnlwdCA9IEpTRW5jcnlwdDtcbmV4cG9ydHMuZGVmYXVsdCA9IEpTRW5jcnlwdDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBLFVBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_jsencrypt@3.0.0-rc.1@jsencrypt/bin/jsencrypt.js\n");
/***/ }),
/***/ "./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js":
/*!********************************************************!*\
!*** ./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global require, module, window */\n\tvar Handler = __webpack_require__(1)\n\tvar Util = __webpack_require__(3)\n\tvar Random = __webpack_require__(5)\n\tvar RE = __webpack_require__(20)\n\tvar toJSONSchema = __webpack_require__(23)\n\tvar valid = __webpack_require__(25)\n\n\tvar XHR\n\tif (typeof window !== 'undefined') XHR = __webpack_require__(27)\n\n\t/*!\n\t Mock - 模拟请求 & 模拟数据\n\t https://github.com/nuysoft/Mock\n\t 墨智 mozhi.gyy@taobao.com nuysoft@gmail.com\n\t*/\n\tvar Mock = {\n\t Handler: Handler,\n\t Random: Random,\n\t Util: Util,\n\t XHR: XHR,\n\t RE: RE,\n\t toJSONSchema: toJSONSchema,\n\t valid: valid,\n\t heredoc: Util.heredoc,\n\t setup: function(settings) {\n\t return XHR.setup(settings)\n\t },\n\t _mocked: {}\n\t}\n\n\tMock.version = '1.0.1-beta3'\n\n\t// 避免循环依赖\n\tif (XHR) XHR.Mock = Mock\n\n\t/*\n\t * Mock.mock( template )\n\t * Mock.mock( function() )\n\t * Mock.mock( rurl, template )\n\t * Mock.mock( rurl, function(options) )\n\t * Mock.mock( rurl, rtype, template )\n\t * Mock.mock( rurl, rtype, function(options) )\n\n\t 根据数据模板生成模拟数据。\n\t*/\n\tMock.mock = function(rurl, rtype, template) {\n\t // Mock.mock(template)\n\t if (arguments.length === 1) {\n\t return Handler.gen(rurl)\n\t }\n\t // Mock.mock(rurl, template)\n\t if (arguments.length === 2) {\n\t template = rtype\n\t rtype = undefined\n\t }\n\t // 拦截 XHR\n\t if (XHR) window.XMLHttpRequest = XHR\n\t Mock._mocked[rurl + (rtype || '')] = {\n\t rurl: rurl,\n\t rtype: rtype,\n\t template: template\n\t }\n\t return Mock\n\t}\n\n\tmodule.exports = Mock\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* \n\t ## Handler\n\n\t 处理数据模板。\n\t \n\t * Handler.gen( template, name?, context? )\n\n\t 入口方法。\n\n\t * Data Template Definition, DTD\n\t \n\t 处理数据模板定义。\n\n\t * Handler.array( options )\n\t * Handler.object( options )\n\t * Handler.number( options )\n\t * Handler.boolean( options )\n\t * Handler.string( options )\n\t * Handler.function( options )\n\t * Handler.regexp( options )\n\t \n\t 处理路径(相对和绝对)。\n\n\t * Handler.getValueByKeyPath( key, options )\n\n\t * Data Placeholder Definition, DPD\n\n\t 处理数据占位符定义\n\n\t * Handler.placeholder( placeholder, context, templateContext, options )\n\n\t*/\n\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar Parser = __webpack_require__(4)\n\tvar Random = __webpack_require__(5)\n\tvar RE = __webpack_require__(20)\n\n\tvar Handler = {\n\t extend: Util.extend\n\t}\n\n\t/*\n\t template 属性值(即数据模板)\n\t name 属性名\n\t context 数据上下文,生成后的数据\n\t templateContext 模板上下文,\n\n\t Handle.gen(template, name, options)\n\t context\n\t currentContext, templateCurrentContext, \n\t path, templatePath\n\t root, templateRoot\n\t*/\n\tHandler.gen = function(template, name, context) {\n\t /* jshint -W041 */\n\t name = name == undefined ? '' : (name + '')\n\n\t context = context || {}\n\t context = {\n\t // 当前访问路径,只有属性名,不包括生成规则\n\t path: context.path || [Constant.GUID],\n\t templatePath: context.templatePath || [Constant.GUID++],\n\t // 最终属性值的上下文\n\t currentContext: context.currentContext,\n\t // 属性值模板的上下文\n\t templateCurrentContext: context.templateCurrentContext || template,\n\t // 最终值的根\n\t root: context.root || context.currentContext,\n\t // 模板的根\n\t templateRoot: context.templateRoot || context.templateCurrentContext || template\n\t }\n\t // console.log('path:', context.path.join('.'), template)\n\n\t var rule = Parser.parse(name)\n\t var type = Util.type(template)\n\t var data\n\n\t if (Handler[type]) {\n\t data = Handler[type]({\n\t // 属性值类型\n\t type: type,\n\t // 属性值模板\n\t template: template,\n\t // 属性名 + 生成规则\n\t name: name,\n\t // 属性名\n\t parsedName: name ? name.replace(Constant.RE_KEY, '$1') : name,\n\n\t // 解析后的生成规则\n\t rule: rule,\n\t // 相关上下文\n\t context: context\n\t })\n\n\t if (!context.root) context.root = data\n\t return data\n\t }\n\n\t return template\n\t}\n\n\tHandler.extend({\n\t array: function(options) {\n\t var result = [],\n\t i, ii;\n\n\t // 'name|1': []\n\t // 'name|count': []\n\t // 'name|min-max': []\n\t if (options.template.length === 0) return result\n\n\t // 'arr': [{ 'email': '@EMAIL' }, { 'email': '@EMAIL' }]\n\t if (!options.rule.parameters) {\n\t for (i = 0; i < options.template.length; i++) {\n\t options.context.path.push(i)\n\t options.context.templatePath.push(i)\n\t result.push(\n\t Handler.gen(options.template[i], i, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })\n\t )\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\t }\n\t } else {\n\t // 'method|1': ['GET', 'POST', 'HEAD', 'DELETE']\n\t if (options.rule.min === 1 && options.rule.max === undefined) {\n\t // fix #17\n\t options.context.path.push(options.name)\n\t options.context.templatePath.push(options.name)\n\t result = Random.pick(\n\t Handler.gen(options.template, undefined, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })\n\t )\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\t } else {\n\t // 'data|+1': [{}, {}]\n\t if (options.rule.parameters[2]) {\n\t options.template.__order_index = options.template.__order_index || 0\n\n\t options.context.path.push(options.name)\n\t options.context.templatePath.push(options.name)\n\t result = Handler.gen(options.template, undefined, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })[\n\t options.template.__order_index % options.template.length\n\t ]\n\n\t options.template.__order_index += +options.rule.parameters[2]\n\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\n\t } else {\n\t // 'data|1-10': [{}]\n\t for (i = 0; i < options.rule.count; i++) {\n\t // 'data|1-10': [{}, {}]\n\t for (ii = 0; ii < options.template.length; ii++) {\n\t options.context.path.push(result.length)\n\t options.context.templatePath.push(ii)\n\t result.push(\n\t Handler.gen(options.template[ii], result.length, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })\n\t )\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\t }\n\t }\n\t }\n\t }\n\t }\n\t return result\n\t },\n\t object: function(options) {\n\t var result = {},\n\t keys, fnKeys, key, parsedKey, inc, i;\n\n\t // 'obj|min-max': {}\n\t /* jshint -W041 */\n\t if (options.rule.min != undefined) {\n\t keys = Util.keys(options.template)\n\t keys = Random.shuffle(keys)\n\t keys = keys.slice(0, options.rule.count)\n\t for (i = 0; i < keys.length; i++) {\n\t key = keys[i]\n\t parsedKey = key.replace(Constant.RE_KEY, '$1')\n\t options.context.path.push(parsedKey)\n\t options.context.templatePath.push(key)\n\t result[parsedKey] = Handler.gen(options.template[key], key, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\t }\n\n\t } else {\n\t // 'obj': {}\n\t keys = []\n\t fnKeys = [] // #25 改变了非函数属性的顺序,查找起来不方便\n\t for (key in options.template) {\n\t (typeof options.template[key] === 'function' ? fnKeys : keys).push(key)\n\t }\n\t keys = keys.concat(fnKeys)\n\n\t /*\n\t 会改变非函数属性的顺序\n\t keys = Util.keys(options.template)\n\t keys.sort(function(a, b) {\n\t var afn = typeof options.template[a] === 'function'\n\t var bfn = typeof options.template[b] === 'function'\n\t if (afn === bfn) return 0\n\t if (afn && !bfn) return 1\n\t if (!afn && bfn) return -1\n\t })\n\t */\n\n\t for (i = 0; i < keys.length; i++) {\n\t key = keys[i]\n\t parsedKey = key.replace(Constant.RE_KEY, '$1')\n\t options.context.path.push(parsedKey)\n\t options.context.templatePath.push(key)\n\t result[parsedKey] = Handler.gen(options.template[key], key, {\n\t path: options.context.path,\n\t templatePath: options.context.templatePath,\n\t currentContext: result,\n\t templateCurrentContext: options.template,\n\t root: options.context.root || result,\n\t templateRoot: options.context.templateRoot || options.template\n\t })\n\t options.context.path.pop()\n\t options.context.templatePath.pop()\n\t // 'id|+1': 1\n\t inc = key.match(Constant.RE_KEY)\n\t if (inc && inc[2] && Util.type(options.template[key]) === 'number') {\n\t options.template[key] += parseInt(inc[2], 10)\n\t }\n\t }\n\t }\n\t return result\n\t },\n\t number: function(options) {\n\t var result, parts;\n\t if (options.rule.decimal) { // float\n\t options.template += ''\n\t parts = options.template.split('.')\n\t // 'float1|.1-10': 10,\n\t // 'float2|1-100.1-10': 1,\n\t // 'float3|999.1-10': 1,\n\t // 'float4|.3-10': 123.123,\n\t parts[0] = options.rule.range ? options.rule.count : parts[0]\n\t parts[1] = (parts[1] || '').slice(0, options.rule.dcount)\n\t while (parts[1].length < options.rule.dcount) {\n\t parts[1] += (\n\t // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。\n\t (parts[1].length < options.rule.dcount - 1) ? Random.character('number') : Random.character('123456789')\n\t )\n\t }\n\t result = parseFloat(parts.join('.'), 10)\n\t } else { // integer\n\t // 'grade1|1-100': 1,\n\t result = options.rule.range && !options.rule.parameters[2] ? options.rule.count : options.template\n\t }\n\t return result\n\t },\n\t boolean: function(options) {\n\t var result;\n\t // 'prop|multiple': false, 当前值是相反值的概率倍数\n\t // 'prop|probability-probability': false, 当前值与相反值的概率\n\t result = options.rule.parameters ? Random.bool(options.rule.min, options.rule.max, options.template) : options.template\n\t return result\n\t },\n\t string: function(options) {\n\t var result = '',\n\t i, placeholders, ph, phed;\n\t if (options.template.length) {\n\n\t // 'foo': '★',\n\t /* jshint -W041 */\n\t if (options.rule.count == undefined) {\n\t result += options.template\n\t }\n\n\t // 'star|1-5': '★',\n\t for (i = 0; i < options.rule.count; i++) {\n\t result += options.template\n\t }\n\t // 'email|1-10': '@EMAIL, ',\n\t placeholders = result.match(Constant.RE_PLACEHOLDER) || [] // A-Z_0-9 > \\w_\n\t for (i = 0; i < placeholders.length; i++) {\n\t ph = placeholders[i]\n\n\t // 遇到转义斜杠,不需要解析占位符\n\t if (/^\\\\/.test(ph)) {\n\t placeholders.splice(i--, 1)\n\t continue\n\t }\n\n\t phed = Handler.placeholder(ph, options.context.currentContext, options.context.templateCurrentContext, options)\n\n\t // 只有一个占位符,并且没有其他字符\n\t if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { // \n\t result = phed\n\t break\n\n\t if (Util.isNumeric(phed)) {\n\t result = parseFloat(phed, 10)\n\t break\n\t }\n\t if (/^(true|false)$/.test(phed)) {\n\t result = phed === 'true' ? true :\n\t phed === 'false' ? false :\n\t phed // 已经是布尔值\n\t break\n\t }\n\t }\n\t result = result.replace(ph, phed)\n\t }\n\n\t } else {\n\t // 'ASCII|1-10': '',\n\t // 'ASCII': '',\n\t result = options.rule.range ? Random.string(options.rule.count) : options.template\n\t }\n\t return result\n\t },\n\t 'function': function(options) {\n\t // ( context, options )\n\t return options.template.call(options.context.currentContext, options)\n\t },\n\t 'regexp': function(options) {\n\t var source = ''\n\n\t // 'name': /regexp/,\n\t /* jshint -W041 */\n\t if (options.rule.count == undefined) {\n\t source += options.template.source // regexp.source\n\t }\n\n\t // 'name|1-5': /regexp/,\n\t for (var i = 0; i < options.rule.count; i++) {\n\t source += options.template.source\n\t }\n\n\t return RE.Handler.gen(\n\t RE.Parser.parse(\n\t source\n\t )\n\t )\n\t }\n\t})\n\n\tHandler.extend({\n\t _all: function() {\n\t var re = {};\n\t for (var key in Random) re[key.toLowerCase()] = key\n\t return re\n\t },\n\t // 处理占位符,转换为最终值\n\t placeholder: function(placeholder, obj, templateContext, options) {\n\t // console.log(options.context.path)\n\t // 1 key, 2 params\n\t Constant.RE_PLACEHOLDER.exec('')\n\t var parts = Constant.RE_PLACEHOLDER.exec(placeholder),\n\t key = parts && parts[1],\n\t lkey = key && key.toLowerCase(),\n\t okey = this._all()[lkey],\n\t params = parts && parts[2] || ''\n\t var pathParts = this.splitPathToArray(key)\n\n\t // 解析占位符的参数\n\t try {\n\t // 1. 尝试保持参数的类型\n\t /*\n\t #24 [Window Firefox 30.0 引用 占位符 抛错](https://github.com/nuysoft/Mock/issues/24)\n\t [BX9056: 各浏览器下 window.eval 方法的执行上下文存在差异](http://www.w3help.org/zh-cn/causes/BX9056)\n\t 应该属于 Window Firefox 30.0 的 BUG\n\t */\n\t /* jshint -W061 */\n\t params = eval('(function(){ return [].splice.call(arguments, 0 ) })(' + params + ')')\n\t } catch (error) {\n\t // 2. 如果失败,只能解析为字符串\n\t // console.error(error)\n\t // if (error instanceof ReferenceError) params = parts[2].split(/,\\s*/);\n\t // else throw error\n\t params = parts[2].split(/,\\s*/)\n\t }\n\n\t // 占位符优先引用数据模板中的属性\n\t if (obj && (key in obj)) return obj[key]\n\n\t // @index @key\n\t // if (Constant.RE_INDEX.test(key)) return +options.name\n\t // if (Constant.RE_KEY.test(key)) return options.name\n\n\t // 绝对路径 or 相对路径\n\t if (\n\t key.charAt(0) === '/' ||\n\t pathParts.length > 1\n\t ) return this.getValueByKeyPath(key, options)\n\n\t // 递归引用数据模板中的属性\n\t if (templateContext &&\n\t (typeof templateContext === 'object') &&\n\t (key in templateContext) &&\n\t (placeholder !== templateContext[key]) // fix #15 避免自己依赖自己\n\t ) {\n\t // 先计算被引用的属性值\n\t templateContext[key] = Handler.gen(templateContext[key], key, {\n\t currentContext: obj,\n\t templateCurrentContext: templateContext\n\t })\n\t return templateContext[key]\n\t }\n\n\t // 如果未找到,则原样返回\n\t if (!(key in Random) && !(lkey in Random) && !(okey in Random)) return placeholder\n\n\t // 递归解析参数中的占位符\n\t for (var i = 0; i < params.length; i++) {\n\t Constant.RE_PLACEHOLDER.exec('')\n\t if (Constant.RE_PLACEHOLDER.test(params[i])) {\n\t params[i] = Handler.placeholder(params[i], obj, templateContext, options)\n\t }\n\t }\n\n\t var handle = Random[key] || Random[lkey] || Random[okey]\n\t switch (Util.type(handle)) {\n\t case 'array':\n\t // 自动从数组中取一个,例如 @areas\n\t return Random.pick(handle)\n\t case 'function':\n\t // 执行占位符方法(大多数情况)\n\t handle.options = options\n\t var re = handle.apply(Random, params)\n\t if (re === undefined) re = '' // 因为是在字符串中,所以默认为空字符串。\n\t delete handle.options\n\t return re\n\t }\n\t },\n\t getValueByKeyPath: function(key, options) {\n\t var originalKey = key\n\t var keyPathParts = this.splitPathToArray(key)\n\t var absolutePathParts = []\n\n\t // 绝对路径\n\t if (key.charAt(0) === '/') {\n\t absolutePathParts = [options.context.path[0]].concat(\n\t this.normalizePath(keyPathParts)\n\t )\n\t } else {\n\t // 相对路径\n\t if (keyPathParts.length > 1) {\n\t absolutePathParts = options.context.path.slice(0)\n\t absolutePathParts.pop()\n\t absolutePathParts = this.normalizePath(\n\t absolutePathParts.concat(keyPathParts)\n\t )\n\n\t }\n\t }\n\n\t try {\n\t key = keyPathParts[keyPathParts.length - 1]\n\t var currentContext = options.context.root\n\t var templateCurrentContext = options.context.templateRoot\n\t for (var i = 1; i < absolutePathParts.length - 1; i++) {\n\t currentContext = currentContext[absolutePathParts[i]]\n\t templateCurrentContext = templateCurrentContext[absolutePathParts[i]]\n\t }\n\t // 引用的值已经计算好\n\t if (currentContext && (key in currentContext)) return currentContext[key]\n\t \n\t // 尚未计算,递归引用数据模板中的属性\n\t if (templateCurrentContext &&\n\t (typeof templateCurrentContext === 'object') &&\n\t (key in templateCurrentContext) &&\n\t (originalKey !== templateCurrentContext[key]) // fix #15 避免自己依赖自己\n\t ) {\n\t // 先计算被引用的属性值\n\t templateCurrentContext[key] = Handler.gen(templateCurrentContext[key], key, {\n\t currentContext: currentContext,\n\t templateCurrentContext: templateCurrentContext\n\t })\n\t return templateCurrentContext[key]\n\t }\n\t } catch(err) { }\n\n\t return '@' + keyPathParts.join('/')\n\t },\n\t // https://github.com/kissyteam/kissy/blob/master/src/path/src/path.js\n\t normalizePath: function(pathParts) {\n\t var newPathParts = []\n\t for (var i = 0; i < pathParts.length; i++) {\n\t switch (pathParts[i]) {\n\t case '..':\n\t newPathParts.pop()\n\t break\n\t case '.':\n\t break\n\t default:\n\t newPathParts.push(pathParts[i])\n\t }\n\t }\n\t return newPathParts\n\t },\n\t splitPathToArray: function(path) {\n\t var parts = path.split(/\\/+/);\n\t if (!parts[parts.length - 1]) parts = parts.slice(0, -1)\n\t if (!parts[0]) parts = parts.slice(1)\n\t return parts;\n\t }\n\t})\n\n\tmodule.exports = Handler\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Constant\n\n\t 常量集合。\n\t */\n\t/*\n\t RE_KEY\n\t 'name|min-max': value\n\t 'name|count': value\n\t 'name|min-max.dmin-dmax': value\n\t 'name|min-max.dcount': value\n\t 'name|count.dmin-dmax': value\n\t 'name|count.dcount': value\n\t 'name|+step': value\n\n\t 1 name, 2 step, 3 range [ min, max ], 4 drange [ dmin, dmax ]\n\n\t RE_PLACEHOLDER\n\t placeholder(*)\n\n\t [正则查看工具](http://www.regexper.com/)\n\n\t #26 生成规则 支持 负数,例如 number|-100-100\n\t*/\n\tmodule.exports = {\n\t GUID: 1,\n\t RE_KEY: /(.+)\\|(?:\\+(\\d+)|([\\+\\-]?\\d+-?[\\+\\-]?\\d*)?(?:\\.(\\d+-?\\d*))?)/,\n\t RE_RANGE: /([\\+\\-]?\\d+)-?([\\+\\-]?\\d+)?/,\n\t RE_PLACEHOLDER: /\\\\*@([^@#%&()\\?\\s]+)(?:\\((.*?)\\))?/g\n\t // /\\\\*@([^@#%&()\\?\\s\\/\\.]+)(?:\\((.*?)\\))?/g\n\t // RE_INDEX: /^index$/,\n\t // RE_KEY: /^key$/\n\t}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Utilities\n\t*/\n\tvar Util = {}\n\n\tUtil.extend = function extend() {\n\t var target = arguments[0] || {},\n\t i = 1,\n\t length = arguments.length,\n\t options, name, src, copy, clone\n\n\t if (length === 1) {\n\t target = this\n\t i = 0\n\t }\n\n\t for (; i < length; i++) {\n\t options = arguments[i]\n\t if (!options) continue\n\n\t for (name in options) {\n\t src = target[name]\n\t copy = options[name]\n\n\t if (target === copy) continue\n\t if (copy === undefined) continue\n\n\t if (Util.isArray(copy) || Util.isObject(copy)) {\n\t if (Util.isArray(copy)) clone = src && Util.isArray(src) ? src : []\n\t if (Util.isObject(copy)) clone = src && Util.isObject(src) ? src : {}\n\n\t target[name] = Util.extend(clone, copy)\n\t } else {\n\t target[name] = copy\n\t }\n\t }\n\t }\n\n\t return target\n\t}\n\n\tUtil.each = function each(obj, iterator, context) {\n\t var i, key\n\t if (this.type(obj) === 'number') {\n\t for (i = 0; i < obj; i++) {\n\t iterator(i, i)\n\t }\n\t } else if (obj.length === +obj.length) {\n\t for (i = 0; i < obj.length; i++) {\n\t if (iterator.call(context, obj[i], i, obj) === false) break\n\t }\n\t } else {\n\t for (key in obj) {\n\t if (iterator.call(context, obj[key], key, obj) === false) break\n\t }\n\t }\n\t}\n\n\tUtil.type = function type(obj) {\n\t return (obj === null || obj === undefined) ? String(obj) : Object.prototype.toString.call(obj).match(/\\[object (\\w+)\\]/)[1].toLowerCase()\n\t}\n\n\tUtil.each('String Object Array RegExp Function'.split(' '), function(value) {\n\t Util['is' + value] = function(obj) {\n\t return Util.type(obj) === value.toLowerCase()\n\t }\n\t})\n\n\tUtil.isObjectOrArray = function(value) {\n\t return Util.isObject(value) || Util.isArray(value)\n\t}\n\n\tUtil.isNumeric = function(value) {\n\t return !isNaN(parseFloat(value)) && isFinite(value)\n\t}\n\n\tUtil.keys = function(obj) {\n\t var keys = [];\n\t for (var key in obj) {\n\t if (obj.hasOwnProperty(key)) keys.push(key)\n\t }\n\t return keys;\n\t}\n\tUtil.values = function(obj) {\n\t var values = [];\n\t for (var key in obj) {\n\t if (obj.hasOwnProperty(key)) values.push(obj[key])\n\t }\n\t return values;\n\t}\n\n\t/*\n\t ### Mock.heredoc(fn)\n\n\t * Mock.heredoc(fn)\n\n\t 以直观、安全的方式书写(多行)HTML 模板。\n\n\t **使用示例**如下所示:\n\n\t var tpl = Mock.heredoc(function() {\n\t /*!\n\t {{email}}{{age}}\n\t <!-- Mock { \n\t email: '@EMAIL',\n\t age: '@INT(1,100)'\n\t } -->\n\t *\\/\n\t })\n\t \n\t **相关阅读**\n\t * [Creating multiline strings in JavaScript](http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)、\n\t*/\n\tUtil.heredoc = function heredoc(fn) {\n\t // 1. 移除起始的 function(){ /*!\n\t // 2. 移除末尾的 */ }\n\t // 3. 移除起始和末尾的空格\n\t return fn.toString()\n\t .replace(/^[^\\/]+\\/\\*!?/, '')\n\t .replace(/\\*\\/[^\\/]+$/, '')\n\t .replace(/^[\\s\\xA0]+/, '').replace(/[\\s\\xA0]+$/, '') // .trim()\n\t}\n\n\tUtil.noop = function() {}\n\n\tmodule.exports = Util\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t\t## Parser\n\n\t\t解析数据模板(属性名部分)。\n\n\t\t* Parser.parse( name )\n\t\t\t\n\t\t\t```json\n\t\t\t{\n\t\t\t\tparameters: [ name, inc, range, decimal ],\n\t\t\t\trnage: [ min , max ],\n\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\tcount : count,\n\n\t\t\t\tdecimal: decimal,\n\t\t\t\tdmin: dmin,\n\t\t\t\tdmax: dmax,\n\t\t\t\tdcount: dcount\n\t\t\t}\n\t\t\t```\n\t */\n\n\tvar Constant = __webpack_require__(2)\n\tvar Random = __webpack_require__(5)\n\n\t/* jshint -W041 */\n\tmodule.exports = {\n\t\tparse: function(name) {\n\t\t\tname = name == undefined ? '' : (name + '')\n\n\t\t\tvar parameters = (name || '').match(Constant.RE_KEY)\n\n\t\t\tvar range = parameters && parameters[3] && parameters[3].match(Constant.RE_RANGE)\n\t\t\tvar min = range && range[1] && parseInt(range[1], 10) // || 1\n\t\t\tvar max = range && range[2] && parseInt(range[2], 10) // || 1\n\t\t\t\t// repeat || min-max || 1\n\t\t\t\t// var count = range ? !range[2] && parseInt(range[1], 10) || Random.integer(min, max) : 1\n\t\t\tvar count = range ? !range[2] ? parseInt(range[1], 10) : Random.integer(min, max) : undefined\n\n\t\t\tvar decimal = parameters && parameters[4] && parameters[4].match(Constant.RE_RANGE)\n\t\t\tvar dmin = decimal && decimal[1] && parseInt(decimal[1], 10) // || 0,\n\t\t\tvar dmax = decimal && decimal[2] && parseInt(decimal[2], 10) // || 0,\n\t\t\t\t// int || dmin-dmax || 0\n\t\t\tvar dcount = decimal ? !decimal[2] && parseInt(decimal[1], 10) || Random.integer(dmin, dmax) : undefined\n\n\t\t\tvar result = {\n\t\t\t\t// 1 name, 2 inc, 3 range, 4 decimal\n\t\t\t\tparameters: parameters,\n\t\t\t\t// 1 min, 2 max\n\t\t\t\trange: range,\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\t// min-max\n\t\t\t\tcount: count,\n\t\t\t\t// 是否有 decimal\n\t\t\t\tdecimal: decimal,\n\t\t\t\tdmin: dmin,\n\t\t\t\tdmax: dmax,\n\t\t\t\t// dmin-dimax\n\t\t\t\tdcount: dcount\n\t\t\t}\n\n\t\t\tfor (var r in result) {\n\t\t\t\tif (result[r] != undefined) return result\n\t\t\t}\n\n\t\t\treturn {}\n\t\t}\n\t}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Mock.Random\n\t \n\t 工具类,用于生成各种随机数据。\n\t*/\n\n\tvar Util = __webpack_require__(3)\n\n\tvar Random = {\n\t extend: Util.extend\n\t}\n\n\tRandom.extend(__webpack_require__(6))\n\tRandom.extend(__webpack_require__(7))\n\tRandom.extend(__webpack_require__(8))\n\tRandom.extend(__webpack_require__(10))\n\tRandom.extend(__webpack_require__(13))\n\tRandom.extend(__webpack_require__(15))\n\tRandom.extend(__webpack_require__(16))\n\tRandom.extend(__webpack_require__(17))\n\tRandom.extend(__webpack_require__(14))\n\tRandom.extend(__webpack_require__(19))\n\n\tmodule.exports = Random\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Basics\n\t*/\n\tmodule.exports = {\n\t // 返回一个随机的布尔值。\n\t boolean: function(min, max, cur) {\n\t if (cur !== undefined) {\n\t min = typeof min !== 'undefined' && !isNaN(min) ? parseInt(min, 10) : 1\n\t max = typeof max !== 'undefined' && !isNaN(max) ? parseInt(max, 10) : 1\n\t return Math.random() > 1.0 / (min + max) * min ? !cur : cur\n\t }\n\n\t return Math.random() >= 0.5\n\t },\n\t bool: function(min, max, cur) {\n\t return this.boolean(min, max, cur)\n\t },\n\t // 返回一个随机的自然数(大于等于 0 的整数)。\n\t natural: function(min, max) {\n\t min = typeof min !== 'undefined' ? parseInt(min, 10) : 0\n\t max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53\n\t return Math.round(Math.random() * (max - min)) + min\n\t },\n\t // 返回一个随机的整数。\n\t integer: function(min, max) {\n\t min = typeof min !== 'undefined' ? parseInt(min, 10) : -9007199254740992\n\t max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53\n\t return Math.round(Math.random() * (max - min)) + min\n\t },\n\t int: function(min, max) {\n\t return this.integer(min, max)\n\t },\n\t // 返回一个随机的浮点数。\n\t float: function(min, max, dmin, dmax) {\n\t dmin = dmin === undefined ? 0 : dmin\n\t dmin = Math.max(Math.min(dmin, 17), 0)\n\t dmax = dmax === undefined ? 17 : dmax\n\t dmax = Math.max(Math.min(dmax, 17), 0)\n\t var ret = this.integer(min, max) + '.';\n\t for (var i = 0, dcount = this.natural(dmin, dmax); i < dcount; i++) {\n\t ret += (\n\t // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。\n\t (i < dcount - 1) ? this.character('number') : this.character('123456789')\n\t )\n\t }\n\t return parseFloat(ret, 10)\n\t },\n\t // 返回一个随机字符。\n\t character: function(pool) {\n\t var pools = {\n\t lower: 'abcdefghijklmnopqrstuvwxyz',\n\t upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t number: '0123456789',\n\t symbol: '!@#$%^&*()[]'\n\t }\n\t pools.alpha = pools.lower + pools.upper\n\t pools['undefined'] = pools.lower + pools.upper + pools.number + pools.symbol\n\n\t pool = pools[('' + pool).toLowerCase()] || pool\n\t return pool.charAt(this.natural(0, pool.length - 1))\n\t },\n\t char: function(pool) {\n\t return this.character(pool)\n\t },\n\t // 返回一个随机字符串。\n\t string: function(pool, min, max) {\n\t var len\n\t switch (arguments.length) {\n\t case 0: // ()\n\t len = this.natural(3, 7)\n\t break\n\t case 1: // ( length )\n\t len = pool\n\t pool = undefined\n\t break\n\t case 2:\n\t // ( pool, length )\n\t if (typeof arguments[0] === 'string') {\n\t len = min\n\t } else {\n\t // ( min, max )\n\t len = this.natural(pool, min)\n\t pool = undefined\n\t }\n\t break\n\t case 3:\n\t len = this.natural(min, max)\n\t break\n\t }\n\n\t var text = ''\n\t for (var i = 0; i < len; i++) {\n\t text += this.character(pool)\n\t }\n\n\t return text\n\t },\n\t str: function( /*pool, min, max*/ ) {\n\t return this.string.apply(this, arguments)\n\t },\n\t // 返回一个整型数组。\n\t range: function(start, stop, step) {\n\t // range( stop )\n\t if (arguments.length <= 1) {\n\t stop = start || 0;\n\t start = 0;\n\t }\n\t // range( start, stop )\n\t step = arguments[2] || 1;\n\n\t start = +start\n\t stop = +stop\n\t step = +step\n\n\t var len = Math.max(Math.ceil((stop - start) / step), 0);\n\t var idx = 0;\n\t var range = new Array(len);\n\n\t while (idx < len) {\n\t range[idx++] = start;\n\t start += step;\n\t }\n\n\t return range;\n\t }\n\t}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Date\n\t*/\n\tvar patternLetters = {\n\t yyyy: 'getFullYear',\n\t yy: function(date) {\n\t return ('' + date.getFullYear()).slice(2)\n\t },\n\t y: 'yy',\n\n\t MM: function(date) {\n\t var m = date.getMonth() + 1\n\t return m < 10 ? '0' + m : m\n\t },\n\t M: function(date) {\n\t return date.getMonth() + 1\n\t },\n\n\t dd: function(date) {\n\t var d = date.getDate()\n\t return d < 10 ? '0' + d : d\n\t },\n\t d: 'getDate',\n\n\t HH: function(date) {\n\t var h = date.getHours()\n\t return h < 10 ? '0' + h : h\n\t },\n\t H: 'getHours',\n\t hh: function(date) {\n\t var h = date.getHours() % 12\n\t return h < 10 ? '0' + h : h\n\t },\n\t h: function(date) {\n\t return date.getHours() % 12\n\t },\n\n\t mm: function(date) {\n\t var m = date.getMinutes()\n\t return m < 10 ? '0' + m : m\n\t },\n\t m: 'getMinutes',\n\n\t ss: function(date) {\n\t var s = date.getSeconds()\n\t return s < 10 ? '0' + s : s\n\t },\n\t s: 'getSeconds',\n\n\t SS: function(date) {\n\t var ms = date.getMilliseconds()\n\t return ms < 10 && '00' + ms || ms < 100 && '0' + ms || ms\n\t },\n\t S: 'getMilliseconds',\n\n\t A: function(date) {\n\t return date.getHours() < 12 ? 'AM' : 'PM'\n\t },\n\t a: function(date) {\n\t return date.getHours() < 12 ? 'am' : 'pm'\n\t },\n\t T: 'getTime'\n\t}\n\tmodule.exports = {\n\t // 日期占位符集合。\n\t _patternLetters: patternLetters,\n\t // 日期占位符正则。\n\t _rformat: new RegExp((function() {\n\t var re = []\n\t for (var i in patternLetters) re.push(i)\n\t return '(' + re.join('|') + ')'\n\t })(), 'g'),\n\t // 格式化日期。\n\t _formatDate: function(date, format) {\n\t return format.replace(this._rformat, function creatNewSubString($0, flag) {\n\t return typeof patternLetters[flag] === 'function' ? patternLetters[flag](date) :\n\t patternLetters[flag] in patternLetters ? creatNewSubString($0, patternLetters[flag]) :\n\t date[patternLetters[flag]]()\n\t })\n\t },\n\t // 生成一个随机的 Date 对象。\n\t _randomDate: function(min, max) { // min, max\n\t min = min === undefined ? new Date(0) : min\n\t max = max === undefined ? new Date() : max\n\t return new Date(Math.random() * (max.getTime() - min.getTime()))\n\t },\n\t // 返回一个随机的日期字符串。\n\t date: function(format) {\n\t format = format || 'yyyy-MM-dd'\n\t return this._formatDate(this._randomDate(), format)\n\t },\n\t // 返回一个随机的时间字符串。\n\t time: function(format) {\n\t format = format || 'HH:mm:ss'\n\t return this._formatDate(this._randomDate(), format)\n\t },\n\t // 返回一个随机的日期和时间字符串。\n\t datetime: function(format) {\n\t format = format || 'yyyy-MM-dd HH:mm:ss'\n\t return this._formatDate(this._randomDate(), format)\n\t },\n\t // 返回当前的日期和时间字符串。\n\t now: function(unit, format) {\n\t // now(unit) now(format)\n\t if (arguments.length === 1) {\n\t // now(format)\n\t if (!/year|month|day|hour|minute|second|week/.test(unit)) {\n\t format = unit\n\t unit = ''\n\t }\n\t }\n\t unit = (unit || '').toLowerCase()\n\t format = format || 'yyyy-MM-dd HH:mm:ss'\n\n\t var date = new Date()\n\n\t /* jshint -W086 */\n\t // 参考自 http://momentjs.cn/docs/#/manipulating/start-of/\n\t switch (unit) {\n\t case 'year':\n\t date.setMonth(0)\n\t case 'month':\n\t date.setDate(1)\n\t case 'week':\n\t case 'day':\n\t date.setHours(0)\n\t case 'hour':\n\t date.setMinutes(0)\n\t case 'minute':\n\t date.setSeconds(0)\n\t case 'second':\n\t date.setMilliseconds(0)\n\t }\n\t switch (unit) {\n\t case 'week':\n\t date.setDate(date.getDate() - date.getDay())\n\t }\n\n\t return this._formatDate(date, format)\n\t }\n\t}\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(module) {/* global document */\n\t/*\n\t ## Image\n\t*/\n\tmodule.exports = {\n\t // 常见的广告宽高\n\t _adSize: [\n\t '300x250', '250x250', '240x400', '336x280', '180x150',\n\t '720x300', '468x60', '234x60', '88x31', '120x90',\n\t '120x60', '120x240', '125x125', '728x90', '160x600',\n\t '120x600', '300x600'\n\t ],\n\t // 常见的屏幕宽高\n\t _screenSize: [\n\t '320x200', '320x240', '640x480', '800x480', '800x480',\n\t '1024x600', '1024x768', '1280x800', '1440x900', '1920x1200',\n\t '2560x1600'\n\t ],\n\t // 常见的视频宽高\n\t _videoSize: ['720x480', '768x576', '1280x720', '1920x1080'],\n\t /*\n\t 生成一个随机的图片地址。\n\n\t 替代图片源\n\t http://fpoimg.com/\n\t 参考自 \n\t http://rensanning.iteye.com/blog/1933310\n\t http://code.tutsplus.com/articles/the-top-8-placeholders-for-web-designers--net-19485\n\t */\n\t image: function(size, background, foreground, format, text) {\n\t // Random.image( size, background, foreground, text )\n\t if (arguments.length === 4) {\n\t text = format\n\t format = undefined\n\t }\n\t // Random.image( size, background, text )\n\t if (arguments.length === 3) {\n\t text = foreground\n\t foreground = undefined\n\t }\n\t // Random.image()\n\t if (!size) size = this.pick(this._adSize)\n\n\t if (background && ~background.indexOf('#')) background = background.slice(1)\n\t if (foreground && ~foreground.indexOf('#')) foreground = foreground.slice(1)\n\n\t // http://dummyimage.com/600x400/cc00cc/470047.png&text=hello\n\t return 'http://dummyimage.com/' + size +\n\t (background ? '/' + background : '') +\n\t (foreground ? '/' + foreground : '') +\n\t (format ? '.' + format : '') +\n\t (text ? '&text=' + text : '')\n\t },\n\t img: function() {\n\t return this.image.apply(this, arguments)\n\t },\n\n\t /*\n\t BrandColors\n\t http://brandcolors.net/\n\t A collection of major brand color codes curated by Galen Gidman.\n\t 大牌公司的颜色集合\n\n\t // 获取品牌和颜色\n\t $('h2').each(function(index, item){\n\t item = $(item)\n\t console.log('\\'' + item.text() + '\\'', ':', '\\'' + item.next().text() + '\\'', ',')\n\t })\n\t */\n\t _brandColors: {\n\t '4ormat': '#fb0a2a',\n\t '500px': '#02adea',\n\t 'About.me (blue)': '#00405d',\n\t 'About.me (yellow)': '#ffcc33',\n\t 'Addvocate': '#ff6138',\n\t 'Adobe': '#ff0000',\n\t 'Aim': '#fcd20b',\n\t 'Amazon': '#e47911',\n\t 'Android': '#a4c639',\n\t 'Angie\\'s List': '#7fbb00',\n\t 'AOL': '#0060a3',\n\t 'Atlassian': '#003366',\n\t 'Behance': '#053eff',\n\t 'Big Cartel': '#97b538',\n\t 'bitly': '#ee6123',\n\t 'Blogger': '#fc4f08',\n\t 'Boeing': '#0039a6',\n\t 'Booking.com': '#003580',\n\t 'Carbonmade': '#613854',\n\t 'Cheddar': '#ff7243',\n\t 'Code School': '#3d4944',\n\t 'Delicious': '#205cc0',\n\t 'Dell': '#3287c1',\n\t 'Designmoo': '#e54a4f',\n\t 'Deviantart': '#4e6252',\n\t 'Designer News': '#2d72da',\n\t 'Devour': '#fd0001',\n\t 'DEWALT': '#febd17',\n\t 'Disqus (blue)': '#59a3fc',\n\t 'Disqus (orange)': '#db7132',\n\t 'Dribbble': '#ea4c89',\n\t 'Dropbox': '#3d9ae8',\n\t 'Drupal': '#0c76ab',\n\t 'Dunked': '#2a323a',\n\t 'eBay': '#89c507',\n\t 'Ember': '#f05e1b',\n\t 'Engadget': '#00bdf6',\n\t 'Envato': '#528036',\n\t 'Etsy': '#eb6d20',\n\t 'Evernote': '#5ba525',\n\t 'Fab.com': '#dd0017',\n\t 'Facebook': '#3b5998',\n\t 'Firefox': '#e66000',\n\t 'Flickr (blue)': '#0063dc',\n\t 'Flickr (pink)': '#ff0084',\n\t 'Forrst': '#5b9a68',\n\t 'Foursquare': '#25a0ca',\n\t 'Garmin': '#007cc3',\n\t 'GetGlue': '#2d75a2',\n\t 'Gimmebar': '#f70078',\n\t 'GitHub': '#171515',\n\t 'Google Blue': '#0140ca',\n\t 'Google Green': '#16a61e',\n\t 'Google Red': '#dd1812',\n\t 'Google Yellow': '#fcca03',\n\t 'Google+': '#dd4b39',\n\t 'Grooveshark': '#f77f00',\n\t 'Groupon': '#82b548',\n\t 'Hacker News': '#ff6600',\n\t 'HelloWallet': '#0085ca',\n\t 'Heroku (light)': '#c7c5e6',\n\t 'Heroku (dark)': '#6567a5',\n\t 'HootSuite': '#003366',\n\t 'Houzz': '#73ba37',\n\t 'HTML5': '#ec6231',\n\t 'IKEA': '#ffcc33',\n\t 'IMDb': '#f3ce13',\n\t 'Instagram': '#3f729b',\n\t 'Intel': '#0071c5',\n\t 'Intuit': '#365ebf',\n\t 'Kickstarter': '#76cc1e',\n\t 'kippt': '#e03500',\n\t 'Kodery': '#00af81',\n\t 'LastFM': '#c3000d',\n\t 'LinkedIn': '#0e76a8',\n\t 'Livestream': '#cf0005',\n\t 'Lumo': '#576396',\n\t 'Mixpanel': '#a086d3',\n\t 'Meetup': '#e51937',\n\t 'Nokia': '#183693',\n\t 'NVIDIA': '#76b900',\n\t 'Opera': '#cc0f16',\n\t 'Path': '#e41f11',\n\t 'PayPal (dark)': '#1e477a',\n\t 'PayPal (light)': '#3b7bbf',\n\t 'Pinboard': '#0000e6',\n\t 'Pinterest': '#c8232c',\n\t 'PlayStation': '#665cbe',\n\t 'Pocket': '#ee4056',\n\t 'Prezi': '#318bff',\n\t 'Pusha': '#0f71b4',\n\t 'Quora': '#a82400',\n\t 'QUOTE.fm': '#66ceff',\n\t 'Rdio': '#008fd5',\n\t 'Readability': '#9c0000',\n\t 'Red Hat': '#cc0000',\n\t 'Resource': '#7eb400',\n\t 'Rockpack': '#0ba6ab',\n\t 'Roon': '#62b0d9',\n\t 'RSS': '#ee802f',\n\t 'Salesforce': '#1798c1',\n\t 'Samsung': '#0c4da2',\n\t 'Shopify': '#96bf48',\n\t 'Skype': '#00aff0',\n\t 'Snagajob': '#f47a20',\n\t 'Softonic': '#008ace',\n\t 'SoundCloud': '#ff7700',\n\t 'Space Box': '#f86960',\n\t 'Spotify': '#81b71a',\n\t 'Sprint': '#fee100',\n\t 'Squarespace': '#121212',\n\t 'StackOverflow': '#ef8236',\n\t 'Staples': '#cc0000',\n\t 'Status Chart': '#d7584f',\n\t 'Stripe': '#008cdd',\n\t 'StudyBlue': '#00afe1',\n\t 'StumbleUpon': '#f74425',\n\t 'T-Mobile': '#ea0a8e',\n\t 'Technorati': '#40a800',\n\t 'The Next Web': '#ef4423',\n\t 'Treehouse': '#5cb868',\n\t 'Trulia': '#5eab1f',\n\t 'Tumblr': '#34526f',\n\t 'Twitch.tv': '#6441a5',\n\t 'Twitter': '#00acee',\n\t 'TYPO3': '#ff8700',\n\t 'Ubuntu': '#dd4814',\n\t 'Ustream': '#3388ff',\n\t 'Verizon': '#ef1d1d',\n\t 'Vimeo': '#86c9ef',\n\t 'Vine': '#00a478',\n\t 'Virb': '#06afd8',\n\t 'Virgin Media': '#cc0000',\n\t 'Wooga': '#5b009c',\n\t 'WordPress (blue)': '#21759b',\n\t 'WordPress (orange)': '#d54e21',\n\t 'WordPress (grey)': '#464646',\n\t 'Wunderlist': '#2b88d9',\n\t 'XBOX': '#9bc848',\n\t 'XING': '#126567',\n\t 'Yahoo!': '#720e9e',\n\t 'Yandex': '#ffcc00',\n\t 'Yelp': '#c41200',\n\t 'YouTube': '#c4302b',\n\t 'Zalongo': '#5498dc',\n\t 'Zendesk': '#78a300',\n\t 'Zerply': '#9dcc7a',\n\t 'Zootool': '#5e8b1d'\n\t },\n\t _brandNames: function() {\n\t var brands = [];\n\t for (var b in this._brandColors) {\n\t brands.push(b)\n\t }\n\t return brands\n\t },\n\t /*\n\t 生成一段随机的 Base64 图片编码。\n\n\t https://github.com/imsky/holder\n\t Holder renders image placeholders entirely on the client side.\n\n\t dataImageHolder: function(size) {\n\t return 'holder.js/' + size\n\t },\n\t */\n\t dataImage: function(size, text) {\n\t var canvas\n\t if (typeof document !== 'undefined') {\n\t canvas = document.createElement('canvas')\n\t } else {\n\t /*\n\t https://github.com/Automattic/node-canvas\n\t npm install canvas --save\n\t 安装问题:\n\t * http://stackoverflow.com/questions/22953206/gulp-issues-with-cario-install-command-not-found-when-trying-to-installing-canva\n\t * https://github.com/Automattic/node-canvas/issues/415\n\t * https://github.com/Automattic/node-canvas/wiki/_pages\n\n\t PS:node-canvas 的安装过程实在是太繁琐了,所以不放入 package.json 的 dependencies。\n\t */\n\t var Canvas = module.require('canvas')\n\t canvas = new Canvas()\n\t }\n\n\t var ctx = canvas && canvas.getContext && canvas.getContext(\"2d\")\n\t if (!canvas || !ctx) return ''\n\n\t if (!size) size = this.pick(this._adSize)\n\t text = text !== undefined ? text : size\n\n\t size = size.split('x')\n\n\t var width = parseInt(size[0], 10),\n\t height = parseInt(size[1], 10),\n\t background = this._brandColors[this.pick(this._brandNames())],\n\t foreground = '#FFF',\n\t text_height = 14,\n\t font = 'sans-serif';\n\n\t canvas.width = width\n\t canvas.height = height\n\t ctx.textAlign = 'center'\n\t ctx.textBaseline = 'middle'\n\t ctx.fillStyle = background\n\t ctx.fillRect(0, 0, width, height)\n\t ctx.fillStyle = foreground\n\t ctx.font = 'bold ' + text_height + 'px ' + font\n\t ctx.fillText(text, (width / 2), (height / 2), width)\n\t return canvas.toDataURL('image/png')\n\t }\n\t}\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(9)(module)))\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = function(module) {\r\n\t\tif(!module.webpackPolyfill) {\r\n\t\t\tmodule.deprecate = function() {};\r\n\t\t\tmodule.paths = [];\r\n\t\t\t// module.parent = undefined by default\r\n\t\t\tmodule.children = [];\r\n\t\t\tmodule.webpackPolyfill = 1;\r\n\t\t}\r\n\t\treturn module;\r\n\t}\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Color\n\n\t http://llllll.li/randomColor/\n\t A color generator for JavaScript.\n\t randomColor generates attractive colors by default. More specifically, randomColor produces bright colors with a reasonably high saturation. This makes randomColor particularly useful for data visualizations and generative art.\n\n\t http://randomcolour.com/\n\t var bg_colour = Math.floor(Math.random() * 16777215).toString(16);\n\t bg_colour = \"#\" + (\"000000\" + bg_colour).slice(-6);\n\t document.bgColor = bg_colour;\n\t \n\t http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\t Creating random colors is actually more difficult than it seems. The randomness itself is easy, but aesthetically pleasing randomness is more difficult.\n\t https://github.com/devongovett/color-generator\n\n\t http://www.paulirish.com/2009/random-hex-color-code-snippets/\n\t Random Hex Color Code Generator in JavaScript\n\n\t http://chancejs.com/#color\n\t chance.color()\n\t // => '#79c157'\n\t chance.color({format: 'hex'})\n\t // => '#d67118'\n\t chance.color({format: 'shorthex'})\n\t // => '#60f'\n\t chance.color({format: 'rgb'})\n\t // => 'rgb(110,52,164)'\n\n\t http://tool.c7sky.com/webcolor\n\t 网页设计常用色彩搭配表\n\t \n\t https://github.com/One-com/one-color\n\t An OO-based JavaScript color parser/computation toolkit with support for RGB, HSV, HSL, CMYK, and alpha channels.\n\t API 很赞\n\n\t https://github.com/harthur/color\n\t JavaScript color conversion and manipulation library\n\n\t https://github.com/leaverou/css-colors\n\t Share & convert CSS colors\n\t http://leaverou.github.io/css-colors/#slategray\n\t Type a CSS color keyword, #hex, hsl(), rgba(), whatever:\n\n\t 色调 hue\n\t http://baike.baidu.com/view/23368.htm\n\t 色调指的是一幅画中画面色彩的总体倾向,是大的色彩效果。\n\t 饱和度 saturation\n\t http://baike.baidu.com/view/189644.htm\n\t 饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。\n\t 亮度 brightness\n\t http://baike.baidu.com/view/34773.htm\n\t 亮度是指发光体(反光体)表面发光(反光)强弱的物理量。\n\t 照度 luminosity\n\t 物体被照亮的程度,采用单位面积所接受的光通量来表示,表示单位为勒[克斯](Lux,lx) ,即 1m / m2 。\n\n\t http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript\n\t var letters = '0123456789ABCDEF'.split('')\n\t var color = '#'\n\t for (var i = 0; i < 6; i++) {\n\t color += letters[Math.floor(Math.random() * 16)]\n\t }\n\t return color\n\t \n\t // 随机生成一个无脑的颜色,格式为 '#RRGGBB'。\n\t // _brainlessColor()\n\t var color = Math.floor(\n\t Math.random() *\n\t (16 * 16 * 16 * 16 * 16 * 16 - 1)\n\t ).toString(16)\n\t color = \"#\" + (\"000000\" + color).slice(-6)\n\t return color.toUpperCase()\n\t*/\n\n\tvar Convert = __webpack_require__(11)\n\tvar DICT = __webpack_require__(12)\n\n\tmodule.exports = {\n\t // 随机生成一个有吸引力的颜色,格式为 '#RRGGBB'。\n\t color: function(name) {\n\t if (name || DICT[name]) return DICT[name].nicer\n\t return this.hex()\n\t },\n\t // #DAC0DE\n\t hex: function() {\n\t var hsv = this._goldenRatioColor()\n\t var rgb = Convert.hsv2rgb(hsv)\n\t var hex = Convert.rgb2hex(rgb[0], rgb[1], rgb[2])\n\t return hex\n\t },\n\t // rgb(128,255,255)\n\t rgb: function() {\n\t var hsv = this._goldenRatioColor()\n\t var rgb = Convert.hsv2rgb(hsv)\n\t return 'rgb(' +\n\t parseInt(rgb[0], 10) + ', ' +\n\t parseInt(rgb[1], 10) + ', ' +\n\t parseInt(rgb[2], 10) + ')'\n\t },\n\t // rgba(128,255,255,0.3)\n\t rgba: function() {\n\t var hsv = this._goldenRatioColor()\n\t var rgb = Convert.hsv2rgb(hsv)\n\t return 'rgba(' +\n\t parseInt(rgb[0], 10) + ', ' +\n\t parseInt(rgb[1], 10) + ', ' +\n\t parseInt(rgb[2], 10) + ', ' +\n\t Math.random().toFixed(2) + ')'\n\t },\n\t // hsl(300,80%,90%)\n\t hsl: function() {\n\t var hsv = this._goldenRatioColor()\n\t var hsl = Convert.hsv2hsl(hsv)\n\t return 'hsl(' +\n\t parseInt(hsl[0], 10) + ', ' +\n\t parseInt(hsl[1], 10) + ', ' +\n\t parseInt(hsl[2], 10) + ')'\n\t },\n\t // http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\t // https://github.com/devongovett/color-generator/blob/master/index.js\n\t // 随机生成一个有吸引力的颜色。\n\t _goldenRatioColor: function(saturation, value) {\n\t this._goldenRatio = 0.618033988749895\n\t this._hue = this._hue || Math.random()\n\t this._hue += this._goldenRatio\n\t this._hue %= 1\n\n\t if (typeof saturation !== \"number\") saturation = 0.5;\n\t if (typeof value !== \"number\") value = 0.95;\n\n\t return [\n\t this._hue * 360,\n\t saturation * 100,\n\t value * 100\n\t ]\n\t }\n\t}\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Color Convert\n\n\t http://blog.csdn.net/idfaya/article/details/6770414\n\t 颜色空间RGB与HSV(HSL)的转换\n\t*/\n\t// https://github.com/harthur/color-convert/blob/master/conversions.js\n\tmodule.exports = {\n\t\trgb2hsl: function rgb2hsl(rgb) {\n\t\t\tvar r = rgb[0] / 255,\n\t\t\t\tg = rgb[1] / 255,\n\t\t\t\tb = rgb[2] / 255,\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tmax = Math.max(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\th, s, l;\n\n\t\t\tif (max == min)\n\t\t\t\th = 0;\n\t\t\telse if (r == max)\n\t\t\t\th = (g - b) / delta;\n\t\t\telse if (g == max)\n\t\t\t\th = 2 + (b - r) / delta;\n\t\t\telse if (b == max)\n\t\t\t\th = 4 + (r - g) / delta;\n\n\t\t\th = Math.min(h * 60, 360);\n\n\t\t\tif (h < 0)\n\t\t\t\th += 360;\n\n\t\t\tl = (min + max) / 2;\n\n\t\t\tif (max == min)\n\t\t\t\ts = 0;\n\t\t\telse if (l <= 0.5)\n\t\t\t\ts = delta / (max + min);\n\t\t\telse\n\t\t\t\ts = delta / (2 - max - min);\n\n\t\t\treturn [h, s * 100, l * 100];\n\t\t},\n\t\trgb2hsv: function rgb2hsv(rgb) {\n\t\t\tvar r = rgb[0],\n\t\t\t\tg = rgb[1],\n\t\t\t\tb = rgb[2],\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tmax = Math.max(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\th, s, v;\n\n\t\t\tif (max === 0)\n\t\t\t\ts = 0;\n\t\t\telse\n\t\t\t\ts = (delta / max * 1000) / 10;\n\n\t\t\tif (max == min)\n\t\t\t\th = 0;\n\t\t\telse if (r == max)\n\t\t\t\th = (g - b) / delta;\n\t\t\telse if (g == max)\n\t\t\t\th = 2 + (b - r) / delta;\n\t\t\telse if (b == max)\n\t\t\t\th = 4 + (r - g) / delta;\n\n\t\t\th = Math.min(h * 60, 360);\n\n\t\t\tif (h < 0)\n\t\t\t\th += 360;\n\n\t\t\tv = ((max / 255) * 1000) / 10;\n\n\t\t\treturn [h, s, v];\n\t\t},\n\t\thsl2rgb: function hsl2rgb(hsl) {\n\t\t\tvar h = hsl[0] / 360,\n\t\t\t\ts = hsl[1] / 100,\n\t\t\t\tl = hsl[2] / 100,\n\t\t\t\tt1, t2, t3, rgb, val;\n\n\t\t\tif (s === 0) {\n\t\t\t\tval = l * 255;\n\t\t\t\treturn [val, val, val];\n\t\t\t}\n\n\t\t\tif (l < 0.5)\n\t\t\t\tt2 = l * (1 + s);\n\t\t\telse\n\t\t\t\tt2 = l + s - l * s;\n\t\t\tt1 = 2 * l - t2;\n\n\t\t\trgb = [0, 0, 0];\n\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\t\t\tif (t3 < 0) t3++;\n\t\t\t\tif (t3 > 1) t3--;\n\n\t\t\t\tif (6 * t3 < 1)\n\t\t\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t\t\telse if (2 * t3 < 1)\n\t\t\t\t\tval = t2;\n\t\t\t\telse if (3 * t3 < 2)\n\t\t\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t\t\telse\n\t\t\t\t\tval = t1;\n\n\t\t\t\trgb[i] = val * 255;\n\t\t\t}\n\n\t\t\treturn rgb;\n\t\t},\n\t\thsl2hsv: function hsl2hsv(hsl) {\n\t\t\tvar h = hsl[0],\n\t\t\t\ts = hsl[1] / 100,\n\t\t\t\tl = hsl[2] / 100,\n\t\t\t\tsv, v;\n\t\t\tl *= 2;\n\t\t\ts *= (l <= 1) ? l : 2 - l;\n\t\t\tv = (l + s) / 2;\n\t\t\tsv = (2 * s) / (l + s);\n\t\t\treturn [h, sv * 100, v * 100];\n\t\t},\n\t\thsv2rgb: function hsv2rgb(hsv) {\n\t\t\tvar h = hsv[0] / 60\n\t\t\tvar s = hsv[1] / 100\n\t\t\tvar v = hsv[2] / 100\n\t\t\tvar hi = Math.floor(h) % 6\n\n\t\t\tvar f = h - Math.floor(h)\n\t\t\tvar p = 255 * v * (1 - s)\n\t\t\tvar q = 255 * v * (1 - (s * f))\n\t\t\tvar t = 255 * v * (1 - (s * (1 - f)))\n\n\t\t\tv = 255 * v\n\n\t\t\tswitch (hi) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn [v, t, p]\n\t\t\t\tcase 1:\n\t\t\t\t\treturn [q, v, p]\n\t\t\t\tcase 2:\n\t\t\t\t\treturn [p, v, t]\n\t\t\t\tcase 3:\n\t\t\t\t\treturn [p, q, v]\n\t\t\t\tcase 4:\n\t\t\t\t\treturn [t, p, v]\n\t\t\t\tcase 5:\n\t\t\t\t\treturn [v, p, q]\n\t\t\t}\n\t\t},\n\t\thsv2hsl: function hsv2hsl(hsv) {\n\t\t\tvar h = hsv[0],\n\t\t\t\ts = hsv[1] / 100,\n\t\t\t\tv = hsv[2] / 100,\n\t\t\t\tsl, l;\n\n\t\t\tl = (2 - s) * v;\n\t\t\tsl = s * v;\n\t\t\tsl /= (l <= 1) ? l : 2 - l;\n\t\t\tl /= 2;\n\t\t\treturn [h, sl * 100, l * 100];\n\t\t},\n\t\t// http://www.140byt.es/keywords/color\n\t\trgb2hex: function(\n\t\t\ta, // red, as a number from 0 to 255\n\t\t\tb, // green, as a number from 0 to 255\n\t\t\tc // blue, as a number from 0 to 255\n\t\t) {\n\t\t\treturn \"#\" + ((256 + a << 8 | b) << 8 | c).toString(16).slice(1)\n\t\t},\n\t\thex2rgb: function(\n\t\t\ta // take a \"#xxxxxx\" hex string,\n\t\t) {\n\t\t\ta = '0x' + a.slice(1).replace(a.length > 4 ? a : /./g, '$&$&') | 0;\n\t\t\treturn [a >> 16, a >> 8 & 255, a & 255]\n\t\t}\n\t}\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Color 字典数据\n\n\t 字典数据来源 [A nicer color palette for the web](http://clrs.cc/)\n\t*/\n\tmodule.exports = {\n\t // name value nicer\n\t navy: {\n\t value: '#000080',\n\t nicer: '#001F3F'\n\t },\n\t blue: {\n\t value: '#0000ff',\n\t nicer: '#0074D9'\n\t },\n\t aqua: {\n\t value: '#00ffff',\n\t nicer: '#7FDBFF'\n\t },\n\t teal: {\n\t value: '#008080',\n\t nicer: '#39CCCC'\n\t },\n\t olive: {\n\t value: '#008000',\n\t nicer: '#3D9970'\n\t },\n\t green: {\n\t value: '#008000',\n\t nicer: '#2ECC40'\n\t },\n\t lime: {\n\t value: '#00ff00',\n\t nicer: '#01FF70'\n\t },\n\t yellow: {\n\t value: '#ffff00',\n\t nicer: '#FFDC00'\n\t },\n\t orange: {\n\t value: '#ffa500',\n\t nicer: '#FF851B'\n\t },\n\t red: {\n\t value: '#ff0000',\n\t nicer: '#FF4136'\n\t },\n\t maroon: {\n\t value: '#800000',\n\t nicer: '#85144B'\n\t },\n\t fuchsia: {\n\t value: '#ff00ff',\n\t nicer: '#F012BE'\n\t },\n\t purple: {\n\t value: '#800080',\n\t nicer: '#B10DC9'\n\t },\n\t silver: {\n\t value: '#c0c0c0',\n\t nicer: '#DDDDDD'\n\t },\n\t gray: {\n\t value: '#808080',\n\t nicer: '#AAAAAA'\n\t },\n\t black: {\n\t value: '#000000',\n\t nicer: '#111111'\n\t },\n\t white: {\n\t value: '#FFFFFF',\n\t nicer: '#FFFFFF'\n\t }\n\t}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Text\n\n\t http://www.lipsum.com/\n\t*/\n\tvar Basic = __webpack_require__(6)\n\tvar Helper = __webpack_require__(14)\n\n\tfunction range(defaultMin, defaultMax, min, max) {\n\t return min === undefined ? Basic.natural(defaultMin, defaultMax) : // ()\n\t max === undefined ? min : // ( len )\n\t Basic.natural(parseInt(min, 10), parseInt(max, 10)) // ( min, max )\n\t}\n\n\tmodule.exports = {\n\t // 随机生成一段文本。\n\t paragraph: function(min, max) {\n\t var len = range(3, 7, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.sentence())\n\t }\n\t return result.join(' ')\n\t },\n\t // \n\t cparagraph: function(min, max) {\n\t var len = range(3, 7, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.csentence())\n\t }\n\t return result.join('')\n\t },\n\t // 随机生成一个句子,第一个单词的首字母大写。\n\t sentence: function(min, max) {\n\t var len = range(12, 18, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.word())\n\t }\n\t return Helper.capitalize(result.join(' ')) + '.'\n\t },\n\t // 随机生成一个中文句子。\n\t csentence: function(min, max) {\n\t var len = range(12, 18, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.cword())\n\t }\n\n\t return result.join('') + '。'\n\t },\n\t // 随机生成一个单词。\n\t word: function(min, max) {\n\t var len = range(3, 10, min, max)\n\t var result = '';\n\t for (var i = 0; i < len; i++) {\n\t result += Basic.character('lower')\n\t }\n\t return result\n\t },\n\t // 随机生成一个或多个汉字。\n\t cword: function(pool, min, max) {\n\t // 最常用的 500 个汉字 http://baike.baidu.com/view/568436.htm\n\t var DICT_KANZI = '的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞'\n\n\t var len\n\t switch (arguments.length) {\n\t case 0: // ()\n\t pool = DICT_KANZI\n\t len = 1\n\t break\n\t case 1: // ( pool )\n\t if (typeof arguments[0] === 'string') {\n\t len = 1\n\t } else {\n\t // ( length )\n\t len = pool\n\t pool = DICT_KANZI\n\t }\n\t break\n\t case 2:\n\t // ( pool, length )\n\t if (typeof arguments[0] === 'string') {\n\t len = min\n\t } else {\n\t // ( min, max )\n\t len = this.natural(pool, min)\n\t pool = DICT_KANZI\n\t }\n\t break\n\t case 3:\n\t len = this.natural(min, max)\n\t break\n\t }\n\n\t var result = ''\n\t for (var i = 0; i < len; i++) {\n\t result += pool.charAt(this.natural(0, pool.length - 1))\n\t }\n\t return result\n\t },\n\t // 随机生成一句标题,其中每个单词的首字母大写。\n\t title: function(min, max) {\n\t var len = range(3, 7, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.capitalize(this.word()))\n\t }\n\t return result.join(' ')\n\t },\n\t // 随机生成一句中文标题。\n\t ctitle: function(min, max) {\n\t var len = range(3, 7, min, max)\n\t var result = []\n\t for (var i = 0; i < len; i++) {\n\t result.push(this.cword())\n\t }\n\t return result.join('')\n\t }\n\t}\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Helpers\n\t*/\n\n\tvar Util = __webpack_require__(3)\n\n\tmodule.exports = {\n\t\t// 把字符串的第一个字母转换为大写。\n\t\tcapitalize: function(word) {\n\t\t\treturn (word + '').charAt(0).toUpperCase() + (word + '').substr(1)\n\t\t},\n\t\t// 把字符串转换为大写。\n\t\tupper: function(str) {\n\t\t\treturn (str + '').toUpperCase()\n\t\t},\n\t\t// 把字符串转换为小写。\n\t\tlower: function(str) {\n\t\t\treturn (str + '').toLowerCase()\n\t\t},\n\t\t// 从数组中随机选取一个元素,并返回。\n\t\tpick: function pick(arr, min, max) {\n\t\t\t// pick( item1, item2 ... )\n\t\t\tif (!Util.isArray(arr)) {\n\t\t\t\tarr = [].slice.call(arguments)\n\t\t\t\tmin = 1\n\t\t\t\tmax = 1\n\t\t\t} else {\n\t\t\t\t// pick( [ item1, item2 ... ] )\n\t\t\t\tif (min === undefined) min = 1\n\n\t\t\t\t// pick( [ item1, item2 ... ], count )\n\t\t\t\tif (max === undefined) max = min\n\t\t\t}\n\n\t\t\tif (min === 1 && max === 1) return arr[this.natural(0, arr.length - 1)]\n\n\t\t\t// pick( [ item1, item2 ... ], min, max )\n\t\t\treturn this.shuffle(arr, min, max)\n\n\t\t\t// 通过参数个数判断方法签名,扩展性太差!#90\n\t\t\t// switch (arguments.length) {\n\t\t\t// \tcase 1:\n\t\t\t// \t\t// pick( [ item1, item2 ... ] )\n\t\t\t// \t\treturn arr[this.natural(0, arr.length - 1)]\n\t\t\t// \tcase 2:\n\t\t\t// \t\t// pick( [ item1, item2 ... ], count )\n\t\t\t// \t\tmax = min\n\t\t\t// \t\t\t/* falls through */\n\t\t\t// \tcase 3:\n\t\t\t// \t\t// pick( [ item1, item2 ... ], min, max )\n\t\t\t// \t\treturn this.shuffle(arr, min, max)\n\t\t\t// }\n\t\t},\n\t\t/*\n\t\t 打乱数组中元素的顺序,并返回。\n\t\t Given an array, scramble the order and return it.\n\n\t\t 其他的实现思路:\n\t\t // https://code.google.com/p/jslibs/wiki/JavascriptTips\n\t\t result = result.sort(function() {\n\t\t return Math.random() - 0.5\n\t\t })\n\t\t*/\n\t\tshuffle: function shuffle(arr, min, max) {\n\t\t\tarr = arr || []\n\t\t\tvar old = arr.slice(0),\n\t\t\t\tresult = [],\n\t\t\t\tindex = 0,\n\t\t\t\tlength = old.length;\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tindex = this.natural(0, old.length - 1)\n\t\t\t\tresult.push(old[index])\n\t\t\t\told.splice(index, 1)\n\t\t\t}\n\t\t\tswitch (arguments.length) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\t\treturn result\n\t\t\t\tcase 2:\n\t\t\t\t\tmax = min\n\t\t\t\t\t\t/* falls through */\n\t\t\t\tcase 3:\n\t\t\t\t\tmin = parseInt(min, 10)\n\t\t\t\t\tmax = parseInt(max, 10)\n\t\t\t\t\treturn result.slice(0, this.natural(min, max))\n\t\t\t}\n\t\t},\n\t\t/*\n\t\t * Random.order(item, item)\n\t\t * Random.order([item, item ...])\n\n\t\t 顺序获取数组中的元素\n\n\t\t [JSON导入数组支持数组数据录入](https://github.com/thx/RAP/issues/22)\n\n\t\t 不支持单独调用!\n\t\t*/\n\t\torder: function order(array) {\n\t\t\torder.cache = order.cache || {}\n\n\t\t\tif (arguments.length > 1) array = [].slice.call(arguments, 0)\n\n\t\t\t// options.context.path/templatePath\n\t\t\tvar options = order.options\n\t\t\tvar templatePath = options.context.templatePath.join('.')\n\n\t\t\tvar cache = (\n\t\t\t\torder.cache[templatePath] = order.cache[templatePath] || {\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tarray: array\n\t\t\t\t}\n\t\t\t)\n\n\t\t\treturn cache.array[cache.index++ % cache.array.length]\n\t\t}\n\t}\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Name\n\n\t [Beyond the Top 1000 Names](http://www.ssa.gov/oact/babynames/limits.html)\n\t*/\n\tmodule.exports = {\n\t\t// 随机生成一个常见的英文名。\n\t\tfirst: function() {\n\t\t\tvar names = [\n\t\t\t\t// male\n\t\t\t\t\"James\", \"John\", \"Robert\", \"Michael\", \"William\",\n\t\t\t\t\"David\", \"Richard\", \"Charles\", \"Joseph\", \"Thomas\",\n\t\t\t\t\"Christopher\", \"Daniel\", \"Paul\", \"Mark\", \"Donald\",\n\t\t\t\t\"George\", \"Kenneth\", \"Steven\", \"Edward\", \"Brian\",\n\t\t\t\t\"Ronald\", \"Anthony\", \"Kevin\", \"Jason\", \"Matthew\",\n\t\t\t\t\"Gary\", \"Timothy\", \"Jose\", \"Larry\", \"Jeffrey\",\n\t\t\t\t\"Frank\", \"Scott\", \"Eric\"\n\t\t\t].concat([\n\t\t\t\t// female\n\t\t\t\t\"Mary\", \"Patricia\", \"Linda\", \"Barbara\", \"Elizabeth\",\n\t\t\t\t\"Jennifer\", \"Maria\", \"Susan\", \"Margaret\", \"Dorothy\",\n\t\t\t\t\"Lisa\", \"Nancy\", \"Karen\", \"Betty\", \"Helen\",\n\t\t\t\t\"Sandra\", \"Donna\", \"Carol\", \"Ruth\", \"Sharon\",\n\t\t\t\t\"Michelle\", \"Laura\", \"Sarah\", \"Kimberly\", \"Deborah\",\n\t\t\t\t\"Jessica\", \"Shirley\", \"Cynthia\", \"Angela\", \"Melissa\",\n\t\t\t\t\"Brenda\", \"Amy\", \"Anna\"\n\t\t\t])\n\t\t\treturn this.pick(names)\n\t\t\t\t// or this.capitalize(this.word())\n\t\t},\n\t\t// 随机生成一个常见的英文姓。\n\t\tlast: function() {\n\t\t\tvar names = [\n\t\t\t\t\"Smith\", \"Johnson\", \"Williams\", \"Brown\", \"Jones\",\n\t\t\t\t\"Miller\", \"Davis\", \"Garcia\", \"Rodriguez\", \"Wilson\",\n\t\t\t\t\"Martinez\", \"Anderson\", \"Taylor\", \"Thomas\", \"Hernandez\",\n\t\t\t\t\"Moore\", \"Martin\", \"Jackson\", \"Thompson\", \"White\",\n\t\t\t\t\"Lopez\", \"Lee\", \"Gonzalez\", \"Harris\", \"Clark\",\n\t\t\t\t\"Lewis\", \"Robinson\", \"Walker\", \"Perez\", \"Hall\",\n\t\t\t\t\"Young\", \"Allen\"\n\t\t\t]\n\t\t\treturn this.pick(names)\n\t\t\t\t// or this.capitalize(this.word())\n\t\t},\n\t\t// 随机生成一个常见的英文姓名。\n\t\tname: function(middle) {\n\t\t\treturn this.first() + ' ' +\n\t\t\t\t(middle ? this.first() + ' ' : '') +\n\t\t\t\tthis.last()\n\t\t},\n\t\t/*\n\t\t 随机生成一个常见的中文姓。\n\t\t [世界常用姓氏排行](http://baike.baidu.com/view/1719115.htm)\n\t\t [玄派网 - 网络小说创作辅助平台](http://xuanpai.sinaapp.com/)\n\t\t */\n\t\tcfirst: function() {\n\t\t\tvar names = (\n\t\t\t\t'王 李 张 刘 陈 杨 赵 黄 周 吴 ' +\n\t\t\t\t'徐 孙 胡 朱 高 林 何 郭 马 罗 ' +\n\t\t\t\t'梁 宋 郑 谢 韩 唐 冯 于 董 萧 ' +\n\t\t\t\t'程 曹 袁 邓 许 傅 沈 曾 彭 吕 ' +\n\t\t\t\t'苏 卢 蒋 蔡 贾 丁 魏 薛 叶 阎 ' +\n\t\t\t\t'余 潘 杜 戴 夏 锺 汪 田 任 姜 ' +\n\t\t\t\t'范 方 石 姚 谭 廖 邹 熊 金 陆 ' +\n\t\t\t\t'郝 孔 白 崔 康 毛 邱 秦 江 史 ' +\n\t\t\t\t'顾 侯 邵 孟 龙 万 段 雷 钱 汤 ' +\n\t\t\t\t'尹 黎 易 常 武 乔 贺 赖 龚 文'\n\t\t\t).split(' ')\n\t\t\treturn this.pick(names)\n\t\t},\n\t\t/*\n\t\t 随机生成一个常见的中文名。\n\t\t [中国最常见名字前50名_三九算命网](http://www.name999.net/xingming/xingshi/20131004/48.html)\n\t\t */\n\t\tclast: function() {\n\t\t\tvar names = (\n\t\t\t\t'伟 芳 娜 秀英 敏 静 丽 强 磊 军 ' +\n\t\t\t\t'洋 勇 艳 杰 娟 涛 明 超 秀兰 霞 ' +\n\t\t\t\t'平 刚 桂英'\n\t\t\t).split(' ')\n\t\t\treturn this.pick(names)\n\t\t},\n\t\t// 随机生成一个常见的中文姓名。\n\t\tcname: function() {\n\t\t\treturn this.cfirst() + this.clast()\n\t\t}\n\t}\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Web\n\t*/\n\tmodule.exports = {\n\t /*\n\t 随机生成一个 URL。\n\n\t [URL 规范](http://www.w3.org/Addressing/URL/url-spec.txt)\n\t http Hypertext Transfer Protocol \n\t ftp File Transfer protocol \n\t gopher The Gopher protocol \n\t mailto Electronic mail address \n\t mid Message identifiers for electronic mail \n\t cid Content identifiers for MIME body part \n\t news Usenet news \n\t nntp Usenet news for local NNTP access only \n\t prospero Access using the prospero protocols \n\t telnet rlogin tn3270 Reference to interactive sessions\n\t wais Wide Area Information Servers \n\t */\n\t url: function(protocol, host) {\n\t return (protocol || this.protocol()) + '://' + // protocol?\n\t (host || this.domain()) + // host?\n\t '/' + this.word()\n\t },\n\t // 随机生成一个 URL 协议。\n\t protocol: function() {\n\t return this.pick(\n\t // 协议簇\n\t 'http ftp gopher mailto mid cid news nntp prospero telnet rlogin tn3270 wais'.split(' ')\n\t )\n\t },\n\t // 随机生成一个域名。\n\t domain: function(tld) {\n\t return this.word() + '.' + (tld || this.tld())\n\t },\n\t /*\n\t 随机生成一个顶级域名。\n\t 国际顶级域名 international top-level domain-names, iTLDs\n\t 国家顶级域名 national top-level domainnames, nTLDs\n\t [域名后缀大全](http://www.163ns.com/zixun/post/4417.html)\n\t */\n\t tld: function() { // Top Level Domain\n\t return this.pick(\n\t (\n\t // 域名后缀\n\t 'com net org edu gov int mil cn ' +\n\t // 国内域名\n\t 'com.cn net.cn gov.cn org.cn ' +\n\t // 中文国内域名\n\t '中国 中国互联.公司 中国互联.网络 ' +\n\t // 新国际域名\n\t 'tel biz cc tv info name hk mobi asia cd travel pro museum coop aero ' +\n\t // 世界各国域名后缀\n\t 'ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw'\n\t ).split(' ')\n\t )\n\t },\n\t // 随机生成一个邮件地址。\n\t email: function(domain) {\n\t return this.character('lower') + '.' + this.word() + '@' +\n\t (\n\t domain ||\n\t (this.word() + '.' + this.tld())\n\t )\n\t // return this.character('lower') + '.' + this.last().toLowerCase() + '@' + this.last().toLowerCase() + '.' + this.tld()\n\t // return this.word() + '@' + (domain || this.domain())\n\t },\n\t // 随机生成一个 IP 地址。\n\t ip: function() {\n\t return this.natural(0, 255) + '.' +\n\t this.natural(0, 255) + '.' +\n\t this.natural(0, 255) + '.' +\n\t this.natural(0, 255)\n\t }\n\t}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Address\n\t*/\n\n\tvar DICT = __webpack_require__(18)\n\tvar REGION = ['东北', '华北', '华东', '华中', '华南', '西南', '西北']\n\n\tmodule.exports = {\n\t // 随机生成一个大区。\n\t region: function() {\n\t return this.pick(REGION)\n\t },\n\t // 随机生成一个(中国)省(或直辖市、自治区、特别行政区)。\n\t province: function() {\n\t return this.pick(DICT).name\n\t },\n\t // 随机生成一个(中国)市。\n\t city: function(prefix) {\n\t var province = this.pick(DICT)\n\t var city = this.pick(province.children)\n\t return prefix ? [province.name, city.name].join(' ') : city.name\n\t },\n\t // 随机生成一个(中国)县。\n\t county: function(prefix) {\n\t var province = this.pick(DICT)\n\t var city = this.pick(province.children)\n\t var county = this.pick(city.children) || {\n\t name: '-'\n\t }\n\t return prefix ? [province.name, city.name, county.name].join(' ') : county.name\n\t },\n\t // 随机生成一个邮政编码(六位数字)。\n\t zip: function(len) {\n\t var zip = ''\n\t for (var i = 0; i < (len || 6); i++) zip += this.natural(0, 9)\n\t return zip\n\t }\n\n\t // address: function() {},\n\t // phone: function() {},\n\t // areacode: function() {},\n\t // street: function() {},\n\t // street_suffixes: function() {},\n\t // street_suffix: function() {},\n\t // states: function() {},\n\t // state: function() {},\n\t}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\n\t/*\n\t ## Address 字典数据\n\n\t 字典数据来源 http://www.atatech.org/articles/30028?rnd=254259856\n\n\t 国标 省(市)级行政区划码表\n\n\t 华北 北京市 天津市 河北省 山西省 内蒙古自治区\n\t 东北 辽宁省 吉林省 黑龙江省\n\t 华东 上海市 江苏省 浙江省 安徽省 福建省 江西省 山东省\n\t 华南 广东省 广西壮族自治区 海南省\n\t 华中 河南省 湖北省 湖南省\n\t 西南 重庆市 四川省 贵州省 云南省 西藏自治区\n\t 西北 陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区\n\t 港澳台 香港特别行政区 澳门特别行政区 台湾省\n\t \n\t **排序**\n\t \n\t ```js\n\t var map = {}\n\t _.each(_.keys(REGIONS),function(id){\n\t map[id] = REGIONS[ID]\n\t })\n\t JSON.stringify(map)\n\t ```\n\t*/\n\tvar DICT = {\n\t \"110000\": \"北京\",\n\t \"110100\": \"北京市\",\n\t \"110101\": \"东城区\",\n\t \"110102\": \"西城区\",\n\t \"110105\": \"朝阳区\",\n\t \"110106\": \"丰台区\",\n\t \"110107\": \"石景山区\",\n\t \"110108\": \"海淀区\",\n\t \"110109\": \"门头沟区\",\n\t \"110111\": \"房山区\",\n\t \"110112\": \"通州区\",\n\t \"110113\": \"顺义区\",\n\t \"110114\": \"昌平区\",\n\t \"110115\": \"大兴区\",\n\t \"110116\": \"怀柔区\",\n\t \"110117\": \"平谷区\",\n\t \"110228\": \"密云县\",\n\t \"110229\": \"延庆县\",\n\t \"110230\": \"其它区\",\n\t \"120000\": \"天津\",\n\t \"120100\": \"天津市\",\n\t \"120101\": \"和平区\",\n\t \"120102\": \"河东区\",\n\t \"120103\": \"河西区\",\n\t \"120104\": \"南开区\",\n\t \"120105\": \"河北区\",\n\t \"120106\": \"红桥区\",\n\t \"120110\": \"东丽区\",\n\t \"120111\": \"西青区\",\n\t \"120112\": \"津南区\",\n\t \"120113\": \"北辰区\",\n\t \"120114\": \"武清区\",\n\t \"120115\": \"宝坻区\",\n\t \"120116\": \"滨海新区\",\n\t \"120221\": \"宁河县\",\n\t \"120223\": \"静海县\",\n\t \"120225\": \"蓟县\",\n\t \"120226\": \"其它区\",\n\t \"130000\": \"河北省\",\n\t \"130100\": \"石家庄市\",\n\t \"130102\": \"长安区\",\n\t \"130103\": \"桥东区\",\n\t \"130104\": \"桥西区\",\n\t \"130105\": \"新华区\",\n\t \"130107\": \"井陉矿区\",\n\t \"130108\": \"裕华区\",\n\t \"130121\": \"井陉县\",\n\t \"130123\": \"正定县\",\n\t \"130124\": \"栾城县\",\n\t \"130125\": \"行唐县\",\n\t \"130126\": \"灵寿县\",\n\t \"130127\": \"高邑县\",\n\t \"130128\": \"深泽县\",\n\t \"130129\": \"赞皇县\",\n\t \"130130\": \"无极县\",\n\t \"130131\": \"平山县\",\n\t \"130132\": \"元氏县\",\n\t \"130133\": \"赵县\",\n\t \"130181\": \"辛集市\",\n\t \"130182\": \"藁城市\",\n\t \"130183\": \"晋州市\",\n\t \"130184\": \"新乐市\",\n\t \"130185\": \"鹿泉市\",\n\t \"130186\": \"其它区\",\n\t \"130200\": \"唐山市\",\n\t \"130202\": \"路南区\",\n\t \"130203\": \"路北区\",\n\t \"130204\": \"古冶区\",\n\t \"130205\": \"开平区\",\n\t \"130207\": \"丰南区\",\n\t \"130208\": \"丰润区\",\n\t \"130223\": \"滦县\",\n\t \"130224\": \"滦南县\",\n\t \"130225\": \"乐亭县\",\n\t \"130227\": \"迁西县\",\n\t \"130229\": \"玉田县\",\n\t \"130230\": \"曹妃甸区\",\n\t \"130281\": \"遵化市\",\n\t \"130283\": \"迁安市\",\n\t \"130284\": \"其它区\",\n\t \"130300\": \"秦皇岛市\",\n\t \"130302\": \"海港区\",\n\t \"130303\": \"山海关区\",\n\t \"130304\": \"北戴河区\",\n\t \"130321\": \"青龙满族自治县\",\n\t \"130322\": \"昌黎县\",\n\t \"130323\": \"抚宁县\",\n\t \"130324\": \"卢龙县\",\n\t \"130398\": \"其它区\",\n\t \"130400\": \"邯郸市\",\n\t \"130402\": \"邯山区\",\n\t \"130403\": \"丛台区\",\n\t \"130404\": \"复兴区\",\n\t \"130406\": \"峰峰矿区\",\n\t \"130421\": \"邯郸县\",\n\t \"130423\": \"临漳县\",\n\t \"130424\": \"成安县\",\n\t \"130425\": \"大名县\",\n\t \"130426\": \"涉县\",\n\t \"130427\": \"磁县\",\n\t \"130428\": \"肥乡县\",\n\t \"130429\": \"永年县\",\n\t \"130430\": \"邱县\",\n\t \"130431\": \"鸡泽县\",\n\t \"130432\": \"广平县\",\n\t \"130433\": \"馆陶县\",\n\t \"130434\": \"魏县\",\n\t \"130435\": \"曲周县\",\n\t \"130481\": \"武安市\",\n\t \"130482\": \"其它区\",\n\t \"130500\": \"邢台市\",\n\t \"130502\": \"桥东区\",\n\t \"130503\": \"桥西区\",\n\t \"130521\": \"邢台县\",\n\t \"130522\": \"临城县\",\n\t \"130523\": \"内丘县\",\n\t \"130524\": \"柏乡县\",\n\t \"130525\": \"隆尧县\",\n\t \"130526\": \"任县\",\n\t \"130527\": \"南和县\",\n\t \"130528\": \"宁晋县\",\n\t \"130529\": \"巨鹿县\",\n\t \"130530\": \"新河县\",\n\t \"130531\": \"广宗县\",\n\t \"130532\": \"平乡县\",\n\t \"130533\": \"威县\",\n\t \"130534\": \"清河县\",\n\t \"130535\": \"临西县\",\n\t \"130581\": \"南宫市\",\n\t \"130582\": \"沙河市\",\n\t \"130583\": \"其它区\",\n\t \"130600\": \"保定市\",\n\t \"130602\": \"新市区\",\n\t \"130603\": \"北市区\",\n\t \"130604\": \"南市区\",\n\t \"130621\": \"满城县\",\n\t \"130622\": \"清苑县\",\n\t \"130623\": \"涞水县\",\n\t \"130624\": \"阜平县\",\n\t \"130625\": \"徐水县\",\n\t \"130626\": \"定兴县\",\n\t \"130627\": \"唐县\",\n\t \"130628\": \"高阳县\",\n\t \"130629\": \"容城县\",\n\t \"130630\": \"涞源县\",\n\t \"130631\": \"望都县\",\n\t \"130632\": \"安新县\",\n\t \"130633\": \"易县\",\n\t \"130634\": \"曲阳县\",\n\t \"130635\": \"蠡县\",\n\t \"130636\": \"顺平县\",\n\t \"130637\": \"博野县\",\n\t \"130638\": \"雄县\",\n\t \"130681\": \"涿州市\",\n\t \"130682\": \"定州市\",\n\t \"130683\": \"安国市\",\n\t \"130684\": \"高碑店市\",\n\t \"130699\": \"其它区\",\n\t \"130700\": \"张家口市\",\n\t \"130702\": \"桥东区\",\n\t \"130703\": \"桥西区\",\n\t \"130705\": \"宣化区\",\n\t \"130706\": \"下花园区\",\n\t \"130721\": \"宣化县\",\n\t \"130722\": \"张北县\",\n\t \"130723\": \"康保县\",\n\t \"130724\": \"沽源县\",\n\t \"130725\": \"尚义县\",\n\t \"130726\": \"蔚县\",\n\t \"130727\": \"阳原县\",\n\t \"130728\": \"怀安县\",\n\t \"130729\": \"万全县\",\n\t \"130730\": \"怀来县\",\n\t \"130731\": \"涿鹿县\",\n\t \"130732\": \"赤城县\",\n\t \"130733\": \"崇礼县\",\n\t \"130734\": \"其它区\",\n\t \"130800\": \"承德市\",\n\t \"130802\": \"双桥区\",\n\t \"130803\": \"双滦区\",\n\t \"130804\": \"鹰手营子矿区\",\n\t \"130821\": \"承德县\",\n\t \"130822\": \"兴隆县\",\n\t \"130823\": \"平泉县\",\n\t \"130824\": \"滦平县\",\n\t \"130825\": \"隆化县\",\n\t \"130826\": \"丰宁满族自治县\",\n\t \"130827\": \"宽城满族自治县\",\n\t \"130828\": \"围场满族蒙古族自治县\",\n\t \"130829\": \"其它区\",\n\t \"130900\": \"沧州市\",\n\t \"130902\": \"新华区\",\n\t \"130903\": \"运河区\",\n\t \"130921\": \"沧县\",\n\t \"130922\": \"青县\",\n\t \"130923\": \"东光县\",\n\t \"130924\": \"海兴县\",\n\t \"130925\": \"盐山县\",\n\t \"130926\": \"肃宁县\",\n\t \"130927\": \"南皮县\",\n\t \"130928\": \"吴桥县\",\n\t \"130929\": \"献县\",\n\t \"130930\": \"孟村回族自治县\",\n\t \"130981\": \"泊头市\",\n\t \"130982\": \"任丘市\",\n\t \"130983\": \"黄骅市\",\n\t \"130984\": \"河间市\",\n\t \"130985\": \"其它区\",\n\t \"131000\": \"廊坊市\",\n\t \"131002\": \"安次区\",\n\t \"131003\": \"广阳区\",\n\t \"131022\": \"固安县\",\n\t \"131023\": \"永清县\",\n\t \"131024\": \"香河县\",\n\t \"131025\": \"大城县\",\n\t \"131026\": \"文安县\",\n\t \"131028\": \"大厂回族自治县\",\n\t \"131081\": \"霸州市\",\n\t \"131082\": \"三河市\",\n\t \"131083\": \"其它区\",\n\t \"131100\": \"衡水市\",\n\t \"131102\": \"桃城区\",\n\t \"131121\": \"枣强县\",\n\t \"131122\": \"武邑县\",\n\t \"131123\": \"武强县\",\n\t \"131124\": \"饶阳县\",\n\t \"131125\": \"安平县\",\n\t \"131126\": \"故城县\",\n\t \"131127\": \"景县\",\n\t \"131128\": \"阜城县\",\n\t \"131181\": \"冀州市\",\n\t \"131182\": \"深州市\",\n\t \"131183\": \"其它区\",\n\t \"140000\": \"山西省\",\n\t \"140100\": \"太原市\",\n\t \"140105\": \"小店区\",\n\t \"140106\": \"迎泽区\",\n\t \"140107\": \"杏花岭区\",\n\t \"140108\": \"尖草坪区\",\n\t \"140109\": \"万柏林区\",\n\t \"140110\": \"晋源区\",\n\t \"140121\": \"清徐县\",\n\t \"140122\": \"阳曲县\",\n\t \"140123\": \"娄烦县\",\n\t \"140181\": \"古交市\",\n\t \"140182\": \"其它区\",\n\t \"140200\": \"大同市\",\n\t \"140202\": \"城区\",\n\t \"140203\": \"矿区\",\n\t \"140211\": \"南郊区\",\n\t \"140212\": \"新荣区\",\n\t \"140221\": \"阳高县\",\n\t \"140222\": \"天镇县\",\n\t \"140223\": \"广灵县\",\n\t \"140224\": \"灵丘县\",\n\t \"140225\": \"浑源县\",\n\t \"140226\": \"左云县\",\n\t \"140227\": \"大同县\",\n\t \"140228\": \"其它区\",\n\t \"140300\": \"阳泉市\",\n\t \"140302\": \"城区\",\n\t \"140303\": \"矿区\",\n\t \"140311\": \"郊区\",\n\t \"140321\": \"平定县\",\n\t \"140322\": \"盂县\",\n\t \"140323\": \"其它区\",\n\t \"140400\": \"长治市\",\n\t \"140421\": \"长治县\",\n\t \"140423\": \"襄垣县\",\n\t \"140424\": \"屯留县\",\n\t \"140425\": \"平顺县\",\n\t \"140426\": \"黎城县\",\n\t \"140427\": \"壶关县\",\n\t \"140428\": \"长子县\",\n\t \"140429\": \"武乡县\",\n\t \"140430\": \"沁县\",\n\t \"140431\": \"沁源县\",\n\t \"140481\": \"潞城市\",\n\t \"140482\": \"城区\",\n\t \"140483\": \"郊区\",\n\t \"140485\": \"其它区\",\n\t \"140500\": \"晋城市\",\n\t \"140502\": \"城区\",\n\t \"140521\": \"沁水县\",\n\t \"140522\": \"阳城县\",\n\t \"140524\": \"陵川县\",\n\t \"140525\": \"泽州县\",\n\t \"140581\": \"高平市\",\n\t \"140582\": \"其它区\",\n\t \"140600\": \"朔州市\",\n\t \"140602\": \"朔城区\",\n\t \"140603\": \"平鲁区\",\n\t \"140621\": \"山阴县\",\n\t \"140622\": \"应县\",\n\t \"140623\": \"右玉县\",\n\t \"140624\": \"怀仁县\",\n\t \"140625\": \"其它区\",\n\t \"140700\": \"晋中市\",\n\t \"140702\": \"榆次区\",\n\t \"140721\": \"榆社县\",\n\t \"140722\": \"左权县\",\n\t \"140723\": \"和顺县\",\n\t \"140724\": \"昔阳县\",\n\t \"140725\": \"寿阳县\",\n\t \"140726\": \"太谷县\",\n\t \"140727\": \"祁县\",\n\t \"140728\": \"平遥县\",\n\t \"140729\": \"灵石县\",\n\t \"140781\": \"介休市\",\n\t \"140782\": \"其它区\",\n\t \"140800\": \"运城市\",\n\t \"140802\": \"盐湖区\",\n\t \"140821\": \"临猗县\",\n\t \"140822\": \"万荣县\",\n\t \"140823\": \"闻喜县\",\n\t \"140824\": \"稷山县\",\n\t \"140825\": \"新绛县\",\n\t \"140826\": \"绛县\",\n\t \"140827\": \"垣曲县\",\n\t \"140828\": \"夏县\",\n\t \"140829\": \"平陆县\",\n\t \"140830\": \"芮城县\",\n\t \"140881\": \"永济市\",\n\t \"140882\": \"河津市\",\n\t \"140883\": \"其它区\",\n\t \"140900\": \"忻州市\",\n\t \"140902\": \"忻府区\",\n\t \"140921\": \"定襄县\",\n\t \"140922\": \"五台县\",\n\t \"140923\": \"代县\",\n\t \"140924\": \"繁峙县\",\n\t \"140925\": \"宁武县\",\n\t \"140926\": \"静乐县\",\n\t \"140927\": \"神池县\",\n\t \"140928\": \"五寨县\",\n\t \"140929\": \"岢岚县\",\n\t \"140930\": \"河曲县\",\n\t \"140931\": \"保德县\",\n\t \"140932\": \"偏关县\",\n\t \"140981\": \"原平市\",\n\t \"140982\": \"其它区\",\n\t \"141000\": \"临汾市\",\n\t \"141002\": \"尧都区\",\n\t \"141021\": \"曲沃县\",\n\t \"141022\": \"翼城县\",\n\t \"141023\": \"襄汾县\",\n\t \"141024\": \"洪洞县\",\n\t \"141025\": \"古县\",\n\t \"141026\": \"安泽县\",\n\t \"141027\": \"浮山县\",\n\t \"141028\": \"吉县\",\n\t \"141029\": \"乡宁县\",\n\t \"141030\": \"大宁县\",\n\t \"141031\": \"隰县\",\n\t \"141032\": \"永和县\",\n\t \"141033\": \"蒲县\",\n\t \"141034\": \"汾西县\",\n\t \"141081\": \"侯马市\",\n\t \"141082\": \"霍州市\",\n\t \"141083\": \"其它区\",\n\t \"141100\": \"吕梁市\",\n\t \"141102\": \"离石区\",\n\t \"141121\": \"文水县\",\n\t \"141122\": \"交城县\",\n\t \"141123\": \"兴县\",\n\t \"141124\": \"临县\",\n\t \"141125\": \"柳林县\",\n\t \"141126\": \"石楼县\",\n\t \"141127\": \"岚县\",\n\t \"141128\": \"方山县\",\n\t \"141129\": \"中阳县\",\n\t \"141130\": \"交口县\",\n\t \"141181\": \"孝义市\",\n\t \"141182\": \"汾阳市\",\n\t \"141183\": \"其它区\",\n\t \"150000\": \"内蒙古自治区\",\n\t \"150100\": \"呼和浩特市\",\n\t \"150102\": \"新城区\",\n\t \"150103\": \"回民区\",\n\t \"150104\": \"玉泉区\",\n\t \"150105\": \"赛罕区\",\n\t \"150121\": \"土默特左旗\",\n\t \"150122\": \"托克托县\",\n\t \"150123\": \"和林格尔县\",\n\t \"150124\": \"清水河县\",\n\t \"150125\": \"武川县\",\n\t \"150126\": \"其它区\",\n\t \"150200\": \"包头市\",\n\t \"150202\": \"东河区\",\n\t \"150203\": \"昆都仑区\",\n\t \"150204\": \"青山区\",\n\t \"150205\": \"石拐区\",\n\t \"150206\": \"白云鄂博矿区\",\n\t \"150207\": \"九原区\",\n\t \"150221\": \"土默特右旗\",\n\t \"150222\": \"固阳县\",\n\t \"150223\": \"达尔罕茂明安联合旗\",\n\t \"150224\": \"其它区\",\n\t \"150300\": \"乌海市\",\n\t \"150302\": \"海勃湾区\",\n\t \"150303\": \"海南区\",\n\t \"150304\": \"乌达区\",\n\t \"150305\": \"其它区\",\n\t \"150400\": \"赤峰市\",\n\t \"150402\": \"红山区\",\n\t \"150403\": \"元宝山区\",\n\t \"150404\": \"松山区\",\n\t \"150421\": \"阿鲁科尔沁旗\",\n\t \"150422\": \"巴林左旗\",\n\t \"150423\": \"巴林右旗\",\n\t \"150424\": \"林西县\",\n\t \"150425\": \"克什克腾旗\",\n\t \"150426\": \"翁牛特旗\",\n\t \"150428\": \"喀喇沁旗\",\n\t \"150429\": \"宁城县\",\n\t \"150430\": \"敖汉旗\",\n\t \"150431\": \"其它区\",\n\t \"150500\": \"通辽市\",\n\t \"150502\": \"科尔沁区\",\n\t \"150521\": \"科尔沁左翼中旗\",\n\t \"150522\": \"科尔沁左翼后旗\",\n\t \"150523\": \"开鲁县\",\n\t \"150524\": \"库伦旗\",\n\t \"150525\": \"奈曼旗\",\n\t \"150526\": \"扎鲁特旗\",\n\t \"150581\": \"霍林郭勒市\",\n\t \"150582\": \"其它区\",\n\t \"150600\": \"鄂尔多斯市\",\n\t \"150602\": \"东胜区\",\n\t \"150621\": \"达拉特旗\",\n\t \"150622\": \"准格尔旗\",\n\t \"150623\": \"鄂托克前旗\",\n\t \"150624\": \"鄂托克旗\",\n\t \"150625\": \"杭锦旗\",\n\t \"150626\": \"乌审旗\",\n\t \"150627\": \"伊金霍洛旗\",\n\t \"150628\": \"其它区\",\n\t \"150700\": \"呼伦贝尔市\",\n\t \"150702\": \"海拉尔区\",\n\t \"150703\": \"扎赉诺尔区\",\n\t \"150721\": \"阿荣旗\",\n\t \"150722\": \"莫力达瓦达斡尔族自治旗\",\n\t \"150723\": \"鄂伦春自治旗\",\n\t \"150724\": \"鄂温克族自治旗\",\n\t \"150725\": \"陈巴尔虎旗\",\n\t \"150726\": \"新巴尔虎左旗\",\n\t \"150727\": \"新巴尔虎右旗\",\n\t \"150781\": \"满洲里市\",\n\t \"150782\": \"牙克石市\",\n\t \"150783\": \"扎兰屯市\",\n\t \"150784\": \"额尔古纳市\",\n\t \"150785\": \"根河市\",\n\t \"150786\": \"其它区\",\n\t \"150800\": \"巴彦淖尔市\",\n\t \"150802\": \"临河区\",\n\t \"150821\": \"五原县\",\n\t \"150822\": \"磴口县\",\n\t \"150823\": \"乌拉特前旗\",\n\t \"150824\": \"乌拉特中旗\",\n\t \"150825\": \"乌拉特后旗\",\n\t \"150826\": \"杭锦后旗\",\n\t \"150827\": \"其它区\",\n\t \"150900\": \"乌兰察布市\",\n\t \"150902\": \"集宁区\",\n\t \"150921\": \"卓资县\",\n\t \"150922\": \"化德县\",\n\t \"150923\": \"商都县\",\n\t \"150924\": \"兴和县\",\n\t \"150925\": \"凉城县\",\n\t \"150926\": \"察哈尔右翼前旗\",\n\t \"150927\": \"察哈尔右翼中旗\",\n\t \"150928\": \"察哈尔右翼后旗\",\n\t \"150929\": \"四子王旗\",\n\t \"150981\": \"丰镇市\",\n\t \"150982\": \"其它区\",\n\t \"152200\": \"兴安盟\",\n\t \"152201\": \"乌兰浩特市\",\n\t \"152202\": \"阿尔山市\",\n\t \"152221\": \"科尔沁右翼前旗\",\n\t \"152222\": \"科尔沁右翼中旗\",\n\t \"152223\": \"扎赉特旗\",\n\t \"152224\": \"突泉县\",\n\t \"152225\": \"其它区\",\n\t \"152500\": \"锡林郭勒盟\",\n\t \"152501\": \"二连浩特市\",\n\t \"152502\": \"锡林浩特市\",\n\t \"152522\": \"阿巴嘎旗\",\n\t \"152523\": \"苏尼特左旗\",\n\t \"152524\": \"苏尼特右旗\",\n\t \"152525\": \"东乌珠穆沁旗\",\n\t \"152526\": \"西乌珠穆沁旗\",\n\t \"152527\": \"太仆寺旗\",\n\t \"152528\": \"镶黄旗\",\n\t \"152529\": \"正镶白旗\",\n\t \"152530\": \"正蓝旗\",\n\t \"152531\": \"多伦县\",\n\t \"152532\": \"其它区\",\n\t \"152900\": \"阿拉善盟\",\n\t \"152921\": \"阿拉善左旗\",\n\t \"152922\": \"阿拉善右旗\",\n\t \"152923\": \"额济纳旗\",\n\t \"152924\": \"其它区\",\n\t \"210000\": \"辽宁省\",\n\t \"210100\": \"沈阳市\",\n\t \"210102\": \"和平区\",\n\t \"210103\": \"沈河区\",\n\t \"210104\": \"大东区\",\n\t \"210105\": \"皇姑区\",\n\t \"210106\": \"铁西区\",\n\t \"210111\": \"苏家屯区\",\n\t \"210112\": \"东陵区\",\n\t \"210113\": \"新城子区\",\n\t \"210114\": \"于洪区\",\n\t \"210122\": \"辽中县\",\n\t \"210123\": \"康平县\",\n\t \"210124\": \"法库县\",\n\t \"210181\": \"新民市\",\n\t \"210184\": \"沈北新区\",\n\t \"210185\": \"其它区\",\n\t \"210200\": \"大连市\",\n\t \"210202\": \"中山区\",\n\t \"210203\": \"西岗区\",\n\t \"210204\": \"沙河口区\",\n\t \"210211\": \"甘井子区\",\n\t \"210212\": \"旅顺口区\",\n\t \"210213\": \"金州区\",\n\t \"210224\": \"长海县\",\n\t \"210281\": \"瓦房店市\",\n\t \"210282\": \"普兰店市\",\n\t \"210283\": \"庄河市\",\n\t \"210298\": \"其它区\",\n\t \"210300\": \"鞍山市\",\n\t \"210302\": \"铁东区\",\n\t \"210303\": \"铁西区\",\n\t \"210304\": \"立山区\",\n\t \"210311\": \"千山区\",\n\t \"210321\": \"台安县\",\n\t \"210323\": \"岫岩满族自治县\",\n\t \"210381\": \"海城市\",\n\t \"210382\": \"其它区\",\n\t \"210400\": \"抚顺市\",\n\t \"210402\": \"新抚区\",\n\t \"210403\": \"东洲区\",\n\t \"210404\": \"望花区\",\n\t \"210411\": \"顺城区\",\n\t \"210421\": \"抚顺县\",\n\t \"210422\": \"新宾满族自治县\",\n\t \"210423\": \"清原满族自治县\",\n\t \"210424\": \"其它区\",\n\t \"210500\": \"本溪市\",\n\t \"210502\": \"平山区\",\n\t \"210503\": \"溪湖区\",\n\t \"210504\": \"明山区\",\n\t \"210505\": \"南芬区\",\n\t \"210521\": \"本溪满族自治县\",\n\t \"210522\": \"桓仁满族自治县\",\n\t \"210523\": \"其它区\",\n\t \"210600\": \"丹东市\",\n\t \"210602\": \"元宝区\",\n\t \"210603\": \"振兴区\",\n\t \"210604\": \"振安区\",\n\t \"210624\": \"宽甸满族自治县\",\n\t \"210681\": \"东港市\",\n\t \"210682\": \"凤城市\",\n\t \"210683\": \"其它区\",\n\t \"210700\": \"锦州市\",\n\t \"210702\": \"古塔区\",\n\t \"210703\": \"凌河区\",\n\t \"210711\": \"太和区\",\n\t \"210726\": \"黑山县\",\n\t \"210727\": \"义县\",\n\t \"210781\": \"凌海市\",\n\t \"210782\": \"北镇市\",\n\t \"210783\": \"其它区\",\n\t \"210800\": \"营口市\",\n\t \"210802\": \"站前区\",\n\t \"210803\": \"西市区\",\n\t \"210804\": \"鲅鱼圈区\",\n\t \"210811\": \"老边区\",\n\t \"210881\": \"盖州市\",\n\t \"210882\": \"大石桥市\",\n\t \"210883\": \"其它区\",\n\t \"210900\": \"阜新市\",\n\t \"210902\": \"海州区\",\n\t \"210903\": \"新邱区\",\n\t \"210904\": \"太平区\",\n\t \"210905\": \"清河门区\",\n\t \"210911\": \"细河区\",\n\t \"210921\": \"阜新蒙古族自治县\",\n\t \"210922\": \"彰武县\",\n\t \"210923\": \"其它区\",\n\t \"211000\": \"辽阳市\",\n\t \"211002\": \"白塔区\",\n\t \"211003\": \"文圣区\",\n\t \"211004\": \"宏伟区\",\n\t \"211005\": \"弓长岭区\",\n\t \"211011\": \"太子河区\",\n\t \"211021\": \"辽阳县\",\n\t \"211081\": \"灯塔市\",\n\t \"211082\": \"其它区\",\n\t \"211100\": \"盘锦市\",\n\t \"211102\": \"双台子区\",\n\t \"211103\": \"兴隆台区\",\n\t \"211121\": \"大洼县\",\n\t \"211122\": \"盘山县\",\n\t \"211123\": \"其它区\",\n\t \"211200\": \"铁岭市\",\n\t \"211202\": \"银州区\",\n\t \"211204\": \"清河区\",\n\t \"211221\": \"铁岭县\",\n\t \"211223\": \"西丰县\",\n\t \"211224\": \"昌图县\",\n\t \"211281\": \"调兵山市\",\n\t \"211282\": \"开原市\",\n\t \"211283\": \"其它区\",\n\t \"211300\": \"朝阳市\",\n\t \"211302\": \"双塔区\",\n\t \"211303\": \"龙城区\",\n\t \"211321\": \"朝阳县\",\n\t \"211322\": \"建平县\",\n\t \"211324\": \"喀喇沁左翼蒙古族自治县\",\n\t \"211381\": \"北票市\",\n\t \"211382\": \"凌源市\",\n\t \"211383\": \"其它区\",\n\t \"211400\": \"葫芦岛市\",\n\t \"211402\": \"连山区\",\n\t \"211403\": \"龙港区\",\n\t \"211404\": \"南票区\",\n\t \"211421\": \"绥中县\",\n\t \"211422\": \"建昌县\",\n\t \"211481\": \"兴城市\",\n\t \"211482\": \"其它区\",\n\t \"220000\": \"吉林省\",\n\t \"220100\": \"长春市\",\n\t \"220102\": \"南关区\",\n\t \"220103\": \"宽城区\",\n\t \"220104\": \"朝阳区\",\n\t \"220105\": \"二道区\",\n\t \"220106\": \"绿园区\",\n\t \"220112\": \"双阳区\",\n\t \"220122\": \"农安县\",\n\t \"220181\": \"九台市\",\n\t \"220182\": \"榆树市\",\n\t \"220183\": \"德惠市\",\n\t \"220188\": \"其它区\",\n\t \"220200\": \"吉林市\",\n\t \"220202\": \"昌邑区\",\n\t \"220203\": \"龙潭区\",\n\t \"220204\": \"船营区\",\n\t \"220211\": \"丰满区\",\n\t \"220221\": \"永吉县\",\n\t \"220281\": \"蛟河市\",\n\t \"220282\": \"桦甸市\",\n\t \"220283\": \"舒兰市\",\n\t \"220284\": \"磐石市\",\n\t \"220285\": \"其它区\",\n\t \"220300\": \"四平市\",\n\t \"220302\": \"铁西区\",\n\t \"220303\": \"铁东区\",\n\t \"220322\": \"梨树县\",\n\t \"220323\": \"伊通满族自治县\",\n\t \"220381\": \"公主岭市\",\n\t \"220382\": \"双辽市\",\n\t \"220383\": \"其它区\",\n\t \"220400\": \"辽源市\",\n\t \"220402\": \"龙山区\",\n\t \"220403\": \"西安区\",\n\t \"220421\": \"东丰县\",\n\t \"220422\": \"东辽县\",\n\t \"220423\": \"其它区\",\n\t \"220500\": \"通化市\",\n\t \"220502\": \"东昌区\",\n\t \"220503\": \"二道江区\",\n\t \"220521\": \"通化县\",\n\t \"220523\": \"辉南县\",\n\t \"220524\": \"柳河县\",\n\t \"220581\": \"梅河口市\",\n\t \"220582\": \"集安市\",\n\t \"220583\": \"其它区\",\n\t \"220600\": \"白山市\",\n\t \"220602\": \"浑江区\",\n\t \"220621\": \"抚松县\",\n\t \"220622\": \"靖宇县\",\n\t \"220623\": \"长白朝鲜族自治县\",\n\t \"220625\": \"江源区\",\n\t \"220681\": \"临江市\",\n\t \"220682\": \"其它区\",\n\t \"220700\": \"松原市\",\n\t \"220702\": \"宁江区\",\n\t \"220721\": \"前郭尔罗斯蒙古族自治县\",\n\t \"220722\": \"长岭县\",\n\t \"220723\": \"乾安县\",\n\t \"220724\": \"扶余市\",\n\t \"220725\": \"其它区\",\n\t \"220800\": \"白城市\",\n\t \"220802\": \"洮北区\",\n\t \"220821\": \"镇赉县\",\n\t \"220822\": \"通榆县\",\n\t \"220881\": \"洮南市\",\n\t \"220882\": \"大安市\",\n\t \"220883\": \"其它区\",\n\t \"222400\": \"延边朝鲜族自治州\",\n\t \"222401\": \"延吉市\",\n\t \"222402\": \"图们市\",\n\t \"222403\": \"敦化市\",\n\t \"222404\": \"珲春市\",\n\t \"222405\": \"龙井市\",\n\t \"222406\": \"和龙市\",\n\t \"222424\": \"汪清县\",\n\t \"222426\": \"安图县\",\n\t \"222427\": \"其它区\",\n\t \"230000\": \"黑龙江省\",\n\t \"230100\": \"哈尔滨市\",\n\t \"230102\": \"道里区\",\n\t \"230103\": \"南岗区\",\n\t \"230104\": \"道外区\",\n\t \"230106\": \"香坊区\",\n\t \"230108\": \"平房区\",\n\t \"230109\": \"松北区\",\n\t \"230111\": \"呼兰区\",\n\t \"230123\": \"依兰县\",\n\t \"230124\": \"方正县\",\n\t \"230125\": \"宾县\",\n\t \"230126\": \"巴彦县\",\n\t \"230127\": \"木兰县\",\n\t \"230128\": \"通河县\",\n\t \"230129\": \"延寿县\",\n\t \"230181\": \"阿城区\",\n\t \"230182\": \"双城市\",\n\t \"230183\": \"尚志市\",\n\t \"230184\": \"五常市\",\n\t \"230186\": \"其它区\",\n\t \"230200\": \"齐齐哈尔市\",\n\t \"230202\": \"龙沙区\",\n\t \"230203\": \"建华区\",\n\t \"230204\": \"铁锋区\",\n\t \"230205\": \"昂昂溪区\",\n\t \"230206\": \"富拉尔基区\",\n\t \"230207\": \"碾子山区\",\n\t \"230208\": \"梅里斯达斡尔族区\",\n\t \"230221\": \"龙江县\",\n\t \"230223\": \"依安县\",\n\t \"230224\": \"泰来县\",\n\t \"230225\": \"甘南县\",\n\t \"230227\": \"富裕县\",\n\t \"230229\": \"克山县\",\n\t \"230230\": \"克东县\",\n\t \"230231\": \"拜泉县\",\n\t \"230281\": \"讷河市\",\n\t \"230282\": \"其它区\",\n\t \"230300\": \"鸡西市\",\n\t \"230302\": \"鸡冠区\",\n\t \"230303\": \"恒山区\",\n\t \"230304\": \"滴道区\",\n\t \"230305\": \"梨树区\",\n\t \"230306\": \"城子河区\",\n\t \"230307\": \"麻山区\",\n\t \"230321\": \"鸡东县\",\n\t \"230381\": \"虎林市\",\n\t \"230382\": \"密山市\",\n\t \"230383\": \"其它区\",\n\t \"230400\": \"鹤岗市\",\n\t \"230402\": \"向阳区\",\n\t \"230403\": \"工农区\",\n\t \"230404\": \"南山区\",\n\t \"230405\": \"兴安区\",\n\t \"230406\": \"东山区\",\n\t \"230407\": \"兴山区\",\n\t \"230421\": \"萝北县\",\n\t \"230422\": \"绥滨县\",\n\t \"230423\": \"其它区\",\n\t \"230500\": \"双鸭山市\",\n\t \"230502\": \"尖山区\",\n\t \"230503\": \"岭东区\",\n\t \"230505\": \"四方台区\",\n\t \"230506\": \"宝山区\",\n\t \"230521\": \"集贤县\",\n\t \"230522\": \"友谊县\",\n\t \"230523\": \"宝清县\",\n\t \"230524\": \"饶河县\",\n\t \"230525\": \"其它区\",\n\t \"230600\": \"大庆市\",\n\t \"230602\": \"萨尔图区\",\n\t \"230603\": \"龙凤区\",\n\t \"230604\": \"让胡路区\",\n\t \"230605\": \"红岗区\",\n\t \"230606\": \"大同区\",\n\t \"230621\": \"肇州县\",\n\t \"230622\": \"肇源县\",\n\t \"230623\": \"林甸县\",\n\t \"230624\": \"杜尔伯特蒙古族自治县\",\n\t \"230625\": \"其它区\",\n\t \"230700\": \"伊春市\",\n\t \"230702\": \"伊春区\",\n\t \"230703\": \"南岔区\",\n\t \"230704\": \"友好区\",\n\t \"230705\": \"西林区\",\n\t \"230706\": \"翠峦区\",\n\t \"230707\": \"新青区\",\n\t \"230708\": \"美溪区\",\n\t \"230709\": \"金山屯区\",\n\t \"230710\": \"五营区\",\n\t \"230711\": \"乌马河区\",\n\t \"230712\": \"汤旺河区\",\n\t \"230713\": \"带岭区\",\n\t \"230714\": \"乌伊岭区\",\n\t \"230715\": \"红星区\",\n\t \"230716\": \"上甘岭区\",\n\t \"230722\": \"嘉荫县\",\n\t \"230781\": \"铁力市\",\n\t \"230782\": \"其它区\",\n\t \"230800\": \"佳木斯市\",\n\t \"230803\": \"向阳区\",\n\t \"230804\": \"前进区\",\n\t \"230805\": \"东风区\",\n\t \"230811\": \"郊区\",\n\t \"230822\": \"桦南县\",\n\t \"230826\": \"桦川县\",\n\t \"230828\": \"汤原县\",\n\t \"230833\": \"抚远县\",\n\t \"230881\": \"同江市\",\n\t \"230882\": \"富锦市\",\n\t \"230883\": \"其它区\",\n\t \"230900\": \"七台河市\",\n\t \"230902\": \"新兴区\",\n\t \"230903\": \"桃山区\",\n\t \"230904\": \"茄子河区\",\n\t \"230921\": \"勃利县\",\n\t \"230922\": \"其它区\",\n\t \"231000\": \"牡丹江市\",\n\t \"231002\": \"东安区\",\n\t \"231003\": \"阳明区\",\n\t \"231004\": \"爱民区\",\n\t \"231005\": \"西安区\",\n\t \"231024\": \"东宁县\",\n\t \"231025\": \"林口县\",\n\t \"231081\": \"绥芬河市\",\n\t \"231083\": \"海林市\",\n\t \"231084\": \"宁安市\",\n\t \"231085\": \"穆棱市\",\n\t \"231086\": \"其它区\",\n\t \"231100\": \"黑河市\",\n\t \"231102\": \"爱辉区\",\n\t \"231121\": \"嫩江县\",\n\t \"231123\": \"逊克县\",\n\t \"231124\": \"孙吴县\",\n\t \"231181\": \"北安市\",\n\t \"231182\": \"五大连池市\",\n\t \"231183\": \"其它区\",\n\t \"231200\": \"绥化市\",\n\t \"231202\": \"北林区\",\n\t \"231221\": \"望奎县\",\n\t \"231222\": \"兰西县\",\n\t \"231223\": \"青冈县\",\n\t \"231224\": \"庆安县\",\n\t \"231225\": \"明水县\",\n\t \"231226\": \"绥棱县\",\n\t \"231281\": \"安达市\",\n\t \"231282\": \"肇东市\",\n\t \"231283\": \"海伦市\",\n\t \"231284\": \"其它区\",\n\t \"232700\": \"大兴安岭地区\",\n\t \"232702\": \"松岭区\",\n\t \"232703\": \"新林区\",\n\t \"232704\": \"呼中区\",\n\t \"232721\": \"呼玛县\",\n\t \"232722\": \"塔河县\",\n\t \"232723\": \"漠河县\",\n\t \"232724\": \"加格达奇区\",\n\t \"232725\": \"其它区\",\n\t \"310000\": \"上海\",\n\t \"310100\": \"上海市\",\n\t \"310101\": \"黄浦区\",\n\t \"310104\": \"徐汇区\",\n\t \"310105\": \"长宁区\",\n\t \"310106\": \"静安区\",\n\t \"310107\": \"普陀区\",\n\t \"310108\": \"闸北区\",\n\t \"310109\": \"虹口区\",\n\t \"310110\": \"杨浦区\",\n\t \"310112\": \"闵行区\",\n\t \"310113\": \"宝山区\",\n\t \"310114\": \"嘉定区\",\n\t \"310115\": \"浦东新区\",\n\t \"310116\": \"金山区\",\n\t \"310117\": \"松江区\",\n\t \"310118\": \"青浦区\",\n\t \"310120\": \"奉贤区\",\n\t \"310230\": \"崇明县\",\n\t \"310231\": \"其它区\",\n\t \"320000\": \"江苏省\",\n\t \"320100\": \"南京市\",\n\t \"320102\": \"玄武区\",\n\t \"320104\": \"秦淮区\",\n\t \"320105\": \"建邺区\",\n\t \"320106\": \"鼓楼区\",\n\t \"320111\": \"浦口区\",\n\t \"320113\": \"栖霞区\",\n\t \"320114\": \"雨花台区\",\n\t \"320115\": \"江宁区\",\n\t \"320116\": \"六合区\",\n\t \"320124\": \"溧水区\",\n\t \"320125\": \"高淳区\",\n\t \"320126\": \"其它区\",\n\t \"320200\": \"无锡市\",\n\t \"320202\": \"崇安区\",\n\t \"320203\": \"南长区\",\n\t \"320204\": \"北塘区\",\n\t \"320205\": \"锡山区\",\n\t \"320206\": \"惠山区\",\n\t \"320211\": \"滨湖区\",\n\t \"320281\": \"江阴市\",\n\t \"320282\": \"宜兴市\",\n\t \"320297\": \"其它区\",\n\t \"320300\": \"徐州市\",\n\t \"320302\": \"鼓楼区\",\n\t \"320303\": \"云龙区\",\n\t \"320305\": \"贾汪区\",\n\t \"320311\": \"泉山区\",\n\t \"320321\": \"丰县\",\n\t \"320322\": \"沛县\",\n\t \"320323\": \"铜山区\",\n\t \"320324\": \"睢宁县\",\n\t \"320381\": \"新沂市\",\n\t \"320382\": \"邳州市\",\n\t \"320383\": \"其它区\",\n\t \"320400\": \"常州市\",\n\t \"320402\": \"天宁区\",\n\t \"320404\": \"钟楼区\",\n\t \"320405\": \"戚墅堰区\",\n\t \"320411\": \"新北区\",\n\t \"320412\": \"武进区\",\n\t \"320481\": \"溧阳市\",\n\t \"320482\": \"金坛市\",\n\t \"320483\": \"其它区\",\n\t \"320500\": \"苏州市\",\n\t \"320505\": \"虎丘区\",\n\t \"320506\": \"吴中区\",\n\t \"320507\": \"相城区\",\n\t \"320508\": \"姑苏区\",\n\t \"320581\": \"常熟市\",\n\t \"320582\": \"张家港市\",\n\t \"320583\": \"昆山市\",\n\t \"320584\": \"吴江区\",\n\t \"320585\": \"太仓市\",\n\t \"320596\": \"其它区\",\n\t \"320600\": \"南通市\",\n\t \"320602\": \"崇川区\",\n\t \"320611\": \"港闸区\",\n\t \"320612\": \"通州区\",\n\t \"320621\": \"海安县\",\n\t \"320623\": \"如东县\",\n\t \"320681\": \"启东市\",\n\t \"320682\": \"如皋市\",\n\t \"320684\": \"海门市\",\n\t \"320694\": \"其它区\",\n\t \"320700\": \"连云港市\",\n\t \"320703\": \"连云区\",\n\t \"320705\": \"新浦区\",\n\t \"320706\": \"海州区\",\n\t \"320721\": \"赣榆县\",\n\t \"320722\": \"东海县\",\n\t \"320723\": \"灌云县\",\n\t \"320724\": \"灌南县\",\n\t \"320725\": \"其它区\",\n\t \"320800\": \"淮安市\",\n\t \"320802\": \"清河区\",\n\t \"320803\": \"淮安区\",\n\t \"320804\": \"淮阴区\",\n\t \"320811\": \"清浦区\",\n\t \"320826\": \"涟水县\",\n\t \"320829\": \"洪泽县\",\n\t \"320830\": \"盱眙县\",\n\t \"320831\": \"金湖县\",\n\t \"320832\": \"其它区\",\n\t \"320900\": \"盐城市\",\n\t \"320902\": \"亭湖区\",\n\t \"320903\": \"盐都区\",\n\t \"320921\": \"响水县\",\n\t \"320922\": \"滨海县\",\n\t \"320923\": \"阜宁县\",\n\t \"320924\": \"射阳县\",\n\t \"320925\": \"建湖县\",\n\t \"320981\": \"东台市\",\n\t \"320982\": \"大丰市\",\n\t \"320983\": \"其它区\",\n\t \"321000\": \"扬州市\",\n\t \"321002\": \"广陵区\",\n\t \"321003\": \"邗江区\",\n\t \"321023\": \"宝应县\",\n\t \"321081\": \"仪征市\",\n\t \"321084\": \"高邮市\",\n\t \"321088\": \"江都区\",\n\t \"321093\": \"其它区\",\n\t \"321100\": \"镇江市\",\n\t \"321102\": \"京口区\",\n\t \"321111\": \"润州区\",\n\t \"321112\": \"丹徒区\",\n\t \"321181\": \"丹阳市\",\n\t \"321182\": \"扬中市\",\n\t \"321183\": \"句容市\",\n\t \"321184\": \"其它区\",\n\t \"321200\": \"泰州市\",\n\t \"321202\": \"海陵区\",\n\t \"321203\": \"高港区\",\n\t \"321281\": \"兴化市\",\n\t \"321282\": \"靖江市\",\n\t \"321283\": \"泰兴市\",\n\t \"321284\": \"姜堰区\",\n\t \"321285\": \"其它区\",\n\t \"321300\": \"宿迁市\",\n\t \"321302\": \"宿城区\",\n\t \"321311\": \"宿豫区\",\n\t \"321322\": \"沭阳县\",\n\t \"321323\": \"泗阳县\",\n\t \"321324\": \"泗洪县\",\n\t \"321325\": \"其它区\",\n\t \"330000\": \"浙江省\",\n\t \"330100\": \"杭州市\",\n\t \"330102\": \"上城区\",\n\t \"330103\": \"下城区\",\n\t \"330104\": \"江干区\",\n\t \"330105\": \"拱墅区\",\n\t \"330106\": \"西湖区\",\n\t \"330108\": \"滨江区\",\n\t \"330109\": \"萧山区\",\n\t \"330110\": \"余杭区\",\n\t \"330122\": \"桐庐县\",\n\t \"330127\": \"淳安县\",\n\t \"330182\": \"建德市\",\n\t \"330183\": \"富阳市\",\n\t \"330185\": \"临安市\",\n\t \"330186\": \"其它区\",\n\t \"330200\": \"宁波市\",\n\t \"330203\": \"海曙区\",\n\t \"330204\": \"江东区\",\n\t \"330205\": \"江北区\",\n\t \"330206\": \"北仑区\",\n\t \"330211\": \"镇海区\",\n\t \"330212\": \"鄞州区\",\n\t \"330225\": \"象山县\",\n\t \"330226\": \"宁海县\",\n\t \"330281\": \"余姚市\",\n\t \"330282\": \"慈溪市\",\n\t \"330283\": \"奉化市\",\n\t \"330284\": \"其它区\",\n\t \"330300\": \"温州市\",\n\t \"330302\": \"鹿城区\",\n\t \"330303\": \"龙湾区\",\n\t \"330304\": \"瓯海区\",\n\t \"330322\": \"洞头县\",\n\t \"330324\": \"永嘉县\",\n\t \"330326\": \"平阳县\",\n\t \"330327\": \"苍南县\",\n\t \"330328\": \"文成县\",\n\t \"330329\": \"泰顺县\",\n\t \"330381\": \"瑞安市\",\n\t \"330382\": \"乐清市\",\n\t \"330383\": \"其它区\",\n\t \"330400\": \"嘉兴市\",\n\t \"330402\": \"南湖区\",\n\t \"330411\": \"秀洲区\",\n\t \"330421\": \"嘉善县\",\n\t \"330424\": \"海盐县\",\n\t \"330481\": \"海宁市\",\n\t \"330482\": \"平湖市\",\n\t \"330483\": \"桐乡市\",\n\t \"330484\": \"其它区\",\n\t \"330500\": \"湖州市\",\n\t \"330502\": \"吴兴区\",\n\t \"330503\": \"南浔区\",\n\t \"330521\": \"德清县\",\n\t \"330522\": \"长兴县\",\n\t \"330523\": \"安吉县\",\n\t \"330524\": \"其它区\",\n\t \"330600\": \"绍兴市\",\n\t \"330602\": \"越城区\",\n\t \"330621\": \"绍兴县\",\n\t \"330624\": \"新昌县\",\n\t \"330681\": \"诸暨市\",\n\t \"330682\": \"上虞市\",\n\t \"330683\": \"嵊州市\",\n\t \"330684\": \"其它区\",\n\t \"330700\": \"金华市\",\n\t \"330702\": \"婺城区\",\n\t \"330703\": \"金东区\",\n\t \"330723\": \"武义县\",\n\t \"330726\": \"浦江县\",\n\t \"330727\": \"磐安县\",\n\t \"330781\": \"兰溪市\",\n\t \"330782\": \"义乌市\",\n\t \"330783\": \"东阳市\",\n\t \"330784\": \"永康市\",\n\t \"330785\": \"其它区\",\n\t \"330800\": \"衢州市\",\n\t \"330802\": \"柯城区\",\n\t \"330803\": \"衢江区\",\n\t \"330822\": \"常山县\",\n\t \"330824\": \"开化县\",\n\t \"330825\": \"龙游县\",\n\t \"330881\": \"江山市\",\n\t \"330882\": \"其它区\",\n\t \"330900\": \"舟山市\",\n\t \"330902\": \"定海区\",\n\t \"330903\": \"普陀区\",\n\t \"330921\": \"岱山县\",\n\t \"330922\": \"嵊泗县\",\n\t \"330923\": \"其它区\",\n\t \"331000\": \"台州市\",\n\t \"331002\": \"椒江区\",\n\t \"331003\": \"黄岩区\",\n\t \"331004\": \"路桥区\",\n\t \"331021\": \"玉环县\",\n\t \"331022\": \"三门县\",\n\t \"331023\": \"天台县\",\n\t \"331024\": \"仙居县\",\n\t \"331081\": \"温岭市\",\n\t \"331082\": \"临海市\",\n\t \"331083\": \"其它区\",\n\t \"331100\": \"丽水市\",\n\t \"331102\": \"莲都区\",\n\t \"331121\": \"青田县\",\n\t \"331122\": \"缙云县\",\n\t \"331123\": \"遂昌县\",\n\t \"331124\": \"松阳县\",\n\t \"331125\": \"云和县\",\n\t \"331126\": \"庆元县\",\n\t \"331127\": \"景宁畲族自治县\",\n\t \"331181\": \"龙泉市\",\n\t \"331182\": \"其它区\",\n\t \"340000\": \"安徽省\",\n\t \"340100\": \"合肥市\",\n\t \"340102\": \"瑶海区\",\n\t \"340103\": \"庐阳区\",\n\t \"340104\": \"蜀山区\",\n\t \"340111\": \"包河区\",\n\t \"340121\": \"长丰县\",\n\t \"340122\": \"肥东县\",\n\t \"340123\": \"肥西县\",\n\t \"340192\": \"其它区\",\n\t \"340200\": \"芜湖市\",\n\t \"340202\": \"镜湖区\",\n\t \"340203\": \"弋江区\",\n\t \"340207\": \"鸠江区\",\n\t \"340208\": \"三山区\",\n\t \"340221\": \"芜湖县\",\n\t \"340222\": \"繁昌县\",\n\t \"340223\": \"南陵县\",\n\t \"340224\": \"其它区\",\n\t \"340300\": \"蚌埠市\",\n\t \"340302\": \"龙子湖区\",\n\t \"340303\": \"蚌山区\",\n\t \"340304\": \"禹会区\",\n\t \"340311\": \"淮上区\",\n\t \"340321\": \"怀远县\",\n\t \"340322\": \"五河县\",\n\t \"340323\": \"固镇县\",\n\t \"340324\": \"其它区\",\n\t \"340400\": \"淮南市\",\n\t \"340402\": \"大通区\",\n\t \"340403\": \"田家庵区\",\n\t \"340404\": \"谢家集区\",\n\t \"340405\": \"八公山区\",\n\t \"340406\": \"潘集区\",\n\t \"340421\": \"凤台县\",\n\t \"340422\": \"其它区\",\n\t \"340500\": \"马鞍山市\",\n\t \"340503\": \"花山区\",\n\t \"340504\": \"雨山区\",\n\t \"340506\": \"博望区\",\n\t \"340521\": \"当涂县\",\n\t \"340522\": \"其它区\",\n\t \"340600\": \"淮北市\",\n\t \"340602\": \"杜集区\",\n\t \"340603\": \"相山区\",\n\t \"340604\": \"烈山区\",\n\t \"340621\": \"濉溪县\",\n\t \"340622\": \"其它区\",\n\t \"340700\": \"铜陵市\",\n\t \"340702\": \"铜官山区\",\n\t \"340703\": \"狮子山区\",\n\t \"340711\": \"郊区\",\n\t \"340721\": \"铜陵县\",\n\t \"340722\": \"其它区\",\n\t \"340800\": \"安庆市\",\n\t \"340802\": \"迎江区\",\n\t \"340803\": \"大观区\",\n\t \"340811\": \"宜秀区\",\n\t \"340822\": \"怀宁县\",\n\t \"340823\": \"枞阳县\",\n\t \"340824\": \"潜山县\",\n\t \"340825\": \"太湖县\",\n\t \"340826\": \"宿松县\",\n\t \"340827\": \"望江县\",\n\t \"340828\": \"岳西县\",\n\t \"340881\": \"桐城市\",\n\t \"340882\": \"其它区\",\n\t \"341000\": \"黄山市\",\n\t \"341002\": \"屯溪区\",\n\t \"341003\": \"黄山区\",\n\t \"341004\": \"徽州区\",\n\t \"341021\": \"歙县\",\n\t \"341022\": \"休宁县\",\n\t \"341023\": \"黟县\",\n\t \"341024\": \"祁门县\",\n\t \"341025\": \"其它区\",\n\t \"341100\": \"滁州市\",\n\t \"341102\": \"琅琊区\",\n\t \"341103\": \"南谯区\",\n\t \"341122\": \"来安县\",\n\t \"341124\": \"全椒县\",\n\t \"341125\": \"定远县\",\n\t \"341126\": \"凤阳县\",\n\t \"341181\": \"天长市\",\n\t \"341182\": \"明光市\",\n\t \"341183\": \"其它区\",\n\t \"341200\": \"阜阳市\",\n\t \"341202\": \"颍州区\",\n\t \"341203\": \"颍东区\",\n\t \"341204\": \"颍泉区\",\n\t \"341221\": \"临泉县\",\n\t \"341222\": \"太和县\",\n\t \"341225\": \"阜南县\",\n\t \"341226\": \"颍上县\",\n\t \"341282\": \"界首市\",\n\t \"341283\": \"其它区\",\n\t \"341300\": \"宿州市\",\n\t \"341302\": \"埇桥区\",\n\t \"341321\": \"砀山县\",\n\t \"341322\": \"萧县\",\n\t \"341323\": \"灵璧县\",\n\t \"341324\": \"泗县\",\n\t \"341325\": \"其它区\",\n\t \"341400\": \"巢湖市\",\n\t \"341421\": \"庐江县\",\n\t \"341422\": \"无为县\",\n\t \"341423\": \"含山县\",\n\t \"341424\": \"和县\",\n\t \"341500\": \"六安市\",\n\t \"341502\": \"金安区\",\n\t \"341503\": \"裕安区\",\n\t \"341521\": \"寿县\",\n\t \"341522\": \"霍邱县\",\n\t \"341523\": \"舒城县\",\n\t \"341524\": \"金寨县\",\n\t \"341525\": \"霍山县\",\n\t \"341526\": \"其它区\",\n\t \"341600\": \"亳州市\",\n\t \"341602\": \"谯城区\",\n\t \"341621\": \"涡阳县\",\n\t \"341622\": \"蒙城县\",\n\t \"341623\": \"利辛县\",\n\t \"341624\": \"其它区\",\n\t \"341700\": \"池州市\",\n\t \"341702\": \"贵池区\",\n\t \"341721\": \"东至县\",\n\t \"341722\": \"石台县\",\n\t \"341723\": \"青阳县\",\n\t \"341724\": \"其它区\",\n\t \"341800\": \"宣城市\",\n\t \"341802\": \"宣州区\",\n\t \"341821\": \"郎溪县\",\n\t \"341822\": \"广德县\",\n\t \"341823\": \"泾县\",\n\t \"341824\": \"绩溪县\",\n\t \"341825\": \"旌德县\",\n\t \"341881\": \"宁国市\",\n\t \"341882\": \"其它区\",\n\t \"350000\": \"福建省\",\n\t \"350100\": \"福州市\",\n\t \"350102\": \"鼓楼区\",\n\t \"350103\": \"台江区\",\n\t \"350104\": \"仓山区\",\n\t \"350105\": \"马尾区\",\n\t \"350111\": \"晋安区\",\n\t \"350121\": \"闽侯县\",\n\t \"350122\": \"连江县\",\n\t \"350123\": \"罗源县\",\n\t \"350124\": \"闽清县\",\n\t \"350125\": \"永泰县\",\n\t \"350128\": \"平潭县\",\n\t \"350181\": \"福清市\",\n\t \"350182\": \"长乐市\",\n\t \"350183\": \"其它区\",\n\t \"350200\": \"厦门市\",\n\t \"350203\": \"思明区\",\n\t \"350205\": \"海沧区\",\n\t \"350206\": \"湖里区\",\n\t \"350211\": \"集美区\",\n\t \"350212\": \"同安区\",\n\t \"350213\": \"翔安区\",\n\t \"350214\": \"其它区\",\n\t \"350300\": \"莆田市\",\n\t \"350302\": \"城厢区\",\n\t \"350303\": \"涵江区\",\n\t \"350304\": \"荔城区\",\n\t \"350305\": \"秀屿区\",\n\t \"350322\": \"仙游县\",\n\t \"350323\": \"其它区\",\n\t \"350400\": \"三明市\",\n\t \"350402\": \"梅列区\",\n\t \"350403\": \"三元区\",\n\t \"350421\": \"明溪县\",\n\t \"350423\": \"清流县\",\n\t \"350424\": \"宁化县\",\n\t \"350425\": \"大田县\",\n\t \"350426\": \"尤溪县\",\n\t \"350427\": \"沙县\",\n\t \"350428\": \"将乐县\",\n\t \"350429\": \"泰宁县\",\n\t \"350430\": \"建宁县\",\n\t \"350481\": \"永安市\",\n\t \"350482\": \"其它区\",\n\t \"350500\": \"泉州市\",\n\t \"350502\": \"鲤城区\",\n\t \"350503\": \"丰泽区\",\n\t \"350504\": \"洛江区\",\n\t \"350505\": \"泉港区\",\n\t \"350521\": \"惠安县\",\n\t \"350524\": \"安溪县\",\n\t \"350525\": \"永春县\",\n\t \"350526\": \"德化县\",\n\t \"350527\": \"金门县\",\n\t \"350581\": \"石狮市\",\n\t \"350582\": \"晋江市\",\n\t \"350583\": \"南安市\",\n\t \"350584\": \"其它区\",\n\t \"350600\": \"漳州市\",\n\t \"350602\": \"芗城区\",\n\t \"350603\": \"龙文区\",\n\t \"350622\": \"云霄县\",\n\t \"350623\": \"漳浦县\",\n\t \"350624\": \"诏安县\",\n\t \"350625\": \"长泰县\",\n\t \"350626\": \"东山县\",\n\t \"350627\": \"南靖县\",\n\t \"350628\": \"平和县\",\n\t \"350629\": \"华安县\",\n\t \"350681\": \"龙海市\",\n\t \"350682\": \"其它区\",\n\t \"350700\": \"南平市\",\n\t \"350702\": \"延平区\",\n\t \"350721\": \"顺昌县\",\n\t \"350722\": \"浦城县\",\n\t \"350723\": \"光泽县\",\n\t \"350724\": \"松溪县\",\n\t \"350725\": \"政和县\",\n\t \"350781\": \"邵武市\",\n\t \"350782\": \"武夷山市\",\n\t \"350783\": \"建瓯市\",\n\t \"350784\": \"建阳市\",\n\t \"350785\": \"其它区\",\n\t \"350800\": \"龙岩市\",\n\t \"350802\": \"新罗区\",\n\t \"350821\": \"长汀县\",\n\t \"350822\": \"永定县\",\n\t \"350823\": \"上杭县\",\n\t \"350824\": \"武平县\",\n\t \"350825\": \"连城县\",\n\t \"350881\": \"漳平市\",\n\t \"350882\": \"其它区\",\n\t \"350900\": \"宁德市\",\n\t \"350902\": \"蕉城区\",\n\t \"350921\": \"霞浦县\",\n\t \"350922\": \"古田县\",\n\t \"350923\": \"屏南县\",\n\t \"350924\": \"寿宁县\",\n\t \"350925\": \"周宁县\",\n\t \"350926\": \"柘荣县\",\n\t \"350981\": \"福安市\",\n\t \"350982\": \"福鼎市\",\n\t \"350983\": \"其它区\",\n\t \"360000\": \"江西省\",\n\t \"360100\": \"南昌市\",\n\t \"360102\": \"东湖区\",\n\t \"360103\": \"西湖区\",\n\t \"360104\": \"青云谱区\",\n\t \"360105\": \"湾里区\",\n\t \"360111\": \"青山湖区\",\n\t \"360121\": \"南昌县\",\n\t \"360122\": \"新建县\",\n\t \"360123\": \"安义县\",\n\t \"360124\": \"进贤县\",\n\t \"360128\": \"其它区\",\n\t \"360200\": \"景德镇市\",\n\t \"360202\": \"昌江区\",\n\t \"360203\": \"珠山区\",\n\t \"360222\": \"浮梁县\",\n\t \"360281\": \"乐平市\",\n\t \"360282\": \"其它区\",\n\t \"360300\": \"萍乡市\",\n\t \"360302\": \"安源区\",\n\t \"360313\": \"湘东区\",\n\t \"360321\": \"莲花县\",\n\t \"360322\": \"上栗县\",\n\t \"360323\": \"芦溪县\",\n\t \"360324\": \"其它区\",\n\t \"360400\": \"九江市\",\n\t \"360402\": \"庐山区\",\n\t \"360403\": \"浔阳区\",\n\t \"360421\": \"九江县\",\n\t \"360423\": \"武宁县\",\n\t \"360424\": \"修水县\",\n\t \"360425\": \"永修县\",\n\t \"360426\": \"德安县\",\n\t \"360427\": \"星子县\",\n\t \"360428\": \"都昌县\",\n\t \"360429\": \"湖口县\",\n\t \"360430\": \"彭泽县\",\n\t \"360481\": \"瑞昌市\",\n\t \"360482\": \"其它区\",\n\t \"360483\": \"共青城市\",\n\t \"360500\": \"新余市\",\n\t \"360502\": \"渝水区\",\n\t \"360521\": \"分宜县\",\n\t \"360522\": \"其它区\",\n\t \"360600\": \"鹰潭市\",\n\t \"360602\": \"月湖区\",\n\t \"360622\": \"余江县\",\n\t \"360681\": \"贵溪市\",\n\t \"360682\": \"其它区\",\n\t \"360700\": \"赣州市\",\n\t \"360702\": \"章贡区\",\n\t \"360721\": \"赣县\",\n\t \"360722\": \"信丰县\",\n\t \"360723\": \"大余县\",\n\t \"360724\": \"上犹县\",\n\t \"360725\": \"崇义县\",\n\t \"360726\": \"安远县\",\n\t \"360727\": \"龙南县\",\n\t \"360728\": \"定南县\",\n\t \"360729\": \"全南县\",\n\t \"360730\": \"宁都县\",\n\t \"360731\": \"于都县\",\n\t \"360732\": \"兴国县\",\n\t \"360733\": \"会昌县\",\n\t \"360734\": \"寻乌县\",\n\t \"360735\": \"石城县\",\n\t \"360781\": \"瑞金市\",\n\t \"360782\": \"南康市\",\n\t \"360783\": \"其它区\",\n\t \"360800\": \"吉安市\",\n\t \"360802\": \"吉州区\",\n\t \"360803\": \"青原区\",\n\t \"360821\": \"吉安县\",\n\t \"360822\": \"吉水县\",\n\t \"360823\": \"峡江县\",\n\t \"360824\": \"新干县\",\n\t \"360825\": \"永丰县\",\n\t \"360826\": \"泰和县\",\n\t \"360827\": \"遂川县\",\n\t \"360828\": \"万安县\",\n\t \"360829\": \"安福县\",\n\t \"360830\": \"永新县\",\n\t \"360881\": \"井冈山市\",\n\t \"360882\": \"其它区\",\n\t \"360900\": \"宜春市\",\n\t \"360902\": \"袁州区\",\n\t \"360921\": \"奉新县\",\n\t \"360922\": \"万载县\",\n\t \"360923\": \"上高县\",\n\t \"360924\": \"宜丰县\",\n\t \"360925\": \"靖安县\",\n\t \"360926\": \"铜鼓县\",\n\t \"360981\": \"丰城市\",\n\t \"360982\": \"樟树市\",\n\t \"360983\": \"高安市\",\n\t \"360984\": \"其它区\",\n\t \"361000\": \"抚州市\",\n\t \"361002\": \"临川区\",\n\t \"361021\": \"南城县\",\n\t \"361022\": \"黎川县\",\n\t \"361023\": \"南丰县\",\n\t \"361024\": \"崇仁县\",\n\t \"361025\": \"乐安县\",\n\t \"361026\": \"宜黄县\",\n\t \"361027\": \"金溪县\",\n\t \"361028\": \"资溪县\",\n\t \"361029\": \"东乡县\",\n\t \"361030\": \"广昌县\",\n\t \"361031\": \"其它区\",\n\t \"361100\": \"上饶市\",\n\t \"361102\": \"信州区\",\n\t \"361121\": \"上饶县\",\n\t \"361122\": \"广丰县\",\n\t \"361123\": \"玉山县\",\n\t \"361124\": \"铅山县\",\n\t \"361125\": \"横峰县\",\n\t \"361126\": \"弋阳县\",\n\t \"361127\": \"余干县\",\n\t \"361128\": \"鄱阳县\",\n\t \"361129\": \"万年县\",\n\t \"361130\": \"婺源县\",\n\t \"361181\": \"德兴市\",\n\t \"361182\": \"其它区\",\n\t \"370000\": \"山东省\",\n\t \"370100\": \"济南市\",\n\t \"370102\": \"历下区\",\n\t \"370103\": \"市中区\",\n\t \"370104\": \"槐荫区\",\n\t \"370105\": \"天桥区\",\n\t \"370112\": \"历城区\",\n\t \"370113\": \"长清区\",\n\t \"370124\": \"平阴县\",\n\t \"370125\": \"济阳县\",\n\t \"370126\": \"商河县\",\n\t \"370181\": \"章丘市\",\n\t \"370182\": \"其它区\",\n\t \"370200\": \"青岛市\",\n\t \"370202\": \"市南区\",\n\t \"370203\": \"市北区\",\n\t \"370211\": \"黄岛区\",\n\t \"370212\": \"崂山区\",\n\t \"370213\": \"李沧区\",\n\t \"370214\": \"城阳区\",\n\t \"370281\": \"胶州市\",\n\t \"370282\": \"即墨市\",\n\t \"370283\": \"平度市\",\n\t \"370285\": \"莱西市\",\n\t \"370286\": \"其它区\",\n\t \"370300\": \"淄博市\",\n\t \"370302\": \"淄川区\",\n\t \"370303\": \"张店区\",\n\t \"370304\": \"博山区\",\n\t \"370305\": \"临淄区\",\n\t \"370306\": \"周村区\",\n\t \"370321\": \"桓台县\",\n\t \"370322\": \"高青县\",\n\t \"370323\": \"沂源县\",\n\t \"370324\": \"其它区\",\n\t \"370400\": \"枣庄市\",\n\t \"370402\": \"市中区\",\n\t \"370403\": \"薛城区\",\n\t \"370404\": \"峄城区\",\n\t \"370405\": \"台儿庄区\",\n\t \"370406\": \"山亭区\",\n\t \"370481\": \"滕州市\",\n\t \"370482\": \"其它区\",\n\t \"370500\": \"东营市\",\n\t \"370502\": \"东营区\",\n\t \"370503\": \"河口区\",\n\t \"370521\": \"垦利县\",\n\t \"370522\": \"利津县\",\n\t \"370523\": \"广饶县\",\n\t \"370591\": \"其它区\",\n\t \"370600\": \"烟台市\",\n\t \"370602\": \"芝罘区\",\n\t \"370611\": \"福山区\",\n\t \"370612\": \"牟平区\",\n\t \"370613\": \"莱山区\",\n\t \"370634\": \"长岛县\",\n\t \"370681\": \"龙口市\",\n\t \"370682\": \"莱阳市\",\n\t \"370683\": \"莱州市\",\n\t \"370684\": \"蓬莱市\",\n\t \"370685\": \"招远市\",\n\t \"370686\": \"栖霞市\",\n\t \"370687\": \"海阳市\",\n\t \"370688\": \"其它区\",\n\t \"370700\": \"潍坊市\",\n\t \"370702\": \"潍城区\",\n\t \"370703\": \"寒亭区\",\n\t \"370704\": \"坊子区\",\n\t \"370705\": \"奎文区\",\n\t \"370724\": \"临朐县\",\n\t \"370725\": \"昌乐县\",\n\t \"370781\": \"青州市\",\n\t \"370782\": \"诸城市\",\n\t \"370783\": \"寿光市\",\n\t \"370784\": \"安丘市\",\n\t \"370785\": \"高密市\",\n\t \"370786\": \"昌邑市\",\n\t \"370787\": \"其它区\",\n\t \"370800\": \"济宁市\",\n\t \"370802\": \"市中区\",\n\t \"370811\": \"任城区\",\n\t \"370826\": \"微山县\",\n\t \"370827\": \"鱼台县\",\n\t \"370828\": \"金乡县\",\n\t \"370829\": \"嘉祥县\",\n\t \"370830\": \"汶上县\",\n\t \"370831\": \"泗水县\",\n\t \"370832\": \"梁山县\",\n\t \"370881\": \"曲阜市\",\n\t \"370882\": \"兖州市\",\n\t \"370883\": \"邹城市\",\n\t \"370884\": \"其它区\",\n\t \"370900\": \"泰安市\",\n\t \"370902\": \"泰山区\",\n\t \"370903\": \"岱岳区\",\n\t \"370921\": \"宁阳县\",\n\t \"370923\": \"东平县\",\n\t \"370982\": \"新泰市\",\n\t \"370983\": \"肥城市\",\n\t \"370984\": \"其它区\",\n\t \"371000\": \"威海市\",\n\t \"371002\": \"环翠区\",\n\t \"371081\": \"文登市\",\n\t \"371082\": \"荣成市\",\n\t \"371083\": \"乳山市\",\n\t \"371084\": \"其它区\",\n\t \"371100\": \"日照市\",\n\t \"371102\": \"东港区\",\n\t \"371103\": \"岚山区\",\n\t \"371121\": \"五莲县\",\n\t \"371122\": \"莒县\",\n\t \"371123\": \"其它区\",\n\t \"371200\": \"莱芜市\",\n\t \"371202\": \"莱城区\",\n\t \"371203\": \"钢城区\",\n\t \"371204\": \"其它区\",\n\t \"371300\": \"临沂市\",\n\t \"371302\": \"兰山区\",\n\t \"371311\": \"罗庄区\",\n\t \"371312\": \"河东区\",\n\t \"371321\": \"沂南县\",\n\t \"371322\": \"郯城县\",\n\t \"371323\": \"沂水县\",\n\t \"371324\": \"苍山县\",\n\t \"371325\": \"费县\",\n\t \"371326\": \"平邑县\",\n\t \"371327\": \"莒南县\",\n\t \"371328\": \"蒙阴县\",\n\t \"371329\": \"临沭县\",\n\t \"371330\": \"其它区\",\n\t \"371400\": \"德州市\",\n\t \"371402\": \"德城区\",\n\t \"371421\": \"陵县\",\n\t \"371422\": \"宁津县\",\n\t \"371423\": \"庆云县\",\n\t \"371424\": \"临邑县\",\n\t \"371425\": \"齐河县\",\n\t \"371426\": \"平原县\",\n\t \"371427\": \"夏津县\",\n\t \"371428\": \"武城县\",\n\t \"371481\": \"乐陵市\",\n\t \"371482\": \"禹城市\",\n\t \"371483\": \"其它区\",\n\t \"371500\": \"聊城市\",\n\t \"371502\": \"东昌府区\",\n\t \"371521\": \"阳谷县\",\n\t \"371522\": \"莘县\",\n\t \"371523\": \"茌平县\",\n\t \"371524\": \"东阿县\",\n\t \"371525\": \"冠县\",\n\t \"371526\": \"高唐县\",\n\t \"371581\": \"临清市\",\n\t \"371582\": \"其它区\",\n\t \"371600\": \"滨州市\",\n\t \"371602\": \"滨城区\",\n\t \"371621\": \"惠民县\",\n\t \"371622\": \"阳信县\",\n\t \"371623\": \"无棣县\",\n\t \"371624\": \"沾化县\",\n\t \"371625\": \"博兴县\",\n\t \"371626\": \"邹平县\",\n\t \"371627\": \"其它区\",\n\t \"371700\": \"菏泽市\",\n\t \"371702\": \"牡丹区\",\n\t \"371721\": \"曹县\",\n\t \"371722\": \"单县\",\n\t \"371723\": \"成武县\",\n\t \"371724\": \"巨野县\",\n\t \"371725\": \"郓城县\",\n\t \"371726\": \"鄄城县\",\n\t \"371727\": \"定陶县\",\n\t \"371728\": \"东明县\",\n\t \"371729\": \"其它区\",\n\t \"410000\": \"河南省\",\n\t \"410100\": \"郑州市\",\n\t \"410102\": \"中原区\",\n\t \"410103\": \"二七区\",\n\t \"410104\": \"管城回族区\",\n\t \"410105\": \"金水区\",\n\t \"410106\": \"上街区\",\n\t \"410108\": \"惠济区\",\n\t \"410122\": \"中牟县\",\n\t \"410181\": \"巩义市\",\n\t \"410182\": \"荥阳市\",\n\t \"410183\": \"新密市\",\n\t \"410184\": \"新郑市\",\n\t \"410185\": \"登封市\",\n\t \"410188\": \"其它区\",\n\t \"410200\": \"开封市\",\n\t \"410202\": \"龙亭区\",\n\t \"410203\": \"顺河回族区\",\n\t \"410204\": \"鼓楼区\",\n\t \"410205\": \"禹王台区\",\n\t \"410211\": \"金明区\",\n\t \"410221\": \"杞县\",\n\t \"410222\": \"通许县\",\n\t \"410223\": \"尉氏县\",\n\t \"410224\": \"开封县\",\n\t \"410225\": \"兰考县\",\n\t \"410226\": \"其它区\",\n\t \"410300\": \"洛阳市\",\n\t \"410302\": \"老城区\",\n\t \"410303\": \"西工区\",\n\t \"410304\": \"瀍河回族区\",\n\t \"410305\": \"涧西区\",\n\t \"410306\": \"吉利区\",\n\t \"410307\": \"洛龙区\",\n\t \"410322\": \"孟津县\",\n\t \"410323\": \"新安县\",\n\t \"410324\": \"栾川县\",\n\t \"410325\": \"嵩县\",\n\t \"410326\": \"汝阳县\",\n\t \"410327\": \"宜阳县\",\n\t \"410328\": \"洛宁县\",\n\t \"410329\": \"伊川县\",\n\t \"410381\": \"偃师市\",\n\t \"410400\": \"平顶山市\",\n\t \"410402\": \"新华区\",\n\t \"410403\": \"卫东区\",\n\t \"410404\": \"石龙区\",\n\t \"410411\": \"湛河区\",\n\t \"410421\": \"宝丰县\",\n\t \"410422\": \"叶县\",\n\t \"410423\": \"鲁山县\",\n\t \"410425\": \"郏县\",\n\t \"410481\": \"舞钢市\",\n\t \"410482\": \"汝州市\",\n\t \"410483\": \"其它区\",\n\t \"410500\": \"安阳市\",\n\t \"410502\": \"文峰区\",\n\t \"410503\": \"北关区\",\n\t \"410505\": \"殷都区\",\n\t \"410506\": \"龙安区\",\n\t \"410522\": \"安阳县\",\n\t \"410523\": \"汤阴县\",\n\t \"410526\": \"滑县\",\n\t \"410527\": \"内黄县\",\n\t \"410581\": \"林州市\",\n\t \"410582\": \"其它区\",\n\t \"410600\": \"鹤壁市\",\n\t \"410602\": \"鹤山区\",\n\t \"410603\": \"山城区\",\n\t \"410611\": \"淇滨区\",\n\t \"410621\": \"浚县\",\n\t \"410622\": \"淇县\",\n\t \"410623\": \"其它区\",\n\t \"410700\": \"新乡市\",\n\t \"410702\": \"红旗区\",\n\t \"410703\": \"卫滨区\",\n\t \"410704\": \"凤泉区\",\n\t \"410711\": \"牧野区\",\n\t \"410721\": \"新乡县\",\n\t \"410724\": \"获嘉县\",\n\t \"410725\": \"原阳县\",\n\t \"410726\": \"延津县\",\n\t \"410727\": \"封丘县\",\n\t \"410728\": \"长垣县\",\n\t \"410781\": \"卫辉市\",\n\t \"410782\": \"辉县市\",\n\t \"410783\": \"其它区\",\n\t \"410800\": \"焦作市\",\n\t \"410802\": \"解放区\",\n\t \"410803\": \"中站区\",\n\t \"410804\": \"马村区\",\n\t \"410811\": \"山阳区\",\n\t \"410821\": \"修武县\",\n\t \"410822\": \"博爱县\",\n\t \"410823\": \"武陟县\",\n\t \"410825\": \"温县\",\n\t \"410881\": \"济源市\",\n\t \"410882\": \"沁阳市\",\n\t \"410883\": \"孟州市\",\n\t \"410884\": \"其它区\",\n\t \"410900\": \"濮阳市\",\n\t \"410902\": \"华龙区\",\n\t \"410922\": \"清丰县\",\n\t \"410923\": \"南乐县\",\n\t \"410926\": \"范县\",\n\t \"410927\": \"台前县\",\n\t \"410928\": \"濮阳县\",\n\t \"410929\": \"其它区\",\n\t \"411000\": \"许昌市\",\n\t \"411002\": \"魏都区\",\n\t \"411023\": \"许昌县\",\n\t \"411024\": \"鄢陵县\",\n\t \"411025\": \"襄城县\",\n\t \"411081\": \"禹州市\",\n\t \"411082\": \"长葛市\",\n\t \"411083\": \"其它区\",\n\t \"411100\": \"漯河市\",\n\t \"411102\": \"源汇区\",\n\t \"411103\": \"郾城区\",\n\t \"411104\": \"召陵区\",\n\t \"411121\": \"舞阳县\",\n\t \"411122\": \"临颍县\",\n\t \"411123\": \"其它区\",\n\t \"411200\": \"三门峡市\",\n\t \"411202\": \"湖滨区\",\n\t \"411221\": \"渑池县\",\n\t \"411222\": \"陕县\",\n\t \"411224\": \"卢氏县\",\n\t \"411281\": \"义马市\",\n\t \"411282\": \"灵宝市\",\n\t \"411283\": \"其它区\",\n\t \"411300\": \"南阳市\",\n\t \"411302\": \"宛城区\",\n\t \"411303\": \"卧龙区\",\n\t \"411321\": \"南召县\",\n\t \"411322\": \"方城县\",\n\t \"411323\": \"西峡县\",\n\t \"411324\": \"镇平县\",\n\t \"411325\": \"内乡县\",\n\t \"411326\": \"淅川县\",\n\t \"411327\": \"社旗县\",\n\t \"411328\": \"唐河县\",\n\t \"411329\": \"新野县\",\n\t \"411330\": \"桐柏县\",\n\t \"411381\": \"邓州市\",\n\t \"411382\": \"其它区\",\n\t \"411400\": \"商丘市\",\n\t \"411402\": \"梁园区\",\n\t \"411403\": \"睢阳区\",\n\t \"411421\": \"民权县\",\n\t \"411422\": \"睢县\",\n\t \"411423\": \"宁陵县\",\n\t \"411424\": \"柘城县\",\n\t \"411425\": \"虞城县\",\n\t \"411426\": \"夏邑县\",\n\t \"411481\": \"永城市\",\n\t \"411482\": \"其它区\",\n\t \"411500\": \"信阳市\",\n\t \"411502\": \"浉河区\",\n\t \"411503\": \"平桥区\",\n\t \"411521\": \"罗山县\",\n\t \"411522\": \"光山县\",\n\t \"411523\": \"新县\",\n\t \"411524\": \"商城县\",\n\t \"411525\": \"固始县\",\n\t \"411526\": \"潢川县\",\n\t \"411527\": \"淮滨县\",\n\t \"411528\": \"息县\",\n\t \"411529\": \"其它区\",\n\t \"411600\": \"周口市\",\n\t \"411602\": \"川汇区\",\n\t \"411621\": \"扶沟县\",\n\t \"411622\": \"西华县\",\n\t \"411623\": \"商水县\",\n\t \"411624\": \"沈丘县\",\n\t \"411625\": \"郸城县\",\n\t \"411626\": \"淮阳县\",\n\t \"411627\": \"太康县\",\n\t \"411628\": \"鹿邑县\",\n\t \"411681\": \"项城市\",\n\t \"411682\": \"其它区\",\n\t \"411700\": \"驻马店市\",\n\t \"411702\": \"驿城区\",\n\t \"411721\": \"西平县\",\n\t \"411722\": \"上蔡县\",\n\t \"411723\": \"平舆县\",\n\t \"411724\": \"正阳县\",\n\t \"411725\": \"确山县\",\n\t \"411726\": \"泌阳县\",\n\t \"411727\": \"汝南县\",\n\t \"411728\": \"遂平县\",\n\t \"411729\": \"新蔡县\",\n\t \"411730\": \"其它区\",\n\t \"420000\": \"湖北省\",\n\t \"420100\": \"武汉市\",\n\t \"420102\": \"江岸区\",\n\t \"420103\": \"江汉区\",\n\t \"420104\": \"硚口区\",\n\t \"420105\": \"汉阳区\",\n\t \"420106\": \"武昌区\",\n\t \"420107\": \"青山区\",\n\t \"420111\": \"洪山区\",\n\t \"420112\": \"东西湖区\",\n\t \"420113\": \"汉南区\",\n\t \"420114\": \"蔡甸区\",\n\t \"420115\": \"江夏区\",\n\t \"420116\": \"黄陂区\",\n\t \"420117\": \"新洲区\",\n\t \"420118\": \"其它区\",\n\t \"420200\": \"黄石市\",\n\t \"420202\": \"黄石港区\",\n\t \"420203\": \"西塞山区\",\n\t \"420204\": \"下陆区\",\n\t \"420205\": \"铁山区\",\n\t \"420222\": \"阳新县\",\n\t \"420281\": \"大冶市\",\n\t \"420282\": \"其它区\",\n\t \"420300\": \"十堰市\",\n\t \"420302\": \"茅箭区\",\n\t \"420303\": \"张湾区\",\n\t \"420321\": \"郧县\",\n\t \"420322\": \"郧西县\",\n\t \"420323\": \"竹山县\",\n\t \"420324\": \"竹溪县\",\n\t \"420325\": \"房县\",\n\t \"420381\": \"丹江口市\",\n\t \"420383\": \"其它区\",\n\t \"420500\": \"宜昌市\",\n\t \"420502\": \"西陵区\",\n\t \"420503\": \"伍家岗区\",\n\t \"420504\": \"点军区\",\n\t \"420505\": \"猇亭区\",\n\t \"420506\": \"夷陵区\",\n\t \"420525\": \"远安县\",\n\t \"420526\": \"兴山县\",\n\t \"420527\": \"秭归县\",\n\t \"420528\": \"长阳土家族自治县\",\n\t \"420529\": \"五峰土家族自治县\",\n\t \"420581\": \"宜都市\",\n\t \"420582\": \"当阳市\",\n\t \"420583\": \"枝江市\",\n\t \"420584\": \"其它区\",\n\t \"420600\": \"襄阳市\",\n\t \"420602\": \"襄城区\",\n\t \"420606\": \"樊城区\",\n\t \"420607\": \"襄州区\",\n\t \"420624\": \"南漳县\",\n\t \"420625\": \"谷城县\",\n\t \"420626\": \"保康县\",\n\t \"420682\": \"老河口市\",\n\t \"420683\": \"枣阳市\",\n\t \"420684\": \"宜城市\",\n\t \"420685\": \"其它区\",\n\t \"420700\": \"鄂州市\",\n\t \"420702\": \"梁子湖区\",\n\t \"420703\": \"华容区\",\n\t \"420704\": \"鄂城区\",\n\t \"420705\": \"其它区\",\n\t \"420800\": \"荆门市\",\n\t \"420802\": \"东宝区\",\n\t \"420804\": \"掇刀区\",\n\t \"420821\": \"京山县\",\n\t \"420822\": \"沙洋县\",\n\t \"420881\": \"钟祥市\",\n\t \"420882\": \"其它区\",\n\t \"420900\": \"孝感市\",\n\t \"420902\": \"孝南区\",\n\t \"420921\": \"孝昌县\",\n\t \"420922\": \"大悟县\",\n\t \"420923\": \"云梦县\",\n\t \"420981\": \"应城市\",\n\t \"420982\": \"安陆市\",\n\t \"420984\": \"汉川市\",\n\t \"420985\": \"其它区\",\n\t \"421000\": \"荆州市\",\n\t \"421002\": \"沙市区\",\n\t \"421003\": \"荆州区\",\n\t \"421022\": \"公安县\",\n\t \"421023\": \"监利县\",\n\t \"421024\": \"江陵县\",\n\t \"421081\": \"石首市\",\n\t \"421083\": \"洪湖市\",\n\t \"421087\": \"松滋市\",\n\t \"421088\": \"其它区\",\n\t \"421100\": \"黄冈市\",\n\t \"421102\": \"黄州区\",\n\t \"421121\": \"团风县\",\n\t \"421122\": \"红安县\",\n\t \"421123\": \"罗田县\",\n\t \"421124\": \"英山县\",\n\t \"421125\": \"浠水县\",\n\t \"421126\": \"蕲春县\",\n\t \"421127\": \"黄梅县\",\n\t \"421181\": \"麻城市\",\n\t \"421182\": \"武穴市\",\n\t \"421183\": \"其它区\",\n\t \"421200\": \"咸宁市\",\n\t \"421202\": \"咸安区\",\n\t \"421221\": \"嘉鱼县\",\n\t \"421222\": \"通城县\",\n\t \"421223\": \"崇阳县\",\n\t \"421224\": \"通山县\",\n\t \"421281\": \"赤壁市\",\n\t \"421283\": \"其它区\",\n\t \"421300\": \"随州市\",\n\t \"421302\": \"曾都区\",\n\t \"421321\": \"随县\",\n\t \"421381\": \"广水市\",\n\t \"421382\": \"其它区\",\n\t \"422800\": \"恩施土家族苗族自治州\",\n\t \"422801\": \"恩施市\",\n\t \"422802\": \"利川市\",\n\t \"422822\": \"建始县\",\n\t \"422823\": \"巴东县\",\n\t \"422825\": \"宣恩县\",\n\t \"422826\": \"咸丰县\",\n\t \"422827\": \"来凤县\",\n\t \"422828\": \"鹤峰县\",\n\t \"422829\": \"其它区\",\n\t \"429004\": \"仙桃市\",\n\t \"429005\": \"潜江市\",\n\t \"429006\": \"天门市\",\n\t \"429021\": \"神农架林区\",\n\t \"430000\": \"湖南省\",\n\t \"430100\": \"长沙市\",\n\t \"430102\": \"芙蓉区\",\n\t \"430103\": \"天心区\",\n\t \"430104\": \"岳麓区\",\n\t \"430105\": \"开福区\",\n\t \"430111\": \"雨花区\",\n\t \"430121\": \"长沙县\",\n\t \"430122\": \"望城区\",\n\t \"430124\": \"宁乡县\",\n\t \"430181\": \"浏阳市\",\n\t \"430182\": \"其它区\",\n\t \"430200\": \"株洲市\",\n\t \"430202\": \"荷塘区\",\n\t \"430203\": \"芦淞区\",\n\t \"430204\": \"石峰区\",\n\t \"430211\": \"天元区\",\n\t \"430221\": \"株洲县\",\n\t \"430223\": \"攸县\",\n\t \"430224\": \"茶陵县\",\n\t \"430225\": \"炎陵县\",\n\t \"430281\": \"醴陵市\",\n\t \"430282\": \"其它区\",\n\t \"430300\": \"湘潭市\",\n\t \"430302\": \"雨湖区\",\n\t \"430304\": \"岳塘区\",\n\t \"430321\": \"湘潭县\",\n\t \"430381\": \"湘乡市\",\n\t \"430382\": \"韶山市\",\n\t \"430383\": \"其它区\",\n\t \"430400\": \"衡阳市\",\n\t \"430405\": \"珠晖区\",\n\t \"430406\": \"雁峰区\",\n\t \"430407\": \"石鼓区\",\n\t \"430408\": \"蒸湘区\",\n\t \"430412\": \"南岳区\",\n\t \"430421\": \"衡阳县\",\n\t \"430422\": \"衡南县\",\n\t \"430423\": \"衡山县\",\n\t \"430424\": \"衡东县\",\n\t \"430426\": \"祁东县\",\n\t \"430481\": \"耒阳市\",\n\t \"430482\": \"常宁市\",\n\t \"430483\": \"其它区\",\n\t \"430500\": \"邵阳市\",\n\t \"430502\": \"双清区\",\n\t \"430503\": \"大祥区\",\n\t \"430511\": \"北塔区\",\n\t \"430521\": \"邵东县\",\n\t \"430522\": \"新邵县\",\n\t \"430523\": \"邵阳县\",\n\t \"430524\": \"隆回县\",\n\t \"430525\": \"洞口县\",\n\t \"430527\": \"绥宁县\",\n\t \"430528\": \"新宁县\",\n\t \"430529\": \"城步苗族自治县\",\n\t \"430581\": \"武冈市\",\n\t \"430582\": \"其它区\",\n\t \"430600\": \"岳阳市\",\n\t \"430602\": \"岳阳楼区\",\n\t \"430603\": \"云溪区\",\n\t \"430611\": \"君山区\",\n\t \"430621\": \"岳阳县\",\n\t \"430623\": \"华容县\",\n\t \"430624\": \"湘阴县\",\n\t \"430626\": \"平江县\",\n\t \"430681\": \"汨罗市\",\n\t \"430682\": \"临湘市\",\n\t \"430683\": \"其它区\",\n\t \"430700\": \"常德市\",\n\t \"430702\": \"武陵区\",\n\t \"430703\": \"鼎城区\",\n\t \"430721\": \"安乡县\",\n\t \"430722\": \"汉寿县\",\n\t \"430723\": \"澧县\",\n\t \"430724\": \"临澧县\",\n\t \"430725\": \"桃源县\",\n\t \"430726\": \"石门县\",\n\t \"430781\": \"津市市\",\n\t \"430782\": \"其它区\",\n\t \"430800\": \"张家界市\",\n\t \"430802\": \"永定区\",\n\t \"430811\": \"武陵源区\",\n\t \"430821\": \"慈利县\",\n\t \"430822\": \"桑植县\",\n\t \"430823\": \"其它区\",\n\t \"430900\": \"益阳市\",\n\t \"430902\": \"资阳区\",\n\t \"430903\": \"赫山区\",\n\t \"430921\": \"南县\",\n\t \"430922\": \"桃江县\",\n\t \"430923\": \"安化县\",\n\t \"430981\": \"沅江市\",\n\t \"430982\": \"其它区\",\n\t \"431000\": \"郴州市\",\n\t \"431002\": \"北湖区\",\n\t \"431003\": \"苏仙区\",\n\t \"431021\": \"桂阳县\",\n\t \"431022\": \"宜章县\",\n\t \"431023\": \"永兴县\",\n\t \"431024\": \"嘉禾县\",\n\t \"431025\": \"临武县\",\n\t \"431026\": \"汝城县\",\n\t \"431027\": \"桂东县\",\n\t \"431028\": \"安仁县\",\n\t \"431081\": \"资兴市\",\n\t \"431082\": \"其它区\",\n\t \"431100\": \"永州市\",\n\t \"431102\": \"零陵区\",\n\t \"431103\": \"冷水滩区\",\n\t \"431121\": \"祁阳县\",\n\t \"431122\": \"东安县\",\n\t \"431123\": \"双牌县\",\n\t \"431124\": \"道县\",\n\t \"431125\": \"江永县\",\n\t \"431126\": \"宁远县\",\n\t \"431127\": \"蓝山县\",\n\t \"431128\": \"新田县\",\n\t \"431129\": \"江华瑶族自治县\",\n\t \"431130\": \"其它区\",\n\t \"431200\": \"怀化市\",\n\t \"431202\": \"鹤城区\",\n\t \"431221\": \"中方县\",\n\t \"431222\": \"沅陵县\",\n\t \"431223\": \"辰溪县\",\n\t \"431224\": \"溆浦县\",\n\t \"431225\": \"会同县\",\n\t \"431226\": \"麻阳苗族自治县\",\n\t \"431227\": \"新晃侗族自治县\",\n\t \"431228\": \"芷江侗族自治县\",\n\t \"431229\": \"靖州苗族侗族自治县\",\n\t \"431230\": \"通道侗族自治县\",\n\t \"431281\": \"洪江市\",\n\t \"431282\": \"其它区\",\n\t \"431300\": \"娄底市\",\n\t \"431302\": \"娄星区\",\n\t \"431321\": \"双峰县\",\n\t \"431322\": \"新化县\",\n\t \"431381\": \"冷水江市\",\n\t \"431382\": \"涟源市\",\n\t \"431383\": \"其它区\",\n\t \"433100\": \"湘西土家族苗族自治州\",\n\t \"433101\": \"吉首市\",\n\t \"433122\": \"泸溪县\",\n\t \"433123\": \"凤凰县\",\n\t \"433124\": \"花垣县\",\n\t \"433125\": \"保靖县\",\n\t \"433126\": \"古丈县\",\n\t \"433127\": \"永顺县\",\n\t \"433130\": \"龙山县\",\n\t \"433131\": \"其它区\",\n\t \"440000\": \"广东省\",\n\t \"440100\": \"广州市\",\n\t \"440103\": \"荔湾区\",\n\t \"440104\": \"越秀区\",\n\t \"440105\": \"海珠区\",\n\t \"440106\": \"天河区\",\n\t \"440111\": \"白云区\",\n\t \"440112\": \"黄埔区\",\n\t \"440113\": \"番禺区\",\n\t \"440114\": \"花都区\",\n\t \"440115\": \"南沙区\",\n\t \"440116\": \"萝岗区\",\n\t \"440183\": \"增城市\",\n\t \"440184\": \"从化市\",\n\t \"440189\": \"其它区\",\n\t \"440200\": \"韶关市\",\n\t \"440203\": \"武江区\",\n\t \"440204\": \"浈江区\",\n\t \"440205\": \"曲江区\",\n\t \"440222\": \"始兴县\",\n\t \"440224\": \"仁化县\",\n\t \"440229\": \"翁源县\",\n\t \"440232\": \"乳源瑶族自治县\",\n\t \"440233\": \"新丰县\",\n\t \"440281\": \"乐昌市\",\n\t \"440282\": \"南雄市\",\n\t \"440283\": \"其它区\",\n\t \"440300\": \"深圳市\",\n\t \"440303\": \"罗湖区\",\n\t \"440304\": \"福田区\",\n\t \"440305\": \"南山区\",\n\t \"440306\": \"宝安区\",\n\t \"440307\": \"龙岗区\",\n\t \"440308\": \"盐田区\",\n\t \"440309\": \"其它区\",\n\t \"440320\": \"光明新区\",\n\t \"440321\": \"坪山新区\",\n\t \"440322\": \"大鹏新区\",\n\t \"440323\": \"龙华新区\",\n\t \"440400\": \"珠海市\",\n\t \"440402\": \"香洲区\",\n\t \"440403\": \"斗门区\",\n\t \"440404\": \"金湾区\",\n\t \"440488\": \"其它区\",\n\t \"440500\": \"汕头市\",\n\t \"440507\": \"龙湖区\",\n\t \"440511\": \"金平区\",\n\t \"440512\": \"濠江区\",\n\t \"440513\": \"潮阳区\",\n\t \"440514\": \"潮南区\",\n\t \"440515\": \"澄海区\",\n\t \"440523\": \"南澳县\",\n\t \"440524\": \"其它区\",\n\t \"440600\": \"佛山市\",\n\t \"440604\": \"禅城区\",\n\t \"440605\": \"南海区\",\n\t \"440606\": \"顺德区\",\n\t \"440607\": \"三水区\",\n\t \"440608\": \"高明区\",\n\t \"440609\": \"其它区\",\n\t \"440700\": \"江门市\",\n\t \"440703\": \"蓬江区\",\n\t \"440704\": \"江海区\",\n\t \"440705\": \"新会区\",\n\t \"440781\": \"台山市\",\n\t \"440783\": \"开平市\",\n\t \"440784\": \"鹤山市\",\n\t \"440785\": \"恩平市\",\n\t \"440786\": \"其它区\",\n\t \"440800\": \"湛江市\",\n\t \"440802\": \"赤坎区\",\n\t \"440803\": \"霞山区\",\n\t \"440804\": \"坡头区\",\n\t \"440811\": \"麻章区\",\n\t \"440823\": \"遂溪县\",\n\t \"440825\": \"徐闻县\",\n\t \"440881\": \"廉江市\",\n\t \"440882\": \"雷州市\",\n\t \"440883\": \"吴川市\",\n\t \"440884\": \"其它区\",\n\t \"440900\": \"茂名市\",\n\t \"440902\": \"茂南区\",\n\t \"440903\": \"茂港区\",\n\t \"440923\": \"电白县\",\n\t \"440981\": \"高州市\",\n\t \"440982\": \"化州市\",\n\t \"440983\": \"信宜市\",\n\t \"440984\": \"其它区\",\n\t \"441200\": \"肇庆市\",\n\t \"441202\": \"端州区\",\n\t \"441203\": \"鼎湖区\",\n\t \"441223\": \"广宁县\",\n\t \"441224\": \"怀集县\",\n\t \"441225\": \"封开县\",\n\t \"441226\": \"德庆县\",\n\t \"441283\": \"高要市\",\n\t \"441284\": \"四会市\",\n\t \"441285\": \"其它区\",\n\t \"441300\": \"惠州市\",\n\t \"441302\": \"惠城区\",\n\t \"441303\": \"惠阳区\",\n\t \"441322\": \"博罗县\",\n\t \"441323\": \"惠东县\",\n\t \"441324\": \"龙门县\",\n\t \"441325\": \"其它区\",\n\t \"441400\": \"梅州市\",\n\t \"441402\": \"梅江区\",\n\t \"441421\": \"梅县\",\n\t \"441422\": \"大埔县\",\n\t \"441423\": \"丰顺县\",\n\t \"441424\": \"五华县\",\n\t \"441426\": \"平远县\",\n\t \"441427\": \"蕉岭县\",\n\t \"441481\": \"兴宁市\",\n\t \"441482\": \"其它区\",\n\t \"441500\": \"汕尾市\",\n\t \"441502\": \"城区\",\n\t \"441521\": \"海丰县\",\n\t \"441523\": \"陆河县\",\n\t \"441581\": \"陆丰市\",\n\t \"441582\": \"其它区\",\n\t \"441600\": \"河源市\",\n\t \"441602\": \"源城区\",\n\t \"441621\": \"紫金县\",\n\t \"441622\": \"龙川县\",\n\t \"441623\": \"连平县\",\n\t \"441624\": \"和平县\",\n\t \"441625\": \"东源县\",\n\t \"441626\": \"其它区\",\n\t \"441700\": \"阳江市\",\n\t \"441702\": \"江城区\",\n\t \"441721\": \"阳西县\",\n\t \"441723\": \"阳东县\",\n\t \"441781\": \"阳春市\",\n\t \"441782\": \"其它区\",\n\t \"441800\": \"清远市\",\n\t \"441802\": \"清城区\",\n\t \"441821\": \"佛冈县\",\n\t \"441823\": \"阳山县\",\n\t \"441825\": \"连山壮族瑶族自治县\",\n\t \"441826\": \"连南瑶族自治县\",\n\t \"441827\": \"清新区\",\n\t \"441881\": \"英德市\",\n\t \"441882\": \"连州市\",\n\t \"441883\": \"其它区\",\n\t \"441900\": \"东莞市\",\n\t \"442000\": \"中山市\",\n\t \"442101\": \"东沙群岛\",\n\t \"445100\": \"潮州市\",\n\t \"445102\": \"湘桥区\",\n\t \"445121\": \"潮安区\",\n\t \"445122\": \"饶平县\",\n\t \"445186\": \"其它区\",\n\t \"445200\": \"揭阳市\",\n\t \"445202\": \"榕城区\",\n\t \"445221\": \"揭东区\",\n\t \"445222\": \"揭西县\",\n\t \"445224\": \"惠来县\",\n\t \"445281\": \"普宁市\",\n\t \"445285\": \"其它区\",\n\t \"445300\": \"云浮市\",\n\t \"445302\": \"云城区\",\n\t \"445321\": \"新兴县\",\n\t \"445322\": \"郁南县\",\n\t \"445323\": \"云安县\",\n\t \"445381\": \"罗定市\",\n\t \"445382\": \"其它区\",\n\t \"450000\": \"广西壮族自治区\",\n\t \"450100\": \"南宁市\",\n\t \"450102\": \"兴宁区\",\n\t \"450103\": \"青秀区\",\n\t \"450105\": \"江南区\",\n\t \"450107\": \"西乡塘区\",\n\t \"450108\": \"良庆区\",\n\t \"450109\": \"邕宁区\",\n\t \"450122\": \"武鸣县\",\n\t \"450123\": \"隆安县\",\n\t \"450124\": \"马山县\",\n\t \"450125\": \"上林县\",\n\t \"450126\": \"宾阳县\",\n\t \"450127\": \"横县\",\n\t \"450128\": \"其它区\",\n\t \"450200\": \"柳州市\",\n\t \"450202\": \"城中区\",\n\t \"450203\": \"鱼峰区\",\n\t \"450204\": \"柳南区\",\n\t \"450205\": \"柳北区\",\n\t \"450221\": \"柳江县\",\n\t \"450222\": \"柳城县\",\n\t \"450223\": \"鹿寨县\",\n\t \"450224\": \"融安县\",\n\t \"450225\": \"融水苗族自治县\",\n\t \"450226\": \"三江侗族自治县\",\n\t \"450227\": \"其它区\",\n\t \"450300\": \"桂林市\",\n\t \"450302\": \"秀峰区\",\n\t \"450303\": \"叠彩区\",\n\t \"450304\": \"象山区\",\n\t \"450305\": \"七星区\",\n\t \"450311\": \"雁山区\",\n\t \"450321\": \"阳朔县\",\n\t \"450322\": \"临桂区\",\n\t \"450323\": \"灵川县\",\n\t \"450324\": \"全州县\",\n\t \"450325\": \"兴安县\",\n\t \"450326\": \"永福县\",\n\t \"450327\": \"灌阳县\",\n\t \"450328\": \"龙胜各族自治县\",\n\t \"450329\": \"资源县\",\n\t \"450330\": \"平乐县\",\n\t \"450331\": \"荔浦县\",\n\t \"450332\": \"恭城瑶族自治县\",\n\t \"450333\": \"其它区\",\n\t \"450400\": \"梧州市\",\n\t \"450403\": \"万秀区\",\n\t \"450405\": \"长洲区\",\n\t \"450406\": \"龙圩区\",\n\t \"450421\": \"苍梧县\",\n\t \"450422\": \"藤县\",\n\t \"450423\": \"蒙山县\",\n\t \"450481\": \"岑溪市\",\n\t \"450482\": \"其它区\",\n\t \"450500\": \"北海市\",\n\t \"450502\": \"海城区\",\n\t \"450503\": \"银海区\",\n\t \"450512\": \"铁山港区\",\n\t \"450521\": \"合浦县\",\n\t \"450522\": \"其它区\",\n\t \"450600\": \"防城港市\",\n\t \"450602\": \"港口区\",\n\t \"450603\": \"防城区\",\n\t \"450621\": \"上思县\",\n\t \"450681\": \"东兴市\",\n\t \"450682\": \"其它区\",\n\t \"450700\": \"钦州市\",\n\t \"450702\": \"钦南区\",\n\t \"450703\": \"钦北区\",\n\t \"450721\": \"灵山县\",\n\t \"450722\": \"浦北县\",\n\t \"450723\": \"其它区\",\n\t \"450800\": \"贵港市\",\n\t \"450802\": \"港北区\",\n\t \"450803\": \"港南区\",\n\t \"450804\": \"覃塘区\",\n\t \"450821\": \"平南县\",\n\t \"450881\": \"桂平市\",\n\t \"450882\": \"其它区\",\n\t \"450900\": \"玉林市\",\n\t \"450902\": \"玉州区\",\n\t \"450903\": \"福绵区\",\n\t \"450921\": \"容县\",\n\t \"450922\": \"陆川县\",\n\t \"450923\": \"博白县\",\n\t \"450924\": \"兴业县\",\n\t \"450981\": \"北流市\",\n\t \"450982\": \"其它区\",\n\t \"451000\": \"百色市\",\n\t \"451002\": \"右江区\",\n\t \"451021\": \"田阳县\",\n\t \"451022\": \"田东县\",\n\t \"451023\": \"平果县\",\n\t \"451024\": \"德保县\",\n\t \"451025\": \"靖西县\",\n\t \"451026\": \"那坡县\",\n\t \"451027\": \"凌云县\",\n\t \"451028\": \"乐业县\",\n\t \"451029\": \"田林县\",\n\t \"451030\": \"西林县\",\n\t \"451031\": \"隆林各族自治县\",\n\t \"451032\": \"其它区\",\n\t \"451100\": \"贺州市\",\n\t \"451102\": \"八步区\",\n\t \"451119\": \"平桂管理区\",\n\t \"451121\": \"昭平县\",\n\t \"451122\": \"钟山县\",\n\t \"451123\": \"富川瑶族自治县\",\n\t \"451124\": \"其它区\",\n\t \"451200\": \"河池市\",\n\t \"451202\": \"金城江区\",\n\t \"451221\": \"南丹县\",\n\t \"451222\": \"天峨县\",\n\t \"451223\": \"凤山县\",\n\t \"451224\": \"东兰县\",\n\t \"451225\": \"罗城仫佬族自治县\",\n\t \"451226\": \"环江毛南族自治县\",\n\t \"451227\": \"巴马瑶族自治县\",\n\t \"451228\": \"都安瑶族自治县\",\n\t \"451229\": \"大化瑶族自治县\",\n\t \"451281\": \"宜州市\",\n\t \"451282\": \"其它区\",\n\t \"451300\": \"来宾市\",\n\t \"451302\": \"兴宾区\",\n\t \"451321\": \"忻城县\",\n\t \"451322\": \"象州县\",\n\t \"451323\": \"武宣县\",\n\t \"451324\": \"金秀瑶族自治县\",\n\t \"451381\": \"合山市\",\n\t \"451382\": \"其它区\",\n\t \"451400\": \"崇左市\",\n\t \"451402\": \"江州区\",\n\t \"451421\": \"扶绥县\",\n\t \"451422\": \"宁明县\",\n\t \"451423\": \"龙州县\",\n\t \"451424\": \"大新县\",\n\t \"451425\": \"天等县\",\n\t \"451481\": \"凭祥市\",\n\t \"451482\": \"其它区\",\n\t \"460000\": \"海南省\",\n\t \"460100\": \"海口市\",\n\t \"460105\": \"秀英区\",\n\t \"460106\": \"龙华区\",\n\t \"460107\": \"琼山区\",\n\t \"460108\": \"美兰区\",\n\t \"460109\": \"其它区\",\n\t \"460200\": \"三亚市\",\n\t \"460300\": \"三沙市\",\n\t \"460321\": \"西沙群岛\",\n\t \"460322\": \"南沙群岛\",\n\t \"460323\": \"中沙群岛的岛礁及其海域\",\n\t \"469001\": \"五指山市\",\n\t \"469002\": \"琼海市\",\n\t \"469003\": \"儋州市\",\n\t \"469005\": \"文昌市\",\n\t \"469006\": \"万宁市\",\n\t \"469007\": \"东方市\",\n\t \"469025\": \"定安县\",\n\t \"469026\": \"屯昌县\",\n\t \"469027\": \"澄迈县\",\n\t \"469028\": \"临高县\",\n\t \"469030\": \"白沙黎族自治县\",\n\t \"469031\": \"昌江黎族自治县\",\n\t \"469033\": \"乐东黎族自治县\",\n\t \"469034\": \"陵水黎族自治县\",\n\t \"469035\": \"保亭黎族苗族自治县\",\n\t \"469036\": \"琼中黎族苗族自治县\",\n\t \"471005\": \"其它区\",\n\t \"500000\": \"重庆\",\n\t \"500100\": \"重庆市\",\n\t \"500101\": \"万州区\",\n\t \"500102\": \"涪陵区\",\n\t \"500103\": \"渝中区\",\n\t \"500104\": \"大渡口区\",\n\t \"500105\": \"江北区\",\n\t \"500106\": \"沙坪坝区\",\n\t \"500107\": \"九龙坡区\",\n\t \"500108\": \"南岸区\",\n\t \"500109\": \"北碚区\",\n\t \"500110\": \"万盛区\",\n\t \"500111\": \"双桥区\",\n\t \"500112\": \"渝北区\",\n\t \"500113\": \"巴南区\",\n\t \"500114\": \"黔江区\",\n\t \"500115\": \"长寿区\",\n\t \"500222\": \"綦江区\",\n\t \"500223\": \"潼南县\",\n\t \"500224\": \"铜梁县\",\n\t \"500225\": \"大足区\",\n\t \"500226\": \"荣昌县\",\n\t \"500227\": \"璧山县\",\n\t \"500228\": \"梁平县\",\n\t \"500229\": \"城口县\",\n\t \"500230\": \"丰都县\",\n\t \"500231\": \"垫江县\",\n\t \"500232\": \"武隆县\",\n\t \"500233\": \"忠县\",\n\t \"500234\": \"开县\",\n\t \"500235\": \"云阳县\",\n\t \"500236\": \"奉节县\",\n\t \"500237\": \"巫山县\",\n\t \"500238\": \"巫溪县\",\n\t \"500240\": \"石柱土家族自治县\",\n\t \"500241\": \"秀山土家族苗族自治县\",\n\t \"500242\": \"酉阳土家族苗族自治县\",\n\t \"500243\": \"彭水苗族土家族自治县\",\n\t \"500381\": \"江津区\",\n\t \"500382\": \"合川区\",\n\t \"500383\": \"永川区\",\n\t \"500384\": \"南川区\",\n\t \"500385\": \"其它区\",\n\t \"510000\": \"四川省\",\n\t \"510100\": \"成都市\",\n\t \"510104\": \"锦江区\",\n\t \"510105\": \"青羊区\",\n\t \"510106\": \"金牛区\",\n\t \"510107\": \"武侯区\",\n\t \"510108\": \"成华区\",\n\t \"510112\": \"龙泉驿区\",\n\t \"510113\": \"青白江区\",\n\t \"510114\": \"新都区\",\n\t \"510115\": \"温江区\",\n\t \"510121\": \"金堂县\",\n\t \"510122\": \"双流县\",\n\t \"510124\": \"郫县\",\n\t \"510129\": \"大邑县\",\n\t \"510131\": \"蒲江县\",\n\t \"510132\": \"新津县\",\n\t \"510181\": \"都江堰市\",\n\t \"510182\": \"彭州市\",\n\t \"510183\": \"邛崃市\",\n\t \"510184\": \"崇州市\",\n\t \"510185\": \"其它区\",\n\t \"510300\": \"自贡市\",\n\t \"510302\": \"自流井区\",\n\t \"510303\": \"贡井区\",\n\t \"510304\": \"大安区\",\n\t \"510311\": \"沿滩区\",\n\t \"510321\": \"荣县\",\n\t \"510322\": \"富顺县\",\n\t \"510323\": \"其它区\",\n\t \"510400\": \"攀枝花市\",\n\t \"510402\": \"东区\",\n\t \"510403\": \"西区\",\n\t \"510411\": \"仁和区\",\n\t \"510421\": \"米易县\",\n\t \"510422\": \"盐边县\",\n\t \"510423\": \"其它区\",\n\t \"510500\": \"泸州市\",\n\t \"510502\": \"江阳区\",\n\t \"510503\": \"纳溪区\",\n\t \"510504\": \"龙马潭区\",\n\t \"510521\": \"泸县\",\n\t \"510522\": \"合江县\",\n\t \"510524\": \"叙永县\",\n\t \"510525\": \"古蔺县\",\n\t \"510526\": \"其它区\",\n\t \"510600\": \"德阳市\",\n\t \"510603\": \"旌阳区\",\n\t \"510623\": \"中江县\",\n\t \"510626\": \"罗江县\",\n\t \"510681\": \"广汉市\",\n\t \"510682\": \"什邡市\",\n\t \"510683\": \"绵竹市\",\n\t \"510684\": \"其它区\",\n\t \"510700\": \"绵阳市\",\n\t \"510703\": \"涪城区\",\n\t \"510704\": \"游仙区\",\n\t \"510722\": \"三台县\",\n\t \"510723\": \"盐亭县\",\n\t \"510724\": \"安县\",\n\t \"510725\": \"梓潼县\",\n\t \"510726\": \"北川羌族自治县\",\n\t \"510727\": \"平武县\",\n\t \"510781\": \"江油市\",\n\t \"510782\": \"其它区\",\n\t \"510800\": \"广元市\",\n\t \"510802\": \"利州区\",\n\t \"510811\": \"昭化区\",\n\t \"510812\": \"朝天区\",\n\t \"510821\": \"旺苍县\",\n\t \"510822\": \"青川县\",\n\t \"510823\": \"剑阁县\",\n\t \"510824\": \"苍溪县\",\n\t \"510825\": \"其它区\",\n\t \"510900\": \"遂宁市\",\n\t \"510903\": \"船山区\",\n\t \"510904\": \"安居区\",\n\t \"510921\": \"蓬溪县\",\n\t \"510922\": \"射洪县\",\n\t \"510923\": \"大英县\",\n\t \"510924\": \"其它区\",\n\t \"511000\": \"内江市\",\n\t \"511002\": \"市中区\",\n\t \"511011\": \"东兴区\",\n\t \"511024\": \"威远县\",\n\t \"511025\": \"资中县\",\n\t \"511028\": \"隆昌县\",\n\t \"511029\": \"其它区\",\n\t \"511100\": \"乐山市\",\n\t \"511102\": \"市中区\",\n\t \"511111\": \"沙湾区\",\n\t \"511112\": \"五通桥区\",\n\t \"511113\": \"金口河区\",\n\t \"511123\": \"犍为县\",\n\t \"511124\": \"井研县\",\n\t \"511126\": \"夹江县\",\n\t \"511129\": \"沐川县\",\n\t \"511132\": \"峨边彝族自治县\",\n\t \"511133\": \"马边彝族自治县\",\n\t \"511181\": \"峨眉山市\",\n\t \"511182\": \"其它区\",\n\t \"511300\": \"南充市\",\n\t \"511302\": \"顺庆区\",\n\t \"511303\": \"高坪区\",\n\t \"511304\": \"嘉陵区\",\n\t \"511321\": \"南部县\",\n\t \"511322\": \"营山县\",\n\t \"511323\": \"蓬安县\",\n\t \"511324\": \"仪陇县\",\n\t \"511325\": \"西充县\",\n\t \"511381\": \"阆中市\",\n\t \"511382\": \"其它区\",\n\t \"511400\": \"眉山市\",\n\t \"511402\": \"东坡区\",\n\t \"511421\": \"仁寿县\",\n\t \"511422\": \"彭山县\",\n\t \"511423\": \"洪雅县\",\n\t \"511424\": \"丹棱县\",\n\t \"511425\": \"青神县\",\n\t \"511426\": \"其它区\",\n\t \"511500\": \"宜宾市\",\n\t \"511502\": \"翠屏区\",\n\t \"511521\": \"宜宾县\",\n\t \"511522\": \"南溪区\",\n\t \"511523\": \"江安县\",\n\t \"511524\": \"长宁县\",\n\t \"511525\": \"高县\",\n\t \"511526\": \"珙县\",\n\t \"511527\": \"筠连县\",\n\t \"511528\": \"兴文县\",\n\t \"511529\": \"屏山县\",\n\t \"511530\": \"其它区\",\n\t \"511600\": \"广安市\",\n\t \"511602\": \"广安区\",\n\t \"511603\": \"前锋区\",\n\t \"511621\": \"岳池县\",\n\t \"511622\": \"武胜县\",\n\t \"511623\": \"邻水县\",\n\t \"511681\": \"华蓥市\",\n\t \"511683\": \"其它区\",\n\t \"511700\": \"达州市\",\n\t \"511702\": \"通川区\",\n\t \"511721\": \"达川区\",\n\t \"511722\": \"宣汉县\",\n\t \"511723\": \"开江县\",\n\t \"511724\": \"大竹县\",\n\t \"511725\": \"渠县\",\n\t \"511781\": \"万源市\",\n\t \"511782\": \"其它区\",\n\t \"511800\": \"雅安市\",\n\t \"511802\": \"雨城区\",\n\t \"511821\": \"名山区\",\n\t \"511822\": \"荥经县\",\n\t \"511823\": \"汉源县\",\n\t \"511824\": \"石棉县\",\n\t \"511825\": \"天全县\",\n\t \"511826\": \"芦山县\",\n\t \"511827\": \"宝兴县\",\n\t \"511828\": \"其它区\",\n\t \"511900\": \"巴中市\",\n\t \"511902\": \"巴州区\",\n\t \"511903\": \"恩阳区\",\n\t \"511921\": \"通江县\",\n\t \"511922\": \"南江县\",\n\t \"511923\": \"平昌县\",\n\t \"511924\": \"其它区\",\n\t \"512000\": \"资阳市\",\n\t \"512002\": \"雁江区\",\n\t \"512021\": \"安岳县\",\n\t \"512022\": \"乐至县\",\n\t \"512081\": \"简阳市\",\n\t \"512082\": \"其它区\",\n\t \"513200\": \"阿坝藏族羌族自治州\",\n\t \"513221\": \"汶川县\",\n\t \"513222\": \"理县\",\n\t \"513223\": \"茂县\",\n\t \"513224\": \"松潘县\",\n\t \"513225\": \"九寨沟县\",\n\t \"513226\": \"金川县\",\n\t \"513227\": \"小金县\",\n\t \"513228\": \"黑水县\",\n\t \"513229\": \"马尔康县\",\n\t \"513230\": \"壤塘县\",\n\t \"513231\": \"阿坝县\",\n\t \"513232\": \"若尔盖县\",\n\t \"513233\": \"红原县\",\n\t \"513234\": \"其它区\",\n\t \"513300\": \"甘孜藏族自治州\",\n\t \"513321\": \"康定县\",\n\t \"513322\": \"泸定县\",\n\t \"513323\": \"丹巴县\",\n\t \"513324\": \"九龙县\",\n\t \"513325\": \"雅江县\",\n\t \"513326\": \"道孚县\",\n\t \"513327\": \"炉霍县\",\n\t \"513328\": \"甘孜县\",\n\t \"513329\": \"新龙县\",\n\t \"513330\": \"德格县\",\n\t \"513331\": \"白玉县\",\n\t \"513332\": \"石渠县\",\n\t \"513333\": \"色达县\",\n\t \"513334\": \"理塘县\",\n\t \"513335\": \"巴塘县\",\n\t \"513336\": \"乡城县\",\n\t \"513337\": \"稻城县\",\n\t \"513338\": \"得荣县\",\n\t \"513339\": \"其它区\",\n\t \"513400\": \"凉山彝族自治州\",\n\t \"513401\": \"西昌市\",\n\t \"513422\": \"木里藏族自治县\",\n\t \"513423\": \"盐源县\",\n\t \"513424\": \"德昌县\",\n\t \"513425\": \"会理县\",\n\t \"513426\": \"会东县\",\n\t \"513427\": \"宁南县\",\n\t \"513428\": \"普格县\",\n\t \"513429\": \"布拖县\",\n\t \"513430\": \"金阳县\",\n\t \"513431\": \"昭觉县\",\n\t \"513432\": \"喜德县\",\n\t \"513433\": \"冕宁县\",\n\t \"513434\": \"越西县\",\n\t \"513435\": \"甘洛县\",\n\t \"513436\": \"美姑县\",\n\t \"513437\": \"雷波县\",\n\t \"513438\": \"其它区\",\n\t \"520000\": \"贵州省\",\n\t \"520100\": \"贵阳市\",\n\t \"520102\": \"南明区\",\n\t \"520103\": \"云岩区\",\n\t \"520111\": \"花溪区\",\n\t \"520112\": \"乌当区\",\n\t \"520113\": \"白云区\",\n\t \"520121\": \"开阳县\",\n\t \"520122\": \"息烽县\",\n\t \"520123\": \"修文县\",\n\t \"520151\": \"观山湖区\",\n\t \"520181\": \"清镇市\",\n\t \"520182\": \"其它区\",\n\t \"520200\": \"六盘水市\",\n\t \"520201\": \"钟山区\",\n\t \"520203\": \"六枝特区\",\n\t \"520221\": \"水城县\",\n\t \"520222\": \"盘县\",\n\t \"520223\": \"其它区\",\n\t \"520300\": \"遵义市\",\n\t \"520302\": \"红花岗区\",\n\t \"520303\": \"汇川区\",\n\t \"520321\": \"遵义县\",\n\t \"520322\": \"桐梓县\",\n\t \"520323\": \"绥阳县\",\n\t \"520324\": \"正安县\",\n\t \"520325\": \"道真仡佬族苗族自治县\",\n\t \"520326\": \"务川仡佬族苗族自治县\",\n\t \"520327\": \"凤冈县\",\n\t \"520328\": \"湄潭县\",\n\t \"520329\": \"余庆县\",\n\t \"520330\": \"习水县\",\n\t \"520381\": \"赤水市\",\n\t \"520382\": \"仁怀市\",\n\t \"520383\": \"其它区\",\n\t \"520400\": \"安顺市\",\n\t \"520402\": \"西秀区\",\n\t \"520421\": \"平坝县\",\n\t \"520422\": \"普定县\",\n\t \"520423\": \"镇宁布依族苗族自治县\",\n\t \"520424\": \"关岭布依族苗族自治县\",\n\t \"520425\": \"紫云苗族布依族自治县\",\n\t \"520426\": \"其它区\",\n\t \"522200\": \"铜仁市\",\n\t \"522201\": \"碧江区\",\n\t \"522222\": \"江口县\",\n\t \"522223\": \"玉屏侗族自治县\",\n\t \"522224\": \"石阡县\",\n\t \"522225\": \"思南县\",\n\t \"522226\": \"印江土家族苗族自治县\",\n\t \"522227\": \"德江县\",\n\t \"522228\": \"沿河土家族自治县\",\n\t \"522229\": \"松桃苗族自治县\",\n\t \"522230\": \"万山区\",\n\t \"522231\": \"其它区\",\n\t \"522300\": \"黔西南布依族苗族自治州\",\n\t \"522301\": \"兴义市\",\n\t \"522322\": \"兴仁县\",\n\t \"522323\": \"普安县\",\n\t \"522324\": \"晴隆县\",\n\t \"522325\": \"贞丰县\",\n\t \"522326\": \"望谟县\",\n\t \"522327\": \"册亨县\",\n\t \"522328\": \"安龙县\",\n\t \"522329\": \"其它区\",\n\t \"522400\": \"毕节市\",\n\t \"522401\": \"七星关区\",\n\t \"522422\": \"大方县\",\n\t \"522423\": \"黔西县\",\n\t \"522424\": \"金沙县\",\n\t \"522425\": \"织金县\",\n\t \"522426\": \"纳雍县\",\n\t \"522427\": \"威宁彝族回族苗族自治县\",\n\t \"522428\": \"赫章县\",\n\t \"522429\": \"其它区\",\n\t \"522600\": \"黔东南苗族侗族自治州\",\n\t \"522601\": \"凯里市\",\n\t \"522622\": \"黄平县\",\n\t \"522623\": \"施秉县\",\n\t \"522624\": \"三穗县\",\n\t \"522625\": \"镇远县\",\n\t \"522626\": \"岑巩县\",\n\t \"522627\": \"天柱县\",\n\t \"522628\": \"锦屏县\",\n\t \"522629\": \"剑河县\",\n\t \"522630\": \"台江县\",\n\t \"522631\": \"黎平县\",\n\t \"522632\": \"榕江县\",\n\t \"522633\": \"从江县\",\n\t \"522634\": \"雷山县\",\n\t \"522635\": \"麻江县\",\n\t \"522636\": \"丹寨县\",\n\t \"522637\": \"其它区\",\n\t \"522700\": \"黔南布依族苗族自治州\",\n\t \"522701\": \"都匀市\",\n\t \"522702\": \"福泉市\",\n\t \"522722\": \"荔波县\",\n\t \"522723\": \"贵定县\",\n\t \"522725\": \"瓮安县\",\n\t \"522726\": \"独山县\",\n\t \"522727\": \"平塘县\",\n\t \"522728\": \"罗甸县\",\n\t \"522729\": \"长顺县\",\n\t \"522730\": \"龙里县\",\n\t \"522731\": \"惠水县\",\n\t \"522732\": \"三都水族自治县\",\n\t \"522733\": \"其它区\",\n\t \"530000\": \"云南省\",\n\t \"530100\": \"昆明市\",\n\t \"530102\": \"五华区\",\n\t \"530103\": \"盘龙区\",\n\t \"530111\": \"官渡区\",\n\t \"530112\": \"西山区\",\n\t \"530113\": \"东川区\",\n\t \"530121\": \"呈贡区\",\n\t \"530122\": \"晋宁县\",\n\t \"530124\": \"富民县\",\n\t \"530125\": \"宜良县\",\n\t \"530126\": \"石林彝族自治县\",\n\t \"530127\": \"嵩明县\",\n\t \"530128\": \"禄劝彝族苗族自治县\",\n\t \"530129\": \"寻甸回族彝族自治县\",\n\t \"530181\": \"安宁市\",\n\t \"530182\": \"其它区\",\n\t \"530300\": \"曲靖市\",\n\t \"530302\": \"麒麟区\",\n\t \"530321\": \"马龙县\",\n\t \"530322\": \"陆良县\",\n\t \"530323\": \"师宗县\",\n\t \"530324\": \"罗平县\",\n\t \"530325\": \"富源县\",\n\t \"530326\": \"会泽县\",\n\t \"530328\": \"沾益县\",\n\t \"530381\": \"宣威市\",\n\t \"530382\": \"其它区\",\n\t \"530400\": \"玉溪市\",\n\t \"530402\": \"红塔区\",\n\t \"530421\": \"江川县\",\n\t \"530422\": \"澄江县\",\n\t \"530423\": \"通海县\",\n\t \"530424\": \"华宁县\",\n\t \"530425\": \"易门县\",\n\t \"530426\": \"峨山彝族自治县\",\n\t \"530427\": \"新平彝族傣族自治县\",\n\t \"530428\": \"元江哈尼族彝族傣族自治县\",\n\t \"530429\": \"其它区\",\n\t \"530500\": \"保山市\",\n\t \"530502\": \"隆阳区\",\n\t \"530521\": \"施甸县\",\n\t \"530522\": \"腾冲县\",\n\t \"530523\": \"龙陵县\",\n\t \"530524\": \"昌宁县\",\n\t \"530525\": \"其它区\",\n\t \"530600\": \"昭通市\",\n\t \"530602\": \"昭阳区\",\n\t \"530621\": \"鲁甸县\",\n\t \"530622\": \"巧家县\",\n\t \"530623\": \"盐津县\",\n\t \"530624\": \"大关县\",\n\t \"530625\": \"永善县\",\n\t \"530626\": \"绥江县\",\n\t \"530627\": \"镇雄县\",\n\t \"530628\": \"彝良县\",\n\t \"530629\": \"威信县\",\n\t \"530630\": \"水富县\",\n\t \"530631\": \"其它区\",\n\t \"530700\": \"丽江市\",\n\t \"530702\": \"古城区\",\n\t \"530721\": \"玉龙纳西族自治县\",\n\t \"530722\": \"永胜县\",\n\t \"530723\": \"华坪县\",\n\t \"530724\": \"宁蒗彝族自治县\",\n\t \"530725\": \"其它区\",\n\t \"530800\": \"普洱市\",\n\t \"530802\": \"思茅区\",\n\t \"530821\": \"宁洱哈尼族彝族自治县\",\n\t \"530822\": \"墨江哈尼族自治县\",\n\t \"530823\": \"景东彝族自治县\",\n\t \"530824\": \"景谷傣族彝族自治县\",\n\t \"530825\": \"镇沅彝族哈尼族拉祜族自治县\",\n\t \"530826\": \"江城哈尼族彝族自治县\",\n\t \"530827\": \"孟连傣族拉祜族佤族自治县\",\n\t \"530828\": \"澜沧拉祜族自治县\",\n\t \"530829\": \"西盟佤族自治县\",\n\t \"530830\": \"其它区\",\n\t \"530900\": \"临沧市\",\n\t \"530902\": \"临翔区\",\n\t \"530921\": \"凤庆县\",\n\t \"530922\": \"云县\",\n\t \"530923\": \"永德县\",\n\t \"530924\": \"镇康县\",\n\t \"530925\": \"双江拉祜族佤族布朗族傣族自治县\",\n\t \"530926\": \"耿马傣族佤族自治县\",\n\t \"530927\": \"沧源佤族自治县\",\n\t \"530928\": \"其它区\",\n\t \"532300\": \"楚雄彝族自治州\",\n\t \"532301\": \"楚雄市\",\n\t \"532322\": \"双柏县\",\n\t \"532323\": \"牟定县\",\n\t \"532324\": \"南华县\",\n\t \"532325\": \"姚安县\",\n\t \"532326\": \"大姚县\",\n\t \"532327\": \"永仁县\",\n\t \"532328\": \"元谋县\",\n\t \"532329\": \"武定县\",\n\t \"532331\": \"禄丰县\",\n\t \"532332\": \"其它区\",\n\t \"532500\": \"红河哈尼族彝族自治州\",\n\t \"532501\": \"个旧市\",\n\t \"532502\": \"开远市\",\n\t \"532522\": \"蒙自市\",\n\t \"532523\": \"屏边苗族自治县\",\n\t \"532524\": \"建水县\",\n\t \"532525\": \"石屏县\",\n\t \"532526\": \"弥勒市\",\n\t \"532527\": \"泸西县\",\n\t \"532528\": \"元阳县\",\n\t \"532529\": \"红河县\",\n\t \"532530\": \"金平苗族瑶族傣族自治县\",\n\t \"532531\": \"绿春县\",\n\t \"532532\": \"河口瑶族自治县\",\n\t \"532533\": \"其它区\",\n\t \"532600\": \"文山壮族苗族自治州\",\n\t \"532621\": \"文山市\",\n\t \"532622\": \"砚山县\",\n\t \"532623\": \"西畴县\",\n\t \"532624\": \"麻栗坡县\",\n\t \"532625\": \"马关县\",\n\t \"532626\": \"丘北县\",\n\t \"532627\": \"广南县\",\n\t \"532628\": \"富宁县\",\n\t \"532629\": \"其它区\",\n\t \"532800\": \"西双版纳傣族自治州\",\n\t \"532801\": \"景洪市\",\n\t \"532822\": \"勐海县\",\n\t \"532823\": \"勐腊县\",\n\t \"532824\": \"其它区\",\n\t \"532900\": \"大理白族自治州\",\n\t \"532901\": \"大理市\",\n\t \"532922\": \"漾濞彝族自治县\",\n\t \"532923\": \"祥云县\",\n\t \"532924\": \"宾川县\",\n\t \"532925\": \"弥渡县\",\n\t \"532926\": \"南涧彝族自治县\",\n\t \"532927\": \"巍山彝族回族自治县\",\n\t \"532928\": \"永平县\",\n\t \"532929\": \"云龙县\",\n\t \"532930\": \"洱源县\",\n\t \"532931\": \"剑川县\",\n\t \"532932\": \"鹤庆县\",\n\t \"532933\": \"其它区\",\n\t \"533100\": \"德宏傣族景颇族自治州\",\n\t \"533102\": \"瑞丽市\",\n\t \"533103\": \"芒市\",\n\t \"533122\": \"梁河县\",\n\t \"533123\": \"盈江县\",\n\t \"533124\": \"陇川县\",\n\t \"533125\": \"其它区\",\n\t \"533300\": \"怒江傈僳族自治州\",\n\t \"533321\": \"泸水县\",\n\t \"533323\": \"福贡县\",\n\t \"533324\": \"贡山独龙族怒族自治县\",\n\t \"533325\": \"兰坪白族普米族自治县\",\n\t \"533326\": \"其它区\",\n\t \"533400\": \"迪庆藏族自治州\",\n\t \"533421\": \"香格里拉县\",\n\t \"533422\": \"德钦县\",\n\t \"533423\": \"维西傈僳族自治县\",\n\t \"533424\": \"其它区\",\n\t \"540000\": \"西藏自治区\",\n\t \"540100\": \"拉萨市\",\n\t \"540102\": \"城关区\",\n\t \"540121\": \"林周县\",\n\t \"540122\": \"当雄县\",\n\t \"540123\": \"尼木县\",\n\t \"540124\": \"曲水县\",\n\t \"540125\": \"堆龙德庆县\",\n\t \"540126\": \"达孜县\",\n\t \"540127\": \"墨竹工卡县\",\n\t \"540128\": \"其它区\",\n\t \"542100\": \"昌都地区\",\n\t \"542121\": \"昌都县\",\n\t \"542122\": \"江达县\",\n\t \"542123\": \"贡觉县\",\n\t \"542124\": \"类乌齐县\",\n\t \"542125\": \"丁青县\",\n\t \"542126\": \"察雅县\",\n\t \"542127\": \"八宿县\",\n\t \"542128\": \"左贡县\",\n\t \"542129\": \"芒康县\",\n\t \"542132\": \"洛隆县\",\n\t \"542133\": \"边坝县\",\n\t \"542134\": \"其它区\",\n\t \"542200\": \"山南地区\",\n\t \"542221\": \"乃东县\",\n\t \"542222\": \"扎囊县\",\n\t \"542223\": \"贡嘎县\",\n\t \"542224\": \"桑日县\",\n\t \"542225\": \"琼结县\",\n\t \"542226\": \"曲松县\",\n\t \"542227\": \"措美县\",\n\t \"542228\": \"洛扎县\",\n\t \"542229\": \"加查县\",\n\t \"542231\": \"隆子县\",\n\t \"542232\": \"错那县\",\n\t \"542233\": \"浪卡子县\",\n\t \"542234\": \"其它区\",\n\t \"542300\": \"日喀则地区\",\n\t \"542301\": \"日喀则市\",\n\t \"542322\": \"南木林县\",\n\t \"542323\": \"江孜县\",\n\t \"542324\": \"定日县\",\n\t \"542325\": \"萨迦县\",\n\t \"542326\": \"拉孜县\",\n\t \"542327\": \"昂仁县\",\n\t \"542328\": \"谢通门县\",\n\t \"542329\": \"白朗县\",\n\t \"542330\": \"仁布县\",\n\t \"542331\": \"康马县\",\n\t \"542332\": \"定结县\",\n\t \"542333\": \"仲巴县\",\n\t \"542334\": \"亚东县\",\n\t \"542335\": \"吉隆县\",\n\t \"542336\": \"聂拉木县\",\n\t \"542337\": \"萨嘎县\",\n\t \"542338\": \"岗巴县\",\n\t \"542339\": \"其它区\",\n\t \"542400\": \"那曲地区\",\n\t \"542421\": \"那曲县\",\n\t \"542422\": \"嘉黎县\",\n\t \"542423\": \"比如县\",\n\t \"542424\": \"聂荣县\",\n\t \"542425\": \"安多县\",\n\t \"542426\": \"申扎县\",\n\t \"542427\": \"索县\",\n\t \"542428\": \"班戈县\",\n\t \"542429\": \"巴青县\",\n\t \"542430\": \"尼玛县\",\n\t \"542431\": \"其它区\",\n\t \"542432\": \"双湖县\",\n\t \"542500\": \"阿里地区\",\n\t \"542521\": \"普兰县\",\n\t \"542522\": \"札达县\",\n\t \"542523\": \"噶尔县\",\n\t \"542524\": \"日土县\",\n\t \"542525\": \"革吉县\",\n\t \"542526\": \"改则县\",\n\t \"542527\": \"措勤县\",\n\t \"542528\": \"其它区\",\n\t \"542600\": \"林芝地区\",\n\t \"542621\": \"林芝县\",\n\t \"542622\": \"工布江达县\",\n\t \"542623\": \"米林县\",\n\t \"542624\": \"墨脱县\",\n\t \"542625\": \"波密县\",\n\t \"542626\": \"察隅县\",\n\t \"542627\": \"朗县\",\n\t \"542628\": \"其它区\",\n\t \"610000\": \"陕西省\",\n\t \"610100\": \"西安市\",\n\t \"610102\": \"新城区\",\n\t \"610103\": \"碑林区\",\n\t \"610104\": \"莲湖区\",\n\t \"610111\": \"灞桥区\",\n\t \"610112\": \"未央区\",\n\t \"610113\": \"雁塔区\",\n\t \"610114\": \"阎良区\",\n\t \"610115\": \"临潼区\",\n\t \"610116\": \"长安区\",\n\t \"610122\": \"蓝田县\",\n\t \"610124\": \"周至县\",\n\t \"610125\": \"户县\",\n\t \"610126\": \"高陵县\",\n\t \"610127\": \"其它区\",\n\t \"610200\": \"铜川市\",\n\t \"610202\": \"王益区\",\n\t \"610203\": \"印台区\",\n\t \"610204\": \"耀州区\",\n\t \"610222\": \"宜君县\",\n\t \"610223\": \"其它区\",\n\t \"610300\": \"宝鸡市\",\n\t \"610302\": \"渭滨区\",\n\t \"610303\": \"金台区\",\n\t \"610304\": \"陈仓区\",\n\t \"610322\": \"凤翔县\",\n\t \"610323\": \"岐山县\",\n\t \"610324\": \"扶风县\",\n\t \"610326\": \"眉县\",\n\t \"610327\": \"陇县\",\n\t \"610328\": \"千阳县\",\n\t \"610329\": \"麟游县\",\n\t \"610330\": \"凤县\",\n\t \"610331\": \"太白县\",\n\t \"610332\": \"其它区\",\n\t \"610400\": \"咸阳市\",\n\t \"610402\": \"秦都区\",\n\t \"610403\": \"杨陵区\",\n\t \"610404\": \"渭城区\",\n\t \"610422\": \"三原县\",\n\t \"610423\": \"泾阳县\",\n\t \"610424\": \"乾县\",\n\t \"610425\": \"礼泉县\",\n\t \"610426\": \"永寿县\",\n\t \"610427\": \"彬县\",\n\t \"610428\": \"长武县\",\n\t \"610429\": \"旬邑县\",\n\t \"610430\": \"淳化县\",\n\t \"610431\": \"武功县\",\n\t \"610481\": \"兴平市\",\n\t \"610482\": \"其它区\",\n\t \"610500\": \"渭南市\",\n\t \"610502\": \"临渭区\",\n\t \"610521\": \"华县\",\n\t \"610522\": \"潼关县\",\n\t \"610523\": \"大荔县\",\n\t \"610524\": \"合阳县\",\n\t \"610525\": \"澄城县\",\n\t \"610526\": \"蒲城县\",\n\t \"610527\": \"白水县\",\n\t \"610528\": \"富平县\",\n\t \"610581\": \"韩城市\",\n\t \"610582\": \"华阴市\",\n\t \"610583\": \"其它区\",\n\t \"610600\": \"延安市\",\n\t \"610602\": \"宝塔区\",\n\t \"610621\": \"延长县\",\n\t \"610622\": \"延川县\",\n\t \"610623\": \"子长县\",\n\t \"610624\": \"安塞县\",\n\t \"610625\": \"志丹县\",\n\t \"610626\": \"吴起县\",\n\t \"610627\": \"甘泉县\",\n\t \"610628\": \"富县\",\n\t \"610629\": \"洛川县\",\n\t \"610630\": \"宜川县\",\n\t \"610631\": \"黄龙县\",\n\t \"610632\": \"黄陵县\",\n\t \"610633\": \"其它区\",\n\t \"610700\": \"汉中市\",\n\t \"610702\": \"汉台区\",\n\t \"610721\": \"南郑县\",\n\t \"610722\": \"城固县\",\n\t \"610723\": \"洋县\",\n\t \"610724\": \"西乡县\",\n\t \"610725\": \"勉县\",\n\t \"610726\": \"宁强县\",\n\t \"610727\": \"略阳县\",\n\t \"610728\": \"镇巴县\",\n\t \"610729\": \"留坝县\",\n\t \"610730\": \"佛坪县\",\n\t \"610731\": \"其它区\",\n\t \"610800\": \"榆林市\",\n\t \"610802\": \"榆阳区\",\n\t \"610821\": \"神木县\",\n\t \"610822\": \"府谷县\",\n\t \"610823\": \"横山县\",\n\t \"610824\": \"靖边县\",\n\t \"610825\": \"定边县\",\n\t \"610826\": \"绥德县\",\n\t \"610827\": \"米脂县\",\n\t \"610828\": \"佳县\",\n\t \"610829\": \"吴堡县\",\n\t \"610830\": \"清涧县\",\n\t \"610831\": \"子洲县\",\n\t \"610832\": \"其它区\",\n\t \"610900\": \"安康市\",\n\t \"610902\": \"汉滨区\",\n\t \"610921\": \"汉阴县\",\n\t \"610922\": \"石泉县\",\n\t \"610923\": \"宁陕县\",\n\t \"610924\": \"紫阳县\",\n\t \"610925\": \"岚皋县\",\n\t \"610926\": \"平利县\",\n\t \"610927\": \"镇坪县\",\n\t \"610928\": \"旬阳县\",\n\t \"610929\": \"白河县\",\n\t \"610930\": \"其它区\",\n\t \"611000\": \"商洛市\",\n\t \"611002\": \"商州区\",\n\t \"611021\": \"洛南县\",\n\t \"611022\": \"丹凤县\",\n\t \"611023\": \"商南县\",\n\t \"611024\": \"山阳县\",\n\t \"611025\": \"镇安县\",\n\t \"611026\": \"柞水县\",\n\t \"611027\": \"其它区\",\n\t \"620000\": \"甘肃省\",\n\t \"620100\": \"兰州市\",\n\t \"620102\": \"城关区\",\n\t \"620103\": \"七里河区\",\n\t \"620104\": \"西固区\",\n\t \"620105\": \"安宁区\",\n\t \"620111\": \"红古区\",\n\t \"620121\": \"永登县\",\n\t \"620122\": \"皋兰县\",\n\t \"620123\": \"榆中县\",\n\t \"620124\": \"其它区\",\n\t \"620200\": \"嘉峪关市\",\n\t \"620300\": \"金昌市\",\n\t \"620302\": \"金川区\",\n\t \"620321\": \"永昌县\",\n\t \"620322\": \"其它区\",\n\t \"620400\": \"白银市\",\n\t \"620402\": \"白银区\",\n\t \"620403\": \"平川区\",\n\t \"620421\": \"靖远县\",\n\t \"620422\": \"会宁县\",\n\t \"620423\": \"景泰县\",\n\t \"620424\": \"其它区\",\n\t \"620500\": \"天水市\",\n\t \"620502\": \"秦州区\",\n\t \"620503\": \"麦积区\",\n\t \"620521\": \"清水县\",\n\t \"620522\": \"秦安县\",\n\t \"620523\": \"甘谷县\",\n\t \"620524\": \"武山县\",\n\t \"620525\": \"张家川回族自治县\",\n\t \"620526\": \"其它区\",\n\t \"620600\": \"武威市\",\n\t \"620602\": \"凉州区\",\n\t \"620621\": \"民勤县\",\n\t \"620622\": \"古浪县\",\n\t \"620623\": \"天祝藏族自治县\",\n\t \"620624\": \"其它区\",\n\t \"620700\": \"张掖市\",\n\t \"620702\": \"甘州区\",\n\t \"620721\": \"肃南裕固族自治县\",\n\t \"620722\": \"民乐县\",\n\t \"620723\": \"临泽县\",\n\t \"620724\": \"高台县\",\n\t \"620725\": \"山丹县\",\n\t \"620726\": \"其它区\",\n\t \"620800\": \"平凉市\",\n\t \"620802\": \"崆峒区\",\n\t \"620821\": \"泾川县\",\n\t \"620822\": \"灵台县\",\n\t \"620823\": \"崇信县\",\n\t \"620824\": \"华亭县\",\n\t \"620825\": \"庄浪县\",\n\t \"620826\": \"静宁县\",\n\t \"620827\": \"其它区\",\n\t \"620900\": \"酒泉市\",\n\t \"620902\": \"肃州区\",\n\t \"620921\": \"金塔县\",\n\t \"620922\": \"瓜州县\",\n\t \"620923\": \"肃北蒙古族自治县\",\n\t \"620924\": \"阿克塞哈萨克族自治县\",\n\t \"620981\": \"玉门市\",\n\t \"620982\": \"敦煌市\",\n\t \"620983\": \"其它区\",\n\t \"621000\": \"庆阳市\",\n\t \"621002\": \"西峰区\",\n\t \"621021\": \"庆城县\",\n\t \"621022\": \"环县\",\n\t \"621023\": \"华池县\",\n\t \"621024\": \"合水县\",\n\t \"621025\": \"正宁县\",\n\t \"621026\": \"宁县\",\n\t \"621027\": \"镇原县\",\n\t \"621028\": \"其它区\",\n\t \"621100\": \"定西市\",\n\t \"621102\": \"安定区\",\n\t \"621121\": \"通渭县\",\n\t \"621122\": \"陇西县\",\n\t \"621123\": \"渭源县\",\n\t \"621124\": \"临洮县\",\n\t \"621125\": \"漳县\",\n\t \"621126\": \"岷县\",\n\t \"621127\": \"其它区\",\n\t \"621200\": \"陇南市\",\n\t \"621202\": \"武都区\",\n\t \"621221\": \"成县\",\n\t \"621222\": \"文县\",\n\t \"621223\": \"宕昌县\",\n\t \"621224\": \"康县\",\n\t \"621225\": \"西和县\",\n\t \"621226\": \"礼县\",\n\t \"621227\": \"徽县\",\n\t \"621228\": \"两当县\",\n\t \"621229\": \"其它区\",\n\t \"622900\": \"临夏回族自治州\",\n\t \"622901\": \"临夏市\",\n\t \"622921\": \"临夏县\",\n\t \"622922\": \"康乐县\",\n\t \"622923\": \"永靖县\",\n\t \"622924\": \"广河县\",\n\t \"622925\": \"和政县\",\n\t \"622926\": \"东乡族自治县\",\n\t \"622927\": \"积石山保安族东乡族撒拉族自治县\",\n\t \"622928\": \"其它区\",\n\t \"623000\": \"甘南藏族自治州\",\n\t \"623001\": \"合作市\",\n\t \"623021\": \"临潭县\",\n\t \"623022\": \"卓尼县\",\n\t \"623023\": \"舟曲县\",\n\t \"623024\": \"迭部县\",\n\t \"623025\": \"玛曲县\",\n\t \"623026\": \"碌曲县\",\n\t \"623027\": \"夏河县\",\n\t \"623028\": \"其它区\",\n\t \"630000\": \"青海省\",\n\t \"630100\": \"西宁市\",\n\t \"630102\": \"城东区\",\n\t \"630103\": \"城中区\",\n\t \"630104\": \"城西区\",\n\t \"630105\": \"城北区\",\n\t \"630121\": \"大通回族土族自治县\",\n\t \"630122\": \"湟中县\",\n\t \"630123\": \"湟源县\",\n\t \"630124\": \"其它区\",\n\t \"632100\": \"海东市\",\n\t \"632121\": \"平安县\",\n\t \"632122\": \"民和回族土族自治县\",\n\t \"632123\": \"乐都区\",\n\t \"632126\": \"互助土族自治县\",\n\t \"632127\": \"化隆回族自治县\",\n\t \"632128\": \"循化撒拉族自治县\",\n\t \"632129\": \"其它区\",\n\t \"632200\": \"海北藏族自治州\",\n\t \"632221\": \"门源回族自治县\",\n\t \"632222\": \"祁连县\",\n\t \"632223\": \"海晏县\",\n\t \"632224\": \"刚察县\",\n\t \"632225\": \"其它区\",\n\t \"632300\": \"黄南藏族自治州\",\n\t \"632321\": \"同仁县\",\n\t \"632322\": \"尖扎县\",\n\t \"632323\": \"泽库县\",\n\t \"632324\": \"河南蒙古族自治县\",\n\t \"632325\": \"其它区\",\n\t \"632500\": \"海南藏族自治州\",\n\t \"632521\": \"共和县\",\n\t \"632522\": \"同德县\",\n\t \"632523\": \"贵德县\",\n\t \"632524\": \"兴海县\",\n\t \"632525\": \"贵南县\",\n\t \"632526\": \"其它区\",\n\t \"632600\": \"果洛藏族自治州\",\n\t \"632621\": \"玛沁县\",\n\t \"632622\": \"班玛县\",\n\t \"632623\": \"甘德县\",\n\t \"632624\": \"达日县\",\n\t \"632625\": \"久治县\",\n\t \"632626\": \"玛多县\",\n\t \"632627\": \"其它区\",\n\t \"632700\": \"玉树藏族自治州\",\n\t \"632721\": \"玉树市\",\n\t \"632722\": \"杂多县\",\n\t \"632723\": \"称多县\",\n\t \"632724\": \"治多县\",\n\t \"632725\": \"囊谦县\",\n\t \"632726\": \"曲麻莱县\",\n\t \"632727\": \"其它区\",\n\t \"632800\": \"海西蒙古族藏族自治州\",\n\t \"632801\": \"格尔木市\",\n\t \"632802\": \"德令哈市\",\n\t \"632821\": \"乌兰县\",\n\t \"632822\": \"都兰县\",\n\t \"632823\": \"天峻县\",\n\t \"632824\": \"其它区\",\n\t \"640000\": \"宁夏回族自治区\",\n\t \"640100\": \"银川市\",\n\t \"640104\": \"兴庆区\",\n\t \"640105\": \"西夏区\",\n\t \"640106\": \"金凤区\",\n\t \"640121\": \"永宁县\",\n\t \"640122\": \"贺兰县\",\n\t \"640181\": \"灵武市\",\n\t \"640182\": \"其它区\",\n\t \"640200\": \"石嘴山市\",\n\t \"640202\": \"大武口区\",\n\t \"640205\": \"惠农区\",\n\t \"640221\": \"平罗县\",\n\t \"640222\": \"其它区\",\n\t \"640300\": \"吴忠市\",\n\t \"640302\": \"利通区\",\n\t \"640303\": \"红寺堡区\",\n\t \"640323\": \"盐池县\",\n\t \"640324\": \"同心县\",\n\t \"640381\": \"青铜峡市\",\n\t \"640382\": \"其它区\",\n\t \"640400\": \"固原市\",\n\t \"640402\": \"原州区\",\n\t \"640422\": \"西吉县\",\n\t \"640423\": \"隆德县\",\n\t \"640424\": \"泾源县\",\n\t \"640425\": \"彭阳县\",\n\t \"640426\": \"其它区\",\n\t \"640500\": \"中卫市\",\n\t \"640502\": \"沙坡头区\",\n\t \"640521\": \"中宁县\",\n\t \"640522\": \"海原县\",\n\t \"640523\": \"其它区\",\n\t \"650000\": \"新疆维吾尔自治区\",\n\t \"650100\": \"乌鲁木齐市\",\n\t \"650102\": \"天山区\",\n\t \"650103\": \"沙依巴克区\",\n\t \"650104\": \"新市区\",\n\t \"650105\": \"水磨沟区\",\n\t \"650106\": \"头屯河区\",\n\t \"650107\": \"达坂城区\",\n\t \"650109\": \"米东区\",\n\t \"650121\": \"乌鲁木齐县\",\n\t \"650122\": \"其它区\",\n\t \"650200\": \"克拉玛依市\",\n\t \"650202\": \"独山子区\",\n\t \"650203\": \"克拉玛依区\",\n\t \"650204\": \"白碱滩区\",\n\t \"650205\": \"乌尔禾区\",\n\t \"650206\": \"其它区\",\n\t \"652100\": \"吐鲁番地区\",\n\t \"652101\": \"吐鲁番市\",\n\t \"652122\": \"鄯善县\",\n\t \"652123\": \"托克逊县\",\n\t \"652124\": \"其它区\",\n\t \"652200\": \"哈密地区\",\n\t \"652201\": \"哈密市\",\n\t \"652222\": \"巴里坤哈萨克自治县\",\n\t \"652223\": \"伊吾县\",\n\t \"652224\": \"其它区\",\n\t \"652300\": \"昌吉回族自治州\",\n\t \"652301\": \"昌吉市\",\n\t \"652302\": \"阜康市\",\n\t \"652323\": \"呼图壁县\",\n\t \"652324\": \"玛纳斯县\",\n\t \"652325\": \"奇台县\",\n\t \"652327\": \"吉木萨尔县\",\n\t \"652328\": \"木垒哈萨克自治县\",\n\t \"652329\": \"其它区\",\n\t \"652700\": \"博尔塔拉蒙古自治州\",\n\t \"652701\": \"博乐市\",\n\t \"652702\": \"阿拉山口市\",\n\t \"652722\": \"精河县\",\n\t \"652723\": \"温泉县\",\n\t \"652724\": \"其它区\",\n\t \"652800\": \"巴音郭楞蒙古自治州\",\n\t \"652801\": \"库尔勒市\",\n\t \"652822\": \"轮台县\",\n\t \"652823\": \"尉犁县\",\n\t \"652824\": \"若羌县\",\n\t \"652825\": \"且末县\",\n\t \"652826\": \"焉耆回族自治县\",\n\t \"652827\": \"和静县\",\n\t \"652828\": \"和硕县\",\n\t \"652829\": \"博湖县\",\n\t \"652830\": \"其它区\",\n\t \"652900\": \"阿克苏地区\",\n\t \"652901\": \"阿克苏市\",\n\t \"652922\": \"温宿县\",\n\t \"652923\": \"库车县\",\n\t \"652924\": \"沙雅县\",\n\t \"652925\": \"新和县\",\n\t \"652926\": \"拜城县\",\n\t \"652927\": \"乌什县\",\n\t \"652928\": \"阿瓦提县\",\n\t \"652929\": \"柯坪县\",\n\t \"652930\": \"其它区\",\n\t \"653000\": \"克孜勒苏柯尔克孜自治州\",\n\t \"653001\": \"阿图什市\",\n\t \"653022\": \"阿克陶县\",\n\t \"653023\": \"阿合奇县\",\n\t \"653024\": \"乌恰县\",\n\t \"653025\": \"其它区\",\n\t \"653100\": \"喀什地区\",\n\t \"653101\": \"喀什市\",\n\t \"653121\": \"疏附县\",\n\t \"653122\": \"疏勒县\",\n\t \"653123\": \"英吉沙县\",\n\t \"653124\": \"泽普县\",\n\t \"653125\": \"莎车县\",\n\t \"653126\": \"叶城县\",\n\t \"653127\": \"麦盖提县\",\n\t \"653128\": \"岳普湖县\",\n\t \"653129\": \"伽师县\",\n\t \"653130\": \"巴楚县\",\n\t \"653131\": \"塔什库尔干塔吉克自治县\",\n\t \"653132\": \"其它区\",\n\t \"653200\": \"和田地区\",\n\t \"653201\": \"和田市\",\n\t \"653221\": \"和田县\",\n\t \"653222\": \"墨玉县\",\n\t \"653223\": \"皮山县\",\n\t \"653224\": \"洛浦县\",\n\t \"653225\": \"策勒县\",\n\t \"653226\": \"于田县\",\n\t \"653227\": \"民丰县\",\n\t \"653228\": \"其它区\",\n\t \"654000\": \"伊犁哈萨克自治州\",\n\t \"654002\": \"伊宁市\",\n\t \"654003\": \"奎屯市\",\n\t \"654021\": \"伊宁县\",\n\t \"654022\": \"察布查尔锡伯自治县\",\n\t \"654023\": \"霍城县\",\n\t \"654024\": \"巩留县\",\n\t \"654025\": \"新源县\",\n\t \"654026\": \"昭苏县\",\n\t \"654027\": \"特克斯县\",\n\t \"654028\": \"尼勒克县\",\n\t \"654029\": \"其它区\",\n\t \"654200\": \"塔城地区\",\n\t \"654201\": \"塔城市\",\n\t \"654202\": \"乌苏市\",\n\t \"654221\": \"额敏县\",\n\t \"654223\": \"沙湾县\",\n\t \"654224\": \"托里县\",\n\t \"654225\": \"裕民县\",\n\t \"654226\": \"和布克赛尔蒙古自治县\",\n\t \"654227\": \"其它区\",\n\t \"654300\": \"阿勒泰地区\",\n\t \"654301\": \"阿勒泰市\",\n\t \"654321\": \"布尔津县\",\n\t \"654322\": \"富蕴县\",\n\t \"654323\": \"福海县\",\n\t \"654324\": \"哈巴河县\",\n\t \"654325\": \"青河县\",\n\t \"654326\": \"吉木乃县\",\n\t \"654327\": \"其它区\",\n\t \"659001\": \"石河子市\",\n\t \"659002\": \"阿拉尔市\",\n\t \"659003\": \"图木舒克市\",\n\t \"659004\": \"五家渠市\",\n\t \"710000\": \"台湾\",\n\t \"710100\": \"台北市\",\n\t \"710101\": \"中正区\",\n\t \"710102\": \"大同区\",\n\t \"710103\": \"中山区\",\n\t \"710104\": \"松山区\",\n\t \"710105\": \"大安区\",\n\t \"710106\": \"万华区\",\n\t \"710107\": \"信义区\",\n\t \"710108\": \"士林区\",\n\t \"710109\": \"北投区\",\n\t \"710110\": \"内湖区\",\n\t \"710111\": \"南港区\",\n\t \"710112\": \"文山区\",\n\t \"710113\": \"其它区\",\n\t \"710200\": \"高雄市\",\n\t \"710201\": \"新兴区\",\n\t \"710202\": \"前金区\",\n\t \"710203\": \"芩雅区\",\n\t \"710204\": \"盐埕区\",\n\t \"710205\": \"鼓山区\",\n\t \"710206\": \"旗津区\",\n\t \"710207\": \"前镇区\",\n\t \"710208\": \"三民区\",\n\t \"710209\": \"左营区\",\n\t \"710210\": \"楠梓区\",\n\t \"710211\": \"小港区\",\n\t \"710212\": \"其它区\",\n\t \"710241\": \"苓雅区\",\n\t \"710242\": \"仁武区\",\n\t \"710243\": \"大社区\",\n\t \"710244\": \"冈山区\",\n\t \"710245\": \"路竹区\",\n\t \"710246\": \"阿莲区\",\n\t \"710247\": \"田寮区\",\n\t \"710248\": \"燕巢区\",\n\t \"710249\": \"桥头区\",\n\t \"710250\": \"梓官区\",\n\t \"710251\": \"弥陀区\",\n\t \"710252\": \"永安区\",\n\t \"710253\": \"湖内区\",\n\t \"710254\": \"凤山区\",\n\t \"710255\": \"大寮区\",\n\t \"710256\": \"林园区\",\n\t \"710257\": \"鸟松区\",\n\t \"710258\": \"大树区\",\n\t \"710259\": \"旗山区\",\n\t \"710260\": \"美浓区\",\n\t \"710261\": \"六龟区\",\n\t \"710262\": \"内门区\",\n\t \"710263\": \"杉林区\",\n\t \"710264\": \"甲仙区\",\n\t \"710265\": \"桃源区\",\n\t \"710266\": \"那玛夏区\",\n\t \"710267\": \"茂林区\",\n\t \"710268\": \"茄萣区\",\n\t \"710300\": \"台南市\",\n\t \"710301\": \"中西区\",\n\t \"710302\": \"东区\",\n\t \"710303\": \"南区\",\n\t \"710304\": \"北区\",\n\t \"710305\": \"安平区\",\n\t \"710306\": \"安南区\",\n\t \"710307\": \"其它区\",\n\t \"710339\": \"永康区\",\n\t \"710340\": \"归仁区\",\n\t \"710341\": \"新化区\",\n\t \"710342\": \"左镇区\",\n\t \"710343\": \"玉井区\",\n\t \"710344\": \"楠西区\",\n\t \"710345\": \"南化区\",\n\t \"710346\": \"仁德区\",\n\t \"710347\": \"关庙区\",\n\t \"710348\": \"龙崎区\",\n\t \"710349\": \"官田区\",\n\t \"710350\": \"麻豆区\",\n\t \"710351\": \"佳里区\",\n\t \"710352\": \"西港区\",\n\t \"710353\": \"七股区\",\n\t \"710354\": \"将军区\",\n\t \"710355\": \"学甲区\",\n\t \"710356\": \"北门区\",\n\t \"710357\": \"新营区\",\n\t \"710358\": \"后壁区\",\n\t \"710359\": \"白河区\",\n\t \"710360\": \"东山区\",\n\t \"710361\": \"六甲区\",\n\t \"710362\": \"下营区\",\n\t \"710363\": \"柳营区\",\n\t \"710364\": \"盐水区\",\n\t \"710365\": \"善化区\",\n\t \"710366\": \"大内区\",\n\t \"710367\": \"山上区\",\n\t \"710368\": \"新市区\",\n\t \"710369\": \"安定区\",\n\t \"710400\": \"台中市\",\n\t \"710401\": \"中区\",\n\t \"710402\": \"东区\",\n\t \"710403\": \"南区\",\n\t \"710404\": \"西区\",\n\t \"710405\": \"北区\",\n\t \"710406\": \"北屯区\",\n\t \"710407\": \"西屯区\",\n\t \"710408\": \"南屯区\",\n\t \"710409\": \"其它区\",\n\t \"710431\": \"太平区\",\n\t \"710432\": \"大里区\",\n\t \"710433\": \"雾峰区\",\n\t \"710434\": \"乌日区\",\n\t \"710435\": \"丰原区\",\n\t \"710436\": \"后里区\",\n\t \"710437\": \"石冈区\",\n\t \"710438\": \"东势区\",\n\t \"710439\": \"和平区\",\n\t \"710440\": \"新社区\",\n\t \"710441\": \"潭子区\",\n\t \"710442\": \"大雅区\",\n\t \"710443\": \"神冈区\",\n\t \"710444\": \"大肚区\",\n\t \"710445\": \"沙鹿区\",\n\t \"710446\": \"龙井区\",\n\t \"710447\": \"梧栖区\",\n\t \"710448\": \"清水区\",\n\t \"710449\": \"大甲区\",\n\t \"710450\": \"外埔区\",\n\t \"710451\": \"大安区\",\n\t \"710500\": \"金门县\",\n\t \"710507\": \"金沙镇\",\n\t \"710508\": \"金湖镇\",\n\t \"710509\": \"金宁乡\",\n\t \"710510\": \"金城镇\",\n\t \"710511\": \"烈屿乡\",\n\t \"710512\": \"乌坵乡\",\n\t \"710600\": \"南投县\",\n\t \"710614\": \"南投市\",\n\t \"710615\": \"中寮乡\",\n\t \"710616\": \"草屯镇\",\n\t \"710617\": \"国姓乡\",\n\t \"710618\": \"埔里镇\",\n\t \"710619\": \"仁爱乡\",\n\t \"710620\": \"名间乡\",\n\t \"710621\": \"集集镇\",\n\t \"710622\": \"水里乡\",\n\t \"710623\": \"鱼池乡\",\n\t \"710624\": \"信义乡\",\n\t \"710625\": \"竹山镇\",\n\t \"710626\": \"鹿谷乡\",\n\t \"710700\": \"基隆市\",\n\t \"710701\": \"仁爱区\",\n\t \"710702\": \"信义区\",\n\t \"710703\": \"中正区\",\n\t \"710704\": \"中山区\",\n\t \"710705\": \"安乐区\",\n\t \"710706\": \"暖暖区\",\n\t \"710707\": \"七堵区\",\n\t \"710708\": \"其它区\",\n\t \"710800\": \"新竹市\",\n\t \"710801\": \"东区\",\n\t \"710802\": \"北区\",\n\t \"710803\": \"香山区\",\n\t \"710804\": \"其它区\",\n\t \"710900\": \"嘉义市\",\n\t \"710901\": \"东区\",\n\t \"710902\": \"西区\",\n\t \"710903\": \"其它区\",\n\t \"711100\": \"新北市\",\n\t \"711130\": \"万里区\",\n\t \"711131\": \"金山区\",\n\t \"711132\": \"板桥区\",\n\t \"711133\": \"汐止区\",\n\t \"711134\": \"深坑区\",\n\t \"711135\": \"石碇区\",\n\t \"711136\": \"瑞芳区\",\n\t \"711137\": \"平溪区\",\n\t \"711138\": \"双溪区\",\n\t \"711139\": \"贡寮区\",\n\t \"711140\": \"新店区\",\n\t \"711141\": \"坪林区\",\n\t \"711142\": \"乌来区\",\n\t \"711143\": \"永和区\",\n\t \"711144\": \"中和区\",\n\t \"711145\": \"土城区\",\n\t \"711146\": \"三峡区\",\n\t \"711147\": \"树林区\",\n\t \"711148\": \"莺歌区\",\n\t \"711149\": \"三重区\",\n\t \"711150\": \"新庄区\",\n\t \"711151\": \"泰山区\",\n\t \"711152\": \"林口区\",\n\t \"711153\": \"芦洲区\",\n\t \"711154\": \"五股区\",\n\t \"711155\": \"八里区\",\n\t \"711156\": \"淡水区\",\n\t \"711157\": \"三芝区\",\n\t \"711158\": \"石门区\",\n\t \"711200\": \"宜兰县\",\n\t \"711214\": \"宜兰市\",\n\t \"711215\": \"头城镇\",\n\t \"711216\": \"礁溪乡\",\n\t \"711217\": \"壮围乡\",\n\t \"711218\": \"员山乡\",\n\t \"711219\": \"罗东镇\",\n\t \"711220\": \"三星乡\",\n\t \"711221\": \"大同乡\",\n\t \"711222\": \"五结乡\",\n\t \"711223\": \"冬山乡\",\n\t \"711224\": \"苏澳镇\",\n\t \"711225\": \"南澳乡\",\n\t \"711226\": \"钓鱼台\",\n\t \"711300\": \"新竹县\",\n\t \"711314\": \"竹北市\",\n\t \"711315\": \"湖口乡\",\n\t \"711316\": \"新丰乡\",\n\t \"711317\": \"新埔镇\",\n\t \"711318\": \"关西镇\",\n\t \"711319\": \"芎林乡\",\n\t \"711320\": \"宝山乡\",\n\t \"711321\": \"竹东镇\",\n\t \"711322\": \"五峰乡\",\n\t \"711323\": \"横山乡\",\n\t \"711324\": \"尖石乡\",\n\t \"711325\": \"北埔乡\",\n\t \"711326\": \"峨眉乡\",\n\t \"711400\": \"桃园县\",\n\t \"711414\": \"中坜市\",\n\t \"711415\": \"平镇市\",\n\t \"711416\": \"龙潭乡\",\n\t \"711417\": \"杨梅市\",\n\t \"711418\": \"新屋乡\",\n\t \"711419\": \"观音乡\",\n\t \"711420\": \"桃园市\",\n\t \"711421\": \"龟山乡\",\n\t \"711422\": \"八德市\",\n\t \"711423\": \"大溪镇\",\n\t \"711424\": \"复兴乡\",\n\t \"711425\": \"大园乡\",\n\t \"711426\": \"芦竹乡\",\n\t \"711500\": \"苗栗县\",\n\t \"711519\": \"竹南镇\",\n\t \"711520\": \"头份镇\",\n\t \"711521\": \"三湾乡\",\n\t \"711522\": \"南庄乡\",\n\t \"711523\": \"狮潭乡\",\n\t \"711524\": \"后龙镇\",\n\t \"711525\": \"通霄镇\",\n\t \"711526\": \"苑里镇\",\n\t \"711527\": \"苗栗市\",\n\t \"711528\": \"造桥乡\",\n\t \"711529\": \"头屋乡\",\n\t \"711530\": \"公馆乡\",\n\t \"711531\": \"大湖乡\",\n\t \"711532\": \"泰安乡\",\n\t \"711533\": \"铜锣乡\",\n\t \"711534\": \"三义乡\",\n\t \"711535\": \"西湖乡\",\n\t \"711536\": \"卓兰镇\",\n\t \"711700\": \"彰化县\",\n\t \"711727\": \"彰化市\",\n\t \"711728\": \"芬园乡\",\n\t \"711729\": \"花坛乡\",\n\t \"711730\": \"秀水乡\",\n\t \"711731\": \"鹿港镇\",\n\t \"711732\": \"福兴乡\",\n\t \"711733\": \"线西乡\",\n\t \"711734\": \"和美镇\",\n\t \"711735\": \"伸港乡\",\n\t \"711736\": \"员林镇\",\n\t \"711737\": \"社头乡\",\n\t \"711738\": \"永靖乡\",\n\t \"711739\": \"埔心乡\",\n\t \"711740\": \"溪湖镇\",\n\t \"711741\": \"大村乡\",\n\t \"711742\": \"埔盐乡\",\n\t \"711743\": \"田中镇\",\n\t \"711744\": \"北斗镇\",\n\t \"711745\": \"田尾乡\",\n\t \"711746\": \"埤头乡\",\n\t \"711747\": \"溪州乡\",\n\t \"711748\": \"竹塘乡\",\n\t \"711749\": \"二林镇\",\n\t \"711750\": \"大城乡\",\n\t \"711751\": \"芳苑乡\",\n\t \"711752\": \"二水乡\",\n\t \"711900\": \"嘉义县\",\n\t \"711919\": \"番路乡\",\n\t \"711920\": \"梅山乡\",\n\t \"711921\": \"竹崎乡\",\n\t \"711922\": \"阿里山乡\",\n\t \"711923\": \"中埔乡\",\n\t \"711924\": \"大埔乡\",\n\t \"711925\": \"水上乡\",\n\t \"711926\": \"鹿草乡\",\n\t \"711927\": \"太保市\",\n\t \"711928\": \"朴子市\",\n\t \"711929\": \"东石乡\",\n\t \"711930\": \"六脚乡\",\n\t \"711931\": \"新港乡\",\n\t \"711932\": \"民雄乡\",\n\t \"711933\": \"大林镇\",\n\t \"711934\": \"溪口乡\",\n\t \"711935\": \"义竹乡\",\n\t \"711936\": \"布袋镇\",\n\t \"712100\": \"云林县\",\n\t \"712121\": \"斗南镇\",\n\t \"712122\": \"大埤乡\",\n\t \"712123\": \"虎尾镇\",\n\t \"712124\": \"土库镇\",\n\t \"712125\": \"褒忠乡\",\n\t \"712126\": \"东势乡\",\n\t \"712127\": \"台西乡\",\n\t \"712128\": \"仑背乡\",\n\t \"712129\": \"麦寮乡\",\n\t \"712130\": \"斗六市\",\n\t \"712131\": \"林内乡\",\n\t \"712132\": \"古坑乡\",\n\t \"712133\": \"莿桐乡\",\n\t \"712134\": \"西螺镇\",\n\t \"712135\": \"二仑乡\",\n\t \"712136\": \"北港镇\",\n\t \"712137\": \"水林乡\",\n\t \"712138\": \"口湖乡\",\n\t \"712139\": \"四湖乡\",\n\t \"712140\": \"元长乡\",\n\t \"712400\": \"屏东县\",\n\t \"712434\": \"屏东市\",\n\t \"712435\": \"三地门乡\",\n\t \"712436\": \"雾台乡\",\n\t \"712437\": \"玛家乡\",\n\t \"712438\": \"九如乡\",\n\t \"712439\": \"里港乡\",\n\t \"712440\": \"高树乡\",\n\t \"712441\": \"盐埔乡\",\n\t \"712442\": \"长治乡\",\n\t \"712443\": \"麟洛乡\",\n\t \"712444\": \"竹田乡\",\n\t \"712445\": \"内埔乡\",\n\t \"712446\": \"万丹乡\",\n\t \"712447\": \"潮州镇\",\n\t \"712448\": \"泰武乡\",\n\t \"712449\": \"来义乡\",\n\t \"712450\": \"万峦乡\",\n\t \"712451\": \"崁顶乡\",\n\t \"712452\": \"新埤乡\",\n\t \"712453\": \"南州乡\",\n\t \"712454\": \"林边乡\",\n\t \"712455\": \"东港镇\",\n\t \"712456\": \"琉球乡\",\n\t \"712457\": \"佳冬乡\",\n\t \"712458\": \"新园乡\",\n\t \"712459\": \"枋寮乡\",\n\t \"712460\": \"枋山乡\",\n\t \"712461\": \"春日乡\",\n\t \"712462\": \"狮子乡\",\n\t \"712463\": \"车城乡\",\n\t \"712464\": \"牡丹乡\",\n\t \"712465\": \"恒春镇\",\n\t \"712466\": \"满州乡\",\n\t \"712500\": \"台东县\",\n\t \"712517\": \"台东市\",\n\t \"712518\": \"绿岛乡\",\n\t \"712519\": \"兰屿乡\",\n\t \"712520\": \"延平乡\",\n\t \"712521\": \"卑南乡\",\n\t \"712522\": \"鹿野乡\",\n\t \"712523\": \"关山镇\",\n\t \"712524\": \"海端乡\",\n\t \"712525\": \"池上乡\",\n\t \"712526\": \"东河乡\",\n\t \"712527\": \"成功镇\",\n\t \"712528\": \"长滨乡\",\n\t \"712529\": \"金峰乡\",\n\t \"712530\": \"大武乡\",\n\t \"712531\": \"达仁乡\",\n\t \"712532\": \"太麻里乡\",\n\t \"712600\": \"花莲县\",\n\t \"712615\": \"花莲市\",\n\t \"712616\": \"新城乡\",\n\t \"712617\": \"太鲁阁\",\n\t \"712618\": \"秀林乡\",\n\t \"712619\": \"吉安乡\",\n\t \"712620\": \"寿丰乡\",\n\t \"712621\": \"凤林镇\",\n\t \"712622\": \"光复乡\",\n\t \"712623\": \"丰滨乡\",\n\t \"712624\": \"瑞穗乡\",\n\t \"712625\": \"万荣乡\",\n\t \"712626\": \"玉里镇\",\n\t \"712627\": \"卓溪乡\",\n\t \"712628\": \"富里乡\",\n\t \"712700\": \"澎湖县\",\n\t \"712707\": \"马公市\",\n\t \"712708\": \"西屿乡\",\n\t \"712709\": \"望安乡\",\n\t \"712710\": \"七美乡\",\n\t \"712711\": \"白沙乡\",\n\t \"712712\": \"湖西乡\",\n\t \"712800\": \"连江县\",\n\t \"712805\": \"南竿乡\",\n\t \"712806\": \"北竿乡\",\n\t \"712807\": \"莒光乡\",\n\t \"712808\": \"东引乡\",\n\t \"810000\": \"香港特别行政区\",\n\t \"810100\": \"香港岛\",\n\t \"810101\": \"中西区\",\n\t \"810102\": \"湾仔\",\n\t \"810103\": \"东区\",\n\t \"810104\": \"南区\",\n\t \"810200\": \"九龙\",\n\t \"810201\": \"九龙城区\",\n\t \"810202\": \"油尖旺区\",\n\t \"810203\": \"深水埗区\",\n\t \"810204\": \"黄大仙区\",\n\t \"810205\": \"观塘区\",\n\t \"810300\": \"新界\",\n\t \"810301\": \"北区\",\n\t \"810302\": \"大埔区\",\n\t \"810303\": \"沙田区\",\n\t \"810304\": \"西贡区\",\n\t \"810305\": \"元朗区\",\n\t \"810306\": \"屯门区\",\n\t \"810307\": \"荃湾区\",\n\t \"810308\": \"葵青区\",\n\t \"810309\": \"离岛区\",\n\t \"820000\": \"澳门特别行政区\",\n\t \"820100\": \"澳门半岛\",\n\t \"820200\": \"离岛\",\n\t \"990000\": \"海外\",\n\t \"990100\": \"海外\"\n\t}\n\n\t// id pid/parentId name children\n\tfunction tree(list) {\n\t var mapped = {}\n\t for (var i = 0, item; i < list.length; i++) {\n\t item = list[i]\n\t if (!item || !item.id) continue\n\t mapped[item.id] = item\n\t }\n\n\t var result = []\n\t for (var ii = 0; ii < list.length; ii++) {\n\t item = list[ii]\n\n\t if (!item) continue\n\t /* jshint -W041 */\n\t if (item.pid == undefined && item.parentId == undefined) {\n\t result.push(item)\n\t continue\n\t }\n\t var parent = mapped[item.pid] || mapped[item.parentId]\n\t if (!parent) continue\n\t if (!parent.children) parent.children = []\n\t parent.children.push(item)\n\t }\n\t return result\n\t}\n\n\tvar DICT_FIXED = function() {\n\t var fixed = []\n\t for (var id in DICT) {\n\t var pid = id.slice(2, 6) === '0000' ? undefined :\n\t id.slice(4, 6) == '00' ? (id.slice(0, 2) + '0000') :\n\t id.slice(0, 4) + '00'\n\t fixed.push({\n\t id: id,\n\t pid: pid,\n\t name: DICT[id]\n\t })\n\t }\n\t return tree(fixed)\n\t}()\n\n\tmodule.exports = DICT_FIXED\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## Miscellaneous\n\t*/\n\tvar DICT = __webpack_require__(18)\n\tmodule.exports = {\n\t\t// Dice\n\t\td4: function() {\n\t\t\treturn this.natural(1, 4)\n\t\t},\n\t\td6: function() {\n\t\t\treturn this.natural(1, 6)\n\t\t},\n\t\td8: function() {\n\t\t\treturn this.natural(1, 8)\n\t\t},\n\t\td12: function() {\n\t\t\treturn this.natural(1, 12)\n\t\t},\n\t\td20: function() {\n\t\t\treturn this.natural(1, 20)\n\t\t},\n\t\td100: function() {\n\t\t\treturn this.natural(1, 100)\n\t\t},\n\t\t/*\n\t\t 随机生成一个 GUID。\n\n\t\t http://www.broofa.com/2008/09/javascript-uuid-function/\n\t\t [UUID 规范](http://www.ietf.org/rfc/rfc4122.txt)\n\t\t UUIDs (Universally Unique IDentifier)\n\t\t GUIDs (Globally Unique IDentifier)\n\t\t The formal definition of the UUID string representation is provided by the following ABNF [7]:\n\t\t UUID = time-low \"-\" time-mid \"-\"\n\t\t time-high-and-version \"-\"\n\t\t clock-seq-and-reserved\n\t\t clock-seq-low \"-\" node\n\t\t time-low = 4hexOctet\n\t\t time-mid = 2hexOctet\n\t\t time-high-and-version = 2hexOctet\n\t\t clock-seq-and-reserved = hexOctet\n\t\t clock-seq-low = hexOctet\n\t\t node = 6hexOctet\n\t\t hexOctet = hexDigit hexDigit\n\t\t hexDigit =\n\t\t \"0\" / \"1\" / \"2\" / \"3\" / \"4\" / \"5\" / \"6\" / \"7\" / \"8\" / \"9\" /\n\t\t \"a\" / \"b\" / \"c\" / \"d\" / \"e\" / \"f\" /\n\t\t \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n\t\t \n\t\t https://github.com/victorquinn/chancejs/blob/develop/chance.js#L1349\n\t\t*/\n\t\tguid: function() {\n\t\t\tvar pool = \"abcdefABCDEF1234567890\",\n\t\t\t\tguid = this.string(pool, 8) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 12);\n\t\t\treturn guid\n\t\t},\n\t\tuuid: function() {\n\t\t\treturn this.guid()\n\t\t},\n\t\t/*\n\t\t 随机生成一个 18 位身份证。\n\n\t\t [身份证](http://baike.baidu.com/view/1697.htm#4)\n\t\t 地址码 6 + 出生日期码 8 + 顺序码 3 + 校验码 1\n\t\t [《中华人民共和国行政区划代码》国家标准(GB/T2260)](http://zhidao.baidu.com/question/1954561.html)\n\t\t*/\n\t\tid: function() {\n\t\t\tvar id,\n\t\t\t\tsum = 0,\n\t\t\t\trank = [\n\t\t\t\t\t\"7\", \"9\", \"10\", \"5\", \"8\", \"4\", \"2\", \"1\", \"6\", \"3\", \"7\", \"9\", \"10\", \"5\", \"8\", \"4\", \"2\"\n\t\t\t\t],\n\t\t\t\tlast = [\n\t\t\t\t\t\"1\", \"0\", \"X\", \"9\", \"8\", \"7\", \"6\", \"5\", \"4\", \"3\", \"2\"\n\t\t\t\t]\n\n\t\t\tid = this.pick(DICT).id +\n\t\t\t\tthis.date('yyyyMMdd') +\n\t\t\t\tthis.string('number', 3)\n\n\t\t\tfor (var i = 0; i < id.length; i++) {\n\t\t\t\tsum += id[i] * rank[i];\n\t\t\t}\n\t\t\tid += last[sum % 11];\n\n\t\t\treturn id\n\t\t},\n\n\t\t/*\n\t\t 生成一个全局的自增整数。\n\t\t 类似自增主键(auto increment primary key)。\n\t\t*/\n\t\tincrement: function() {\n\t\t\tvar key = 0\n\t\t\treturn function(step) {\n\t\t\t\treturn key += (+step || 1) // step?\n\t\t\t}\n\t\t}(),\n\t\tinc: function(step) {\n\t\t\treturn this.increment(step)\n\t\t}\n\t}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Parser = __webpack_require__(21)\n\tvar Handler = __webpack_require__(22)\n\tmodule.exports = {\n\t\tParser: Parser,\n\t\tHandler: Handler\n\t}\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\n\t// https://github.com/nuysoft/regexp\n\t// forked from https://github.com/ForbesLindesay/regexp\n\n\tfunction parse(n) {\n\t if (\"string\" != typeof n) {\n\t var l = new TypeError(\"The regexp to parse must be represented as a string.\");\n\t throw l;\n\t }\n\t return index = 1, cgs = {}, parser.parse(n);\n\t}\n\n\tfunction Token(n) {\n\t this.type = n, this.offset = Token.offset(), this.text = Token.text();\n\t}\n\n\tfunction Alternate(n, l) {\n\t Token.call(this, \"alternate\"), this.left = n, this.right = l;\n\t}\n\n\tfunction Match(n) {\n\t Token.call(this, \"match\"), this.body = n.filter(Boolean);\n\t}\n\n\tfunction Group(n, l) {\n\t Token.call(this, n), this.body = l;\n\t}\n\n\tfunction CaptureGroup(n) {\n\t Group.call(this, \"capture-group\"), this.index = cgs[this.offset] || (cgs[this.offset] = index++), \n\t this.body = n;\n\t}\n\n\tfunction Quantified(n, l) {\n\t Token.call(this, \"quantified\"), this.body = n, this.quantifier = l;\n\t}\n\n\tfunction Quantifier(n, l) {\n\t Token.call(this, \"quantifier\"), this.min = n, this.max = l, this.greedy = !0;\n\t}\n\n\tfunction CharSet(n, l) {\n\t Token.call(this, \"charset\"), this.invert = n, this.body = l;\n\t}\n\n\tfunction CharacterRange(n, l) {\n\t Token.call(this, \"range\"), this.start = n, this.end = l;\n\t}\n\n\tfunction Literal(n) {\n\t Token.call(this, \"literal\"), this.body = n, this.escaped = this.body != this.text;\n\t}\n\n\tfunction Unicode(n) {\n\t Token.call(this, \"unicode\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction Hex(n) {\n\t Token.call(this, \"hex\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction Octal(n) {\n\t Token.call(this, \"octal\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction BackReference(n) {\n\t Token.call(this, \"back-reference\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction ControlCharacter(n) {\n\t Token.call(this, \"control-character\"), this.code = n.toUpperCase();\n\t}\n\n\tvar parser = function() {\n\t function n(n, l) {\n\t function u() {\n\t this.constructor = n;\n\t }\n\t u.prototype = l.prototype, n.prototype = new u();\n\t }\n\t function l(n, l, u, t, r) {\n\t function e(n, l) {\n\t function u(n) {\n\t function l(n) {\n\t return n.charCodeAt(0).toString(16).toUpperCase();\n\t }\n\t return n.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\x08/g, \"\\\\b\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\f/g, \"\\\\f\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(n) {\n\t return \"\\\\x0\" + l(n);\n\t }).replace(/[\\x10-\\x1F\\x80-\\xFF]/g, function(n) {\n\t return \"\\\\x\" + l(n);\n\t }).replace(/[\\u0180-\\u0FFF]/g, function(n) {\n\t return \"\\\\u0\" + l(n);\n\t }).replace(/[\\u1080-\\uFFFF]/g, function(n) {\n\t return \"\\\\u\" + l(n);\n\t });\n\t }\n\t var t, r;\n\t switch (n.length) {\n\t case 0:\n\t t = \"end of input\";\n\t break;\n\n\t case 1:\n\t t = n[0];\n\t break;\n\n\t default:\n\t t = n.slice(0, -1).join(\", \") + \" or \" + n[n.length - 1];\n\t }\n\t return r = l ? '\"' + u(l) + '\"' : \"end of input\", \"Expected \" + t + \" but \" + r + \" found.\";\n\t }\n\t this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r, \n\t this.name = \"SyntaxError\", this.message = e(n, l);\n\t }\n\t function u(n) {\n\t function u() {\n\t return n.substring(Lt, qt);\n\t }\n\t function t() {\n\t return Lt;\n\t }\n\t function r(l) {\n\t function u(l, u, t) {\n\t var r, e;\n\t for (r = u; t > r; r++) e = n.charAt(r), \"\\n\" === e ? (l.seenCR || l.line++, l.column = 1, \n\t l.seenCR = !1) : \"\\r\" === e || \"\\u2028\" === e || \"\\u2029\" === e ? (l.line++, l.column = 1, \n\t l.seenCR = !0) : (l.column++, l.seenCR = !1);\n\t }\n\t return Mt !== l && (Mt > l && (Mt = 0, Dt = {\n\t line: 1,\n\t column: 1,\n\t seenCR: !1\n\t }), u(Dt, Mt, l), Mt = l), Dt;\n\t }\n\t function e(n) {\n\t Ht > qt || (qt > Ht && (Ht = qt, Ot = []), Ot.push(n));\n\t }\n\t function o(n) {\n\t var l = 0;\n\t for (n.sort(); l < n.length; ) n[l - 1] === n[l] ? n.splice(l, 1) : l++;\n\t }\n\t function c() {\n\t var l, u, t, r, o;\n\t return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl, \n\t qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ], \n\t t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l, \n\t u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l, \n\t l = il), l;\n\t }\n\t function i() {\n\t var n, l, u, t, r;\n\t if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(), \n\t Wt--, null === t ? u = al : (qt = u, u = il), null !== u) {\n\t for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(), \n\t null === r && (r = a());\n\t null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r), \n\t null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il);\n\t } else qt = n, n = il; else qt = n, n = il;\n\t return n;\n\t }\n\t function a() {\n\t var n;\n\t return n = x(), null === n && (n = Q(), null === n && (n = B())), n;\n\t }\n\t function f() {\n\t var l, u;\n\t return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)), \n\t null !== u && (Lt = l, u = wl()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function s() {\n\t var l, u;\n\t return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)), \n\t null !== u && (Lt = l, u = gl()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function h() {\n\t var n, l, u;\n\t return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u), \n\t null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il), n;\n\t }\n\t function d() {\n\t var n, l, u;\n\t return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n, \n\t l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, \n\t n = il), Wt--, null === n && (l = null, 0 === Wt && e(kl)), n;\n\t }\n\t function p() {\n\t var n;\n\t return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(), \n\t null === n && (n = g(), null === n && (n = b()))))), n;\n\t }\n\t function v() {\n\t var l, u, t, r, o, c;\n\t return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null, \n\t 0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl, \n\t qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l, \n\t l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function w() {\n\t var l, u, t, r;\n\t return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null, \n\t 0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t }\n\t function A() {\n\t var l, u, t, r;\n\t return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null, \n\t 0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t }\n\t function C() {\n\t var l, u;\n\t return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)), \n\t null !== u && (Lt = l, u = ql()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function g() {\n\t var l, u;\n\t return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)), \n\t null !== u && (Lt = l, u = Dl()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function b() {\n\t var l, u;\n\t return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)), \n\t null !== u && (Lt = l, u = Wl()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function k() {\n\t var l;\n\t return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)), \n\t l;\n\t }\n\t function T() {\n\t var l, u, t;\n\t if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, \n\t 0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt), \n\t qt++) : (t = null, 0 === Wt && e(Il)); else u = il;\n\t return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u, \n\t l;\n\t }\n\t function x() {\n\t var l, u, t, r;\n\t return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)), \n\t null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))), \n\t null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)), \n\t null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t }\n\t function y() {\n\t var n, l;\n\t return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n, \n\t n = l) : n = l, n;\n\t }\n\t function m() {\n\t var l, u, t;\n\t return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)), \n\t null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function R() {\n\t var l, u, t;\n\t return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)), \n\t null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function F() {\n\t var l, u, t;\n\t return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)), \n\t null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function Q() {\n\t var l, u, t, r, o;\n\t if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)), \n\t null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)), \n\t null === t && (t = al), null !== t) {\n\t for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(), \n\t null === o && (o = U());\n\t null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)), \n\t null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il);\n\t } else qt = l, l = il; else qt = l, l = il;\n\t return Wt--, null === l && (u = null, 0 === Wt && e(cu)), l;\n\t }\n\t function S() {\n\t var l, u, t, r;\n\t return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null, \n\t 0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l, \n\t l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--, \n\t null === l && (u = null, 0 === Wt && e(du)), l;\n\t }\n\t function U() {\n\t var n, l;\n\t return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)), \n\t n;\n\t }\n\t function E() {\n\t var l, u;\n\t return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)), \n\t null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function G() {\n\t var n;\n\t return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(), \n\t null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(), \n\t null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(), \n\t null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(), \n\t null === n && (n = ul(), null === n && (n = tl()))))))))))))))))), n;\n\t }\n\t function B() {\n\t var n;\n\t return n = j(), null === n && (n = q(), null === n && (n = $())), n;\n\t }\n\t function j() {\n\t var l, u;\n\t return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)), \n\t null !== u && (Lt = l, u = xu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function $() {\n\t var l, u;\n\t return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, \n\t 0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, \n\t Wt--, null === l && (u = null, 0 === Wt && e(yu)), l;\n\t }\n\t function q() {\n\t var n;\n\t return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(), \n\t null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), \n\t null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), \n\t null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(), \n\t null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))), \n\t n;\n\t }\n\t function L() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), \n\t null !== u && (Lt = l, u = Su()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function M() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), \n\t null !== u && (Lt = l, u = Uu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function D() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)), \n\t null !== u && (Lt = l, u = Bu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function H() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)), \n\t null !== u && (Lt = l, u = qu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function O() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)), \n\t null !== u && (Lt = l, u = Du()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function W() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)), \n\t null !== u && (Lt = l, u = Wu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function z() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)), \n\t null !== u && (Lt = l, u = Ju()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function I() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)), \n\t null !== u && (Lt = l, u = Pu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function J() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)), \n\t null !== u && (Lt = l, u = Yu()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function K() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)), \n\t null !== u && (Lt = l, u = nt()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function N() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)), \n\t null !== u && (Lt = l, u = tt()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function P() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)), \n\t null !== u && (Lt = l, u = ot()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function V() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)), \n\t null !== u && (Lt = l, u = at()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function X() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)), \n\t null !== u && (Lt = l, u = ht()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function Y() {\n\t var l, u, t;\n\t return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)), \n\t null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), \n\t null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function Z() {\n\t var l, u, t;\n\t return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), \n\t null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)), \n\t null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t function _() {\n\t var l, u, t, r;\n\t if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), \n\t null !== u) {\n\t if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)), \n\t null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t qt++) : (r = null, 0 === Wt && e(mt)); else t = il;\n\t null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il);\n\t } else qt = l, l = il;\n\t return l;\n\t }\n\t function nl() {\n\t var l, u, t, r;\n\t if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)), \n\t null !== u) {\n\t if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), \n\t null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;\n\t null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il);\n\t } else qt = l, l = il;\n\t return l;\n\t }\n\t function ll() {\n\t var l, u, t, r;\n\t if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)), \n\t null !== u) {\n\t if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), \n\t null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;\n\t null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il);\n\t } else qt = l, l = il;\n\t return l;\n\t }\n\t function ul() {\n\t var l, u;\n\t return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), \n\t null !== u && (Lt = l, u = $t()), null === u ? (qt = l, l = u) : l = u, l;\n\t }\n\t function tl() {\n\t var l, u, t;\n\t return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), \n\t null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), \n\t null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t l = il)) : (qt = l, l = il), l;\n\t }\n\t var rl, el = arguments.length > 1 ? arguments[1] : {}, ol = {\n\t regexp: c\n\t }, cl = c, il = null, al = \"\", fl = \"|\", sl = '\"|\"', hl = function(n, l) {\n\t return l ? new Alternate(n, l[1]) : n;\n\t }, dl = function(n, l, u) {\n\t return new Match([ n ].concat(l).concat([ u ]));\n\t }, pl = \"^\", vl = '\"^\"', wl = function() {\n\t return new Token(\"start\");\n\t }, Al = \"$\", Cl = '\"$\"', gl = function() {\n\t return new Token(\"end\");\n\t }, bl = function(n, l) {\n\t return new Quantified(n, l);\n\t }, kl = \"Quantifier\", Tl = function(n, l) {\n\t return l && (n.greedy = !1), n;\n\t }, xl = \"{\", yl = '\"{\"', ml = \",\", Rl = '\",\"', Fl = \"}\", Ql = '\"}\"', Sl = function(n, l) {\n\t return new Quantifier(n, l);\n\t }, Ul = \",}\", El = '\",}\"', Gl = function(n) {\n\t return new Quantifier(n, 1/0);\n\t }, Bl = function(n) {\n\t return new Quantifier(n, n);\n\t }, jl = \"+\", $l = '\"+\"', ql = function() {\n\t return new Quantifier(1, 1/0);\n\t }, Ll = \"*\", Ml = '\"*\"', Dl = function() {\n\t return new Quantifier(0, 1/0);\n\t }, Hl = \"?\", Ol = '\"?\"', Wl = function() {\n\t return new Quantifier(0, 1);\n\t }, zl = /^[0-9]/, Il = \"[0-9]\", Jl = function(n) {\n\t return +n.join(\"\");\n\t }, Kl = \"(\", Nl = '\"(\"', Pl = \")\", Vl = '\")\"', Xl = function(n) {\n\t return n;\n\t }, Yl = function(n) {\n\t return new CaptureGroup(n);\n\t }, Zl = \"?:\", _l = '\"?:\"', nu = function(n) {\n\t return new Group(\"non-capture-group\", n);\n\t }, lu = \"?=\", uu = '\"?=\"', tu = function(n) {\n\t return new Group(\"positive-lookahead\", n);\n\t }, ru = \"?!\", eu = '\"?!\"', ou = function(n) {\n\t return new Group(\"negative-lookahead\", n);\n\t }, cu = \"CharacterSet\", iu = \"[\", au = '\"[\"', fu = \"]\", su = '\"]\"', hu = function(n, l) {\n\t return new CharSet(!!n, l);\n\t }, du = \"CharacterRange\", pu = \"-\", vu = '\"-\"', wu = function(n, l) {\n\t return new CharacterRange(n, l);\n\t }, Au = \"Character\", Cu = /^[^\\\\\\]]/, gu = \"[^\\\\\\\\\\\\]]\", bu = function(n) {\n\t return new Literal(n);\n\t }, ku = \".\", Tu = '\".\"', xu = function() {\n\t return new Token(\"any-character\");\n\t }, yu = \"Literal\", mu = /^[^|\\\\\\/.[()?+*$\\^]/, Ru = \"[^|\\\\\\\\\\\\/.[()?+*$\\\\^]\", Fu = \"\\\\b\", Qu = '\"\\\\\\\\b\"', Su = function() {\n\t return new Token(\"backspace\");\n\t }, Uu = function() {\n\t return new Token(\"word-boundary\");\n\t }, Eu = \"\\\\B\", Gu = '\"\\\\\\\\B\"', Bu = function() {\n\t return new Token(\"non-word-boundary\");\n\t }, ju = \"\\\\d\", $u = '\"\\\\\\\\d\"', qu = function() {\n\t return new Token(\"digit\");\n\t }, Lu = \"\\\\D\", Mu = '\"\\\\\\\\D\"', Du = function() {\n\t return new Token(\"non-digit\");\n\t }, Hu = \"\\\\f\", Ou = '\"\\\\\\\\f\"', Wu = function() {\n\t return new Token(\"form-feed\");\n\t }, zu = \"\\\\n\", Iu = '\"\\\\\\\\n\"', Ju = function() {\n\t return new Token(\"line-feed\");\n\t }, Ku = \"\\\\r\", Nu = '\"\\\\\\\\r\"', Pu = function() {\n\t return new Token(\"carriage-return\");\n\t }, Vu = \"\\\\s\", Xu = '\"\\\\\\\\s\"', Yu = function() {\n\t return new Token(\"white-space\");\n\t }, Zu = \"\\\\S\", _u = '\"\\\\\\\\S\"', nt = function() {\n\t return new Token(\"non-white-space\");\n\t }, lt = \"\\\\t\", ut = '\"\\\\\\\\t\"', tt = function() {\n\t return new Token(\"tab\");\n\t }, rt = \"\\\\v\", et = '\"\\\\\\\\v\"', ot = function() {\n\t return new Token(\"vertical-tab\");\n\t }, ct = \"\\\\w\", it = '\"\\\\\\\\w\"', at = function() {\n\t return new Token(\"word\");\n\t }, ft = \"\\\\W\", st = '\"\\\\\\\\W\"', ht = function() {\n\t return new Token(\"non-word\");\n\t }, dt = \"\\\\c\", pt = '\"\\\\\\\\c\"', vt = \"any character\", wt = function(n) {\n\t return new ControlCharacter(n);\n\t }, At = \"\\\\\", Ct = '\"\\\\\\\\\"', gt = /^[1-9]/, bt = \"[1-9]\", kt = function(n) {\n\t return new BackReference(n);\n\t }, Tt = \"\\\\0\", xt = '\"\\\\\\\\0\"', yt = /^[0-7]/, mt = \"[0-7]\", Rt = function(n) {\n\t return new Octal(n.join(\"\"));\n\t }, Ft = \"\\\\x\", Qt = '\"\\\\\\\\x\"', St = /^[0-9a-fA-F]/, Ut = \"[0-9a-fA-F]\", Et = function(n) {\n\t return new Hex(n.join(\"\"));\n\t }, Gt = \"\\\\u\", Bt = '\"\\\\\\\\u\"', jt = function(n) {\n\t return new Unicode(n.join(\"\"));\n\t }, $t = function() {\n\t return new Token(\"null-character\");\n\t }, qt = 0, Lt = 0, Mt = 0, Dt = {\n\t line: 1,\n\t column: 1,\n\t seenCR: !1\n\t }, Ht = 0, Ot = [], Wt = 0;\n\t if (\"startRule\" in el) {\n\t if (!(el.startRule in ol)) throw new Error(\"Can't start parsing from rule \\\"\" + el.startRule + '\".');\n\t cl = ol[el.startRule];\n\t }\n\t if (Token.offset = t, Token.text = u, rl = cl(), null !== rl && qt === n.length) return rl;\n\t throw o(Ot), Lt = Math.max(qt, Ht), new l(Ot, Lt < n.length ? n.charAt(Lt) : null, Lt, r(Lt).line, r(Lt).column);\n\t }\n\t return n(l, Error), {\n\t SyntaxError: l,\n\t parse: u\n\t };\n\t}(), index = 1, cgs = {};\n\n\tmodule.exports = parser\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## RegExp Handler\n\n\t https://github.com/ForbesLindesay/regexp\n\t https://github.com/dmajda/pegjs\n\t http://www.regexper.com/\n\n\t 每个节点的结构\n\t {\n\t type: '',\n\t offset: number,\n\t text: '',\n\t body: {},\n\t escaped: true/false\n\t }\n\n\t type 可选值\n\t alternate | 选择\n\t match 匹配\n\t capture-group () 捕获组\n\t non-capture-group (?:...) 非捕获组\n\t positive-lookahead (?=p) 零宽正向先行断言\n\t negative-lookahead (?!p) 零宽负向先行断言\n\t quantified a* 重复节点\n\t quantifier * 量词\n\t charset [] 字符集\n\t range {m, n} 范围\n\t literal a 直接量字符\n\t unicode \\uxxxx Unicode\n\t hex \\x 十六进制\n\t octal 八进制\n\t back-reference \\n 反向引用\n\t control-character \\cX 控制字符\n\n\t // Token\n\t start ^ 开头\n\t end $ 结尾\n\t any-character . 任意字符\n\t backspace [\\b] 退格直接量\n\t word-boundary \\b 单词边界\n\t non-word-boundary \\B 非单词边界\n\t digit \\d ASCII 数字,[0-9]\n\t non-digit \\D 非 ASCII 数字,[^0-9]\n\t form-feed \\f 换页符\n\t line-feed \\n 换行符\n\t carriage-return \\r 回车符\n\t white-space \\s 空白符\n\t non-white-space \\S 非空白符\n\t tab \\t 制表符\n\t vertical-tab \\v 垂直制表符\n\t word \\w ASCII 字符,[a-zA-Z0-9]\n\t non-word \\W 非 ASCII 字符,[^a-zA-Z0-9]\n\t null-character \\o NUL 字符\n\t */\n\n\tvar Util = __webpack_require__(3)\n\tvar Random = __webpack_require__(5)\n\t /*\n\t \n\t */\n\tvar Handler = {\n\t extend: Util.extend\n\t}\n\n\t// http://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart\n\t/*var ASCII_CONTROL_CODE_CHART = {\n\t '@': ['\\u0000'],\n\t A: ['\\u0001'],\n\t B: ['\\u0002'],\n\t C: ['\\u0003'],\n\t D: ['\\u0004'],\n\t E: ['\\u0005'],\n\t F: ['\\u0006'],\n\t G: ['\\u0007', '\\a'],\n\t H: ['\\u0008', '\\b'],\n\t I: ['\\u0009', '\\t'],\n\t J: ['\\u000A', '\\n'],\n\t K: ['\\u000B', '\\v'],\n\t L: ['\\u000C', '\\f'],\n\t M: ['\\u000D', '\\r'],\n\t N: ['\\u000E'],\n\t O: ['\\u000F'],\n\t P: ['\\u0010'],\n\t Q: ['\\u0011'],\n\t R: ['\\u0012'],\n\t S: ['\\u0013'],\n\t T: ['\\u0014'],\n\t U: ['\\u0015'],\n\t V: ['\\u0016'],\n\t W: ['\\u0017'],\n\t X: ['\\u0018'],\n\t Y: ['\\u0019'],\n\t Z: ['\\u001A'],\n\t '[': ['\\u001B', '\\e'],\n\t '\\\\': ['\\u001C'],\n\t ']': ['\\u001D'],\n\t '^': ['\\u001E'],\n\t '_': ['\\u001F']\n\t}*/\n\n\t// ASCII printable code chart\n\t// var LOWER = 'abcdefghijklmnopqrstuvwxyz'\n\t// var UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\t// var NUMBER = '0123456789'\n\t// var SYMBOL = ' !\"#$%&\\'()*+,-./' + ':;<=>?@' + '[\\\\]^_`' + '{|}~'\n\tvar LOWER = ascii(97, 122)\n\tvar UPPER = ascii(65, 90)\n\tvar NUMBER = ascii(48, 57)\n\tvar OTHER = ascii(32, 47) + ascii(58, 64) + ascii(91, 96) + ascii(123, 126) // 排除 95 _ ascii(91, 94) + ascii(96, 96)\n\tvar PRINTABLE = ascii(32, 126)\n\tvar SPACE = ' \\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029'\n\tvar CHARACTER_CLASSES = {\n\t '\\\\w': LOWER + UPPER + NUMBER + '_', // ascii(95, 95)\n\t '\\\\W': OTHER.replace('_', ''),\n\t '\\\\s': SPACE,\n\t '\\\\S': function() {\n\t var result = PRINTABLE\n\t for (var i = 0; i < SPACE.length; i++) {\n\t result = result.replace(SPACE[i], '')\n\t }\n\t return result\n\t }(),\n\t '\\\\d': NUMBER,\n\t '\\\\D': LOWER + UPPER + OTHER\n\t}\n\n\tfunction ascii(from, to) {\n\t var result = ''\n\t for (var i = from; i <= to; i++) {\n\t result += String.fromCharCode(i)\n\t }\n\t return result\n\t}\n\n\t// var ast = RegExpParser.parse(regexp.source)\n\tHandler.gen = function(node, result, cache) {\n\t cache = cache || {\n\t guid: 1\n\t }\n\t return Handler[node.type] ? Handler[node.type](node, result, cache) :\n\t Handler.token(node, result, cache)\n\t}\n\n\tHandler.extend({\n\t /* jshint unused:false */\n\t token: function(node, result, cache) {\n\t switch (node.type) {\n\t case 'start':\n\t case 'end':\n\t return ''\n\t case 'any-character':\n\t return Random.character()\n\t case 'backspace':\n\t return ''\n\t case 'word-boundary': // TODO\n\t return ''\n\t case 'non-word-boundary': // TODO\n\t break\n\t case 'digit':\n\t return Random.pick(\n\t NUMBER.split('')\n\t )\n\t case 'non-digit':\n\t return Random.pick(\n\t (LOWER + UPPER + OTHER).split('')\n\t )\n\t case 'form-feed':\n\t break\n\t case 'line-feed':\n\t return node.body || node.text\n\t case 'carriage-return':\n\t break\n\t case 'white-space':\n\t return Random.pick(\n\t SPACE.split('')\n\t )\n\t case 'non-white-space':\n\t return Random.pick(\n\t (LOWER + UPPER + NUMBER).split('')\n\t )\n\t case 'tab':\n\t break\n\t case 'vertical-tab':\n\t break\n\t case 'word': // \\w [a-zA-Z0-9]\n\t return Random.pick(\n\t (LOWER + UPPER + NUMBER).split('')\n\t )\n\t case 'non-word': // \\W [^a-zA-Z0-9]\n\t return Random.pick(\n\t OTHER.replace('_', '').split('')\n\t )\n\t case 'null-character':\n\t break\n\t }\n\t return node.body || node.text\n\t },\n\t /*\n\t {\n\t type: 'alternate',\n\t offset: 0,\n\t text: '',\n\t left: {\n\t boyd: []\n\t },\n\t right: {\n\t boyd: []\n\t }\n\t }\n\t */\n\t alternate: function(node, result, cache) {\n\t // node.left/right {}\n\t return this.gen(\n\t Random.boolean() ? node.left : node.right,\n\t result,\n\t cache\n\t )\n\t },\n\t /*\n\t {\n\t type: 'match',\n\t offset: 0,\n\t text: '',\n\t body: []\n\t }\n\t */\n\t match: function(node, result, cache) {\n\t result = ''\n\t // node.body []\n\t for (var i = 0; i < node.body.length; i++) {\n\t result += this.gen(node.body[i], result, cache)\n\t }\n\t return result\n\t },\n\t // ()\n\t 'capture-group': function(node, result, cache) {\n\t // node.body {}\n\t result = this.gen(node.body, result, cache)\n\t cache[cache.guid++] = result\n\t return result\n\t },\n\t // (?:...)\n\t 'non-capture-group': function(node, result, cache) {\n\t // node.body {}\n\t return this.gen(node.body, result, cache)\n\t },\n\t // (?=p)\n\t 'positive-lookahead': function(node, result, cache) {\n\t // node.body\n\t return this.gen(node.body, result, cache)\n\t },\n\t // (?!p)\n\t 'negative-lookahead': function(node, result, cache) {\n\t // node.body\n\t return ''\n\t },\n\t /*\n\t {\n\t type: 'quantified',\n\t offset: 3,\n\t text: 'c*',\n\t body: {\n\t type: 'literal',\n\t offset: 3,\n\t text: 'c',\n\t body: 'c',\n\t escaped: false\n\t },\n\t quantifier: {\n\t type: 'quantifier',\n\t offset: 4,\n\t text: '*',\n\t min: 0,\n\t max: Infinity,\n\t greedy: true\n\t }\n\t }\n\t */\n\t quantified: function(node, result, cache) {\n\t result = ''\n\t // node.quantifier {}\n\t var count = this.quantifier(node.quantifier);\n\t // node.body {}\n\t for (var i = 0; i < count; i++) {\n\t result += this.gen(node.body, result, cache)\n\t }\n\t return result\n\t },\n\t /*\n\t quantifier: {\n\t type: 'quantifier',\n\t offset: 4,\n\t text: '*',\n\t min: 0,\n\t max: Infinity,\n\t greedy: true\n\t }\n\t */\n\t quantifier: function(node, result, cache) {\n\t var min = Math.max(node.min, 0)\n\t var max = isFinite(node.max) ? node.max :\n\t min + Random.integer(3, 7)\n\t return Random.integer(min, max)\n\t },\n\t /*\n\t \n\t */\n\t charset: function(node, result, cache) {\n\t // node.invert\n\t if (node.invert) return this['invert-charset'](node, result, cache)\n\n\t // node.body []\n\t var literal = Random.pick(node.body)\n\t return this.gen(literal, result, cache)\n\t },\n\t 'invert-charset': function(node, result, cache) {\n\t var pool = PRINTABLE\n\t for (var i = 0, item; i < node.body.length; i++) {\n\t item = node.body[i]\n\t switch (item.type) {\n\t case 'literal':\n\t pool = pool.replace(item.body, '')\n\t break\n\t case 'range':\n\t var min = this.gen(item.start, result, cache).charCodeAt()\n\t var max = this.gen(item.end, result, cache).charCodeAt()\n\t for (var ii = min; ii <= max; ii++) {\n\t pool = pool.replace(String.fromCharCode(ii), '')\n\t }\n\t /* falls through */\n\t default:\n\t var characters = CHARACTER_CLASSES[item.text]\n\t if (characters) {\n\t for (var iii = 0; iii <= characters.length; iii++) {\n\t pool = pool.replace(characters[iii], '')\n\t }\n\t }\n\t }\n\t }\n\t return Random.pick(pool.split(''))\n\t },\n\t range: function(node, result, cache) {\n\t // node.start, node.end\n\t var min = this.gen(node.start, result, cache).charCodeAt()\n\t var max = this.gen(node.end, result, cache).charCodeAt()\n\t return String.fromCharCode(\n\t Random.integer(min, max)\n\t )\n\t },\n\t literal: function(node, result, cache) {\n\t return node.escaped ? node.body : node.text\n\t },\n\t // Unicode \\u\n\t unicode: function(node, result, cache) {\n\t return String.fromCharCode(\n\t parseInt(node.code, 16)\n\t )\n\t },\n\t // 十六进制 \\xFF\n\t hex: function(node, result, cache) {\n\t return String.fromCharCode(\n\t parseInt(node.code, 16)\n\t )\n\t },\n\t // 八进制 \\0\n\t octal: function(node, result, cache) {\n\t return String.fromCharCode(\n\t parseInt(node.code, 8)\n\t )\n\t },\n\t // 反向引用\n\t 'back-reference': function(node, result, cache) {\n\t return cache[node.code] || ''\n\t },\n\t /*\n\t http://en.wikipedia.org/wiki/C0_and_C1_control_codes\n\t */\n\t CONTROL_CHARACTER_MAP: function() {\n\t var CONTROL_CHARACTER = '@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\\\ ] ^ _'.split(' ')\n\t var CONTROL_CHARACTER_UNICODE = '\\u0000 \\u0001 \\u0002 \\u0003 \\u0004 \\u0005 \\u0006 \\u0007 \\u0008 \\u0009 \\u000A \\u000B \\u000C \\u000D \\u000E \\u000F \\u0010 \\u0011 \\u0012 \\u0013 \\u0014 \\u0015 \\u0016 \\u0017 \\u0018 \\u0019 \\u001A \\u001B \\u001C \\u001D \\u001E \\u001F'.split(' ')\n\t var map = {}\n\t for (var i = 0; i < CONTROL_CHARACTER.length; i++) {\n\t map[CONTROL_CHARACTER[i]] = CONTROL_CHARACTER_UNICODE[i]\n\t }\n\t return map\n\t }(),\n\t 'control-character': function(node, result, cache) {\n\t return this.CONTROL_CHARACTER_MAP[node.code]\n\t }\n\t})\n\n\tmodule.exports = Handler\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(24)\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## toJSONSchema\n\n\t 把 Mock.js 风格的数据模板转换成 JSON Schema。\n\n\t > [JSON Schema](http://json-schema.org/)\n\t */\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar Parser = __webpack_require__(4)\n\n\tfunction toJSONSchema(template, name, path /* Internal Use Only */ ) {\n\t // type rule properties items\n\t path = path || []\n\t var result = {\n\t name: typeof name === 'string' ? name.replace(Constant.RE_KEY, '$1') : name,\n\t template: template,\n\t type: Util.type(template), // 可能不准确,例如 { 'name|1': [{}, {} ...] }\n\t rule: Parser.parse(name)\n\t }\n\t result.path = path.slice(0)\n\t result.path.push(name === undefined ? 'ROOT' : result.name)\n\n\t switch (result.type) {\n\t case 'array':\n\t result.items = []\n\t Util.each(template, function(value, index) {\n\t result.items.push(\n\t toJSONSchema(value, index, result.path)\n\t )\n\t })\n\t break\n\t case 'object':\n\t result.properties = []\n\t Util.each(template, function(value, name) {\n\t result.properties.push(\n\t toJSONSchema(value, name, result.path)\n\t )\n\t })\n\t break\n\t }\n\n\t return result\n\n\t}\n\n\tmodule.exports = toJSONSchema\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(26)\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t ## valid(template, data)\n\n\t 校验真实数据 data 是否与数据模板 template 匹配。\n\t \n\t 实现思路:\n\t 1. 解析规则。\n\t 先把数据模板 template 解析为更方便机器解析的 JSON-Schame\n\t name 属性名 \n\t type 属性值类型\n\t template 属性值模板\n\t properties 对象属性数组\n\t items 数组元素数组\n\t rule 属性值生成规则\n\t 2. 递归验证规则。\n\t 然后用 JSON-Schema 校验真实数据,校验项包括属性名、值类型、值、值生成规则。\n\n\t 提示信息 \n\t https://github.com/fge/json-schema-validator/blob/master/src/main/resources/com/github/fge/jsonschema/validator/validation.properties\n\t [JSON-Schama validator](http://json-schema-validator.herokuapp.com/)\n\t [Regexp Demo](http://demos.forbeslindesay.co.uk/regexp/)\n\t*/\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar toJSONSchema = __webpack_require__(23)\n\n\tfunction valid(template, data) {\n\t var schema = toJSONSchema(template)\n\t var result = Diff.diff(schema, data)\n\t for (var i = 0; i < result.length; i++) {\n\t // console.log(template, data)\n\t // console.warn(Assert.message(result[i]))\n\t }\n\t return result\n\t}\n\n\t/*\n\t ## name\n\t 有生成规则:比较解析后的 name\n\t 无生成规则:直接比较\n\t ## type\n\t 无类型转换:直接比较\n\t 有类型转换:先试着解析 template,然后再检查?\n\t ## value vs. template\n\t 基本类型\n\t 无生成规则:直接比较\n\t 有生成规则:\n\t number\n\t min-max.dmin-dmax\n\t min-max.dcount\n\t count.dmin-dmax\n\t count.dcount\n\t +step\n\t 整数部分\n\t 小数部分\n\t boolean \n\t string \n\t min-max\n\t count\n\t ## properties\n\t 对象\n\t 有生成规则:检测期望的属性个数,继续递归\n\t 无生成规则:检测全部的属性个数,继续递归\n\t ## items\n\t 数组\n\t 有生成规则:\n\t `'name|1': [{}, {} ...]` 其中之一,继续递归\n\t `'name|+1': [{}, {} ...]` 顺序检测,继续递归\n\t `'name|min-max': [{}, {} ...]` 检测个数,继续递归\n\t `'name|count': [{}, {} ...]` 检测个数,继续递归\n\t 无生成规则:检测全部的元素个数,继续递归\n\t*/\n\tvar Diff = {\n\t diff: function diff(schema, data, name /* Internal Use Only */ ) {\n\t var result = []\n\n\t // 先检测名称 name 和类型 type,如果匹配,才有必要继续检测\n\t if (\n\t this.name(schema, data, name, result) &&\n\t this.type(schema, data, name, result)\n\t ) {\n\t this.value(schema, data, name, result)\n\t this.properties(schema, data, name, result)\n\t this.items(schema, data, name, result)\n\t }\n\n\t return result\n\t },\n\t /* jshint unused:false */\n\t name: function(schema, data, name, result) {\n\t var length = result.length\n\n\t Assert.equal('name', schema.path, name + '', schema.name + '', result)\n\n\t return result.length === length\n\t },\n\t type: function(schema, data, name, result) {\n\t var length = result.length\n\n\t switch (schema.type) {\n\t case 'string':\n\t // 跳过含有『占位符』的属性值,因为『占位符』返回值的类型可能和模板不一致,例如 '@int' 会返回一个整形值\n\t if (schema.template.match(Constant.RE_PLACEHOLDER)) return true\n\t break\n\t case 'array':\n\t if (schema.rule.parameters) {\n\t // name|count: array\n\t if (schema.rule.min !== undefined && schema.rule.max === undefined) {\n\t // 跳过 name|1: array,因为最终值的类型(很可能)不是数组,也不一定与 `array` 中的类型一致\n\t if (schema.rule.count === 1) return true\n\t }\n\t // 跳过 name|+inc: array\n\t if (schema.rule.parameters[2]) return true\n\t }\n\t break\n\t case 'function':\n\t // 跳过 `'name': function`,因为函数可以返回任何类型的值。\n\t return true\n\t }\n\n\t Assert.equal('type', schema.path, Util.type(data), schema.type, result)\n\n\t return result.length === length\n\t },\n\t value: function(schema, data, name, result) {\n\t var length = result.length\n\n\t var rule = schema.rule\n\t var templateType = schema.type\n\t if (templateType === 'object' || templateType === 'array' || templateType === 'function') return true\n\n\t // 无生成规则\n\t if (!rule.parameters) {\n\t switch (templateType) {\n\t case 'regexp':\n\t Assert.match('value', schema.path, data, schema.template, result)\n\t return result.length === length\n\t case 'string':\n\t // 同样跳过含有『占位符』的属性值,因为『占位符』的返回值会通常会与模板不一致\n\t if (schema.template.match(Constant.RE_PLACEHOLDER)) return result.length === length\n\t break\n\t }\n\t Assert.equal('value', schema.path, data, schema.template, result)\n\t return result.length === length\n\t }\n\n\t // 有生成规则\n\t var actualRepeatCount\n\t switch (templateType) {\n\t case 'number':\n\t var parts = (data + '').split('.')\n\t parts[0] = +parts[0]\n\n\t // 整数部分\n\t // |min-max\n\t if (rule.min !== undefined && rule.max !== undefined) {\n\t Assert.greaterThanOrEqualTo('value', schema.path, parts[0], Math.min(rule.min, rule.max), result)\n\t // , 'numeric instance is lower than the required minimum (minimum: {expected}, found: {actual})')\n\t Assert.lessThanOrEqualTo('value', schema.path, parts[0], Math.max(rule.min, rule.max), result)\n\t }\n\t // |count\n\t if (rule.min !== undefined && rule.max === undefined) {\n\t Assert.equal('value', schema.path, parts[0], rule.min, result, '[value] ' + name)\n\t }\n\n\t // 小数部分\n\t if (rule.decimal) {\n\t // |dmin-dmax\n\t if (rule.dmin !== undefined && rule.dmax !== undefined) {\n\t Assert.greaterThanOrEqualTo('value', schema.path, parts[1].length, rule.dmin, result)\n\t Assert.lessThanOrEqualTo('value', schema.path, parts[1].length, rule.dmax, result)\n\t }\n\t // |dcount\n\t if (rule.dmin !== undefined && rule.dmax === undefined) {\n\t Assert.equal('value', schema.path, parts[1].length, rule.dmin, result)\n\t }\n\t }\n\n\t break\n\n\t case 'boolean':\n\t break\n\n\t case 'string':\n\t // 'aaa'.match(/a/g)\n\t actualRepeatCount = data.match(new RegExp(schema.template, 'g'))\n\t actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0\n\n\t // |min-max\n\t if (rule.min !== undefined && rule.max !== undefined) {\n\t Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result)\n\t }\n\t // |count\n\t if (rule.min !== undefined && rule.max === undefined) {\n\t Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t }\n\n\t break\n\n\t case 'regexp':\n\t actualRepeatCount = data.match(new RegExp(schema.template.source.replace(/^\\^|\\$$/g, ''), 'g'))\n\t actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0\n\n\t // |min-max\n\t if (rule.min !== undefined && rule.max !== undefined) {\n\t Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result)\n\t }\n\t // |count\n\t if (rule.min !== undefined && rule.max === undefined) {\n\t Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t }\n\t break\n\t }\n\n\t return result.length === length\n\t },\n\t properties: function(schema, data, name, result) {\n\t var length = result.length\n\n\t var rule = schema.rule\n\t var keys = Util.keys(data)\n\t if (!schema.properties) return\n\n\t // 无生成规则\n\t if (!schema.rule.parameters) {\n\t Assert.equal('properties length', schema.path, keys.length, schema.properties.length, result)\n\t } else {\n\t // 有生成规则\n\t // |min-max\n\t if (rule.min !== undefined && rule.max !== undefined) {\n\t Assert.greaterThanOrEqualTo('properties length', schema.path, keys.length, Math.min(rule.min, rule.max), result)\n\t Assert.lessThanOrEqualTo('properties length', schema.path, keys.length, Math.max(rule.min, rule.max), result)\n\t }\n\t // |count\n\t if (rule.min !== undefined && rule.max === undefined) {\n\t // |1, |>1\n\t if (rule.count !== 1) Assert.equal('properties length', schema.path, keys.length, rule.min, result)\n\t }\n\t }\n\n\t if (result.length !== length) return false\n\n\t for (var i = 0; i < keys.length; i++) {\n\t result.push.apply(\n\t result,\n\t this.diff(\n\t function() {\n\t var property\n\t Util.each(schema.properties, function(item /*, index*/ ) {\n\t if (item.name === keys[i]) property = item\n\t })\n\t return property || schema.properties[i]\n\t }(),\n\t data[keys[i]],\n\t keys[i]\n\t )\n\t )\n\t }\n\n\t return result.length === length\n\t },\n\t items: function(schema, data, name, result) {\n\t var length = result.length\n\n\t if (!schema.items) return\n\n\t var rule = schema.rule\n\n\t // 无生成规则\n\t if (!schema.rule.parameters) {\n\t Assert.equal('items length', schema.path, data.length, schema.items.length, result)\n\t } else {\n\t // 有生成规则\n\t // |min-max\n\t if (rule.min !== undefined && rule.max !== undefined) {\n\t Assert.greaterThanOrEqualTo('items', schema.path, data.length, (Math.min(rule.min, rule.max) * schema.items.length), result,\n\t '[{utype}] array is too short: {path} must have at least {expected} elements but instance has {actual} elements')\n\t Assert.lessThanOrEqualTo('items', schema.path, data.length, (Math.max(rule.min, rule.max) * schema.items.length), result,\n\t '[{utype}] array is too long: {path} must have at most {expected} elements but instance has {actual} elements')\n\t }\n\t // |count\n\t if (rule.min !== undefined && rule.max === undefined) {\n\t // |1, |>1\n\t if (rule.count === 1) return result.length === length\n\t else Assert.equal('items length', schema.path, data.length, (rule.min * schema.items.length), result)\n\t }\n\t // |+inc\n\t if (rule.parameters[2]) return result.length === length\n\t }\n\n\t if (result.length !== length) return false\n\n\t for (var i = 0; i < data.length; i++) {\n\t result.push.apply(\n\t result,\n\t this.diff(\n\t schema.items[i % schema.items.length],\n\t data[i],\n\t i % schema.items.length\n\t )\n\t )\n\t }\n\n\t return result.length === length\n\t }\n\t}\n\n\t/*\n\t 完善、友好的提示信息\n\t \n\t Equal, not equal to, greater than, less than, greater than or equal to, less than or equal to\n\t 路径 验证类型 描述 \n\n\t Expect path.name is less than or equal to expected, but path.name is actual.\n\n\t Expect path.name is less than or equal to expected, but path.name is actual.\n\t Expect path.name is greater than or equal to expected, but path.name is actual.\n\n\t*/\n\tvar Assert = {\n\t message: function(item) {\n\t return (item.message ||\n\t '[{utype}] Expect {path}\\'{ltype} {action} {expected}, but is {actual}')\n\t .replace('{utype}', item.type.toUpperCase())\n\t .replace('{ltype}', item.type.toLowerCase())\n\t .replace('{path}', Util.isArray(item.path) && item.path.join('.') || item.path)\n\t .replace('{action}', item.action)\n\t .replace('{expected}', item.expected)\n\t .replace('{actual}', item.actual)\n\t },\n\t equal: function(type, path, actual, expected, result, message) {\n\t if (actual === expected) return true\n\t switch (type) {\n\t case 'type':\n\t // 正则模板 === 字符串最终值\n\t if (expected === 'regexp' && actual === 'string') return true\n\t break\n\t }\n\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is equal to',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t // actual matches expected\n\t match: function(type, path, actual, expected, result, message) {\n\t if (expected.test(actual)) return true\n\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'matches',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t notEqual: function(type, path, actual, expected, result, message) {\n\t if (actual !== expected) return true\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is not equal to',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t greaterThan: function(type, path, actual, expected, result, message) {\n\t if (actual > expected) return true\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is greater than',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t lessThan: function(type, path, actual, expected, result, message) {\n\t if (actual < expected) return true\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is less to',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t greaterThanOrEqualTo: function(type, path, actual, expected, result, message) {\n\t if (actual >= expected) return true\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is greater than or equal to',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t },\n\t lessThanOrEqualTo: function(type, path, actual, expected, result, message) {\n\t if (actual <= expected) return true\n\t var item = {\n\t path: path,\n\t type: type,\n\t actual: actual,\n\t expected: expected,\n\t action: 'is less than or equal to',\n\t message: message\n\t }\n\t item.message = Assert.message(item)\n\t result.push(item)\n\t return false\n\t }\n\t}\n\n\tvalid.Diff = Diff\n\tvalid.Assert = Assert\n\n\tmodule.exports = valid\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(28)\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global window, document, location, Event, setTimeout */\n\t/*\n\t ## MockXMLHttpRequest\n\n\t 期望的功能:\n\t 1. 完整地覆盖原生 XHR 的行为\n\t 2. 完整地模拟原生 XHR 的行为\n\t 3. 在发起请求时,自动检测是否需要拦截\n\t 4. 如果不必拦截,则执行原生 XHR 的行为\n\t 5. 如果需要拦截,则执行虚拟 XHR 的行为\n\t 6. 兼容 XMLHttpRequest 和 ActiveXObject\n\t new window.XMLHttpRequest()\n\t new window.ActiveXObject(\"Microsoft.XMLHTTP\")\n\n\t 关键方法的逻辑:\n\t * new 此时尚无法确定是否需要拦截,所以创建原生 XHR 对象是必须的。\n\t * open 此时可以取到 URL,可以决定是否进行拦截。\n\t * send 此时已经确定了请求方式。\n\n\t 规范:\n\t http://xhr.spec.whatwg.org/\n\t http://www.w3.org/TR/XMLHttpRequest2/\n\n\t 参考实现:\n\t https://github.com/philikon/MockHttpRequest/blob/master/lib/mock.js\n\t https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js\n\t https://github.com/ilinsky/xmlhttprequest/blob/master/XMLHttpRequest.js\n\t https://github.com/firebug/firebug-lite/blob/master/content/lite/xhr.js\n\t https://github.com/thx/RAP/blob/master/lab/rap.plugin.xinglie.js\n\n\t **需不需要全面重写 XMLHttpRequest?**\n\t http://xhr.spec.whatwg.org/#interface-xmlhttprequest\n\t 关键属性 readyState、status、statusText、response、responseText、responseXML 是 readonly,所以,试图通过修改这些状态,来模拟响应是不可行的。\n\t 因此,唯一的办法是模拟整个 XMLHttpRequest,就像 jQuery 对事件模型的封装。\n\n\t // Event handlers\n\t onloadstart loadstart\n\t onprogress progress\n\t onabort abort\n\t onerror error\n\t onload load\n\t ontimeout timeout\n\t onloadend loadend\n\t onreadystatechange readystatechange\n\t */\n\n\tvar Util = __webpack_require__(3)\n\n\t// 备份原生 XMLHttpRequest\n\twindow._XMLHttpRequest = window.XMLHttpRequest\n\twindow._ActiveXObject = window.ActiveXObject\n\n\t/*\n\t PhantomJS\n\t TypeError: '[object EventConstructor]' is not a constructor (evaluating 'new Event(\"readystatechange\")')\n\n\t https://github.com/bluerail/twitter-bootstrap-rails-confirm/issues/18\n\t https://github.com/ariya/phantomjs/issues/11289\n\t*/\n\ttry {\n\t new window.Event('custom')\n\t} catch (exception) {\n\t window.Event = function(type, bubbles, cancelable, detail) {\n\t var event = document.createEvent('CustomEvent') // MUST be 'CustomEvent'\n\t event.initCustomEvent(type, bubbles, cancelable, detail)\n\t return event\n\t }\n\t}\n\n\tvar XHR_STATES = {\n\t // The object has been constructed.\n\t UNSENT: 0,\n\t // The open() method has been successfully invoked.\n\t OPENED: 1,\n\t // All redirects (if any) have been followed and all HTTP headers of the response have been received.\n\t HEADERS_RECEIVED: 2,\n\t // The response's body is being received.\n\t LOADING: 3,\n\t // The data transfer has been completed or something went wrong during the transfer (e.g. infinite redirects).\n\t DONE: 4\n\t}\n\n\tvar XHR_EVENTS = 'readystatechange loadstart progress abort error load timeout loadend'.split(' ')\n\tvar XHR_REQUEST_PROPERTIES = 'timeout withCredentials'.split(' ')\n\tvar XHR_RESPONSE_PROPERTIES = 'readyState responseURL status statusText responseType response responseText responseXML'.split(' ')\n\n\t// https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js#L32\n\tvar HTTP_STATUS_CODES = {\n\t 100: \"Continue\",\n\t 101: \"Switching Protocols\",\n\t 200: \"OK\",\n\t 201: \"Created\",\n\t 202: \"Accepted\",\n\t 203: \"Non-Authoritative Information\",\n\t 204: \"No Content\",\n\t 205: \"Reset Content\",\n\t 206: \"Partial Content\",\n\t 300: \"Multiple Choice\",\n\t 301: \"Moved Permanently\",\n\t 302: \"Found\",\n\t 303: \"See Other\",\n\t 304: \"Not Modified\",\n\t 305: \"Use Proxy\",\n\t 307: \"Temporary Redirect\",\n\t 400: \"Bad Request\",\n\t 401: \"Unauthorized\",\n\t 402: \"Payment Required\",\n\t 403: \"Forbidden\",\n\t 404: \"Not Found\",\n\t 405: \"Method Not Allowed\",\n\t 406: \"Not Acceptable\",\n\t 407: \"Proxy Authentication Required\",\n\t 408: \"Request Timeout\",\n\t 409: \"Conflict\",\n\t 410: \"Gone\",\n\t 411: \"Length Required\",\n\t 412: \"Precondition Failed\",\n\t 413: \"Request Entity Too Large\",\n\t 414: \"Request-URI Too Long\",\n\t 415: \"Unsupported Media Type\",\n\t 416: \"Requested Range Not Satisfiable\",\n\t 417: \"Expectation Failed\",\n\t 422: \"Unprocessable Entity\",\n\t 500: \"Internal Server Error\",\n\t 501: \"Not Implemented\",\n\t 502: \"Bad Gateway\",\n\t 503: \"Service Unavailable\",\n\t 504: \"Gateway Timeout\",\n\t 505: \"HTTP Version Not Supported\"\n\t}\n\n\t/*\n\t MockXMLHttpRequest\n\t*/\n\n\tfunction MockXMLHttpRequest() {\n\t // 初始化 custom 对象,用于存储自定义属性\n\t this.custom = {\n\t events: {},\n\t requestHeaders: {},\n\t responseHeaders: {}\n\t }\n\t}\n\n\tMockXMLHttpRequest._settings = {\n\t timeout: '10-100',\n\t /*\n\t timeout: 50,\n\t timeout: '10-100',\n\t */\n\t}\n\n\tMockXMLHttpRequest.setup = function(settings) {\n\t Util.extend(MockXMLHttpRequest._settings, settings)\n\t return MockXMLHttpRequest._settings\n\t}\n\n\tUtil.extend(MockXMLHttpRequest, XHR_STATES)\n\tUtil.extend(MockXMLHttpRequest.prototype, XHR_STATES)\n\n\t// 标记当前对象为 MockXMLHttpRequest\n\tMockXMLHttpRequest.prototype.mock = true\n\n\t// 是否拦截 Ajax 请求\n\tMockXMLHttpRequest.prototype.match = false\n\n\t// 初始化 Request 相关的属性和方法\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t // https://xhr.spec.whatwg.org/#the-open()-method\n\t // Sets the request method, request URL, and synchronous flag.\n\t open: function(method, url, async, username, password) {\n\t var that = this\n\n\t Util.extend(this.custom, {\n\t method: method,\n\t url: url,\n\t async: typeof async === 'boolean' ? async : true,\n\t username: username,\n\t password: password,\n\t options: {\n\t url: url,\n\t type: method\n\t }\n\t })\n\n\t this.custom.timeout = function(timeout) {\n\t if (typeof timeout === 'number') return timeout\n\t if (typeof timeout === 'string' && !~timeout.indexOf('-')) return parseInt(timeout, 10)\n\t if (typeof timeout === 'string' && ~timeout.indexOf('-')) {\n\t var tmp = timeout.split('-')\n\t var min = parseInt(tmp[0], 10)\n\t var max = parseInt(tmp[1], 10)\n\t return Math.round(Math.random() * (max - min)) + min\n\t }\n\t }(MockXMLHttpRequest._settings.timeout)\n\n\t // 查找与请求参数匹配的数据模板\n\t var item = find(this.custom.options)\n\n\t function handle(event) {\n\t // 同步属性 NativeXMLHttpRequest => MockXMLHttpRequest\n\t for (var i = 0; i < XHR_RESPONSE_PROPERTIES.length; i++) {\n\t try {\n\t that[XHR_RESPONSE_PROPERTIES[i]] = xhr[XHR_RESPONSE_PROPERTIES[i]]\n\t } catch (e) {}\n\t }\n\t // 触发 MockXMLHttpRequest 上的同名事件\n\t that.dispatchEvent(new Event(event.type /*, false, false, that*/ ))\n\t }\n\n\t // 如果未找到匹配的数据模板,则采用原生 XHR 发送请求。\n\t if (!item) {\n\t // 创建原生 XHR 对象,调用原生 open(),监听所有原生事件\n\t var xhr = createNativeXMLHttpRequest()\n\t this.custom.xhr = xhr\n\n\t // 初始化所有事件,用于监听原生 XHR 对象的事件\n\t for (var i = 0; i < XHR_EVENTS.length; i++) {\n\t xhr.addEventListener(XHR_EVENTS[i], handle)\n\t }\n\n\t // xhr.open()\n\t if (username) xhr.open(method, url, async, username, password)\n\t else xhr.open(method, url, async)\n\n\t // 同步属性 MockXMLHttpRequest => NativeXMLHttpRequest\n\t for (var j = 0; j < XHR_REQUEST_PROPERTIES.length; j++) {\n\t try {\n\t xhr[XHR_REQUEST_PROPERTIES[j]] = that[XHR_REQUEST_PROPERTIES[j]]\n\t } catch (e) {}\n\t }\n\n\t return\n\t }\n\n\t // 找到了匹配的数据模板,开始拦截 XHR 请求\n\t this.match = true\n\t this.custom.template = item\n\t this.readyState = MockXMLHttpRequest.OPENED\n\t this.dispatchEvent(new Event('readystatechange' /*, false, false, this*/ ))\n\t },\n\t // https://xhr.spec.whatwg.org/#the-setrequestheader()-method\n\t // Combines a header in author request headers.\n\t setRequestHeader: function(name, value) {\n\t // 原生 XHR\n\t if (!this.match) {\n\t this.custom.xhr.setRequestHeader(name, value)\n\t return\n\t }\n\n\t // 拦截 XHR\n\t var requestHeaders = this.custom.requestHeaders\n\t if (requestHeaders[name]) requestHeaders[name] += ',' + value\n\t else requestHeaders[name] = value\n\t },\n\t timeout: 0,\n\t withCredentials: false,\n\t upload: {},\n\t // https://xhr.spec.whatwg.org/#the-send()-method\n\t // Initiates the request.\n\t send: function send(data) {\n\t var that = this\n\t this.custom.options.body = data\n\n\t // 原生 XHR\n\t if (!this.match) {\n\t this.custom.xhr.send(data)\n\t return\n\t }\n\n\t // 拦截 XHR\n\n\t // X-Requested-With header\n\t this.setRequestHeader('X-Requested-With', 'MockXMLHttpRequest')\n\n\t // loadstart The fetch initiates.\n\t this.dispatchEvent(new Event('loadstart' /*, false, false, this*/ ))\n\n\t if (this.custom.async) setTimeout(done, this.custom.timeout) // 异步\n\t else done() // 同步\n\n\t function done() {\n\t that.readyState = MockXMLHttpRequest.HEADERS_RECEIVED\n\t that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\t that.readyState = MockXMLHttpRequest.LOADING\n\t that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\n\t that.status = 200\n\t that.statusText = HTTP_STATUS_CODES[200]\n\n\t // fix #92 #93 by @qddegtya\n\t that.response = that.responseText = JSON.stringify(\n\t convert(that.custom.template, that.custom.options),\n\t null, 4\n\t )\n\n\t that.readyState = MockXMLHttpRequest.DONE\n\t that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\t that.dispatchEvent(new Event('load' /*, false, false, that*/ ));\n\t that.dispatchEvent(new Event('loadend' /*, false, false, that*/ ));\n\t }\n\t },\n\t // https://xhr.spec.whatwg.org/#the-abort()-method\n\t // Cancels any network activity.\n\t abort: function abort() {\n\t // 原生 XHR\n\t if (!this.match) {\n\t this.custom.xhr.abort()\n\t return\n\t }\n\n\t // 拦截 XHR\n\t this.readyState = MockXMLHttpRequest.UNSENT\n\t this.dispatchEvent(new Event('abort', false, false, this))\n\t this.dispatchEvent(new Event('error', false, false, this))\n\t }\n\t})\n\n\t// 初始化 Response 相关的属性和方法\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t responseURL: '',\n\t status: MockXMLHttpRequest.UNSENT,\n\t statusText: '',\n\t // https://xhr.spec.whatwg.org/#the-getresponseheader()-method\n\t getResponseHeader: function(name) {\n\t // 原生 XHR\n\t if (!this.match) {\n\t return this.custom.xhr.getResponseHeader(name)\n\t }\n\n\t // 拦截 XHR\n\t return this.custom.responseHeaders[name.toLowerCase()]\n\t },\n\t // https://xhr.spec.whatwg.org/#the-getallresponseheaders()-method\n\t // http://www.utf8-chartable.de/\n\t getAllResponseHeaders: function() {\n\t // 原生 XHR\n\t if (!this.match) {\n\t return this.custom.xhr.getAllResponseHeaders()\n\t }\n\n\t // 拦截 XHR\n\t var responseHeaders = this.custom.responseHeaders\n\t var headers = ''\n\t for (var h in responseHeaders) {\n\t if (!responseHeaders.hasOwnProperty(h)) continue\n\t headers += h + ': ' + responseHeaders[h] + '\\r\\n'\n\t }\n\t return headers\n\t },\n\t overrideMimeType: function( /*mime*/ ) {},\n\t responseType: '', // '', 'text', 'arraybuffer', 'blob', 'document', 'json'\n\t response: null,\n\t responseText: '',\n\t responseXML: null\n\t})\n\n\t// EventTarget\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t addEventListener: function addEventListener(type, handle) {\n\t var events = this.custom.events\n\t if (!events[type]) events[type] = []\n\t events[type].push(handle)\n\t },\n\t removeEventListener: function removeEventListener(type, handle) {\n\t var handles = this.custom.events[type] || []\n\t for (var i = 0; i < handles.length; i++) {\n\t if (handles[i] === handle) {\n\t handles.splice(i--, 1)\n\t }\n\t }\n\t },\n\t dispatchEvent: function dispatchEvent(event) {\n\t var handles = this.custom.events[event.type] || []\n\t for (var i = 0; i < handles.length; i++) {\n\t handles[i].call(this, event)\n\t }\n\n\t var ontype = 'on' + event.type\n\t if (this[ontype]) this[ontype](event)\n\t }\n\t})\n\n\t// Inspired by jQuery\n\tfunction createNativeXMLHttpRequest() {\n\t var isLocal = function() {\n\t var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/\n\t var rurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/\n\t var ajaxLocation = location.href\n\t var ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []\n\t return rlocalProtocol.test(ajaxLocParts[1])\n\t }()\n\n\t return window.ActiveXObject ?\n\t (!isLocal && createStandardXHR() || createActiveXHR()) : createStandardXHR()\n\n\t function createStandardXHR() {\n\t try {\n\t return new window._XMLHttpRequest();\n\t } catch (e) {}\n\t }\n\n\t function createActiveXHR() {\n\t try {\n\t return new window._ActiveXObject(\"Microsoft.XMLHTTP\");\n\t } catch (e) {}\n\t }\n\t}\n\n\n\t// 查找与请求参数匹配的数据模板:URL,Type\n\tfunction find(options) {\n\n\t for (var sUrlType in MockXMLHttpRequest.Mock._mocked) {\n\t var item = MockXMLHttpRequest.Mock._mocked[sUrlType]\n\t if (\n\t (!item.rurl || match(item.rurl, options.url)) &&\n\t (!item.rtype || match(item.rtype, options.type.toLowerCase()))\n\t ) {\n\t // console.log('[mock]', options.url, '>', item.rurl)\n\t return item\n\t }\n\t }\n\n\t function match(expected, actual) {\n\t if (Util.type(expected) === 'string') {\n\t return expected === actual\n\t }\n\t if (Util.type(expected) === 'regexp') {\n\t return expected.test(actual)\n\t }\n\t }\n\n\t}\n\n\t// 数据模板 => 响应数据\n\tfunction convert(item, options) {\n\t return Util.isFunction(item.template) ?\n\t item.template(options) : MockXMLHttpRequest.Mock.mock(item.template)\n\t}\n\n\tmodule.exports = MockXMLHttpRequest\n\n/***/ })\n/******/ ])\n});\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX21vY2tqc0AxLjEuMEBtb2NranMvZGlzdC9tb2NrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19tb2NranNAMS4xLjBAbW9ja2pzL2Rpc3QvbW9jay5qcz8wM2ExIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk1vY2tcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiTW9ja1wiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogZ2xvYmFsIHJlcXVpcmUsIG1vZHVsZSwgd2luZG93ICovXG5cdHZhciBIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblx0dmFyIFJhbmRvbSA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0dmFyIFJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMClcblx0dmFyIHRvSlNPTlNjaGVtYSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpXG5cdHZhciB2YWxpZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpXG5cblx0dmFyIFhIUlxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIFhIUiA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpXG5cblx0LyohXG5cdCAgICBNb2NrIC0g5qih5ouf6K+35rGCICYg5qih5ouf5pWw5o2uXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vbnV5c29mdC9Nb2NrXG5cdCAgICDloqjmmbogbW96aGkuZ3l5QHRhb2Jhby5jb20gbnV5c29mdEBnbWFpbC5jb21cblx0Ki9cblx0dmFyIE1vY2sgPSB7XG5cdCAgICBIYW5kbGVyOiBIYW5kbGVyLFxuXHQgICAgUmFuZG9tOiBSYW5kb20sXG5cdCAgICBVdGlsOiBVdGlsLFxuXHQgICAgWEhSOiBYSFIsXG5cdCAgICBSRTogUkUsXG5cdCAgICB0b0pTT05TY2hlbWE6IHRvSlNPTlNjaGVtYSxcblx0ICAgIHZhbGlkOiB2YWxpZCxcblx0ICAgIGhlcmVkb2M6IFV0aWwuaGVyZWRvYyxcblx0ICAgIHNldHVwOiBmdW5jdGlvbihzZXR0aW5ncykge1xuXHQgICAgICAgIHJldHVybiBYSFIuc2V0dXAoc2V0dGluZ3MpXG5cdCAgICB9LFxuXHQgICAgX21vY2tlZDoge31cblx0fVxuXG5cdE1vY2sudmVyc2lvbiA9ICcxLjAuMS1iZXRhMydcblxuXHQvLyDpgb/lhY3lvqrnjq/kvp3otZZcblx0aWYgKFhIUikgWEhSLk1vY2sgPSBNb2NrXG5cblx0Lypcblx0ICAgICogTW9jay5tb2NrKCB0ZW1wbGF0ZSApXG5cdCAgICAqIE1vY2subW9jayggZnVuY3Rpb24oKSApXG5cdCAgICAqIE1vY2subW9jayggcnVybCwgdGVtcGxhdGUgKVxuXHQgICAgKiBNb2NrLm1vY2soIHJ1cmwsIGZ1bmN0aW9uKG9wdGlvbnMpIClcblx0ICAgICogTW9jay5tb2NrKCBydXJsLCBydHlwZSwgdGVtcGxhdGUgKVxuXHQgICAgKiBNb2NrLm1vY2soIHJ1cmwsIHJ0eXBlLCBmdW5jdGlvbihvcHRpb25zKSApXG5cblx0ICAgIOagueaNruaVsOaNruaooeadv+eUn+aIkOaooeaLn+aVsOaNruOAglxuXHQqL1xuXHRNb2NrLm1vY2sgPSBmdW5jdGlvbihydXJsLCBydHlwZSwgdGVtcGxhdGUpIHtcblx0ICAgIC8vIE1vY2subW9jayh0ZW1wbGF0ZSlcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgcmV0dXJuIEhhbmRsZXIuZ2VuKHJ1cmwpXG5cdCAgICB9XG5cdCAgICAvLyBNb2NrLm1vY2socnVybCwgdGVtcGxhdGUpXG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuXHQgICAgICAgIHRlbXBsYXRlID0gcnR5cGVcblx0ICAgICAgICBydHlwZSA9IHVuZGVmaW5lZFxuXHQgICAgfVxuXHQgICAgLy8g5oum5oiqIFhIUlxuXHQgICAgaWYgKFhIUikgd2luZG93LlhNTEh0dHBSZXF1ZXN0ID0gWEhSXG5cdCAgICBNb2NrLl9tb2NrZWRbcnVybCArIChydHlwZSB8fCAnJyldID0ge1xuXHQgICAgICAgIHJ1cmw6IHJ1cmwsXG5cdCAgICAgICAgcnR5cGU6IHJ0eXBlLFxuXHQgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1vY2tcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0gTW9ja1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBcblx0ICAgICMjIEhhbmRsZXJcblxuXHQgICAg5aSE55CG5pWw5o2u5qih5p2/44CCXG5cdCAgICBcblx0ICAgICogSGFuZGxlci5nZW4oIHRlbXBsYXRlLCBuYW1lPywgY29udGV4dD8gKVxuXG5cdCAgICAgICAg5YWl5Y+j5pa55rOV44CCXG5cblx0ICAgICogRGF0YSBUZW1wbGF0ZSBEZWZpbml0aW9uLCBEVERcblx0ICAgICAgICBcblx0ICAgICAgICDlpITnkIbmlbDmja7mqKHmnb/lrprkuYnjgIJcblxuXHQgICAgICAgICogSGFuZGxlci5hcnJheSggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLm9iamVjdCggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLm51bWJlciggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLmJvb2xlYW4oIG9wdGlvbnMgKVxuXHQgICAgICAgICogSGFuZGxlci5zdHJpbmcoIG9wdGlvbnMgKVxuXHQgICAgICAgICogSGFuZGxlci5mdW5jdGlvbiggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLnJlZ2V4cCggb3B0aW9ucyApXG5cdCAgICAgICAgXG5cdCAgICAgICAg5aSE55CG6Lev5b6E77yI55u45a+55ZKM57ud5a+577yJ44CCXG5cblx0ICAgICAgICAqIEhhbmRsZXIuZ2V0VmFsdWVCeUtleVBhdGgoIGtleSwgb3B0aW9ucyApXG5cblx0ICAgICogRGF0YSBQbGFjZWhvbGRlciBEZWZpbml0aW9uLCBEUERcblxuXHQgICAgICAgIOWkhOeQhuaVsOaNruWNoOS9jeespuWumuS5iVxuXG5cdCAgICAgICAgKiBIYW5kbGVyLnBsYWNlaG9sZGVyKCBwbGFjZWhvbGRlciwgY29udGV4dCwgdGVtcGxhdGVDb250ZXh0LCBvcHRpb25zIClcblxuXHQqL1xuXG5cdHZhciBDb25zdGFudCA9IF9fd2VicGFja19yZXF1aXJlX18oMilcblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciBQYXJzZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdHZhciBSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApXG5cblx0dmFyIEhhbmRsZXIgPSB7XG5cdCAgICBleHRlbmQ6IFV0aWwuZXh0ZW5kXG5cdH1cblxuXHQvKlxuXHQgICAgdGVtcGxhdGUgICAgICAgIOWxnuaAp+WAvO+8iOWNs+aVsOaNruaooeadv++8iVxuXHQgICAgbmFtZSAgICAgICAgICAgIOWxnuaAp+WQjVxuXHQgICAgY29udGV4dCAgICAgICAgIOaVsOaNruS4iuS4i+aWh++8jOeUn+aIkOWQjueahOaVsOaNrlxuXHQgICAgdGVtcGxhdGVDb250ZXh0IOaooeadv+S4iuS4i+aWh++8jFxuXG5cdCAgICBIYW5kbGUuZ2VuKHRlbXBsYXRlLCBuYW1lLCBvcHRpb25zKVxuXHQgICAgY29udGV4dFxuXHQgICAgICAgIGN1cnJlbnRDb250ZXh0LCB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0LCBcblx0ICAgICAgICBwYXRoLCB0ZW1wbGF0ZVBhdGhcblx0ICAgICAgICByb290LCB0ZW1wbGF0ZVJvb3Rcblx0Ki9cblx0SGFuZGxlci5nZW4gPSBmdW5jdGlvbih0ZW1wbGF0ZSwgbmFtZSwgY29udGV4dCkge1xuXHQgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICBuYW1lID0gbmFtZSA9PSB1bmRlZmluZWQgPyAnJyA6IChuYW1lICsgJycpXG5cblx0ICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9XG5cdCAgICBjb250ZXh0ID0ge1xuXHQgICAgICAgICAgICAvLyDlvZPliY3orr/pl67ot6/lvoTvvIzlj6rmnInlsZ7mgKflkI3vvIzkuI3ljIXmi6znlJ/miJDop4TliJlcblx0ICAgICAgICAgICAgcGF0aDogY29udGV4dC5wYXRoIHx8IFtDb25zdGFudC5HVUlEXSxcblx0ICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBjb250ZXh0LnRlbXBsYXRlUGF0aCB8fCBbQ29uc3RhbnQuR1VJRCsrXSxcblx0ICAgICAgICAgICAgLy8g5pyA57uI5bGe5oCn5YC855qE5LiK5LiL5paHXG5cdCAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiBjb250ZXh0LmN1cnJlbnRDb250ZXh0LFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflgLzmqKHmnb/nmoTkuIrkuIvmlodcblx0ICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogY29udGV4dC50ZW1wbGF0ZUN1cnJlbnRDb250ZXh0IHx8IHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAvLyDmnIDnu4jlgLznmoTmoLlcblx0ICAgICAgICAgICAgcm9vdDogY29udGV4dC5yb290IHx8IGNvbnRleHQuY3VycmVudENvbnRleHQsXG5cdCAgICAgICAgICAgIC8vIOaooeadv+eahOaguVxuXHQgICAgICAgICAgICB0ZW1wbGF0ZVJvb3Q6IGNvbnRleHQudGVtcGxhdGVSb290IHx8IGNvbnRleHQudGVtcGxhdGVDdXJyZW50Q29udGV4dCB8fCB0ZW1wbGF0ZVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBjb25zb2xlLmxvZygncGF0aDonLCBjb250ZXh0LnBhdGguam9pbignLicpLCB0ZW1wbGF0ZSlcblxuXHQgICAgdmFyIHJ1bGUgPSBQYXJzZXIucGFyc2UobmFtZSlcblx0ICAgIHZhciB0eXBlID0gVXRpbC50eXBlKHRlbXBsYXRlKVxuXHQgICAgdmFyIGRhdGFcblxuXHQgICAgaWYgKEhhbmRsZXJbdHlwZV0pIHtcblx0ICAgICAgICBkYXRhID0gSGFuZGxlclt0eXBlXSh7XG5cdCAgICAgICAgICAgIC8vIOWxnuaAp+WAvOexu+Wei1xuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflgLzmqKHmnb9cblx0ICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflkI0gKyDnlJ/miJDop4TliJlcblx0ICAgICAgICAgICAgbmFtZTogbmFtZSxcblx0ICAgICAgICAgICAgLy8g5bGe5oCn5ZCNXG5cdCAgICAgICAgICAgIHBhcnNlZE5hbWU6IG5hbWUgPyBuYW1lLnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKSA6IG5hbWUsXG5cblx0ICAgICAgICAgICAgLy8g6Kej5p6Q5ZCO55qE55Sf5oiQ6KeE5YiZXG5cdCAgICAgICAgICAgIHJ1bGU6IHJ1bGUsXG5cdCAgICAgICAgICAgIC8vIOebuOWFs+S4iuS4i+aWh1xuXHQgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIGlmICghY29udGV4dC5yb290KSBjb250ZXh0LnJvb3QgPSBkYXRhXG5cdCAgICAgICAgcmV0dXJuIGRhdGFcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHRlbXBsYXRlXG5cdH1cblxuXHRIYW5kbGVyLmV4dGVuZCh7XG5cdCAgICBhcnJheTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXSxcblx0ICAgICAgICAgICAgaSwgaWk7XG5cblx0ICAgICAgICAvLyAnbmFtZXwxJzogW11cblx0ICAgICAgICAvLyAnbmFtZXxjb3VudCc6IFtdXG5cdCAgICAgICAgLy8gJ25hbWV8bWluLW1heCc6IFtdXG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0XG5cblx0ICAgICAgICAvLyAnYXJyJzogW3sgJ2VtYWlsJzogJ0BFTUFJTCcgfSwgeyAnZW1haWwnOiAnQEVNQUlMJyB9XVxuXHQgICAgICAgIGlmICghb3B0aW9ucy5ydWxlLnBhcmFtZXRlcnMpIHtcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2goaSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChpKVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG5cdCAgICAgICAgICAgICAgICAgICAgSGFuZGxlci5nZW4ob3B0aW9ucy50ZW1wbGF0ZVtpXSwgaSwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmNvbnRleHQucGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0OiBvcHRpb25zLnRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICByb290OiBvcHRpb25zLmNvbnRleHQucm9vdCB8fCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUm9vdDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUm9vdCB8fCBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnBvcCgpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLnBvcCgpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnbWV0aG9kfDEnOiBbJ0dFVCcsICdQT1NUJywgJ0hFQUQnLCAnREVMRVRFJ11cblx0ICAgICAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5taW4gPT09IDEgJiYgb3B0aW9ucy5ydWxlLm1heCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmaXggIzE3XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wdXNoKG9wdGlvbnMubmFtZSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChvcHRpb25zLm5hbWUpXG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBIYW5kbGVyLmdlbihvcHRpb25zLnRlbXBsYXRlLCB1bmRlZmluZWQsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5jb250ZXh0LnBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGF0aDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRleHQ6IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogb3B0aW9ucy50ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogb3B0aW9ucy5jb250ZXh0LnJvb3QgfHwgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJvb3Q6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVJvb3QgfHwgb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aC5wb3AoKVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gJ2RhdGF8KzEnOiBbe30sIHt9XVxuXHQgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5wYXJhbWV0ZXJzWzJdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4ID0gb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4IHx8IDBcblxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2gob3B0aW9ucy5uYW1lKVxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChvcHRpb25zLm5hbWUpXG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSGFuZGxlci5nZW4ob3B0aW9ucy50ZW1wbGF0ZSwgdW5kZWZpbmVkLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG9wdGlvbnMuY29udGV4dC5yb290IHx8IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICB9KVtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4ICUgb3B0aW9ucy50ZW1wbGF0ZS5sZW5ndGhcblx0ICAgICAgICAgICAgICAgICAgICBdXG5cblx0ICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlLl9fb3JkZXJfaW5kZXggKz0gK29wdGlvbnMucnVsZS5wYXJhbWV0ZXJzWzJdXG5cblx0ICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnZGF0YXwxLTEwJzogW3t9XVxuXHQgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLnJ1bGUuY291bnQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAnZGF0YXwxLTEwJzogW3t9LCB7fV1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgb3B0aW9ucy50ZW1wbGF0ZS5sZW5ndGg7IGlpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2gocmVzdWx0Lmxlbmd0aClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChpaSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIuZ2VuKG9wdGlvbnMudGVtcGxhdGVbaWldLCByZXN1bHQubGVuZ3RoLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG9wdGlvbnMuY29udGV4dC5yb290IHx8IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0XG5cdCAgICB9LFxuXHQgICAgb2JqZWN0OiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHt9LFxuXHQgICAgICAgICAgICBrZXlzLCBmbktleXMsIGtleSwgcGFyc2VkS2V5LCBpbmMsIGk7XG5cblx0ICAgICAgICAvLyAnb2JqfG1pbi1tYXgnOiB7fVxuXHQgICAgICAgIC8qIGpzaGludCAtVzA0MSAqL1xuXHQgICAgICAgIGlmIChvcHRpb25zLnJ1bGUubWluICE9IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBrZXlzID0gVXRpbC5rZXlzKG9wdGlvbnMudGVtcGxhdGUpXG5cdCAgICAgICAgICAgIGtleXMgPSBSYW5kb20uc2h1ZmZsZShrZXlzKVxuXHQgICAgICAgICAgICBrZXlzID0ga2V5cy5zbGljZSgwLCBvcHRpb25zLnJ1bGUuY291bnQpXG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldXG5cdCAgICAgICAgICAgICAgICBwYXJzZWRLZXkgPSBrZXkucmVwbGFjZShDb25zdGFudC5SRV9LRVksICckMScpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wdXNoKHBhcnNlZEtleSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChrZXkpXG5cdCAgICAgICAgICAgICAgICByZXN1bHRbcGFyc2VkS2V5XSA9IEhhbmRsZXIuZ2VuKG9wdGlvbnMudGVtcGxhdGVba2V5XSwga2V5LCB7XG5cdCAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5jb250ZXh0LnBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogb3B0aW9ucy50ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICByb290OiBvcHRpb25zLmNvbnRleHQucm9vdCB8fCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aC5wb3AoKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnb2JqJzoge31cblx0ICAgICAgICAgICAga2V5cyA9IFtdXG5cdCAgICAgICAgICAgIGZuS2V5cyA9IFtdIC8vICMyNSDmlLnlj5jkuobpnZ7lh73mlbDlsZ7mgKfnmoTpobrluo/vvIzmn6Xmib7otbfmnaXkuI3mlrnkvr9cblx0ICAgICAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucy50ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2tleV0gPT09ICdmdW5jdGlvbicgPyBmbktleXMgOiBrZXlzKS5wdXNoKGtleSlcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoZm5LZXlzKVxuXG5cdCAgICAgICAgICAgIC8qXG5cdCAgICAgICAgICAgICAgICDkvJrmlLnlj5jpnZ7lh73mlbDlsZ7mgKfnmoTpobrluo9cblx0ICAgICAgICAgICAgICAgIGtleXMgPSBVdGlsLmtleXMob3B0aW9ucy50ZW1wbGF0ZSlcblx0ICAgICAgICAgICAgICAgIGtleXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGFmbiA9IHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2FdID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGJmbiA9IHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2JdID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGFmbiA9PT0gYmZuKSByZXR1cm4gMFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChhZm4gJiYgIWJmbikgcmV0dXJuIDFcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWFmbiAmJiBiZm4pIHJldHVybiAtMVxuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgKi9cblxuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0ga2V5c1tpXVxuXHQgICAgICAgICAgICAgICAgcGFyc2VkS2V5ID0ga2V5LnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucHVzaChwYXJzZWRLZXkpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLnB1c2goa2V5KVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0W3BhcnNlZEtleV0gPSBIYW5kbGVyLmdlbihvcHRpb25zLnRlbXBsYXRlW2tleV0sIGtleSwge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGF0aDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgcm9vdDogb3B0aW9ucy5jb250ZXh0LnJvb3QgfHwgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUm9vdDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUm9vdCB8fCBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnaWR8KzEnOiAxXG5cdCAgICAgICAgICAgICAgICBpbmMgPSBrZXkubWF0Y2goQ29uc3RhbnQuUkVfS0VZKVxuXHQgICAgICAgICAgICAgICAgaWYgKGluYyAmJiBpbmNbMl0gJiYgVXRpbC50eXBlKG9wdGlvbnMudGVtcGxhdGVba2V5XSkgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZVtrZXldICs9IHBhcnNlSW50KGluY1syXSwgMTApXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIG51bWJlcjogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIHZhciByZXN1bHQsIHBhcnRzO1xuXHQgICAgICAgIGlmIChvcHRpb25zLnJ1bGUuZGVjaW1hbCkgeyAvLyBmbG9hdFxuXHQgICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlICs9ICcnXG5cdCAgICAgICAgICAgIHBhcnRzID0gb3B0aW9ucy50ZW1wbGF0ZS5zcGxpdCgnLicpXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQxfC4xLTEwJzogMTAsXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQyfDEtMTAwLjEtMTAnOiAxLFxuXHQgICAgICAgICAgICAgICAgLy8gJ2Zsb2F0M3w5OTkuMS0xMCc6IDEsXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQ0fC4zLTEwJzogMTIzLjEyMyxcblx0ICAgICAgICAgICAgcGFydHNbMF0gPSBvcHRpb25zLnJ1bGUucmFuZ2UgPyBvcHRpb25zLnJ1bGUuY291bnQgOiBwYXJ0c1swXVxuXHQgICAgICAgICAgICBwYXJ0c1sxXSA9IChwYXJ0c1sxXSB8fCAnJykuc2xpY2UoMCwgb3B0aW9ucy5ydWxlLmRjb3VudClcblx0ICAgICAgICAgICAgd2hpbGUgKHBhcnRzWzFdLmxlbmd0aCA8IG9wdGlvbnMucnVsZS5kY291bnQpIHtcblx0ICAgICAgICAgICAgICAgIHBhcnRzWzFdICs9IChcblx0ICAgICAgICAgICAgICAgICAgICAvLyDmnIDlkI7kuIDkvY3kuI3og73kuLogMO+8muWmguaenOacgOWQjuS4gOS9jeS4uiAw77yM5Lya6KKrIEpTIOW8leaTjuW/veeVpeaOieOAglxuXHQgICAgICAgICAgICAgICAgICAgIChwYXJ0c1sxXS5sZW5ndGggPCBvcHRpb25zLnJ1bGUuZGNvdW50IC0gMSkgPyBSYW5kb20uY2hhcmFjdGVyKCdudW1iZXInKSA6IFJhbmRvbS5jaGFyYWN0ZXIoJzEyMzQ1Njc4OScpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChwYXJ0cy5qb2luKCcuJyksIDEwKVxuXHQgICAgICAgIH0gZWxzZSB7IC8vIGludGVnZXJcblx0ICAgICAgICAgICAgLy8gJ2dyYWRlMXwxLTEwMCc6IDEsXG5cdCAgICAgICAgICAgIHJlc3VsdCA9IG9wdGlvbnMucnVsZS5yYW5nZSAmJiAhb3B0aW9ucy5ydWxlLnBhcmFtZXRlcnNbMl0gPyBvcHRpb25zLnJ1bGUuY291bnQgOiBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICBib29sZWFuOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdDtcblx0ICAgICAgICAvLyAncHJvcHxtdWx0aXBsZSc6IGZhbHNlLCDlvZPliY3lgLzmmK/nm7jlj43lgLznmoTmpoLnjoflgI3mlbBcblx0ICAgICAgICAvLyAncHJvcHxwcm9iYWJpbGl0eS1wcm9iYWJpbGl0eSc6IGZhbHNlLCDlvZPliY3lgLzkuI7nm7jlj43lgLznmoTmpoLnjodcblx0ICAgICAgICByZXN1bHQgPSBvcHRpb25zLnJ1bGUucGFyYW1ldGVycyA/IFJhbmRvbS5ib29sKG9wdGlvbnMucnVsZS5taW4sIG9wdGlvbnMucnVsZS5tYXgsIG9wdGlvbnMudGVtcGxhdGUpIDogb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICBzdHJpbmc6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJycsXG5cdCAgICAgICAgICAgIGksIHBsYWNlaG9sZGVycywgcGgsIHBoZWQ7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoKSB7XG5cblx0ICAgICAgICAgICAgLy8gICdmb28nOiAn4piFJyxcblx0ICAgICAgICAgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICAgICAgICAgIGlmIChvcHRpb25zLnJ1bGUuY291bnQgPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgKz0gb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gJ3N0YXJ8MS01JzogJ+KYhScsXG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLnJ1bGUuY291bnQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyAnZW1haWx8MS0xMCc6ICdARU1BSUwsICcsXG5cdCAgICAgICAgICAgIHBsYWNlaG9sZGVycyA9IHJlc3VsdC5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikgfHwgW10gLy8gQS1aXzAtOSA+IFxcd19cblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgcGggPSBwbGFjZWhvbGRlcnNbaV1cblxuXHQgICAgICAgICAgICAgICAgLy8g6YGH5Yiw6L2s5LmJ5pac5p2g77yM5LiN6ZyA6KaB6Kej5p6Q5Y2g5L2N56ymXG5cdCAgICAgICAgICAgICAgICBpZiAoL15cXFxcLy50ZXN0KHBoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5zcGxpY2UoaS0tLCAxKVxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHBoZWQgPSBIYW5kbGVyLnBsYWNlaG9sZGVyKHBoLCBvcHRpb25zLmNvbnRleHQuY3VycmVudENvbnRleHQsIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZUN1cnJlbnRDb250ZXh0LCBvcHRpb25zKVxuXG5cdCAgICAgICAgICAgICAgICAvLyDlj6rmnInkuIDkuKrljaDkvY3nrKbvvIzlubbkuJTmsqHmnInlhbbku5blrZfnrKZcblx0ICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcnMubGVuZ3RoID09PSAxICYmIHBoID09PSByZXN1bHQgJiYgdHlwZW9mIHBoZWQgIT09IHR5cGVvZiByZXN1bHQpIHsgLy8gXG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGhlZFxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc051bWVyaWMocGhlZCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChwaGVkLCAxMClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKC9eKHRydWV8ZmFsc2UpJC8udGVzdChwaGVkKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaGVkID09PSAndHJ1ZScgPyB0cnVlIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoZWQgPT09ICdmYWxzZScgPyBmYWxzZSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGVkIC8vIOW3sue7j+aYr+W4g+WwlOWAvFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBoLCBwaGVkKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnQVNDSUl8MS0xMCc6ICcnLFxuXHQgICAgICAgICAgICAvLyAnQVNDSUknOiAnJyxcblx0ICAgICAgICAgICAgcmVzdWx0ID0gb3B0aW9ucy5ydWxlLnJhbmdlID8gUmFuZG9tLnN0cmluZyhvcHRpb25zLnJ1bGUuY291bnQpIDogb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0XG5cdCAgICB9LFxuXHQgICAgJ2Z1bmN0aW9uJzogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIC8vICggY29udGV4dCwgb3B0aW9ucyApXG5cdCAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVtcGxhdGUuY2FsbChvcHRpb25zLmNvbnRleHQuY3VycmVudENvbnRleHQsIG9wdGlvbnMpXG5cdCAgICB9LFxuXHQgICAgJ3JlZ2V4cCc6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgc291cmNlID0gJydcblxuXHQgICAgICAgIC8vICduYW1lJzogL3JlZ2V4cC8sXG5cdCAgICAgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5jb3VudCA9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgc291cmNlICs9IG9wdGlvbnMudGVtcGxhdGUuc291cmNlIC8vIHJlZ2V4cC5zb3VyY2Vcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyAnbmFtZXwxLTUnOiAvcmVnZXhwLyxcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMucnVsZS5jb3VudDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHNvdXJjZSArPSBvcHRpb25zLnRlbXBsYXRlLnNvdXJjZVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBSRS5IYW5kbGVyLmdlbihcblx0ICAgICAgICAgICAgUkUuUGFyc2VyLnBhcnNlKFxuXHQgICAgICAgICAgICAgICAgc291cmNlXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICApXG5cdCAgICB9XG5cdH0pXG5cblx0SGFuZGxlci5leHRlbmQoe1xuXHQgICAgX2FsbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIHJlID0ge307XG5cdCAgICAgICAgZm9yICh2YXIga2V5IGluIFJhbmRvbSkgcmVba2V5LnRvTG93ZXJDYXNlKCldID0ga2V5XG5cdCAgICAgICAgcmV0dXJuIHJlXG5cdCAgICB9LFxuXHQgICAgLy8g5aSE55CG5Y2g5L2N56ym77yM6L2s5o2i5Li65pyA57uI5YC8XG5cdCAgICBwbGFjZWhvbGRlcjogZnVuY3Rpb24ocGxhY2Vob2xkZXIsIG9iaiwgdGVtcGxhdGVDb250ZXh0LCBvcHRpb25zKSB7XG5cdCAgICAgICAgLy8gY29uc29sZS5sb2cob3B0aW9ucy5jb250ZXh0LnBhdGgpXG5cdCAgICAgICAgLy8gMSBrZXksIDIgcGFyYW1zXG5cdCAgICAgICAgQ29uc3RhbnQuUkVfUExBQ0VIT0xERVIuZXhlYygnJylcblx0ICAgICAgICB2YXIgcGFydHMgPSBDb25zdGFudC5SRV9QTEFDRUhPTERFUi5leGVjKHBsYWNlaG9sZGVyKSxcblx0ICAgICAgICAgICAga2V5ID0gcGFydHMgJiYgcGFydHNbMV0sXG5cdCAgICAgICAgICAgIGxrZXkgPSBrZXkgJiYga2V5LnRvTG93ZXJDYXNlKCksXG5cdCAgICAgICAgICAgIG9rZXkgPSB0aGlzLl9hbGwoKVtsa2V5XSxcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFydHMgJiYgcGFydHNbMl0gfHwgJydcblx0ICAgICAgICB2YXIgcGF0aFBhcnRzID0gdGhpcy5zcGxpdFBhdGhUb0FycmF5KGtleSlcblxuXHQgICAgICAgIC8vIOino+aekOWNoOS9jeespueahOWPguaVsFxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIDEuIOWwneivleS/neaMgeWPguaVsOeahOexu+Wei1xuXHQgICAgICAgICAgICAvKlxuXHQgICAgICAgICAgICAgICAgIzI0IFtXaW5kb3cgRmlyZWZveCAzMC4wIOW8leeUqCDljaDkvY3nrKYg5oqb6ZSZXShodHRwczovL2dpdGh1Yi5jb20vbnV5c29mdC9Nb2NrL2lzc3Vlcy8yNClcblx0ICAgICAgICAgICAgICAgIFtCWDkwNTY6IOWQhOa1j+iniOWZqOS4iyB3aW5kb3cuZXZhbCDmlrnms5XnmoTmiafooYzkuIrkuIvmloflrZjlnKjlt67lvIJdKGh0dHA6Ly93d3cudzNoZWxwLm9yZy96aC1jbi9jYXVzZXMvQlg5MDU2KVxuXHQgICAgICAgICAgICAgICAg5bqU6K+l5bGe5LqOIFdpbmRvdyBGaXJlZm94IDMwLjAg55qEIEJVR1xuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICAvKiBqc2hpbnQgLVcwNjEgKi9cblx0ICAgICAgICAgICAgcGFyYW1zID0gZXZhbCgnKGZ1bmN0aW9uKCl7IHJldHVybiBbXS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDAgKSB9KSgnICsgcGFyYW1zICsgJyknKVxuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgIC8vIDIuIOWmguaenOWksei0pe+8jOWPquiDveino+aekOS4uuWtl+espuS4slxuXHQgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKVxuXHQgICAgICAgICAgICAvLyBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcikgcGFyYW1zID0gcGFydHNbMl0uc3BsaXQoLyxcXHMqLyk7XG5cdCAgICAgICAgICAgIC8vIGVsc2UgdGhyb3cgZXJyb3Jcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFydHNbMl0uc3BsaXQoLyxcXHMqLylcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDljaDkvY3nrKbkvJjlhYjlvJXnlKjmlbDmja7mqKHmnb/kuK3nmoTlsZ7mgKdcblx0ICAgICAgICBpZiAob2JqICYmIChrZXkgaW4gb2JqKSkgcmV0dXJuIG9ialtrZXldXG5cblx0ICAgICAgICAvLyBAaW5kZXggQGtleVxuXHQgICAgICAgIC8vIGlmIChDb25zdGFudC5SRV9JTkRFWC50ZXN0KGtleSkpIHJldHVybiArb3B0aW9ucy5uYW1lXG5cdCAgICAgICAgLy8gaWYgKENvbnN0YW50LlJFX0tFWS50ZXN0KGtleSkpIHJldHVybiBvcHRpb25zLm5hbWVcblxuXHQgICAgICAgIC8vIOe7neWvuei3r+W+hCBvciDnm7jlr7not6/lvoRcblx0ICAgICAgICBpZiAoXG5cdCAgICAgICAgICAgIGtleS5jaGFyQXQoMCkgPT09ICcvJyB8fFxuXHQgICAgICAgICAgICBwYXRoUGFydHMubGVuZ3RoID4gMVxuXHQgICAgICAgICkgcmV0dXJuIHRoaXMuZ2V0VmFsdWVCeUtleVBhdGgoa2V5LCBvcHRpb25zKVxuXG5cdCAgICAgICAgLy8g6YCS5b2S5byV55So5pWw5o2u5qih5p2/5Lit55qE5bGe5oCnXG5cdCAgICAgICAgaWYgKHRlbXBsYXRlQ29udGV4dCAmJlxuXHQgICAgICAgICAgICAodHlwZW9mIHRlbXBsYXRlQ29udGV4dCA9PT0gJ29iamVjdCcpICYmXG5cdCAgICAgICAgICAgIChrZXkgaW4gdGVtcGxhdGVDb250ZXh0KSAmJlxuXHQgICAgICAgICAgICAocGxhY2Vob2xkZXIgIT09IHRlbXBsYXRlQ29udGV4dFtrZXldKSAvLyBmaXggIzE1IOmBv+WFjeiHquW3seS+nei1luiHquW3sVxuXHQgICAgICAgICkge1xuXHQgICAgICAgICAgICAvLyDlhYjorqHnrpfooqvlvJXnlKjnmoTlsZ7mgKflgLxcblx0ICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0W2tleV0gPSBIYW5kbGVyLmdlbih0ZW1wbGF0ZUNvbnRleHRba2V5XSwga2V5LCB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogb2JqLFxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogdGVtcGxhdGVDb250ZXh0XG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUNvbnRleHRba2V5XVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIOWmguaenOacquaJvuWIsO+8jOWImeWOn+agt+i/lOWbnlxuXHQgICAgICAgIGlmICghKGtleSBpbiBSYW5kb20pICYmICEobGtleSBpbiBSYW5kb20pICYmICEob2tleSBpbiBSYW5kb20pKSByZXR1cm4gcGxhY2Vob2xkZXJcblxuXHQgICAgICAgIC8vIOmAkuW9kuino+aekOWPguaVsOS4reeahOWNoOS9jeesplxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIENvbnN0YW50LlJFX1BMQUNFSE9MREVSLmV4ZWMoJycpXG5cdCAgICAgICAgICAgIGlmIChDb25zdGFudC5SRV9QTEFDRUhPTERFUi50ZXN0KHBhcmFtc1tpXSkpIHtcblx0ICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IEhhbmRsZXIucGxhY2Vob2xkZXIocGFyYW1zW2ldLCBvYmosIHRlbXBsYXRlQ29udGV4dCwgb3B0aW9ucylcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBoYW5kbGUgPSBSYW5kb21ba2V5XSB8fCBSYW5kb21bbGtleV0gfHwgUmFuZG9tW29rZXldXG5cdCAgICAgICAgc3dpdGNoIChVdGlsLnR5cGUoaGFuZGxlKSkge1xuXHQgICAgICAgICAgICBjYXNlICdhcnJheSc6XG5cdCAgICAgICAgICAgICAgICAvLyDoh6rliqjku47mlbDnu4TkuK3lj5bkuIDkuKrvvIzkvovlpoIgQGFyZWFzXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soaGFuZGxlKVxuXHQgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAvLyDmiafooYzljaDkvY3nrKbmlrnms5XvvIjlpKflpJrmlbDmg4XlhrXvvIlcblx0ICAgICAgICAgICAgICAgIGhhbmRsZS5vcHRpb25zID0gb3B0aW9uc1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlID0gaGFuZGxlLmFwcGx5KFJhbmRvbSwgcGFyYW1zKVxuXHQgICAgICAgICAgICAgICAgaWYgKHJlID09PSB1bmRlZmluZWQpIHJlID0gJycgLy8g5Zug5Li65piv5Zyo5a2X56ym5Liy5Lit77yM5omA5Lul6buY6K6k5Li656m65a2X56ym5Liy44CCXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlLm9wdGlvbnNcblx0ICAgICAgICAgICAgICAgIHJldHVybiByZVxuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBnZXRWYWx1ZUJ5S2V5UGF0aDogZnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG9yaWdpbmFsS2V5ID0ga2V5XG5cdCAgICAgICAgdmFyIGtleVBhdGhQYXJ0cyA9IHRoaXMuc3BsaXRQYXRoVG9BcnJheShrZXkpXG5cdCAgICAgICAgdmFyIGFic29sdXRlUGF0aFBhcnRzID0gW11cblxuXHQgICAgICAgIC8vIOe7neWvuei3r+W+hFxuXHQgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnLycpIHtcblx0ICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMgPSBbb3B0aW9ucy5jb250ZXh0LnBhdGhbMF1dLmNvbmNhdChcblx0ICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplUGF0aChrZXlQYXRoUGFydHMpXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyDnm7jlr7not6/lvoRcblx0ICAgICAgICAgICAgaWYgKGtleVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGhQYXJ0cyA9IG9wdGlvbnMuY29udGV4dC5wYXRoLnNsaWNlKDApXG5cdCAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGhQYXJ0cy5wb3AoKVxuXHQgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMgPSB0aGlzLm5vcm1hbGl6ZVBhdGgoXG5cdCAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMuY29uY2F0KGtleVBhdGhQYXJ0cylcblx0ICAgICAgICAgICAgICAgIClcblxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAga2V5ID0ga2V5UGF0aFBhcnRzW2tleVBhdGhQYXJ0cy5sZW5ndGggLSAxXVxuXHQgICAgICAgICAgICB2YXIgY3VycmVudENvbnRleHQgPSBvcHRpb25zLmNvbnRleHQucm9vdFxuXHQgICAgICAgICAgICB2YXIgdGVtcGxhdGVDdXJyZW50Q29udGV4dCA9IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVJvb3Rcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhYnNvbHV0ZVBhdGhQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHRbYWJzb2x1dGVQYXRoUGFydHNbaV1dXG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0ID0gdGVtcGxhdGVDdXJyZW50Q29udGV4dFthYnNvbHV0ZVBhdGhQYXJ0c1tpXV1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyDlvJXnlKjnmoTlgLzlt7Lnu4/orqHnrpflpb1cblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZXh0ICYmIChrZXkgaW4gY3VycmVudENvbnRleHQpKSByZXR1cm4gY3VycmVudENvbnRleHRba2V5XVxuXHQgICAgXG5cdCAgICAgICAgICAgIC8vIOWwmuacquiuoeeul++8jOmAkuW9kuW8leeUqOaVsOaNruaooeadv+S4reeahOWxnuaAp1xuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGVDdXJyZW50Q29udGV4dCAmJlxuXHQgICAgICAgICAgICAgICAgKHR5cGVvZiB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0ID09PSAnb2JqZWN0JykgJiZcblx0ICAgICAgICAgICAgICAgIChrZXkgaW4gdGVtcGxhdGVDdXJyZW50Q29udGV4dCkgJiZcblx0ICAgICAgICAgICAgICAgIChvcmlnaW5hbEtleSAhPT0gdGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldKSAvLyBmaXggIzE1IOmBv+WFjeiHquW3seS+nei1luiHquW3sVxuXHQgICAgICAgICAgICApIHtcblx0ICAgICAgICAgICAgICAgIC8vIOWFiOiuoeeul+iiq+W8leeUqOeahOWxnuaAp+WAvFxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldID0gSGFuZGxlci5nZW4odGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldLCBrZXksIHtcblx0ICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogY3VycmVudENvbnRleHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogdGVtcGxhdGVDdXJyZW50Q29udGV4dFxuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0W2tleV1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gY2F0Y2goZXJyKSB7IH1cblxuXHQgICAgICAgIHJldHVybiAnQCcgKyBrZXlQYXRoUGFydHMuam9pbignLycpXG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9ibG9iL21hc3Rlci9zcmMvcGF0aC9zcmMvcGF0aC5qc1xuXHQgICAgbm9ybWFsaXplUGF0aDogZnVuY3Rpb24ocGF0aFBhcnRzKSB7XG5cdCAgICAgICAgdmFyIG5ld1BhdGhQYXJ0cyA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoUGFydHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgc3dpdGNoIChwYXRoUGFydHNbaV0pIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJy4uJzpcblx0ICAgICAgICAgICAgICAgICAgICBuZXdQYXRoUGFydHMucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnLic6XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3UGF0aFBhcnRzLnB1c2gocGF0aFBhcnRzW2ldKVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuZXdQYXRoUGFydHNcblx0ICAgIH0sXG5cdCAgICBzcGxpdFBhdGhUb0FycmF5OiBmdW5jdGlvbihwYXRoKSB7XG5cdCAgICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuXHQgICAgICAgIGlmICghcGFydHNbcGFydHMubGVuZ3RoIC0gMV0pIHBhcnRzID0gcGFydHMuc2xpY2UoMCwgLTEpXG5cdCAgICAgICAgaWYgKCFwYXJ0c1swXSkgcGFydHMgPSBwYXJ0cy5zbGljZSgxKVxuXHQgICAgICAgIHJldHVybiBwYXJ0cztcblx0ICAgIH1cblx0fSlcblxuXHRtb2R1bGUuZXhwb3J0cyA9IEhhbmRsZXJcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIENvbnN0YW50XG5cblx0ICAgIOW4uOmHj+mbhuWQiOOAglxuXHQgKi9cblx0Lypcblx0ICAgIFJFX0tFWVxuXHQgICAgICAgICduYW1lfG1pbi1tYXgnOiB2YWx1ZVxuXHQgICAgICAgICduYW1lfGNvdW50JzogdmFsdWVcblx0ICAgICAgICAnbmFtZXxtaW4tbWF4LmRtaW4tZG1heCc6IHZhbHVlXG5cdCAgICAgICAgJ25hbWV8bWluLW1heC5kY291bnQnOiB2YWx1ZVxuXHQgICAgICAgICduYW1lfGNvdW50LmRtaW4tZG1heCc6IHZhbHVlXG5cdCAgICAgICAgJ25hbWV8Y291bnQuZGNvdW50JzogdmFsdWVcblx0ICAgICAgICAnbmFtZXwrc3RlcCc6IHZhbHVlXG5cblx0ICAgICAgICAxIG5hbWUsIDIgc3RlcCwgMyByYW5nZSBbIG1pbiwgbWF4IF0sIDQgZHJhbmdlIFsgZG1pbiwgZG1heCBdXG5cblx0ICAgIFJFX1BMQUNFSE9MREVSXG5cdCAgICAgICAgcGxhY2Vob2xkZXIoKilcblxuXHQgICAgW+ato+WImeafpeeci+W3peWFt10oaHR0cDovL3d3dy5yZWdleHBlci5jb20vKVxuXG5cdCAgICAjMjYg55Sf5oiQ6KeE5YiZIOaUr+aMgSDotJ/mlbDvvIzkvovlpoIgbnVtYmVyfC0xMDAtMTAwXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgR1VJRDogMSxcblx0ICAgIFJFX0tFWTogLyguKylcXHwoPzpcXCsoXFxkKyl8KFtcXCtcXC1dP1xcZCstP1tcXCtcXC1dP1xcZCopPyg/OlxcLihcXGQrLT9cXGQqKSk/KS8sXG5cdCAgICBSRV9SQU5HRTogLyhbXFwrXFwtXT9cXGQrKS0/KFtcXCtcXC1dP1xcZCspPy8sXG5cdCAgICBSRV9QTEFDRUhPTERFUjogL1xcXFwqQChbXkAjJSYoKVxcP1xcc10rKSg/OlxcKCguKj8pXFwpKT8vZ1xuXHQgICAgLy8gL1xcXFwqQChbXkAjJSYoKVxcP1xcc1xcL1xcLl0rKSg/OlxcKCguKj8pXFwpKT8vZ1xuXHQgICAgLy8gUkVfSU5ERVg6IC9eaW5kZXgkLyxcblx0ICAgIC8vIFJFX0tFWTogL15rZXkkL1xuXHR9XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBVdGlsaXRpZXNcblx0Ki9cblx0dmFyIFV0aWwgPSB7fVxuXG5cdFV0aWwuZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kKCkge1xuXHQgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSxcblx0ICAgICAgICBpID0gMSxcblx0ICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHQgICAgICAgIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY2xvbmVcblxuXHQgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgIHRhcmdldCA9IHRoaXNcblx0ICAgICAgICBpID0gMFxuXHQgICAgfVxuXG5cdCAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1tpXVxuXHQgICAgICAgIGlmICghb3B0aW9ucykgY29udGludWVcblxuXHQgICAgICAgIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG5cdCAgICAgICAgICAgIHNyYyA9IHRhcmdldFtuYW1lXVxuXHQgICAgICAgICAgICBjb3B5ID0gb3B0aW9uc1tuYW1lXVxuXG5cdCAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGNvcHkpIGNvbnRpbnVlXG5cdCAgICAgICAgICAgIGlmIChjb3B5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cblx0ICAgICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb3B5KSB8fCBVdGlsLmlzT2JqZWN0KGNvcHkpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KGNvcHkpKSBjbG9uZSA9IHNyYyAmJiBVdGlsLmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdXG5cdCAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc09iamVjdChjb3B5KSkgY2xvbmUgPSBzcmMgJiYgVXRpbC5pc09iamVjdChzcmMpID8gc3JjIDoge31cblxuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gVXRpbC5leHRlbmQoY2xvbmUsIGNvcHkpXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBjb3B5XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0YXJnZXRcblx0fVxuXG5cdFV0aWwuZWFjaCA9IGZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuXHQgICAgdmFyIGksIGtleVxuXHQgICAgaWYgKHRoaXMudHlwZShvYmopID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmo7IGkrKykge1xuXHQgICAgICAgICAgICBpdGVyYXRvcihpLCBpKVxuXHQgICAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpIHtcblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIGJyZWFrXG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcblx0ICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKSA9PT0gZmFsc2UpIGJyZWFrXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cblx0VXRpbC50eXBlID0gZnVuY3Rpb24gdHlwZShvYmopIHtcblx0ICAgIHJldHVybiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSA/IFN0cmluZyhvYmopIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xcW29iamVjdCAoXFx3KylcXF0vKVsxXS50b0xvd2VyQ2FzZSgpXG5cdH1cblxuXHRVdGlsLmVhY2goJ1N0cmluZyBPYmplY3QgQXJyYXkgUmVnRXhwIEZ1bmN0aW9uJy5zcGxpdCgnICcpLCBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgVXRpbFsnaXMnICsgdmFsdWVdID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICAgICAgcmV0dXJuIFV0aWwudHlwZShvYmopID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpXG5cdCAgICB9XG5cdH0pXG5cblx0VXRpbC5pc09iamVjdE9yQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgcmV0dXJuIFV0aWwuaXNPYmplY3QodmFsdWUpIHx8IFV0aWwuaXNBcnJheSh2YWx1ZSlcblx0fVxuXG5cdFV0aWwuaXNOdW1lcmljID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKVxuXHR9XG5cblx0VXRpbC5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICB2YXIga2V5cyA9IFtdO1xuXHQgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuXHQgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkga2V5cy5wdXNoKGtleSlcblx0ICAgIH1cblx0ICAgIHJldHVybiBrZXlzO1xuXHR9XG5cdFV0aWwudmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICB2YXIgdmFsdWVzID0gW107XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdCAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB2YWx1ZXMucHVzaChvYmpba2V5XSlcblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZXM7XG5cdH1cblxuXHQvKlxuXHQgICAgIyMjIE1vY2suaGVyZWRvYyhmbilcblxuXHQgICAgKiBNb2NrLmhlcmVkb2MoZm4pXG5cblx0ICAgIOS7peebtOinguOAgeWuieWFqOeahOaWueW8j+S5puWGme+8iOWkmuihjO+8iUhUTUwg5qih5p2/44CCXG5cblx0ICAgICoq5L2/55So56S65L6LKirlpoLkuIvmiYDnpLrvvJpcblxuXHQgICAgICAgIHZhciB0cGwgPSBNb2NrLmhlcmVkb2MoZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIC8qIVxuXHQgICAgICAgIHt7ZW1haWx9fXt7YWdlfX1cblx0ICAgICAgICA8IS0tIE1vY2sgeyBcblx0ICAgICAgICAgICAgZW1haWw6ICdARU1BSUwnLFxuXHQgICAgICAgICAgICBhZ2U6ICdASU5UKDEsMTAwKSdcblx0ICAgICAgICB9IC0tPlxuXHQgICAgICAgICAgICAqXFwvXG5cdCAgICAgICAgfSlcblx0ICAgIFxuXHQgICAgKirnm7jlhbPpmIXor7sqKlxuXHQgICAgKiBbQ3JlYXRpbmcgbXVsdGlsaW5lIHN0cmluZ3MgaW4gSmF2YVNjcmlwdF0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MDUxMDcvY3JlYXRpbmctbXVsdGlsaW5lLXN0cmluZ3MtaW4tamF2YXNjcmlwdCnjgIFcblx0Ki9cblx0VXRpbC5oZXJlZG9jID0gZnVuY3Rpb24gaGVyZWRvYyhmbikge1xuXHQgICAgLy8gMS4g56e76Zmk6LW35aeL55qEIGZ1bmN0aW9uKCl7IC8qIVxuXHQgICAgLy8gMi4g56e76Zmk5pyr5bC+55qEICovIH1cblx0ICAgIC8vIDMuIOenu+mZpOi1t+Wni+WSjOacq+WwvueahOepuuagvFxuXHQgICAgcmV0dXJuIGZuLnRvU3RyaW5nKClcblx0ICAgICAgICAucmVwbGFjZSgvXlteXFwvXStcXC9cXCohPy8sICcnKVxuXHQgICAgICAgIC5yZXBsYWNlKC9cXCpcXC9bXlxcL10rJC8sICcnKVxuXHQgICAgICAgIC5yZXBsYWNlKC9eW1xcc1xceEEwXSsvLCAnJykucmVwbGFjZSgvW1xcc1xceEEwXSskLywgJycpIC8vIC50cmltKClcblx0fVxuXG5cdFV0aWwubm9vcCA9IGZ1bmN0aW9uKCkge31cblxuXHRtb2R1bGUuZXhwb3J0cyA9IFV0aWxcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0XHQjIyBQYXJzZXJcblxuXHRcdOino+aekOaVsOaNruaooeadv++8iOWxnuaAp+WQjemDqOWIhu+8ieOAglxuXG5cdFx0KiBQYXJzZXIucGFyc2UoIG5hbWUgKVxuXHRcdFx0XG5cdFx0XHRgYGBqc29uXG5cdFx0XHR7XG5cdFx0XHRcdHBhcmFtZXRlcnM6IFsgbmFtZSwgaW5jLCByYW5nZSwgZGVjaW1hbCBdLFxuXHRcdFx0XHRybmFnZTogWyBtaW4gLCBtYXggXSxcblxuXHRcdFx0XHRtaW46IG1pbixcblx0XHRcdFx0bWF4OiBtYXgsXG5cdFx0XHRcdGNvdW50IDogY291bnQsXG5cblx0XHRcdFx0ZGVjaW1hbDogZGVjaW1hbCxcblx0XHRcdFx0ZG1pbjogZG1pbixcblx0XHRcdFx0ZG1heDogZG1heCxcblx0XHRcdFx0ZGNvdW50OiBkY291bnRcblx0XHRcdH1cblx0XHRcdGBgYFxuXHQgKi9cblxuXHR2YXIgQ29uc3RhbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cblx0LyoganNoaW50IC1XMDQxICovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdHBhcnNlOiBmdW5jdGlvbihuYW1lKSB7XG5cdFx0XHRuYW1lID0gbmFtZSA9PSB1bmRlZmluZWQgPyAnJyA6IChuYW1lICsgJycpXG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gKG5hbWUgfHwgJycpLm1hdGNoKENvbnN0YW50LlJFX0tFWSlcblxuXHRcdFx0dmFyIHJhbmdlID0gcGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzWzNdICYmIHBhcmFtZXRlcnNbM10ubWF0Y2goQ29uc3RhbnQuUkVfUkFOR0UpXG5cdFx0XHR2YXIgbWluID0gcmFuZ2UgJiYgcmFuZ2VbMV0gJiYgcGFyc2VJbnQocmFuZ2VbMV0sIDEwKSAvLyB8fCAxXG5cdFx0XHR2YXIgbWF4ID0gcmFuZ2UgJiYgcmFuZ2VbMl0gJiYgcGFyc2VJbnQocmFuZ2VbMl0sIDEwKSAvLyB8fCAxXG5cdFx0XHRcdC8vIHJlcGVhdCB8fCBtaW4tbWF4IHx8IDFcblx0XHRcdFx0Ly8gdmFyIGNvdW50ID0gcmFuZ2UgPyAhcmFuZ2VbMl0gJiYgcGFyc2VJbnQocmFuZ2VbMV0sIDEwKSB8fCBSYW5kb20uaW50ZWdlcihtaW4sIG1heCkgOiAxXG5cdFx0XHR2YXIgY291bnQgPSByYW5nZSA/ICFyYW5nZVsyXSA/IHBhcnNlSW50KHJhbmdlWzFdLCAxMCkgOiBSYW5kb20uaW50ZWdlcihtaW4sIG1heCkgOiB1bmRlZmluZWRcblxuXHRcdFx0dmFyIGRlY2ltYWwgPSBwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnNbNF0gJiYgcGFyYW1ldGVyc1s0XS5tYXRjaChDb25zdGFudC5SRV9SQU5HRSlcblx0XHRcdHZhciBkbWluID0gZGVjaW1hbCAmJiBkZWNpbWFsWzFdICYmIHBhcnNlSW50KGRlY2ltYWxbMV0sIDEwKSAvLyB8fCAwLFxuXHRcdFx0dmFyIGRtYXggPSBkZWNpbWFsICYmIGRlY2ltYWxbMl0gJiYgcGFyc2VJbnQoZGVjaW1hbFsyXSwgMTApIC8vIHx8IDAsXG5cdFx0XHRcdC8vIGludCB8fCBkbWluLWRtYXggfHwgMFxuXHRcdFx0dmFyIGRjb3VudCA9IGRlY2ltYWwgPyAhZGVjaW1hbFsyXSAmJiBwYXJzZUludChkZWNpbWFsWzFdLCAxMCkgfHwgUmFuZG9tLmludGVnZXIoZG1pbiwgZG1heCkgOiB1bmRlZmluZWRcblxuXHRcdFx0dmFyIHJlc3VsdCA9IHtcblx0XHRcdFx0Ly8gMSBuYW1lLCAyIGluYywgMyByYW5nZSwgNCBkZWNpbWFsXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG5cdFx0XHRcdC8vIDEgbWluLCAyIG1heFxuXHRcdFx0XHRyYW5nZTogcmFuZ2UsXG5cdFx0XHRcdG1pbjogbWluLFxuXHRcdFx0XHRtYXg6IG1heCxcblx0XHRcdFx0Ly8gbWluLW1heFxuXHRcdFx0XHRjb3VudDogY291bnQsXG5cdFx0XHRcdC8vIOaYr+WQpuaciSBkZWNpbWFsXG5cdFx0XHRcdGRlY2ltYWw6IGRlY2ltYWwsXG5cdFx0XHRcdGRtaW46IGRtaW4sXG5cdFx0XHRcdGRtYXg6IGRtYXgsXG5cdFx0XHRcdC8vIGRtaW4tZGltYXhcblx0XHRcdFx0ZGNvdW50OiBkY291bnRcblx0XHRcdH1cblxuXHRcdFx0Zm9yICh2YXIgciBpbiByZXN1bHQpIHtcblx0XHRcdFx0aWYgKHJlc3VsdFtyXSAhPSB1bmRlZmluZWQpIHJldHVybiByZXN1bHRcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHt9XG5cdFx0fVxuXHR9XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdCAgICAjIyBNb2NrLlJhbmRvbVxuXHQgICAgXG5cdCAgICDlt6XlhbfnsbvvvIznlKjkuo7nlJ/miJDlkITnp43pmo/mnLrmlbDmja7jgIJcblx0Ki9cblxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblxuXHR2YXIgUmFuZG9tID0ge1xuXHQgICAgZXh0ZW5kOiBVdGlsLmV4dGVuZFxuXHR9XG5cblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDYpKVxuXHRSYW5kb20uZXh0ZW5kKF9fd2VicGFja19yZXF1aXJlX18oNykpXG5cdFJhbmRvbS5leHRlbmQoX193ZWJwYWNrX3JlcXVpcmVfXyg4KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSlcblxuXHRtb2R1bGUuZXhwb3J0cyA9IFJhbmRvbVxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxuXHQgICAgIyMgQmFzaWNzXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5biD5bCU5YC844CCXG5cdCAgICBib29sZWFuOiBmdW5jdGlvbihtaW4sIG1heCwgY3VyKSB7XG5cdCAgICAgICAgaWYgKGN1ciAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIG1pbiA9IHR5cGVvZiBtaW4gIT09ICd1bmRlZmluZWQnICYmICFpc05hTihtaW4pID8gcGFyc2VJbnQobWluLCAxMCkgOiAxXG5cdCAgICAgICAgICAgIG1heCA9IHR5cGVvZiBtYXggIT09ICd1bmRlZmluZWQnICYmICFpc05hTihtYXgpID8gcGFyc2VJbnQobWF4LCAxMCkgOiAxXG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpID4gMS4wIC8gKG1pbiArIG1heCkgKiBtaW4gPyAhY3VyIDogY3VyXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPj0gMC41XG5cdCAgICB9LFxuXHQgICAgYm9vbDogZnVuY3Rpb24obWluLCBtYXgsIGN1cikge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmJvb2xlYW4obWluLCBtYXgsIGN1cilcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrpmo/mnLrnmoToh6rnhLbmlbDvvIjlpKfkuo7nrYnkuo4gMCDnmoTmlbTmlbDvvInjgIJcblx0ICAgIG5hdHVyYWw6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgbWluID0gdHlwZW9mIG1pbiAhPT0gJ3VuZGVmaW5lZCcgPyBwYXJzZUludChtaW4sIDEwKSA6IDBcblx0ICAgICAgICBtYXggPSB0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1heCwgMTApIDogOTAwNzE5OTI1NDc0MDk5MiAvLyAyXjUzXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pblxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOaVtOaVsOOAglxuXHQgICAgaW50ZWdlcjogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICBtaW4gPSB0eXBlb2YgbWluICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1pbiwgMTApIDogLTkwMDcxOTkyNTQ3NDA5OTJcblx0ICAgICAgICBtYXggPSB0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1heCwgMTApIDogOTAwNzE5OTI1NDc0MDk5MiAvLyAyXjUzXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pblxuXHQgICAgfSxcblx0ICAgIGludDogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5pbnRlZ2VyKG1pbiwgbWF4KVxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOa1rueCueaVsOOAglxuXHQgICAgZmxvYXQ6IGZ1bmN0aW9uKG1pbiwgbWF4LCBkbWluLCBkbWF4KSB7XG5cdCAgICAgICAgZG1pbiA9IGRtaW4gPT09IHVuZGVmaW5lZCA/IDAgOiBkbWluXG5cdCAgICAgICAgZG1pbiA9IE1hdGgubWF4KE1hdGgubWluKGRtaW4sIDE3KSwgMClcblx0ICAgICAgICBkbWF4ID0gZG1heCA9PT0gdW5kZWZpbmVkID8gMTcgOiBkbWF4XG5cdCAgICAgICAgZG1heCA9IE1hdGgubWF4KE1hdGgubWluKGRtYXgsIDE3KSwgMClcblx0ICAgICAgICB2YXIgcmV0ID0gdGhpcy5pbnRlZ2VyKG1pbiwgbWF4KSArICcuJztcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgZGNvdW50ID0gdGhpcy5uYXR1cmFsKGRtaW4sIGRtYXgpOyBpIDwgZGNvdW50OyBpKyspIHtcblx0ICAgICAgICAgICAgcmV0ICs9IChcblx0ICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS9jeS4jeiDveS4uiAw77ya5aaC5p6c5pyA5ZCO5LiA5L2N5Li6IDDvvIzkvJrooqsgSlMg5byV5pOO5b+955Wl5o6J44CCXG5cdCAgICAgICAgICAgICAgICAoaSA8IGRjb3VudCAtIDEpID8gdGhpcy5jaGFyYWN0ZXIoJ251bWJlcicpIDogdGhpcy5jaGFyYWN0ZXIoJzEyMzQ1Njc4OScpXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmV0LCAxMClcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrpmo/mnLrlrZfnrKbjgIJcblx0ICAgIGNoYXJhY3RlcjogZnVuY3Rpb24ocG9vbCkge1xuXHQgICAgICAgIHZhciBwb29scyA9IHtcblx0ICAgICAgICAgICAgbG93ZXI6ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsXG5cdCAgICAgICAgICAgIHVwcGVyOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonLFxuXHQgICAgICAgICAgICBudW1iZXI6ICcwMTIzNDU2Nzg5Jyxcblx0ICAgICAgICAgICAgc3ltYm9sOiAnIUAjJCVeJiooKVtdJ1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwb29scy5hbHBoYSA9IHBvb2xzLmxvd2VyICsgcG9vbHMudXBwZXJcblx0ICAgICAgICBwb29sc1sndW5kZWZpbmVkJ10gPSBwb29scy5sb3dlciArIHBvb2xzLnVwcGVyICsgcG9vbHMubnVtYmVyICsgcG9vbHMuc3ltYm9sXG5cblx0ICAgICAgICBwb29sID0gcG9vbHNbKCcnICsgcG9vbCkudG9Mb3dlckNhc2UoKV0gfHwgcG9vbFxuXHQgICAgICAgIHJldHVybiBwb29sLmNoYXJBdCh0aGlzLm5hdHVyYWwoMCwgcG9vbC5sZW5ndGggLSAxKSlcblx0ICAgIH0sXG5cdCAgICBjaGFyOiBmdW5jdGlvbihwb29sKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyKHBvb2wpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py65a2X56ym5Liy44CCXG5cdCAgICBzdHJpbmc6IGZ1bmN0aW9uKHBvb2wsIG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlblxuXHQgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDA6IC8vICgpXG5cdCAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLm5hdHVyYWwoMywgNylcblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgMTogLy8gKCBsZW5ndGggKVxuXHQgICAgICAgICAgICAgICAgbGVuID0gcG9vbFxuXHQgICAgICAgICAgICAgICAgcG9vbCA9IHVuZGVmaW5lZFxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgLy8gKCBwb29sLCBsZW5ndGggKVxuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gbWluXG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vICggbWluLCBtYXggKVxuXHQgICAgICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMubmF0dXJhbChwb29sLCBtaW4pXG5cdCAgICAgICAgICAgICAgICAgICAgcG9vbCA9IHVuZGVmaW5lZFxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKG1pbiwgbWF4KVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgdGV4dCA9ICcnXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICB0ZXh0ICs9IHRoaXMuY2hhcmFjdGVyKHBvb2wpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHRleHRcblx0ICAgIH0sXG5cdCAgICBzdHI6IGZ1bmN0aW9uKCAvKnBvb2wsIG1pbiwgbWF4Ki8gKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrmlbTlnovmlbDnu4TjgIJcblx0ICAgIHJhbmdlOiBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuXHQgICAgICAgIC8vIHJhbmdlKCBzdG9wIClcblx0ICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxKSB7XG5cdCAgICAgICAgICAgIHN0b3AgPSBzdGFydCB8fCAwO1xuXHQgICAgICAgICAgICBzdGFydCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJhbmdlKCBzdGFydCwgc3RvcCApXG5cdCAgICAgICAgc3RlcCA9IGFyZ3VtZW50c1syXSB8fCAxO1xuXG5cdCAgICAgICAgc3RhcnQgPSArc3RhcnRcblx0ICAgICAgICBzdG9wID0gK3N0b3Bcblx0ICAgICAgICBzdGVwID0gK3N0ZXBcblxuXHQgICAgICAgIHZhciBsZW4gPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG5cdCAgICAgICAgdmFyIGlkeCA9IDA7XG5cdCAgICAgICAgdmFyIHJhbmdlID0gbmV3IEFycmF5KGxlbik7XG5cblx0ICAgICAgICB3aGlsZSAoaWR4IDwgbGVuKSB7XG5cdCAgICAgICAgICAgIHJhbmdlW2lkeCsrXSA9IHN0YXJ0O1xuXHQgICAgICAgICAgICBzdGFydCArPSBzdGVwO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiByYW5nZTtcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxuXHQgICAgIyMgRGF0ZVxuXHQqL1xuXHR2YXIgcGF0dGVybkxldHRlcnMgPSB7XG5cdCAgICB5eXl5OiAnZ2V0RnVsbFllYXInLFxuXHQgICAgeXk6IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICByZXR1cm4gKCcnICsgZGF0ZS5nZXRGdWxsWWVhcigpKS5zbGljZSgyKVxuXHQgICAgfSxcblx0ICAgIHk6ICd5eScsXG5cblx0ICAgIE1NOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIG0gPSBkYXRlLmdldE1vbnRoKCkgKyAxXG5cdCAgICAgICAgcmV0dXJuIG0gPCAxMCA/ICcwJyArIG0gOiBtXG5cdCAgICB9LFxuXHQgICAgTTogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxXG5cdCAgICB9LFxuXG5cdCAgICBkZDogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKClcblx0ICAgICAgICByZXR1cm4gZCA8IDEwID8gJzAnICsgZCA6IGRcblx0ICAgIH0sXG5cdCAgICBkOiAnZ2V0RGF0ZScsXG5cblx0ICAgIEhIOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKClcblx0ICAgICAgICByZXR1cm4gaCA8IDEwID8gJzAnICsgaCA6IGhcblx0ICAgIH0sXG5cdCAgICBIOiAnZ2V0SG91cnMnLFxuXHQgICAgaGg6IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyXG5cdCAgICAgICAgcmV0dXJuIGggPCAxMCA/ICcwJyArIGggOiBoXG5cdCAgICB9LFxuXHQgICAgaDogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCkgJSAxMlxuXHQgICAgfSxcblxuXHQgICAgbW06IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICB2YXIgbSA9IGRhdGUuZ2V0TWludXRlcygpXG5cdCAgICAgICAgcmV0dXJuIG0gPCAxMCA/ICcwJyArIG0gOiBtXG5cdCAgICB9LFxuXHQgICAgbTogJ2dldE1pbnV0ZXMnLFxuXG5cdCAgICBzczogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKClcblx0ICAgICAgICByZXR1cm4gcyA8IDEwID8gJzAnICsgcyA6IHNcblx0ICAgIH0sXG5cdCAgICBzOiAnZ2V0U2Vjb25kcycsXG5cblx0ICAgIFNTOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIG1zID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKVxuXHQgICAgICAgIHJldHVybiBtcyA8IDEwICYmICcwMCcgKyBtcyB8fCBtcyA8IDEwMCAmJiAnMCcgKyBtcyB8fCBtc1xuXHQgICAgfSxcblx0ICAgIFM6ICdnZXRNaWxsaXNlY29uZHMnLFxuXG5cdCAgICBBOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gJ0FNJyA6ICdQTSdcblx0ICAgIH0sXG5cdCAgICBhOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gJ2FtJyA6ICdwbSdcblx0ICAgIH0sXG5cdCAgICBUOiAnZ2V0VGltZSdcblx0fVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIOaXpeacn+WNoOS9jeespumbhuWQiOOAglxuXHQgICAgX3BhdHRlcm5MZXR0ZXJzOiBwYXR0ZXJuTGV0dGVycyxcblx0ICAgIC8vIOaXpeacn+WNoOS9jeespuato+WImeOAglxuXHQgICAgX3Jmb3JtYXQ6IG5ldyBSZWdFeHAoKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciByZSA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSBpbiBwYXR0ZXJuTGV0dGVycykgcmUucHVzaChpKVxuXHQgICAgICAgIHJldHVybiAnKCcgKyByZS5qb2luKCd8JykgKyAnKSdcblx0ICAgIH0pKCksICdnJyksXG5cdCAgICAvLyDmoLzlvI/ljJbml6XmnJ/jgIJcblx0ICAgIF9mb3JtYXREYXRlOiBmdW5jdGlvbihkYXRlLCBmb3JtYXQpIHtcblx0ICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UodGhpcy5fcmZvcm1hdCwgZnVuY3Rpb24gY3JlYXROZXdTdWJTdHJpbmcoJDAsIGZsYWcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXR0ZXJuTGV0dGVyc1tmbGFnXSA9PT0gJ2Z1bmN0aW9uJyA/IHBhdHRlcm5MZXR0ZXJzW2ZsYWddKGRhdGUpIDpcblx0ICAgICAgICAgICAgICAgIHBhdHRlcm5MZXR0ZXJzW2ZsYWddIGluIHBhdHRlcm5MZXR0ZXJzID8gY3JlYXROZXdTdWJTdHJpbmcoJDAsIHBhdHRlcm5MZXR0ZXJzW2ZsYWddKSA6XG5cdCAgICAgICAgICAgICAgICBkYXRlW3BhdHRlcm5MZXR0ZXJzW2ZsYWddXSgpXG5cdCAgICAgICAgfSlcblx0ICAgIH0sXG5cdCAgICAvLyDnlJ/miJDkuIDkuKrpmo/mnLrnmoQgRGF0ZSDlr7nosaHjgIJcblx0ICAgIF9yYW5kb21EYXRlOiBmdW5jdGlvbihtaW4sIG1heCkgeyAvLyBtaW4sIG1heFxuXHQgICAgICAgIG1pbiA9IG1pbiA9PT0gdW5kZWZpbmVkID8gbmV3IERhdGUoMCkgOiBtaW5cblx0ICAgICAgICBtYXggPSBtYXggPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBtYXhcblx0ICAgICAgICByZXR1cm4gbmV3IERhdGUoTWF0aC5yYW5kb20oKSAqIChtYXguZ2V0VGltZSgpIC0gbWluLmdldFRpbWUoKSkpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5pel5pyf5a2X56ym5Liy44CCXG5cdCAgICBkYXRlOiBmdW5jdGlvbihmb3JtYXQpIHtcblx0ICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ3l5eXktTU0tZGQnXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdERhdGUodGhpcy5fcmFuZG9tRGF0ZSgpLCBmb3JtYXQpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5pe26Ze05a2X56ym5Liy44CCXG5cdCAgICB0aW1lOiBmdW5jdGlvbihmb3JtYXQpIHtcblx0ICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ0hIOm1tOnNzJ1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXREYXRlKHRoaXMuX3JhbmRvbURhdGUoKSwgZm9ybWF0KVxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOaXpeacn+WSjOaXtumXtOWtl+espuS4suOAglxuXHQgICAgZGF0ZXRpbWU6IGZ1bmN0aW9uKGZvcm1hdCkge1xuXHQgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAneXl5eS1NTS1kZCBISDptbTpzcydcblx0ICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0RGF0ZSh0aGlzLl9yYW5kb21EYXRlKCksIGZvcm1hdClcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57lvZPliY3nmoTml6XmnJ/lkozml7bpl7TlrZfnrKbkuLLjgIJcblx0ICAgIG5vdzogZnVuY3Rpb24odW5pdCwgZm9ybWF0KSB7XG5cdCAgICAgICAgLy8gbm93KHVuaXQpIG5vdyhmb3JtYXQpXG5cdCAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICAgICAgLy8gbm93KGZvcm1hdClcblx0ICAgICAgICAgICAgaWYgKCEveWVhcnxtb250aHxkYXl8aG91cnxtaW51dGV8c2Vjb25kfHdlZWsvLnRlc3QodW5pdCkpIHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuaXRcblx0ICAgICAgICAgICAgICAgIHVuaXQgPSAnJ1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHVuaXQgPSAodW5pdCB8fCAnJykudG9Mb3dlckNhc2UoKVxuXHQgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAneXl5eS1NTS1kZCBISDptbTpzcydcblxuXHQgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKVxuXG5cdCAgICAgICAgLyoganNoaW50IC1XMDg2ICovXG5cdCAgICAgICAgLy8g5Y+C6ICD6IeqIGh0dHA6Ly9tb21lbnRqcy5jbi9kb2NzLyMvbWFuaXB1bGF0aW5nL3N0YXJ0LW9mL1xuXHQgICAgICAgIHN3aXRjaCAodW5pdCkge1xuXHQgICAgICAgICAgICBjYXNlICd5ZWFyJzpcblx0ICAgICAgICAgICAgICAgIGRhdGUuc2V0TW9udGgoMClcblx0ICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXREYXRlKDEpXG5cdCAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuXHQgICAgICAgICAgICBjYXNlICdkYXknOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXRIb3VycygwKVxuXHQgICAgICAgICAgICBjYXNlICdob3VyJzpcblx0ICAgICAgICAgICAgICAgIGRhdGUuc2V0TWludXRlcygwKVxuXHQgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKDApXG5cdCAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG5cdCAgICAgICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kcygwKVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcblx0ICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG5cdCAgICAgICAgICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSBkYXRlLmdldERheSgpKVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXREYXRlKGRhdGUsIGZvcm1hdClcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24obW9kdWxlKSB7LyogZ2xvYmFsIGRvY3VtZW50ICAqL1xuXHQvKlxuXHQgICAgIyMgSW1hZ2Vcblx0Ki9cblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgICAvLyDluLjop4HnmoTlub/lkYrlrr3pq5hcblx0ICAgIF9hZFNpemU6IFtcblx0ICAgICAgICAnMzAweDI1MCcsICcyNTB4MjUwJywgJzI0MHg0MDAnLCAnMzM2eDI4MCcsICcxODB4MTUwJyxcblx0ICAgICAgICAnNzIweDMwMCcsICc0Njh4NjAnLCAnMjM0eDYwJywgJzg4eDMxJywgJzEyMHg5MCcsXG5cdCAgICAgICAgJzEyMHg2MCcsICcxMjB4MjQwJywgJzEyNXgxMjUnLCAnNzI4eDkwJywgJzE2MHg2MDAnLFxuXHQgICAgICAgICcxMjB4NjAwJywgJzMwMHg2MDAnXG5cdCAgICBdLFxuXHQgICAgLy8g5bi46KeB55qE5bGP5bmV5a696auYXG5cdCAgICBfc2NyZWVuU2l6ZTogW1xuXHQgICAgICAgICczMjB4MjAwJywgJzMyMHgyNDAnLCAnNjQweDQ4MCcsICc4MDB4NDgwJywgJzgwMHg0ODAnLFxuXHQgICAgICAgICcxMDI0eDYwMCcsICcxMDI0eDc2OCcsICcxMjgweDgwMCcsICcxNDQweDkwMCcsICcxOTIweDEyMDAnLFxuXHQgICAgICAgICcyNTYweDE2MDAnXG5cdCAgICBdLFxuXHQgICAgLy8g5bi46KeB55qE6KeG6aKR5a696auYXG5cdCAgICBfdmlkZW9TaXplOiBbJzcyMHg0ODAnLCAnNzY4eDU3NicsICcxMjgweDcyMCcsICcxOTIweDEwODAnXSxcblx0ICAgIC8qXG5cdCAgICAgICAg55Sf5oiQ5LiA5Liq6ZqP5py655qE5Zu+54mH5Zyw5Z2A44CCXG5cblx0ICAgICAgICDmm7/ku6Plm77niYfmupBcblx0ICAgICAgICAgICAgaHR0cDovL2Zwb2ltZy5jb20vXG5cdCAgICAgICAg5Y+C6ICD6IeqIFxuXHQgICAgICAgICAgICBodHRwOi8vcmVuc2FubmluZy5pdGV5ZS5jb20vYmxvZy8xOTMzMzEwXG5cdCAgICAgICAgICAgIGh0dHA6Ly9jb2RlLnR1dHNwbHVzLmNvbS9hcnRpY2xlcy90aGUtdG9wLTgtcGxhY2Vob2xkZXJzLWZvci13ZWItZGVzaWduZXJzLS1uZXQtMTk0ODVcblx0ICAgICovXG5cdCAgICBpbWFnZTogZnVuY3Rpb24oc2l6ZSwgYmFja2dyb3VuZCwgZm9yZWdyb3VuZCwgZm9ybWF0LCB0ZXh0KSB7XG5cdCAgICAgICAgLy8gUmFuZG9tLmltYWdlKCBzaXplLCBiYWNrZ3JvdW5kLCBmb3JlZ3JvdW5kLCB0ZXh0IClcblx0ICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuXHQgICAgICAgICAgICB0ZXh0ID0gZm9ybWF0XG5cdCAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZFxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBSYW5kb20uaW1hZ2UoIHNpemUsIGJhY2tncm91bmQsIHRleHQgKVxuXHQgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG5cdCAgICAgICAgICAgIHRleHQgPSBmb3JlZ3JvdW5kXG5cdCAgICAgICAgICAgIGZvcmVncm91bmQgPSB1bmRlZmluZWRcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmFuZG9tLmltYWdlKClcblx0ICAgICAgICBpZiAoIXNpemUpIHNpemUgPSB0aGlzLnBpY2sodGhpcy5fYWRTaXplKVxuXG5cdCAgICAgICAgaWYgKGJhY2tncm91bmQgJiYgfmJhY2tncm91bmQuaW5kZXhPZignIycpKSBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZC5zbGljZSgxKVxuXHQgICAgICAgIGlmIChmb3JlZ3JvdW5kICYmIH5mb3JlZ3JvdW5kLmluZGV4T2YoJyMnKSkgZm9yZWdyb3VuZCA9IGZvcmVncm91bmQuc2xpY2UoMSlcblxuXHQgICAgICAgIC8vIGh0dHA6Ly9kdW1teWltYWdlLmNvbS82MDB4NDAwL2NjMDBjYy80NzAwNDcucG5nJnRleHQ9aGVsbG9cblx0ICAgICAgICByZXR1cm4gJ2h0dHA6Ly9kdW1teWltYWdlLmNvbS8nICsgc2l6ZSArXG5cdCAgICAgICAgICAgIChiYWNrZ3JvdW5kID8gJy8nICsgYmFja2dyb3VuZCA6ICcnKSArXG5cdCAgICAgICAgICAgIChmb3JlZ3JvdW5kID8gJy8nICsgZm9yZWdyb3VuZCA6ICcnKSArXG5cdCAgICAgICAgICAgIChmb3JtYXQgPyAnLicgKyBmb3JtYXQgOiAnJykgK1xuXHQgICAgICAgICAgICAodGV4dCA/ICcmdGV4dD0nICsgdGV4dCA6ICcnKVxuXHQgICAgfSxcblx0ICAgIGltZzogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHQgICAgfSxcblxuXHQgICAgLypcblx0ICAgICAgICBCcmFuZENvbG9yc1xuXHQgICAgICAgIGh0dHA6Ly9icmFuZGNvbG9ycy5uZXQvXG5cdCAgICAgICAgQSBjb2xsZWN0aW9uIG9mIG1ham9yIGJyYW5kIGNvbG9yIGNvZGVzIGN1cmF0ZWQgYnkgR2FsZW4gR2lkbWFuLlxuXHQgICAgICAgIOWkp+eJjOWFrOWPuOeahOminOiJsumbhuWQiFxuXG5cdCAgICAgICAgLy8g6I635Y+W5ZOB54mM5ZKM6aKc6ImyXG5cdCAgICAgICAgJCgnaDInKS5lYWNoKGZ1bmN0aW9uKGluZGV4LCBpdGVtKXtcblx0ICAgICAgICAgICAgaXRlbSA9ICQoaXRlbSlcblx0ICAgICAgICAgICAgY29uc29sZS5sb2coJ1xcJycgKyBpdGVtLnRleHQoKSArICdcXCcnLCAnOicsICdcXCcnICsgaXRlbS5uZXh0KCkudGV4dCgpICsgJ1xcJycsICcsJylcblx0ICAgICAgICB9KVxuXHQgICAgKi9cblx0ICAgIF9icmFuZENvbG9yczoge1xuXHQgICAgICAgICc0b3JtYXQnOiAnI2ZiMGEyYScsXG5cdCAgICAgICAgJzUwMHB4JzogJyMwMmFkZWEnLFxuXHQgICAgICAgICdBYm91dC5tZSAoYmx1ZSknOiAnIzAwNDA1ZCcsXG5cdCAgICAgICAgJ0Fib3V0Lm1lICh5ZWxsb3cpJzogJyNmZmNjMzMnLFxuXHQgICAgICAgICdBZGR2b2NhdGUnOiAnI2ZmNjEzOCcsXG5cdCAgICAgICAgJ0Fkb2JlJzogJyNmZjAwMDAnLFxuXHQgICAgICAgICdBaW0nOiAnI2ZjZDIwYicsXG5cdCAgICAgICAgJ0FtYXpvbic6ICcjZTQ3OTExJyxcblx0ICAgICAgICAnQW5kcm9pZCc6ICcjYTRjNjM5Jyxcblx0ICAgICAgICAnQW5naWVcXCdzIExpc3QnOiAnIzdmYmIwMCcsXG5cdCAgICAgICAgJ0FPTCc6ICcjMDA2MGEzJyxcblx0ICAgICAgICAnQXRsYXNzaWFuJzogJyMwMDMzNjYnLFxuXHQgICAgICAgICdCZWhhbmNlJzogJyMwNTNlZmYnLFxuXHQgICAgICAgICdCaWcgQ2FydGVsJzogJyM5N2I1MzgnLFxuXHQgICAgICAgICdiaXRseSc6ICcjZWU2MTIzJyxcblx0ICAgICAgICAnQmxvZ2dlcic6ICcjZmM0ZjA4Jyxcblx0ICAgICAgICAnQm9laW5nJzogJyMwMDM5YTYnLFxuXHQgICAgICAgICdCb29raW5nLmNvbSc6ICcjMDAzNTgwJyxcblx0ICAgICAgICAnQ2FyYm9ubWFkZSc6ICcjNjEzODU0Jyxcblx0ICAgICAgICAnQ2hlZGRhcic6ICcjZmY3MjQzJyxcblx0ICAgICAgICAnQ29kZSBTY2hvb2wnOiAnIzNkNDk0NCcsXG5cdCAgICAgICAgJ0RlbGljaW91cyc6ICcjMjA1Y2MwJyxcblx0ICAgICAgICAnRGVsbCc6ICcjMzI4N2MxJyxcblx0ICAgICAgICAnRGVzaWdubW9vJzogJyNlNTRhNGYnLFxuXHQgICAgICAgICdEZXZpYW50YXJ0JzogJyM0ZTYyNTInLFxuXHQgICAgICAgICdEZXNpZ25lciBOZXdzJzogJyMyZDcyZGEnLFxuXHQgICAgICAgICdEZXZvdXInOiAnI2ZkMDAwMScsXG5cdCAgICAgICAgJ0RFV0FMVCc6ICcjZmViZDE3Jyxcblx0ICAgICAgICAnRGlzcXVzIChibHVlKSc6ICcjNTlhM2ZjJyxcblx0ICAgICAgICAnRGlzcXVzIChvcmFuZ2UpJzogJyNkYjcxMzInLFxuXHQgICAgICAgICdEcmliYmJsZSc6ICcjZWE0Yzg5Jyxcblx0ICAgICAgICAnRHJvcGJveCc6ICcjM2Q5YWU4Jyxcblx0ICAgICAgICAnRHJ1cGFsJzogJyMwYzc2YWInLFxuXHQgICAgICAgICdEdW5rZWQnOiAnIzJhMzIzYScsXG5cdCAgICAgICAgJ2VCYXknOiAnIzg5YzUwNycsXG5cdCAgICAgICAgJ0VtYmVyJzogJyNmMDVlMWInLFxuXHQgICAgICAgICdFbmdhZGdldCc6ICcjMDBiZGY2Jyxcblx0ICAgICAgICAnRW52YXRvJzogJyM1MjgwMzYnLFxuXHQgICAgICAgICdFdHN5JzogJyNlYjZkMjAnLFxuXHQgICAgICAgICdFdmVybm90ZSc6ICcjNWJhNTI1Jyxcblx0ICAgICAgICAnRmFiLmNvbSc6ICcjZGQwMDE3Jyxcblx0ICAgICAgICAnRmFjZWJvb2snOiAnIzNiNTk5OCcsXG5cdCAgICAgICAgJ0ZpcmVmb3gnOiAnI2U2NjAwMCcsXG5cdCAgICAgICAgJ0ZsaWNrciAoYmx1ZSknOiAnIzAwNjNkYycsXG5cdCAgICAgICAgJ0ZsaWNrciAocGluayknOiAnI2ZmMDA4NCcsXG5cdCAgICAgICAgJ0ZvcnJzdCc6ICcjNWI5YTY4Jyxcblx0ICAgICAgICAnRm91cnNxdWFyZSc6ICcjMjVhMGNhJyxcblx0ICAgICAgICAnR2FybWluJzogJyMwMDdjYzMnLFxuXHQgICAgICAgICdHZXRHbHVlJzogJyMyZDc1YTInLFxuXHQgICAgICAgICdHaW1tZWJhcic6ICcjZjcwMDc4Jyxcblx0ICAgICAgICAnR2l0SHViJzogJyMxNzE1MTUnLFxuXHQgICAgICAgICdHb29nbGUgQmx1ZSc6ICcjMDE0MGNhJyxcblx0ICAgICAgICAnR29vZ2xlIEdyZWVuJzogJyMxNmE2MWUnLFxuXHQgICAgICAgICdHb29nbGUgUmVkJzogJyNkZDE4MTInLFxuXHQgICAgICAgICdHb29nbGUgWWVsbG93JzogJyNmY2NhMDMnLFxuXHQgICAgICAgICdHb29nbGUrJzogJyNkZDRiMzknLFxuXHQgICAgICAgICdHcm9vdmVzaGFyayc6ICcjZjc3ZjAwJyxcblx0ICAgICAgICAnR3JvdXBvbic6ICcjODJiNTQ4Jyxcblx0ICAgICAgICAnSGFja2VyIE5ld3MnOiAnI2ZmNjYwMCcsXG5cdCAgICAgICAgJ0hlbGxvV2FsbGV0JzogJyMwMDg1Y2EnLFxuXHQgICAgICAgICdIZXJva3UgKGxpZ2h0KSc6ICcjYzdjNWU2Jyxcblx0ICAgICAgICAnSGVyb2t1IChkYXJrKSc6ICcjNjU2N2E1Jyxcblx0ICAgICAgICAnSG9vdFN1aXRlJzogJyMwMDMzNjYnLFxuXHQgICAgICAgICdIb3V6eic6ICcjNzNiYTM3Jyxcblx0ICAgICAgICAnSFRNTDUnOiAnI2VjNjIzMScsXG5cdCAgICAgICAgJ0lLRUEnOiAnI2ZmY2MzMycsXG5cdCAgICAgICAgJ0lNRGInOiAnI2YzY2UxMycsXG5cdCAgICAgICAgJ0luc3RhZ3JhbSc6ICcjM2Y3MjliJyxcblx0ICAgICAgICAnSW50ZWwnOiAnIzAwNzFjNScsXG5cdCAgICAgICAgJ0ludHVpdCc6ICcjMzY1ZWJmJyxcblx0ICAgICAgICAnS2lja3N0YXJ0ZXInOiAnIzc2Y2MxZScsXG5cdCAgICAgICAgJ2tpcHB0JzogJyNlMDM1MDAnLFxuXHQgICAgICAgICdLb2RlcnknOiAnIzAwYWY4MScsXG5cdCAgICAgICAgJ0xhc3RGTSc6ICcjYzMwMDBkJyxcblx0ICAgICAgICAnTGlua2VkSW4nOiAnIzBlNzZhOCcsXG5cdCAgICAgICAgJ0xpdmVzdHJlYW0nOiAnI2NmMDAwNScsXG5cdCAgICAgICAgJ0x1bW8nOiAnIzU3NjM5NicsXG5cdCAgICAgICAgJ01peHBhbmVsJzogJyNhMDg2ZDMnLFxuXHQgICAgICAgICdNZWV0dXAnOiAnI2U1MTkzNycsXG5cdCAgICAgICAgJ05va2lhJzogJyMxODM2OTMnLFxuXHQgICAgICAgICdOVklESUEnOiAnIzc2YjkwMCcsXG5cdCAgICAgICAgJ09wZXJhJzogJyNjYzBmMTYnLFxuXHQgICAgICAgICdQYXRoJzogJyNlNDFmMTEnLFxuXHQgICAgICAgICdQYXlQYWwgKGRhcmspJzogJyMxZTQ3N2EnLFxuXHQgICAgICAgICdQYXlQYWwgKGxpZ2h0KSc6ICcjM2I3YmJmJyxcblx0ICAgICAgICAnUGluYm9hcmQnOiAnIzAwMDBlNicsXG5cdCAgICAgICAgJ1BpbnRlcmVzdCc6ICcjYzgyMzJjJyxcblx0ICAgICAgICAnUGxheVN0YXRpb24nOiAnIzY2NWNiZScsXG5cdCAgICAgICAgJ1BvY2tldCc6ICcjZWU0MDU2Jyxcblx0ICAgICAgICAnUHJlemknOiAnIzMxOGJmZicsXG5cdCAgICAgICAgJ1B1c2hhJzogJyMwZjcxYjQnLFxuXHQgICAgICAgICdRdW9yYSc6ICcjYTgyNDAwJyxcblx0ICAgICAgICAnUVVPVEUuZm0nOiAnIzY2Y2VmZicsXG5cdCAgICAgICAgJ1JkaW8nOiAnIzAwOGZkNScsXG5cdCAgICAgICAgJ1JlYWRhYmlsaXR5JzogJyM5YzAwMDAnLFxuXHQgICAgICAgICdSZWQgSGF0JzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdSZXNvdXJjZSc6ICcjN2ViNDAwJyxcblx0ICAgICAgICAnUm9ja3BhY2snOiAnIzBiYTZhYicsXG5cdCAgICAgICAgJ1Jvb24nOiAnIzYyYjBkOScsXG5cdCAgICAgICAgJ1JTUyc6ICcjZWU4MDJmJyxcblx0ICAgICAgICAnU2FsZXNmb3JjZSc6ICcjMTc5OGMxJyxcblx0ICAgICAgICAnU2Ftc3VuZyc6ICcjMGM0ZGEyJyxcblx0ICAgICAgICAnU2hvcGlmeSc6ICcjOTZiZjQ4Jyxcblx0ICAgICAgICAnU2t5cGUnOiAnIzAwYWZmMCcsXG5cdCAgICAgICAgJ1NuYWdham9iJzogJyNmNDdhMjAnLFxuXHQgICAgICAgICdTb2Z0b25pYyc6ICcjMDA4YWNlJyxcblx0ICAgICAgICAnU291bmRDbG91ZCc6ICcjZmY3NzAwJyxcblx0ICAgICAgICAnU3BhY2UgQm94JzogJyNmODY5NjAnLFxuXHQgICAgICAgICdTcG90aWZ5JzogJyM4MWI3MWEnLFxuXHQgICAgICAgICdTcHJpbnQnOiAnI2ZlZTEwMCcsXG5cdCAgICAgICAgJ1NxdWFyZXNwYWNlJzogJyMxMjEyMTInLFxuXHQgICAgICAgICdTdGFja092ZXJmbG93JzogJyNlZjgyMzYnLFxuXHQgICAgICAgICdTdGFwbGVzJzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdTdGF0dXMgQ2hhcnQnOiAnI2Q3NTg0ZicsXG5cdCAgICAgICAgJ1N0cmlwZSc6ICcjMDA4Y2RkJyxcblx0ICAgICAgICAnU3R1ZHlCbHVlJzogJyMwMGFmZTEnLFxuXHQgICAgICAgICdTdHVtYmxlVXBvbic6ICcjZjc0NDI1Jyxcblx0ICAgICAgICAnVC1Nb2JpbGUnOiAnI2VhMGE4ZScsXG5cdCAgICAgICAgJ1RlY2hub3JhdGknOiAnIzQwYTgwMCcsXG5cdCAgICAgICAgJ1RoZSBOZXh0IFdlYic6ICcjZWY0NDIzJyxcblx0ICAgICAgICAnVHJlZWhvdXNlJzogJyM1Y2I4NjgnLFxuXHQgICAgICAgICdUcnVsaWEnOiAnIzVlYWIxZicsXG5cdCAgICAgICAgJ1R1bWJscic6ICcjMzQ1MjZmJyxcblx0ICAgICAgICAnVHdpdGNoLnR2JzogJyM2NDQxYTUnLFxuXHQgICAgICAgICdUd2l0dGVyJzogJyMwMGFjZWUnLFxuXHQgICAgICAgICdUWVBPMyc6ICcjZmY4NzAwJyxcblx0ICAgICAgICAnVWJ1bnR1JzogJyNkZDQ4MTQnLFxuXHQgICAgICAgICdVc3RyZWFtJzogJyMzMzg4ZmYnLFxuXHQgICAgICAgICdWZXJpem9uJzogJyNlZjFkMWQnLFxuXHQgICAgICAgICdWaW1lbyc6ICcjODZjOWVmJyxcblx0ICAgICAgICAnVmluZSc6ICcjMDBhNDc4Jyxcblx0ICAgICAgICAnVmlyYic6ICcjMDZhZmQ4Jyxcblx0ICAgICAgICAnVmlyZ2luIE1lZGlhJzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdXb29nYSc6ICcjNWIwMDljJyxcblx0ICAgICAgICAnV29yZFByZXNzIChibHVlKSc6ICcjMjE3NTliJyxcblx0ICAgICAgICAnV29yZFByZXNzIChvcmFuZ2UpJzogJyNkNTRlMjEnLFxuXHQgICAgICAgICdXb3JkUHJlc3MgKGdyZXkpJzogJyM0NjQ2NDYnLFxuXHQgICAgICAgICdXdW5kZXJsaXN0JzogJyMyYjg4ZDknLFxuXHQgICAgICAgICdYQk9YJzogJyM5YmM4NDgnLFxuXHQgICAgICAgICdYSU5HJzogJyMxMjY1NjcnLFxuXHQgICAgICAgICdZYWhvbyEnOiAnIzcyMGU5ZScsXG5cdCAgICAgICAgJ1lhbmRleCc6ICcjZmZjYzAwJyxcblx0ICAgICAgICAnWWVscCc6ICcjYzQxMjAwJyxcblx0ICAgICAgICAnWW91VHViZSc6ICcjYzQzMDJiJyxcblx0ICAgICAgICAnWmFsb25nbyc6ICcjNTQ5OGRjJyxcblx0ICAgICAgICAnWmVuZGVzayc6ICcjNzhhMzAwJyxcblx0ICAgICAgICAnWmVycGx5JzogJyM5ZGNjN2EnLFxuXHQgICAgICAgICdab290b29sJzogJyM1ZThiMWQnXG5cdCAgICB9LFxuXHQgICAgX2JyYW5kTmFtZXM6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBicmFuZHMgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBiIGluIHRoaXMuX2JyYW5kQ29sb3JzKSB7XG5cdCAgICAgICAgICAgIGJyYW5kcy5wdXNoKGIpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBicmFuZHNcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIOeUn+aIkOS4gOautemaj+acuueahCBCYXNlNjQg5Zu+54mH57yW56CB44CCXG5cblx0ICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaW1za3kvaG9sZGVyXG5cdCAgICAgICAgSG9sZGVyIHJlbmRlcnMgaW1hZ2UgcGxhY2Vob2xkZXJzIGVudGlyZWx5IG9uIHRoZSBjbGllbnQgc2lkZS5cblxuXHQgICAgICAgIGRhdGFJbWFnZUhvbGRlcjogZnVuY3Rpb24oc2l6ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2hvbGRlci5qcy8nICsgc2l6ZVxuXHQgICAgICAgIH0sXG5cdCAgICAqL1xuXHQgICAgZGF0YUltYWdlOiBmdW5jdGlvbihzaXplLCB0ZXh0KSB7XG5cdCAgICAgICAgdmFyIGNhbnZhc1xuXHQgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLypcblx0ICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BdXRvbWF0dGljL25vZGUtY2FudmFzXG5cdCAgICAgICAgICAgICAgICAgICAgbnBtIGluc3RhbGwgY2FudmFzIC0tc2F2ZVxuXHQgICAgICAgICAgICAgICAg5a6J6KOF6Zeu6aKY77yaXG5cdCAgICAgICAgICAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjI5NTMyMDYvZ3VscC1pc3N1ZXMtd2l0aC1jYXJpby1pbnN0YWxsLWNvbW1hbmQtbm90LWZvdW5kLXdoZW4tdHJ5aW5nLXRvLWluc3RhbGxpbmctY2FudmFcblx0ICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbm9kZS1jYW52YXMvaXNzdWVzLzQxNVxuXHQgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9ub2RlLWNhbnZhcy93aWtpL19wYWdlc1xuXG5cdCAgICAgICAgICAgICAgICBQU++8mm5vZGUtY2FudmFzIOeahOWuieijhei/h+eoi+WunuWcqOaYr+Wkque5geeQkOS6hu+8jOaJgOS7peS4jeaUvuWFpSBwYWNrYWdlLmpzb24g55qEIGRlcGVuZGVuY2llc+OAglxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdmFyIENhbnZhcyA9IG1vZHVsZS5yZXF1aXJlKCdjYW52YXMnKVxuXHQgICAgICAgICAgICBjYW52YXMgPSBuZXcgQ2FudmFzKClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgY3R4ID0gY2FudmFzICYmIGNhbnZhcy5nZXRDb250ZXh0ICYmIGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcblx0ICAgICAgICBpZiAoIWNhbnZhcyB8fCAhY3R4KSByZXR1cm4gJydcblxuXHQgICAgICAgIGlmICghc2l6ZSkgc2l6ZSA9IHRoaXMucGljayh0aGlzLl9hZFNpemUpXG5cdCAgICAgICAgdGV4dCA9IHRleHQgIT09IHVuZGVmaW5lZCA/IHRleHQgOiBzaXplXG5cblx0ICAgICAgICBzaXplID0gc2l6ZS5zcGxpdCgneCcpXG5cblx0ICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludChzaXplWzBdLCAxMCksXG5cdCAgICAgICAgICAgIGhlaWdodCA9IHBhcnNlSW50KHNpemVbMV0sIDEwKSxcblx0ICAgICAgICAgICAgYmFja2dyb3VuZCA9IHRoaXMuX2JyYW5kQ29sb3JzW3RoaXMucGljayh0aGlzLl9icmFuZE5hbWVzKCkpXSxcblx0ICAgICAgICAgICAgZm9yZWdyb3VuZCA9ICcjRkZGJyxcblx0ICAgICAgICAgICAgdGV4dF9oZWlnaHQgPSAxNCxcblx0ICAgICAgICAgICAgZm9udCA9ICdzYW5zLXNlcmlmJztcblxuXHQgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG5cdCAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodFxuXHQgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuXHQgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuXHQgICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kXG5cdCAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG5cdCAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZvcmVncm91bmRcblx0ICAgICAgICBjdHguZm9udCA9ICdib2xkICcgKyB0ZXh0X2hlaWdodCArICdweCAnICsgZm9udFxuXHQgICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0LCAod2lkdGggLyAyKSwgKGhlaWdodCAvIDIpLCB3aWR0aClcblx0ICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJylcblx0ICAgIH1cblx0fVxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg5KShtb2R1bGUpKSlcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRcdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRcdG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtb2R1bGU7XHJcblx0fVxyXG5cblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdCAgICAjIyBDb2xvclxuXG5cdCAgICBodHRwOi8vbGxsbGxsLmxpL3JhbmRvbUNvbG9yL1xuXHQgICAgICAgIEEgY29sb3IgZ2VuZXJhdG9yIGZvciBKYXZhU2NyaXB0LlxuXHQgICAgICAgIHJhbmRvbUNvbG9yIGdlbmVyYXRlcyBhdHRyYWN0aXZlIGNvbG9ycyBieSBkZWZhdWx0LiBNb3JlIHNwZWNpZmljYWxseSwgcmFuZG9tQ29sb3IgcHJvZHVjZXMgYnJpZ2h0IGNvbG9ycyB3aXRoIGEgcmVhc29uYWJseSBoaWdoIHNhdHVyYXRpb24uIFRoaXMgbWFrZXMgcmFuZG9tQ29sb3IgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGF0YSB2aXN1YWxpemF0aW9ucyBhbmQgZ2VuZXJhdGl2ZSBhcnQuXG5cblx0ICAgIGh0dHA6Ly9yYW5kb21jb2xvdXIuY29tL1xuXHQgICAgICAgIHZhciBiZ19jb2xvdXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNjc3NzIxNSkudG9TdHJpbmcoMTYpO1xuXHQgICAgICAgIGJnX2NvbG91ciA9IFwiI1wiICsgKFwiMDAwMDAwXCIgKyBiZ19jb2xvdXIpLnNsaWNlKC02KTtcblx0ICAgICAgICBkb2N1bWVudC5iZ0NvbG9yID0gYmdfY29sb3VyO1xuXHQgICAgXG5cdCAgICBodHRwOi8vbWFydGluLmFua2VybC5jb20vMjAwOS8xMi8wOS9ob3ctdG8tY3JlYXRlLXJhbmRvbS1jb2xvcnMtcHJvZ3JhbW1hdGljYWxseS9cblx0ICAgICAgICBDcmVhdGluZyByYW5kb20gY29sb3JzIGlzIGFjdHVhbGx5IG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgc2VlbXMuIFRoZSByYW5kb21uZXNzIGl0c2VsZiBpcyBlYXN5LCBidXQgYWVzdGhldGljYWxseSBwbGVhc2luZyByYW5kb21uZXNzIGlzIG1vcmUgZGlmZmljdWx0LlxuXHQgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9jb2xvci1nZW5lcmF0b3JcblxuXHQgICAgaHR0cDovL3d3dy5wYXVsaXJpc2guY29tLzIwMDkvcmFuZG9tLWhleC1jb2xvci1jb2RlLXNuaXBwZXRzL1xuXHQgICAgICAgIFJhbmRvbSBIZXggQ29sb3IgQ29kZSBHZW5lcmF0b3IgaW4gSmF2YVNjcmlwdFxuXG5cdCAgICBodHRwOi8vY2hhbmNlanMuY29tLyNjb2xvclxuXHQgICAgICAgIGNoYW5jZS5jb2xvcigpXG5cdCAgICAgICAgLy8gPT4gJyM3OWMxNTcnXG5cdCAgICAgICAgY2hhbmNlLmNvbG9yKHtmb3JtYXQ6ICdoZXgnfSlcblx0ICAgICAgICAvLyA9PiAnI2Q2NzExOCdcblx0ICAgICAgICBjaGFuY2UuY29sb3Ioe2Zvcm1hdDogJ3Nob3J0aGV4J30pXG5cdCAgICAgICAgLy8gPT4gJyM2MGYnXG5cdCAgICAgICAgY2hhbmNlLmNvbG9yKHtmb3JtYXQ6ICdyZ2InfSlcblx0ICAgICAgICAvLyA9PiAncmdiKDExMCw1MiwxNjQpJ1xuXG5cdCAgICBodHRwOi8vdG9vbC5jN3NreS5jb20vd2ViY29sb3Jcblx0ICAgICAgICDnvZHpobXorr7orqHluLjnlKjoibLlvanmkK3phY3ooahcblx0ICAgIFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL09uZS1jb20vb25lLWNvbG9yXG5cdCAgICAgICAgQW4gT08tYmFzZWQgSmF2YVNjcmlwdCBjb2xvciBwYXJzZXIvY29tcHV0YXRpb24gdG9vbGtpdCB3aXRoIHN1cHBvcnQgZm9yIFJHQiwgSFNWLCBIU0wsIENNWUssIGFuZCBhbHBoYSBjaGFubmVscy5cblx0ICAgICAgICBBUEkg5b6I6LWeXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJ0aHVyL2NvbG9yXG5cdCAgICAgICAgSmF2YVNjcmlwdCBjb2xvciBjb252ZXJzaW9uIGFuZCBtYW5pcHVsYXRpb24gbGlicmFyeVxuXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vbGVhdmVyb3UvY3NzLWNvbG9yc1xuXHQgICAgICAgIFNoYXJlICYgY29udmVydCBDU1MgY29sb3JzXG5cdCAgICBodHRwOi8vbGVhdmVyb3UuZ2l0aHViLmlvL2Nzcy1jb2xvcnMvI3NsYXRlZ3JheVxuXHQgICAgICAgIFR5cGUgYSBDU1MgY29sb3Iga2V5d29yZCwgI2hleCwgaHNsKCksIHJnYmEoKSwgd2hhdGV2ZXI6XG5cblx0ICAgIOiJsuiwgyBodWVcblx0ICAgICAgICBodHRwOi8vYmFpa2UuYmFpZHUuY29tL3ZpZXcvMjMzNjguaHRtXG5cdCAgICAgICAg6Imy6LCD5oyH55qE5piv5LiA5bmF55S75Lit55S76Z2i6Imy5b2p55qE5oC75L2T5YC+5ZCR77yM5piv5aSn55qE6Imy5b2p5pWI5p6c44CCXG5cdCAgICDppbHlkozluqYgc2F0dXJhdGlvblxuXHQgICAgICAgIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8xODk2NDQuaHRtXG5cdCAgICAgICAg6aWx5ZKM5bqm5piv5oyH6Imy5b2p55qE6bKc6Imz56iL5bqm77yM5Lmf56ew6Imy5b2p55qE57qv5bqm44CC6aWx5ZKM5bqm5Y+W5Yaz5LqO6K+l6Imy5Lit5ZCr6Imy5oiQ5YiG5ZKM5raI6Imy5oiQ5YiG77yI54Gw6Imy77yJ55qE5q+U5L6L44CC5ZCr6Imy5oiQ5YiG6LaK5aSn77yM6aWx5ZKM5bqm6LaK5aSn77yb5raI6Imy5oiQ5YiG6LaK5aSn77yM6aWx5ZKM5bqm6LaK5bCP44CCXG5cdCAgICDkuq7luqYgYnJpZ2h0bmVzc1xuXHQgICAgICAgIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8zNDc3My5odG1cblx0ICAgICAgICDkuq7luqbmmK/mjIflj5HlhYnkvZPvvIjlj43lhYnkvZPvvInooajpnaLlj5HlhYnvvIjlj43lhYnvvInlvLrlvLHnmoTniannkIbph4/jgIJcblx0ICAgIOeFp+W6piBsdW1pbm9zaXR5XG5cdCAgICAgICAg54mp5L2T6KKr54Wn5Lqu55qE56iL5bqmLOmHh+eUqOWNleS9jemdouenr+aJgOaOpeWPl+eahOWFiemAmumHj+adpeihqOekuizooajnpLrljZXkvY3kuLrli5Jb5YWL5pavXShMdXgsbHgpICzljbMgMW0gLyBtMiDjgIJcblxuXHQgICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDg0NTA2L3JhbmRvbS1jb2xvci1nZW5lcmF0b3ItaW4tamF2YXNjcmlwdFxuXHQgICAgICAgIHZhciBsZXR0ZXJzID0gJzAxMjM0NTY3ODlBQkNERUYnLnNwbGl0KCcnKVxuXHQgICAgICAgIHZhciBjb2xvciA9ICcjJ1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG5cdCAgICAgICAgICAgIGNvbG9yICs9IGxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpXVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29sb3Jcblx0ICAgIFxuXHQgICAgICAgIC8vIOmaj+acuueUn+aIkOS4gOS4quaXoOiEkeeahOminOiJsu+8jOagvOW8j+S4uiAnI1JSR0dCQifjgIJcblx0ICAgICAgICAvLyBfYnJhaW5sZXNzQ29sb3IoKVxuXHQgICAgICAgIHZhciBjb2xvciA9IE1hdGguZmxvb3IoXG5cdCAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKlxuXHQgICAgICAgICAgICAoMTYgKiAxNiAqIDE2ICogMTYgKiAxNiAqIDE2IC0gMSlcblx0ICAgICAgICApLnRvU3RyaW5nKDE2KVxuXHQgICAgICAgIGNvbG9yID0gXCIjXCIgKyAoXCIwMDAwMDBcIiArIGNvbG9yKS5zbGljZSgtNilcblx0ICAgICAgICByZXR1cm4gY29sb3IudG9VcHBlckNhc2UoKVxuXHQqL1xuXG5cdHZhciBDb252ZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0dmFyIERJQ1QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5pyJ5ZC45byV5Yqb55qE6aKc6Imy77yM5qC85byP5Li6ICcjUlJHR0JCJ+OAglxuXHQgICAgY29sb3I6IGZ1bmN0aW9uKG5hbWUpIHtcblx0ICAgICAgICBpZiAobmFtZSB8fCBESUNUW25hbWVdKSByZXR1cm4gRElDVFtuYW1lXS5uaWNlclxuXHQgICAgICAgIHJldHVybiB0aGlzLmhleCgpXG5cdCAgICB9LFxuXHQgICAgLy8gI0RBQzBERVxuXHQgICAgaGV4OiBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgaHN2ID0gdGhpcy5fZ29sZGVuUmF0aW9Db2xvcigpXG5cdCAgICAgICAgdmFyIHJnYiA9IENvbnZlcnQuaHN2MnJnYihoc3YpXG5cdCAgICAgICAgdmFyIGhleCA9IENvbnZlcnQucmdiMmhleChyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKVxuXHQgICAgICAgIHJldHVybiBoZXhcblx0ICAgIH0sXG5cdCAgICAvLyByZ2IoMTI4LDI1NSwyNTUpXG5cdCAgICByZ2I6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBoc3YgPSB0aGlzLl9nb2xkZW5SYXRpb0NvbG9yKClcblx0ICAgICAgICB2YXIgcmdiID0gQ29udmVydC5oc3YycmdiKGhzdilcblx0ICAgICAgICByZXR1cm4gJ3JnYignICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzBdLCAxMCkgKyAnLCAnICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzFdLCAxMCkgKyAnLCAnICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzJdLCAxMCkgKyAnKSdcblx0ICAgIH0sXG5cdCAgICAvLyByZ2JhKDEyOCwyNTUsMjU1LDAuMylcblx0ICAgIHJnYmE6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBoc3YgPSB0aGlzLl9nb2xkZW5SYXRpb0NvbG9yKClcblx0ICAgICAgICB2YXIgcmdiID0gQ29udmVydC5oc3YycmdiKGhzdilcblx0ICAgICAgICByZXR1cm4gJ3JnYmEoJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlswXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlsxXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlsyXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIE1hdGgucmFuZG9tKCkudG9GaXhlZCgyKSArICcpJ1xuXHQgICAgfSxcblx0ICAgIC8vIGhzbCgzMDAsODAlLDkwJSlcblx0ICAgIGhzbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIGhzdiA9IHRoaXMuX2dvbGRlblJhdGlvQ29sb3IoKVxuXHQgICAgICAgIHZhciBoc2wgPSBDb252ZXJ0LmhzdjJoc2woaHN2KVxuXHQgICAgICAgIHJldHVybiAnaHNsKCcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMF0sIDEwKSArICcsICcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMV0sIDEwKSArICcsICcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMl0sIDEwKSArICcpJ1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHA6Ly9tYXJ0aW4uYW5rZXJsLmNvbS8yMDA5LzEyLzA5L2hvdy10by1jcmVhdGUtcmFuZG9tLWNvbG9ycy1wcm9ncmFtbWF0aWNhbGx5L1xuXHQgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L2NvbG9yLWdlbmVyYXRvci9ibG9iL21hc3Rlci9pbmRleC5qc1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5pyJ5ZC45byV5Yqb55qE6aKc6Imy44CCXG5cdCAgICBfZ29sZGVuUmF0aW9Db2xvcjogZnVuY3Rpb24oc2F0dXJhdGlvbiwgdmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl9nb2xkZW5SYXRpbyA9IDAuNjE4MDMzOTg4NzQ5ODk1XG5cdCAgICAgICAgdGhpcy5faHVlID0gdGhpcy5faHVlIHx8IE1hdGgucmFuZG9tKClcblx0ICAgICAgICB0aGlzLl9odWUgKz0gdGhpcy5fZ29sZGVuUmF0aW9cblx0ICAgICAgICB0aGlzLl9odWUgJT0gMVxuXG5cdCAgICAgICAgaWYgKHR5cGVvZiBzYXR1cmF0aW9uICE9PSBcIm51bWJlclwiKSBzYXR1cmF0aW9uID0gMC41O1xuXHQgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHZhbHVlID0gMC45NTtcblxuXHQgICAgICAgIHJldHVybiBbXG5cdCAgICAgICAgICAgIHRoaXMuX2h1ZSAqIDM2MCxcblx0ICAgICAgICAgICAgc2F0dXJhdGlvbiAqIDEwMCxcblx0ICAgICAgICAgICAgdmFsdWUgKiAxMDBcblx0ICAgICAgICBdXG5cdCAgICB9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBDb2xvciBDb252ZXJ0XG5cblx0ICAgIGh0dHA6Ly9ibG9nLmNzZG4ubmV0L2lkZmF5YS9hcnRpY2xlL2RldGFpbHMvNjc3MDQxNFxuXHQgICAgICAgIOminOiJsuepuumXtFJHQuS4jkhTVihIU0wp55qE6L2s5o2iXG5cdCovXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJ0aHVyL2NvbG9yLWNvbnZlcnQvYmxvYi9tYXN0ZXIvY29udmVyc2lvbnMuanNcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdFx0cmdiMmhzbDogZnVuY3Rpb24gcmdiMmhzbChyZ2IpIHtcblx0XHRcdHZhciByID0gcmdiWzBdIC8gMjU1LFxuXHRcdFx0XHRnID0gcmdiWzFdIC8gMjU1LFxuXHRcdFx0XHRiID0gcmdiWzJdIC8gMjU1LFxuXHRcdFx0XHRtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcblx0XHRcdFx0bWF4ID0gTWF0aC5tYXgociwgZywgYiksXG5cdFx0XHRcdGRlbHRhID0gbWF4IC0gbWluLFxuXHRcdFx0XHRoLCBzLCBsO1xuXG5cdFx0XHRpZiAobWF4ID09IG1pbilcblx0XHRcdFx0aCA9IDA7XG5cdFx0XHRlbHNlIGlmIChyID09IG1heClcblx0XHRcdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0XHRcdGVsc2UgaWYgKGcgPT0gbWF4KVxuXHRcdFx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0XHRcdGVsc2UgaWYgKGIgPT0gbWF4KVxuXHRcdFx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblxuXHRcdFx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRcdFx0aWYgKGggPCAwKVxuXHRcdFx0XHRoICs9IDM2MDtcblxuXHRcdFx0bCA9IChtaW4gKyBtYXgpIC8gMjtcblxuXHRcdFx0aWYgKG1heCA9PSBtaW4pXG5cdFx0XHRcdHMgPSAwO1xuXHRcdFx0ZWxzZSBpZiAobCA8PSAwLjUpXG5cdFx0XHRcdHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cblx0XHRcdHJldHVybiBbaCwgcyAqIDEwMCwgbCAqIDEwMF07XG5cdFx0fSxcblx0XHRyZ2IyaHN2OiBmdW5jdGlvbiByZ2IyaHN2KHJnYikge1xuXHRcdFx0dmFyIHIgPSByZ2JbMF0sXG5cdFx0XHRcdGcgPSByZ2JbMV0sXG5cdFx0XHRcdGIgPSByZ2JbMl0sXG5cdFx0XHRcdG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuXHRcdFx0XHRtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcblx0XHRcdFx0ZGVsdGEgPSBtYXggLSBtaW4sXG5cdFx0XHRcdGgsIHMsIHY7XG5cblx0XHRcdGlmIChtYXggPT09IDApXG5cdFx0XHRcdHMgPSAwO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzID0gKGRlbHRhIC8gbWF4ICogMTAwMCkgLyAxMDtcblxuXHRcdFx0aWYgKG1heCA9PSBtaW4pXG5cdFx0XHRcdGggPSAwO1xuXHRcdFx0ZWxzZSBpZiAociA9PSBtYXgpXG5cdFx0XHRcdGggPSAoZyAtIGIpIC8gZGVsdGE7XG5cdFx0XHRlbHNlIGlmIChnID09IG1heClcblx0XHRcdFx0aCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG5cdFx0XHRlbHNlIGlmIChiID09IG1heClcblx0XHRcdFx0aCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cblx0XHRcdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0XHRcdGlmIChoIDwgMClcblx0XHRcdFx0aCArPSAzNjA7XG5cblx0XHRcdHYgPSAoKG1heCAvIDI1NSkgKiAxMDAwKSAvIDEwO1xuXG5cdFx0XHRyZXR1cm4gW2gsIHMsIHZdO1xuXHRcdH0sXG5cdFx0aHNsMnJnYjogZnVuY3Rpb24gaHNsMnJnYihoc2wpIHtcblx0XHRcdHZhciBoID0gaHNsWzBdIC8gMzYwLFxuXHRcdFx0XHRzID0gaHNsWzFdIC8gMTAwLFxuXHRcdFx0XHRsID0gaHNsWzJdIC8gMTAwLFxuXHRcdFx0XHR0MSwgdDIsIHQzLCByZ2IsIHZhbDtcblxuXHRcdFx0aWYgKHMgPT09IDApIHtcblx0XHRcdFx0dmFsID0gbCAqIDI1NTtcblx0XHRcdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGwgPCAwLjUpXG5cdFx0XHRcdHQyID0gbCAqICgxICsgcyk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHQyID0gbCArIHMgLSBsICogcztcblx0XHRcdHQxID0gMiAqIGwgLSB0MjtcblxuXHRcdFx0cmdiID0gWzAsIDAsIDBdO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRcdFx0aWYgKHQzIDwgMCkgdDMrKztcblx0XHRcdFx0aWYgKHQzID4gMSkgdDMtLTtcblxuXHRcdFx0XHRpZiAoNiAqIHQzIDwgMSlcblx0XHRcdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHRcdFx0ZWxzZSBpZiAoMiAqIHQzIDwgMSlcblx0XHRcdFx0XHR2YWwgPSB0Mjtcblx0XHRcdFx0ZWxzZSBpZiAoMyAqIHQzIDwgMilcblx0XHRcdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWwgPSB0MTtcblxuXHRcdFx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZ2I7XG5cdFx0fSxcblx0XHRoc2wyaHN2OiBmdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xuXHRcdFx0dmFyIGggPSBoc2xbMF0sXG5cdFx0XHRcdHMgPSBoc2xbMV0gLyAxMDAsXG5cdFx0XHRcdGwgPSBoc2xbMl0gLyAxMDAsXG5cdFx0XHRcdHN2LCB2O1xuXHRcdFx0bCAqPSAyO1xuXHRcdFx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0XHRcdHYgPSAobCArIHMpIC8gMjtcblx0XHRcdHN2ID0gKDIgKiBzKSAvIChsICsgcyk7XG5cdFx0XHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcblx0XHR9LFxuXHRcdGhzdjJyZ2I6IGZ1bmN0aW9uIGhzdjJyZ2IoaHN2KSB7XG5cdFx0XHR2YXIgaCA9IGhzdlswXSAvIDYwXG5cdFx0XHR2YXIgcyA9IGhzdlsxXSAvIDEwMFxuXHRcdFx0dmFyIHYgPSBoc3ZbMl0gLyAxMDBcblx0XHRcdHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2XG5cblx0XHRcdHZhciBmID0gaCAtIE1hdGguZmxvb3IoaClcblx0XHRcdHZhciBwID0gMjU1ICogdiAqICgxIC0gcylcblx0XHRcdHZhciBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSlcblx0XHRcdHZhciB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSlcblxuXHRcdFx0diA9IDI1NSAqIHZcblxuXHRcdFx0c3dpdGNoIChoaSkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0cmV0dXJuIFt2LCB0LCBwXVxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0cmV0dXJuIFtxLCB2LCBwXVxuXHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0cmV0dXJuIFtwLCB2LCB0XVxuXHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0cmV0dXJuIFtwLCBxLCB2XVxuXHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0cmV0dXJuIFt0LCBwLCB2XVxuXHRcdFx0XHRjYXNlIDU6XG5cdFx0XHRcdFx0cmV0dXJuIFt2LCBwLCBxXVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aHN2MmhzbDogZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcblx0XHRcdHZhciBoID0gaHN2WzBdLFxuXHRcdFx0XHRzID0gaHN2WzFdIC8gMTAwLFxuXHRcdFx0XHR2ID0gaHN2WzJdIC8gMTAwLFxuXHRcdFx0XHRzbCwgbDtcblxuXHRcdFx0bCA9ICgyIC0gcykgKiB2O1xuXHRcdFx0c2wgPSBzICogdjtcblx0XHRcdHNsIC89IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRcdFx0bCAvPSAyO1xuXHRcdFx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG5cdFx0fSxcblx0XHQvLyBodHRwOi8vd3d3LjE0MGJ5dC5lcy9rZXl3b3Jkcy9jb2xvclxuXHRcdHJnYjJoZXg6IGZ1bmN0aW9uKFxuXHRcdFx0YSwgLy8gcmVkLCBhcyBhIG51bWJlciBmcm9tIDAgdG8gMjU1XG5cdFx0XHRiLCAvLyBncmVlbiwgYXMgYSBudW1iZXIgZnJvbSAwIHRvIDI1NVxuXHRcdFx0YyAvLyBibHVlLCBhcyBhIG51bWJlciBmcm9tIDAgdG8gMjU1XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCIjXCIgKyAoKDI1NiArIGEgPDwgOCB8IGIpIDw8IDggfCBjKS50b1N0cmluZygxNikuc2xpY2UoMSlcblx0XHR9LFxuXHRcdGhleDJyZ2I6IGZ1bmN0aW9uKFxuXHRcdFx0YSAvLyB0YWtlIGEgXCIjeHh4eHh4XCIgaGV4IHN0cmluZyxcblx0XHQpIHtcblx0XHRcdGEgPSAnMHgnICsgYS5zbGljZSgxKS5yZXBsYWNlKGEubGVuZ3RoID4gNCA/IGEgOiAvLi9nLCAnJCYkJicpIHwgMDtcblx0XHRcdHJldHVybiBbYSA+PiAxNiwgYSA+PiA4ICYgMjU1LCBhICYgMjU1XVxuXHRcdH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIENvbG9yIOWtl+WFuOaVsOaNrlxuXG5cdCAgICDlrZflhbjmlbDmja7mnaXmupAgW0EgbmljZXIgY29sb3IgcGFsZXR0ZSBmb3IgdGhlIHdlYl0oaHR0cDovL2NscnMuY2MvKVxuXHQqL1xuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIG5hbWUgdmFsdWUgbmljZXJcblx0ICAgIG5hdnk6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDAwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzAwMUYzRidcblx0ICAgIH0sXG5cdCAgICBibHVlOiB7XG5cdCAgICAgICAgdmFsdWU6ICcjMDAwMGZmJyxcblx0ICAgICAgICBuaWNlcjogJyMwMDc0RDknXG5cdCAgICB9LFxuXHQgICAgYXF1YToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwZmZmZicsXG5cdCAgICAgICAgbmljZXI6ICcjN0ZEQkZGJ1xuXHQgICAgfSxcblx0ICAgIHRlYWw6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDgwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzM5Q0NDQydcblx0ICAgIH0sXG5cdCAgICBvbGl2ZToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwODAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjM0Q5OTcwJ1xuXHQgICAgfSxcblx0ICAgIGdyZWVuOiB7XG5cdCAgICAgICAgdmFsdWU6ICcjMDA4MDAwJyxcblx0ICAgICAgICBuaWNlcjogJyMyRUNDNDAnXG5cdCAgICB9LFxuXHQgICAgbGltZToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwZmYwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjMDFGRjcwJ1xuXHQgICAgfSxcblx0ICAgIHllbGxvdzoge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmZmYwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkZEQzAwJ1xuXHQgICAgfSxcblx0ICAgIG9yYW5nZToge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmYTUwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkY4NTFCJ1xuXHQgICAgfSxcblx0ICAgIHJlZDoge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmMDAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkY0MTM2J1xuXHQgICAgfSxcblx0ICAgIG1hcm9vbjoge1xuXHQgICAgICAgIHZhbHVlOiAnIzgwMDAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjODUxNDRCJ1xuXHQgICAgfSxcblx0ICAgIGZ1Y2hzaWE6IHtcblx0ICAgICAgICB2YWx1ZTogJyNmZjAwZmYnLFxuXHQgICAgICAgIG5pY2VyOiAnI0YwMTJCRSdcblx0ICAgIH0sXG5cdCAgICBwdXJwbGU6IHtcblx0ICAgICAgICB2YWx1ZTogJyM4MDAwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnI0IxMERDOSdcblx0ICAgIH0sXG5cdCAgICBzaWx2ZXI6IHtcblx0ICAgICAgICB2YWx1ZTogJyNjMGMwYzAnLFxuXHQgICAgICAgIG5pY2VyOiAnI0RERERERCdcblx0ICAgIH0sXG5cdCAgICBncmF5OiB7XG5cdCAgICAgICAgdmFsdWU6ICcjODA4MDgwJyxcblx0ICAgICAgICBuaWNlcjogJyNBQUFBQUEnXG5cdCAgICB9LFxuXHQgICAgYmxhY2s6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDAwMDAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzExMTExMSdcblx0ICAgIH0sXG5cdCAgICB3aGl0ZToge1xuXHQgICAgICAgIHZhbHVlOiAnI0ZGRkZGRicsXG5cdCAgICAgICAgbmljZXI6ICcjRkZGRkZGJ1xuXHQgICAgfVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgVGV4dFxuXG5cdCAgICBodHRwOi8vd3d3LmxpcHN1bS5jb20vXG5cdCovXG5cdHZhciBCYXNpYyA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0dmFyIEhlbHBlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cblx0ZnVuY3Rpb24gcmFuZ2UoZGVmYXVsdE1pbiwgZGVmYXVsdE1heCwgbWluLCBtYXgpIHtcblx0ICAgIHJldHVybiBtaW4gPT09IHVuZGVmaW5lZCA/IEJhc2ljLm5hdHVyYWwoZGVmYXVsdE1pbiwgZGVmYXVsdE1heCkgOiAvLyAoKVxuXHQgICAgICAgIG1heCA9PT0gdW5kZWZpbmVkID8gbWluIDogLy8gKCBsZW4gKVxuXHQgICAgICAgIEJhc2ljLm5hdHVyYWwocGFyc2VJbnQobWluLCAxMCksIHBhcnNlSW50KG1heCwgMTApKSAvLyAoIG1pbiwgbWF4IClcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5q615paH5pys44CCXG5cdCAgICBwYXJhZ3JhcGg6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDcsIG1pbiwgbWF4KVxuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW50ZW5jZSgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyAnKVxuXHQgICAgfSxcblx0ICAgIC8vIFxuXHQgICAgY3BhcmFncmFwaDogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMywgNywgbWluLCBtYXgpXG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNzZW50ZW5jZSgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5Y+l5a2Q77yM56ys5LiA5Liq5Y2V6K+N55qE6aaW5a2X5q+N5aSn5YaZ44CCXG5cdCAgICBzZW50ZW5jZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMTIsIDE4LCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gW11cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMud29yZCgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gSGVscGVyLmNhcGl0YWxpemUocmVzdWx0LmpvaW4oJyAnKSkgKyAnLidcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrkuK3mloflj6XlrZDjgIJcblx0ICAgIGNzZW50ZW5jZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMTIsIDE4LCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gW11cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3dvcmQoKSlcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpICsgJ+OAgidcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrljZXor43jgIJcblx0ICAgIHdvcmQ6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDEwLCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQgKz0gQmFzaWMuY2hhcmFjdGVyKCdsb3dlcicpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrmiJblpJrkuKrmsYnlrZfjgIJcblx0ICAgIGN3b3JkOiBmdW5jdGlvbihwb29sLCBtaW4sIG1heCkge1xuXHQgICAgICAgIC8vIOacgOW4uOeUqOeahCA1MDAg5Liq5rGJ5a2XIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy81Njg0MzYuaHRtXG5cdCAgICAgICAgdmFyIERJQ1RfS0FOWkkgPSAn55qE5LiA5piv5Zyo5LiN5LqG5pyJ5ZKM5Lq66L+Z5Lit5aSn5Li65LiK5Liq5Zu95oiR5Lul6KaB5LuW5pe25p2l55So5Lus55Sf5Yiw5L2c5Zyw5LqO5Ye65bCx5YiG5a+55oiQ5Lya5Y+v5Li75Y+R5bm05Yqo5ZCM5bel5Lmf6IO95LiL6L+H5a2Q6K+05Lqn56eN6Z2i6ICM5pa55ZCO5aSa5a6a6KGM5a2m5rOV5omA5rCR5b6X57uP5Y2B5LiJ5LmL6L+b552A562J6YOo5bqm5a6255S15Yqb6YeM5aaC5rC05YyW6auY6Ieq5LqM55CG6LW35bCP54mp546w5a6e5Yqg6YeP6YO95Lik5L2T5Yi25py65b2T5L2/54K55LuO5Lia5pys5Y675oqK5oCn5aW95bqU5byA5a6D5ZCI6L+Y5Zug55Sx5YW25Lqb54S25YmN5aSW5aSp5pS/5Zub5pel6YKj56S+5LmJ5LqL5bmz5b2i55u45YWo6KGo6Ze05qC35LiO5YWz5ZCE6YeN5paw57q/5YaF5pWw5q2j5b+D5Y+N5L2g5piO55yL5Y6f5Y+I5LmI5Yip5q+U5oiW5L2G6LSo5rCU56ys5ZCR6YGT5ZG95q2k5Y+Y5p2h5Y+q5rKh57uT6Kej6Zeu5oSP5bu65pyI5YWs5peg57O75Yab5b6I5oOF6ICF5pyA56uL5Luj5oOz5bey6YCa5bm25o+Q55u06aKY5YWa56iL5bGV5LqU5p6c5paZ6LGh5ZGY6Z2p5L2N5YWl5bi45paH5oC75qyh5ZOB5byP5rS76K6+5Y+K566h54m55Lu26ZW/5rGC6ICB5aS05Z+66LWE6L655rWB6Lev57qn5bCR5Zu+5bGx57uf5o6l55+l6L6D5bCG57uE6KeB6K6h5Yir5aW55omL6KeS5pyf5qC56K666L+Q5Yac5oyH5Yeg5Lmd5Yy65by65pS+5Yaz6KW/6KKr5bmy5YGa5b+F5oiY5YWI5Zue5YiZ5Lu75Y+W5o2u5aSE6Zif5Y2X57uZ6Imy5YWJ6Zeo5Y2z5L+d5rK75YyX6YCg55m+6KeE54Ot6aKG5LiD5rW35Y+j5Lic5a+85Zmo5Y6L5b+X5LiW6YeR5aKe5LqJ5rWO6Zi25rK55oCd5pyv5p6B5Lqk5Y+X6IGU5LuA6K6k5YWt5YWx5p2D5pS26K+B5pS55riF5bex576O5YaN6YeH6L2s5pu05Y2V6aOO5YiH5omT55m95pWZ6YCf6Iqx5bim5a6J5Zy66Lqr6L2m5L6L55yf5Yqh5YW35LiH5q+P55uu6Iez6L6+6LWw56ev56S66K6u5aOw5oql5paX5a6M57G75YWr56a75Y2O5ZCN56Gu5omN56eR5byg5L+h6ams6IqC6K+d57Gz5pW056m65YWD5Ya15LuK6ZuG5rip5Lyg5Zyf6K645q2l576k5bm/55+z6K6w6ZyA5q6156CU55WM5ouJ5p6X5b6L5Y+r5LiU56m26KeC6LaK57uH6KOF5b2x566X5L2O5oyB6Z+z5LyX5Lmm5biD5aSN5a655YS/6aG76ZmF5ZWG6Z2e6aqM6L+e5pat5rex6Zq+6L+R55+/5Y2D5ZGo5aeU57Sg5oqA5aSH5Y2K5Yqe6Z2S55yB5YiX5Lmg5ZON57qm5pSv6Iis5Y+y5oSf5Yqz5L6/5Zui5b6A6YW45Y6G5biC5YWL5L2V6Zmk5raI5p6E5bqc56ew5aSq5YeG57K+5YC85Y+3546H5peP57u05YiS6YCJ5qCH5YaZ5a2Y5YCZ5q+b5Lqy5b+r5pWI5pav6Zmi5p+l5rGf5Z6L55y8546L5oyJ5qC85YW75piT572u5rS+5bGC54mH5aeL5Y205LiT54q26IKy5Y6C5Lqs6K+G6YCC5bGe5ZyG5YyF54Gr5L2P6LCD5ruh5Y6/5bGA54Wn5Y+C57qi57uG5byV5ZCs6K+l6ZOB5Lu35Lil6b6Z6aOeJ1xuXG5cdCAgICAgICAgdmFyIGxlblxuXHQgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDA6IC8vICgpXG5cdCAgICAgICAgICAgICAgICBwb29sID0gRElDVF9LQU5aSVxuXHQgICAgICAgICAgICAgICAgbGVuID0gMVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAxOiAvLyAoIHBvb2wgKVxuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gMVxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAoIGxlbmd0aCApXG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gcG9vbFxuXHQgICAgICAgICAgICAgICAgICAgIHBvb2wgPSBESUNUX0tBTlpJXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICAvLyAoIHBvb2wsIGxlbmd0aCApXG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsZW4gPSBtaW5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gKCBtaW4sIG1heCApXG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKHBvb2wsIG1pbilcblx0ICAgICAgICAgICAgICAgICAgICBwb29sID0gRElDVF9LQU5aSVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKG1pbiwgbWF4KVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJydcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdCArPSBwb29sLmNoYXJBdCh0aGlzLm5hdHVyYWwoMCwgcG9vbC5sZW5ndGggLSAxKSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOWPpeagh+mimO+8jOWFtuS4reavj+S4quWNleivjeeahOmmluWtl+avjeWkp+WGmeOAglxuXHQgICAgdGl0bGU6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDcsIG1pbiwgbWF4KVxuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jYXBpdGFsaXplKHRoaXMud29yZCgpKSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcgJylcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDlj6XkuK3mlofmoIfpopjjgIJcblx0ICAgIGN0aXRsZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMywgNywgbWluLCBtYXgpXG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmN3b3JkKCkpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHQuam9pbignJylcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIEhlbHBlcnNcblx0Ki9cblxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHQvLyDmiorlrZfnrKbkuLLnmoTnrKzkuIDkuKrlrZfmr43ovazmjaLkuLrlpKflhpnjgIJcblx0XHRjYXBpdGFsaXplOiBmdW5jdGlvbih3b3JkKSB7XG5cdFx0XHRyZXR1cm4gKHdvcmQgKyAnJykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyAod29yZCArICcnKS5zdWJzdHIoMSlcblx0XHR9LFxuXHRcdC8vIOaKiuWtl+espuS4sui9rOaNouS4uuWkp+WGmeOAglxuXHRcdHVwcGVyOiBmdW5jdGlvbihzdHIpIHtcblx0XHRcdHJldHVybiAoc3RyICsgJycpLnRvVXBwZXJDYXNlKClcblx0XHR9LFxuXHRcdC8vIOaKiuWtl+espuS4sui9rOaNouS4uuWwj+WGmeOAglxuXHRcdGxvd2VyOiBmdW5jdGlvbihzdHIpIHtcblx0XHRcdHJldHVybiAoc3RyICsgJycpLnRvTG93ZXJDYXNlKClcblx0XHR9LFxuXHRcdC8vIOS7juaVsOe7hOS4remaj+acuumAieWPluS4gOS4quWFg+e0oO+8jOW5tui/lOWbnuOAglxuXHRcdHBpY2s6IGZ1bmN0aW9uIHBpY2soYXJyLCBtaW4sIG1heCkge1xuXHRcdFx0Ly8gcGljayggaXRlbTEsIGl0ZW0yIC4uLiApXG5cdFx0XHRpZiAoIVV0aWwuaXNBcnJheShhcnIpKSB7XG5cdFx0XHRcdGFyciA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXHRcdFx0XHRtaW4gPSAxXG5cdFx0XHRcdG1heCA9IDFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHBpY2soIFsgaXRlbTEsIGl0ZW0yIC4uLiBdIClcblx0XHRcdFx0aWYgKG1pbiA9PT0gdW5kZWZpbmVkKSBtaW4gPSAxXG5cblx0XHRcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIGNvdW50IClcblx0XHRcdFx0aWYgKG1heCA9PT0gdW5kZWZpbmVkKSBtYXggPSBtaW5cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1pbiA9PT0gMSAmJiBtYXggPT09IDEpIHJldHVybiBhcnJbdGhpcy5uYXR1cmFsKDAsIGFyci5sZW5ndGggLSAxKV1cblxuXHRcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIG1pbiwgbWF4IClcblx0XHRcdHJldHVybiB0aGlzLnNodWZmbGUoYXJyLCBtaW4sIG1heClcblxuXHRcdFx0Ly8g6YCa6L+H5Y+C5pWw5Liq5pWw5Yik5pat5pa55rOV562+5ZCN77yM5omp5bGV5oCn5aSq5beu77yBIzkwXG5cdFx0XHQvLyBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdC8vIFx0Y2FzZSAxOlxuXHRcdFx0Ly8gXHRcdC8vIHBpY2soIFsgaXRlbTEsIGl0ZW0yIC4uLiBdIClcblx0XHRcdC8vIFx0XHRyZXR1cm4gYXJyW3RoaXMubmF0dXJhbCgwLCBhcnIubGVuZ3RoIC0gMSldXG5cdFx0XHQvLyBcdGNhc2UgMjpcblx0XHRcdC8vIFx0XHQvLyBwaWNrKCBbIGl0ZW0xLCBpdGVtMiAuLi4gXSwgY291bnQgKVxuXHRcdFx0Ly8gXHRcdG1heCA9IG1pblxuXHRcdFx0Ly8gXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Ly8gXHRjYXNlIDM6XG5cdFx0XHQvLyBcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIG1pbiwgbWF4IClcblx0XHRcdC8vIFx0XHRyZXR1cm4gdGhpcy5zaHVmZmxlKGFyciwgbWluLCBtYXgpXG5cdFx0XHQvLyB9XG5cdFx0fSxcblx0XHQvKlxuXHRcdCAgICDmiZPkubHmlbDnu4TkuK3lhYPntKDnmoTpobrluo/vvIzlubbov5Tlm57jgIJcblx0XHQgICAgR2l2ZW4gYW4gYXJyYXksIHNjcmFtYmxlIHRoZSBvcmRlciBhbmQgcmV0dXJuIGl0LlxuXG5cdFx0ICAgIOWFtuS7lueahOWunueOsOaAnei3r++8mlxuXHRcdCAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc2xpYnMvd2lraS9KYXZhc2NyaXB0VGlwc1xuXHRcdCAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNvcnQoZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjVcblx0XHQgICAgICAgIH0pXG5cdFx0Ki9cblx0XHRzaHVmZmxlOiBmdW5jdGlvbiBzaHVmZmxlKGFyciwgbWluLCBtYXgpIHtcblx0XHRcdGFyciA9IGFyciB8fCBbXVxuXHRcdFx0dmFyIG9sZCA9IGFyci5zbGljZSgwKSxcblx0XHRcdFx0cmVzdWx0ID0gW10sXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gb2xkLmxlbmd0aDtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aW5kZXggPSB0aGlzLm5hdHVyYWwoMCwgb2xkLmxlbmd0aCAtIDEpXG5cdFx0XHRcdHJlc3VsdC5wdXNoKG9sZFtpbmRleF0pXG5cdFx0XHRcdG9sZC5zcGxpY2UoaW5kZXgsIDEpXG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFxuXHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0bWF4ID0gbWluXG5cdFx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRtaW4gPSBwYXJzZUludChtaW4sIDEwKVxuXHRcdFx0XHRcdG1heCA9IHBhcnNlSW50KG1heCwgMTApXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0aGlzLm5hdHVyYWwobWluLCBtYXgpKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAgKiBSYW5kb20ub3JkZXIoaXRlbSwgaXRlbSlcblx0XHQgICAgKiBSYW5kb20ub3JkZXIoW2l0ZW0sIGl0ZW0gLi4uXSlcblxuXHRcdCAgICDpobrluo/ojrflj5bmlbDnu4TkuK3nmoTlhYPntKBcblxuXHRcdCAgICBbSlNPTuWvvOWFpeaVsOe7hOaUr+aMgeaVsOe7hOaVsOaNruW9leWFpV0oaHR0cHM6Ly9naXRodWIuY29tL3RoeC9SQVAvaXNzdWVzLzIyKVxuXG5cdFx0ICAgIOS4jeaUr+aMgeWNleeLrOiwg+eUqO+8gVxuXHRcdCovXG5cdFx0b3JkZXI6IGZ1bmN0aW9uIG9yZGVyKGFycmF5KSB7XG5cdFx0XHRvcmRlci5jYWNoZSA9IG9yZGVyLmNhY2hlIHx8IHt9XG5cblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgYXJyYXkgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMClcblxuXHRcdFx0Ly8gb3B0aW9ucy5jb250ZXh0LnBhdGgvdGVtcGxhdGVQYXRoXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG9yZGVyLm9wdGlvbnNcblx0XHRcdHZhciB0ZW1wbGF0ZVBhdGggPSBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLmpvaW4oJy4nKVxuXG5cdFx0XHR2YXIgY2FjaGUgPSAoXG5cdFx0XHRcdG9yZGVyLmNhY2hlW3RlbXBsYXRlUGF0aF0gPSBvcmRlci5jYWNoZVt0ZW1wbGF0ZVBhdGhdIHx8IHtcblx0XHRcdFx0XHRpbmRleDogMCxcblx0XHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdFx0fVxuXHRcdFx0KVxuXG5cdFx0XHRyZXR1cm4gY2FjaGUuYXJyYXlbY2FjaGUuaW5kZXgrKyAlIGNhY2hlLmFycmF5Lmxlbmd0aF1cblx0XHR9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBOYW1lXG5cblx0ICAgIFtCZXlvbmQgdGhlIFRvcCAxMDAwIE5hbWVzXShodHRwOi8vd3d3LnNzYS5nb3Yvb2FjdC9iYWJ5bmFtZXMvbGltaXRzLmh0bWwpXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdC8vIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOiLseaWh+WQjeOAglxuXHRcdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuYW1lcyA9IFtcblx0XHRcdFx0Ly8gbWFsZVxuXHRcdFx0XHRcIkphbWVzXCIsIFwiSm9oblwiLCBcIlJvYmVydFwiLCBcIk1pY2hhZWxcIiwgXCJXaWxsaWFtXCIsXG5cdFx0XHRcdFwiRGF2aWRcIiwgXCJSaWNoYXJkXCIsIFwiQ2hhcmxlc1wiLCBcIkpvc2VwaFwiLCBcIlRob21hc1wiLFxuXHRcdFx0XHRcIkNocmlzdG9waGVyXCIsIFwiRGFuaWVsXCIsIFwiUGF1bFwiLCBcIk1hcmtcIiwgXCJEb25hbGRcIixcblx0XHRcdFx0XCJHZW9yZ2VcIiwgXCJLZW5uZXRoXCIsIFwiU3RldmVuXCIsIFwiRWR3YXJkXCIsIFwiQnJpYW5cIixcblx0XHRcdFx0XCJSb25hbGRcIiwgXCJBbnRob255XCIsIFwiS2V2aW5cIiwgXCJKYXNvblwiLCBcIk1hdHRoZXdcIixcblx0XHRcdFx0XCJHYXJ5XCIsIFwiVGltb3RoeVwiLCBcIkpvc2VcIiwgXCJMYXJyeVwiLCBcIkplZmZyZXlcIixcblx0XHRcdFx0XCJGcmFua1wiLCBcIlNjb3R0XCIsIFwiRXJpY1wiXG5cdFx0XHRdLmNvbmNhdChbXG5cdFx0XHRcdC8vIGZlbWFsZVxuXHRcdFx0XHRcIk1hcnlcIiwgXCJQYXRyaWNpYVwiLCBcIkxpbmRhXCIsIFwiQmFyYmFyYVwiLCBcIkVsaXphYmV0aFwiLFxuXHRcdFx0XHRcIkplbm5pZmVyXCIsIFwiTWFyaWFcIiwgXCJTdXNhblwiLCBcIk1hcmdhcmV0XCIsIFwiRG9yb3RoeVwiLFxuXHRcdFx0XHRcIkxpc2FcIiwgXCJOYW5jeVwiLCBcIkthcmVuXCIsIFwiQmV0dHlcIiwgXCJIZWxlblwiLFxuXHRcdFx0XHRcIlNhbmRyYVwiLCBcIkRvbm5hXCIsIFwiQ2Fyb2xcIiwgXCJSdXRoXCIsIFwiU2hhcm9uXCIsXG5cdFx0XHRcdFwiTWljaGVsbGVcIiwgXCJMYXVyYVwiLCBcIlNhcmFoXCIsIFwiS2ltYmVybHlcIiwgXCJEZWJvcmFoXCIsXG5cdFx0XHRcdFwiSmVzc2ljYVwiLCBcIlNoaXJsZXlcIiwgXCJDeW50aGlhXCIsIFwiQW5nZWxhXCIsIFwiTWVsaXNzYVwiLFxuXHRcdFx0XHRcIkJyZW5kYVwiLCBcIkFteVwiLCBcIkFubmFcIlxuXHRcdFx0XSlcblx0XHRcdHJldHVybiB0aGlzLnBpY2sobmFtZXMpXG5cdFx0XHRcdC8vIG9yIHRoaXMuY2FwaXRhbGl6ZSh0aGlzLndvcmQoKSlcblx0XHR9LFxuXHRcdC8vIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOiLseaWh+Wnk+OAglxuXHRcdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5hbWVzID0gW1xuXHRcdFx0XHRcIlNtaXRoXCIsIFwiSm9obnNvblwiLCBcIldpbGxpYW1zXCIsIFwiQnJvd25cIiwgXCJKb25lc1wiLFxuXHRcdFx0XHRcIk1pbGxlclwiLCBcIkRhdmlzXCIsIFwiR2FyY2lhXCIsIFwiUm9kcmlndWV6XCIsIFwiV2lsc29uXCIsXG5cdFx0XHRcdFwiTWFydGluZXpcIiwgXCJBbmRlcnNvblwiLCBcIlRheWxvclwiLCBcIlRob21hc1wiLCBcIkhlcm5hbmRlelwiLFxuXHRcdFx0XHRcIk1vb3JlXCIsIFwiTWFydGluXCIsIFwiSmFja3NvblwiLCBcIlRob21wc29uXCIsIFwiV2hpdGVcIixcblx0XHRcdFx0XCJMb3BlelwiLCBcIkxlZVwiLCBcIkdvbnphbGV6XCIsIFwiSGFycmlzXCIsIFwiQ2xhcmtcIixcblx0XHRcdFx0XCJMZXdpc1wiLCBcIlJvYmluc29uXCIsIFwiV2Fsa2VyXCIsIFwiUGVyZXpcIiwgXCJIYWxsXCIsXG5cdFx0XHRcdFwiWW91bmdcIiwgXCJBbGxlblwiXG5cdFx0XHRdXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdFx0XHQvLyBvciB0aGlzLmNhcGl0YWxpemUodGhpcy53b3JkKCkpXG5cdFx0fSxcblx0XHQvLyDpmo/mnLrnlJ/miJDkuIDkuKrluLjop4HnmoToi7Hmloflp5PlkI3jgIJcblx0XHRuYW1lOiBmdW5jdGlvbihtaWRkbGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmZpcnN0KCkgKyAnICcgK1xuXHRcdFx0XHQobWlkZGxlID8gdGhpcy5maXJzdCgpICsgJyAnIDogJycpICtcblx0XHRcdFx0dGhpcy5sYXN0KClcblx0XHR9LFxuXHRcdC8qXG5cdFx0ICAgIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOS4reaWh+Wnk+OAglxuXHRcdCAgICBb5LiW55WM5bi455So5aeT5rCP5o6S6KGMXShodHRwOi8vYmFpa2UuYmFpZHUuY29tL3ZpZXcvMTcxOTExNS5odG0pXG5cdFx0ICAgIFvnjoTmtL7nvZEgLSDnvZHnu5zlsI/or7TliJvkvZzovoXliqnlubPlj7BdKGh0dHA6Ly94dWFucGFpLnNpbmFhcHAuY29tLylcblx0XHQgKi9cblx0XHRjZmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5hbWVzID0gKFxuXHRcdFx0XHQn546LIOadjiDlvKAg5YiYIOmZiCDmnagg6LW1IOm7hCDlkagg5ZC0ICcgK1xuXHRcdFx0XHQn5b6QIOWtmSDog6Eg5pyxIOmrmCDmnpcg5L2VIOmDrSDpqawg572XICcgK1xuXHRcdFx0XHQn5qKBIOWuiyDpg5Eg6LCiIOmfqSDllJAg5YavIOS6jiDokaMg6JCnICcgK1xuXHRcdFx0XHQn56iLIOabuSDoooEg6YKTIOiuuCDlgoUg5rKIIOabviDlva0g5ZCVICcgK1xuXHRcdFx0XHQn6IuPIOWNoiDokosg6JShIOi0viDkuIEg6a2PIOiWmyDlj7Yg6ZiOICcgK1xuXHRcdFx0XHQn5L2ZIOa9mCDmnZwg5oi0IOWkjyDplLog5rGqIOeUsCDku7sg5aecICcgK1xuXHRcdFx0XHQn6IyDIOaWuSDnn7Mg5aeaIOiwrSDlu5Yg6YK5IOeGiiDph5Eg6ZmGICcgK1xuXHRcdFx0XHQn6YOdIOWtlCDnmb0g5bSUIOW6tyDmr5sg6YKxIOenpiDmsZ8g5Y+yICcgK1xuXHRcdFx0XHQn6aG+IOS+ryDpgrUg5a2fIOm+mSDkuIcg5q61IOmbtyDpkrEg5rGkICcgK1xuXHRcdFx0XHQn5bC5IOm7jiDmmJMg5bi4IOatpiDkuZQg6LS6IOi1liDpvpog5paHJ1xuXHRcdFx0KS5zcGxpdCgnICcpXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAg6ZqP5py655Sf5oiQ5LiA5Liq5bi46KeB55qE5Lit5paH5ZCN44CCXG5cdFx0ICAgIFvkuK3lm73mnIDluLjop4HlkI3lrZfliY01MOWQjV/kuInkuZ3nrpflkb3nvZFdKGh0dHA6Ly93d3cubmFtZTk5OS5uZXQveGluZ21pbmcveGluZ3NoaS8yMDEzMTAwNC80OC5odG1sKVxuXHRcdCAqL1xuXHRcdGNsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuYW1lcyA9IChcblx0XHRcdFx0J+S8nyDoirMg5aicIOengOiLsSDmlY8g6Z2ZIOS4vSDlvLog56OKIOWGmyAnICtcblx0XHRcdFx0J+a0iyDli4cg6ImzIOadsCDlqJ8g5rabIOaYjiDotoUg56eA5YWwIOmcniAnICtcblx0XHRcdFx0J+W5syDliJog5qGC6IuxJ1xuXHRcdFx0KS5zcGxpdCgnICcpXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdH0sXG5cdFx0Ly8g6ZqP5py655Sf5oiQ5LiA5Liq5bi46KeB55qE5Lit5paH5aeT5ZCN44CCXG5cdFx0Y25hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2ZpcnN0KCkgKyB0aGlzLmNsYXN0KClcblx0XHR9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBXZWJcblx0Ki9cblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgICAvKlxuXHQgICAgICAgIOmaj+acuueUn+aIkOS4gOS4qiBVUkzjgIJcblxuXHQgICAgICAgIFtVUkwg6KeE6IyDXShodHRwOi8vd3d3LnczLm9yZy9BZGRyZXNzaW5nL1VSTC91cmwtc3BlYy50eHQpXG5cdCAgICAgICAgICAgIGh0dHAgICAgICAgICAgICAgICAgICAgIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCBcblx0ICAgICAgICAgICAgZnRwICAgICAgICAgICAgICAgICAgICAgRmlsZSBUcmFuc2ZlciBwcm90b2NvbCBcblx0ICAgICAgICAgICAgZ29waGVyICAgICAgICAgICAgICAgICAgVGhlIEdvcGhlciBwcm90b2NvbCBcblx0ICAgICAgICAgICAgbWFpbHRvICAgICAgICAgICAgICAgICAgRWxlY3Ryb25pYyBtYWlsIGFkZHJlc3MgXG5cdCAgICAgICAgICAgIG1pZCAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgaWRlbnRpZmllcnMgZm9yIGVsZWN0cm9uaWMgbWFpbCBcblx0ICAgICAgICAgICAgY2lkICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBpZGVudGlmaWVycyBmb3IgTUlNRSBib2R5IHBhcnQgXG5cdCAgICAgICAgICAgIG5ld3MgICAgICAgICAgICAgICAgICAgIFVzZW5ldCBuZXdzIFxuXHQgICAgICAgICAgICBubnRwICAgICAgICAgICAgICAgICAgICBVc2VuZXQgbmV3cyBmb3IgbG9jYWwgTk5UUCBhY2Nlc3Mgb25seSBcblx0ICAgICAgICAgICAgcHJvc3Blcm8gICAgICAgICAgICAgICAgQWNjZXNzIHVzaW5nIHRoZSBwcm9zcGVybyBwcm90b2NvbHMgXG5cdCAgICAgICAgICAgIHRlbG5ldCBybG9naW4gdG4zMjcwICAgIFJlZmVyZW5jZSB0byBpbnRlcmFjdGl2ZSBzZXNzaW9uc1xuXHQgICAgICAgICAgICB3YWlzICAgICAgICAgICAgICAgICAgICBXaWRlIEFyZWEgSW5mb3JtYXRpb24gU2VydmVycyBcblx0ICAgICovXG5cdCAgICB1cmw6IGZ1bmN0aW9uKHByb3RvY29sLCBob3N0KSB7XG5cdCAgICAgICAgcmV0dXJuIChwcm90b2NvbCB8fCB0aGlzLnByb3RvY29sKCkpICsgJzovLycgKyAvLyBwcm90b2NvbD9cblx0ICAgICAgICAgICAgKGhvc3QgfHwgdGhpcy5kb21haW4oKSkgKyAvLyBob3N0P1xuXHQgICAgICAgICAgICAnLycgKyB0aGlzLndvcmQoKVxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4qiBVUkwg5Y2P6K6u44CCXG5cdCAgICBwcm90b2NvbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucGljayhcblx0ICAgICAgICAgICAgLy8g5Y2P6K6u57CHXG5cdCAgICAgICAgICAgICdodHRwIGZ0cCBnb3BoZXIgbWFpbHRvIG1pZCBjaWQgbmV3cyBubnRwIHByb3NwZXJvIHRlbG5ldCBybG9naW4gdG4zMjcwIHdhaXMnLnNwbGl0KCcgJylcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5Z+f5ZCN44CCXG5cdCAgICBkb21haW46IGZ1bmN0aW9uKHRsZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLndvcmQoKSArICcuJyArICh0bGQgfHwgdGhpcy50bGQoKSlcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIOmaj+acuueUn+aIkOS4gOS4qumhtue6p+Wfn+WQjeOAglxuXHQgICAgICAgIOWbvemZhemhtue6p+Wfn+WQjSBpbnRlcm5hdGlvbmFsIHRvcC1sZXZlbCBkb21haW4tbmFtZXMsIGlUTERzXG5cdCAgICAgICAg5Zu95a626aG257qn5Z+f5ZCNIG5hdGlvbmFsIHRvcC1sZXZlbCBkb21haW5uYW1lcywgblRMRHNcblx0ICAgICAgICBb5Z+f5ZCN5ZCO57yA5aSn5YWoXShodHRwOi8vd3d3LjE2M25zLmNvbS96aXh1bi9wb3N0LzQ0MTcuaHRtbClcblx0ICAgICovXG5cdCAgICB0bGQ6IGZ1bmN0aW9uKCkgeyAvLyBUb3AgTGV2ZWwgRG9tYWluXG5cdCAgICAgICAgcmV0dXJuIHRoaXMucGljayhcblx0ICAgICAgICAgICAgKFxuXHQgICAgICAgICAgICAgICAgLy8g5Z+f5ZCN5ZCO57yAXG5cdCAgICAgICAgICAgICAgICAnY29tIG5ldCBvcmcgZWR1IGdvdiBpbnQgbWlsIGNuICcgK1xuXHQgICAgICAgICAgICAgICAgLy8g5Zu95YaF5Z+f5ZCNXG5cdCAgICAgICAgICAgICAgICAnY29tLmNuIG5ldC5jbiBnb3YuY24gb3JnLmNuICcgK1xuXHQgICAgICAgICAgICAgICAgLy8g5Lit5paH5Zu95YaF5Z+f5ZCNXG5cdCAgICAgICAgICAgICAgICAn5Lit5Zu9IOS4reWbveS6kuiBlC7lhazlj7gg5Lit5Zu95LqS6IGULue9kee7nCAnICtcblx0ICAgICAgICAgICAgICAgIC8vIOaWsOWbvemZheWfn+WQjVxuXHQgICAgICAgICAgICAgICAgJ3RlbCBiaXogY2MgdHYgaW5mbyBuYW1lIGhrIG1vYmkgYXNpYSBjZCB0cmF2ZWwgcHJvIG11c2V1bSBjb29wIGFlcm8gJyArXG5cdCAgICAgICAgICAgICAgICAvLyDkuJbnlYzlkITlm73ln5/lkI3lkI7nvIBcblx0ICAgICAgICAgICAgICAgICdhZCBhZSBhZiBhZyBhaSBhbCBhbSBhbiBhbyBhcSBhciBhcyBhdCBhdSBhdyBheiBiYSBiYiBiZCBiZSBiZiBiZyBiaCBiaSBiaiBibSBibiBibyBiciBicyBidCBidiBidyBieSBieiBjYSBjYyBjZiBjZyBjaCBjaSBjayBjbCBjbSBjbiBjbyBjcSBjciBjdSBjdiBjeCBjeSBjeiBkZSBkaiBkayBkbSBkbyBkeiBlYyBlZSBlZyBlaCBlcyBldCBldiBmaSBmaiBmayBmbSBmbyBmciBnYSBnYiBnZCBnZSBnZiBnaCBnaSBnbCBnbSBnbiBncCBnciBndCBndSBndyBneSBoayBobSBobiBociBodCBodSBpZCBpZSBpbCBpbiBpbyBpcSBpciBpcyBpdCBqbSBqbyBqcCBrZSBrZyBraCBraSBrbSBrbiBrcCBrciBrdyBreSBreiBsYSBsYiBsYyBsaSBsayBsciBscyBsdCBsdSBsdiBseSBtYSBtYyBtZCBtZyBtaCBtbCBtbSBtbiBtbyBtcCBtcSBtciBtcyBtdCBtdiBtdyBteCBteSBteiBuYSBuYyBuZSBuZiBuZyBuaSBubCBubyBucCBuciBudCBudSBueiBvbSBxYSBwYSBwZSBwZiBwZyBwaCBwayBwbCBwbSBwbiBwciBwdCBwdyBweSByZSBybyBydSBydyBzYSBzYiBzYyBzZCBzZSBzZyBzaCBzaSBzaiBzayBzbCBzbSBzbiBzbyBzciBzdCBzdSBzeSBzeiB0YyB0ZCB0ZiB0ZyB0aCB0aiB0ayB0bSB0biB0byB0cCB0ciB0dCB0diB0dyB0eiB1YSB1ZyB1ayB1cyB1eSB2YSB2YyB2ZSB2ZyB2biB2dSB3ZiB3cyB5ZSB5dSB6YSB6bSB6ciB6dydcblx0ICAgICAgICAgICAgKS5zcGxpdCgnICcpXG5cdCAgICAgICAgKVxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4qumCruS7tuWcsOWdgOOAglxuXHQgICAgZW1haWw6IGZ1bmN0aW9uKGRvbWFpbikge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlcignbG93ZXInKSArICcuJyArIHRoaXMud29yZCgpICsgJ0AnICtcblx0ICAgICAgICAgICAgKFxuXHQgICAgICAgICAgICAgICAgZG9tYWluIHx8XG5cdCAgICAgICAgICAgICAgICAodGhpcy53b3JkKCkgKyAnLicgKyB0aGlzLnRsZCgpKVxuXHQgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmNoYXJhY3RlcignbG93ZXInKSArICcuJyArIHRoaXMubGFzdCgpLnRvTG93ZXJDYXNlKCkgKyAnQCcgKyB0aGlzLmxhc3QoKS50b0xvd2VyQ2FzZSgpICsgJy4nICsgdGhpcy50bGQoKVxuXHQgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy53b3JkKCkgKyAnQCcgKyAoZG9tYWluIHx8IHRoaXMuZG9tYWluKCkpXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5LiqIElQIOWcsOWdgOOAglxuXHQgICAgaXA6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWwoMCwgMjU1KSArICcuJyArXG5cdCAgICAgICAgICAgIHRoaXMubmF0dXJhbCgwLCAyNTUpICsgJy4nICtcblx0ICAgICAgICAgICAgdGhpcy5uYXR1cmFsKDAsIDI1NSkgKyAnLicgK1xuXHQgICAgICAgICAgICB0aGlzLm5hdHVyYWwoMCwgMjU1KVxuXHQgICAgfVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgQWRkcmVzc1xuXHQqL1xuXG5cdHZhciBESUNUID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0dmFyIFJFR0lPTiA9IFsn5Lic5YyXJywgJ+WNjuWMlycsICfljY7kuJwnLCAn5Y2O5LitJywgJ+WNjuWNlycsICfopb/ljZcnLCAn6KW/5YyXJ11cblxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4quWkp+WMuuOAglxuXHQgICAgcmVnaW9uOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5waWNrKFJFR0lPTilcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInnnIHvvIjmiJbnm7TovpbluILjgIHoh6rmsrvljLrjgIHnibnliKvooYzmlL/ljLrvvInjgIJcblx0ICAgIHByb3ZpbmNlOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5waWNrKERJQ1QpLm5hbWVcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInluILjgIJcblx0ICAgIGNpdHk6IGZ1bmN0aW9uKHByZWZpeCkge1xuXHQgICAgICAgIHZhciBwcm92aW5jZSA9IHRoaXMucGljayhESUNUKVxuXHQgICAgICAgIHZhciBjaXR5ID0gdGhpcy5waWNrKHByb3ZpbmNlLmNoaWxkcmVuKVxuXHQgICAgICAgIHJldHVybiBwcmVmaXggPyBbcHJvdmluY2UubmFtZSwgY2l0eS5uYW1lXS5qb2luKCcgJykgOiBjaXR5Lm5hbWVcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInljr/jgIJcblx0ICAgIGNvdW50eTogZnVuY3Rpb24ocHJlZml4KSB7XG5cdCAgICAgICAgdmFyIHByb3ZpbmNlID0gdGhpcy5waWNrKERJQ1QpXG5cdCAgICAgICAgdmFyIGNpdHkgPSB0aGlzLnBpY2socHJvdmluY2UuY2hpbGRyZW4pXG5cdCAgICAgICAgdmFyIGNvdW50eSA9IHRoaXMucGljayhjaXR5LmNoaWxkcmVuKSB8fCB7XG5cdCAgICAgICAgICAgIG5hbWU6ICctJ1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcHJlZml4ID8gW3Byb3ZpbmNlLm5hbWUsIGNpdHkubmFtZSwgY291bnR5Lm5hbWVdLmpvaW4oJyAnKSA6IGNvdW50eS5uYW1lXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq6YKu5pS/57yW56CB77yI5YWt5L2N5pWw5a2X77yJ44CCXG5cdCAgICB6aXA6IGZ1bmN0aW9uKGxlbikge1xuXHQgICAgICAgIHZhciB6aXAgPSAnJ1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKGxlbiB8fCA2KTsgaSsrKSB6aXAgKz0gdGhpcy5uYXR1cmFsKDAsIDkpXG5cdCAgICAgICAgcmV0dXJuIHppcFxuXHQgICAgfVxuXG5cdCAgICAvLyBhZGRyZXNzOiBmdW5jdGlvbigpIHt9LFxuXHQgICAgLy8gcGhvbmU6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBhcmVhY29kZTogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldDogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldF9zdWZmaXhlczogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldF9zdWZmaXg6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBzdGF0ZXM6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBzdGF0ZTogZnVuY3Rpb24oKSB7fSxcblx0fVxuXG4vKioqLyB9KSxcbi8qIDE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIEFkZHJlc3Mg5a2X5YW45pWw5o2uXG5cblx0ICAgIOWtl+WFuOaVsOaNruadpea6kCBodHRwOi8vd3d3LmF0YXRlY2gub3JnL2FydGljbGVzLzMwMDI4P3JuZD0yNTQyNTk4NTZcblxuXHQgICAg5Zu95qCHIOecge+8iOW4gu+8iee6p+ihjOaUv+WMuuWIkueggeihqFxuXG5cdCAgICDljY7ljJcgICDljJfkuqzluIIg5aSp5rSl5biCIOays+WMl+ecgSDlsbHopb/nnIEg5YaF6JKZ5Y+k6Ieq5rK75Yy6XG5cdCAgICDkuJzljJcgICDovr3lroHnnIEg5ZCJ5p6X55yBIOm7kem+meaxn+ecgVxuXHQgICAg5Y2O5LicICAg5LiK5rW35biCIOaxn+iLj+ecgSDmtZnmsZ/nnIEg5a6J5b6955yBIOemj+W7uuecgSDmsZ/opb/nnIEg5bGx5Lic55yBXG5cdCAgICDljY7ljZcgICDlub/kuJznnIEg5bm/6KW/5aOu5peP6Ieq5rK75Yy6IOa1t+WNl+ecgVxuXHQgICAg5Y2O5LitICAg5rKz5Y2X55yBIOa5luWMl+ecgSDmuZbljZfnnIFcblx0ICAgIOilv+WNlyAgIOmHjeW6huW4giDlm5vlt53nnIEg6LS15bee55yBIOS6keWNl+ecgSDopb/ol4/oh6rmsrvljLpcblx0ICAgIOilv+WMlyAgIOmZleilv+ecgSDnlJjogoPnnIEg6Z2S5rW355yBIOWugeWkj+WbnuaXj+iHquayu+WMuiDmlrDnlobnu7TlkL7lsJToh6rmsrvljLpcblx0ICAgIOa4r+a+s+WPsCDpppnmuK/nibnliKvooYzmlL/ljLog5r6z6Zeo54m55Yir6KGM5pS/5Yy6IOWPsOa5vuecgVxuXHQgICAgXG5cdCAgICAqKuaOkuW6jyoqXG5cdCAgICBcblx0ICAgIGBgYGpzXG5cdCAgICB2YXIgbWFwID0ge31cblx0ICAgIF8uZWFjaChfLmtleXMoUkVHSU9OUyksZnVuY3Rpb24oaWQpe1xuXHQgICAgICBtYXBbaWRdID0gUkVHSU9OU1tJRF1cblx0ICAgIH0pXG5cdCAgICBKU09OLnN0cmluZ2lmeShtYXApXG5cdCAgICBgYGBcblx0Ki9cblx0dmFyIERJQ1QgPSB7XG5cdCAgICBcIjExMDAwMFwiOiBcIuWMl+S6rFwiLFxuXHQgICAgXCIxMTAxMDBcIjogXCLljJfkuqzluIJcIixcblx0ICAgIFwiMTEwMTAxXCI6IFwi5Lic5Z+O5Yy6XCIsXG5cdCAgICBcIjExMDEwMlwiOiBcIuilv+WfjuWMulwiLFxuXHQgICAgXCIxMTAxMDVcIjogXCLmnJ3pmLPljLpcIixcblx0ICAgIFwiMTEwMTA2XCI6IFwi5Liw5Y+w5Yy6XCIsXG5cdCAgICBcIjExMDEwN1wiOiBcIuefs+aZr+WxseWMulwiLFxuXHQgICAgXCIxMTAxMDhcIjogXCLmtbfmt4DljLpcIixcblx0ICAgIFwiMTEwMTA5XCI6IFwi6Zeo5aS05rKf5Yy6XCIsXG5cdCAgICBcIjExMDExMVwiOiBcIuaIv+WxseWMulwiLFxuXHQgICAgXCIxMTAxMTJcIjogXCLpgJrlt57ljLpcIixcblx0ICAgIFwiMTEwMTEzXCI6IFwi6aG65LmJ5Yy6XCIsXG5cdCAgICBcIjExMDExNFwiOiBcIuaYjOW5s+WMulwiLFxuXHQgICAgXCIxMTAxMTVcIjogXCLlpKflhbTljLpcIixcblx0ICAgIFwiMTEwMTE2XCI6IFwi5oCA5p+U5Yy6XCIsXG5cdCAgICBcIjExMDExN1wiOiBcIuW5s+iwt+WMulwiLFxuXHQgICAgXCIxMTAyMjhcIjogXCLlr4bkupHljr9cIixcblx0ICAgIFwiMTEwMjI5XCI6IFwi5bu25bqG5Y6/XCIsXG5cdCAgICBcIjExMDIzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMjAwMDBcIjogXCLlpKnmtKVcIixcblx0ICAgIFwiMTIwMTAwXCI6IFwi5aSp5rSl5biCXCIsXG5cdCAgICBcIjEyMDEwMVwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCIxMjAxMDJcIjogXCLmsrPkuJzljLpcIixcblx0ICAgIFwiMTIwMTAzXCI6IFwi5rKz6KW/5Yy6XCIsXG5cdCAgICBcIjEyMDEwNFwiOiBcIuWNl+W8gOWMulwiLFxuXHQgICAgXCIxMjAxMDVcIjogXCLmsrPljJfljLpcIixcblx0ICAgIFwiMTIwMTA2XCI6IFwi57qi5qGl5Yy6XCIsXG5cdCAgICBcIjEyMDExMFwiOiBcIuS4nOS4veWMulwiLFxuXHQgICAgXCIxMjAxMTFcIjogXCLopb/pnZLljLpcIixcblx0ICAgIFwiMTIwMTEyXCI6IFwi5rSl5Y2X5Yy6XCIsXG5cdCAgICBcIjEyMDExM1wiOiBcIuWMl+i+sOWMulwiLFxuXHQgICAgXCIxMjAxMTRcIjogXCLmrabmuIXljLpcIixcblx0ICAgIFwiMTIwMTE1XCI6IFwi5a6d5Z275Yy6XCIsXG5cdCAgICBcIjEyMDExNlwiOiBcIua7qOa1t+aWsOWMulwiLFxuXHQgICAgXCIxMjAyMjFcIjogXCLlroHmsrPljr9cIixcblx0ICAgIFwiMTIwMjIzXCI6IFwi6Z2Z5rW35Y6/XCIsXG5cdCAgICBcIjEyMDIyNVwiOiBcIuiTn+WOv1wiLFxuXHQgICAgXCIxMjAyMjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwMDAwXCI6IFwi5rKz5YyX55yBXCIsXG5cdCAgICBcIjEzMDEwMFwiOiBcIuefs+WutuW6hOW4glwiLFxuXHQgICAgXCIxMzAxMDJcIjogXCLplb/lronljLpcIixcblx0ICAgIFwiMTMwMTAzXCI6IFwi5qGl5Lic5Yy6XCIsXG5cdCAgICBcIjEzMDEwNFwiOiBcIuahpeilv+WMulwiLFxuXHQgICAgXCIxMzAxMDVcIjogXCLmlrDljY7ljLpcIixcblx0ICAgIFwiMTMwMTA3XCI6IFwi5LqV6ZmJ55+/5Yy6XCIsXG5cdCAgICBcIjEzMDEwOFwiOiBcIuijleWNjuWMulwiLFxuXHQgICAgXCIxMzAxMjFcIjogXCLkupXpmYnljr9cIixcblx0ICAgIFwiMTMwMTIzXCI6IFwi5q2j5a6a5Y6/XCIsXG5cdCAgICBcIjEzMDEyNFwiOiBcIuagvuWfjuWOv1wiLFxuXHQgICAgXCIxMzAxMjVcIjogXCLooYzllJDljr9cIixcblx0ICAgIFwiMTMwMTI2XCI6IFwi54G15a+/5Y6/XCIsXG5cdCAgICBcIjEzMDEyN1wiOiBcIumrmOmCkeWOv1wiLFxuXHQgICAgXCIxMzAxMjhcIjogXCLmt7Hms73ljr9cIixcblx0ICAgIFwiMTMwMTI5XCI6IFwi6LWe55qH5Y6/XCIsXG5cdCAgICBcIjEzMDEzMFwiOiBcIuaXoOaegeWOv1wiLFxuXHQgICAgXCIxMzAxMzFcIjogXCLlubPlsbHljr9cIixcblx0ICAgIFwiMTMwMTMyXCI6IFwi5YWD5rCP5Y6/XCIsXG5cdCAgICBcIjEzMDEzM1wiOiBcIui1teWOv1wiLFxuXHQgICAgXCIxMzAxODFcIjogXCLovpvpm4bluIJcIixcblx0ICAgIFwiMTMwMTgyXCI6IFwi6JeB5Z+O5biCXCIsXG5cdCAgICBcIjEzMDE4M1wiOiBcIuaZi+W3nuW4glwiLFxuXHQgICAgXCIxMzAxODRcIjogXCLmlrDkuZDluIJcIixcblx0ICAgIFwiMTMwMTg1XCI6IFwi6bm/5rOJ5biCXCIsXG5cdCAgICBcIjEzMDE4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzAyMDBcIjogXCLllJDlsbHluIJcIixcblx0ICAgIFwiMTMwMjAyXCI6IFwi6Lev5Y2X5Yy6XCIsXG5cdCAgICBcIjEzMDIwM1wiOiBcIui3r+WMl+WMulwiLFxuXHQgICAgXCIxMzAyMDRcIjogXCLlj6TlhrbljLpcIixcblx0ICAgIFwiMTMwMjA1XCI6IFwi5byA5bmz5Yy6XCIsXG5cdCAgICBcIjEzMDIwN1wiOiBcIuS4sOWNl+WMulwiLFxuXHQgICAgXCIxMzAyMDhcIjogXCLkuLDmtqbljLpcIixcblx0ICAgIFwiMTMwMjIzXCI6IFwi5rum5Y6/XCIsXG5cdCAgICBcIjEzMDIyNFwiOiBcIua7puWNl+WOv1wiLFxuXHQgICAgXCIxMzAyMjVcIjogXCLkuZDkuq3ljr9cIixcblx0ICAgIFwiMTMwMjI3XCI6IFwi6L+B6KW/5Y6/XCIsXG5cdCAgICBcIjEzMDIyOVwiOiBcIueOieeUsOWOv1wiLFxuXHQgICAgXCIxMzAyMzBcIjogXCLmm7nlpoPnlLjljLpcIixcblx0ICAgIFwiMTMwMjgxXCI6IFwi6YG15YyW5biCXCIsXG5cdCAgICBcIjEzMDI4M1wiOiBcIui/geWuieW4glwiLFxuXHQgICAgXCIxMzAyODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwMzAwXCI6IFwi56em55qH5bKb5biCXCIsXG5cdCAgICBcIjEzMDMwMlwiOiBcIua1t+a4r+WMulwiLFxuXHQgICAgXCIxMzAzMDNcIjogXCLlsbHmtbflhbPljLpcIixcblx0ICAgIFwiMTMwMzA0XCI6IFwi5YyX5oi05rKz5Yy6XCIsXG5cdCAgICBcIjEzMDMyMVwiOiBcIumdkum+mea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzAzMjJcIjogXCLmmIzpu47ljr9cIixcblx0ICAgIFwiMTMwMzIzXCI6IFwi5oqa5a6B5Y6/XCIsXG5cdCAgICBcIjEzMDMyNFwiOiBcIuWNoum+meWOv1wiLFxuXHQgICAgXCIxMzAzOThcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNDAwXCI6IFwi6YKv6YO45biCXCIsXG5cdCAgICBcIjEzMDQwMlwiOiBcIumCr+WxseWMulwiLFxuXHQgICAgXCIxMzA0MDNcIjogXCLkuJvlj7DljLpcIixcblx0ICAgIFwiMTMwNDA0XCI6IFwi5aSN5YW05Yy6XCIsXG5cdCAgICBcIjEzMDQwNlwiOiBcIuWzsOWzsOefv+WMulwiLFxuXHQgICAgXCIxMzA0MjFcIjogXCLpgq/pg7jljr9cIixcblx0ICAgIFwiMTMwNDIzXCI6IFwi5Li05ryz5Y6/XCIsXG5cdCAgICBcIjEzMDQyNFwiOiBcIuaIkOWuieWOv1wiLFxuXHQgICAgXCIxMzA0MjVcIjogXCLlpKflkI3ljr9cIixcblx0ICAgIFwiMTMwNDI2XCI6IFwi5raJ5Y6/XCIsXG5cdCAgICBcIjEzMDQyN1wiOiBcIuejgeWOv1wiLFxuXHQgICAgXCIxMzA0MjhcIjogXCLogqXkuaHljr9cIixcblx0ICAgIFwiMTMwNDI5XCI6IFwi5rC45bm05Y6/XCIsXG5cdCAgICBcIjEzMDQzMFwiOiBcIumCseWOv1wiLFxuXHQgICAgXCIxMzA0MzFcIjogXCLpuKHms73ljr9cIixcblx0ICAgIFwiMTMwNDMyXCI6IFwi5bm/5bmz5Y6/XCIsXG5cdCAgICBcIjEzMDQzM1wiOiBcIummhumZtuWOv1wiLFxuXHQgICAgXCIxMzA0MzRcIjogXCLprY/ljr9cIixcblx0ICAgIFwiMTMwNDM1XCI6IFwi5puy5ZGo5Y6/XCIsXG5cdCAgICBcIjEzMDQ4MVwiOiBcIuatpuWuieW4glwiLFxuXHQgICAgXCIxMzA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNTAwXCI6IFwi6YKi5Y+w5biCXCIsXG5cdCAgICBcIjEzMDUwMlwiOiBcIuahpeS4nOWMulwiLFxuXHQgICAgXCIxMzA1MDNcIjogXCLmoaXopb/ljLpcIixcblx0ICAgIFwiMTMwNTIxXCI6IFwi6YKi5Y+w5Y6/XCIsXG5cdCAgICBcIjEzMDUyMlwiOiBcIuS4tOWfjuWOv1wiLFxuXHQgICAgXCIxMzA1MjNcIjogXCLlhoXkuJjljr9cIixcblx0ICAgIFwiMTMwNTI0XCI6IFwi5p+P5Lmh5Y6/XCIsXG5cdCAgICBcIjEzMDUyNVwiOiBcIumahuWwp+WOv1wiLFxuXHQgICAgXCIxMzA1MjZcIjogXCLku7vljr9cIixcblx0ICAgIFwiMTMwNTI3XCI6IFwi5Y2X5ZKM5Y6/XCIsXG5cdCAgICBcIjEzMDUyOFwiOiBcIuWugeaZi+WOv1wiLFxuXHQgICAgXCIxMzA1MjlcIjogXCLlt6jpub/ljr9cIixcblx0ICAgIFwiMTMwNTMwXCI6IFwi5paw5rKz5Y6/XCIsXG5cdCAgICBcIjEzMDUzMVwiOiBcIuW5v+Wul+WOv1wiLFxuXHQgICAgXCIxMzA1MzJcIjogXCLlubPkuaHljr9cIixcblx0ICAgIFwiMTMwNTMzXCI6IFwi5aiB5Y6/XCIsXG5cdCAgICBcIjEzMDUzNFwiOiBcIua4heays+WOv1wiLFxuXHQgICAgXCIxMzA1MzVcIjogXCLkuLTopb/ljr9cIixcblx0ICAgIFwiMTMwNTgxXCI6IFwi5Y2X5a6r5biCXCIsXG5cdCAgICBcIjEzMDU4MlwiOiBcIuaymeays+W4glwiLFxuXHQgICAgXCIxMzA1ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNjAwXCI6IFwi5L+d5a6a5biCXCIsXG5cdCAgICBcIjEzMDYwMlwiOiBcIuaWsOW4guWMulwiLFxuXHQgICAgXCIxMzA2MDNcIjogXCLljJfluILljLpcIixcblx0ICAgIFwiMTMwNjA0XCI6IFwi5Y2X5biC5Yy6XCIsXG5cdCAgICBcIjEzMDYyMVwiOiBcIua7oeWfjuWOv1wiLFxuXHQgICAgXCIxMzA2MjJcIjogXCLmuIXoi5Hljr9cIixcblx0ICAgIFwiMTMwNjIzXCI6IFwi5rae5rC05Y6/XCIsXG5cdCAgICBcIjEzMDYyNFwiOiBcIumYnOW5s+WOv1wiLFxuXHQgICAgXCIxMzA2MjVcIjogXCLlvpDmsLTljr9cIixcblx0ICAgIFwiMTMwNjI2XCI6IFwi5a6a5YW05Y6/XCIsXG5cdCAgICBcIjEzMDYyN1wiOiBcIuWUkOWOv1wiLFxuXHQgICAgXCIxMzA2MjhcIjogXCLpq5jpmLPljr9cIixcblx0ICAgIFwiMTMwNjI5XCI6IFwi5a655Z+O5Y6/XCIsXG5cdCAgICBcIjEzMDYzMFwiOiBcIua2nua6kOWOv1wiLFxuXHQgICAgXCIxMzA2MzFcIjogXCLmnJvpg73ljr9cIixcblx0ICAgIFwiMTMwNjMyXCI6IFwi5a6J5paw5Y6/XCIsXG5cdCAgICBcIjEzMDYzM1wiOiBcIuaYk+WOv1wiLFxuXHQgICAgXCIxMzA2MzRcIjogXCLmm7LpmLPljr9cIixcblx0ICAgIFwiMTMwNjM1XCI6IFwi6KCh5Y6/XCIsXG5cdCAgICBcIjEzMDYzNlwiOiBcIumhuuW5s+WOv1wiLFxuXHQgICAgXCIxMzA2MzdcIjogXCLljZrph47ljr9cIixcblx0ICAgIFwiMTMwNjM4XCI6IFwi6ZuE5Y6/XCIsXG5cdCAgICBcIjEzMDY4MVwiOiBcIua2v+W3nuW4glwiLFxuXHQgICAgXCIxMzA2ODJcIjogXCLlrprlt57luIJcIixcblx0ICAgIFwiMTMwNjgzXCI6IFwi5a6J5Zu95biCXCIsXG5cdCAgICBcIjEzMDY4NFwiOiBcIumrmOeikeW6l+W4glwiLFxuXHQgICAgXCIxMzA2OTlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNzAwXCI6IFwi5byg5a625Y+j5biCXCIsXG5cdCAgICBcIjEzMDcwMlwiOiBcIuahpeS4nOWMulwiLFxuXHQgICAgXCIxMzA3MDNcIjogXCLmoaXopb/ljLpcIixcblx0ICAgIFwiMTMwNzA1XCI6IFwi5a6j5YyW5Yy6XCIsXG5cdCAgICBcIjEzMDcwNlwiOiBcIuS4i+iKseWbreWMulwiLFxuXHQgICAgXCIxMzA3MjFcIjogXCLlrqPljJbljr9cIixcblx0ICAgIFwiMTMwNzIyXCI6IFwi5byg5YyX5Y6/XCIsXG5cdCAgICBcIjEzMDcyM1wiOiBcIuW6t+S/neWOv1wiLFxuXHQgICAgXCIxMzA3MjRcIjogXCLmsr3mupDljr9cIixcblx0ICAgIFwiMTMwNzI1XCI6IFwi5bCa5LmJ5Y6/XCIsXG5cdCAgICBcIjEzMDcyNlwiOiBcIuiUmuWOv1wiLFxuXHQgICAgXCIxMzA3MjdcIjogXCLpmLPljp/ljr9cIixcblx0ICAgIFwiMTMwNzI4XCI6IFwi5oCA5a6J5Y6/XCIsXG5cdCAgICBcIjEzMDcyOVwiOiBcIuS4h+WFqOWOv1wiLFxuXHQgICAgXCIxMzA3MzBcIjogXCLmgIDmnaXljr9cIixcblx0ICAgIFwiMTMwNzMxXCI6IFwi5ra/6bm/5Y6/XCIsXG5cdCAgICBcIjEzMDczMlwiOiBcIui1pOWfjuWOv1wiLFxuXHQgICAgXCIxMzA3MzNcIjogXCLltIfnpLzljr9cIixcblx0ICAgIFwiMTMwNzM0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjEzMDgwMFwiOiBcIuaJv+W+t+W4glwiLFxuXHQgICAgXCIxMzA4MDJcIjogXCLlj4zmoaXljLpcIixcblx0ICAgIFwiMTMwODAzXCI6IFwi5Y+M5rum5Yy6XCIsXG5cdCAgICBcIjEzMDgwNFwiOiBcIum5sOaJi+iQpeWtkOefv+WMulwiLFxuXHQgICAgXCIxMzA4MjFcIjogXCLmib/lvrfljr9cIixcblx0ICAgIFwiMTMwODIyXCI6IFwi5YW06ZqG5Y6/XCIsXG5cdCAgICBcIjEzMDgyM1wiOiBcIuW5s+azieWOv1wiLFxuXHQgICAgXCIxMzA4MjRcIjogXCLmu6blubPljr9cIixcblx0ICAgIFwiMTMwODI1XCI6IFwi6ZqG5YyW5Y6/XCIsXG5cdCAgICBcIjEzMDgyNlwiOiBcIuS4sOWugea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzA4MjdcIjogXCLlrr3ln47mu6Hml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMTMwODI4XCI6IFwi5Zu05Zy65ruh5peP6JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjEzMDgyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzA5MDBcIjogXCLmsqflt57luIJcIixcblx0ICAgIFwiMTMwOTAyXCI6IFwi5paw5Y2O5Yy6XCIsXG5cdCAgICBcIjEzMDkwM1wiOiBcIui/kOays+WMulwiLFxuXHQgICAgXCIxMzA5MjFcIjogXCLmsqfljr9cIixcblx0ICAgIFwiMTMwOTIyXCI6IFwi6Z2S5Y6/XCIsXG5cdCAgICBcIjEzMDkyM1wiOiBcIuS4nOWFieWOv1wiLFxuXHQgICAgXCIxMzA5MjRcIjogXCLmtbflhbTljr9cIixcblx0ICAgIFwiMTMwOTI1XCI6IFwi55uQ5bGx5Y6/XCIsXG5cdCAgICBcIjEzMDkyNlwiOiBcIuiCg+WugeWOv1wiLFxuXHQgICAgXCIxMzA5MjdcIjogXCLljZfnmq7ljr9cIixcblx0ICAgIFwiMTMwOTI4XCI6IFwi5ZC05qGl5Y6/XCIsXG5cdCAgICBcIjEzMDkyOVwiOiBcIueMruWOv1wiLFxuXHQgICAgXCIxMzA5MzBcIjogXCLlrZ/mnZHlm57ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMTMwOTgxXCI6IFwi5rOK5aS05biCXCIsXG5cdCAgICBcIjEzMDk4MlwiOiBcIuS7u+S4mOW4glwiLFxuXHQgICAgXCIxMzA5ODNcIjogXCLpu4TpqoXluIJcIixcblx0ICAgIFwiMTMwOTg0XCI6IFwi5rKz6Ze05biCXCIsXG5cdCAgICBcIjEzMDk4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzEwMDBcIjogXCLlu4rlnYrluIJcIixcblx0ICAgIFwiMTMxMDAyXCI6IFwi5a6J5qyh5Yy6XCIsXG5cdCAgICBcIjEzMTAwM1wiOiBcIuW5v+mYs+WMulwiLFxuXHQgICAgXCIxMzEwMjJcIjogXCLlm7rlronljr9cIixcblx0ICAgIFwiMTMxMDIzXCI6IFwi5rC45riF5Y6/XCIsXG5cdCAgICBcIjEzMTAyNFwiOiBcIummmeays+WOv1wiLFxuXHQgICAgXCIxMzEwMjVcIjogXCLlpKfln47ljr9cIixcblx0ICAgIFwiMTMxMDI2XCI6IFwi5paH5a6J5Y6/XCIsXG5cdCAgICBcIjEzMTAyOFwiOiBcIuWkp+WOguWbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzEwODFcIjogXCLpnLjlt57luIJcIixcblx0ICAgIFwiMTMxMDgyXCI6IFwi5LiJ5rKz5biCXCIsXG5cdCAgICBcIjEzMTA4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzExMDBcIjogXCLooaHmsLTluIJcIixcblx0ICAgIFwiMTMxMTAyXCI6IFwi5qGD5Z+O5Yy6XCIsXG5cdCAgICBcIjEzMTEyMVwiOiBcIuaeo+W8uuWOv1wiLFxuXHQgICAgXCIxMzExMjJcIjogXCLmrabpgpHljr9cIixcblx0ICAgIFwiMTMxMTIzXCI6IFwi5q2m5by65Y6/XCIsXG5cdCAgICBcIjEzMTEyNFwiOiBcIumltumYs+WOv1wiLFxuXHQgICAgXCIxMzExMjVcIjogXCLlronlubPljr9cIixcblx0ICAgIFwiMTMxMTI2XCI6IFwi5pWF5Z+O5Y6/XCIsXG5cdCAgICBcIjEzMTEyN1wiOiBcIuaZr+WOv1wiLFxuXHQgICAgXCIxMzExMjhcIjogXCLpmJzln47ljr9cIixcblx0ICAgIFwiMTMxMTgxXCI6IFwi5YaA5bee5biCXCIsXG5cdCAgICBcIjEzMTE4MlwiOiBcIua3seW3nuW4glwiLFxuXHQgICAgXCIxMzExODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwMDAwXCI6IFwi5bGx6KW/55yBXCIsXG5cdCAgICBcIjE0MDEwMFwiOiBcIuWkquWOn+W4glwiLFxuXHQgICAgXCIxNDAxMDVcIjogXCLlsI/lupfljLpcIixcblx0ICAgIFwiMTQwMTA2XCI6IFwi6L+O5rO95Yy6XCIsXG5cdCAgICBcIjE0MDEwN1wiOiBcIuadj+iKseWyreWMulwiLFxuXHQgICAgXCIxNDAxMDhcIjogXCLlsJbojYnlnarljLpcIixcblx0ICAgIFwiMTQwMTA5XCI6IFwi5LiH5p+P5p6X5Yy6XCIsXG5cdCAgICBcIjE0MDExMFwiOiBcIuaZi+a6kOWMulwiLFxuXHQgICAgXCIxNDAxMjFcIjogXCLmuIXlvpDljr9cIixcblx0ICAgIFwiMTQwMTIyXCI6IFwi6Ziz5puy5Y6/XCIsXG5cdCAgICBcIjE0MDEyM1wiOiBcIuWohOeDpuWOv1wiLFxuXHQgICAgXCIxNDAxODFcIjogXCLlj6TkuqTluIJcIixcblx0ICAgIFwiMTQwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MDIwMFwiOiBcIuWkp+WQjOW4glwiLFxuXHQgICAgXCIxNDAyMDJcIjogXCLln47ljLpcIixcblx0ICAgIFwiMTQwMjAzXCI6IFwi55+/5Yy6XCIsXG5cdCAgICBcIjE0MDIxMVwiOiBcIuWNl+mDiuWMulwiLFxuXHQgICAgXCIxNDAyMTJcIjogXCLmlrDojaPljLpcIixcblx0ICAgIFwiMTQwMjIxXCI6IFwi6Ziz6auY5Y6/XCIsXG5cdCAgICBcIjE0MDIyMlwiOiBcIuWkqemVh+WOv1wiLFxuXHQgICAgXCIxNDAyMjNcIjogXCLlub/ngbXljr9cIixcblx0ICAgIFwiMTQwMjI0XCI6IFwi54G15LiY5Y6/XCIsXG5cdCAgICBcIjE0MDIyNVwiOiBcIua1kea6kOWOv1wiLFxuXHQgICAgXCIxNDAyMjZcIjogXCLlt6bkupHljr9cIixcblx0ICAgIFwiMTQwMjI3XCI6IFwi5aSn5ZCM5Y6/XCIsXG5cdCAgICBcIjE0MDIyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDAzMDBcIjogXCLpmLPms4nluIJcIixcblx0ICAgIFwiMTQwMzAyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDMwM1wiOiBcIuefv+WMulwiLFxuXHQgICAgXCIxNDAzMTFcIjogXCLpg4rljLpcIixcblx0ICAgIFwiMTQwMzIxXCI6IFwi5bmz5a6a5Y6/XCIsXG5cdCAgICBcIjE0MDMyMlwiOiBcIuebguWOv1wiLFxuXHQgICAgXCIxNDAzMjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwNDAwXCI6IFwi6ZW/5rK75biCXCIsXG5cdCAgICBcIjE0MDQyMVwiOiBcIumVv+ayu+WOv1wiLFxuXHQgICAgXCIxNDA0MjNcIjogXCLopYTlnqPljr9cIixcblx0ICAgIFwiMTQwNDI0XCI6IFwi5bGv55WZ5Y6/XCIsXG5cdCAgICBcIjE0MDQyNVwiOiBcIuW5s+mhuuWOv1wiLFxuXHQgICAgXCIxNDA0MjZcIjogXCLpu47ln47ljr9cIixcblx0ICAgIFwiMTQwNDI3XCI6IFwi5aO25YWz5Y6/XCIsXG5cdCAgICBcIjE0MDQyOFwiOiBcIumVv+WtkOWOv1wiLFxuXHQgICAgXCIxNDA0MjlcIjogXCLmrabkuaHljr9cIixcblx0ICAgIFwiMTQwNDMwXCI6IFwi5rKB5Y6/XCIsXG5cdCAgICBcIjE0MDQzMVwiOiBcIuaygea6kOWOv1wiLFxuXHQgICAgXCIxNDA0ODFcIjogXCLmvZ7ln47luIJcIixcblx0ICAgIFwiMTQwNDgyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDQ4M1wiOiBcIumDiuWMulwiLFxuXHQgICAgXCIxNDA0ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwNTAwXCI6IFwi5pmL5Z+O5biCXCIsXG5cdCAgICBcIjE0MDUwMlwiOiBcIuWfjuWMulwiLFxuXHQgICAgXCIxNDA1MjFcIjogXCLmsoHmsLTljr9cIixcblx0ICAgIFwiMTQwNTIyXCI6IFwi6Ziz5Z+O5Y6/XCIsXG5cdCAgICBcIjE0MDUyNFwiOiBcIumZteW3neWOv1wiLFxuXHQgICAgXCIxNDA1MjVcIjogXCLms73lt57ljr9cIixcblx0ICAgIFwiMTQwNTgxXCI6IFwi6auY5bmz5biCXCIsXG5cdCAgICBcIjE0MDU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA2MDBcIjogXCLmnJTlt57luIJcIixcblx0ICAgIFwiMTQwNjAyXCI6IFwi5pyU5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDYwM1wiOiBcIuW5s+mygeWMulwiLFxuXHQgICAgXCIxNDA2MjFcIjogXCLlsbHpmLTljr9cIixcblx0ICAgIFwiMTQwNjIyXCI6IFwi5bqU5Y6/XCIsXG5cdCAgICBcIjE0MDYyM1wiOiBcIuWPs+eOieWOv1wiLFxuXHQgICAgXCIxNDA2MjRcIjogXCLmgIDku4Hljr9cIixcblx0ICAgIFwiMTQwNjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MDcwMFwiOiBcIuaZi+S4reW4glwiLFxuXHQgICAgXCIxNDA3MDJcIjogXCLmpobmrKHljLpcIixcblx0ICAgIFwiMTQwNzIxXCI6IFwi5qaG56S+5Y6/XCIsXG5cdCAgICBcIjE0MDcyMlwiOiBcIuW3puadg+WOv1wiLFxuXHQgICAgXCIxNDA3MjNcIjogXCLlkozpobrljr9cIixcblx0ICAgIFwiMTQwNzI0XCI6IFwi5piU6Ziz5Y6/XCIsXG5cdCAgICBcIjE0MDcyNVwiOiBcIuWvv+mYs+WOv1wiLFxuXHQgICAgXCIxNDA3MjZcIjogXCLlpKrosLfljr9cIixcblx0ICAgIFwiMTQwNzI3XCI6IFwi56WB5Y6/XCIsXG5cdCAgICBcIjE0MDcyOFwiOiBcIuW5s+mBpeWOv1wiLFxuXHQgICAgXCIxNDA3MjlcIjogXCLngbXnn7Pljr9cIixcblx0ICAgIFwiMTQwNzgxXCI6IFwi5LuL5LyR5biCXCIsXG5cdCAgICBcIjE0MDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA4MDBcIjogXCLov5Dln47luIJcIixcblx0ICAgIFwiMTQwODAyXCI6IFwi55uQ5rmW5Yy6XCIsXG5cdCAgICBcIjE0MDgyMVwiOiBcIuS4tOeMl+WOv1wiLFxuXHQgICAgXCIxNDA4MjJcIjogXCLkuIfojaPljr9cIixcblx0ICAgIFwiMTQwODIzXCI6IFwi6Ze75Zac5Y6/XCIsXG5cdCAgICBcIjE0MDgyNFwiOiBcIueot+WxseWOv1wiLFxuXHQgICAgXCIxNDA4MjVcIjogXCLmlrDnu5vljr9cIixcblx0ICAgIFwiMTQwODI2XCI6IFwi57ub5Y6/XCIsXG5cdCAgICBcIjE0MDgyN1wiOiBcIuWeo+absuWOv1wiLFxuXHQgICAgXCIxNDA4MjhcIjogXCLlpI/ljr9cIixcblx0ICAgIFwiMTQwODI5XCI6IFwi5bmz6ZmG5Y6/XCIsXG5cdCAgICBcIjE0MDgzMFwiOiBcIuiKruWfjuWOv1wiLFxuXHQgICAgXCIxNDA4ODFcIjogXCLmsLjmtY7luIJcIixcblx0ICAgIFwiMTQwODgyXCI6IFwi5rKz5rSl5biCXCIsXG5cdCAgICBcIjE0MDg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA5MDBcIjogXCLlv7vlt57luIJcIixcblx0ICAgIFwiMTQwOTAyXCI6IFwi5b+75bqc5Yy6XCIsXG5cdCAgICBcIjE0MDkyMVwiOiBcIuWumuilhOWOv1wiLFxuXHQgICAgXCIxNDA5MjJcIjogXCLkupTlj7Dljr9cIixcblx0ICAgIFwiMTQwOTIzXCI6IFwi5Luj5Y6/XCIsXG5cdCAgICBcIjE0MDkyNFwiOiBcIue5geWzmeWOv1wiLFxuXHQgICAgXCIxNDA5MjVcIjogXCLlroHmrabljr9cIixcblx0ICAgIFwiMTQwOTI2XCI6IFwi6Z2Z5LmQ5Y6/XCIsXG5cdCAgICBcIjE0MDkyN1wiOiBcIuelnuaxoOWOv1wiLFxuXHQgICAgXCIxNDA5MjhcIjogXCLkupTlr6jljr9cIixcblx0ICAgIFwiMTQwOTI5XCI6IFwi5bKi5bKa5Y6/XCIsXG5cdCAgICBcIjE0MDkzMFwiOiBcIuays+absuWOv1wiLFxuXHQgICAgXCIxNDA5MzFcIjogXCLkv53lvrfljr9cIixcblx0ICAgIFwiMTQwOTMyXCI6IFwi5YGP5YWz5Y6/XCIsXG5cdCAgICBcIjE0MDk4MVwiOiBcIuWOn+W5s+W4glwiLFxuXHQgICAgXCIxNDA5ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQxMDAwXCI6IFwi5Li05rG+5biCXCIsXG5cdCAgICBcIjE0MTAwMlwiOiBcIuWwp+mDveWMulwiLFxuXHQgICAgXCIxNDEwMjFcIjogXCLmm7LmsoPljr9cIixcblx0ICAgIFwiMTQxMDIyXCI6IFwi57+85Z+O5Y6/XCIsXG5cdCAgICBcIjE0MTAyM1wiOiBcIuilhOaxvuWOv1wiLFxuXHQgICAgXCIxNDEwMjRcIjogXCLmtKrmtJ7ljr9cIixcblx0ICAgIFwiMTQxMDI1XCI6IFwi5Y+k5Y6/XCIsXG5cdCAgICBcIjE0MTAyNlwiOiBcIuWuieazveWOv1wiLFxuXHQgICAgXCIxNDEwMjdcIjogXCLmta7lsbHljr9cIixcblx0ICAgIFwiMTQxMDI4XCI6IFwi5ZCJ5Y6/XCIsXG5cdCAgICBcIjE0MTAyOVwiOiBcIuS5oeWugeWOv1wiLFxuXHQgICAgXCIxNDEwMzBcIjogXCLlpKflroHljr9cIixcblx0ICAgIFwiMTQxMDMxXCI6IFwi6Zqw5Y6/XCIsXG5cdCAgICBcIjE0MTAzMlwiOiBcIuawuOWSjOWOv1wiLFxuXHQgICAgXCIxNDEwMzNcIjogXCLokrLljr9cIixcblx0ICAgIFwiMTQxMDM0XCI6IFwi5rG+6KW/5Y6/XCIsXG5cdCAgICBcIjE0MTA4MVwiOiBcIuS+r+mprOW4glwiLFxuXHQgICAgXCIxNDEwODJcIjogXCLpnI3lt57luIJcIixcblx0ICAgIFwiMTQxMDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MTEwMFwiOiBcIuWQleaigeW4glwiLFxuXHQgICAgXCIxNDExMDJcIjogXCLnprvnn7PljLpcIixcblx0ICAgIFwiMTQxMTIxXCI6IFwi5paH5rC05Y6/XCIsXG5cdCAgICBcIjE0MTEyMlwiOiBcIuS6pOWfjuWOv1wiLFxuXHQgICAgXCIxNDExMjNcIjogXCLlhbTljr9cIixcblx0ICAgIFwiMTQxMTI0XCI6IFwi5Li05Y6/XCIsXG5cdCAgICBcIjE0MTEyNVwiOiBcIuafs+ael+WOv1wiLFxuXHQgICAgXCIxNDExMjZcIjogXCLnn7Pmpbzljr9cIixcblx0ICAgIFwiMTQxMTI3XCI6IFwi5bKa5Y6/XCIsXG5cdCAgICBcIjE0MTEyOFwiOiBcIuaWueWxseWOv1wiLFxuXHQgICAgXCIxNDExMjlcIjogXCLkuK3pmLPljr9cIixcblx0ICAgIFwiMTQxMTMwXCI6IFwi5Lqk5Y+j5Y6/XCIsXG5cdCAgICBcIjE0MTE4MVwiOiBcIuWtneS5ieW4glwiLFxuXHQgICAgXCIxNDExODJcIjogXCLmsb7pmLPluIJcIixcblx0ICAgIFwiMTQxMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDAwMFwiOiBcIuWGheiSmeWPpOiHquayu+WMulwiLFxuXHQgICAgXCIxNTAxMDBcIjogXCLlkbzlkozmtannibnluIJcIixcblx0ICAgIFwiMTUwMTAyXCI6IFwi5paw5Z+O5Yy6XCIsXG5cdCAgICBcIjE1MDEwM1wiOiBcIuWbnuawkeWMulwiLFxuXHQgICAgXCIxNTAxMDRcIjogXCLnjonms4nljLpcIixcblx0ICAgIFwiMTUwMTA1XCI6IFwi6LWb572V5Yy6XCIsXG5cdCAgICBcIjE1MDEyMVwiOiBcIuWcn+m7mOeJueW3puaXl1wiLFxuXHQgICAgXCIxNTAxMjJcIjogXCLmiZjlhYvmiZjljr9cIixcblx0ICAgIFwiMTUwMTIzXCI6IFwi5ZKM5p6X5qC85bCU5Y6/XCIsXG5cdCAgICBcIjE1MDEyNFwiOiBcIua4heawtOays+WOv1wiLFxuXHQgICAgXCIxNTAxMjVcIjogXCLmrablt53ljr9cIixcblx0ICAgIFwiMTUwMTI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDIwMFwiOiBcIuWMheWktOW4glwiLFxuXHQgICAgXCIxNTAyMDJcIjogXCLkuJzmsrPljLpcIixcblx0ICAgIFwiMTUwMjAzXCI6IFwi5piG6YO95LuR5Yy6XCIsXG5cdCAgICBcIjE1MDIwNFwiOiBcIumdkuWxseWMulwiLFxuXHQgICAgXCIxNTAyMDVcIjogXCLnn7Pmi5DljLpcIixcblx0ICAgIFwiMTUwMjA2XCI6IFwi55m95LqR6YSC5Y2a55+/5Yy6XCIsXG5cdCAgICBcIjE1MDIwN1wiOiBcIuS5neWOn+WMulwiLFxuXHQgICAgXCIxNTAyMjFcIjogXCLlnJ/pu5jnibnlj7Pml5dcIixcblx0ICAgIFwiMTUwMjIyXCI6IFwi5Zu66Ziz5Y6/XCIsXG5cdCAgICBcIjE1MDIyM1wiOiBcIui+vuWwlOe9leiMguaYjuWuieiBlOWQiOaXl1wiLFxuXHQgICAgXCIxNTAyMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUwMzAwXCI6IFwi5LmM5rW35biCXCIsXG5cdCAgICBcIjE1MDMwMlwiOiBcIua1t+WLg+a5vuWMulwiLFxuXHQgICAgXCIxNTAzMDNcIjogXCLmtbfljZfljLpcIixcblx0ICAgIFwiMTUwMzA0XCI6IFwi5LmM6L6+5Yy6XCIsXG5cdCAgICBcIjE1MDMwNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTA0MDBcIjogXCLotaTls7DluIJcIixcblx0ICAgIFwiMTUwNDAyXCI6IFwi57qi5bGx5Yy6XCIsXG5cdCAgICBcIjE1MDQwM1wiOiBcIuWFg+WuneWxseWMulwiLFxuXHQgICAgXCIxNTA0MDRcIjogXCLmnb7lsbHljLpcIixcblx0ICAgIFwiMTUwNDIxXCI6IFwi6Zi/6bKB56eR5bCU5rKB5peXXCIsXG5cdCAgICBcIjE1MDQyMlwiOiBcIuW3tOael+W3puaXl1wiLFxuXHQgICAgXCIxNTA0MjNcIjogXCLlt7Tmnpflj7Pml5dcIixcblx0ICAgIFwiMTUwNDI0XCI6IFwi5p6X6KW/5Y6/XCIsXG5cdCAgICBcIjE1MDQyNVwiOiBcIuWFi+S7gOWFi+iFvuaXl1wiLFxuXHQgICAgXCIxNTA0MjZcIjogXCLnv4HniZvnibnml5dcIixcblx0ICAgIFwiMTUwNDI4XCI6IFwi5ZaA5ZaH5rKB5peXXCIsXG5cdCAgICBcIjE1MDQyOVwiOiBcIuWugeWfjuWOv1wiLFxuXHQgICAgXCIxNTA0MzBcIjogXCLmlZbmsYnml5dcIixcblx0ICAgIFwiMTUwNDMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDUwMFwiOiBcIumAmui+veW4glwiLFxuXHQgICAgXCIxNTA1MDJcIjogXCLnp5HlsJTmsoHljLpcIixcblx0ICAgIFwiMTUwNTIxXCI6IFwi56eR5bCU5rKB5bem57+85Lit5peXXCIsXG5cdCAgICBcIjE1MDUyMlwiOiBcIuenkeWwlOaygeW3pue/vOWQjuaXl1wiLFxuXHQgICAgXCIxNTA1MjNcIjogXCLlvIDpsoHljr9cIixcblx0ICAgIFwiMTUwNTI0XCI6IFwi5bqT5Lym5peXXCIsXG5cdCAgICBcIjE1MDUyNVwiOiBcIuWliOabvOaXl1wiLFxuXHQgICAgXCIxNTA1MjZcIjogXCLmiY7psoHnibnml5dcIixcblx0ICAgIFwiMTUwNTgxXCI6IFwi6ZyN5p6X6YOt5YuS5biCXCIsXG5cdCAgICBcIjE1MDU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTA2MDBcIjogXCLphILlsJTlpJrmlq/luIJcIixcblx0ICAgIFwiMTUwNjAyXCI6IFwi5Lic6IOc5Yy6XCIsXG5cdCAgICBcIjE1MDYyMVwiOiBcIui+vuaLieeJueaXl1wiLFxuXHQgICAgXCIxNTA2MjJcIjogXCLlh4bmoLzlsJTml5dcIixcblx0ICAgIFwiMTUwNjIzXCI6IFwi6YSC5omY5YWL5YmN5peXXCIsXG5cdCAgICBcIjE1MDYyNFwiOiBcIumEguaJmOWFi+aXl1wiLFxuXHQgICAgXCIxNTA2MjVcIjogXCLmna3plKbml5dcIixcblx0ICAgIFwiMTUwNjI2XCI6IFwi5LmM5a6h5peXXCIsXG5cdCAgICBcIjE1MDYyN1wiOiBcIuS8iumHkemcjea0m+aXl1wiLFxuXHQgICAgXCIxNTA2MjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUwNzAwXCI6IFwi5ZG85Lym6LSd5bCU5biCXCIsXG5cdCAgICBcIjE1MDcwMlwiOiBcIua1t+aLieWwlOWMulwiLFxuXHQgICAgXCIxNTA3MDNcIjogXCLmiY7otYnor7rlsJTljLpcIixcblx0ICAgIFwiMTUwNzIxXCI6IFwi6Zi/6I2j5peXXCIsXG5cdCAgICBcIjE1MDcyMlwiOiBcIuiOq+WKm+i+vueTpui+vuaWoeWwlOaXj+iHquayu+aXl1wiLFxuXHQgICAgXCIxNTA3MjNcIjogXCLphILkvKbmmKXoh6rmsrvml5dcIixcblx0ICAgIFwiMTUwNzI0XCI6IFwi6YSC5rip5YWL5peP6Ieq5rK75peXXCIsXG5cdCAgICBcIjE1MDcyNVwiOiBcIumZiOW3tOWwlOiZjuaXl1wiLFxuXHQgICAgXCIxNTA3MjZcIjogXCLmlrDlt7TlsJTomY7lt6bml5dcIixcblx0ICAgIFwiMTUwNzI3XCI6IFwi5paw5be05bCU6JmO5Y+z5peXXCIsXG5cdCAgICBcIjE1MDc4MVwiOiBcIua7oea0sumHjOW4glwiLFxuXHQgICAgXCIxNTA3ODJcIjogXCLniZnlhYvnn7PluIJcIixcblx0ICAgIFwiMTUwNzgzXCI6IFwi5omO5YWw5bGv5biCXCIsXG5cdCAgICBcIjE1MDc4NFwiOiBcIumineWwlOWPpOe6s+W4glwiLFxuXHQgICAgXCIxNTA3ODVcIjogXCLmoLnmsrPluIJcIixcblx0ICAgIFwiMTUwNzg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDgwMFwiOiBcIuW3tOW9pua3luWwlOW4glwiLFxuXHQgICAgXCIxNTA4MDJcIjogXCLkuLTmsrPljLpcIixcblx0ICAgIFwiMTUwODIxXCI6IFwi5LqU5Y6f5Y6/XCIsXG5cdCAgICBcIjE1MDgyMlwiOiBcIuejtOWPo+WOv1wiLFxuXHQgICAgXCIxNTA4MjNcIjogXCLkuYzmi4nnibnliY3ml5dcIixcblx0ICAgIFwiMTUwODI0XCI6IFwi5LmM5ouJ54m55Lit5peXXCIsXG5cdCAgICBcIjE1MDgyNVwiOiBcIuS5jOaLieeJueWQjuaXl1wiLFxuXHQgICAgXCIxNTA4MjZcIjogXCLmna3plKblkI7ml5dcIixcblx0ICAgIFwiMTUwODI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDkwMFwiOiBcIuS5jOWFsOWvn+W4g+W4glwiLFxuXHQgICAgXCIxNTA5MDJcIjogXCLpm4blroHljLpcIixcblx0ICAgIFwiMTUwOTIxXCI6IFwi5Y2T6LWE5Y6/XCIsXG5cdCAgICBcIjE1MDkyMlwiOiBcIuWMluW+t+WOv1wiLFxuXHQgICAgXCIxNTA5MjNcIjogXCLllYbpg73ljr9cIixcblx0ICAgIFwiMTUwOTI0XCI6IFwi5YW05ZKM5Y6/XCIsXG5cdCAgICBcIjE1MDkyNVwiOiBcIuWHieWfjuWOv1wiLFxuXHQgICAgXCIxNTA5MjZcIjogXCLlr5/lk4jlsJTlj7Pnv7zliY3ml5dcIixcblx0ICAgIFwiMTUwOTI3XCI6IFwi5a+f5ZOI5bCU5Y+z57+85Lit5peXXCIsXG5cdCAgICBcIjE1MDkyOFwiOiBcIuWvn+WTiOWwlOWPs+e/vOWQjuaXl1wiLFxuXHQgICAgXCIxNTA5MjlcIjogXCLlm5vlrZDnjovml5dcIixcblx0ICAgIFwiMTUwOTgxXCI6IFwi5Liw6ZWH5biCXCIsXG5cdCAgICBcIjE1MDk4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTIyMDBcIjogXCLlhbTlronnm59cIixcblx0ICAgIFwiMTUyMjAxXCI6IFwi5LmM5YWw5rWp54m55biCXCIsXG5cdCAgICBcIjE1MjIwMlwiOiBcIumYv+WwlOWxseW4glwiLFxuXHQgICAgXCIxNTIyMjFcIjogXCLnp5HlsJTmsoHlj7Pnv7zliY3ml5dcIixcblx0ICAgIFwiMTUyMjIyXCI6IFwi56eR5bCU5rKB5Y+z57+85Lit5peXXCIsXG5cdCAgICBcIjE1MjIyM1wiOiBcIuaJjui1ieeJueaXl1wiLFxuXHQgICAgXCIxNTIyMjRcIjogXCLnqoHms4nljr9cIixcblx0ICAgIFwiMTUyMjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MjUwMFwiOiBcIumUoeael+mDreWLkuebn1wiLFxuXHQgICAgXCIxNTI1MDFcIjogXCLkuozov57mtannibnluIJcIixcblx0ICAgIFwiMTUyNTAyXCI6IFwi6ZSh5p6X5rWp54m55biCXCIsXG5cdCAgICBcIjE1MjUyMlwiOiBcIumYv+W3tOWYjuaXl1wiLFxuXHQgICAgXCIxNTI1MjNcIjogXCLoi4/lsLznibnlt6bml5dcIixcblx0ICAgIFwiMTUyNTI0XCI6IFwi6IuP5bC854m55Y+z5peXXCIsXG5cdCAgICBcIjE1MjUyNVwiOiBcIuS4nOS5jOePoOephuaygeaXl1wiLFxuXHQgICAgXCIxNTI1MjZcIjogXCLopb/kuYznj6DnqYbmsoHml5dcIixcblx0ICAgIFwiMTUyNTI3XCI6IFwi5aSq5LuG5a+65peXXCIsXG5cdCAgICBcIjE1MjUyOFwiOiBcIumVtum7hOaXl1wiLFxuXHQgICAgXCIxNTI1MjlcIjogXCLmraPplbbnmb3ml5dcIixcblx0ICAgIFwiMTUyNTMwXCI6IFwi5q2j6JOd5peXXCIsXG5cdCAgICBcIjE1MjUzMVwiOiBcIuWkmuS8puWOv1wiLFxuXHQgICAgXCIxNTI1MzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUyOTAwXCI6IFwi6Zi/5ouJ5ZaE55ufXCIsXG5cdCAgICBcIjE1MjkyMVwiOiBcIumYv+aLieWWhOW3puaXl1wiLFxuXHQgICAgXCIxNTI5MjJcIjogXCLpmL/mi4nlloTlj7Pml5dcIixcblx0ICAgIFwiMTUyOTIzXCI6IFwi6aKd5rWO57qz5peXXCIsXG5cdCAgICBcIjE1MjkyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTAwMDBcIjogXCLovr3lroHnnIFcIixcblx0ICAgIFwiMjEwMTAwXCI6IFwi5rKI6Ziz5biCXCIsXG5cdCAgICBcIjIxMDEwMlwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCIyMTAxMDNcIjogXCLmsojmsrPljLpcIixcblx0ICAgIFwiMjEwMTA0XCI6IFwi5aSn5Lic5Yy6XCIsXG5cdCAgICBcIjIxMDEwNVwiOiBcIueah+WnkeWMulwiLFxuXHQgICAgXCIyMTAxMDZcIjogXCLpk4Hopb/ljLpcIixcblx0ICAgIFwiMjEwMTExXCI6IFwi6IuP5a625bGv5Yy6XCIsXG5cdCAgICBcIjIxMDExMlwiOiBcIuS4nOmZteWMulwiLFxuXHQgICAgXCIyMTAxMTNcIjogXCLmlrDln47lrZDljLpcIixcblx0ICAgIFwiMjEwMTE0XCI6IFwi5LqO5rSq5Yy6XCIsXG5cdCAgICBcIjIxMDEyMlwiOiBcIui+veS4reWOv1wiLFxuXHQgICAgXCIyMTAxMjNcIjogXCLlurflubPljr9cIixcblx0ICAgIFwiMjEwMTI0XCI6IFwi5rOV5bqT5Y6/XCIsXG5cdCAgICBcIjIxMDE4MVwiOiBcIuaWsOawkeW4glwiLFxuXHQgICAgXCIyMTAxODRcIjogXCLmsojljJfmlrDljLpcIixcblx0ICAgIFwiMjEwMTg1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDIwMFwiOiBcIuWkp+i/nuW4glwiLFxuXHQgICAgXCIyMTAyMDJcIjogXCLkuK3lsbHljLpcIixcblx0ICAgIFwiMjEwMjAzXCI6IFwi6KW/5bKX5Yy6XCIsXG5cdCAgICBcIjIxMDIwNFwiOiBcIuaymeays+WPo+WMulwiLFxuXHQgICAgXCIyMTAyMTFcIjogXCLnlJjkupXlrZDljLpcIixcblx0ICAgIFwiMjEwMjEyXCI6IFwi5peF6aG65Y+j5Yy6XCIsXG5cdCAgICBcIjIxMDIxM1wiOiBcIumHkeW3nuWMulwiLFxuXHQgICAgXCIyMTAyMjRcIjogXCLplb/mtbfljr9cIixcblx0ICAgIFwiMjEwMjgxXCI6IFwi55Om5oi/5bqX5biCXCIsXG5cdCAgICBcIjIxMDI4MlwiOiBcIuaZruWFsOW6l+W4glwiLFxuXHQgICAgXCIyMTAyODNcIjogXCLluoTmsrPluIJcIixcblx0ICAgIFwiMjEwMjk4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDMwMFwiOiBcIumejeWxseW4glwiLFxuXHQgICAgXCIyMTAzMDJcIjogXCLpk4HkuJzljLpcIixcblx0ICAgIFwiMjEwMzAzXCI6IFwi6ZOB6KW/5Yy6XCIsXG5cdCAgICBcIjIxMDMwNFwiOiBcIueri+WxseWMulwiLFxuXHQgICAgXCIyMTAzMTFcIjogXCLljYPlsbHljLpcIixcblx0ICAgIFwiMjEwMzIxXCI6IFwi5Y+w5a6J5Y6/XCIsXG5cdCAgICBcIjIxMDMyM1wiOiBcIuWyq+Wyqea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTAzODFcIjogXCLmtbfln47luIJcIixcblx0ICAgIFwiMjEwMzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDQwMFwiOiBcIuaKmumhuuW4glwiLFxuXHQgICAgXCIyMTA0MDJcIjogXCLmlrDmiprljLpcIixcblx0ICAgIFwiMjEwNDAzXCI6IFwi5Lic5rSy5Yy6XCIsXG5cdCAgICBcIjIxMDQwNFwiOiBcIuacm+iKseWMulwiLFxuXHQgICAgXCIyMTA0MTFcIjogXCLpobrln47ljLpcIixcblx0ICAgIFwiMjEwNDIxXCI6IFwi5oqa6aG65Y6/XCIsXG5cdCAgICBcIjIxMDQyMlwiOiBcIuaWsOWuvua7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA0MjNcIjogXCLmuIXljp/mu6Hml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMjEwNDI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDUwMFwiOiBcIuacrOa6quW4glwiLFxuXHQgICAgXCIyMTA1MDJcIjogXCLlubPlsbHljLpcIixcblx0ICAgIFwiMjEwNTAzXCI6IFwi5rqq5rmW5Yy6XCIsXG5cdCAgICBcIjIxMDUwNFwiOiBcIuaYjuWxseWMulwiLFxuXHQgICAgXCIyMTA1MDVcIjogXCLljZfoiqzljLpcIixcblx0ICAgIFwiMjEwNTIxXCI6IFwi5pys5rqq5ruh5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIxMDUyMlwiOiBcIuahk+S7gea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA1MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjEwNjAwXCI6IFwi5Li55Lic5biCXCIsXG5cdCAgICBcIjIxMDYwMlwiOiBcIuWFg+WuneWMulwiLFxuXHQgICAgXCIyMTA2MDNcIjogXCLmjK/lhbTljLpcIixcblx0ICAgIFwiMjEwNjA0XCI6IFwi5oyv5a6J5Yy6XCIsXG5cdCAgICBcIjIxMDYyNFwiOiBcIuWuveeUuOa7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA2ODFcIjogXCLkuJzmuK/luIJcIixcblx0ICAgIFwiMjEwNjgyXCI6IFwi5Yek5Z+O5biCXCIsXG5cdCAgICBcIjIxMDY4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTA3MDBcIjogXCLplKblt57luIJcIixcblx0ICAgIFwiMjEwNzAyXCI6IFwi5Y+k5aGU5Yy6XCIsXG5cdCAgICBcIjIxMDcwM1wiOiBcIuWHjOays+WMulwiLFxuXHQgICAgXCIyMTA3MTFcIjogXCLlpKrlkozljLpcIixcblx0ICAgIFwiMjEwNzI2XCI6IFwi6buR5bGx5Y6/XCIsXG5cdCAgICBcIjIxMDcyN1wiOiBcIuS5ieWOv1wiLFxuXHQgICAgXCIyMTA3ODFcIjogXCLlh4zmtbfluIJcIixcblx0ICAgIFwiMjEwNzgyXCI6IFwi5YyX6ZWH5biCXCIsXG5cdCAgICBcIjIxMDc4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTA4MDBcIjogXCLokKXlj6PluIJcIixcblx0ICAgIFwiMjEwODAyXCI6IFwi56uZ5YmN5Yy6XCIsXG5cdCAgICBcIjIxMDgwM1wiOiBcIuilv+W4guWMulwiLFxuXHQgICAgXCIyMTA4MDRcIjogXCLpsoXpsbzlnIjljLpcIixcblx0ICAgIFwiMjEwODExXCI6IFwi6ICB6L655Yy6XCIsXG5cdCAgICBcIjIxMDg4MVwiOiBcIuebluW3nuW4glwiLFxuXHQgICAgXCIyMTA4ODJcIjogXCLlpKfnn7PmoaXluIJcIixcblx0ICAgIFwiMjEwODgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDkwMFwiOiBcIumYnOaWsOW4glwiLFxuXHQgICAgXCIyMTA5MDJcIjogXCLmtbflt57ljLpcIixcblx0ICAgIFwiMjEwOTAzXCI6IFwi5paw6YKx5Yy6XCIsXG5cdCAgICBcIjIxMDkwNFwiOiBcIuWkquW5s+WMulwiLFxuXHQgICAgXCIyMTA5MDVcIjogXCLmuIXmsrPpl6jljLpcIixcblx0ICAgIFwiMjEwOTExXCI6IFwi57uG5rKz5Yy6XCIsXG5cdCAgICBcIjIxMDkyMVwiOiBcIumYnOaWsOiSmeWPpOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA5MjJcIjogXCLlvbDmrabljr9cIixcblx0ICAgIFwiMjEwOTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTAwMFwiOiBcIui+vemYs+W4glwiLFxuXHQgICAgXCIyMTEwMDJcIjogXCLnmb3loZTljLpcIixcblx0ICAgIFwiMjExMDAzXCI6IFwi5paH5Zyj5Yy6XCIsXG5cdCAgICBcIjIxMTAwNFwiOiBcIuWuj+S8n+WMulwiLFxuXHQgICAgXCIyMTEwMDVcIjogXCLlvJPplb/lsq3ljLpcIixcblx0ICAgIFwiMjExMDExXCI6IFwi5aSq5a2Q5rKz5Yy6XCIsXG5cdCAgICBcIjIxMTAyMVwiOiBcIui+vemYs+WOv1wiLFxuXHQgICAgXCIyMTEwODFcIjogXCLnga/loZTluIJcIixcblx0ICAgIFwiMjExMDgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTEwMFwiOiBcIuebmOmUpuW4glwiLFxuXHQgICAgXCIyMTExMDJcIjogXCLlj4zlj7DlrZDljLpcIixcblx0ICAgIFwiMjExMTAzXCI6IFwi5YW06ZqG5Y+w5Yy6XCIsXG5cdCAgICBcIjIxMTEyMVwiOiBcIuWkp+a0vOWOv1wiLFxuXHQgICAgXCIyMTExMjJcIjogXCLnm5jlsbHljr9cIixcblx0ICAgIFwiMjExMTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTIwMFwiOiBcIumTgeWyreW4glwiLFxuXHQgICAgXCIyMTEyMDJcIjogXCLpk7blt57ljLpcIixcblx0ICAgIFwiMjExMjA0XCI6IFwi5riF5rKz5Yy6XCIsXG5cdCAgICBcIjIxMTIyMVwiOiBcIumTgeWyreWOv1wiLFxuXHQgICAgXCIyMTEyMjNcIjogXCLopb/kuLDljr9cIixcblx0ICAgIFwiMjExMjI0XCI6IFwi5piM5Zu+5Y6/XCIsXG5cdCAgICBcIjIxMTI4MVwiOiBcIuiwg+WFteWxseW4glwiLFxuXHQgICAgXCIyMTEyODJcIjogXCLlvIDljp/luIJcIixcblx0ICAgIFwiMjExMjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTMwMFwiOiBcIuacnemYs+W4glwiLFxuXHQgICAgXCIyMTEzMDJcIjogXCLlj4zloZTljLpcIixcblx0ICAgIFwiMjExMzAzXCI6IFwi6b6Z5Z+O5Yy6XCIsXG5cdCAgICBcIjIxMTMyMVwiOiBcIuacnemYs+WOv1wiLFxuXHQgICAgXCIyMTEzMjJcIjogXCLlu7rlubPljr9cIixcblx0ICAgIFwiMjExMzI0XCI6IFwi5ZaA5ZaH5rKB5bem57+86JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIxMTM4MVwiOiBcIuWMl+elqOW4glwiLFxuXHQgICAgXCIyMTEzODJcIjogXCLlh4zmupDluIJcIixcblx0ICAgIFwiMjExMzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTQwMFwiOiBcIuiRq+iKpuWym+W4glwiLFxuXHQgICAgXCIyMTE0MDJcIjogXCLov57lsbHljLpcIixcblx0ICAgIFwiMjExNDAzXCI6IFwi6b6Z5riv5Yy6XCIsXG5cdCAgICBcIjIxMTQwNFwiOiBcIuWNl+elqOWMulwiLFxuXHQgICAgXCIyMTE0MjFcIjogXCLnu6XkuK3ljr9cIixcblx0ICAgIFwiMjExNDIyXCI6IFwi5bu65piM5Y6/XCIsXG5cdCAgICBcIjIxMTQ4MVwiOiBcIuWFtOWfjuW4glwiLFxuXHQgICAgXCIyMTE0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIwMDAwXCI6IFwi5ZCJ5p6X55yBXCIsXG5cdCAgICBcIjIyMDEwMFwiOiBcIumVv+aYpeW4glwiLFxuXHQgICAgXCIyMjAxMDJcIjogXCLljZflhbPljLpcIixcblx0ICAgIFwiMjIwMTAzXCI6IFwi5a695Z+O5Yy6XCIsXG5cdCAgICBcIjIyMDEwNFwiOiBcIuacnemYs+WMulwiLFxuXHQgICAgXCIyMjAxMDVcIjogXCLkuozpgZPljLpcIixcblx0ICAgIFwiMjIwMTA2XCI6IFwi57u/5Zut5Yy6XCIsXG5cdCAgICBcIjIyMDExMlwiOiBcIuWPjOmYs+WMulwiLFxuXHQgICAgXCIyMjAxMjJcIjogXCLlhpzlronljr9cIixcblx0ICAgIFwiMjIwMTgxXCI6IFwi5Lmd5Y+w5biCXCIsXG5cdCAgICBcIjIyMDE4MlwiOiBcIuamhuagkeW4glwiLFxuXHQgICAgXCIyMjAxODNcIjogXCLlvrfmg6DluIJcIixcblx0ICAgIFwiMjIwMTg4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIyMDIwMFwiOiBcIuWQieael+W4glwiLFxuXHQgICAgXCIyMjAyMDJcIjogXCLmmIzpgpHljLpcIixcblx0ICAgIFwiMjIwMjAzXCI6IFwi6b6Z5r2t5Yy6XCIsXG5cdCAgICBcIjIyMDIwNFwiOiBcIuiIueiQpeWMulwiLFxuXHQgICAgXCIyMjAyMTFcIjogXCLkuLDmu6HljLpcIixcblx0ICAgIFwiMjIwMjIxXCI6IFwi5rC45ZCJ5Y6/XCIsXG5cdCAgICBcIjIyMDI4MVwiOiBcIuibn+ays+W4glwiLFxuXHQgICAgXCIyMjAyODJcIjogXCLmoabnlLjluIJcIixcblx0ICAgIFwiMjIwMjgzXCI6IFwi6IiS5YWw5biCXCIsXG5cdCAgICBcIjIyMDI4NFwiOiBcIuejkOefs+W4glwiLFxuXHQgICAgXCIyMjAyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIwMzAwXCI6IFwi5Zub5bmz5biCXCIsXG5cdCAgICBcIjIyMDMwMlwiOiBcIumTgeilv+WMulwiLFxuXHQgICAgXCIyMjAzMDNcIjogXCLpk4HkuJzljLpcIixcblx0ICAgIFwiMjIwMzIyXCI6IFwi5qKo5qCR5Y6/XCIsXG5cdCAgICBcIjIyMDMyM1wiOiBcIuS8iumAmua7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMjAzODFcIjogXCLlhazkuLvlsq3luIJcIixcblx0ICAgIFwiMjIwMzgyXCI6IFwi5Y+M6L695biCXCIsXG5cdCAgICBcIjIyMDM4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA0MDBcIjogXCLovr3mupDluIJcIixcblx0ICAgIFwiMjIwNDAyXCI6IFwi6b6Z5bGx5Yy6XCIsXG5cdCAgICBcIjIyMDQwM1wiOiBcIuilv+WuieWMulwiLFxuXHQgICAgXCIyMjA0MjFcIjogXCLkuJzkuLDljr9cIixcblx0ICAgIFwiMjIwNDIyXCI6IFwi5Lic6L695Y6/XCIsXG5cdCAgICBcIjIyMDQyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA1MDBcIjogXCLpgJrljJbluIJcIixcblx0ICAgIFwiMjIwNTAyXCI6IFwi5Lic5piM5Yy6XCIsXG5cdCAgICBcIjIyMDUwM1wiOiBcIuS6jOmBk+axn+WMulwiLFxuXHQgICAgXCIyMjA1MjFcIjogXCLpgJrljJbljr9cIixcblx0ICAgIFwiMjIwNTIzXCI6IFwi6L6J5Y2X5Y6/XCIsXG5cdCAgICBcIjIyMDUyNFwiOiBcIuafs+ays+WOv1wiLFxuXHQgICAgXCIyMjA1ODFcIjogXCLmooXmsrPlj6PluIJcIixcblx0ICAgIFwiMjIwNTgyXCI6IFwi6ZuG5a6J5biCXCIsXG5cdCAgICBcIjIyMDU4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA2MDBcIjogXCLnmb3lsbHluIJcIixcblx0ICAgIFwiMjIwNjAyXCI6IFwi5rWR5rGf5Yy6XCIsXG5cdCAgICBcIjIyMDYyMVwiOiBcIuaKmuadvuWOv1wiLFxuXHQgICAgXCIyMjA2MjJcIjogXCLpnZblrofljr9cIixcblx0ICAgIFwiMjIwNjIzXCI6IFwi6ZW/55m95pyd6bKc5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIyMDYyNVwiOiBcIuaxn+a6kOWMulwiLFxuXHQgICAgXCIyMjA2ODFcIjogXCLkuLTmsZ/luIJcIixcblx0ICAgIFwiMjIwNjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIyMDcwMFwiOiBcIuadvuWOn+W4glwiLFxuXHQgICAgXCIyMjA3MDJcIjogXCLlroHmsZ/ljLpcIixcblx0ICAgIFwiMjIwNzIxXCI6IFwi5YmN6YOt5bCU572X5pav6JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIyMDcyMlwiOiBcIumVv+WyreWOv1wiLFxuXHQgICAgXCIyMjA3MjNcIjogXCLkub7lronljr9cIixcblx0ICAgIFwiMjIwNzI0XCI6IFwi5om25L2Z5biCXCIsXG5cdCAgICBcIjIyMDcyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA4MDBcIjogXCLnmb3ln47luIJcIixcblx0ICAgIFwiMjIwODAyXCI6IFwi5rSu5YyX5Yy6XCIsXG5cdCAgICBcIjIyMDgyMVwiOiBcIumVh+i1ieWOv1wiLFxuXHQgICAgXCIyMjA4MjJcIjogXCLpgJrmpobljr9cIixcblx0ICAgIFwiMjIwODgxXCI6IFwi5rSu5Y2X5biCXCIsXG5cdCAgICBcIjIyMDg4MlwiOiBcIuWkp+WuieW4glwiLFxuXHQgICAgXCIyMjA4ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIyNDAwXCI6IFwi5bu26L655pyd6bKc5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjIyMjQwMVwiOiBcIuW7tuWQieW4glwiLFxuXHQgICAgXCIyMjI0MDJcIjogXCLlm77ku6zluIJcIixcblx0ICAgIFwiMjIyNDAzXCI6IFwi5pWm5YyW5biCXCIsXG5cdCAgICBcIjIyMjQwNFwiOiBcIuePsuaYpeW4glwiLFxuXHQgICAgXCIyMjI0MDVcIjogXCLpvpnkupXluIJcIixcblx0ICAgIFwiMjIyNDA2XCI6IFwi5ZKM6b6Z5biCXCIsXG5cdCAgICBcIjIyMjQyNFwiOiBcIuaxqua4heWOv1wiLFxuXHQgICAgXCIyMjI0MjZcIjogXCLlronlm77ljr9cIixcblx0ICAgIFwiMjIyNDI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDAwMFwiOiBcIum7kem+meaxn+ecgVwiLFxuXHQgICAgXCIyMzAxMDBcIjogXCLlk4jlsJTmu6jluIJcIixcblx0ICAgIFwiMjMwMTAyXCI6IFwi6YGT6YeM5Yy6XCIsXG5cdCAgICBcIjIzMDEwM1wiOiBcIuWNl+Wyl+WMulwiLFxuXHQgICAgXCIyMzAxMDRcIjogXCLpgZPlpJbljLpcIixcblx0ICAgIFwiMjMwMTA2XCI6IFwi6aaZ5Z2K5Yy6XCIsXG5cdCAgICBcIjIzMDEwOFwiOiBcIuW5s+aIv+WMulwiLFxuXHQgICAgXCIyMzAxMDlcIjogXCLmnb7ljJfljLpcIixcblx0ICAgIFwiMjMwMTExXCI6IFwi5ZG85YWw5Yy6XCIsXG5cdCAgICBcIjIzMDEyM1wiOiBcIuS+neWFsOWOv1wiLFxuXHQgICAgXCIyMzAxMjRcIjogXCLmlrnmraPljr9cIixcblx0ICAgIFwiMjMwMTI1XCI6IFwi5a6+5Y6/XCIsXG5cdCAgICBcIjIzMDEyNlwiOiBcIuW3tOW9puWOv1wiLFxuXHQgICAgXCIyMzAxMjdcIjogXCLmnKjlhbDljr9cIixcblx0ICAgIFwiMjMwMTI4XCI6IFwi6YCa5rKz5Y6/XCIsXG5cdCAgICBcIjIzMDEyOVwiOiBcIuW7tuWvv+WOv1wiLFxuXHQgICAgXCIyMzAxODFcIjogXCLpmL/ln47ljLpcIixcblx0ICAgIFwiMjMwMTgyXCI6IFwi5Y+M5Z+O5biCXCIsXG5cdCAgICBcIjIzMDE4M1wiOiBcIuWwmuW/l+W4glwiLFxuXHQgICAgXCIyMzAxODRcIjogXCLkupTluLjluIJcIixcblx0ICAgIFwiMjMwMTg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDIwMFwiOiBcIum9kOm9kOWTiOWwlOW4glwiLFxuXHQgICAgXCIyMzAyMDJcIjogXCLpvpnmspnljLpcIixcblx0ICAgIFwiMjMwMjAzXCI6IFwi5bu65Y2O5Yy6XCIsXG5cdCAgICBcIjIzMDIwNFwiOiBcIumTgemUi+WMulwiLFxuXHQgICAgXCIyMzAyMDVcIjogXCLmmILmmILmuqrljLpcIixcblx0ICAgIFwiMjMwMjA2XCI6IFwi5a+M5ouJ5bCU5Z+65Yy6XCIsXG5cdCAgICBcIjIzMDIwN1wiOiBcIueivuWtkOWxseWMulwiLFxuXHQgICAgXCIyMzAyMDhcIjogXCLmooXph4zmlq/ovr7mlqHlsJTml4/ljLpcIixcblx0ICAgIFwiMjMwMjIxXCI6IFwi6b6Z5rGf5Y6/XCIsXG5cdCAgICBcIjIzMDIyM1wiOiBcIuS+neWuieWOv1wiLFxuXHQgICAgXCIyMzAyMjRcIjogXCLms7DmnaXljr9cIixcblx0ICAgIFwiMjMwMjI1XCI6IFwi55SY5Y2X5Y6/XCIsXG5cdCAgICBcIjIzMDIyN1wiOiBcIuWvjOijleWOv1wiLFxuXHQgICAgXCIyMzAyMjlcIjogXCLlhYvlsbHljr9cIixcblx0ICAgIFwiMjMwMjMwXCI6IFwi5YWL5Lic5Y6/XCIsXG5cdCAgICBcIjIzMDIzMVwiOiBcIuaLnOazieWOv1wiLFxuXHQgICAgXCIyMzAyODFcIjogXCLorrfmsrPluIJcIixcblx0ICAgIFwiMjMwMjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDMwMFwiOiBcIum4oeilv+W4glwiLFxuXHQgICAgXCIyMzAzMDJcIjogXCLpuKHlhqDljLpcIixcblx0ICAgIFwiMjMwMzAzXCI6IFwi5oGS5bGx5Yy6XCIsXG5cdCAgICBcIjIzMDMwNFwiOiBcIua7tOmBk+WMulwiLFxuXHQgICAgXCIyMzAzMDVcIjogXCLmoqjmoJHljLpcIixcblx0ICAgIFwiMjMwMzA2XCI6IFwi5Z+O5a2Q5rKz5Yy6XCIsXG5cdCAgICBcIjIzMDMwN1wiOiBcIum6u+WxseWMulwiLFxuXHQgICAgXCIyMzAzMjFcIjogXCLpuKHkuJzljr9cIixcblx0ICAgIFwiMjMwMzgxXCI6IFwi6JmO5p6X5biCXCIsXG5cdCAgICBcIjIzMDM4MlwiOiBcIuWvhuWxseW4glwiLFxuXHQgICAgXCIyMzAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjMwNDAwXCI6IFwi6bmk5bKX5biCXCIsXG5cdCAgICBcIjIzMDQwMlwiOiBcIuWQkemYs+WMulwiLFxuXHQgICAgXCIyMzA0MDNcIjogXCLlt6XlhpzljLpcIixcblx0ICAgIFwiMjMwNDA0XCI6IFwi5Y2X5bGx5Yy6XCIsXG5cdCAgICBcIjIzMDQwNVwiOiBcIuWFtOWuieWMulwiLFxuXHQgICAgXCIyMzA0MDZcIjogXCLkuJzlsbHljLpcIixcblx0ICAgIFwiMjMwNDA3XCI6IFwi5YW05bGx5Yy6XCIsXG5cdCAgICBcIjIzMDQyMVwiOiBcIuiQneWMl+WOv1wiLFxuXHQgICAgXCIyMzA0MjJcIjogXCLnu6Xmu6jljr9cIixcblx0ICAgIFwiMjMwNDIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDUwMFwiOiBcIuWPjOm4reWxseW4glwiLFxuXHQgICAgXCIyMzA1MDJcIjogXCLlsJblsbHljLpcIixcblx0ICAgIFwiMjMwNTAzXCI6IFwi5bKt5Lic5Yy6XCIsXG5cdCAgICBcIjIzMDUwNVwiOiBcIuWbm+aWueWPsOWMulwiLFxuXHQgICAgXCIyMzA1MDZcIjogXCLlrp3lsbHljLpcIixcblx0ICAgIFwiMjMwNTIxXCI6IFwi6ZuG6LSk5Y6/XCIsXG5cdCAgICBcIjIzMDUyMlwiOiBcIuWPi+iwiuWOv1wiLFxuXHQgICAgXCIyMzA1MjNcIjogXCLlrp3muIXljr9cIixcblx0ICAgIFwiMjMwNTI0XCI6IFwi6aW25rKz5Y6/XCIsXG5cdCAgICBcIjIzMDUyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA2MDBcIjogXCLlpKfluobluIJcIixcblx0ICAgIFwiMjMwNjAyXCI6IFwi6JCo5bCU5Zu+5Yy6XCIsXG5cdCAgICBcIjIzMDYwM1wiOiBcIum+meWHpOWMulwiLFxuXHQgICAgXCIyMzA2MDRcIjogXCLorqnog6Hot6/ljLpcIixcblx0ICAgIFwiMjMwNjA1XCI6IFwi57qi5bKX5Yy6XCIsXG5cdCAgICBcIjIzMDYwNlwiOiBcIuWkp+WQjOWMulwiLFxuXHQgICAgXCIyMzA2MjFcIjogXCLogoflt57ljr9cIixcblx0ICAgIFwiMjMwNjIyXCI6IFwi6IKH5rqQ5Y6/XCIsXG5cdCAgICBcIjIzMDYyM1wiOiBcIuael+eUuOWOv1wiLFxuXHQgICAgXCIyMzA2MjRcIjogXCLmnZzlsJTkvK/nibnokpnlj6Tml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMjMwNjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDcwMFwiOiBcIuS8iuaYpeW4glwiLFxuXHQgICAgXCIyMzA3MDJcIjogXCLkvIrmmKXljLpcIixcblx0ICAgIFwiMjMwNzAzXCI6IFwi5Y2X5bKU5Yy6XCIsXG5cdCAgICBcIjIzMDcwNFwiOiBcIuWPi+WlveWMulwiLFxuXHQgICAgXCIyMzA3MDVcIjogXCLopb/mnpfljLpcIixcblx0ICAgIFwiMjMwNzA2XCI6IFwi57+g5bOm5Yy6XCIsXG5cdCAgICBcIjIzMDcwN1wiOiBcIuaWsOmdkuWMulwiLFxuXHQgICAgXCIyMzA3MDhcIjogXCLnvo7muqrljLpcIixcblx0ICAgIFwiMjMwNzA5XCI6IFwi6YeR5bGx5bGv5Yy6XCIsXG5cdCAgICBcIjIzMDcxMFwiOiBcIuS6lOiQpeWMulwiLFxuXHQgICAgXCIyMzA3MTFcIjogXCLkuYzpqazmsrPljLpcIixcblx0ICAgIFwiMjMwNzEyXCI6IFwi5rGk5pe65rKz5Yy6XCIsXG5cdCAgICBcIjIzMDcxM1wiOiBcIuW4puWyreWMulwiLFxuXHQgICAgXCIyMzA3MTRcIjogXCLkuYzkvIrlsq3ljLpcIixcblx0ICAgIFwiMjMwNzE1XCI6IFwi57qi5pif5Yy6XCIsXG5cdCAgICBcIjIzMDcxNlwiOiBcIuS4iueUmOWyreWMulwiLFxuXHQgICAgXCIyMzA3MjJcIjogXCLlmInojavljr9cIixcblx0ICAgIFwiMjMwNzgxXCI6IFwi6ZOB5Yqb5biCXCIsXG5cdCAgICBcIjIzMDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA4MDBcIjogXCLkvbPmnKjmlq/luIJcIixcblx0ICAgIFwiMjMwODAzXCI6IFwi5ZCR6Ziz5Yy6XCIsXG5cdCAgICBcIjIzMDgwNFwiOiBcIuWJjei/m+WMulwiLFxuXHQgICAgXCIyMzA4MDVcIjogXCLkuJzpo47ljLpcIixcblx0ICAgIFwiMjMwODExXCI6IFwi6YOK5Yy6XCIsXG5cdCAgICBcIjIzMDgyMlwiOiBcIuahpuWNl+WOv1wiLFxuXHQgICAgXCIyMzA4MjZcIjogXCLmoablt53ljr9cIixcblx0ICAgIFwiMjMwODI4XCI6IFwi5rGk5Y6f5Y6/XCIsXG5cdCAgICBcIjIzMDgzM1wiOiBcIuaKmui/nOWOv1wiLFxuXHQgICAgXCIyMzA4ODFcIjogXCLlkIzmsZ/luIJcIixcblx0ICAgIFwiMjMwODgyXCI6IFwi5a+M6ZSm5biCXCIsXG5cdCAgICBcIjIzMDg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA5MDBcIjogXCLkuIPlj7DmsrPluIJcIixcblx0ICAgIFwiMjMwOTAyXCI6IFwi5paw5YW05Yy6XCIsXG5cdCAgICBcIjIzMDkwM1wiOiBcIuahg+WxseWMulwiLFxuXHQgICAgXCIyMzA5MDRcIjogXCLojITlrZDmsrPljLpcIixcblx0ICAgIFwiMjMwOTIxXCI6IFwi5YuD5Yip5Y6/XCIsXG5cdCAgICBcIjIzMDkyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzEwMDBcIjogXCLniaHkuLnmsZ/luIJcIixcblx0ICAgIFwiMjMxMDAyXCI6IFwi5Lic5a6J5Yy6XCIsXG5cdCAgICBcIjIzMTAwM1wiOiBcIumYs+aYjuWMulwiLFxuXHQgICAgXCIyMzEwMDRcIjogXCLniLHmsJHljLpcIixcblx0ICAgIFwiMjMxMDA1XCI6IFwi6KW/5a6J5Yy6XCIsXG5cdCAgICBcIjIzMTAyNFwiOiBcIuS4nOWugeWOv1wiLFxuXHQgICAgXCIyMzEwMjVcIjogXCLmnpflj6Pljr9cIixcblx0ICAgIFwiMjMxMDgxXCI6IFwi57ul6Iqs5rKz5biCXCIsXG5cdCAgICBcIjIzMTA4M1wiOiBcIua1t+ael+W4glwiLFxuXHQgICAgXCIyMzEwODRcIjogXCLlroHlronluIJcIixcblx0ICAgIFwiMjMxMDg1XCI6IFwi56mG5qOx5biCXCIsXG5cdCAgICBcIjIzMTA4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzExMDBcIjogXCLpu5HmsrPluIJcIixcblx0ICAgIFwiMjMxMTAyXCI6IFwi54ix6L6J5Yy6XCIsXG5cdCAgICBcIjIzMTEyMVwiOiBcIuWrqeaxn+WOv1wiLFxuXHQgICAgXCIyMzExMjNcIjogXCLpgIrlhYvljr9cIixcblx0ICAgIFwiMjMxMTI0XCI6IFwi5a2Z5ZC05Y6/XCIsXG5cdCAgICBcIjIzMTE4MVwiOiBcIuWMl+WuieW4glwiLFxuXHQgICAgXCIyMzExODJcIjogXCLkupTlpKfov57msaDluIJcIixcblx0ICAgIFwiMjMxMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMTIwMFwiOiBcIue7peWMluW4glwiLFxuXHQgICAgXCIyMzEyMDJcIjogXCLljJfmnpfljLpcIixcblx0ICAgIFwiMjMxMjIxXCI6IFwi5pyb5aWO5Y6/XCIsXG5cdCAgICBcIjIzMTIyMlwiOiBcIuWFsOilv+WOv1wiLFxuXHQgICAgXCIyMzEyMjNcIjogXCLpnZLlhojljr9cIixcblx0ICAgIFwiMjMxMjI0XCI6IFwi5bqG5a6J5Y6/XCIsXG5cdCAgICBcIjIzMTIyNVwiOiBcIuaYjuawtOWOv1wiLFxuXHQgICAgXCIyMzEyMjZcIjogXCLnu6Xmo7Hljr9cIixcblx0ICAgIFwiMjMxMjgxXCI6IFwi5a6J6L6+5biCXCIsXG5cdCAgICBcIjIzMTI4MlwiOiBcIuiCh+S4nOW4glwiLFxuXHQgICAgXCIyMzEyODNcIjogXCLmtbfkvKbluIJcIixcblx0ICAgIFwiMjMxMjg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMjcwMFwiOiBcIuWkp+WFtOWuieWyreWcsOWMulwiLFxuXHQgICAgXCIyMzI3MDJcIjogXCLmnb7lsq3ljLpcIixcblx0ICAgIFwiMjMyNzAzXCI6IFwi5paw5p6X5Yy6XCIsXG5cdCAgICBcIjIzMjcwNFwiOiBcIuWRvOS4reWMulwiLFxuXHQgICAgXCIyMzI3MjFcIjogXCLlkbznjpvljr9cIixcblx0ICAgIFwiMjMyNzIyXCI6IFwi5aGU5rKz5Y6/XCIsXG5cdCAgICBcIjIzMjcyM1wiOiBcIua8oOays+WOv1wiLFxuXHQgICAgXCIyMzI3MjRcIjogXCLliqDmoLzovr7lpYfljLpcIixcblx0ICAgIFwiMjMyNzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMxMDAwMFwiOiBcIuS4iua1t1wiLFxuXHQgICAgXCIzMTAxMDBcIjogXCLkuIrmtbfluIJcIixcblx0ICAgIFwiMzEwMTAxXCI6IFwi6buE5rWm5Yy6XCIsXG5cdCAgICBcIjMxMDEwNFwiOiBcIuW+kOaxh+WMulwiLFxuXHQgICAgXCIzMTAxMDVcIjogXCLplb/lroHljLpcIixcblx0ICAgIFwiMzEwMTA2XCI6IFwi6Z2Z5a6J5Yy6XCIsXG5cdCAgICBcIjMxMDEwN1wiOiBcIuaZrumZgOWMulwiLFxuXHQgICAgXCIzMTAxMDhcIjogXCLpl7jljJfljLpcIixcblx0ICAgIFwiMzEwMTA5XCI6IFwi6Jm55Y+j5Yy6XCIsXG5cdCAgICBcIjMxMDExMFwiOiBcIuadqOa1puWMulwiLFxuXHQgICAgXCIzMTAxMTJcIjogXCLpl7XooYzljLpcIixcblx0ICAgIFwiMzEwMTEzXCI6IFwi5a6d5bGx5Yy6XCIsXG5cdCAgICBcIjMxMDExNFwiOiBcIuWYieWumuWMulwiLFxuXHQgICAgXCIzMTAxMTVcIjogXCLmtabkuJzmlrDljLpcIixcblx0ICAgIFwiMzEwMTE2XCI6IFwi6YeR5bGx5Yy6XCIsXG5cdCAgICBcIjMxMDExN1wiOiBcIuadvuaxn+WMulwiLFxuXHQgICAgXCIzMTAxMThcIjogXCLpnZLmtabljLpcIixcblx0ICAgIFwiMzEwMTIwXCI6IFwi5aWJ6LSk5Yy6XCIsXG5cdCAgICBcIjMxMDIzMFwiOiBcIuW0h+aYjuWOv1wiLFxuXHQgICAgXCIzMTAyMzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwMDAwXCI6IFwi5rGf6IuP55yBXCIsXG5cdCAgICBcIjMyMDEwMFwiOiBcIuWNl+S6rOW4glwiLFxuXHQgICAgXCIzMjAxMDJcIjogXCLnjoTmrabljLpcIixcblx0ICAgIFwiMzIwMTA0XCI6IFwi56em5reu5Yy6XCIsXG5cdCAgICBcIjMyMDEwNVwiOiBcIuW7uumCuuWMulwiLFxuXHQgICAgXCIzMjAxMDZcIjogXCLpvJPmpbzljLpcIixcblx0ICAgIFwiMzIwMTExXCI6IFwi5rWm5Y+j5Yy6XCIsXG5cdCAgICBcIjMyMDExM1wiOiBcIuaglumcnuWMulwiLFxuXHQgICAgXCIzMjAxMTRcIjogXCLpm6joirHlj7DljLpcIixcblx0ICAgIFwiMzIwMTE1XCI6IFwi5rGf5a6B5Yy6XCIsXG5cdCAgICBcIjMyMDExNlwiOiBcIuWFreWQiOWMulwiLFxuXHQgICAgXCIzMjAxMjRcIjogXCLmuqfmsLTljLpcIixcblx0ICAgIFwiMzIwMTI1XCI6IFwi6auY5rez5Yy6XCIsXG5cdCAgICBcIjMyMDEyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjAyMDBcIjogXCLml6DplKHluIJcIixcblx0ICAgIFwiMzIwMjAyXCI6IFwi5bSH5a6J5Yy6XCIsXG5cdCAgICBcIjMyMDIwM1wiOiBcIuWNl+mVv+WMulwiLFxuXHQgICAgXCIzMjAyMDRcIjogXCLljJfloZjljLpcIixcblx0ICAgIFwiMzIwMjA1XCI6IFwi6ZSh5bGx5Yy6XCIsXG5cdCAgICBcIjMyMDIwNlwiOiBcIuaDoOWxseWMulwiLFxuXHQgICAgXCIzMjAyMTFcIjogXCLmu6jmuZbljLpcIixcblx0ICAgIFwiMzIwMjgxXCI6IFwi5rGf6Zi05biCXCIsXG5cdCAgICBcIjMyMDI4MlwiOiBcIuWunOWFtOW4glwiLFxuXHQgICAgXCIzMjAyOTdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwMzAwXCI6IFwi5b6Q5bee5biCXCIsXG5cdCAgICBcIjMyMDMwMlwiOiBcIum8k+alvOWMulwiLFxuXHQgICAgXCIzMjAzMDNcIjogXCLkupHpvpnljLpcIixcblx0ICAgIFwiMzIwMzA1XCI6IFwi6LS+5rGq5Yy6XCIsXG5cdCAgICBcIjMyMDMxMVwiOiBcIuazieWxseWMulwiLFxuXHQgICAgXCIzMjAzMjFcIjogXCLkuLDljr9cIixcblx0ICAgIFwiMzIwMzIyXCI6IFwi5rKb5Y6/XCIsXG5cdCAgICBcIjMyMDMyM1wiOiBcIumTnOWxseWMulwiLFxuXHQgICAgXCIzMjAzMjRcIjogXCLnnaLlroHljr9cIixcblx0ICAgIFwiMzIwMzgxXCI6IFwi5paw5rKC5biCXCIsXG5cdCAgICBcIjMyMDM4MlwiOiBcIumCs+W3nuW4glwiLFxuXHQgICAgXCIzMjAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNDAwXCI6IFwi5bi45bee5biCXCIsXG5cdCAgICBcIjMyMDQwMlwiOiBcIuWkqeWugeWMulwiLFxuXHQgICAgXCIzMjA0MDRcIjogXCLpkp/mpbzljLpcIixcblx0ICAgIFwiMzIwNDA1XCI6IFwi5oia5aKF5aCw5Yy6XCIsXG5cdCAgICBcIjMyMDQxMVwiOiBcIuaWsOWMl+WMulwiLFxuXHQgICAgXCIzMjA0MTJcIjogXCLmrabov5vljLpcIixcblx0ICAgIFwiMzIwNDgxXCI6IFwi5rqn6Ziz5biCXCIsXG5cdCAgICBcIjMyMDQ4MlwiOiBcIumHkeWdm+W4glwiLFxuXHQgICAgXCIzMjA0ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNTAwXCI6IFwi6IuP5bee5biCXCIsXG5cdCAgICBcIjMyMDUwNVwiOiBcIuiZjuS4mOWMulwiLFxuXHQgICAgXCIzMjA1MDZcIjogXCLlkLTkuK3ljLpcIixcblx0ICAgIFwiMzIwNTA3XCI6IFwi55u45Z+O5Yy6XCIsXG5cdCAgICBcIjMyMDUwOFwiOiBcIuWnkeiLj+WMulwiLFxuXHQgICAgXCIzMjA1ODFcIjogXCLluLjnhp/luIJcIixcblx0ICAgIFwiMzIwNTgyXCI6IFwi5byg5a625riv5biCXCIsXG5cdCAgICBcIjMyMDU4M1wiOiBcIuaYhuWxseW4glwiLFxuXHQgICAgXCIzMjA1ODRcIjogXCLlkLTmsZ/ljLpcIixcblx0ICAgIFwiMzIwNTg1XCI6IFwi5aSq5LuT5biCXCIsXG5cdCAgICBcIjMyMDU5NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjA2MDBcIjogXCLljZfpgJrluIJcIixcblx0ICAgIFwiMzIwNjAyXCI6IFwi5bSH5bed5Yy6XCIsXG5cdCAgICBcIjMyMDYxMVwiOiBcIua4r+mXuOWMulwiLFxuXHQgICAgXCIzMjA2MTJcIjogXCLpgJrlt57ljLpcIixcblx0ICAgIFwiMzIwNjIxXCI6IFwi5rW35a6J5Y6/XCIsXG5cdCAgICBcIjMyMDYyM1wiOiBcIuWmguS4nOWOv1wiLFxuXHQgICAgXCIzMjA2ODFcIjogXCLlkK/kuJzluIJcIixcblx0ICAgIFwiMzIwNjgyXCI6IFwi5aaC55qL5biCXCIsXG5cdCAgICBcIjMyMDY4NFwiOiBcIua1t+mXqOW4glwiLFxuXHQgICAgXCIzMjA2OTRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNzAwXCI6IFwi6L+e5LqR5riv5biCXCIsXG5cdCAgICBcIjMyMDcwM1wiOiBcIui/nuS6keWMulwiLFxuXHQgICAgXCIzMjA3MDVcIjogXCLmlrDmtabljLpcIixcblx0ICAgIFwiMzIwNzA2XCI6IFwi5rW35bee5Yy6XCIsXG5cdCAgICBcIjMyMDcyMVwiOiBcIui1o+amhuWOv1wiLFxuXHQgICAgXCIzMjA3MjJcIjogXCLkuJzmtbfljr9cIixcblx0ICAgIFwiMzIwNzIzXCI6IFwi54GM5LqR5Y6/XCIsXG5cdCAgICBcIjMyMDcyNFwiOiBcIueBjOWNl+WOv1wiLFxuXHQgICAgXCIzMjA3MjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwODAwXCI6IFwi5reu5a6J5biCXCIsXG5cdCAgICBcIjMyMDgwMlwiOiBcIua4heays+WMulwiLFxuXHQgICAgXCIzMjA4MDNcIjogXCLmt67lronljLpcIixcblx0ICAgIFwiMzIwODA0XCI6IFwi5reu6Zi05Yy6XCIsXG5cdCAgICBcIjMyMDgxMVwiOiBcIua4hea1puWMulwiLFxuXHQgICAgXCIzMjA4MjZcIjogXCLmtp/msLTljr9cIixcblx0ICAgIFwiMzIwODI5XCI6IFwi5rSq5rO95Y6/XCIsXG5cdCAgICBcIjMyMDgzMFwiOiBcIuebseecmeWOv1wiLFxuXHQgICAgXCIzMjA4MzFcIjogXCLph5HmuZbljr9cIixcblx0ICAgIFwiMzIwODMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMyMDkwMFwiOiBcIuebkOWfjuW4glwiLFxuXHQgICAgXCIzMjA5MDJcIjogXCLkuq3muZbljLpcIixcblx0ICAgIFwiMzIwOTAzXCI6IFwi55uQ6YO95Yy6XCIsXG5cdCAgICBcIjMyMDkyMVwiOiBcIuWTjeawtOWOv1wiLFxuXHQgICAgXCIzMjA5MjJcIjogXCLmu6jmtbfljr9cIixcblx0ICAgIFwiMzIwOTIzXCI6IFwi6Zic5a6B5Y6/XCIsXG5cdCAgICBcIjMyMDkyNFwiOiBcIuWwhOmYs+WOv1wiLFxuXHQgICAgXCIzMjA5MjVcIjogXCLlu7rmuZbljr9cIixcblx0ICAgIFwiMzIwOTgxXCI6IFwi5Lic5Y+w5biCXCIsXG5cdCAgICBcIjMyMDk4MlwiOiBcIuWkp+S4sOW4glwiLFxuXHQgICAgXCIzMjA5ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIxMDAwXCI6IFwi5oms5bee5biCXCIsXG5cdCAgICBcIjMyMTAwMlwiOiBcIuW5v+mZteWMulwiLFxuXHQgICAgXCIzMjEwMDNcIjogXCLpgpfmsZ/ljLpcIixcblx0ICAgIFwiMzIxMDIzXCI6IFwi5a6d5bqU5Y6/XCIsXG5cdCAgICBcIjMyMTA4MVwiOiBcIuS7quW+geW4glwiLFxuXHQgICAgXCIzMjEwODRcIjogXCLpq5jpgq7luIJcIixcblx0ICAgIFwiMzIxMDg4XCI6IFwi5rGf6YO95Yy6XCIsXG5cdCAgICBcIjMyMTA5M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjExMDBcIjogXCLplYfmsZ/luIJcIixcblx0ICAgIFwiMzIxMTAyXCI6IFwi5Lqs5Y+j5Yy6XCIsXG5cdCAgICBcIjMyMTExMVwiOiBcIua2puW3nuWMulwiLFxuXHQgICAgXCIzMjExMTJcIjogXCLkuLnlvpLljLpcIixcblx0ICAgIFwiMzIxMTgxXCI6IFwi5Li56Ziz5biCXCIsXG5cdCAgICBcIjMyMTE4MlwiOiBcIuaJrOS4reW4glwiLFxuXHQgICAgXCIzMjExODNcIjogXCLlj6XlrrnluIJcIixcblx0ICAgIFwiMzIxMTg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMyMTIwMFwiOiBcIuazsOW3nuW4glwiLFxuXHQgICAgXCIzMjEyMDJcIjogXCLmtbfpmbXljLpcIixcblx0ICAgIFwiMzIxMjAzXCI6IFwi6auY5riv5Yy6XCIsXG5cdCAgICBcIjMyMTI4MVwiOiBcIuWFtOWMluW4glwiLFxuXHQgICAgXCIzMjEyODJcIjogXCLpnZbmsZ/luIJcIixcblx0ICAgIFwiMzIxMjgzXCI6IFwi5rOw5YW05biCXCIsXG5cdCAgICBcIjMyMTI4NFwiOiBcIuWnnOWgsOWMulwiLFxuXHQgICAgXCIzMjEyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIxMzAwXCI6IFwi5a6/6L+B5biCXCIsXG5cdCAgICBcIjMyMTMwMlwiOiBcIuWuv+WfjuWMulwiLFxuXHQgICAgXCIzMjEzMTFcIjogXCLlrr/osavljLpcIixcblx0ICAgIFwiMzIxMzIyXCI6IFwi5rKt6Ziz5Y6/XCIsXG5cdCAgICBcIjMyMTMyM1wiOiBcIuazl+mYs+WOv1wiLFxuXHQgICAgXCIzMjEzMjRcIjogXCLms5fmtKrljr9cIixcblx0ICAgIFwiMzIxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDAwMFwiOiBcIua1meaxn+ecgVwiLFxuXHQgICAgXCIzMzAxMDBcIjogXCLmna3lt57luIJcIixcblx0ICAgIFwiMzMwMTAyXCI6IFwi5LiK5Z+O5Yy6XCIsXG5cdCAgICBcIjMzMDEwM1wiOiBcIuS4i+WfjuWMulwiLFxuXHQgICAgXCIzMzAxMDRcIjogXCLmsZ/lubLljLpcIixcblx0ICAgIFwiMzMwMTA1XCI6IFwi5oux5aKF5Yy6XCIsXG5cdCAgICBcIjMzMDEwNlwiOiBcIuilv+a5luWMulwiLFxuXHQgICAgXCIzMzAxMDhcIjogXCLmu6jmsZ/ljLpcIixcblx0ICAgIFwiMzMwMTA5XCI6IFwi6JCn5bGx5Yy6XCIsXG5cdCAgICBcIjMzMDExMFwiOiBcIuS9meadreWMulwiLFxuXHQgICAgXCIzMzAxMjJcIjogXCLmoZDlupDljr9cIixcblx0ICAgIFwiMzMwMTI3XCI6IFwi5rez5a6J5Y6/XCIsXG5cdCAgICBcIjMzMDE4MlwiOiBcIuW7uuW+t+W4glwiLFxuXHQgICAgXCIzMzAxODNcIjogXCLlr4zpmLPluIJcIixcblx0ICAgIFwiMzMwMTg1XCI6IFwi5Li05a6J5biCXCIsXG5cdCAgICBcIjMzMDE4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzAyMDBcIjogXCLlroHms6LluIJcIixcblx0ICAgIFwiMzMwMjAzXCI6IFwi5rW35puZ5Yy6XCIsXG5cdCAgICBcIjMzMDIwNFwiOiBcIuaxn+S4nOWMulwiLFxuXHQgICAgXCIzMzAyMDVcIjogXCLmsZ/ljJfljLpcIixcblx0ICAgIFwiMzMwMjA2XCI6IFwi5YyX5LuR5Yy6XCIsXG5cdCAgICBcIjMzMDIxMVwiOiBcIumVh+a1t+WMulwiLFxuXHQgICAgXCIzMzAyMTJcIjogXCLphJ7lt57ljLpcIixcblx0ICAgIFwiMzMwMjI1XCI6IFwi6LGh5bGx5Y6/XCIsXG5cdCAgICBcIjMzMDIyNlwiOiBcIuWugea1t+WOv1wiLFxuXHQgICAgXCIzMzAyODFcIjogXCLkvZnlp5rluIJcIixcblx0ICAgIFwiMzMwMjgyXCI6IFwi5oWI5rqq5biCXCIsXG5cdCAgICBcIjMzMDI4M1wiOiBcIuWlieWMluW4glwiLFxuXHQgICAgXCIzMzAyODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzMwMzAwXCI6IFwi5rip5bee5biCXCIsXG5cdCAgICBcIjMzMDMwMlwiOiBcIum5v+WfjuWMulwiLFxuXHQgICAgXCIzMzAzMDNcIjogXCLpvpnmub7ljLpcIixcblx0ICAgIFwiMzMwMzA0XCI6IFwi55Ov5rW35Yy6XCIsXG5cdCAgICBcIjMzMDMyMlwiOiBcIua0nuWktOWOv1wiLFxuXHQgICAgXCIzMzAzMjRcIjogXCLmsLjlmInljr9cIixcblx0ICAgIFwiMzMwMzI2XCI6IFwi5bmz6Ziz5Y6/XCIsXG5cdCAgICBcIjMzMDMyN1wiOiBcIuiLjeWNl+WOv1wiLFxuXHQgICAgXCIzMzAzMjhcIjogXCLmlofmiJDljr9cIixcblx0ICAgIFwiMzMwMzI5XCI6IFwi5rOw6aG65Y6/XCIsXG5cdCAgICBcIjMzMDM4MVwiOiBcIueRnuWuieW4glwiLFxuXHQgICAgXCIzMzAzODJcIjogXCLkuZDmuIXluIJcIixcblx0ICAgIFwiMzMwMzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDQwMFwiOiBcIuWYieWFtOW4glwiLFxuXHQgICAgXCIzMzA0MDJcIjogXCLljZfmuZbljLpcIixcblx0ICAgIFwiMzMwNDExXCI6IFwi56eA5rSy5Yy6XCIsXG5cdCAgICBcIjMzMDQyMVwiOiBcIuWYieWWhOWOv1wiLFxuXHQgICAgXCIzMzA0MjRcIjogXCLmtbfnm5Dljr9cIixcblx0ICAgIFwiMzMwNDgxXCI6IFwi5rW35a6B5biCXCIsXG5cdCAgICBcIjMzMDQ4MlwiOiBcIuW5s+a5luW4glwiLFxuXHQgICAgXCIzMzA0ODNcIjogXCLmoZDkuaHluIJcIixcblx0ICAgIFwiMzMwNDg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDUwMFwiOiBcIua5luW3nuW4glwiLFxuXHQgICAgXCIzMzA1MDJcIjogXCLlkLTlhbTljLpcIixcblx0ICAgIFwiMzMwNTAzXCI6IFwi5Y2X5rWU5Yy6XCIsXG5cdCAgICBcIjMzMDUyMVwiOiBcIuW+t+a4heWOv1wiLFxuXHQgICAgXCIzMzA1MjJcIjogXCLplb/lhbTljr9cIixcblx0ICAgIFwiMzMwNTIzXCI6IFwi5a6J5ZCJ5Y6/XCIsXG5cdCAgICBcIjMzMDUyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzA2MDBcIjogXCLnu43lhbTluIJcIixcblx0ICAgIFwiMzMwNjAyXCI6IFwi6LaK5Z+O5Yy6XCIsXG5cdCAgICBcIjMzMDYyMVwiOiBcIue7jeWFtOWOv1wiLFxuXHQgICAgXCIzMzA2MjRcIjogXCLmlrDmmIzljr9cIixcblx0ICAgIFwiMzMwNjgxXCI6IFwi6K+45pqo5biCXCIsXG5cdCAgICBcIjMzMDY4MlwiOiBcIuS4iuiZnuW4glwiLFxuXHQgICAgXCIzMzA2ODNcIjogXCLltYrlt57luIJcIixcblx0ICAgIFwiMzMwNjg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDcwMFwiOiBcIumHkeWNjuW4glwiLFxuXHQgICAgXCIzMzA3MDJcIjogXCLlqbrln47ljLpcIixcblx0ICAgIFwiMzMwNzAzXCI6IFwi6YeR5Lic5Yy6XCIsXG5cdCAgICBcIjMzMDcyM1wiOiBcIuatpuS5ieWOv1wiLFxuXHQgICAgXCIzMzA3MjZcIjogXCLmtabmsZ/ljr9cIixcblx0ICAgIFwiMzMwNzI3XCI6IFwi56OQ5a6J5Y6/XCIsXG5cdCAgICBcIjMzMDc4MVwiOiBcIuWFsOa6quW4glwiLFxuXHQgICAgXCIzMzA3ODJcIjogXCLkuYnkuYzluIJcIixcblx0ICAgIFwiMzMwNzgzXCI6IFwi5Lic6Ziz5biCXCIsXG5cdCAgICBcIjMzMDc4NFwiOiBcIuawuOW6t+W4glwiLFxuXHQgICAgXCIzMzA3ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzMwODAwXCI6IFwi6KGi5bee5biCXCIsXG5cdCAgICBcIjMzMDgwMlwiOiBcIuafr+WfjuWMulwiLFxuXHQgICAgXCIzMzA4MDNcIjogXCLooaLmsZ/ljLpcIixcblx0ICAgIFwiMzMwODIyXCI6IFwi5bi45bGx5Y6/XCIsXG5cdCAgICBcIjMzMDgyNFwiOiBcIuW8gOWMluWOv1wiLFxuXHQgICAgXCIzMzA4MjVcIjogXCLpvpnmuLjljr9cIixcblx0ICAgIFwiMzMwODgxXCI6IFwi5rGf5bGx5biCXCIsXG5cdCAgICBcIjMzMDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzA5MDBcIjogXCLoiJ/lsbHluIJcIixcblx0ICAgIFwiMzMwOTAyXCI6IFwi5a6a5rW35Yy6XCIsXG5cdCAgICBcIjMzMDkwM1wiOiBcIuaZrumZgOWMulwiLFxuXHQgICAgXCIzMzA5MjFcIjogXCLlsrHlsbHljr9cIixcblx0ICAgIFwiMzMwOTIyXCI6IFwi5bWK5rOX5Y6/XCIsXG5cdCAgICBcIjMzMDkyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzEwMDBcIjogXCLlj7Dlt57luIJcIixcblx0ICAgIFwiMzMxMDAyXCI6IFwi5qSS5rGf5Yy6XCIsXG5cdCAgICBcIjMzMTAwM1wiOiBcIum7hOWyqeWMulwiLFxuXHQgICAgXCIzMzEwMDRcIjogXCLot6/moaXljLpcIixcblx0ICAgIFwiMzMxMDIxXCI6IFwi546J546v5Y6/XCIsXG5cdCAgICBcIjMzMTAyMlwiOiBcIuS4iemXqOWOv1wiLFxuXHQgICAgXCIzMzEwMjNcIjogXCLlpKnlj7Dljr9cIixcblx0ICAgIFwiMzMxMDI0XCI6IFwi5LuZ5bGF5Y6/XCIsXG5cdCAgICBcIjMzMTA4MVwiOiBcIua4qeWyreW4glwiLFxuXHQgICAgXCIzMzEwODJcIjogXCLkuLTmtbfluIJcIixcblx0ICAgIFwiMzMxMDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMTEwMFwiOiBcIuS4veawtOW4glwiLFxuXHQgICAgXCIzMzExMDJcIjogXCLojrLpg73ljLpcIixcblx0ICAgIFwiMzMxMTIxXCI6IFwi6Z2S55Sw5Y6/XCIsXG5cdCAgICBcIjMzMTEyMlwiOiBcIue8meS6keWOv1wiLFxuXHQgICAgXCIzMzExMjNcIjogXCLpgYLmmIzljr9cIixcblx0ICAgIFwiMzMxMTI0XCI6IFwi5p2+6Ziz5Y6/XCIsXG5cdCAgICBcIjMzMTEyNVwiOiBcIuS6keWSjOWOv1wiLFxuXHQgICAgXCIzMzExMjZcIjogXCLluoblhYPljr9cIixcblx0ICAgIFwiMzMxMTI3XCI6IFwi5pmv5a6B55Wy5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjMzMTE4MVwiOiBcIum+meazieW4glwiLFxuXHQgICAgXCIzMzExODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwMDAwXCI6IFwi5a6J5b6955yBXCIsXG5cdCAgICBcIjM0MDEwMFwiOiBcIuWQiOiCpeW4glwiLFxuXHQgICAgXCIzNDAxMDJcIjogXCLnkbbmtbfljLpcIixcblx0ICAgIFwiMzQwMTAzXCI6IFwi5bqQ6Ziz5Yy6XCIsXG5cdCAgICBcIjM0MDEwNFwiOiBcIuicgOWxseWMulwiLFxuXHQgICAgXCIzNDAxMTFcIjogXCLljIXmsrPljLpcIixcblx0ICAgIFwiMzQwMTIxXCI6IFwi6ZW/5Liw5Y6/XCIsXG5cdCAgICBcIjM0MDEyMlwiOiBcIuiCpeS4nOWOv1wiLFxuXHQgICAgXCIzNDAxMjNcIjogXCLogqXopb/ljr9cIixcblx0ICAgIFwiMzQwMTkyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDIwMFwiOiBcIuiKnOa5luW4glwiLFxuXHQgICAgXCIzNDAyMDJcIjogXCLplZzmuZbljLpcIixcblx0ICAgIFwiMzQwMjAzXCI6IFwi5byL5rGf5Yy6XCIsXG5cdCAgICBcIjM0MDIwN1wiOiBcIum4oOaxn+WMulwiLFxuXHQgICAgXCIzNDAyMDhcIjogXCLkuInlsbHljLpcIixcblx0ICAgIFwiMzQwMjIxXCI6IFwi6Iqc5rmW5Y6/XCIsXG5cdCAgICBcIjM0MDIyMlwiOiBcIue5geaYjOWOv1wiLFxuXHQgICAgXCIzNDAyMjNcIjogXCLljZfpmbXljr9cIixcblx0ICAgIFwiMzQwMjI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDMwMFwiOiBcIuiajOWfoOW4glwiLFxuXHQgICAgXCIzNDAzMDJcIjogXCLpvpnlrZDmuZbljLpcIixcblx0ICAgIFwiMzQwMzAzXCI6IFwi6JqM5bGx5Yy6XCIsXG5cdCAgICBcIjM0MDMwNFwiOiBcIuemueS8muWMulwiLFxuXHQgICAgXCIzNDAzMTFcIjogXCLmt67kuIrljLpcIixcblx0ICAgIFwiMzQwMzIxXCI6IFwi5oCA6L+c5Y6/XCIsXG5cdCAgICBcIjM0MDMyMlwiOiBcIuS6lOays+WOv1wiLFxuXHQgICAgXCIzNDAzMjNcIjogXCLlm7rplYfljr9cIixcblx0ICAgIFwiMzQwMzI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDQwMFwiOiBcIua3ruWNl+W4glwiLFxuXHQgICAgXCIzNDA0MDJcIjogXCLlpKfpgJrljLpcIixcblx0ICAgIFwiMzQwNDAzXCI6IFwi55Sw5a625bq15Yy6XCIsXG5cdCAgICBcIjM0MDQwNFwiOiBcIuiwouWutumbhuWMulwiLFxuXHQgICAgXCIzNDA0MDVcIjogXCLlhavlhazlsbHljLpcIixcblx0ICAgIFwiMzQwNDA2XCI6IFwi5r2Y6ZuG5Yy6XCIsXG5cdCAgICBcIjM0MDQyMVwiOiBcIuWHpOWPsOWOv1wiLFxuXHQgICAgXCIzNDA0MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNTAwXCI6IFwi6ams6Z6N5bGx5biCXCIsXG5cdCAgICBcIjM0MDUwM1wiOiBcIuiKseWxseWMulwiLFxuXHQgICAgXCIzNDA1MDRcIjogXCLpm6jlsbHljLpcIixcblx0ICAgIFwiMzQwNTA2XCI6IFwi5Y2a5pyb5Yy6XCIsXG5cdCAgICBcIjM0MDUyMVwiOiBcIuW9k+a2guWOv1wiLFxuXHQgICAgXCIzNDA1MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNjAwXCI6IFwi5reu5YyX5biCXCIsXG5cdCAgICBcIjM0MDYwMlwiOiBcIuadnOmbhuWMulwiLFxuXHQgICAgXCIzNDA2MDNcIjogXCLnm7jlsbHljLpcIixcblx0ICAgIFwiMzQwNjA0XCI6IFwi54OI5bGx5Yy6XCIsXG5cdCAgICBcIjM0MDYyMVwiOiBcIua/iea6quWOv1wiLFxuXHQgICAgXCIzNDA2MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNzAwXCI6IFwi6ZOc6Zm15biCXCIsXG5cdCAgICBcIjM0MDcwMlwiOiBcIumTnOWumOWxseWMulwiLFxuXHQgICAgXCIzNDA3MDNcIjogXCLni67lrZDlsbHljLpcIixcblx0ICAgIFwiMzQwNzExXCI6IFwi6YOK5Yy6XCIsXG5cdCAgICBcIjM0MDcyMVwiOiBcIumTnOmZteWOv1wiLFxuXHQgICAgXCIzNDA3MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwODAwXCI6IFwi5a6J5bqG5biCXCIsXG5cdCAgICBcIjM0MDgwMlwiOiBcIui/juaxn+WMulwiLFxuXHQgICAgXCIzNDA4MDNcIjogXCLlpKfop4LljLpcIixcblx0ICAgIFwiMzQwODExXCI6IFwi5a6c56eA5Yy6XCIsXG5cdCAgICBcIjM0MDgyMlwiOiBcIuaAgOWugeWOv1wiLFxuXHQgICAgXCIzNDA4MjNcIjogXCLmnp7pmLPljr9cIixcblx0ICAgIFwiMzQwODI0XCI6IFwi5r2c5bGx5Y6/XCIsXG5cdCAgICBcIjM0MDgyNVwiOiBcIuWkqua5luWOv1wiLFxuXHQgICAgXCIzNDA4MjZcIjogXCLlrr/mnb7ljr9cIixcblx0ICAgIFwiMzQwODI3XCI6IFwi5pyb5rGf5Y6/XCIsXG5cdCAgICBcIjM0MDgyOFwiOiBcIuWys+ilv+WOv1wiLFxuXHQgICAgXCIzNDA4ODFcIjogXCLmoZDln47luIJcIixcblx0ICAgIFwiMzQwODgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTAwMFwiOiBcIum7hOWxseW4glwiLFxuXHQgICAgXCIzNDEwMDJcIjogXCLlsa/muqrljLpcIixcblx0ICAgIFwiMzQxMDAzXCI6IFwi6buE5bGx5Yy6XCIsXG5cdCAgICBcIjM0MTAwNFwiOiBcIuW+veW3nuWMulwiLFxuXHQgICAgXCIzNDEwMjFcIjogXCLmrZnljr9cIixcblx0ICAgIFwiMzQxMDIyXCI6IFwi5LyR5a6B5Y6/XCIsXG5cdCAgICBcIjM0MTAyM1wiOiBcIum7n+WOv1wiLFxuXHQgICAgXCIzNDEwMjRcIjogXCLnpYHpl6jljr9cIixcblx0ICAgIFwiMzQxMDI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTEwMFwiOiBcIua7geW3nuW4glwiLFxuXHQgICAgXCIzNDExMDJcIjogXCLnkIXnkIrljLpcIixcblx0ICAgIFwiMzQxMTAzXCI6IFwi5Y2X6LCv5Yy6XCIsXG5cdCAgICBcIjM0MTEyMlwiOiBcIuadpeWuieWOv1wiLFxuXHQgICAgXCIzNDExMjRcIjogXCLlhajmpJLljr9cIixcblx0ICAgIFwiMzQxMTI1XCI6IFwi5a6a6L+c5Y6/XCIsXG5cdCAgICBcIjM0MTEyNlwiOiBcIuWHpOmYs+WOv1wiLFxuXHQgICAgXCIzNDExODFcIjogXCLlpKnplb/luIJcIixcblx0ICAgIFwiMzQxMTgyXCI6IFwi5piO5YWJ5biCXCIsXG5cdCAgICBcIjM0MTE4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNDEyMDBcIjogXCLpmJzpmLPluIJcIixcblx0ICAgIFwiMzQxMjAyXCI6IFwi6aKN5bee5Yy6XCIsXG5cdCAgICBcIjM0MTIwM1wiOiBcIumijeS4nOWMulwiLFxuXHQgICAgXCIzNDEyMDRcIjogXCLpoo3ms4nljLpcIixcblx0ICAgIFwiMzQxMjIxXCI6IFwi5Li05rOJ5Y6/XCIsXG5cdCAgICBcIjM0MTIyMlwiOiBcIuWkquWSjOWOv1wiLFxuXHQgICAgXCIzNDEyMjVcIjogXCLpmJzljZfljr9cIixcblx0ICAgIFwiMzQxMjI2XCI6IFwi6aKN5LiK5Y6/XCIsXG5cdCAgICBcIjM0MTI4MlwiOiBcIueVjOmmluW4glwiLFxuXHQgICAgXCIzNDEyODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxMzAwXCI6IFwi5a6/5bee5biCXCIsXG5cdCAgICBcIjM0MTMwMlwiOiBcIuWfh+ahpeWMulwiLFxuXHQgICAgXCIzNDEzMjFcIjogXCLnoIDlsbHljr9cIixcblx0ICAgIFwiMzQxMzIyXCI6IFwi6JCn5Y6/XCIsXG5cdCAgICBcIjM0MTMyM1wiOiBcIueBteeSp+WOv1wiLFxuXHQgICAgXCIzNDEzMjRcIjogXCLms5fljr9cIixcblx0ICAgIFwiMzQxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTQwMFwiOiBcIuW3oua5luW4glwiLFxuXHQgICAgXCIzNDE0MjFcIjogXCLlupDmsZ/ljr9cIixcblx0ICAgIFwiMzQxNDIyXCI6IFwi5peg5Li65Y6/XCIsXG5cdCAgICBcIjM0MTQyM1wiOiBcIuWQq+WxseWOv1wiLFxuXHQgICAgXCIzNDE0MjRcIjogXCLlkozljr9cIixcblx0ICAgIFwiMzQxNTAwXCI6IFwi5YWt5a6J5biCXCIsXG5cdCAgICBcIjM0MTUwMlwiOiBcIumHkeWuieWMulwiLFxuXHQgICAgXCIzNDE1MDNcIjogXCLoo5XlronljLpcIixcblx0ICAgIFwiMzQxNTIxXCI6IFwi5a+/5Y6/XCIsXG5cdCAgICBcIjM0MTUyMlwiOiBcIumcjemCseWOv1wiLFxuXHQgICAgXCIzNDE1MjNcIjogXCLoiJLln47ljr9cIixcblx0ICAgIFwiMzQxNTI0XCI6IFwi6YeR5a+o5Y6/XCIsXG5cdCAgICBcIjM0MTUyNVwiOiBcIumcjeWxseWOv1wiLFxuXHQgICAgXCIzNDE1MjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxNjAwXCI6IFwi5Lqz5bee5biCXCIsXG5cdCAgICBcIjM0MTYwMlwiOiBcIuiwr+WfjuWMulwiLFxuXHQgICAgXCIzNDE2MjFcIjogXCLmtqHpmLPljr9cIixcblx0ICAgIFwiMzQxNjIyXCI6IFwi6JKZ5Z+O5Y6/XCIsXG5cdCAgICBcIjM0MTYyM1wiOiBcIuWIqei+m+WOv1wiLFxuXHQgICAgXCIzNDE2MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxNzAwXCI6IFwi5rGg5bee5biCXCIsXG5cdCAgICBcIjM0MTcwMlwiOiBcIui0teaxoOWMulwiLFxuXHQgICAgXCIzNDE3MjFcIjogXCLkuJzoh7Pljr9cIixcblx0ICAgIFwiMzQxNzIyXCI6IFwi55+z5Y+w5Y6/XCIsXG5cdCAgICBcIjM0MTcyM1wiOiBcIumdkumYs+WOv1wiLFxuXHQgICAgXCIzNDE3MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxODAwXCI6IFwi5a6j5Z+O5biCXCIsXG5cdCAgICBcIjM0MTgwMlwiOiBcIuWuo+W3nuWMulwiLFxuXHQgICAgXCIzNDE4MjFcIjogXCLpg47muqrljr9cIixcblx0ICAgIFwiMzQxODIyXCI6IFwi5bm/5b635Y6/XCIsXG5cdCAgICBcIjM0MTgyM1wiOiBcIuazvuWOv1wiLFxuXHQgICAgXCIzNDE4MjRcIjogXCLnu6nmuqrljr9cIixcblx0ICAgIFwiMzQxODI1XCI6IFwi5peM5b635Y6/XCIsXG5cdCAgICBcIjM0MTg4MVwiOiBcIuWugeWbveW4glwiLFxuXHQgICAgXCIzNDE4ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwMDAwXCI6IFwi56aP5bu655yBXCIsXG5cdCAgICBcIjM1MDEwMFwiOiBcIuemj+W3nuW4glwiLFxuXHQgICAgXCIzNTAxMDJcIjogXCLpvJPmpbzljLpcIixcblx0ICAgIFwiMzUwMTAzXCI6IFwi5Y+w5rGf5Yy6XCIsXG5cdCAgICBcIjM1MDEwNFwiOiBcIuS7k+WxseWMulwiLFxuXHQgICAgXCIzNTAxMDVcIjogXCLpqazlsL7ljLpcIixcblx0ICAgIFwiMzUwMTExXCI6IFwi5pmL5a6J5Yy6XCIsXG5cdCAgICBcIjM1MDEyMVwiOiBcIumXveS+r+WOv1wiLFxuXHQgICAgXCIzNTAxMjJcIjogXCLov57msZ/ljr9cIixcblx0ICAgIFwiMzUwMTIzXCI6IFwi572X5rqQ5Y6/XCIsXG5cdCAgICBcIjM1MDEyNFwiOiBcIumXvea4heWOv1wiLFxuXHQgICAgXCIzNTAxMjVcIjogXCLmsLjms7Dljr9cIixcblx0ICAgIFwiMzUwMTI4XCI6IFwi5bmz5r2t5Y6/XCIsXG5cdCAgICBcIjM1MDE4MVwiOiBcIuemj+a4heW4glwiLFxuXHQgICAgXCIzNTAxODJcIjogXCLplb/kuZDluIJcIixcblx0ICAgIFwiMzUwMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM1MDIwMFwiOiBcIuWOpumXqOW4glwiLFxuXHQgICAgXCIzNTAyMDNcIjogXCLmgJ3mmI7ljLpcIixcblx0ICAgIFwiMzUwMjA1XCI6IFwi5rW35rKn5Yy6XCIsXG5cdCAgICBcIjM1MDIwNlwiOiBcIua5lumHjOWMulwiLFxuXHQgICAgXCIzNTAyMTFcIjogXCLpm4bnvo7ljLpcIixcblx0ICAgIFwiMzUwMjEyXCI6IFwi5ZCM5a6J5Yy6XCIsXG5cdCAgICBcIjM1MDIxM1wiOiBcIue/lOWuieWMulwiLFxuXHQgICAgXCIzNTAyMTRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwMzAwXCI6IFwi6I6G55Sw5biCXCIsXG5cdCAgICBcIjM1MDMwMlwiOiBcIuWfjuWOouWMulwiLFxuXHQgICAgXCIzNTAzMDNcIjogXCLmtrXmsZ/ljLpcIixcblx0ICAgIFwiMzUwMzA0XCI6IFwi6I2U5Z+O5Yy6XCIsXG5cdCAgICBcIjM1MDMwNVwiOiBcIuengOWxv+WMulwiLFxuXHQgICAgXCIzNTAzMjJcIjogXCLku5nmuLjljr9cIixcblx0ICAgIFwiMzUwMzIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM1MDQwMFwiOiBcIuS4ieaYjuW4glwiLFxuXHQgICAgXCIzNTA0MDJcIjogXCLmooXliJfljLpcIixcblx0ICAgIFwiMzUwNDAzXCI6IFwi5LiJ5YWD5Yy6XCIsXG5cdCAgICBcIjM1MDQyMVwiOiBcIuaYjua6quWOv1wiLFxuXHQgICAgXCIzNTA0MjNcIjogXCLmuIXmtYHljr9cIixcblx0ICAgIFwiMzUwNDI0XCI6IFwi5a6B5YyW5Y6/XCIsXG5cdCAgICBcIjM1MDQyNVwiOiBcIuWkp+eUsOWOv1wiLFxuXHQgICAgXCIzNTA0MjZcIjogXCLlsKTmuqrljr9cIixcblx0ICAgIFwiMzUwNDI3XCI6IFwi5rKZ5Y6/XCIsXG5cdCAgICBcIjM1MDQyOFwiOiBcIuWwhuS5kOWOv1wiLFxuXHQgICAgXCIzNTA0MjlcIjogXCLms7DlroHljr9cIixcblx0ICAgIFwiMzUwNDMwXCI6IFwi5bu65a6B5Y6/XCIsXG5cdCAgICBcIjM1MDQ4MVwiOiBcIuawuOWuieW4glwiLFxuXHQgICAgXCIzNTA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwNTAwXCI6IFwi5rOJ5bee5biCXCIsXG5cdCAgICBcIjM1MDUwMlwiOiBcIumypOWfjuWMulwiLFxuXHQgICAgXCIzNTA1MDNcIjogXCLkuLDms73ljLpcIixcblx0ICAgIFwiMzUwNTA0XCI6IFwi5rSb5rGf5Yy6XCIsXG5cdCAgICBcIjM1MDUwNVwiOiBcIuaziea4r+WMulwiLFxuXHQgICAgXCIzNTA1MjFcIjogXCLmg6Dlronljr9cIixcblx0ICAgIFwiMzUwNTI0XCI6IFwi5a6J5rqq5Y6/XCIsXG5cdCAgICBcIjM1MDUyNVwiOiBcIuawuOaYpeWOv1wiLFxuXHQgICAgXCIzNTA1MjZcIjogXCLlvrfljJbljr9cIixcblx0ICAgIFwiMzUwNTI3XCI6IFwi6YeR6Zeo5Y6/XCIsXG5cdCAgICBcIjM1MDU4MVwiOiBcIuefs+eLruW4glwiLFxuXHQgICAgXCIzNTA1ODJcIjogXCLmmYvmsZ/luIJcIixcblx0ICAgIFwiMzUwNTgzXCI6IFwi5Y2X5a6J5biCXCIsXG5cdCAgICBcIjM1MDU4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNTA2MDBcIjogXCLmvLPlt57luIJcIixcblx0ICAgIFwiMzUwNjAyXCI6IFwi6IqX5Z+O5Yy6XCIsXG5cdCAgICBcIjM1MDYwM1wiOiBcIum+meaWh+WMulwiLFxuXHQgICAgXCIzNTA2MjJcIjogXCLkupHpnITljr9cIixcblx0ICAgIFwiMzUwNjIzXCI6IFwi5ryz5rWm5Y6/XCIsXG5cdCAgICBcIjM1MDYyNFwiOiBcIuivj+WuieWOv1wiLFxuXHQgICAgXCIzNTA2MjVcIjogXCLplb/ms7Dljr9cIixcblx0ICAgIFwiMzUwNjI2XCI6IFwi5Lic5bGx5Y6/XCIsXG5cdCAgICBcIjM1MDYyN1wiOiBcIuWNl+mdluWOv1wiLFxuXHQgICAgXCIzNTA2MjhcIjogXCLlubPlkozljr9cIixcblx0ICAgIFwiMzUwNjI5XCI6IFwi5Y2O5a6J5Y6/XCIsXG5cdCAgICBcIjM1MDY4MVwiOiBcIum+mea1t+W4glwiLFxuXHQgICAgXCIzNTA2ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwNzAwXCI6IFwi5Y2X5bmz5biCXCIsXG5cdCAgICBcIjM1MDcwMlwiOiBcIuW7tuW5s+WMulwiLFxuXHQgICAgXCIzNTA3MjFcIjogXCLpobrmmIzljr9cIixcblx0ICAgIFwiMzUwNzIyXCI6IFwi5rWm5Z+O5Y6/XCIsXG5cdCAgICBcIjM1MDcyM1wiOiBcIuWFieazveWOv1wiLFxuXHQgICAgXCIzNTA3MjRcIjogXCLmnb7muqrljr9cIixcblx0ICAgIFwiMzUwNzI1XCI6IFwi5pS/5ZKM5Y6/XCIsXG5cdCAgICBcIjM1MDc4MVwiOiBcIumCteatpuW4glwiLFxuXHQgICAgXCIzNTA3ODJcIjogXCLmrablpLflsbHluIJcIixcblx0ICAgIFwiMzUwNzgzXCI6IFwi5bu655Ov5biCXCIsXG5cdCAgICBcIjM1MDc4NFwiOiBcIuW7uumYs+W4glwiLFxuXHQgICAgXCIzNTA3ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwODAwXCI6IFwi6b6Z5bKp5biCXCIsXG5cdCAgICBcIjM1MDgwMlwiOiBcIuaWsOe9l+WMulwiLFxuXHQgICAgXCIzNTA4MjFcIjogXCLplb/msYDljr9cIixcblx0ICAgIFwiMzUwODIyXCI6IFwi5rC45a6a5Y6/XCIsXG5cdCAgICBcIjM1MDgyM1wiOiBcIuS4iuadreWOv1wiLFxuXHQgICAgXCIzNTA4MjRcIjogXCLmrablubPljr9cIixcblx0ICAgIFwiMzUwODI1XCI6IFwi6L+e5Z+O5Y6/XCIsXG5cdCAgICBcIjM1MDg4MVwiOiBcIua8s+W5s+W4glwiLFxuXHQgICAgXCIzNTA4ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwOTAwXCI6IFwi5a6B5b635biCXCIsXG5cdCAgICBcIjM1MDkwMlwiOiBcIuiVieWfjuWMulwiLFxuXHQgICAgXCIzNTA5MjFcIjogXCLpnJ7mtabljr9cIixcblx0ICAgIFwiMzUwOTIyXCI6IFwi5Y+k55Sw5Y6/XCIsXG5cdCAgICBcIjM1MDkyM1wiOiBcIuWxj+WNl+WOv1wiLFxuXHQgICAgXCIzNTA5MjRcIjogXCLlr7/lroHljr9cIixcblx0ICAgIFwiMzUwOTI1XCI6IFwi5ZGo5a6B5Y6/XCIsXG5cdCAgICBcIjM1MDkyNlwiOiBcIuafmOiNo+WOv1wiLFxuXHQgICAgXCIzNTA5ODFcIjogXCLnpo/lronluIJcIixcblx0ICAgIFwiMzUwOTgyXCI6IFwi56aP6byO5biCXCIsXG5cdCAgICBcIjM1MDk4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAwMDBcIjogXCLmsZ/opb/nnIFcIixcblx0ICAgIFwiMzYwMTAwXCI6IFwi5Y2X5piM5biCXCIsXG5cdCAgICBcIjM2MDEwMlwiOiBcIuS4nOa5luWMulwiLFxuXHQgICAgXCIzNjAxMDNcIjogXCLopb/muZbljLpcIixcblx0ICAgIFwiMzYwMTA0XCI6IFwi6Z2S5LqR6LCx5Yy6XCIsXG5cdCAgICBcIjM2MDEwNVwiOiBcIua5vumHjOWMulwiLFxuXHQgICAgXCIzNjAxMTFcIjogXCLpnZLlsbHmuZbljLpcIixcblx0ICAgIFwiMzYwMTIxXCI6IFwi5Y2X5piM5Y6/XCIsXG5cdCAgICBcIjM2MDEyMlwiOiBcIuaWsOW7uuWOv1wiLFxuXHQgICAgXCIzNjAxMjNcIjogXCLlronkuYnljr9cIixcblx0ICAgIFwiMzYwMTI0XCI6IFwi6L+b6LSk5Y6/XCIsXG5cdCAgICBcIjM2MDEyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAyMDBcIjogXCLmma/lvrfplYfluIJcIixcblx0ICAgIFwiMzYwMjAyXCI6IFwi5piM5rGf5Yy6XCIsXG5cdCAgICBcIjM2MDIwM1wiOiBcIuePoOWxseWMulwiLFxuXHQgICAgXCIzNjAyMjJcIjogXCLmta7mooHljr9cIixcblx0ICAgIFwiMzYwMjgxXCI6IFwi5LmQ5bmz5biCXCIsXG5cdCAgICBcIjM2MDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAzMDBcIjogXCLokI3kuaHluIJcIixcblx0ICAgIFwiMzYwMzAyXCI6IFwi5a6J5rqQ5Yy6XCIsXG5cdCAgICBcIjM2MDMxM1wiOiBcIua5mOS4nOWMulwiLFxuXHQgICAgXCIzNjAzMjFcIjogXCLojrLoirHljr9cIixcblx0ICAgIFwiMzYwMzIyXCI6IFwi5LiK5qCX5Y6/XCIsXG5cdCAgICBcIjM2MDMyM1wiOiBcIuiKpua6quWOv1wiLFxuXHQgICAgXCIzNjAzMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYwNDAwXCI6IFwi5Lmd5rGf5biCXCIsXG5cdCAgICBcIjM2MDQwMlwiOiBcIuW6kOWxseWMulwiLFxuXHQgICAgXCIzNjA0MDNcIjogXCLmtZTpmLPljLpcIixcblx0ICAgIFwiMzYwNDIxXCI6IFwi5Lmd5rGf5Y6/XCIsXG5cdCAgICBcIjM2MDQyM1wiOiBcIuatpuWugeWOv1wiLFxuXHQgICAgXCIzNjA0MjRcIjogXCLkv67msLTljr9cIixcblx0ICAgIFwiMzYwNDI1XCI6IFwi5rC45L+u5Y6/XCIsXG5cdCAgICBcIjM2MDQyNlwiOiBcIuW+t+WuieWOv1wiLFxuXHQgICAgXCIzNjA0MjdcIjogXCLmmJ/lrZDljr9cIixcblx0ICAgIFwiMzYwNDI4XCI6IFwi6YO95piM5Y6/XCIsXG5cdCAgICBcIjM2MDQyOVwiOiBcIua5luWPo+WOv1wiLFxuXHQgICAgXCIzNjA0MzBcIjogXCLlva3ms73ljr9cIixcblx0ICAgIFwiMzYwNDgxXCI6IFwi55Ge5piM5biCXCIsXG5cdCAgICBcIjM2MDQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA0ODNcIjogXCLlhbHpnZLln47luIJcIixcblx0ICAgIFwiMzYwNTAwXCI6IFwi5paw5L2Z5biCXCIsXG5cdCAgICBcIjM2MDUwMlwiOiBcIua4neawtOWMulwiLFxuXHQgICAgXCIzNjA1MjFcIjogXCLliIblrpzljr9cIixcblx0ICAgIFwiMzYwNTIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM2MDYwMFwiOiBcIum5sOa9reW4glwiLFxuXHQgICAgXCIzNjA2MDJcIjogXCLmnIjmuZbljLpcIixcblx0ICAgIFwiMzYwNjIyXCI6IFwi5L2Z5rGf5Y6/XCIsXG5cdCAgICBcIjM2MDY4MVwiOiBcIui0tea6quW4glwiLFxuXHQgICAgXCIzNjA2ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYwNzAwXCI6IFwi6LWj5bee5biCXCIsXG5cdCAgICBcIjM2MDcwMlwiOiBcIueroOi0oeWMulwiLFxuXHQgICAgXCIzNjA3MjFcIjogXCLotaPljr9cIixcblx0ICAgIFwiMzYwNzIyXCI6IFwi5L+h5Liw5Y6/XCIsXG5cdCAgICBcIjM2MDcyM1wiOiBcIuWkp+S9meWOv1wiLFxuXHQgICAgXCIzNjA3MjRcIjogXCLkuIrnirnljr9cIixcblx0ICAgIFwiMzYwNzI1XCI6IFwi5bSH5LmJ5Y6/XCIsXG5cdCAgICBcIjM2MDcyNlwiOiBcIuWuiei/nOWOv1wiLFxuXHQgICAgXCIzNjA3MjdcIjogXCLpvpnljZfljr9cIixcblx0ICAgIFwiMzYwNzI4XCI6IFwi5a6a5Y2X5Y6/XCIsXG5cdCAgICBcIjM2MDcyOVwiOiBcIuWFqOWNl+WOv1wiLFxuXHQgICAgXCIzNjA3MzBcIjogXCLlroHpg73ljr9cIixcblx0ICAgIFwiMzYwNzMxXCI6IFwi5LqO6YO95Y6/XCIsXG5cdCAgICBcIjM2MDczMlwiOiBcIuWFtOWbveWOv1wiLFxuXHQgICAgXCIzNjA3MzNcIjogXCLkvJrmmIzljr9cIixcblx0ICAgIFwiMzYwNzM0XCI6IFwi5a+75LmM5Y6/XCIsXG5cdCAgICBcIjM2MDczNVwiOiBcIuefs+WfjuWOv1wiLFxuXHQgICAgXCIzNjA3ODFcIjogXCLnkZ7ph5HluIJcIixcblx0ICAgIFwiMzYwNzgyXCI6IFwi5Y2X5bq35biCXCIsXG5cdCAgICBcIjM2MDc4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA4MDBcIjogXCLlkInlronluIJcIixcblx0ICAgIFwiMzYwODAyXCI6IFwi5ZCJ5bee5Yy6XCIsXG5cdCAgICBcIjM2MDgwM1wiOiBcIumdkuWOn+WMulwiLFxuXHQgICAgXCIzNjA4MjFcIjogXCLlkInlronljr9cIixcblx0ICAgIFwiMzYwODIyXCI6IFwi5ZCJ5rC05Y6/XCIsXG5cdCAgICBcIjM2MDgyM1wiOiBcIuWzoeaxn+WOv1wiLFxuXHQgICAgXCIzNjA4MjRcIjogXCLmlrDlubLljr9cIixcblx0ICAgIFwiMzYwODI1XCI6IFwi5rC45Liw5Y6/XCIsXG5cdCAgICBcIjM2MDgyNlwiOiBcIuazsOWSjOWOv1wiLFxuXHQgICAgXCIzNjA4MjdcIjogXCLpgYLlt53ljr9cIixcblx0ICAgIFwiMzYwODI4XCI6IFwi5LiH5a6J5Y6/XCIsXG5cdCAgICBcIjM2MDgyOVwiOiBcIuWuieemj+WOv1wiLFxuXHQgICAgXCIzNjA4MzBcIjogXCLmsLjmlrDljr9cIixcblx0ICAgIFwiMzYwODgxXCI6IFwi5LqV5YaI5bGx5biCXCIsXG5cdCAgICBcIjM2MDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA5MDBcIjogXCLlrpzmmKXluIJcIixcblx0ICAgIFwiMzYwOTAyXCI6IFwi6KKB5bee5Yy6XCIsXG5cdCAgICBcIjM2MDkyMVwiOiBcIuWlieaWsOWOv1wiLFxuXHQgICAgXCIzNjA5MjJcIjogXCLkuIfovb3ljr9cIixcblx0ICAgIFwiMzYwOTIzXCI6IFwi5LiK6auY5Y6/XCIsXG5cdCAgICBcIjM2MDkyNFwiOiBcIuWunOS4sOWOv1wiLFxuXHQgICAgXCIzNjA5MjVcIjogXCLpnZblronljr9cIixcblx0ICAgIFwiMzYwOTI2XCI6IFwi6ZOc6byT5Y6/XCIsXG5cdCAgICBcIjM2MDk4MVwiOiBcIuS4sOWfjuW4glwiLFxuXHQgICAgXCIzNjA5ODJcIjogXCLmqJ/moJHluIJcIixcblx0ICAgIFwiMzYwOTgzXCI6IFwi6auY5a6J5biCXCIsXG5cdCAgICBcIjM2MDk4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjEwMDBcIjogXCLmiprlt57luIJcIixcblx0ICAgIFwiMzYxMDAyXCI6IFwi5Li05bed5Yy6XCIsXG5cdCAgICBcIjM2MTAyMVwiOiBcIuWNl+WfjuWOv1wiLFxuXHQgICAgXCIzNjEwMjJcIjogXCLpu47lt53ljr9cIixcblx0ICAgIFwiMzYxMDIzXCI6IFwi5Y2X5Liw5Y6/XCIsXG5cdCAgICBcIjM2MTAyNFwiOiBcIuW0h+S7geWOv1wiLFxuXHQgICAgXCIzNjEwMjVcIjogXCLkuZDlronljr9cIixcblx0ICAgIFwiMzYxMDI2XCI6IFwi5a6c6buE5Y6/XCIsXG5cdCAgICBcIjM2MTAyN1wiOiBcIumHkea6quWOv1wiLFxuXHQgICAgXCIzNjEwMjhcIjogXCLotYTmuqrljr9cIixcblx0ICAgIFwiMzYxMDI5XCI6IFwi5Lic5Lmh5Y6/XCIsXG5cdCAgICBcIjM2MTAzMFwiOiBcIuW5v+aYjOWOv1wiLFxuXHQgICAgXCIzNjEwMzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYxMTAwXCI6IFwi5LiK6aW25biCXCIsXG5cdCAgICBcIjM2MTEwMlwiOiBcIuS/oeW3nuWMulwiLFxuXHQgICAgXCIzNjExMjFcIjogXCLkuIrppbbljr9cIixcblx0ICAgIFwiMzYxMTIyXCI6IFwi5bm/5Liw5Y6/XCIsXG5cdCAgICBcIjM2MTEyM1wiOiBcIueOieWxseWOv1wiLFxuXHQgICAgXCIzNjExMjRcIjogXCLpk4XlsbHljr9cIixcblx0ICAgIFwiMzYxMTI1XCI6IFwi5qiq5bOw5Y6/XCIsXG5cdCAgICBcIjM2MTEyNlwiOiBcIuW8i+mYs+WOv1wiLFxuXHQgICAgXCIzNjExMjdcIjogXCLkvZnlubLljr9cIixcblx0ICAgIFwiMzYxMTI4XCI6IFwi6YSx6Ziz5Y6/XCIsXG5cdCAgICBcIjM2MTEyOVwiOiBcIuS4h+W5tOWOv1wiLFxuXHQgICAgXCIzNjExMzBcIjogXCLlqbrmupDljr9cIixcblx0ICAgIFwiMzYxMTgxXCI6IFwi5b635YW05biCXCIsXG5cdCAgICBcIjM2MTE4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzAwMDBcIjogXCLlsbHkuJznnIFcIixcblx0ICAgIFwiMzcwMTAwXCI6IFwi5rWO5Y2X5biCXCIsXG5cdCAgICBcIjM3MDEwMlwiOiBcIuWOhuS4i+WMulwiLFxuXHQgICAgXCIzNzAxMDNcIjogXCLluILkuK3ljLpcIixcblx0ICAgIFwiMzcwMTA0XCI6IFwi5qeQ6I2r5Yy6XCIsXG5cdCAgICBcIjM3MDEwNVwiOiBcIuWkqeahpeWMulwiLFxuXHQgICAgXCIzNzAxMTJcIjogXCLljobln47ljLpcIixcblx0ICAgIFwiMzcwMTEzXCI6IFwi6ZW/5riF5Yy6XCIsXG5cdCAgICBcIjM3MDEyNFwiOiBcIuW5s+mYtOWOv1wiLFxuXHQgICAgXCIzNzAxMjVcIjogXCLmtY7pmLPljr9cIixcblx0ICAgIFwiMzcwMTI2XCI6IFwi5ZWG5rKz5Y6/XCIsXG5cdCAgICBcIjM3MDE4MVwiOiBcIueroOS4mOW4glwiLFxuXHQgICAgXCIzNzAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwMjAwXCI6IFwi6Z2S5bKb5biCXCIsXG5cdCAgICBcIjM3MDIwMlwiOiBcIuW4guWNl+WMulwiLFxuXHQgICAgXCIzNzAyMDNcIjogXCLluILljJfljLpcIixcblx0ICAgIFwiMzcwMjExXCI6IFwi6buE5bKb5Yy6XCIsXG5cdCAgICBcIjM3MDIxMlwiOiBcIuW0guWxseWMulwiLFxuXHQgICAgXCIzNzAyMTNcIjogXCLmnY7msqfljLpcIixcblx0ICAgIFwiMzcwMjE0XCI6IFwi5Z+O6Ziz5Yy6XCIsXG5cdCAgICBcIjM3MDI4MVwiOiBcIuiDtuW3nuW4glwiLFxuXHQgICAgXCIzNzAyODJcIjogXCLljbPloqjluIJcIixcblx0ICAgIFwiMzcwMjgzXCI6IFwi5bmz5bqm5biCXCIsXG5cdCAgICBcIjM3MDI4NVwiOiBcIuiOseilv+W4glwiLFxuXHQgICAgXCIzNzAyODZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwMzAwXCI6IFwi5reE5Y2a5biCXCIsXG5cdCAgICBcIjM3MDMwMlwiOiBcIua3hOW3neWMulwiLFxuXHQgICAgXCIzNzAzMDNcIjogXCLlvKDlupfljLpcIixcblx0ICAgIFwiMzcwMzA0XCI6IFwi5Y2a5bGx5Yy6XCIsXG5cdCAgICBcIjM3MDMwNVwiOiBcIuS4tOa3hOWMulwiLFxuXHQgICAgXCIzNzAzMDZcIjogXCLlkajmnZHljLpcIixcblx0ICAgIFwiMzcwMzIxXCI6IFwi5qGT5Y+w5Y6/XCIsXG5cdCAgICBcIjM3MDMyMlwiOiBcIumrmOmdkuWOv1wiLFxuXHQgICAgXCIzNzAzMjNcIjogXCLmsoLmupDljr9cIixcblx0ICAgIFwiMzcwMzI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDQwMFwiOiBcIuaeo+W6hOW4glwiLFxuXHQgICAgXCIzNzA0MDJcIjogXCLluILkuK3ljLpcIixcblx0ICAgIFwiMzcwNDAzXCI6IFwi6Jab5Z+O5Yy6XCIsXG5cdCAgICBcIjM3MDQwNFwiOiBcIuWzhOWfjuWMulwiLFxuXHQgICAgXCIzNzA0MDVcIjogXCLlj7DlhL/luoTljLpcIixcblx0ICAgIFwiMzcwNDA2XCI6IFwi5bGx5Lqt5Yy6XCIsXG5cdCAgICBcIjM3MDQ4MVwiOiBcIua7leW3nuW4glwiLFxuXHQgICAgXCIzNzA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwNTAwXCI6IFwi5Lic6JCl5biCXCIsXG5cdCAgICBcIjM3MDUwMlwiOiBcIuS4nOiQpeWMulwiLFxuXHQgICAgXCIzNzA1MDNcIjogXCLmsrPlj6PljLpcIixcblx0ICAgIFwiMzcwNTIxXCI6IFwi5Z6m5Yip5Y6/XCIsXG5cdCAgICBcIjM3MDUyMlwiOiBcIuWIqea0peWOv1wiLFxuXHQgICAgXCIzNzA1MjNcIjogXCLlub/ppbbljr9cIixcblx0ICAgIFwiMzcwNTkxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDYwMFwiOiBcIueDn+WPsOW4glwiLFxuXHQgICAgXCIzNzA2MDJcIjogXCLoip3nvZjljLpcIixcblx0ICAgIFwiMzcwNjExXCI6IFwi56aP5bGx5Yy6XCIsXG5cdCAgICBcIjM3MDYxMlwiOiBcIueJn+W5s+WMulwiLFxuXHQgICAgXCIzNzA2MTNcIjogXCLojrHlsbHljLpcIixcblx0ICAgIFwiMzcwNjM0XCI6IFwi6ZW/5bKb5Y6/XCIsXG5cdCAgICBcIjM3MDY4MVwiOiBcIum+meWPo+W4glwiLFxuXHQgICAgXCIzNzA2ODJcIjogXCLojrHpmLPluIJcIixcblx0ICAgIFwiMzcwNjgzXCI6IFwi6I6x5bee5biCXCIsXG5cdCAgICBcIjM3MDY4NFwiOiBcIuiTrOiOseW4glwiLFxuXHQgICAgXCIzNzA2ODVcIjogXCLmi5vov5zluIJcIixcblx0ICAgIFwiMzcwNjg2XCI6IFwi5qCW6Zye5biCXCIsXG5cdCAgICBcIjM3MDY4N1wiOiBcIua1t+mYs+W4glwiLFxuXHQgICAgXCIzNzA2ODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwNzAwXCI6IFwi5r2N5Z2K5biCXCIsXG5cdCAgICBcIjM3MDcwMlwiOiBcIua9jeWfjuWMulwiLFxuXHQgICAgXCIzNzA3MDNcIjogXCLlr5Lkuq3ljLpcIixcblx0ICAgIFwiMzcwNzA0XCI6IFwi5Z2K5a2Q5Yy6XCIsXG5cdCAgICBcIjM3MDcwNVwiOiBcIuWljuaWh+WMulwiLFxuXHQgICAgXCIzNzA3MjRcIjogXCLkuLTmnJDljr9cIixcblx0ICAgIFwiMzcwNzI1XCI6IFwi5piM5LmQ5Y6/XCIsXG5cdCAgICBcIjM3MDc4MVwiOiBcIumdkuW3nuW4glwiLFxuXHQgICAgXCIzNzA3ODJcIjogXCLor7jln47luIJcIixcblx0ICAgIFwiMzcwNzgzXCI6IFwi5a+/5YWJ5biCXCIsXG5cdCAgICBcIjM3MDc4NFwiOiBcIuWuieS4mOW4glwiLFxuXHQgICAgXCIzNzA3ODVcIjogXCLpq5jlr4bluIJcIixcblx0ICAgIFwiMzcwNzg2XCI6IFwi5piM6YKR5biCXCIsXG5cdCAgICBcIjM3MDc4N1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzA4MDBcIjogXCLmtY7lroHluIJcIixcblx0ICAgIFwiMzcwODAyXCI6IFwi5biC5Lit5Yy6XCIsXG5cdCAgICBcIjM3MDgxMVwiOiBcIuS7u+WfjuWMulwiLFxuXHQgICAgXCIzNzA4MjZcIjogXCLlvq7lsbHljr9cIixcblx0ICAgIFwiMzcwODI3XCI6IFwi6bG85Y+w5Y6/XCIsXG5cdCAgICBcIjM3MDgyOFwiOiBcIumHkeS5oeWOv1wiLFxuXHQgICAgXCIzNzA4MjlcIjogXCLlmInnpaXljr9cIixcblx0ICAgIFwiMzcwODMwXCI6IFwi5rG25LiK5Y6/XCIsXG5cdCAgICBcIjM3MDgzMVwiOiBcIuazl+awtOWOv1wiLFxuXHQgICAgXCIzNzA4MzJcIjogXCLmooHlsbHljr9cIixcblx0ICAgIFwiMzcwODgxXCI6IFwi5puy6Zic5biCXCIsXG5cdCAgICBcIjM3MDg4MlwiOiBcIuWFluW3nuW4glwiLFxuXHQgICAgXCIzNzA4ODNcIjogXCLpgrnln47luIJcIixcblx0ICAgIFwiMzcwODg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDkwMFwiOiBcIuazsOWuieW4glwiLFxuXHQgICAgXCIzNzA5MDJcIjogXCLms7DlsbHljLpcIixcblx0ICAgIFwiMzcwOTAzXCI6IFwi5bKx5bKz5Yy6XCIsXG5cdCAgICBcIjM3MDkyMVwiOiBcIuWugemYs+WOv1wiLFxuXHQgICAgXCIzNzA5MjNcIjogXCLkuJzlubPljr9cIixcblx0ICAgIFwiMzcwOTgyXCI6IFwi5paw5rOw5biCXCIsXG5cdCAgICBcIjM3MDk4M1wiOiBcIuiCpeWfjuW4glwiLFxuXHQgICAgXCIzNzA5ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMDAwXCI6IFwi5aiB5rW35biCXCIsXG5cdCAgICBcIjM3MTAwMlwiOiBcIueOr+e/oOWMulwiLFxuXHQgICAgXCIzNzEwODFcIjogXCLmlofnmbvluIJcIixcblx0ICAgIFwiMzcxMDgyXCI6IFwi6I2j5oiQ5biCXCIsXG5cdCAgICBcIjM3MTA4M1wiOiBcIuS5s+WxseW4glwiLFxuXHQgICAgXCIzNzEwODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMTAwXCI6IFwi5pel54Wn5biCXCIsXG5cdCAgICBcIjM3MTEwMlwiOiBcIuS4nOa4r+WMulwiLFxuXHQgICAgXCIzNzExMDNcIjogXCLlsprlsbHljLpcIixcblx0ICAgIFwiMzcxMTIxXCI6IFwi5LqU6I6y5Y6/XCIsXG5cdCAgICBcIjM3MTEyMlwiOiBcIuiOkuWOv1wiLFxuXHQgICAgXCIzNzExMjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMjAwXCI6IFwi6I6x6Iqc5biCXCIsXG5cdCAgICBcIjM3MTIwMlwiOiBcIuiOseWfjuWMulwiLFxuXHQgICAgXCIzNzEyMDNcIjogXCLpkqLln47ljLpcIixcblx0ICAgIFwiMzcxMjA0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MTMwMFwiOiBcIuS4tOayguW4glwiLFxuXHQgICAgXCIzNzEzMDJcIjogXCLlhbDlsbHljLpcIixcblx0ICAgIFwiMzcxMzExXCI6IFwi572X5bqE5Yy6XCIsXG5cdCAgICBcIjM3MTMxMlwiOiBcIuays+S4nOWMulwiLFxuXHQgICAgXCIzNzEzMjFcIjogXCLmsoLljZfljr9cIixcblx0ICAgIFwiMzcxMzIyXCI6IFwi6YOv5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTMyM1wiOiBcIuayguawtOWOv1wiLFxuXHQgICAgXCIzNzEzMjRcIjogXCLoi43lsbHljr9cIixcblx0ICAgIFwiMzcxMzI1XCI6IFwi6LS55Y6/XCIsXG5cdCAgICBcIjM3MTMyNlwiOiBcIuW5s+mCkeWOv1wiLFxuXHQgICAgXCIzNzEzMjdcIjogXCLojpLljZfljr9cIixcblx0ICAgIFwiMzcxMzI4XCI6IFwi6JKZ6Zi05Y6/XCIsXG5cdCAgICBcIjM3MTMyOVwiOiBcIuS4tOayreWOv1wiLFxuXHQgICAgXCIzNzEzMzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxNDAwXCI6IFwi5b635bee5biCXCIsXG5cdCAgICBcIjM3MTQwMlwiOiBcIuW+t+WfjuWMulwiLFxuXHQgICAgXCIzNzE0MjFcIjogXCLpmbXljr9cIixcblx0ICAgIFwiMzcxNDIyXCI6IFwi5a6B5rSl5Y6/XCIsXG5cdCAgICBcIjM3MTQyM1wiOiBcIuW6huS6keWOv1wiLFxuXHQgICAgXCIzNzE0MjRcIjogXCLkuLTpgpHljr9cIixcblx0ICAgIFwiMzcxNDI1XCI6IFwi6b2Q5rKz5Y6/XCIsXG5cdCAgICBcIjM3MTQyNlwiOiBcIuW5s+WOn+WOv1wiLFxuXHQgICAgXCIzNzE0MjdcIjogXCLlpI/mtKXljr9cIixcblx0ICAgIFwiMzcxNDI4XCI6IFwi5q2m5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTQ4MVwiOiBcIuS5kOmZteW4glwiLFxuXHQgICAgXCIzNzE0ODJcIjogXCLnprnln47luIJcIixcblx0ICAgIFwiMzcxNDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MTUwMFwiOiBcIuiBiuWfjuW4glwiLFxuXHQgICAgXCIzNzE1MDJcIjogXCLkuJzmmIzlupzljLpcIixcblx0ICAgIFwiMzcxNTIxXCI6IFwi6Ziz6LC35Y6/XCIsXG5cdCAgICBcIjM3MTUyMlwiOiBcIuiOmOWOv1wiLFxuXHQgICAgXCIzNzE1MjNcIjogXCLojIzlubPljr9cIixcblx0ICAgIFwiMzcxNTI0XCI6IFwi5Lic6Zi/5Y6/XCIsXG5cdCAgICBcIjM3MTUyNVwiOiBcIuWGoOWOv1wiLFxuXHQgICAgXCIzNzE1MjZcIjogXCLpq5jllJDljr9cIixcblx0ICAgIFwiMzcxNTgxXCI6IFwi5Li05riF5biCXCIsXG5cdCAgICBcIjM3MTU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzE2MDBcIjogXCLmu6jlt57luIJcIixcblx0ICAgIFwiMzcxNjAyXCI6IFwi5ruo5Z+O5Yy6XCIsXG5cdCAgICBcIjM3MTYyMVwiOiBcIuaDoOawkeWOv1wiLFxuXHQgICAgXCIzNzE2MjJcIjogXCLpmLPkv6Hljr9cIixcblx0ICAgIFwiMzcxNjIzXCI6IFwi5peg5qOj5Y6/XCIsXG5cdCAgICBcIjM3MTYyNFwiOiBcIuayvuWMluWOv1wiLFxuXHQgICAgXCIzNzE2MjVcIjogXCLljZrlhbTljr9cIixcblx0ICAgIFwiMzcxNjI2XCI6IFwi6YK55bmz5Y6/XCIsXG5cdCAgICBcIjM3MTYyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzE3MDBcIjogXCLoj4/ms73luIJcIixcblx0ICAgIFwiMzcxNzAyXCI6IFwi54mh5Li55Yy6XCIsXG5cdCAgICBcIjM3MTcyMVwiOiBcIuabueWOv1wiLFxuXHQgICAgXCIzNzE3MjJcIjogXCLljZXljr9cIixcblx0ICAgIFwiMzcxNzIzXCI6IFwi5oiQ5q2m5Y6/XCIsXG5cdCAgICBcIjM3MTcyNFwiOiBcIuW3qOmHjuWOv1wiLFxuXHQgICAgXCIzNzE3MjVcIjogXCLpg5Pln47ljr9cIixcblx0ICAgIFwiMzcxNzI2XCI6IFwi6YSE5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTcyN1wiOiBcIuWumumZtuWOv1wiLFxuXHQgICAgXCIzNzE3MjhcIjogXCLkuJzmmI7ljr9cIixcblx0ICAgIFwiMzcxNzI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDAwMFwiOiBcIuays+WNl+ecgVwiLFxuXHQgICAgXCI0MTAxMDBcIjogXCLpg5Hlt57luIJcIixcblx0ICAgIFwiNDEwMTAyXCI6IFwi5Lit5Y6f5Yy6XCIsXG5cdCAgICBcIjQxMDEwM1wiOiBcIuS6jOS4g+WMulwiLFxuXHQgICAgXCI0MTAxMDRcIjogXCLnrqHln47lm57ml4/ljLpcIixcblx0ICAgIFwiNDEwMTA1XCI6IFwi6YeR5rC05Yy6XCIsXG5cdCAgICBcIjQxMDEwNlwiOiBcIuS4iuihl+WMulwiLFxuXHQgICAgXCI0MTAxMDhcIjogXCLmg6DmtY7ljLpcIixcblx0ICAgIFwiNDEwMTIyXCI6IFwi5Lit54mf5Y6/XCIsXG5cdCAgICBcIjQxMDE4MVwiOiBcIuW3qeS5ieW4glwiLFxuXHQgICAgXCI0MTAxODJcIjogXCLojaXpmLPluIJcIixcblx0ICAgIFwiNDEwMTgzXCI6IFwi5paw5a+G5biCXCIsXG5cdCAgICBcIjQxMDE4NFwiOiBcIuaWsOmDkeW4glwiLFxuXHQgICAgXCI0MTAxODVcIjogXCLnmbvlsIHluIJcIixcblx0ICAgIFwiNDEwMTg4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDIwMFwiOiBcIuW8gOWwgeW4glwiLFxuXHQgICAgXCI0MTAyMDJcIjogXCLpvpnkuq3ljLpcIixcblx0ICAgIFwiNDEwMjAzXCI6IFwi6aG65rKz5Zue5peP5Yy6XCIsXG5cdCAgICBcIjQxMDIwNFwiOiBcIum8k+alvOWMulwiLFxuXHQgICAgXCI0MTAyMDVcIjogXCLnprnnjovlj7DljLpcIixcblx0ICAgIFwiNDEwMjExXCI6IFwi6YeR5piO5Yy6XCIsXG5cdCAgICBcIjQxMDIyMVwiOiBcIuadnuWOv1wiLFxuXHQgICAgXCI0MTAyMjJcIjogXCLpgJrorrjljr9cIixcblx0ICAgIFwiNDEwMjIzXCI6IFwi5bCJ5rCP5Y6/XCIsXG5cdCAgICBcIjQxMDIyNFwiOiBcIuW8gOWwgeWOv1wiLFxuXHQgICAgXCI0MTAyMjVcIjogXCLlhbDogIPljr9cIixcblx0ICAgIFwiNDEwMjI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDMwMFwiOiBcIua0m+mYs+W4glwiLFxuXHQgICAgXCI0MTAzMDJcIjogXCLogIHln47ljLpcIixcblx0ICAgIFwiNDEwMzAzXCI6IFwi6KW/5bel5Yy6XCIsXG5cdCAgICBcIjQxMDMwNFwiOiBcIueAjeays+WbnuaXj+WMulwiLFxuXHQgICAgXCI0MTAzMDVcIjogXCLmtqfopb/ljLpcIixcblx0ICAgIFwiNDEwMzA2XCI6IFwi5ZCJ5Yip5Yy6XCIsXG5cdCAgICBcIjQxMDMwN1wiOiBcIua0m+m+meWMulwiLFxuXHQgICAgXCI0MTAzMjJcIjogXCLlrZ/mtKXljr9cIixcblx0ICAgIFwiNDEwMzIzXCI6IFwi5paw5a6J5Y6/XCIsXG5cdCAgICBcIjQxMDMyNFwiOiBcIuagvuW3neWOv1wiLFxuXHQgICAgXCI0MTAzMjVcIjogXCLltanljr9cIixcblx0ICAgIFwiNDEwMzI2XCI6IFwi5rGd6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMDMyN1wiOiBcIuWunOmYs+WOv1wiLFxuXHQgICAgXCI0MTAzMjhcIjogXCLmtJvlroHljr9cIixcblx0ICAgIFwiNDEwMzI5XCI6IFwi5LyK5bed5Y6/XCIsXG5cdCAgICBcIjQxMDM4MVwiOiBcIuWBg+W4iOW4glwiLFxuXHQgICAgXCI0MTA0MDBcIjogXCLlubPpobblsbHluIJcIixcblx0ICAgIFwiNDEwNDAyXCI6IFwi5paw5Y2O5Yy6XCIsXG5cdCAgICBcIjQxMDQwM1wiOiBcIuWNq+S4nOWMulwiLFxuXHQgICAgXCI0MTA0MDRcIjogXCLnn7PpvpnljLpcIixcblx0ICAgIFwiNDEwNDExXCI6IFwi5rmb5rKz5Yy6XCIsXG5cdCAgICBcIjQxMDQyMVwiOiBcIuWuneS4sOWOv1wiLFxuXHQgICAgXCI0MTA0MjJcIjogXCLlj7bljr9cIixcblx0ICAgIFwiNDEwNDIzXCI6IFwi6bKB5bGx5Y6/XCIsXG5cdCAgICBcIjQxMDQyNVwiOiBcIumDj+WOv1wiLFxuXHQgICAgXCI0MTA0ODFcIjogXCLoiJ7pkqLluIJcIixcblx0ICAgIFwiNDEwNDgyXCI6IFwi5rGd5bee5biCXCIsXG5cdCAgICBcIjQxMDQ4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA1MDBcIjogXCLlronpmLPluIJcIixcblx0ICAgIFwiNDEwNTAyXCI6IFwi5paH5bOw5Yy6XCIsXG5cdCAgICBcIjQxMDUwM1wiOiBcIuWMl+WFs+WMulwiLFxuXHQgICAgXCI0MTA1MDVcIjogXCLmrrfpg73ljLpcIixcblx0ICAgIFwiNDEwNTA2XCI6IFwi6b6Z5a6J5Yy6XCIsXG5cdCAgICBcIjQxMDUyMlwiOiBcIuWuiemYs+WOv1wiLFxuXHQgICAgXCI0MTA1MjNcIjogXCLmsaTpmLTljr9cIixcblx0ICAgIFwiNDEwNTI2XCI6IFwi5ruR5Y6/XCIsXG5cdCAgICBcIjQxMDUyN1wiOiBcIuWGhem7hOWOv1wiLFxuXHQgICAgXCI0MTA1ODFcIjogXCLmnpflt57luIJcIixcblx0ICAgIFwiNDEwNTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDYwMFwiOiBcIum5pOWjgeW4glwiLFxuXHQgICAgXCI0MTA2MDJcIjogXCLpuaTlsbHljLpcIixcblx0ICAgIFwiNDEwNjAzXCI6IFwi5bGx5Z+O5Yy6XCIsXG5cdCAgICBcIjQxMDYxMVwiOiBcIua3h+a7qOWMulwiLFxuXHQgICAgXCI0MTA2MjFcIjogXCLmtZrljr9cIixcblx0ICAgIFwiNDEwNjIyXCI6IFwi5reH5Y6/XCIsXG5cdCAgICBcIjQxMDYyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA3MDBcIjogXCLmlrDkuaHluIJcIixcblx0ICAgIFwiNDEwNzAyXCI6IFwi57qi5peX5Yy6XCIsXG5cdCAgICBcIjQxMDcwM1wiOiBcIuWNq+a7qOWMulwiLFxuXHQgICAgXCI0MTA3MDRcIjogXCLlh6Tms4nljLpcIixcblx0ICAgIFwiNDEwNzExXCI6IFwi54mn6YeO5Yy6XCIsXG5cdCAgICBcIjQxMDcyMVwiOiBcIuaWsOS5oeWOv1wiLFxuXHQgICAgXCI0MTA3MjRcIjogXCLojrflmInljr9cIixcblx0ICAgIFwiNDEwNzI1XCI6IFwi5Y6f6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMDcyNlwiOiBcIuW7tua0peWOv1wiLFxuXHQgICAgXCI0MTA3MjdcIjogXCLlsIHkuJjljr9cIixcblx0ICAgIFwiNDEwNzI4XCI6IFwi6ZW/5Z6j5Y6/XCIsXG5cdCAgICBcIjQxMDc4MVwiOiBcIuWNq+i+ieW4glwiLFxuXHQgICAgXCI0MTA3ODJcIjogXCLovonljr/luIJcIixcblx0ICAgIFwiNDEwNzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDgwMFwiOiBcIueEpuS9nOW4glwiLFxuXHQgICAgXCI0MTA4MDJcIjogXCLop6PmlL7ljLpcIixcblx0ICAgIFwiNDEwODAzXCI6IFwi5Lit56uZ5Yy6XCIsXG5cdCAgICBcIjQxMDgwNFwiOiBcIumprOadkeWMulwiLFxuXHQgICAgXCI0MTA4MTFcIjogXCLlsbHpmLPljLpcIixcblx0ICAgIFwiNDEwODIxXCI6IFwi5L+u5q2m5Y6/XCIsXG5cdCAgICBcIjQxMDgyMlwiOiBcIuWNmueIseWOv1wiLFxuXHQgICAgXCI0MTA4MjNcIjogXCLmrabpmZ/ljr9cIixcblx0ICAgIFwiNDEwODI1XCI6IFwi5rip5Y6/XCIsXG5cdCAgICBcIjQxMDg4MVwiOiBcIua1jua6kOW4glwiLFxuXHQgICAgXCI0MTA4ODJcIjogXCLmsoHpmLPluIJcIixcblx0ICAgIFwiNDEwODgzXCI6IFwi5a2f5bee5biCXCIsXG5cdCAgICBcIjQxMDg4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA5MDBcIjogXCLmv67pmLPluIJcIixcblx0ICAgIFwiNDEwOTAyXCI6IFwi5Y2O6b6Z5Yy6XCIsXG5cdCAgICBcIjQxMDkyMlwiOiBcIua4heS4sOWOv1wiLFxuXHQgICAgXCI0MTA5MjNcIjogXCLljZfkuZDljr9cIixcblx0ICAgIFwiNDEwOTI2XCI6IFwi6IyD5Y6/XCIsXG5cdCAgICBcIjQxMDkyN1wiOiBcIuWPsOWJjeWOv1wiLFxuXHQgICAgXCI0MTA5MjhcIjogXCLmv67pmLPljr9cIixcblx0ICAgIFwiNDEwOTI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMTAwMFwiOiBcIuiuuOaYjOW4glwiLFxuXHQgICAgXCI0MTEwMDJcIjogXCLprY/pg73ljLpcIixcblx0ICAgIFwiNDExMDIzXCI6IFwi6K645piM5Y6/XCIsXG5cdCAgICBcIjQxMTAyNFwiOiBcIumEoumZteWOv1wiLFxuXHQgICAgXCI0MTEwMjVcIjogXCLopYTln47ljr9cIixcblx0ICAgIFwiNDExMDgxXCI6IFwi56a55bee5biCXCIsXG5cdCAgICBcIjQxMTA4MlwiOiBcIumVv+iRm+W4glwiLFxuXHQgICAgXCI0MTEwODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExMTAwXCI6IFwi5ryv5rKz5biCXCIsXG5cdCAgICBcIjQxMTEwMlwiOiBcIua6kOaxh+WMulwiLFxuXHQgICAgXCI0MTExMDNcIjogXCLpg77ln47ljLpcIixcblx0ICAgIFwiNDExMTA0XCI6IFwi5Y+s6Zm15Yy6XCIsXG5cdCAgICBcIjQxMTEyMVwiOiBcIuiInumYs+WOv1wiLFxuXHQgICAgXCI0MTExMjJcIjogXCLkuLTpoo3ljr9cIixcblx0ICAgIFwiNDExMTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMTIwMFwiOiBcIuS4iemXqOWzoeW4glwiLFxuXHQgICAgXCI0MTEyMDJcIjogXCLmuZbmu6jljLpcIixcblx0ICAgIFwiNDExMjIxXCI6IFwi5riR5rGg5Y6/XCIsXG5cdCAgICBcIjQxMTIyMlwiOiBcIumZleWOv1wiLFxuXHQgICAgXCI0MTEyMjRcIjogXCLljaLmsI/ljr9cIixcblx0ICAgIFwiNDExMjgxXCI6IFwi5LmJ6ams5biCXCIsXG5cdCAgICBcIjQxMTI4MlwiOiBcIueBteWuneW4glwiLFxuXHQgICAgXCI0MTEyODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExMzAwXCI6IFwi5Y2X6Ziz5biCXCIsXG5cdCAgICBcIjQxMTMwMlwiOiBcIuWum+WfjuWMulwiLFxuXHQgICAgXCI0MTEzMDNcIjogXCLljafpvpnljLpcIixcblx0ICAgIFwiNDExMzIxXCI6IFwi5Y2X5Y+s5Y6/XCIsXG5cdCAgICBcIjQxMTMyMlwiOiBcIuaWueWfjuWOv1wiLFxuXHQgICAgXCI0MTEzMjNcIjogXCLopb/ls6Hljr9cIixcblx0ICAgIFwiNDExMzI0XCI6IFwi6ZWH5bmz5Y6/XCIsXG5cdCAgICBcIjQxMTMyNVwiOiBcIuWGheS5oeWOv1wiLFxuXHQgICAgXCI0MTEzMjZcIjogXCLmt4Xlt53ljr9cIixcblx0ICAgIFwiNDExMzI3XCI6IFwi56S+5peX5Y6/XCIsXG5cdCAgICBcIjQxMTMyOFwiOiBcIuWUkOays+WOv1wiLFxuXHQgICAgXCI0MTEzMjlcIjogXCLmlrDph47ljr9cIixcblx0ICAgIFwiNDExMzMwXCI6IFwi5qGQ5p+P5Y6/XCIsXG5cdCAgICBcIjQxMTM4MVwiOiBcIumCk+W3nuW4glwiLFxuXHQgICAgXCI0MTEzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExNDAwXCI6IFwi5ZWG5LiY5biCXCIsXG5cdCAgICBcIjQxMTQwMlwiOiBcIuaigeWbreWMulwiLFxuXHQgICAgXCI0MTE0MDNcIjogXCLnnaLpmLPljLpcIixcblx0ICAgIFwiNDExNDIxXCI6IFwi5rCR5p2D5Y6/XCIsXG5cdCAgICBcIjQxMTQyMlwiOiBcIuedouWOv1wiLFxuXHQgICAgXCI0MTE0MjNcIjogXCLlroHpmbXljr9cIixcblx0ICAgIFwiNDExNDI0XCI6IFwi5p+Y5Z+O5Y6/XCIsXG5cdCAgICBcIjQxMTQyNVwiOiBcIuiZnuWfjuWOv1wiLFxuXHQgICAgXCI0MTE0MjZcIjogXCLlpI/pgpHljr9cIixcblx0ICAgIFwiNDExNDgxXCI6IFwi5rC45Z+O5biCXCIsXG5cdCAgICBcIjQxMTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE1MDBcIjogXCLkv6HpmLPluIJcIixcblx0ICAgIFwiNDExNTAyXCI6IFwi5rWJ5rKz5Yy6XCIsXG5cdCAgICBcIjQxMTUwM1wiOiBcIuW5s+ahpeWMulwiLFxuXHQgICAgXCI0MTE1MjFcIjogXCLnvZflsbHljr9cIixcblx0ICAgIFwiNDExNTIyXCI6IFwi5YWJ5bGx5Y6/XCIsXG5cdCAgICBcIjQxMTUyM1wiOiBcIuaWsOWOv1wiLFxuXHQgICAgXCI0MTE1MjRcIjogXCLllYbln47ljr9cIixcblx0ICAgIFwiNDExNTI1XCI6IFwi5Zu65aeL5Y6/XCIsXG5cdCAgICBcIjQxMTUyNlwiOiBcIua9ouW3neWOv1wiLFxuXHQgICAgXCI0MTE1MjdcIjogXCLmt67mu6jljr9cIixcblx0ICAgIFwiNDExNTI4XCI6IFwi5oGv5Y6/XCIsXG5cdCAgICBcIjQxMTUyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE2MDBcIjogXCLlkajlj6PluIJcIixcblx0ICAgIFwiNDExNjAyXCI6IFwi5bed5rGH5Yy6XCIsXG5cdCAgICBcIjQxMTYyMVwiOiBcIuaJtuayn+WOv1wiLFxuXHQgICAgXCI0MTE2MjJcIjogXCLopb/ljY7ljr9cIixcblx0ICAgIFwiNDExNjIzXCI6IFwi5ZWG5rC05Y6/XCIsXG5cdCAgICBcIjQxMTYyNFwiOiBcIuayiOS4mOWOv1wiLFxuXHQgICAgXCI0MTE2MjVcIjogXCLpg7jln47ljr9cIixcblx0ICAgIFwiNDExNjI2XCI6IFwi5reu6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMTYyN1wiOiBcIuWkquW6t+WOv1wiLFxuXHQgICAgXCI0MTE2MjhcIjogXCLpub/pgpHljr9cIixcblx0ICAgIFwiNDExNjgxXCI6IFwi6aG55Z+O5biCXCIsXG5cdCAgICBcIjQxMTY4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE3MDBcIjogXCLpqbvpqazlupfluIJcIixcblx0ICAgIFwiNDExNzAyXCI6IFwi6am/5Z+O5Yy6XCIsXG5cdCAgICBcIjQxMTcyMVwiOiBcIuilv+W5s+WOv1wiLFxuXHQgICAgXCI0MTE3MjJcIjogXCLkuIrolKHljr9cIixcblx0ICAgIFwiNDExNzIzXCI6IFwi5bmz6IiG5Y6/XCIsXG5cdCAgICBcIjQxMTcyNFwiOiBcIuato+mYs+WOv1wiLFxuXHQgICAgXCI0MTE3MjVcIjogXCLnoa7lsbHljr9cIixcblx0ICAgIFwiNDExNzI2XCI6IFwi5rOM6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMTcyN1wiOiBcIuaxneWNl+WOv1wiLFxuXHQgICAgXCI0MTE3MjhcIjogXCLpgYLlubPljr9cIixcblx0ICAgIFwiNDExNzI5XCI6IFwi5paw6JSh5Y6/XCIsXG5cdCAgICBcIjQxMTczMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjAwMDBcIjogXCLmuZbljJfnnIFcIixcblx0ICAgIFwiNDIwMTAwXCI6IFwi5q2m5rGJ5biCXCIsXG5cdCAgICBcIjQyMDEwMlwiOiBcIuaxn+WyuOWMulwiLFxuXHQgICAgXCI0MjAxMDNcIjogXCLmsZ/msYnljLpcIixcblx0ICAgIFwiNDIwMTA0XCI6IFwi56Ga5Y+j5Yy6XCIsXG5cdCAgICBcIjQyMDEwNVwiOiBcIuaxiemYs+WMulwiLFxuXHQgICAgXCI0MjAxMDZcIjogXCLmrabmmIzljLpcIixcblx0ICAgIFwiNDIwMTA3XCI6IFwi6Z2S5bGx5Yy6XCIsXG5cdCAgICBcIjQyMDExMVwiOiBcIua0quWxseWMulwiLFxuXHQgICAgXCI0MjAxMTJcIjogXCLkuJzopb/muZbljLpcIixcblx0ICAgIFwiNDIwMTEzXCI6IFwi5rGJ5Y2X5Yy6XCIsXG5cdCAgICBcIjQyMDExNFwiOiBcIuiUoeeUuOWMulwiLFxuXHQgICAgXCI0MjAxMTVcIjogXCLmsZ/lpI/ljLpcIixcblx0ICAgIFwiNDIwMTE2XCI6IFwi6buE6ZmC5Yy6XCIsXG5cdCAgICBcIjQyMDExN1wiOiBcIuaWsOa0suWMulwiLFxuXHQgICAgXCI0MjAxMThcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwMjAwXCI6IFwi6buE55+z5biCXCIsXG5cdCAgICBcIjQyMDIwMlwiOiBcIum7hOefs+a4r+WMulwiLFxuXHQgICAgXCI0MjAyMDNcIjogXCLopb/loZ7lsbHljLpcIixcblx0ICAgIFwiNDIwMjA0XCI6IFwi5LiL6ZmG5Yy6XCIsXG5cdCAgICBcIjQyMDIwNVwiOiBcIumTgeWxseWMulwiLFxuXHQgICAgXCI0MjAyMjJcIjogXCLpmLPmlrDljr9cIixcblx0ICAgIFwiNDIwMjgxXCI6IFwi5aSn5Ya25biCXCIsXG5cdCAgICBcIjQyMDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjAzMDBcIjogXCLljYHloLDluIJcIixcblx0ICAgIFwiNDIwMzAyXCI6IFwi6IyF566t5Yy6XCIsXG5cdCAgICBcIjQyMDMwM1wiOiBcIuW8oOa5vuWMulwiLFxuXHQgICAgXCI0MjAzMjFcIjogXCLpg6fljr9cIixcblx0ICAgIFwiNDIwMzIyXCI6IFwi6YOn6KW/5Y6/XCIsXG5cdCAgICBcIjQyMDMyM1wiOiBcIuerueWxseWOv1wiLFxuXHQgICAgXCI0MjAzMjRcIjogXCLnq7nmuqrljr9cIixcblx0ICAgIFwiNDIwMzI1XCI6IFwi5oi/5Y6/XCIsXG5cdCAgICBcIjQyMDM4MVwiOiBcIuS4ueaxn+WPo+W4glwiLFxuXHQgICAgXCI0MjAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwNTAwXCI6IFwi5a6c5piM5biCXCIsXG5cdCAgICBcIjQyMDUwMlwiOiBcIuilv+mZteWMulwiLFxuXHQgICAgXCI0MjA1MDNcIjogXCLkvI3lrrblspfljLpcIixcblx0ICAgIFwiNDIwNTA0XCI6IFwi54K55Yab5Yy6XCIsXG5cdCAgICBcIjQyMDUwNVwiOiBcIueMh+S6reWMulwiLFxuXHQgICAgXCI0MjA1MDZcIjogXCLlpLfpmbXljLpcIixcblx0ICAgIFwiNDIwNTI1XCI6IFwi6L+c5a6J5Y6/XCIsXG5cdCAgICBcIjQyMDUyNlwiOiBcIuWFtOWxseWOv1wiLFxuXHQgICAgXCI0MjA1MjdcIjogXCLnp63lvZLljr9cIixcblx0ICAgIFwiNDIwNTI4XCI6IFwi6ZW/6Ziz5Zyf5a625peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQyMDUyOVwiOiBcIuS6lOWzsOWcn+WutuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MjA1ODFcIjogXCLlrpzpg73luIJcIixcblx0ICAgIFwiNDIwNTgyXCI6IFwi5b2T6Ziz5biCXCIsXG5cdCAgICBcIjQyMDU4M1wiOiBcIuaeneaxn+W4glwiLFxuXHQgICAgXCI0MjA1ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwNjAwXCI6IFwi6KWE6Ziz5biCXCIsXG5cdCAgICBcIjQyMDYwMlwiOiBcIuilhOWfjuWMulwiLFxuXHQgICAgXCI0MjA2MDZcIjogXCLmqIrln47ljLpcIixcblx0ICAgIFwiNDIwNjA3XCI6IFwi6KWE5bee5Yy6XCIsXG5cdCAgICBcIjQyMDYyNFwiOiBcIuWNl+a8s+WOv1wiLFxuXHQgICAgXCI0MjA2MjVcIjogXCLosLfln47ljr9cIixcblx0ICAgIFwiNDIwNjI2XCI6IFwi5L+d5bq35Y6/XCIsXG5cdCAgICBcIjQyMDY4MlwiOiBcIuiAgeays+WPo+W4glwiLFxuXHQgICAgXCI0MjA2ODNcIjogXCLmnqPpmLPluIJcIixcblx0ICAgIFwiNDIwNjg0XCI6IFwi5a6c5Z+O5biCXCIsXG5cdCAgICBcIjQyMDY4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjA3MDBcIjogXCLphILlt57luIJcIixcblx0ICAgIFwiNDIwNzAyXCI6IFwi5qKB5a2Q5rmW5Yy6XCIsXG5cdCAgICBcIjQyMDcwM1wiOiBcIuWNjuWuueWMulwiLFxuXHQgICAgXCI0MjA3MDRcIjogXCLphILln47ljLpcIixcblx0ICAgIFwiNDIwNzA1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQyMDgwMFwiOiBcIuiNhumXqOW4glwiLFxuXHQgICAgXCI0MjA4MDJcIjogXCLkuJzlrp3ljLpcIixcblx0ICAgIFwiNDIwODA0XCI6IFwi5o6H5YiA5Yy6XCIsXG5cdCAgICBcIjQyMDgyMVwiOiBcIuS6rOWxseWOv1wiLFxuXHQgICAgXCI0MjA4MjJcIjogXCLmspnmtIvljr9cIixcblx0ICAgIFwiNDIwODgxXCI6IFwi6ZKf56Wl5biCXCIsXG5cdCAgICBcIjQyMDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjA5MDBcIjogXCLlrZ3mhJ/luIJcIixcblx0ICAgIFwiNDIwOTAyXCI6IFwi5a2d5Y2X5Yy6XCIsXG5cdCAgICBcIjQyMDkyMVwiOiBcIuWtneaYjOWOv1wiLFxuXHQgICAgXCI0MjA5MjJcIjogXCLlpKfmgp/ljr9cIixcblx0ICAgIFwiNDIwOTIzXCI6IFwi5LqR5qKm5Y6/XCIsXG5cdCAgICBcIjQyMDk4MVwiOiBcIuW6lOWfjuW4glwiLFxuXHQgICAgXCI0MjA5ODJcIjogXCLlronpmYbluIJcIixcblx0ICAgIFwiNDIwOTg0XCI6IFwi5rGJ5bed5biCXCIsXG5cdCAgICBcIjQyMDk4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjEwMDBcIjogXCLojYblt57luIJcIixcblx0ICAgIFwiNDIxMDAyXCI6IFwi5rKZ5biC5Yy6XCIsXG5cdCAgICBcIjQyMTAwM1wiOiBcIuiNhuW3nuWMulwiLFxuXHQgICAgXCI0MjEwMjJcIjogXCLlhazlronljr9cIixcblx0ICAgIFwiNDIxMDIzXCI6IFwi55uR5Yip5Y6/XCIsXG5cdCAgICBcIjQyMTAyNFwiOiBcIuaxn+mZteWOv1wiLFxuXHQgICAgXCI0MjEwODFcIjogXCLnn7PpppbluIJcIixcblx0ICAgIFwiNDIxMDgzXCI6IFwi5rSq5rmW5biCXCIsXG5cdCAgICBcIjQyMTA4N1wiOiBcIuadvua7i+W4glwiLFxuXHQgICAgXCI0MjEwODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIxMTAwXCI6IFwi6buE5YaI5biCXCIsXG5cdCAgICBcIjQyMTEwMlwiOiBcIum7hOW3nuWMulwiLFxuXHQgICAgXCI0MjExMjFcIjogXCLlm6Lpo47ljr9cIixcblx0ICAgIFwiNDIxMTIyXCI6IFwi57qi5a6J5Y6/XCIsXG5cdCAgICBcIjQyMTEyM1wiOiBcIue9l+eUsOWOv1wiLFxuXHQgICAgXCI0MjExMjRcIjogXCLoi7HlsbHljr9cIixcblx0ICAgIFwiNDIxMTI1XCI6IFwi5rWg5rC05Y6/XCIsXG5cdCAgICBcIjQyMTEyNlwiOiBcIuiVsuaYpeWOv1wiLFxuXHQgICAgXCI0MjExMjdcIjogXCLpu4TmooXljr9cIixcblx0ICAgIFwiNDIxMTgxXCI6IFwi6bq75Z+O5biCXCIsXG5cdCAgICBcIjQyMTE4MlwiOiBcIuatpueptOW4glwiLFxuXHQgICAgXCI0MjExODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIxMjAwXCI6IFwi5ZK45a6B5biCXCIsXG5cdCAgICBcIjQyMTIwMlwiOiBcIuWSuOWuieWMulwiLFxuXHQgICAgXCI0MjEyMjFcIjogXCLlmInpsbzljr9cIixcblx0ICAgIFwiNDIxMjIyXCI6IFwi6YCa5Z+O5Y6/XCIsXG5cdCAgICBcIjQyMTIyM1wiOiBcIuW0h+mYs+WOv1wiLFxuXHQgICAgXCI0MjEyMjRcIjogXCLpgJrlsbHljr9cIixcblx0ICAgIFwiNDIxMjgxXCI6IFwi6LWk5aOB5biCXCIsXG5cdCAgICBcIjQyMTI4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjEzMDBcIjogXCLpmo/lt57luIJcIixcblx0ICAgIFwiNDIxMzAyXCI6IFwi5pu+6YO95Yy6XCIsXG5cdCAgICBcIjQyMTMyMVwiOiBcIumaj+WOv1wiLFxuXHQgICAgXCI0MjEzODFcIjogXCLlub/msLTluIJcIixcblx0ICAgIFwiNDIxMzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQyMjgwMFwiOiBcIuaBqeaWveWcn+WutuaXj+iLl+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI0MjI4MDFcIjogXCLmganmlr3luIJcIixcblx0ICAgIFwiNDIyODAyXCI6IFwi5Yip5bed5biCXCIsXG5cdCAgICBcIjQyMjgyMlwiOiBcIuW7uuWni+WOv1wiLFxuXHQgICAgXCI0MjI4MjNcIjogXCLlt7TkuJzljr9cIixcblx0ICAgIFwiNDIyODI1XCI6IFwi5a6j5oGp5Y6/XCIsXG5cdCAgICBcIjQyMjgyNlwiOiBcIuWSuOS4sOWOv1wiLFxuXHQgICAgXCI0MjI4MjdcIjogXCLmnaXlh6Tljr9cIixcblx0ICAgIFwiNDIyODI4XCI6IFwi6bmk5bOw5Y6/XCIsXG5cdCAgICBcIjQyMjgyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjkwMDRcIjogXCLku5nmoYPluIJcIixcblx0ICAgIFwiNDI5MDA1XCI6IFwi5r2c5rGf5biCXCIsXG5cdCAgICBcIjQyOTAwNlwiOiBcIuWkqemXqOW4glwiLFxuXHQgICAgXCI0MjkwMjFcIjogXCLnpZ7lhpzmnrbmnpfljLpcIixcblx0ICAgIFwiNDMwMDAwXCI6IFwi5rmW5Y2X55yBXCIsXG5cdCAgICBcIjQzMDEwMFwiOiBcIumVv+aymeW4glwiLFxuXHQgICAgXCI0MzAxMDJcIjogXCLoipnok4nljLpcIixcblx0ICAgIFwiNDMwMTAzXCI6IFwi5aSp5b+D5Yy6XCIsXG5cdCAgICBcIjQzMDEwNFwiOiBcIuWys+m6k+WMulwiLFxuXHQgICAgXCI0MzAxMDVcIjogXCLlvIDnpo/ljLpcIixcblx0ICAgIFwiNDMwMTExXCI6IFwi6Zuo6Iqx5Yy6XCIsXG5cdCAgICBcIjQzMDEyMVwiOiBcIumVv+aymeWOv1wiLFxuXHQgICAgXCI0MzAxMjJcIjogXCLmnJvln47ljLpcIixcblx0ICAgIFwiNDMwMTI0XCI6IFwi5a6B5Lmh5Y6/XCIsXG5cdCAgICBcIjQzMDE4MVwiOiBcIua1j+mYs+W4glwiLFxuXHQgICAgXCI0MzAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwMjAwXCI6IFwi5qCq5rSy5biCXCIsXG5cdCAgICBcIjQzMDIwMlwiOiBcIuiNt+WhmOWMulwiLFxuXHQgICAgXCI0MzAyMDNcIjogXCLoiqbmt57ljLpcIixcblx0ICAgIFwiNDMwMjA0XCI6IFwi55+z5bOw5Yy6XCIsXG5cdCAgICBcIjQzMDIxMVwiOiBcIuWkqeWFg+WMulwiLFxuXHQgICAgXCI0MzAyMjFcIjogXCLmoKrmtLLljr9cIixcblx0ICAgIFwiNDMwMjIzXCI6IFwi5pS45Y6/XCIsXG5cdCAgICBcIjQzMDIyNFwiOiBcIuiMtumZteWOv1wiLFxuXHQgICAgXCI0MzAyMjVcIjogXCLngo7pmbXljr9cIixcblx0ICAgIFwiNDMwMjgxXCI6IFwi6Ya06Zm15biCXCIsXG5cdCAgICBcIjQzMDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzAzMDBcIjogXCLmuZjmva3luIJcIixcblx0ICAgIFwiNDMwMzAyXCI6IFwi6Zuo5rmW5Yy6XCIsXG5cdCAgICBcIjQzMDMwNFwiOiBcIuWys+WhmOWMulwiLFxuXHQgICAgXCI0MzAzMjFcIjogXCLmuZjmva3ljr9cIixcblx0ICAgIFwiNDMwMzgxXCI6IFwi5rmY5Lmh5biCXCIsXG5cdCAgICBcIjQzMDM4MlwiOiBcIumftuWxseW4glwiLFxuXHQgICAgXCI0MzAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwNDAwXCI6IFwi6KGh6Ziz5biCXCIsXG5cdCAgICBcIjQzMDQwNVwiOiBcIuePoOaZluWMulwiLFxuXHQgICAgXCI0MzA0MDZcIjogXCLpm4Hls7DljLpcIixcblx0ICAgIFwiNDMwNDA3XCI6IFwi55+z6byT5Yy6XCIsXG5cdCAgICBcIjQzMDQwOFwiOiBcIuiSuOa5mOWMulwiLFxuXHQgICAgXCI0MzA0MTJcIjogXCLljZflsrPljLpcIixcblx0ICAgIFwiNDMwNDIxXCI6IFwi6KGh6Ziz5Y6/XCIsXG5cdCAgICBcIjQzMDQyMlwiOiBcIuihoeWNl+WOv1wiLFxuXHQgICAgXCI0MzA0MjNcIjogXCLooaHlsbHljr9cIixcblx0ICAgIFwiNDMwNDI0XCI6IFwi6KGh5Lic5Y6/XCIsXG5cdCAgICBcIjQzMDQyNlwiOiBcIuelgeS4nOWOv1wiLFxuXHQgICAgXCI0MzA0ODFcIjogXCLogJLpmLPluIJcIixcblx0ICAgIFwiNDMwNDgyXCI6IFwi5bi45a6B5biCXCIsXG5cdCAgICBcIjQzMDQ4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA1MDBcIjogXCLpgrXpmLPluIJcIixcblx0ICAgIFwiNDMwNTAyXCI6IFwi5Y+M5riF5Yy6XCIsXG5cdCAgICBcIjQzMDUwM1wiOiBcIuWkp+elpeWMulwiLFxuXHQgICAgXCI0MzA1MTFcIjogXCLljJfloZTljLpcIixcblx0ICAgIFwiNDMwNTIxXCI6IFwi6YK15Lic5Y6/XCIsXG5cdCAgICBcIjQzMDUyMlwiOiBcIuaWsOmCteWOv1wiLFxuXHQgICAgXCI0MzA1MjNcIjogXCLpgrXpmLPljr9cIixcblx0ICAgIFwiNDMwNTI0XCI6IFwi6ZqG5Zue5Y6/XCIsXG5cdCAgICBcIjQzMDUyNVwiOiBcIua0nuWPo+WOv1wiLFxuXHQgICAgXCI0MzA1MjdcIjogXCLnu6XlroHljr9cIixcblx0ICAgIFwiNDMwNTI4XCI6IFwi5paw5a6B5Y6/XCIsXG5cdCAgICBcIjQzMDUyOVwiOiBcIuWfjuatpeiLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzA1ODFcIjogXCLmrablhojluIJcIixcblx0ICAgIFwiNDMwNTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQzMDYwMFwiOiBcIuWys+mYs+W4glwiLFxuXHQgICAgXCI0MzA2MDJcIjogXCLlsrPpmLPmpbzljLpcIixcblx0ICAgIFwiNDMwNjAzXCI6IFwi5LqR5rqq5Yy6XCIsXG5cdCAgICBcIjQzMDYxMVwiOiBcIuWQm+WxseWMulwiLFxuXHQgICAgXCI0MzA2MjFcIjogXCLlsrPpmLPljr9cIixcblx0ICAgIFwiNDMwNjIzXCI6IFwi5Y2O5a655Y6/XCIsXG5cdCAgICBcIjQzMDYyNFwiOiBcIua5mOmYtOWOv1wiLFxuXHQgICAgXCI0MzA2MjZcIjogXCLlubPmsZ/ljr9cIixcblx0ICAgIFwiNDMwNjgxXCI6IFwi5rGo572X5biCXCIsXG5cdCAgICBcIjQzMDY4MlwiOiBcIuS4tOa5mOW4glwiLFxuXHQgICAgXCI0MzA2ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwNzAwXCI6IFwi5bi45b635biCXCIsXG5cdCAgICBcIjQzMDcwMlwiOiBcIuatpumZteWMulwiLFxuXHQgICAgXCI0MzA3MDNcIjogXCLpvI7ln47ljLpcIixcblx0ICAgIFwiNDMwNzIxXCI6IFwi5a6J5Lmh5Y6/XCIsXG5cdCAgICBcIjQzMDcyMlwiOiBcIuaxieWvv+WOv1wiLFxuXHQgICAgXCI0MzA3MjNcIjogXCLmvqfljr9cIixcblx0ICAgIFwiNDMwNzI0XCI6IFwi5Li05r6n5Y6/XCIsXG5cdCAgICBcIjQzMDcyNVwiOiBcIuahg+a6kOWOv1wiLFxuXHQgICAgXCI0MzA3MjZcIjogXCLnn7Ppl6jljr9cIixcblx0ICAgIFwiNDMwNzgxXCI6IFwi5rSl5biC5biCXCIsXG5cdCAgICBcIjQzMDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA4MDBcIjogXCLlvKDlrrbnlYzluIJcIixcblx0ICAgIFwiNDMwODAyXCI6IFwi5rC45a6a5Yy6XCIsXG5cdCAgICBcIjQzMDgxMVwiOiBcIuatpumZtea6kOWMulwiLFxuXHQgICAgXCI0MzA4MjFcIjogXCLmhYjliKnljr9cIixcblx0ICAgIFwiNDMwODIyXCI6IFwi5qGR5qSN5Y6/XCIsXG5cdCAgICBcIjQzMDgyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA5MDBcIjogXCLnm4rpmLPluIJcIixcblx0ICAgIFwiNDMwOTAyXCI6IFwi6LWE6Ziz5Yy6XCIsXG5cdCAgICBcIjQzMDkwM1wiOiBcIui1q+WxseWMulwiLFxuXHQgICAgXCI0MzA5MjFcIjogXCLljZfljr9cIixcblx0ICAgIFwiNDMwOTIyXCI6IFwi5qGD5rGf5Y6/XCIsXG5cdCAgICBcIjQzMDkyM1wiOiBcIuWuieWMluWOv1wiLFxuXHQgICAgXCI0MzA5ODFcIjogXCLmsoXmsZ/luIJcIixcblx0ICAgIFwiNDMwOTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQzMTAwMFwiOiBcIumDtOW3nuW4glwiLFxuXHQgICAgXCI0MzEwMDJcIjogXCLljJfmuZbljLpcIixcblx0ICAgIFwiNDMxMDAzXCI6IFwi6IuP5LuZ5Yy6XCIsXG5cdCAgICBcIjQzMTAyMVwiOiBcIuahgumYs+WOv1wiLFxuXHQgICAgXCI0MzEwMjJcIjogXCLlrpznq6Dljr9cIixcblx0ICAgIFwiNDMxMDIzXCI6IFwi5rC45YW05Y6/XCIsXG5cdCAgICBcIjQzMTAyNFwiOiBcIuWYieemvuWOv1wiLFxuXHQgICAgXCI0MzEwMjVcIjogXCLkuLTmrabljr9cIixcblx0ICAgIFwiNDMxMDI2XCI6IFwi5rGd5Z+O5Y6/XCIsXG5cdCAgICBcIjQzMTAyN1wiOiBcIuahguS4nOWOv1wiLFxuXHQgICAgXCI0MzEwMjhcIjogXCLlronku4Hljr9cIixcblx0ICAgIFwiNDMxMDgxXCI6IFwi6LWE5YW05biCXCIsXG5cdCAgICBcIjQzMTA4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzExMDBcIjogXCLmsLjlt57luIJcIixcblx0ICAgIFwiNDMxMTAyXCI6IFwi6Zu26Zm15Yy6XCIsXG5cdCAgICBcIjQzMTEwM1wiOiBcIuWGt+awtOa7qeWMulwiLFxuXHQgICAgXCI0MzExMjFcIjogXCLnpYHpmLPljr9cIixcblx0ICAgIFwiNDMxMTIyXCI6IFwi5Lic5a6J5Y6/XCIsXG5cdCAgICBcIjQzMTEyM1wiOiBcIuWPjOeJjOWOv1wiLFxuXHQgICAgXCI0MzExMjRcIjogXCLpgZPljr9cIixcblx0ICAgIFwiNDMxMTI1XCI6IFwi5rGf5rC45Y6/XCIsXG5cdCAgICBcIjQzMTEyNlwiOiBcIuWugei/nOWOv1wiLFxuXHQgICAgXCI0MzExMjdcIjogXCLok53lsbHljr9cIixcblx0ICAgIFwiNDMxMTI4XCI6IFwi5paw55Sw5Y6/XCIsXG5cdCAgICBcIjQzMTEyOVwiOiBcIuaxn+WNjueRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzExMzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMxMjAwXCI6IFwi5oCA5YyW5biCXCIsXG5cdCAgICBcIjQzMTIwMlwiOiBcIum5pOWfjuWMulwiLFxuXHQgICAgXCI0MzEyMjFcIjogXCLkuK3mlrnljr9cIixcblx0ICAgIFwiNDMxMjIyXCI6IFwi5rKF6Zm15Y6/XCIsXG5cdCAgICBcIjQzMTIyM1wiOiBcIui+sOa6quWOv1wiLFxuXHQgICAgXCI0MzEyMjRcIjogXCLmuobmtabljr9cIixcblx0ICAgIFwiNDMxMjI1XCI6IFwi5Lya5ZCM5Y6/XCIsXG5cdCAgICBcIjQzMTIyNlwiOiBcIum6u+mYs+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzEyMjdcIjogXCLmlrDmmYPkvpfml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDMxMjI4XCI6IFwi6Iq35rGf5L6X5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQzMTIyOVwiOiBcIumdluW3nuiLl+aXj+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzEyMzBcIjogXCLpgJrpgZPkvpfml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDMxMjgxXCI6IFwi5rSq5rGf5biCXCIsXG5cdCAgICBcIjQzMTI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzEzMDBcIjogXCLlqITlupXluIJcIixcblx0ICAgIFwiNDMxMzAyXCI6IFwi5aiE5pif5Yy6XCIsXG5cdCAgICBcIjQzMTMyMVwiOiBcIuWPjOWzsOWOv1wiLFxuXHQgICAgXCI0MzEzMjJcIjogXCLmlrDljJbljr9cIixcblx0ICAgIFwiNDMxMzgxXCI6IFwi5Ya35rC05rGf5biCXCIsXG5cdCAgICBcIjQzMTM4MlwiOiBcIua2n+a6kOW4glwiLFxuXHQgICAgXCI0MzEzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMzMTAwXCI6IFwi5rmY6KW/5Zyf5a625peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjQzMzEwMVwiOiBcIuWQiemmluW4glwiLFxuXHQgICAgXCI0MzMxMjJcIjogXCLms7jmuqrljr9cIixcblx0ICAgIFwiNDMzMTIzXCI6IFwi5Yek5Yew5Y6/XCIsXG5cdCAgICBcIjQzMzEyNFwiOiBcIuiKseWeo+WOv1wiLFxuXHQgICAgXCI0MzMxMjVcIjogXCLkv53pnZbljr9cIixcblx0ICAgIFwiNDMzMTI2XCI6IFwi5Y+k5LiI5Y6/XCIsXG5cdCAgICBcIjQzMzEyN1wiOiBcIuawuOmhuuWOv1wiLFxuXHQgICAgXCI0MzMxMzBcIjogXCLpvpnlsbHljr9cIixcblx0ICAgIFwiNDMzMTMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDAwMFwiOiBcIuW5v+S4nOecgVwiLFxuXHQgICAgXCI0NDAxMDBcIjogXCLlub/lt57luIJcIixcblx0ICAgIFwiNDQwMTAzXCI6IFwi6I2U5rm+5Yy6XCIsXG5cdCAgICBcIjQ0MDEwNFwiOiBcIui2iuengOWMulwiLFxuXHQgICAgXCI0NDAxMDVcIjogXCLmtbfnj6DljLpcIixcblx0ICAgIFwiNDQwMTA2XCI6IFwi5aSp5rKz5Yy6XCIsXG5cdCAgICBcIjQ0MDExMVwiOiBcIueZveS6keWMulwiLFxuXHQgICAgXCI0NDAxMTJcIjogXCLpu4Tln5TljLpcIixcblx0ICAgIFwiNDQwMTEzXCI6IFwi55Wq56a65Yy6XCIsXG5cdCAgICBcIjQ0MDExNFwiOiBcIuiKsemDveWMulwiLFxuXHQgICAgXCI0NDAxMTVcIjogXCLljZfmspnljLpcIixcblx0ICAgIFwiNDQwMTE2XCI6IFwi6JCd5bKX5Yy6XCIsXG5cdCAgICBcIjQ0MDE4M1wiOiBcIuWinuWfjuW4glwiLFxuXHQgICAgXCI0NDAxODRcIjogXCLku47ljJbluIJcIixcblx0ICAgIFwiNDQwMTg5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDIwMFwiOiBcIumftuWFs+W4glwiLFxuXHQgICAgXCI0NDAyMDNcIjogXCLmrabmsZ/ljLpcIixcblx0ICAgIFwiNDQwMjA0XCI6IFwi5rWI5rGf5Yy6XCIsXG5cdCAgICBcIjQ0MDIwNVwiOiBcIuabsuaxn+WMulwiLFxuXHQgICAgXCI0NDAyMjJcIjogXCLlp4vlhbTljr9cIixcblx0ICAgIFwiNDQwMjI0XCI6IFwi5LuB5YyW5Y6/XCIsXG5cdCAgICBcIjQ0MDIyOVwiOiBcIue/gea6kOWOv1wiLFxuXHQgICAgXCI0NDAyMzJcIjogXCLkubPmupDnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDQwMjMzXCI6IFwi5paw5Liw5Y6/XCIsXG5cdCAgICBcIjQ0MDI4MVwiOiBcIuS5kOaYjOW4glwiLFxuXHQgICAgXCI0NDAyODJcIjogXCLljZfpm4TluIJcIixcblx0ICAgIFwiNDQwMjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDMwMFwiOiBcIua3seWcs+W4glwiLFxuXHQgICAgXCI0NDAzMDNcIjogXCLnvZfmuZbljLpcIixcblx0ICAgIFwiNDQwMzA0XCI6IFwi56aP55Sw5Yy6XCIsXG5cdCAgICBcIjQ0MDMwNVwiOiBcIuWNl+WxseWMulwiLFxuXHQgICAgXCI0NDAzMDZcIjogXCLlrp3lronljLpcIixcblx0ICAgIFwiNDQwMzA3XCI6IFwi6b6Z5bKX5Yy6XCIsXG5cdCAgICBcIjQ0MDMwOFwiOiBcIuebkOeUsOWMulwiLFxuXHQgICAgXCI0NDAzMDlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwMzIwXCI6IFwi5YWJ5piO5paw5Yy6XCIsXG5cdCAgICBcIjQ0MDMyMVwiOiBcIuWdquWxseaWsOWMulwiLFxuXHQgICAgXCI0NDAzMjJcIjogXCLlpKfpuY/mlrDljLpcIixcblx0ICAgIFwiNDQwMzIzXCI6IFwi6b6Z5Y2O5paw5Yy6XCIsXG5cdCAgICBcIjQ0MDQwMFwiOiBcIuePoOa1t+W4glwiLFxuXHQgICAgXCI0NDA0MDJcIjogXCLpppnmtLLljLpcIixcblx0ICAgIFwiNDQwNDAzXCI6IFwi5paX6Zeo5Yy6XCIsXG5cdCAgICBcIjQ0MDQwNFwiOiBcIumHkea5vuWMulwiLFxuXHQgICAgXCI0NDA0ODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwNTAwXCI6IFwi5rGV5aS05biCXCIsXG5cdCAgICBcIjQ0MDUwN1wiOiBcIum+mea5luWMulwiLFxuXHQgICAgXCI0NDA1MTFcIjogXCLph5HlubPljLpcIixcblx0ICAgIFwiNDQwNTEyXCI6IFwi5r+g5rGf5Yy6XCIsXG5cdCAgICBcIjQ0MDUxM1wiOiBcIua9rumYs+WMulwiLFxuXHQgICAgXCI0NDA1MTRcIjogXCLmva7ljZfljLpcIixcblx0ICAgIFwiNDQwNTE1XCI6IFwi5r6E5rW35Yy6XCIsXG5cdCAgICBcIjQ0MDUyM1wiOiBcIuWNl+a+s+WOv1wiLFxuXHQgICAgXCI0NDA1MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwNjAwXCI6IFwi5L2b5bGx5biCXCIsXG5cdCAgICBcIjQ0MDYwNFwiOiBcIuemheWfjuWMulwiLFxuXHQgICAgXCI0NDA2MDVcIjogXCLljZfmtbfljLpcIixcblx0ICAgIFwiNDQwNjA2XCI6IFwi6aG65b635Yy6XCIsXG5cdCAgICBcIjQ0MDYwN1wiOiBcIuS4ieawtOWMulwiLFxuXHQgICAgXCI0NDA2MDhcIjogXCLpq5jmmI7ljLpcIixcblx0ICAgIFwiNDQwNjA5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDcwMFwiOiBcIuaxn+mXqOW4glwiLFxuXHQgICAgXCI0NDA3MDNcIjogXCLok6zmsZ/ljLpcIixcblx0ICAgIFwiNDQwNzA0XCI6IFwi5rGf5rW35Yy6XCIsXG5cdCAgICBcIjQ0MDcwNVwiOiBcIuaWsOS8muWMulwiLFxuXHQgICAgXCI0NDA3ODFcIjogXCLlj7DlsbHluIJcIixcblx0ICAgIFwiNDQwNzgzXCI6IFwi5byA5bmz5biCXCIsXG5cdCAgICBcIjQ0MDc4NFwiOiBcIum5pOWxseW4glwiLFxuXHQgICAgXCI0NDA3ODVcIjogXCLmganlubPluIJcIixcblx0ICAgIFwiNDQwNzg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDgwMFwiOiBcIua5m+axn+W4glwiLFxuXHQgICAgXCI0NDA4MDJcIjogXCLotaTlnY7ljLpcIixcblx0ICAgIFwiNDQwODAzXCI6IFwi6Zye5bGx5Yy6XCIsXG5cdCAgICBcIjQ0MDgwNFwiOiBcIuWdoeWktOWMulwiLFxuXHQgICAgXCI0NDA4MTFcIjogXCLpurvnq6DljLpcIixcblx0ICAgIFwiNDQwODIzXCI6IFwi6YGC5rqq5Y6/XCIsXG5cdCAgICBcIjQ0MDgyNVwiOiBcIuW+kOmXu+WOv1wiLFxuXHQgICAgXCI0NDA4ODFcIjogXCLlu4nmsZ/luIJcIixcblx0ICAgIFwiNDQwODgyXCI6IFwi6Zu35bee5biCXCIsXG5cdCAgICBcIjQ0MDg4M1wiOiBcIuWQtOW3neW4glwiLFxuXHQgICAgXCI0NDA4ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwOTAwXCI6IFwi6IyC5ZCN5biCXCIsXG5cdCAgICBcIjQ0MDkwMlwiOiBcIuiMguWNl+WMulwiLFxuXHQgICAgXCI0NDA5MDNcIjogXCLojILmuK/ljLpcIixcblx0ICAgIFwiNDQwOTIzXCI6IFwi55S155m95Y6/XCIsXG5cdCAgICBcIjQ0MDk4MVwiOiBcIumrmOW3nuW4glwiLFxuXHQgICAgXCI0NDA5ODJcIjogXCLljJblt57luIJcIixcblx0ICAgIFwiNDQwOTgzXCI6IFwi5L+h5a6c5biCXCIsXG5cdCAgICBcIjQ0MDk4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDEyMDBcIjogXCLogofluobluIJcIixcblx0ICAgIFwiNDQxMjAyXCI6IFwi56uv5bee5Yy6XCIsXG5cdCAgICBcIjQ0MTIwM1wiOiBcIum8jua5luWMulwiLFxuXHQgICAgXCI0NDEyMjNcIjogXCLlub/lroHljr9cIixcblx0ICAgIFwiNDQxMjI0XCI6IFwi5oCA6ZuG5Y6/XCIsXG5cdCAgICBcIjQ0MTIyNVwiOiBcIuWwgeW8gOWOv1wiLFxuXHQgICAgXCI0NDEyMjZcIjogXCLlvrfluobljr9cIixcblx0ICAgIFwiNDQxMjgzXCI6IFwi6auY6KaB5biCXCIsXG5cdCAgICBcIjQ0MTI4NFwiOiBcIuWbm+S8muW4glwiLFxuXHQgICAgXCI0NDEyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQxMzAwXCI6IFwi5oOg5bee5biCXCIsXG5cdCAgICBcIjQ0MTMwMlwiOiBcIuaDoOWfjuWMulwiLFxuXHQgICAgXCI0NDEzMDNcIjogXCLmg6DpmLPljLpcIixcblx0ICAgIFwiNDQxMzIyXCI6IFwi5Y2a572X5Y6/XCIsXG5cdCAgICBcIjQ0MTMyM1wiOiBcIuaDoOS4nOWOv1wiLFxuXHQgICAgXCI0NDEzMjRcIjogXCLpvpnpl6jljr9cIixcblx0ICAgIFwiNDQxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTQwMFwiOiBcIuaiheW3nuW4glwiLFxuXHQgICAgXCI0NDE0MDJcIjogXCLmooXmsZ/ljLpcIixcblx0ICAgIFwiNDQxNDIxXCI6IFwi5qKF5Y6/XCIsXG5cdCAgICBcIjQ0MTQyMlwiOiBcIuWkp+WflOWOv1wiLFxuXHQgICAgXCI0NDE0MjNcIjogXCLkuLDpobrljr9cIixcblx0ICAgIFwiNDQxNDI0XCI6IFwi5LqU5Y2O5Y6/XCIsXG5cdCAgICBcIjQ0MTQyNlwiOiBcIuW5s+i/nOWOv1wiLFxuXHQgICAgXCI0NDE0MjdcIjogXCLolYnlsq3ljr9cIixcblx0ICAgIFwiNDQxNDgxXCI6IFwi5YW05a6B5biCXCIsXG5cdCAgICBcIjQ0MTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE1MDBcIjogXCLmsZXlsL7luIJcIixcblx0ICAgIFwiNDQxNTAyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0MTUyMVwiOiBcIua1t+S4sOWOv1wiLFxuXHQgICAgXCI0NDE1MjNcIjogXCLpmYbmsrPljr9cIixcblx0ICAgIFwiNDQxNTgxXCI6IFwi6ZmG5Liw5biCXCIsXG5cdCAgICBcIjQ0MTU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE2MDBcIjogXCLmsrPmupDluIJcIixcblx0ICAgIFwiNDQxNjAyXCI6IFwi5rqQ5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0MTYyMVwiOiBcIue0q+mHkeWOv1wiLFxuXHQgICAgXCI0NDE2MjJcIjogXCLpvpnlt53ljr9cIixcblx0ICAgIFwiNDQxNjIzXCI6IFwi6L+e5bmz5Y6/XCIsXG5cdCAgICBcIjQ0MTYyNFwiOiBcIuWSjOW5s+WOv1wiLFxuXHQgICAgXCI0NDE2MjVcIjogXCLkuJzmupDljr9cIixcblx0ICAgIFwiNDQxNjI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTcwMFwiOiBcIumYs+axn+W4glwiLFxuXHQgICAgXCI0NDE3MDJcIjogXCLmsZ/ln47ljLpcIixcblx0ICAgIFwiNDQxNzIxXCI6IFwi6Ziz6KW/5Y6/XCIsXG5cdCAgICBcIjQ0MTcyM1wiOiBcIumYs+S4nOWOv1wiLFxuXHQgICAgXCI0NDE3ODFcIjogXCLpmLPmmKXluIJcIixcblx0ICAgIFwiNDQxNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTgwMFwiOiBcIua4hei/nOW4glwiLFxuXHQgICAgXCI0NDE4MDJcIjogXCLmuIXln47ljLpcIixcblx0ICAgIFwiNDQxODIxXCI6IFwi5L2b5YaI5Y6/XCIsXG5cdCAgICBcIjQ0MTgyM1wiOiBcIumYs+WxseWOv1wiLFxuXHQgICAgXCI0NDE4MjVcIjogXCLov57lsbHlo67ml4/nkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDQxODI2XCI6IFwi6L+e5Y2X55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ0MTgyN1wiOiBcIua4heaWsOWMulwiLFxuXHQgICAgXCI0NDE4ODFcIjogXCLoi7HlvrfluIJcIixcblx0ICAgIFwiNDQxODgyXCI6IFwi6L+e5bee5biCXCIsXG5cdCAgICBcIjQ0MTg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE5MDBcIjogXCLkuJzojp7luIJcIixcblx0ICAgIFwiNDQyMDAwXCI6IFwi5Lit5bGx5biCXCIsXG5cdCAgICBcIjQ0MjEwMVwiOiBcIuS4nOaymee+pOWym1wiLFxuXHQgICAgXCI0NDUxMDBcIjogXCLmva7lt57luIJcIixcblx0ICAgIFwiNDQ1MTAyXCI6IFwi5rmY5qGl5Yy6XCIsXG5cdCAgICBcIjQ0NTEyMVwiOiBcIua9ruWuieWMulwiLFxuXHQgICAgXCI0NDUxMjJcIjogXCLppbblubPljr9cIixcblx0ICAgIFwiNDQ1MTg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0NTIwMFwiOiBcIuaPremYs+W4glwiLFxuXHQgICAgXCI0NDUyMDJcIjogXCLmppXln47ljLpcIixcblx0ICAgIFwiNDQ1MjIxXCI6IFwi5o+t5Lic5Yy6XCIsXG5cdCAgICBcIjQ0NTIyMlwiOiBcIuaPreilv+WOv1wiLFxuXHQgICAgXCI0NDUyMjRcIjogXCLmg6DmnaXljr9cIixcblx0ICAgIFwiNDQ1MjgxXCI6IFwi5pmu5a6B5biCXCIsXG5cdCAgICBcIjQ0NTI4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDUzMDBcIjogXCLkupHmta7luIJcIixcblx0ICAgIFwiNDQ1MzAyXCI6IFwi5LqR5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0NTMyMVwiOiBcIuaWsOWFtOWOv1wiLFxuXHQgICAgXCI0NDUzMjJcIjogXCLpg4HljZfljr9cIixcblx0ICAgIFwiNDQ1MzIzXCI6IFwi5LqR5a6J5Y6/XCIsXG5cdCAgICBcIjQ0NTM4MVwiOiBcIue9l+WumuW4glwiLFxuXHQgICAgXCI0NDUzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMDAwXCI6IFwi5bm/6KW/5aOu5peP6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjQ1MDEwMFwiOiBcIuWNl+WugeW4glwiLFxuXHQgICAgXCI0NTAxMDJcIjogXCLlhbTlroHljLpcIixcblx0ICAgIFwiNDUwMTAzXCI6IFwi6Z2S56eA5Yy6XCIsXG5cdCAgICBcIjQ1MDEwNVwiOiBcIuaxn+WNl+WMulwiLFxuXHQgICAgXCI0NTAxMDdcIjogXCLopb/kuaHloZjljLpcIixcblx0ICAgIFwiNDUwMTA4XCI6IFwi6Imv5bqG5Yy6XCIsXG5cdCAgICBcIjQ1MDEwOVwiOiBcIumCleWugeWMulwiLFxuXHQgICAgXCI0NTAxMjJcIjogXCLmrabpuKPljr9cIixcblx0ICAgIFwiNDUwMTIzXCI6IFwi6ZqG5a6J5Y6/XCIsXG5cdCAgICBcIjQ1MDEyNFwiOiBcIumprOWxseWOv1wiLFxuXHQgICAgXCI0NTAxMjVcIjogXCLkuIrmnpfljr9cIixcblx0ICAgIFwiNDUwMTI2XCI6IFwi5a6+6Ziz5Y6/XCIsXG5cdCAgICBcIjQ1MDEyN1wiOiBcIuaoquWOv1wiLFxuXHQgICAgXCI0NTAxMjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMjAwXCI6IFwi5p+z5bee5biCXCIsXG5cdCAgICBcIjQ1MDIwMlwiOiBcIuWfjuS4reWMulwiLFxuXHQgICAgXCI0NTAyMDNcIjogXCLpsbzls7DljLpcIixcblx0ICAgIFwiNDUwMjA0XCI6IFwi5p+z5Y2X5Yy6XCIsXG5cdCAgICBcIjQ1MDIwNVwiOiBcIuafs+WMl+WMulwiLFxuXHQgICAgXCI0NTAyMjFcIjogXCLmn7PmsZ/ljr9cIixcblx0ICAgIFwiNDUwMjIyXCI6IFwi5p+z5Z+O5Y6/XCIsXG5cdCAgICBcIjQ1MDIyM1wiOiBcIum5v+WvqOWOv1wiLFxuXHQgICAgXCI0NTAyMjRcIjogXCLono3lronljr9cIixcblx0ICAgIFwiNDUwMjI1XCI6IFwi6J6N5rC06IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MDIyNlwiOiBcIuS4ieaxn+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTAyMjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMzAwXCI6IFwi5qGC5p6X5biCXCIsXG5cdCAgICBcIjQ1MDMwMlwiOiBcIuengOWzsOWMulwiLFxuXHQgICAgXCI0NTAzMDNcIjogXCLlj6DlvanljLpcIixcblx0ICAgIFwiNDUwMzA0XCI6IFwi6LGh5bGx5Yy6XCIsXG5cdCAgICBcIjQ1MDMwNVwiOiBcIuS4g+aYn+WMulwiLFxuXHQgICAgXCI0NTAzMTFcIjogXCLpm4HlsbHljLpcIixcblx0ICAgIFwiNDUwMzIxXCI6IFwi6Ziz5pyU5Y6/XCIsXG5cdCAgICBcIjQ1MDMyMlwiOiBcIuS4tOahguWMulwiLFxuXHQgICAgXCI0NTAzMjNcIjogXCLngbXlt53ljr9cIixcblx0ICAgIFwiNDUwMzI0XCI6IFwi5YWo5bee5Y6/XCIsXG5cdCAgICBcIjQ1MDMyNVwiOiBcIuWFtOWuieWOv1wiLFxuXHQgICAgXCI0NTAzMjZcIjogXCLmsLjnpo/ljr9cIixcblx0ICAgIFwiNDUwMzI3XCI6IFwi54GM6Ziz5Y6/XCIsXG5cdCAgICBcIjQ1MDMyOFwiOiBcIum+meiDnOWQhOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTAzMjlcIjogXCLotYTmupDljr9cIixcblx0ICAgIFwiNDUwMzMwXCI6IFwi5bmz5LmQ5Y6/XCIsXG5cdCAgICBcIjQ1MDMzMVwiOiBcIuiNlOa1puWOv1wiLFxuXHQgICAgXCI0NTAzMzJcIjogXCLmga3ln47nkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUwMzMzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDQwMFwiOiBcIuaip+W3nuW4glwiLFxuXHQgICAgXCI0NTA0MDNcIjogXCLkuIfnp4DljLpcIixcblx0ICAgIFwiNDUwNDA1XCI6IFwi6ZW/5rSy5Yy6XCIsXG5cdCAgICBcIjQ1MDQwNlwiOiBcIum+meWcqeWMulwiLFxuXHQgICAgXCI0NTA0MjFcIjogXCLoi43moqfljr9cIixcblx0ICAgIFwiNDUwNDIyXCI6IFwi6Jek5Y6/XCIsXG5cdCAgICBcIjQ1MDQyM1wiOiBcIuiSmeWxseWOv1wiLFxuXHQgICAgXCI0NTA0ODFcIjogXCLlspHmuqrluIJcIixcblx0ICAgIFwiNDUwNDgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDUwMFwiOiBcIuWMl+a1t+W4glwiLFxuXHQgICAgXCI0NTA1MDJcIjogXCLmtbfln47ljLpcIixcblx0ICAgIFwiNDUwNTAzXCI6IFwi6ZO25rW35Yy6XCIsXG5cdCAgICBcIjQ1MDUxMlwiOiBcIumTgeWxsea4r+WMulwiLFxuXHQgICAgXCI0NTA1MjFcIjogXCLlkIjmtabljr9cIixcblx0ICAgIFwiNDUwNTIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDYwMFwiOiBcIumYsuWfjua4r+W4glwiLFxuXHQgICAgXCI0NTA2MDJcIjogXCLmuK/lj6PljLpcIixcblx0ICAgIFwiNDUwNjAzXCI6IFwi6Ziy5Z+O5Yy6XCIsXG5cdCAgICBcIjQ1MDYyMVwiOiBcIuS4iuaAneWOv1wiLFxuXHQgICAgXCI0NTA2ODFcIjogXCLkuJzlhbTluIJcIixcblx0ICAgIFwiNDUwNjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDcwMFwiOiBcIumSpuW3nuW4glwiLFxuXHQgICAgXCI0NTA3MDJcIjogXCLpkqbljZfljLpcIixcblx0ICAgIFwiNDUwNzAzXCI6IFwi6ZKm5YyX5Yy6XCIsXG5cdCAgICBcIjQ1MDcyMVwiOiBcIueBteWxseWOv1wiLFxuXHQgICAgXCI0NTA3MjJcIjogXCLmtabljJfljr9cIixcblx0ICAgIFwiNDUwNzIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDgwMFwiOiBcIui0tea4r+W4glwiLFxuXHQgICAgXCI0NTA4MDJcIjogXCLmuK/ljJfljLpcIixcblx0ICAgIFwiNDUwODAzXCI6IFwi5riv5Y2X5Yy6XCIsXG5cdCAgICBcIjQ1MDgwNFwiOiBcIuimg+WhmOWMulwiLFxuXHQgICAgXCI0NTA4MjFcIjogXCLlubPljZfljr9cIixcblx0ICAgIFwiNDUwODgxXCI6IFwi5qGC5bmz5biCXCIsXG5cdCAgICBcIjQ1MDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTA5MDBcIjogXCLnjonmnpfluIJcIixcblx0ICAgIFwiNDUwOTAyXCI6IFwi546J5bee5Yy6XCIsXG5cdCAgICBcIjQ1MDkwM1wiOiBcIuemj+e7teWMulwiLFxuXHQgICAgXCI0NTA5MjFcIjogXCLlrrnljr9cIixcblx0ICAgIFwiNDUwOTIyXCI6IFwi6ZmG5bed5Y6/XCIsXG5cdCAgICBcIjQ1MDkyM1wiOiBcIuWNmueZveWOv1wiLFxuXHQgICAgXCI0NTA5MjRcIjogXCLlhbTkuJrljr9cIixcblx0ICAgIFwiNDUwOTgxXCI6IFwi5YyX5rWB5biCXCIsXG5cdCAgICBcIjQ1MDk4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTEwMDBcIjogXCLnmb7oibLluIJcIixcblx0ICAgIFwiNDUxMDAyXCI6IFwi5Y+z5rGf5Yy6XCIsXG5cdCAgICBcIjQ1MTAyMVwiOiBcIueUsOmYs+WOv1wiLFxuXHQgICAgXCI0NTEwMjJcIjogXCLnlLDkuJzljr9cIixcblx0ICAgIFwiNDUxMDIzXCI6IFwi5bmz5p6c5Y6/XCIsXG5cdCAgICBcIjQ1MTAyNFwiOiBcIuW+t+S/neWOv1wiLFxuXHQgICAgXCI0NTEwMjVcIjogXCLpnZbopb/ljr9cIixcblx0ICAgIFwiNDUxMDI2XCI6IFwi6YKj5Z2h5Y6/XCIsXG5cdCAgICBcIjQ1MTAyN1wiOiBcIuWHjOS6keWOv1wiLFxuXHQgICAgXCI0NTEwMjhcIjogXCLkuZDkuJrljr9cIixcblx0ICAgIFwiNDUxMDI5XCI6IFwi55Sw5p6X5Y6/XCIsXG5cdCAgICBcIjQ1MTAzMFwiOiBcIuilv+ael+WOv1wiLFxuXHQgICAgXCI0NTEwMzFcIjogXCLpmobmnpflkITml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMDMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MTEwMFwiOiBcIui0uuW3nuW4glwiLFxuXHQgICAgXCI0NTExMDJcIjogXCLlhavmraXljLpcIixcblx0ICAgIFwiNDUxMTE5XCI6IFwi5bmz5qGC566h55CG5Yy6XCIsXG5cdCAgICBcIjQ1MTEyMVwiOiBcIuaYreW5s+WOv1wiLFxuXHQgICAgXCI0NTExMjJcIjogXCLpkp/lsbHljr9cIixcblx0ICAgIFwiNDUxMTIzXCI6IFwi5a+M5bed55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTEyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTEyMDBcIjogXCLmsrPmsaDluIJcIixcblx0ICAgIFwiNDUxMjAyXCI6IFwi6YeR5Z+O5rGf5Yy6XCIsXG5cdCAgICBcIjQ1MTIyMVwiOiBcIuWNl+S4ueWOv1wiLFxuXHQgICAgXCI0NTEyMjJcIjogXCLlpKnls6jljr9cIixcblx0ICAgIFwiNDUxMjIzXCI6IFwi5Yek5bGx5Y6/XCIsXG5cdCAgICBcIjQ1MTIyNFwiOiBcIuS4nOWFsOWOv1wiLFxuXHQgICAgXCI0NTEyMjVcIjogXCLnvZfln47ku6vkvazml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMjI2XCI6IFwi546v5rGf5q+b5Y2X5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTIyN1wiOiBcIuW3tOmprOeRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTEyMjhcIjogXCLpg73lronnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMjI5XCI6IFwi5aSn5YyW55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTI4MVwiOiBcIuWunOW3nuW4glwiLFxuXHQgICAgXCI0NTEyODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUxMzAwXCI6IFwi5p2l5a6+5biCXCIsXG5cdCAgICBcIjQ1MTMwMlwiOiBcIuWFtOWuvuWMulwiLFxuXHQgICAgXCI0NTEzMjFcIjogXCLlv7vln47ljr9cIixcblx0ICAgIFwiNDUxMzIyXCI6IFwi6LGh5bee5Y6/XCIsXG5cdCAgICBcIjQ1MTMyM1wiOiBcIuatpuWuo+WOv1wiLFxuXHQgICAgXCI0NTEzMjRcIjogXCLph5Hnp4Dnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMzgxXCI6IFwi5ZCI5bGx5biCXCIsXG5cdCAgICBcIjQ1MTM4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTE0MDBcIjogXCLltIflt6bluIJcIixcblx0ICAgIFwiNDUxNDAyXCI6IFwi5rGf5bee5Yy6XCIsXG5cdCAgICBcIjQ1MTQyMVwiOiBcIuaJtue7peWOv1wiLFxuXHQgICAgXCI0NTE0MjJcIjogXCLlroHmmI7ljr9cIixcblx0ICAgIFwiNDUxNDIzXCI6IFwi6b6Z5bee5Y6/XCIsXG5cdCAgICBcIjQ1MTQyNFwiOiBcIuWkp+aWsOWOv1wiLFxuXHQgICAgXCI0NTE0MjVcIjogXCLlpKnnrYnljr9cIixcblx0ICAgIFwiNDUxNDgxXCI6IFwi5Yet56Wl5biCXCIsXG5cdCAgICBcIjQ1MTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NjAwMDBcIjogXCLmtbfljZfnnIFcIixcblx0ICAgIFwiNDYwMTAwXCI6IFwi5rW35Y+j5biCXCIsXG5cdCAgICBcIjQ2MDEwNVwiOiBcIuengOiLseWMulwiLFxuXHQgICAgXCI0NjAxMDZcIjogXCLpvpnljY7ljLpcIixcblx0ICAgIFwiNDYwMTA3XCI6IFwi55C85bGx5Yy6XCIsXG5cdCAgICBcIjQ2MDEwOFwiOiBcIue+juWFsOWMulwiLFxuXHQgICAgXCI0NjAxMDlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDYwMjAwXCI6IFwi5LiJ5Lqa5biCXCIsXG5cdCAgICBcIjQ2MDMwMFwiOiBcIuS4ieaymeW4glwiLFxuXHQgICAgXCI0NjAzMjFcIjogXCLopb/mspnnvqTlsptcIixcblx0ICAgIFwiNDYwMzIyXCI6IFwi5Y2X5rKZ576k5bKbXCIsXG5cdCAgICBcIjQ2MDMyM1wiOiBcIuS4reaymee+pOWym+eahOWym+ekgeWPiuWFtua1t+Wfn1wiLFxuXHQgICAgXCI0NjkwMDFcIjogXCLkupTmjIflsbHluIJcIixcblx0ICAgIFwiNDY5MDAyXCI6IFwi55C85rW35biCXCIsXG5cdCAgICBcIjQ2OTAwM1wiOiBcIuWEi+W3nuW4glwiLFxuXHQgICAgXCI0NjkwMDVcIjogXCLmlofmmIzluIJcIixcblx0ICAgIFwiNDY5MDA2XCI6IFwi5LiH5a6B5biCXCIsXG5cdCAgICBcIjQ2OTAwN1wiOiBcIuS4nOaWueW4glwiLFxuXHQgICAgXCI0NjkwMjVcIjogXCLlrprlronljr9cIixcblx0ICAgIFwiNDY5MDI2XCI6IFwi5bGv5piM5Y6/XCIsXG5cdCAgICBcIjQ2OTAyN1wiOiBcIua+hOi/iOWOv1wiLFxuXHQgICAgXCI0NjkwMjhcIjogXCLkuLTpq5jljr9cIixcblx0ICAgIFwiNDY5MDMwXCI6IFwi55m95rKZ6buO5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ2OTAzMVwiOiBcIuaYjOaxn+m7juaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NjkwMzNcIjogXCLkuZDkuJzpu47ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDY5MDM0XCI6IFwi6Zm15rC06buO5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ2OTAzNVwiOiBcIuS/neS6rem7juaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NjkwMzZcIjogXCLnkLzkuK3pu47ml4/oi5fml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDcxMDA1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUwMDAwMFwiOiBcIumHjeW6hlwiLFxuXHQgICAgXCI1MDAxMDBcIjogXCLph43luobluIJcIixcblx0ICAgIFwiNTAwMTAxXCI6IFwi5LiH5bee5Yy6XCIsXG5cdCAgICBcIjUwMDEwMlwiOiBcIua2qumZteWMulwiLFxuXHQgICAgXCI1MDAxMDNcIjogXCLmuJ3kuK3ljLpcIixcblx0ICAgIFwiNTAwMTA0XCI6IFwi5aSn5rih5Y+j5Yy6XCIsXG5cdCAgICBcIjUwMDEwNVwiOiBcIuaxn+WMl+WMulwiLFxuXHQgICAgXCI1MDAxMDZcIjogXCLmspnlnarlnZ3ljLpcIixcblx0ICAgIFwiNTAwMTA3XCI6IFwi5Lmd6b6Z5Z2h5Yy6XCIsXG5cdCAgICBcIjUwMDEwOFwiOiBcIuWNl+WyuOWMulwiLFxuXHQgICAgXCI1MDAxMDlcIjogXCLljJfnoprljLpcIixcblx0ICAgIFwiNTAwMTEwXCI6IFwi5LiH55ub5Yy6XCIsXG5cdCAgICBcIjUwMDExMVwiOiBcIuWPjOahpeWMulwiLFxuXHQgICAgXCI1MDAxMTJcIjogXCLmuJ3ljJfljLpcIixcblx0ICAgIFwiNTAwMTEzXCI6IFwi5be05Y2X5Yy6XCIsXG5cdCAgICBcIjUwMDExNFwiOiBcIum7lOaxn+WMulwiLFxuXHQgICAgXCI1MDAxMTVcIjogXCLplb/lr7/ljLpcIixcblx0ICAgIFwiNTAwMjIyXCI6IFwi57am5rGf5Yy6XCIsXG5cdCAgICBcIjUwMDIyM1wiOiBcIua9vOWNl+WOv1wiLFxuXHQgICAgXCI1MDAyMjRcIjogXCLpk5zmooHljr9cIixcblx0ICAgIFwiNTAwMjI1XCI6IFwi5aSn6Laz5Yy6XCIsXG5cdCAgICBcIjUwMDIyNlwiOiBcIuiNo+aYjOWOv1wiLFxuXHQgICAgXCI1MDAyMjdcIjogXCLnkqflsbHljr9cIixcblx0ICAgIFwiNTAwMjI4XCI6IFwi5qKB5bmz5Y6/XCIsXG5cdCAgICBcIjUwMDIyOVwiOiBcIuWfjuWPo+WOv1wiLFxuXHQgICAgXCI1MDAyMzBcIjogXCLkuLDpg73ljr9cIixcblx0ICAgIFwiNTAwMjMxXCI6IFwi5Z6r5rGf5Y6/XCIsXG5cdCAgICBcIjUwMDIzMlwiOiBcIuatpumahuWOv1wiLFxuXHQgICAgXCI1MDAyMzNcIjogXCLlv6Dljr9cIixcblx0ICAgIFwiNTAwMjM0XCI6IFwi5byA5Y6/XCIsXG5cdCAgICBcIjUwMDIzNVwiOiBcIuS6kemYs+WOv1wiLFxuXHQgICAgXCI1MDAyMzZcIjogXCLlpYnoioLljr9cIixcblx0ICAgIFwiNTAwMjM3XCI6IFwi5ber5bGx5Y6/XCIsXG5cdCAgICBcIjUwMDIzOFwiOiBcIuW3q+a6quWOv1wiLFxuXHQgICAgXCI1MDAyNDBcIjogXCLnn7Pmn7HlnJ/lrrbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTAwMjQxXCI6IFwi56eA5bGx5Zyf5a625peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUwMDI0MlwiOiBcIumFiemYs+Wcn+WutuaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MDAyNDNcIjogXCLlva3msLToi5fml4/lnJ/lrrbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTAwMzgxXCI6IFwi5rGf5rSl5Yy6XCIsXG5cdCAgICBcIjUwMDM4MlwiOiBcIuWQiOW3neWMulwiLFxuXHQgICAgXCI1MDAzODNcIjogXCLmsLjlt53ljLpcIixcblx0ICAgIFwiNTAwMzg0XCI6IFwi5Y2X5bed5Yy6XCIsXG5cdCAgICBcIjUwMDM4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTAwMDBcIjogXCLlm5vlt53nnIFcIixcblx0ICAgIFwiNTEwMTAwXCI6IFwi5oiQ6YO95biCXCIsXG5cdCAgICBcIjUxMDEwNFwiOiBcIumUpuaxn+WMulwiLFxuXHQgICAgXCI1MTAxMDVcIjogXCLpnZLnvorljLpcIixcblx0ICAgIFwiNTEwMTA2XCI6IFwi6YeR54mb5Yy6XCIsXG5cdCAgICBcIjUxMDEwN1wiOiBcIuatpuS+r+WMulwiLFxuXHQgICAgXCI1MTAxMDhcIjogXCLmiJDljY7ljLpcIixcblx0ICAgIFwiNTEwMTEyXCI6IFwi6b6Z5rOJ6am/5Yy6XCIsXG5cdCAgICBcIjUxMDExM1wiOiBcIumdkueZveaxn+WMulwiLFxuXHQgICAgXCI1MTAxMTRcIjogXCLmlrDpg73ljLpcIixcblx0ICAgIFwiNTEwMTE1XCI6IFwi5rip5rGf5Yy6XCIsXG5cdCAgICBcIjUxMDEyMVwiOiBcIumHkeWgguWOv1wiLFxuXHQgICAgXCI1MTAxMjJcIjogXCLlj4zmtYHljr9cIixcblx0ICAgIFwiNTEwMTI0XCI6IFwi6YOr5Y6/XCIsXG5cdCAgICBcIjUxMDEyOVwiOiBcIuWkp+mCkeWOv1wiLFxuXHQgICAgXCI1MTAxMzFcIjogXCLokrLmsZ/ljr9cIixcblx0ICAgIFwiNTEwMTMyXCI6IFwi5paw5rSl5Y6/XCIsXG5cdCAgICBcIjUxMDE4MVwiOiBcIumDveaxn+WgsOW4glwiLFxuXHQgICAgXCI1MTAxODJcIjogXCLlva3lt57luIJcIixcblx0ICAgIFwiNTEwMTgzXCI6IFwi6YKb5bSD5biCXCIsXG5cdCAgICBcIjUxMDE4NFwiOiBcIuW0h+W3nuW4glwiLFxuXHQgICAgXCI1MTAxODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwMzAwXCI6IFwi6Ieq6LSh5biCXCIsXG5cdCAgICBcIjUxMDMwMlwiOiBcIuiHqua1geS6leWMulwiLFxuXHQgICAgXCI1MTAzMDNcIjogXCLotKHkupXljLpcIixcblx0ICAgIFwiNTEwMzA0XCI6IFwi5aSn5a6J5Yy6XCIsXG5cdCAgICBcIjUxMDMxMVwiOiBcIuayv+a7qeWMulwiLFxuXHQgICAgXCI1MTAzMjFcIjogXCLojaPljr9cIixcblx0ICAgIFwiNTEwMzIyXCI6IFwi5a+M6aG65Y6/XCIsXG5cdCAgICBcIjUxMDMyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTA0MDBcIjogXCLmlIDmnp3oirHluIJcIixcblx0ICAgIFwiNTEwNDAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjUxMDQwM1wiOiBcIuilv+WMulwiLFxuXHQgICAgXCI1MTA0MTFcIjogXCLku4HlkozljLpcIixcblx0ICAgIFwiNTEwNDIxXCI6IFwi57Gz5piT5Y6/XCIsXG5cdCAgICBcIjUxMDQyMlwiOiBcIuebkOi+ueWOv1wiLFxuXHQgICAgXCI1MTA0MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwNTAwXCI6IFwi5rO45bee5biCXCIsXG5cdCAgICBcIjUxMDUwMlwiOiBcIuaxn+mYs+WMulwiLFxuXHQgICAgXCI1MTA1MDNcIjogXCLnurPmuqrljLpcIixcblx0ICAgIFwiNTEwNTA0XCI6IFwi6b6Z6ams5r2t5Yy6XCIsXG5cdCAgICBcIjUxMDUyMVwiOiBcIuazuOWOv1wiLFxuXHQgICAgXCI1MTA1MjJcIjogXCLlkIjmsZ/ljr9cIixcblx0ICAgIFwiNTEwNTI0XCI6IFwi5Y+Z5rC45Y6/XCIsXG5cdCAgICBcIjUxMDUyNVwiOiBcIuWPpOiUuuWOv1wiLFxuXHQgICAgXCI1MTA1MjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwNjAwXCI6IFwi5b636Ziz5biCXCIsXG5cdCAgICBcIjUxMDYwM1wiOiBcIuaXjOmYs+WMulwiLFxuXHQgICAgXCI1MTA2MjNcIjogXCLkuK3msZ/ljr9cIixcblx0ICAgIFwiNTEwNjI2XCI6IFwi572X5rGf5Y6/XCIsXG5cdCAgICBcIjUxMDY4MVwiOiBcIuW5v+axieW4glwiLFxuXHQgICAgXCI1MTA2ODJcIjogXCLku4DpgqHluIJcIixcblx0ICAgIFwiNTEwNjgzXCI6IFwi57u156u55biCXCIsXG5cdCAgICBcIjUxMDY4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTA3MDBcIjogXCLnu7XpmLPluIJcIixcblx0ICAgIFwiNTEwNzAzXCI6IFwi5raq5Z+O5Yy6XCIsXG5cdCAgICBcIjUxMDcwNFwiOiBcIua4uOS7meWMulwiLFxuXHQgICAgXCI1MTA3MjJcIjogXCLkuInlj7Dljr9cIixcblx0ICAgIFwiNTEwNzIzXCI6IFwi55uQ5Lqt5Y6/XCIsXG5cdCAgICBcIjUxMDcyNFwiOiBcIuWuieWOv1wiLFxuXHQgICAgXCI1MTA3MjVcIjogXCLmopPmvbzljr9cIixcblx0ICAgIFwiNTEwNzI2XCI6IFwi5YyX5bed576M5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUxMDcyN1wiOiBcIuW5s+atpuWOv1wiLFxuXHQgICAgXCI1MTA3ODFcIjogXCLmsZ/msrnluIJcIixcblx0ICAgIFwiNTEwNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMDgwMFwiOiBcIuW5v+WFg+W4glwiLFxuXHQgICAgXCI1MTA4MDJcIjogXCLliKnlt57ljLpcIixcblx0ICAgIFwiNTEwODExXCI6IFwi5pit5YyW5Yy6XCIsXG5cdCAgICBcIjUxMDgxMlwiOiBcIuacneWkqeWMulwiLFxuXHQgICAgXCI1MTA4MjFcIjogXCLml7roi43ljr9cIixcblx0ICAgIFwiNTEwODIyXCI6IFwi6Z2S5bed5Y6/XCIsXG5cdCAgICBcIjUxMDgyM1wiOiBcIuWJkemYgeWOv1wiLFxuXHQgICAgXCI1MTA4MjRcIjogXCLoi43muqrljr9cIixcblx0ICAgIFwiNTEwODI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMDkwMFwiOiBcIumBguWugeW4glwiLFxuXHQgICAgXCI1MTA5MDNcIjogXCLoiLnlsbHljLpcIixcblx0ICAgIFwiNTEwOTA0XCI6IFwi5a6J5bGF5Yy6XCIsXG5cdCAgICBcIjUxMDkyMVwiOiBcIuiTrOa6quWOv1wiLFxuXHQgICAgXCI1MTA5MjJcIjogXCLlsITmtKrljr9cIixcblx0ICAgIFwiNTEwOTIzXCI6IFwi5aSn6Iux5Y6/XCIsXG5cdCAgICBcIjUxMDkyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTEwMDBcIjogXCLlhoXmsZ/luIJcIixcblx0ICAgIFwiNTExMDAyXCI6IFwi5biC5Lit5Yy6XCIsXG5cdCAgICBcIjUxMTAxMVwiOiBcIuS4nOWFtOWMulwiLFxuXHQgICAgXCI1MTEwMjRcIjogXCLlqIHov5zljr9cIixcblx0ICAgIFwiNTExMDI1XCI6IFwi6LWE5Lit5Y6/XCIsXG5cdCAgICBcIjUxMTAyOFwiOiBcIumahuaYjOWOv1wiLFxuXHQgICAgXCI1MTEwMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTExMTAwXCI6IFwi5LmQ5bGx5biCXCIsXG5cdCAgICBcIjUxMTEwMlwiOiBcIuW4guS4reWMulwiLFxuXHQgICAgXCI1MTExMTFcIjogXCLmspnmub7ljLpcIixcblx0ICAgIFwiNTExMTEyXCI6IFwi5LqU6YCa5qGl5Yy6XCIsXG5cdCAgICBcIjUxMTExM1wiOiBcIumHkeWPo+ays+WMulwiLFxuXHQgICAgXCI1MTExMjNcIjogXCLnio3kuLrljr9cIixcblx0ICAgIFwiNTExMTI0XCI6IFwi5LqV56CU5Y6/XCIsXG5cdCAgICBcIjUxMTEyNlwiOiBcIuWkueaxn+WOv1wiLFxuXHQgICAgXCI1MTExMjlcIjogXCLmspDlt53ljr9cIixcblx0ICAgIFwiNTExMTMyXCI6IFwi5bOo6L655b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUxMTEzM1wiOiBcIumprOi+ueW9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MTExODFcIjogXCLls6jnnInlsbHluIJcIixcblx0ICAgIFwiNTExMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTMwMFwiOiBcIuWNl+WFheW4glwiLFxuXHQgICAgXCI1MTEzMDJcIjogXCLpobrluobljLpcIixcblx0ICAgIFwiNTExMzAzXCI6IFwi6auY5Z2q5Yy6XCIsXG5cdCAgICBcIjUxMTMwNFwiOiBcIuWYiemZteWMulwiLFxuXHQgICAgXCI1MTEzMjFcIjogXCLljZfpg6jljr9cIixcblx0ICAgIFwiNTExMzIyXCI6IFwi6JCl5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTMyM1wiOiBcIuiTrOWuieWOv1wiLFxuXHQgICAgXCI1MTEzMjRcIjogXCLku6rpmYfljr9cIixcblx0ICAgIFwiNTExMzI1XCI6IFwi6KW/5YWF5Y6/XCIsXG5cdCAgICBcIjUxMTM4MVwiOiBcIumYhuS4reW4glwiLFxuXHQgICAgXCI1MTEzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTExNDAwXCI6IFwi55yJ5bGx5biCXCIsXG5cdCAgICBcIjUxMTQwMlwiOiBcIuS4nOWdoeWMulwiLFxuXHQgICAgXCI1MTE0MjFcIjogXCLku4Hlr7/ljr9cIixcblx0ICAgIFwiNTExNDIyXCI6IFwi5b2t5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTQyM1wiOiBcIua0qumbheWOv1wiLFxuXHQgICAgXCI1MTE0MjRcIjogXCLkuLnmo7Hljr9cIixcblx0ICAgIFwiNTExNDI1XCI6IFwi6Z2S56We5Y6/XCIsXG5cdCAgICBcIjUxMTQyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE1MDBcIjogXCLlrpzlrr7luIJcIixcblx0ICAgIFwiNTExNTAyXCI6IFwi57+g5bGP5Yy6XCIsXG5cdCAgICBcIjUxMTUyMVwiOiBcIuWunOWuvuWOv1wiLFxuXHQgICAgXCI1MTE1MjJcIjogXCLljZfmuqrljLpcIixcblx0ICAgIFwiNTExNTIzXCI6IFwi5rGf5a6J5Y6/XCIsXG5cdCAgICBcIjUxMTUyNFwiOiBcIumVv+WugeWOv1wiLFxuXHQgICAgXCI1MTE1MjVcIjogXCLpq5jljr9cIixcblx0ICAgIFwiNTExNTI2XCI6IFwi54+Z5Y6/XCIsXG5cdCAgICBcIjUxMTUyN1wiOiBcIuetoOi/nuWOv1wiLFxuXHQgICAgXCI1MTE1MjhcIjogXCLlhbTmlofljr9cIixcblx0ICAgIFwiNTExNTI5XCI6IFwi5bGP5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTUzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE2MDBcIjogXCLlub/lronluIJcIixcblx0ICAgIFwiNTExNjAyXCI6IFwi5bm/5a6J5Yy6XCIsXG5cdCAgICBcIjUxMTYwM1wiOiBcIuWJjemUi+WMulwiLFxuXHQgICAgXCI1MTE2MjFcIjogXCLlsrPmsaDljr9cIixcblx0ICAgIFwiNTExNjIyXCI6IFwi5q2m6IOc5Y6/XCIsXG5cdCAgICBcIjUxMTYyM1wiOiBcIumCu+awtOWOv1wiLFxuXHQgICAgXCI1MTE2ODFcIjogXCLljY7ok6XluIJcIixcblx0ICAgIFwiNTExNjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTcwMFwiOiBcIui+vuW3nuW4glwiLFxuXHQgICAgXCI1MTE3MDJcIjogXCLpgJrlt53ljLpcIixcblx0ICAgIFwiNTExNzIxXCI6IFwi6L6+5bed5Yy6XCIsXG5cdCAgICBcIjUxMTcyMlwiOiBcIuWuo+axieWOv1wiLFxuXHQgICAgXCI1MTE3MjNcIjogXCLlvIDmsZ/ljr9cIixcblx0ICAgIFwiNTExNzI0XCI6IFwi5aSn56u55Y6/XCIsXG5cdCAgICBcIjUxMTcyNVwiOiBcIua4oOWOv1wiLFxuXHQgICAgXCI1MTE3ODFcIjogXCLkuIfmupDluIJcIixcblx0ICAgIFwiNTExNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTgwMFwiOiBcIumbheWuieW4glwiLFxuXHQgICAgXCI1MTE4MDJcIjogXCLpm6jln47ljLpcIixcblx0ICAgIFwiNTExODIxXCI6IFwi5ZCN5bGx5Yy6XCIsXG5cdCAgICBcIjUxMTgyMlwiOiBcIuiNpee7j+WOv1wiLFxuXHQgICAgXCI1MTE4MjNcIjogXCLmsYnmupDljr9cIixcblx0ICAgIFwiNTExODI0XCI6IFwi55+z5qOJ5Y6/XCIsXG5cdCAgICBcIjUxMTgyNVwiOiBcIuWkqeWFqOWOv1wiLFxuXHQgICAgXCI1MTE4MjZcIjogXCLoiqblsbHljr9cIixcblx0ICAgIFwiNTExODI3XCI6IFwi5a6d5YW05Y6/XCIsXG5cdCAgICBcIjUxMTgyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE5MDBcIjogXCLlt7TkuK3luIJcIixcblx0ICAgIFwiNTExOTAyXCI6IFwi5be05bee5Yy6XCIsXG5cdCAgICBcIjUxMTkwM1wiOiBcIuaBqemYs+WMulwiLFxuXHQgICAgXCI1MTE5MjFcIjogXCLpgJrmsZ/ljr9cIixcblx0ICAgIFwiNTExOTIyXCI6IFwi5Y2X5rGf5Y6/XCIsXG5cdCAgICBcIjUxMTkyM1wiOiBcIuW5s+aYjOWOv1wiLFxuXHQgICAgXCI1MTE5MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEyMDAwXCI6IFwi6LWE6Ziz5biCXCIsXG5cdCAgICBcIjUxMjAwMlwiOiBcIumbgeaxn+WMulwiLFxuXHQgICAgXCI1MTIwMjFcIjogXCLlronlsrPljr9cIixcblx0ICAgIFwiNTEyMDIyXCI6IFwi5LmQ6Iez5Y6/XCIsXG5cdCAgICBcIjUxMjA4MVwiOiBcIueugOmYs+W4glwiLFxuXHQgICAgXCI1MTIwODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEzMjAwXCI6IFwi6Zi/5Z2d6JeP5peP576M5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUxMzIyMVwiOiBcIuaxtuW3neWOv1wiLFxuXHQgICAgXCI1MTMyMjJcIjogXCLnkIbljr9cIixcblx0ICAgIFwiNTEzMjIzXCI6IFwi6IyC5Y6/XCIsXG5cdCAgICBcIjUxMzIyNFwiOiBcIuadvua9mOWOv1wiLFxuXHQgICAgXCI1MTMyMjVcIjogXCLkuZ3lr6jmsp/ljr9cIixcblx0ICAgIFwiNTEzMjI2XCI6IFwi6YeR5bed5Y6/XCIsXG5cdCAgICBcIjUxMzIyN1wiOiBcIuWwj+mHkeWOv1wiLFxuXHQgICAgXCI1MTMyMjhcIjogXCLpu5HmsLTljr9cIixcblx0ICAgIFwiNTEzMjI5XCI6IFwi6ams5bCU5bq35Y6/XCIsXG5cdCAgICBcIjUxMzIzMFwiOiBcIuWjpOWhmOWOv1wiLFxuXHQgICAgXCI1MTMyMzFcIjogXCLpmL/lnZ3ljr9cIixcblx0ICAgIFwiNTEzMjMyXCI6IFwi6Iul5bCU55uW5Y6/XCIsXG5cdCAgICBcIjUxMzIzM1wiOiBcIue6ouWOn+WOv1wiLFxuXHQgICAgXCI1MTMyMzRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEzMzAwXCI6IFwi55SY5a2c6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUxMzMyMVwiOiBcIuW6t+WumuWOv1wiLFxuXHQgICAgXCI1MTMzMjJcIjogXCLms7jlrprljr9cIixcblx0ICAgIFwiNTEzMzIzXCI6IFwi5Li55be05Y6/XCIsXG5cdCAgICBcIjUxMzMyNFwiOiBcIuS5nem+meWOv1wiLFxuXHQgICAgXCI1MTMzMjVcIjogXCLpm4XmsZ/ljr9cIixcblx0ICAgIFwiNTEzMzI2XCI6IFwi6YGT5a2a5Y6/XCIsXG5cdCAgICBcIjUxMzMyN1wiOiBcIueCiemcjeWOv1wiLFxuXHQgICAgXCI1MTMzMjhcIjogXCLnlJjlrZzljr9cIixcblx0ICAgIFwiNTEzMzI5XCI6IFwi5paw6b6Z5Y6/XCIsXG5cdCAgICBcIjUxMzMzMFwiOiBcIuW+t+agvOWOv1wiLFxuXHQgICAgXCI1MTMzMzFcIjogXCLnmb3njonljr9cIixcblx0ICAgIFwiNTEzMzMyXCI6IFwi55+z5rig5Y6/XCIsXG5cdCAgICBcIjUxMzMzM1wiOiBcIuiJsui+vuWOv1wiLFxuXHQgICAgXCI1MTMzMzRcIjogXCLnkIbloZjljr9cIixcblx0ICAgIFwiNTEzMzM1XCI6IFwi5be05aGY5Y6/XCIsXG5cdCAgICBcIjUxMzMzNlwiOiBcIuS5oeWfjuWOv1wiLFxuXHQgICAgXCI1MTMzMzdcIjogXCLnqLvln47ljr9cIixcblx0ICAgIFwiNTEzMzM4XCI6IFwi5b6X6I2j5Y6/XCIsXG5cdCAgICBcIjUxMzMzOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTM0MDBcIjogXCLlh4nlsbHlvZ3ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNTEzNDAxXCI6IFwi6KW/5piM5biCXCIsXG5cdCAgICBcIjUxMzQyMlwiOiBcIuacqOmHjOiXj+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MTM0MjNcIjogXCLnm5DmupDljr9cIixcblx0ICAgIFwiNTEzNDI0XCI6IFwi5b635piM5Y6/XCIsXG5cdCAgICBcIjUxMzQyNVwiOiBcIuS8mueQhuWOv1wiLFxuXHQgICAgXCI1MTM0MjZcIjogXCLkvJrkuJzljr9cIixcblx0ICAgIFwiNTEzNDI3XCI6IFwi5a6B5Y2X5Y6/XCIsXG5cdCAgICBcIjUxMzQyOFwiOiBcIuaZruagvOWOv1wiLFxuXHQgICAgXCI1MTM0MjlcIjogXCLluIPmi5bljr9cIixcblx0ICAgIFwiNTEzNDMwXCI6IFwi6YeR6Ziz5Y6/XCIsXG5cdCAgICBcIjUxMzQzMVwiOiBcIuaYreinieWOv1wiLFxuXHQgICAgXCI1MTM0MzJcIjogXCLllpzlvrfljr9cIixcblx0ICAgIFwiNTEzNDMzXCI6IFwi5YaV5a6B5Y6/XCIsXG5cdCAgICBcIjUxMzQzNFwiOiBcIui2iuilv+WOv1wiLFxuXHQgICAgXCI1MTM0MzVcIjogXCLnlJjmtJvljr9cIixcblx0ICAgIFwiNTEzNDM2XCI6IFwi576O5aeR5Y6/XCIsXG5cdCAgICBcIjUxMzQzN1wiOiBcIumbt+azouWOv1wiLFxuXHQgICAgXCI1MTM0MzhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIwMDAwXCI6IFwi6LS15bee55yBXCIsXG5cdCAgICBcIjUyMDEwMFwiOiBcIui0temYs+W4glwiLFxuXHQgICAgXCI1MjAxMDJcIjogXCLljZfmmI7ljLpcIixcblx0ICAgIFwiNTIwMTAzXCI6IFwi5LqR5bKp5Yy6XCIsXG5cdCAgICBcIjUyMDExMVwiOiBcIuiKsea6quWMulwiLFxuXHQgICAgXCI1MjAxMTJcIjogXCLkuYzlvZPljLpcIixcblx0ICAgIFwiNTIwMTEzXCI6IFwi55m95LqR5Yy6XCIsXG5cdCAgICBcIjUyMDEyMVwiOiBcIuW8gOmYs+WOv1wiLFxuXHQgICAgXCI1MjAxMjJcIjogXCLmga/ng73ljr9cIixcblx0ICAgIFwiNTIwMTIzXCI6IFwi5L+u5paH5Y6/XCIsXG5cdCAgICBcIjUyMDE1MVwiOiBcIuinguWxsea5luWMulwiLFxuXHQgICAgXCI1MjAxODFcIjogXCLmuIXplYfluIJcIixcblx0ICAgIFwiNTIwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMDIwMFwiOiBcIuWFreebmOawtOW4glwiLFxuXHQgICAgXCI1MjAyMDFcIjogXCLpkp/lsbHljLpcIixcblx0ICAgIFwiNTIwMjAzXCI6IFwi5YWt5p6d54m55Yy6XCIsXG5cdCAgICBcIjUyMDIyMVwiOiBcIuawtOWfjuWOv1wiLFxuXHQgICAgXCI1MjAyMjJcIjogXCLnm5jljr9cIixcblx0ICAgIFwiNTIwMjIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMDMwMFwiOiBcIumBteS5ieW4glwiLFxuXHQgICAgXCI1MjAzMDJcIjogXCLnuqLoirHlspfljLpcIixcblx0ICAgIFwiNTIwMzAzXCI6IFwi5rGH5bed5Yy6XCIsXG5cdCAgICBcIjUyMDMyMVwiOiBcIumBteS5ieWOv1wiLFxuXHQgICAgXCI1MjAzMjJcIjogXCLmoZDmopPljr9cIixcblx0ICAgIFwiNTIwMzIzXCI6IFwi57ul6Ziz5Y6/XCIsXG5cdCAgICBcIjUyMDMyNFwiOiBcIuato+WuieWOv1wiLFxuXHQgICAgXCI1MjAzMjVcIjogXCLpgZPnnJ/ku6Hkvazml4/oi5fml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTIwMzI2XCI6IFwi5Yqh5bed5Luh5L2s5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMDMyN1wiOiBcIuWHpOWGiOWOv1wiLFxuXHQgICAgXCI1MjAzMjhcIjogXCLmuYTmva3ljr9cIixcblx0ICAgIFwiNTIwMzI5XCI6IFwi5L2Z5bqG5Y6/XCIsXG5cdCAgICBcIjUyMDMzMFwiOiBcIuS5oOawtOWOv1wiLFxuXHQgICAgXCI1MjAzODFcIjogXCLotaTmsLTluIJcIixcblx0ICAgIFwiNTIwMzgyXCI6IFwi5LuB5oCA5biCXCIsXG5cdCAgICBcIjUyMDM4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MjA0MDBcIjogXCLlronpobrluIJcIixcblx0ICAgIFwiNTIwNDAyXCI6IFwi6KW/56eA5Yy6XCIsXG5cdCAgICBcIjUyMDQyMVwiOiBcIuW5s+WdneWOv1wiLFxuXHQgICAgXCI1MjA0MjJcIjogXCLmma7lrprljr9cIixcblx0ICAgIFwiNTIwNDIzXCI6IFwi6ZWH5a6B5biD5L6d5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMDQyNFwiOiBcIuWFs+WyreW4g+S+neaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjA0MjVcIjogXCLntKvkupHoi5fml4/luIPkvp3ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTIwNDI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMjIwMFwiOiBcIumTnOS7geW4glwiLFxuXHQgICAgXCI1MjIyMDFcIjogXCLnoqfmsZ/ljLpcIixcblx0ICAgIFwiNTIyMjIyXCI6IFwi5rGf5Y+j5Y6/XCIsXG5cdCAgICBcIjUyMjIyM1wiOiBcIueOieWxj+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMjRcIjogXCLnn7PpmKHljr9cIixcblx0ICAgIFwiNTIyMjI1XCI6IFwi5oCd5Y2X5Y6/XCIsXG5cdCAgICBcIjUyMjIyNlwiOiBcIuWNsOaxn+Wcn+WutuaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMjdcIjogXCLlvrfmsZ/ljr9cIixcblx0ICAgIFwiNTIyMjI4XCI6IFwi5rK/5rKz5Zyf5a625peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjIyOVwiOiBcIuadvuahg+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMzBcIjogXCLkuIflsbHljLpcIixcblx0ICAgIFwiNTIyMjMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMjMwMFwiOiBcIum7lOilv+WNl+W4g+S+neaXj+iLl+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI1MjIzMDFcIjogXCLlhbTkuYnluIJcIixcblx0ICAgIFwiNTIyMzIyXCI6IFwi5YW05LuB5Y6/XCIsXG5cdCAgICBcIjUyMjMyM1wiOiBcIuaZruWuieWOv1wiLFxuXHQgICAgXCI1MjIzMjRcIjogXCLmmbTpmobljr9cIixcblx0ICAgIFwiNTIyMzI1XCI6IFwi6LSe5Liw5Y6/XCIsXG5cdCAgICBcIjUyMjMyNlwiOiBcIuacm+iwn+WOv1wiLFxuXHQgICAgXCI1MjIzMjdcIjogXCLlhozkuqjljr9cIixcblx0ICAgIFwiNTIyMzI4XCI6IFwi5a6J6b6Z5Y6/XCIsXG5cdCAgICBcIjUyMjMyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MjI0MDBcIjogXCLmr5XoioLluIJcIixcblx0ICAgIFwiNTIyNDAxXCI6IFwi5LiD5pif5YWz5Yy6XCIsXG5cdCAgICBcIjUyMjQyMlwiOiBcIuWkp+aWueWOv1wiLFxuXHQgICAgXCI1MjI0MjNcIjogXCLpu5Topb/ljr9cIixcblx0ICAgIFwiNTIyNDI0XCI6IFwi6YeR5rKZ5Y6/XCIsXG5cdCAgICBcIjUyMjQyNVwiOiBcIue7h+mHkeWOv1wiLFxuXHQgICAgXCI1MjI0MjZcIjogXCLnurPpm43ljr9cIixcblx0ICAgIFwiNTIyNDI3XCI6IFwi5aiB5a6B5b2d5peP5Zue5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjQyOFwiOiBcIui1q+eroOWOv1wiLFxuXHQgICAgXCI1MjI0MjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIyNjAwXCI6IFwi6buU5Lic5Y2X6IuX5peP5L6X5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUyMjYwMVwiOiBcIuWHr+mHjOW4glwiLFxuXHQgICAgXCI1MjI2MjJcIjogXCLpu4TlubPljr9cIixcblx0ICAgIFwiNTIyNjIzXCI6IFwi5pa956eJ5Y6/XCIsXG5cdCAgICBcIjUyMjYyNFwiOiBcIuS4ieepl+WOv1wiLFxuXHQgICAgXCI1MjI2MjVcIjogXCLplYfov5zljr9cIixcblx0ICAgIFwiNTIyNjI2XCI6IFwi5bKR5bep5Y6/XCIsXG5cdCAgICBcIjUyMjYyN1wiOiBcIuWkqeafseWOv1wiLFxuXHQgICAgXCI1MjI2MjhcIjogXCLplKblsY/ljr9cIixcblx0ICAgIFwiNTIyNjI5XCI6IFwi5YmR5rKz5Y6/XCIsXG5cdCAgICBcIjUyMjYzMFwiOiBcIuWPsOaxn+WOv1wiLFxuXHQgICAgXCI1MjI2MzFcIjogXCLpu47lubPljr9cIixcblx0ICAgIFwiNTIyNjMyXCI6IFwi5qaV5rGf5Y6/XCIsXG5cdCAgICBcIjUyMjYzM1wiOiBcIuS7juaxn+WOv1wiLFxuXHQgICAgXCI1MjI2MzRcIjogXCLpm7flsbHljr9cIixcblx0ICAgIFwiNTIyNjM1XCI6IFwi6bq75rGf5Y6/XCIsXG5cdCAgICBcIjUyMjYzNlwiOiBcIuS4ueWvqOWOv1wiLFxuXHQgICAgXCI1MjI2MzdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIyNzAwXCI6IFwi6buU5Y2X5biD5L6d5peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUyMjcwMVwiOiBcIumDveWMgOW4glwiLFxuXHQgICAgXCI1MjI3MDJcIjogXCLnpo/ms4nluIJcIixcblx0ICAgIFwiNTIyNzIyXCI6IFwi6I2U5rOi5Y6/XCIsXG5cdCAgICBcIjUyMjcyM1wiOiBcIui0teWumuWOv1wiLFxuXHQgICAgXCI1MjI3MjVcIjogXCLnk67lronljr9cIixcblx0ICAgIFwiNTIyNzI2XCI6IFwi54us5bGx5Y6/XCIsXG5cdCAgICBcIjUyMjcyN1wiOiBcIuW5s+WhmOWOv1wiLFxuXHQgICAgXCI1MjI3MjhcIjogXCLnvZfnlLjljr9cIixcblx0ICAgIFwiNTIyNzI5XCI6IFwi6ZW/6aG65Y6/XCIsXG5cdCAgICBcIjUyMjczMFwiOiBcIum+memHjOWOv1wiLFxuXHQgICAgXCI1MjI3MzFcIjogXCLmg6DmsLTljr9cIixcblx0ICAgIFwiNTIyNzMyXCI6IFwi5LiJ6YO95rC05peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjczM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzAwMDBcIjogXCLkupHljZfnnIFcIixcblx0ICAgIFwiNTMwMTAwXCI6IFwi5piG5piO5biCXCIsXG5cdCAgICBcIjUzMDEwMlwiOiBcIuS6lOWNjuWMulwiLFxuXHQgICAgXCI1MzAxMDNcIjogXCLnm5jpvpnljLpcIixcblx0ICAgIFwiNTMwMTExXCI6IFwi5a6Y5rih5Yy6XCIsXG5cdCAgICBcIjUzMDExMlwiOiBcIuilv+WxseWMulwiLFxuXHQgICAgXCI1MzAxMTNcIjogXCLkuJzlt53ljLpcIixcblx0ICAgIFwiNTMwMTIxXCI6IFwi5ZGI6LSh5Yy6XCIsXG5cdCAgICBcIjUzMDEyMlwiOiBcIuaZi+WugeWOv1wiLFxuXHQgICAgXCI1MzAxMjRcIjogXCLlr4zmsJHljr9cIixcblx0ICAgIFwiNTMwMTI1XCI6IFwi5a6c6Imv5Y6/XCIsXG5cdCAgICBcIjUzMDEyNlwiOiBcIuefs+ael+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzAxMjdcIjogXCLltanmmI7ljr9cIixcblx0ICAgIFwiNTMwMTI4XCI6IFwi56aE5Yqd5b2d5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDEyOVwiOiBcIuWvu+eUuOWbnuaXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzAxODFcIjogXCLlronlroHluIJcIixcblx0ICAgIFwiNTMwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMDMwMFwiOiBcIuabsumdluW4glwiLFxuXHQgICAgXCI1MzAzMDJcIjogXCLpupLpup/ljLpcIixcblx0ICAgIFwiNTMwMzIxXCI6IFwi6ams6b6Z5Y6/XCIsXG5cdCAgICBcIjUzMDMyMlwiOiBcIumZhuiJr+WOv1wiLFxuXHQgICAgXCI1MzAzMjNcIjogXCLluIjlrpfljr9cIixcblx0ICAgIFwiNTMwMzI0XCI6IFwi572X5bmz5Y6/XCIsXG5cdCAgICBcIjUzMDMyNVwiOiBcIuWvjOa6kOWOv1wiLFxuXHQgICAgXCI1MzAzMjZcIjogXCLkvJrms73ljr9cIixcblx0ICAgIFwiNTMwMzI4XCI6IFwi5rK+55uK5Y6/XCIsXG5cdCAgICBcIjUzMDM4MVwiOiBcIuWuo+WogeW4glwiLFxuXHQgICAgXCI1MzAzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMwNDAwXCI6IFwi546J5rqq5biCXCIsXG5cdCAgICBcIjUzMDQwMlwiOiBcIue6ouWhlOWMulwiLFxuXHQgICAgXCI1MzA0MjFcIjogXCLmsZ/lt53ljr9cIixcblx0ICAgIFwiNTMwNDIyXCI6IFwi5r6E5rGf5Y6/XCIsXG5cdCAgICBcIjUzMDQyM1wiOiBcIumAmua1t+WOv1wiLFxuXHQgICAgXCI1MzA0MjRcIjogXCLljY7lroHljr9cIixcblx0ICAgIFwiNTMwNDI1XCI6IFwi5piT6Zeo5Y6/XCIsXG5cdCAgICBcIjUzMDQyNlwiOiBcIuWzqOWxseW9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA0MjdcIjogXCLmlrDlubPlvZ3ml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwNDI4XCI6IFwi5YWD5rGf5ZOI5bC85peP5b2d5peP5YKj5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDQyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA1MDBcIjogXCLkv53lsbHluIJcIixcblx0ICAgIFwiNTMwNTAyXCI6IFwi6ZqG6Ziz5Yy6XCIsXG5cdCAgICBcIjUzMDUyMVwiOiBcIuaWveeUuOWOv1wiLFxuXHQgICAgXCI1MzA1MjJcIjogXCLohb7lhrLljr9cIixcblx0ICAgIFwiNTMwNTIzXCI6IFwi6b6Z6Zm15Y6/XCIsXG5cdCAgICBcIjUzMDUyNFwiOiBcIuaYjOWugeWOv1wiLFxuXHQgICAgXCI1MzA1MjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMwNjAwXCI6IFwi5pit6YCa5biCXCIsXG5cdCAgICBcIjUzMDYwMlwiOiBcIuaYremYs+WMulwiLFxuXHQgICAgXCI1MzA2MjFcIjogXCLpsoHnlLjljr9cIixcblx0ICAgIFwiNTMwNjIyXCI6IFwi5ben5a625Y6/XCIsXG5cdCAgICBcIjUzMDYyM1wiOiBcIuebkOa0peWOv1wiLFxuXHQgICAgXCI1MzA2MjRcIjogXCLlpKflhbPljr9cIixcblx0ICAgIFwiNTMwNjI1XCI6IFwi5rC45ZaE5Y6/XCIsXG5cdCAgICBcIjUzMDYyNlwiOiBcIue7peaxn+WOv1wiLFxuXHQgICAgXCI1MzA2MjdcIjogXCLplYfpm4Tljr9cIixcblx0ICAgIFwiNTMwNjI4XCI6IFwi5b2d6Imv5Y6/XCIsXG5cdCAgICBcIjUzMDYyOVwiOiBcIuWogeS/oeWOv1wiLFxuXHQgICAgXCI1MzA2MzBcIjogXCLmsLTlr4zljr9cIixcblx0ICAgIFwiNTMwNjMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMDcwMFwiOiBcIuS4veaxn+W4glwiLFxuXHQgICAgXCI1MzA3MDJcIjogXCLlj6Tln47ljLpcIixcblx0ICAgIFwiNTMwNzIxXCI6IFwi546J6b6Z57qz6KW/5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDcyMlwiOiBcIuawuOiDnOWOv1wiLFxuXHQgICAgXCI1MzA3MjNcIjogXCLljY7lnarljr9cIixcblx0ICAgIFwiNTMwNzI0XCI6IFwi5a6B6JKX5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDcyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA4MDBcIjogXCLmma7mtLHluIJcIixcblx0ICAgIFwiNTMwODAyXCI6IFwi5oCd6IyF5Yy6XCIsXG5cdCAgICBcIjUzMDgyMVwiOiBcIuWugea0seWTiOWwvOaXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjJcIjogXCLloqjmsZ/lk4jlsLzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODIzXCI6IFwi5pmv5Lic5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgyNFwiOiBcIuaZr+iwt+WCo+aXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjVcIjogXCLplYfmsoXlvZ3ml4/lk4jlsLzml4/mi4nnpZzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODI2XCI6IFwi5rGf5Z+O5ZOI5bC85peP5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgyN1wiOiBcIuWtn+i/nuWCo+aXj+aLieelnOaXj+S9pOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjhcIjogXCLmvpzmsqfmi4nnpZzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODI5XCI6IFwi6KW/55uf5L2k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA5MDBcIjogXCLkuLTmsqfluIJcIixcblx0ICAgIFwiNTMwOTAyXCI6IFwi5Li057+U5Yy6XCIsXG5cdCAgICBcIjUzMDkyMVwiOiBcIuWHpOW6huWOv1wiLFxuXHQgICAgXCI1MzA5MjJcIjogXCLkupHljr9cIixcblx0ICAgIFwiNTMwOTIzXCI6IFwi5rC45b635Y6/XCIsXG5cdCAgICBcIjUzMDkyNFwiOiBcIumVh+W6t+WOv1wiLFxuXHQgICAgXCI1MzA5MjVcIjogXCLlj4zmsZ/mi4nnpZzml4/kvaTml4/luIPmnJfml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwOTI2XCI6IFwi6IC/6ams5YKj5peP5L2k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDkyN1wiOiBcIuayp+a6kOS9pOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA5MjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyMzAwXCI6IFwi5qWa6ZuE5b2d5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjMwMVwiOiBcIualmumbhOW4glwiLFxuXHQgICAgXCI1MzIzMjJcIjogXCLlj4zmn4/ljr9cIixcblx0ICAgIFwiNTMyMzIzXCI6IFwi54mf5a6a5Y6/XCIsXG5cdCAgICBcIjUzMjMyNFwiOiBcIuWNl+WNjuWOv1wiLFxuXHQgICAgXCI1MzIzMjVcIjogXCLlp5rlronljr9cIixcblx0ICAgIFwiNTMyMzI2XCI6IFwi5aSn5aea5Y6/XCIsXG5cdCAgICBcIjUzMjMyN1wiOiBcIuawuOS7geWOv1wiLFxuXHQgICAgXCI1MzIzMjhcIjogXCLlhYPosIvljr9cIixcblx0ICAgIFwiNTMyMzI5XCI6IFwi5q2m5a6a5Y6/XCIsXG5cdCAgICBcIjUzMjMzMVwiOiBcIuemhOS4sOWOv1wiLFxuXHQgICAgXCI1MzIzMzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyNTAwXCI6IFwi57qi5rKz5ZOI5bC85peP5b2d5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjUwMVwiOiBcIuS4quaXp+W4glwiLFxuXHQgICAgXCI1MzI1MDJcIjogXCLlvIDov5zluIJcIixcblx0ICAgIFwiNTMyNTIyXCI6IFwi6JKZ6Ieq5biCXCIsXG5cdCAgICBcIjUzMjUyM1wiOiBcIuWxj+i+ueiLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI1MjRcIjogXCLlu7rmsLTljr9cIixcblx0ICAgIFwiNTMyNTI1XCI6IFwi55+z5bGP5Y6/XCIsXG5cdCAgICBcIjUzMjUyNlwiOiBcIuW8peWLkuW4glwiLFxuXHQgICAgXCI1MzI1MjdcIjogXCLms7jopb/ljr9cIixcblx0ICAgIFwiNTMyNTI4XCI6IFwi5YWD6Ziz5Y6/XCIsXG5cdCAgICBcIjUzMjUyOVwiOiBcIue6ouays+WOv1wiLFxuXHQgICAgXCI1MzI1MzBcIjogXCLph5HlubPoi5fml4/nkbbml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMyNTMxXCI6IFwi57u/5pil5Y6/XCIsXG5cdCAgICBcIjUzMjUzMlwiOiBcIuays+WPo+eRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI1MzNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyNjAwXCI6IFwi5paH5bGx5aOu5peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjYyMVwiOiBcIuaWh+WxseW4glwiLFxuXHQgICAgXCI1MzI2MjJcIjogXCLnoJrlsbHljr9cIixcblx0ICAgIFwiNTMyNjIzXCI6IFwi6KW/55W05Y6/XCIsXG5cdCAgICBcIjUzMjYyNFwiOiBcIum6u+agl+WdoeWOv1wiLFxuXHQgICAgXCI1MzI2MjVcIjogXCLpqazlhbPljr9cIixcblx0ICAgIFwiNTMyNjI2XCI6IFwi5LiY5YyX5Y6/XCIsXG5cdCAgICBcIjUzMjYyN1wiOiBcIuW5v+WNl+WOv1wiLFxuXHQgICAgXCI1MzI2MjhcIjogXCLlr4zlroHljr9cIixcblx0ICAgIFwiNTMyNjI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMjgwMFwiOiBcIuilv+WPjOeJiOe6s+WCo+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI1MzI4MDFcIjogXCLmma/mtKrluIJcIixcblx0ICAgIFwiNTMyODIyXCI6IFwi5YuQ5rW35Y6/XCIsXG5cdCAgICBcIjUzMjgyM1wiOiBcIuWLkOiFiuWOv1wiLFxuXHQgICAgXCI1MzI4MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyOTAwXCI6IFwi5aSn55CG55m95peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjkwMVwiOiBcIuWkp+eQhuW4glwiLFxuXHQgICAgXCI1MzI5MjJcIjogXCLmvL7mv57lvZ3ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMyOTIzXCI6IFwi56Wl5LqR5Y6/XCIsXG5cdCAgICBcIjUzMjkyNFwiOiBcIuWuvuW3neWOv1wiLFxuXHQgICAgXCI1MzI5MjVcIjogXCLlvKXmuKHljr9cIixcblx0ICAgIFwiNTMyOTI2XCI6IFwi5Y2X5ran5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMjkyN1wiOiBcIuW3jeWxseW9neaXj+WbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI5MjhcIjogXCLmsLjlubPljr9cIixcblx0ICAgIFwiNTMyOTI5XCI6IFwi5LqR6b6Z5Y6/XCIsXG5cdCAgICBcIjUzMjkzMFwiOiBcIua0sea6kOWOv1wiLFxuXHQgICAgXCI1MzI5MzFcIjogXCLliZHlt53ljr9cIixcblx0ICAgIFwiNTMyOTMyXCI6IFwi6bmk5bqG5Y6/XCIsXG5cdCAgICBcIjUzMjkzM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzMxMDBcIjogXCLlvrflro/lgqPml4/mma/poofml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNTMzMTAyXCI6IFwi55Ge5Li95biCXCIsXG5cdCAgICBcIjUzMzEwM1wiOiBcIuiKkuW4glwiLFxuXHQgICAgXCI1MzMxMjJcIjogXCLmooHmsrPljr9cIixcblx0ICAgIFwiNTMzMTIzXCI6IFwi55uI5rGf5Y6/XCIsXG5cdCAgICBcIjUzMzEyNFwiOiBcIumZh+W3neWOv1wiLFxuXHQgICAgXCI1MzMxMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMzMzAwXCI6IFwi5oCS5rGf5YKI5YOz5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMzMyMVwiOiBcIuazuOawtOWOv1wiLFxuXHQgICAgXCI1MzMzMjNcIjogXCLnpo/otKHljr9cIixcblx0ICAgIFwiNTMzMzI0XCI6IFwi6LSh5bGx54us6b6Z5peP5oCS5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMzMyNVwiOiBcIuWFsOWdqueZveaXj+aZruexs+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzMzMjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMzNDAwXCI6IFwi6L+q5bqG6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMzQyMVwiOiBcIummmeagvOmHjOaLieWOv1wiLFxuXHQgICAgXCI1MzM0MjJcIjogXCLlvrfpkqbljr9cIixcblx0ICAgIFwiNTMzNDIzXCI6IFwi57u06KW/5YKI5YOz5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMzQyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1NDAwMDBcIjogXCLopb/ol4/oh6rmsrvljLpcIixcblx0ICAgIFwiNTQwMTAwXCI6IFwi5ouJ6JCo5biCXCIsXG5cdCAgICBcIjU0MDEwMlwiOiBcIuWfjuWFs+WMulwiLFxuXHQgICAgXCI1NDAxMjFcIjogXCLmnpflkajljr9cIixcblx0ICAgIFwiNTQwMTIyXCI6IFwi5b2T6ZuE5Y6/XCIsXG5cdCAgICBcIjU0MDEyM1wiOiBcIuWwvOacqOWOv1wiLFxuXHQgICAgXCI1NDAxMjRcIjogXCLmm7LmsLTljr9cIixcblx0ICAgIFwiNTQwMTI1XCI6IFwi5aCG6b6Z5b635bqG5Y6/XCIsXG5cdCAgICBcIjU0MDEyNlwiOiBcIui+vuWtnOWOv1wiLFxuXHQgICAgXCI1NDAxMjdcIjogXCLloqjnq7nlt6XljaHljr9cIixcblx0ICAgIFwiNTQwMTI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjEwMFwiOiBcIuaYjOmDveWcsOWMulwiLFxuXHQgICAgXCI1NDIxMjFcIjogXCLmmIzpg73ljr9cIixcblx0ICAgIFwiNTQyMTIyXCI6IFwi5rGf6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjEyM1wiOiBcIui0oeinieWOv1wiLFxuXHQgICAgXCI1NDIxMjRcIjogXCLnsbvkuYzpvZDljr9cIixcblx0ICAgIFwiNTQyMTI1XCI6IFwi5LiB6Z2S5Y6/XCIsXG5cdCAgICBcIjU0MjEyNlwiOiBcIuWvn+mbheWOv1wiLFxuXHQgICAgXCI1NDIxMjdcIjogXCLlhavlrr/ljr9cIixcblx0ICAgIFwiNTQyMTI4XCI6IFwi5bem6LSh5Y6/XCIsXG5cdCAgICBcIjU0MjEyOVwiOiBcIuiKkuW6t+WOv1wiLFxuXHQgICAgXCI1NDIxMzJcIjogXCLmtJvpmobljr9cIixcblx0ICAgIFwiNTQyMTMzXCI6IFwi6L655Z2d5Y6/XCIsXG5cdCAgICBcIjU0MjEzNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1NDIyMDBcIjogXCLlsbHljZflnLDljLpcIixcblx0ICAgIFwiNTQyMjIxXCI6IFwi5LmD5Lic5Y6/XCIsXG5cdCAgICBcIjU0MjIyMlwiOiBcIuaJjuWbiuWOv1wiLFxuXHQgICAgXCI1NDIyMjNcIjogXCLotKHlmI7ljr9cIixcblx0ICAgIFwiNTQyMjI0XCI6IFwi5qGR5pel5Y6/XCIsXG5cdCAgICBcIjU0MjIyNVwiOiBcIueQvOe7k+WOv1wiLFxuXHQgICAgXCI1NDIyMjZcIjogXCLmm7Lmnb7ljr9cIixcblx0ICAgIFwiNTQyMjI3XCI6IFwi5o6q576O5Y6/XCIsXG5cdCAgICBcIjU0MjIyOFwiOiBcIua0m+aJjuWOv1wiLFxuXHQgICAgXCI1NDIyMjlcIjogXCLliqDmn6Xljr9cIixcblx0ICAgIFwiNTQyMjMxXCI6IFwi6ZqG5a2Q5Y6/XCIsXG5cdCAgICBcIjU0MjIzMlwiOiBcIumUmemCo+WOv1wiLFxuXHQgICAgXCI1NDIyMzNcIjogXCLmtarljaHlrZDljr9cIixcblx0ICAgIFwiNTQyMjM0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjMwMFwiOiBcIuaXpeWWgOWImeWcsOWMulwiLFxuXHQgICAgXCI1NDIzMDFcIjogXCLml6XlloDliJnluIJcIixcblx0ICAgIFwiNTQyMzIyXCI6IFwi5Y2X5pyo5p6X5Y6/XCIsXG5cdCAgICBcIjU0MjMyM1wiOiBcIuaxn+WtnOWOv1wiLFxuXHQgICAgXCI1NDIzMjRcIjogXCLlrprml6Xljr9cIixcblx0ICAgIFwiNTQyMzI1XCI6IFwi6JCo6L+m5Y6/XCIsXG5cdCAgICBcIjU0MjMyNlwiOiBcIuaLieWtnOWOv1wiLFxuXHQgICAgXCI1NDIzMjdcIjogXCLmmILku4Hljr9cIixcblx0ICAgIFwiNTQyMzI4XCI6IFwi6LCi6YCa6Zeo5Y6/XCIsXG5cdCAgICBcIjU0MjMyOVwiOiBcIueZveacl+WOv1wiLFxuXHQgICAgXCI1NDIzMzBcIjogXCLku4HluIPljr9cIixcblx0ICAgIFwiNTQyMzMxXCI6IFwi5bq36ams5Y6/XCIsXG5cdCAgICBcIjU0MjMzMlwiOiBcIuWumue7k+WOv1wiLFxuXHQgICAgXCI1NDIzMzNcIjogXCLku7Llt7Tljr9cIixcblx0ICAgIFwiNTQyMzM0XCI6IFwi5Lqa5Lic5Y6/XCIsXG5cdCAgICBcIjU0MjMzNVwiOiBcIuWQiemahuWOv1wiLFxuXHQgICAgXCI1NDIzMzZcIjogXCLogYLmi4nmnKjljr9cIixcblx0ICAgIFwiNTQyMzM3XCI6IFwi6JCo5ZiO5Y6/XCIsXG5cdCAgICBcIjU0MjMzOFwiOiBcIuWyl+W3tOWOv1wiLFxuXHQgICAgXCI1NDIzMzlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTQyNDAwXCI6IFwi6YKj5puy5Zyw5Yy6XCIsXG5cdCAgICBcIjU0MjQyMVwiOiBcIumCo+absuWOv1wiLFxuXHQgICAgXCI1NDI0MjJcIjogXCLlmInpu47ljr9cIixcblx0ICAgIFwiNTQyNDIzXCI6IFwi5q+U5aaC5Y6/XCIsXG5cdCAgICBcIjU0MjQyNFwiOiBcIuiBguiNo+WOv1wiLFxuXHQgICAgXCI1NDI0MjVcIjogXCLlronlpJrljr9cIixcblx0ICAgIFwiNTQyNDI2XCI6IFwi55Sz5omO5Y6/XCIsXG5cdCAgICBcIjU0MjQyN1wiOiBcIue0ouWOv1wiLFxuXHQgICAgXCI1NDI0MjhcIjogXCLnj63miIjljr9cIixcblx0ICAgIFwiNTQyNDI5XCI6IFwi5be06Z2S5Y6/XCIsXG5cdCAgICBcIjU0MjQzMFwiOiBcIuWwvOeOm+WOv1wiLFxuXHQgICAgXCI1NDI0MzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTQyNDMyXCI6IFwi5Y+M5rmW5Y6/XCIsXG5cdCAgICBcIjU0MjUwMFwiOiBcIumYv+mHjOWcsOWMulwiLFxuXHQgICAgXCI1NDI1MjFcIjogXCLmma7lhbDljr9cIixcblx0ICAgIFwiNTQyNTIyXCI6IFwi5pyt6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjUyM1wiOiBcIuWZtuWwlOWOv1wiLFxuXHQgICAgXCI1NDI1MjRcIjogXCLml6XlnJ/ljr9cIixcblx0ICAgIFwiNTQyNTI1XCI6IFwi6Z2p5ZCJ5Y6/XCIsXG5cdCAgICBcIjU0MjUyNlwiOiBcIuaUueWImeWOv1wiLFxuXHQgICAgXCI1NDI1MjdcIjogXCLmjqrli6Tljr9cIixcblx0ICAgIFwiNTQyNTI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjYwMFwiOiBcIuael+iKneWcsOWMulwiLFxuXHQgICAgXCI1NDI2MjFcIjogXCLmnpfoip3ljr9cIixcblx0ICAgIFwiNTQyNjIyXCI6IFwi5bel5biD5rGf6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjYyM1wiOiBcIuexs+ael+WOv1wiLFxuXHQgICAgXCI1NDI2MjRcIjogXCLloqjohLHljr9cIixcblx0ICAgIFwiNTQyNjI1XCI6IFwi5rOi5a+G5Y6/XCIsXG5cdCAgICBcIjU0MjYyNlwiOiBcIuWvn+maheWOv1wiLFxuXHQgICAgXCI1NDI2MjdcIjogXCLmnJfljr9cIixcblx0ICAgIFwiNTQyNjI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDAwMFwiOiBcIumZleilv+ecgVwiLFxuXHQgICAgXCI2MTAxMDBcIjogXCLopb/lronluIJcIixcblx0ICAgIFwiNjEwMTAyXCI6IFwi5paw5Z+O5Yy6XCIsXG5cdCAgICBcIjYxMDEwM1wiOiBcIueikeael+WMulwiLFxuXHQgICAgXCI2MTAxMDRcIjogXCLojrLmuZbljLpcIixcblx0ICAgIFwiNjEwMTExXCI6IFwi54Ge5qGl5Yy6XCIsXG5cdCAgICBcIjYxMDExMlwiOiBcIuacquWkruWMulwiLFxuXHQgICAgXCI2MTAxMTNcIjogXCLpm4HloZTljLpcIixcblx0ICAgIFwiNjEwMTE0XCI6IFwi6ZiO6Imv5Yy6XCIsXG5cdCAgICBcIjYxMDExNVwiOiBcIuS4tOa9vOWMulwiLFxuXHQgICAgXCI2MTAxMTZcIjogXCLplb/lronljLpcIixcblx0ICAgIFwiNjEwMTIyXCI6IFwi6JOd55Sw5Y6/XCIsXG5cdCAgICBcIjYxMDEyNFwiOiBcIuWRqOiHs+WOv1wiLFxuXHQgICAgXCI2MTAxMjVcIjogXCLmiLfljr9cIixcblx0ICAgIFwiNjEwMTI2XCI6IFwi6auY6Zm15Y6/XCIsXG5cdCAgICBcIjYxMDEyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTAyMDBcIjogXCLpk5zlt53luIJcIixcblx0ICAgIFwiNjEwMjAyXCI6IFwi546L55uK5Yy6XCIsXG5cdCAgICBcIjYxMDIwM1wiOiBcIuWNsOWPsOWMulwiLFxuXHQgICAgXCI2MTAyMDRcIjogXCLogIDlt57ljLpcIixcblx0ICAgIFwiNjEwMjIyXCI6IFwi5a6c5ZCb5Y6/XCIsXG5cdCAgICBcIjYxMDIyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTAzMDBcIjogXCLlrp3puKHluIJcIixcblx0ICAgIFwiNjEwMzAyXCI6IFwi5rit5ruo5Yy6XCIsXG5cdCAgICBcIjYxMDMwM1wiOiBcIumHkeWPsOWMulwiLFxuXHQgICAgXCI2MTAzMDRcIjogXCLpmYjku5PljLpcIixcblx0ICAgIFwiNjEwMzIyXCI6IFwi5Yek57+U5Y6/XCIsXG5cdCAgICBcIjYxMDMyM1wiOiBcIuWykOWxseWOv1wiLFxuXHQgICAgXCI2MTAzMjRcIjogXCLmibbpo47ljr9cIixcblx0ICAgIFwiNjEwMzI2XCI6IFwi55yJ5Y6/XCIsXG5cdCAgICBcIjYxMDMyN1wiOiBcIumZh+WOv1wiLFxuXHQgICAgXCI2MTAzMjhcIjogXCLljYPpmLPljr9cIixcblx0ICAgIFwiNjEwMzI5XCI6IFwi6bqf5ri45Y6/XCIsXG5cdCAgICBcIjYxMDMzMFwiOiBcIuWHpOWOv1wiLFxuXHQgICAgXCI2MTAzMzFcIjogXCLlpKrnmb3ljr9cIixcblx0ICAgIFwiNjEwMzMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDQwMFwiOiBcIuWSuOmYs+W4glwiLFxuXHQgICAgXCI2MTA0MDJcIjogXCLnp6bpg73ljLpcIixcblx0ICAgIFwiNjEwNDAzXCI6IFwi5p2o6Zm15Yy6XCIsXG5cdCAgICBcIjYxMDQwNFwiOiBcIua4reWfjuWMulwiLFxuXHQgICAgXCI2MTA0MjJcIjogXCLkuInljp/ljr9cIixcblx0ICAgIFwiNjEwNDIzXCI6IFwi5rO+6Ziz5Y6/XCIsXG5cdCAgICBcIjYxMDQyNFwiOiBcIuS5vuWOv1wiLFxuXHQgICAgXCI2MTA0MjVcIjogXCLnpLzms4nljr9cIixcblx0ICAgIFwiNjEwNDI2XCI6IFwi5rC45a+/5Y6/XCIsXG5cdCAgICBcIjYxMDQyN1wiOiBcIuW9rOWOv1wiLFxuXHQgICAgXCI2MTA0MjhcIjogXCLplb/mrabljr9cIixcblx0ICAgIFwiNjEwNDI5XCI6IFwi5pes6YKR5Y6/XCIsXG5cdCAgICBcIjYxMDQzMFwiOiBcIua3s+WMluWOv1wiLFxuXHQgICAgXCI2MTA0MzFcIjogXCLmrablip/ljr9cIixcblx0ICAgIFwiNjEwNDgxXCI6IFwi5YW05bmz5biCXCIsXG5cdCAgICBcIjYxMDQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTA1MDBcIjogXCLmuK3ljZfluIJcIixcblx0ICAgIFwiNjEwNTAyXCI6IFwi5Li05rit5Yy6XCIsXG5cdCAgICBcIjYxMDUyMVwiOiBcIuWNjuWOv1wiLFxuXHQgICAgXCI2MTA1MjJcIjogXCLmvbzlhbPljr9cIixcblx0ICAgIFwiNjEwNTIzXCI6IFwi5aSn6I2U5Y6/XCIsXG5cdCAgICBcIjYxMDUyNFwiOiBcIuWQiOmYs+WOv1wiLFxuXHQgICAgXCI2MTA1MjVcIjogXCLmvoTln47ljr9cIixcblx0ICAgIFwiNjEwNTI2XCI6IFwi6JKy5Z+O5Y6/XCIsXG5cdCAgICBcIjYxMDUyN1wiOiBcIueZveawtOWOv1wiLFxuXHQgICAgXCI2MTA1MjhcIjogXCLlr4zlubPljr9cIixcblx0ICAgIFwiNjEwNTgxXCI6IFwi6Z+p5Z+O5biCXCIsXG5cdCAgICBcIjYxMDU4MlwiOiBcIuWNjumYtOW4glwiLFxuXHQgICAgXCI2MTA1ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwNjAwXCI6IFwi5bu25a6J5biCXCIsXG5cdCAgICBcIjYxMDYwMlwiOiBcIuWuneWhlOWMulwiLFxuXHQgICAgXCI2MTA2MjFcIjogXCLlu7bplb/ljr9cIixcblx0ICAgIFwiNjEwNjIyXCI6IFwi5bu25bed5Y6/XCIsXG5cdCAgICBcIjYxMDYyM1wiOiBcIuWtkOmVv+WOv1wiLFxuXHQgICAgXCI2MTA2MjRcIjogXCLlronloZ7ljr9cIixcblx0ICAgIFwiNjEwNjI1XCI6IFwi5b+X5Li55Y6/XCIsXG5cdCAgICBcIjYxMDYyNlwiOiBcIuWQtOi1t+WOv1wiLFxuXHQgICAgXCI2MTA2MjdcIjogXCLnlJjms4nljr9cIixcblx0ICAgIFwiNjEwNjI4XCI6IFwi5a+M5Y6/XCIsXG5cdCAgICBcIjYxMDYyOVwiOiBcIua0m+W3neWOv1wiLFxuXHQgICAgXCI2MTA2MzBcIjogXCLlrpzlt53ljr9cIixcblx0ICAgIFwiNjEwNjMxXCI6IFwi6buE6b6Z5Y6/XCIsXG5cdCAgICBcIjYxMDYzMlwiOiBcIum7hOmZteWOv1wiLFxuXHQgICAgXCI2MTA2MzNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwNzAwXCI6IFwi5rGJ5Lit5biCXCIsXG5cdCAgICBcIjYxMDcwMlwiOiBcIuaxieWPsOWMulwiLFxuXHQgICAgXCI2MTA3MjFcIjogXCLljZfpg5Hljr9cIixcblx0ICAgIFwiNjEwNzIyXCI6IFwi5Z+O5Zu65Y6/XCIsXG5cdCAgICBcIjYxMDcyM1wiOiBcIua0i+WOv1wiLFxuXHQgICAgXCI2MTA3MjRcIjogXCLopb/kuaHljr9cIixcblx0ICAgIFwiNjEwNzI1XCI6IFwi5YuJ5Y6/XCIsXG5cdCAgICBcIjYxMDcyNlwiOiBcIuWugeW8uuWOv1wiLFxuXHQgICAgXCI2MTA3MjdcIjogXCLnlaXpmLPljr9cIixcblx0ICAgIFwiNjEwNzI4XCI6IFwi6ZWH5be05Y6/XCIsXG5cdCAgICBcIjYxMDcyOVwiOiBcIueVmeWdneWOv1wiLFxuXHQgICAgXCI2MTA3MzBcIjogXCLkvZvlnarljr9cIixcblx0ICAgIFwiNjEwNzMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDgwMFwiOiBcIuamhuael+W4glwiLFxuXHQgICAgXCI2MTA4MDJcIjogXCLmpobpmLPljLpcIixcblx0ICAgIFwiNjEwODIxXCI6IFwi56We5pyo5Y6/XCIsXG5cdCAgICBcIjYxMDgyMlwiOiBcIuW6nOiwt+WOv1wiLFxuXHQgICAgXCI2MTA4MjNcIjogXCLmqKrlsbHljr9cIixcblx0ICAgIFwiNjEwODI0XCI6IFwi6Z2W6L655Y6/XCIsXG5cdCAgICBcIjYxMDgyNVwiOiBcIuWumui+ueWOv1wiLFxuXHQgICAgXCI2MTA4MjZcIjogXCLnu6Xlvrfljr9cIixcblx0ICAgIFwiNjEwODI3XCI6IFwi57Gz6ISC5Y6/XCIsXG5cdCAgICBcIjYxMDgyOFwiOiBcIuS9s+WOv1wiLFxuXHQgICAgXCI2MTA4MjlcIjogXCLlkLTloKHljr9cIixcblx0ICAgIFwiNjEwODMwXCI6IFwi5riF5ran5Y6/XCIsXG5cdCAgICBcIjYxMDgzMVwiOiBcIuWtkOa0suWOv1wiLFxuXHQgICAgXCI2MTA4MzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwOTAwXCI6IFwi5a6J5bq35biCXCIsXG5cdCAgICBcIjYxMDkwMlwiOiBcIuaxiea7qOWMulwiLFxuXHQgICAgXCI2MTA5MjFcIjogXCLmsYnpmLTljr9cIixcblx0ICAgIFwiNjEwOTIyXCI6IFwi55+z5rOJ5Y6/XCIsXG5cdCAgICBcIjYxMDkyM1wiOiBcIuWugemZleWOv1wiLFxuXHQgICAgXCI2MTA5MjRcIjogXCLntKvpmLPljr9cIixcblx0ICAgIFwiNjEwOTI1XCI6IFwi5bKa55qL5Y6/XCIsXG5cdCAgICBcIjYxMDkyNlwiOiBcIuW5s+WIqeWOv1wiLFxuXHQgICAgXCI2MTA5MjdcIjogXCLplYflnarljr9cIixcblx0ICAgIFwiNjEwOTI4XCI6IFwi5pes6Ziz5Y6/XCIsXG5cdCAgICBcIjYxMDkyOVwiOiBcIueZveays+WOv1wiLFxuXHQgICAgXCI2MTA5MzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjExMDAwXCI6IFwi5ZWG5rSb5biCXCIsXG5cdCAgICBcIjYxMTAwMlwiOiBcIuWVhuW3nuWMulwiLFxuXHQgICAgXCI2MTEwMjFcIjogXCLmtJvljZfljr9cIixcblx0ICAgIFwiNjExMDIyXCI6IFwi5Li55Yek5Y6/XCIsXG5cdCAgICBcIjYxMTAyM1wiOiBcIuWVhuWNl+WOv1wiLFxuXHQgICAgXCI2MTEwMjRcIjogXCLlsbHpmLPljr9cIixcblx0ICAgIFwiNjExMDI1XCI6IFwi6ZWH5a6J5Y6/XCIsXG5cdCAgICBcIjYxMTAyNlwiOiBcIuafnuawtOWOv1wiLFxuXHQgICAgXCI2MTEwMjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjIwMDAwXCI6IFwi55SY6IKD55yBXCIsXG5cdCAgICBcIjYyMDEwMFwiOiBcIuWFsOW3nuW4glwiLFxuXHQgICAgXCI2MjAxMDJcIjogXCLln47lhbPljLpcIixcblx0ICAgIFwiNjIwMTAzXCI6IFwi5LiD6YeM5rKz5Yy6XCIsXG5cdCAgICBcIjYyMDEwNFwiOiBcIuilv+WbuuWMulwiLFxuXHQgICAgXCI2MjAxMDVcIjogXCLlronlroHljLpcIixcblx0ICAgIFwiNjIwMTExXCI6IFwi57qi5Y+k5Yy6XCIsXG5cdCAgICBcIjYyMDEyMVwiOiBcIuawuOeZu+WOv1wiLFxuXHQgICAgXCI2MjAxMjJcIjogXCLnmovlhbDljr9cIixcblx0ICAgIFwiNjIwMTIzXCI6IFwi5qaG5Lit5Y6/XCIsXG5cdCAgICBcIjYyMDEyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjAyMDBcIjogXCLlmInls6rlhbPluIJcIixcblx0ICAgIFwiNjIwMzAwXCI6IFwi6YeR5piM5biCXCIsXG5cdCAgICBcIjYyMDMwMlwiOiBcIumHkeW3neWMulwiLFxuXHQgICAgXCI2MjAzMjFcIjogXCLmsLjmmIzljr9cIixcblx0ICAgIFwiNjIwMzIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDQwMFwiOiBcIueZvemTtuW4glwiLFxuXHQgICAgXCI2MjA0MDJcIjogXCLnmb3pk7bljLpcIixcblx0ICAgIFwiNjIwNDAzXCI6IFwi5bmz5bed5Yy6XCIsXG5cdCAgICBcIjYyMDQyMVwiOiBcIumdlui/nOWOv1wiLFxuXHQgICAgXCI2MjA0MjJcIjogXCLkvJrlroHljr9cIixcblx0ICAgIFwiNjIwNDIzXCI6IFwi5pmv5rOw5Y6/XCIsXG5cdCAgICBcIjYyMDQyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA1MDBcIjogXCLlpKnmsLTluIJcIixcblx0ICAgIFwiNjIwNTAyXCI6IFwi56em5bee5Yy6XCIsXG5cdCAgICBcIjYyMDUwM1wiOiBcIum6puenr+WMulwiLFxuXHQgICAgXCI2MjA1MjFcIjogXCLmuIXmsLTljr9cIixcblx0ICAgIFwiNjIwNTIyXCI6IFwi56em5a6J5Y6/XCIsXG5cdCAgICBcIjYyMDUyM1wiOiBcIueUmOiwt+WOv1wiLFxuXHQgICAgXCI2MjA1MjRcIjogXCLmrablsbHljr9cIixcblx0ICAgIFwiNjIwNTI1XCI6IFwi5byg5a625bed5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDUyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA2MDBcIjogXCLmrablqIHluIJcIixcblx0ICAgIFwiNjIwNjAyXCI6IFwi5YeJ5bee5Yy6XCIsXG5cdCAgICBcIjYyMDYyMVwiOiBcIuawkeWLpOWOv1wiLFxuXHQgICAgXCI2MjA2MjJcIjogXCLlj6Tmtarljr9cIixcblx0ICAgIFwiNjIwNjIzXCI6IFwi5aSp56Wd6JeP5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDYyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA3MDBcIjogXCLlvKDmjpbluIJcIixcblx0ICAgIFwiNjIwNzAyXCI6IFwi55SY5bee5Yy6XCIsXG5cdCAgICBcIjYyMDcyMVwiOiBcIuiCg+WNl+ijleWbuuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MjA3MjJcIjogXCLmsJHkuZDljr9cIixcblx0ICAgIFwiNjIwNzIzXCI6IFwi5Li05rO95Y6/XCIsXG5cdCAgICBcIjYyMDcyNFwiOiBcIumrmOWPsOWOv1wiLFxuXHQgICAgXCI2MjA3MjVcIjogXCLlsbHkuLnljr9cIixcblx0ICAgIFwiNjIwNzI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDgwMFwiOiBcIuW5s+WHieW4glwiLFxuXHQgICAgXCI2MjA4MDJcIjogXCLltIbls5LljLpcIixcblx0ICAgIFwiNjIwODIxXCI6IFwi5rO+5bed5Y6/XCIsXG5cdCAgICBcIjYyMDgyMlwiOiBcIueBteWPsOWOv1wiLFxuXHQgICAgXCI2MjA4MjNcIjogXCLltIfkv6Hljr9cIixcblx0ICAgIFwiNjIwODI0XCI6IFwi5Y2O5Lqt5Y6/XCIsXG5cdCAgICBcIjYyMDgyNVwiOiBcIuW6hOa1quWOv1wiLFxuXHQgICAgXCI2MjA4MjZcIjogXCLpnZnlroHljr9cIixcblx0ICAgIFwiNjIwODI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDkwMFwiOiBcIumFkuazieW4glwiLFxuXHQgICAgXCI2MjA5MDJcIjogXCLogoPlt57ljLpcIixcblx0ICAgIFwiNjIwOTIxXCI6IFwi6YeR5aGU5Y6/XCIsXG5cdCAgICBcIjYyMDkyMlwiOiBcIueTnOW3nuWOv1wiLFxuXHQgICAgXCI2MjA5MjNcIjogXCLogoPljJfokpnlj6Tml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjIwOTI0XCI6IFwi6Zi/5YWL5aGe5ZOI6JCo5YWL5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDk4MVwiOiBcIueOiemXqOW4glwiLFxuXHQgICAgXCI2MjA5ODJcIjogXCLmlabnhYzluIJcIixcblx0ICAgIFwiNjIwOTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMTAwMFwiOiBcIuW6humYs+W4glwiLFxuXHQgICAgXCI2MjEwMDJcIjogXCLopb/ls7DljLpcIixcblx0ICAgIFwiNjIxMDIxXCI6IFwi5bqG5Z+O5Y6/XCIsXG5cdCAgICBcIjYyMTAyMlwiOiBcIueOr+WOv1wiLFxuXHQgICAgXCI2MjEwMjNcIjogXCLljY7msaDljr9cIixcblx0ICAgIFwiNjIxMDI0XCI6IFwi5ZCI5rC05Y6/XCIsXG5cdCAgICBcIjYyMTAyNVwiOiBcIuato+WugeWOv1wiLFxuXHQgICAgXCI2MjEwMjZcIjogXCLlroHljr9cIixcblx0ICAgIFwiNjIxMDI3XCI6IFwi6ZWH5Y6f5Y6/XCIsXG5cdCAgICBcIjYyMTAyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjExMDBcIjogXCLlrpropb/luIJcIixcblx0ICAgIFwiNjIxMTAyXCI6IFwi5a6J5a6a5Yy6XCIsXG5cdCAgICBcIjYyMTEyMVwiOiBcIumAmua4reWOv1wiLFxuXHQgICAgXCI2MjExMjJcIjogXCLpmYfopb/ljr9cIixcblx0ICAgIFwiNjIxMTIzXCI6IFwi5rit5rqQ5Y6/XCIsXG5cdCAgICBcIjYyMTEyNFwiOiBcIuS4tOa0ruWOv1wiLFxuXHQgICAgXCI2MjExMjVcIjogXCLmvLPljr9cIixcblx0ICAgIFwiNjIxMTI2XCI6IFwi5bK35Y6/XCIsXG5cdCAgICBcIjYyMTEyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjEyMDBcIjogXCLpmYfljZfluIJcIixcblx0ICAgIFwiNjIxMjAyXCI6IFwi5q2m6YO95Yy6XCIsXG5cdCAgICBcIjYyMTIyMVwiOiBcIuaIkOWOv1wiLFxuXHQgICAgXCI2MjEyMjJcIjogXCLmlofljr9cIixcblx0ICAgIFwiNjIxMjIzXCI6IFwi5a6V5piM5Y6/XCIsXG5cdCAgICBcIjYyMTIyNFwiOiBcIuW6t+WOv1wiLFxuXHQgICAgXCI2MjEyMjVcIjogXCLopb/lkozljr9cIixcblx0ICAgIFwiNjIxMjI2XCI6IFwi56S85Y6/XCIsXG5cdCAgICBcIjYyMTIyN1wiOiBcIuW+veWOv1wiLFxuXHQgICAgXCI2MjEyMjhcIjogXCLkuKTlvZPljr9cIixcblx0ICAgIFwiNjIxMjI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMjkwMFwiOiBcIuS4tOWkj+WbnuaXj+iHquayu+W3nlwiLFxuXHQgICAgXCI2MjI5MDFcIjogXCLkuLTlpI/luIJcIixcblx0ICAgIFwiNjIyOTIxXCI6IFwi5Li05aSP5Y6/XCIsXG5cdCAgICBcIjYyMjkyMlwiOiBcIuW6t+S5kOWOv1wiLFxuXHQgICAgXCI2MjI5MjNcIjogXCLmsLjpnZbljr9cIixcblx0ICAgIFwiNjIyOTI0XCI6IFwi5bm/5rKz5Y6/XCIsXG5cdCAgICBcIjYyMjkyNVwiOiBcIuWSjOaUv+WOv1wiLFxuXHQgICAgXCI2MjI5MjZcIjogXCLkuJzkuaHml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjIyOTI3XCI6IFwi56ev55+z5bGx5L+d5a6J5peP5Lic5Lmh5peP5pKS5ouJ5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMjkyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjMwMDBcIjogXCLnlJjljZfol4/ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNjIzMDAxXCI6IFwi5ZCI5L2c5biCXCIsXG5cdCAgICBcIjYyMzAyMVwiOiBcIuS4tOa9reWOv1wiLFxuXHQgICAgXCI2MjMwMjJcIjogXCLljZPlsLzljr9cIixcblx0ICAgIFwiNjIzMDIzXCI6IFwi6Iif5puy5Y6/XCIsXG5cdCAgICBcIjYyMzAyNFwiOiBcIui/remDqOWOv1wiLFxuXHQgICAgXCI2MjMwMjVcIjogXCLnjpvmm7Lljr9cIixcblx0ICAgIFwiNjIzMDI2XCI6IFwi56KM5puy5Y6/XCIsXG5cdCAgICBcIjYyMzAyN1wiOiBcIuWkj+ays+WOv1wiLFxuXHQgICAgXCI2MjMwMjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMwMDAwXCI6IFwi6Z2S5rW355yBXCIsXG5cdCAgICBcIjYzMDEwMFwiOiBcIuilv+WugeW4glwiLFxuXHQgICAgXCI2MzAxMDJcIjogXCLln47kuJzljLpcIixcblx0ICAgIFwiNjMwMTAzXCI6IFwi5Z+O5Lit5Yy6XCIsXG5cdCAgICBcIjYzMDEwNFwiOiBcIuWfjuilv+WMulwiLFxuXHQgICAgXCI2MzAxMDVcIjogXCLln47ljJfljLpcIixcblx0ICAgIFwiNjMwMTIxXCI6IFwi5aSn6YCa5Zue5peP5Zyf5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMDEyMlwiOiBcIua5n+S4reWOv1wiLFxuXHQgICAgXCI2MzAxMjNcIjogXCLmuZ/mupDljr9cIixcblx0ICAgIFwiNjMwMTI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYzMjEwMFwiOiBcIua1t+S4nOW4glwiLFxuXHQgICAgXCI2MzIxMjFcIjogXCLlubPlronljr9cIixcblx0ICAgIFwiNjMyMTIyXCI6IFwi5rCR5ZKM5Zue5peP5Zyf5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMjEyM1wiOiBcIuS5kOmDveWMulwiLFxuXHQgICAgXCI2MzIxMjZcIjogXCLkupLliqnlnJ/ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjMyMTI3XCI6IFwi5YyW6ZqG5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMjEyOFwiOiBcIuW+quWMluaSkuaLieaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIxMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyMjAwXCI6IFwi5rW35YyX6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjIyMVwiOiBcIumXqOa6kOWbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIyMjJcIjogXCLnpYHov57ljr9cIixcblx0ICAgIFwiNjMyMjIzXCI6IFwi5rW35pmP5Y6/XCIsXG5cdCAgICBcIjYzMjIyNFwiOiBcIuWImuWvn+WOv1wiLFxuXHQgICAgXCI2MzIyMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyMzAwXCI6IFwi6buE5Y2X6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjMyMVwiOiBcIuWQjOS7geWOv1wiLFxuXHQgICAgXCI2MzIzMjJcIjogXCLlsJbmiY7ljr9cIixcblx0ICAgIFwiNjMyMzIzXCI6IFwi5rO95bqT5Y6/XCIsXG5cdCAgICBcIjYzMjMyNFwiOiBcIuays+WNl+iSmeWPpOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIzMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyNTAwXCI6IFwi5rW35Y2X6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjUyMVwiOiBcIuWFseWSjOWOv1wiLFxuXHQgICAgXCI2MzI1MjJcIjogXCLlkIzlvrfljr9cIixcblx0ICAgIFwiNjMyNTIzXCI6IFwi6LS15b635Y6/XCIsXG5cdCAgICBcIjYzMjUyNFwiOiBcIuWFtOa1t+WOv1wiLFxuXHQgICAgXCI2MzI1MjVcIjogXCLotLXljZfljr9cIixcblx0ICAgIFwiNjMyNTI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYzMjYwMFwiOiBcIuaenOa0m+iXj+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI2MzI2MjFcIjogXCLnjpvmsoHljr9cIixcblx0ICAgIFwiNjMyNjIyXCI6IFwi54+t546b5Y6/XCIsXG5cdCAgICBcIjYzMjYyM1wiOiBcIueUmOW+t+WOv1wiLFxuXHQgICAgXCI2MzI2MjRcIjogXCLovr7ml6Xljr9cIixcblx0ICAgIFwiNjMyNjI1XCI6IFwi5LmF5rK75Y6/XCIsXG5cdCAgICBcIjYzMjYyNlwiOiBcIueOm+WkmuWOv1wiLFxuXHQgICAgXCI2MzI2MjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyNzAwXCI6IFwi546J5qCR6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjcyMVwiOiBcIueOieagkeW4glwiLFxuXHQgICAgXCI2MzI3MjJcIjogXCLmnYLlpJrljr9cIixcblx0ICAgIFwiNjMyNzIzXCI6IFwi56ew5aSa5Y6/XCIsXG5cdCAgICBcIjYzMjcyNFwiOiBcIuayu+WkmuWOv1wiLFxuXHQgICAgXCI2MzI3MjVcIjogXCLlm4rosKbljr9cIixcblx0ICAgIFwiNjMyNzI2XCI6IFwi5puy6bq76I6x5Y6/XCIsXG5cdCAgICBcIjYzMjcyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MzI4MDBcIjogXCLmtbfopb/okpnlj6Tml4/ol4/ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNjMyODAxXCI6IFwi5qC85bCU5pyo5biCXCIsXG5cdCAgICBcIjYzMjgwMlwiOiBcIuW+t+S7pOWTiOW4glwiLFxuXHQgICAgXCI2MzI4MjFcIjogXCLkuYzlhbDljr9cIixcblx0ICAgIFwiNjMyODIyXCI6IFwi6YO95YWw5Y6/XCIsXG5cdCAgICBcIjYzMjgyM1wiOiBcIuWkqeWzu+WOv1wiLFxuXHQgICAgXCI2MzI4MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwMDAwXCI6IFwi5a6B5aSP5Zue5peP6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjY0MDEwMFwiOiBcIumTtuW3neW4glwiLFxuXHQgICAgXCI2NDAxMDRcIjogXCLlhbTluobljLpcIixcblx0ICAgIFwiNjQwMTA1XCI6IFwi6KW/5aSP5Yy6XCIsXG5cdCAgICBcIjY0MDEwNlwiOiBcIumHkeWHpOWMulwiLFxuXHQgICAgXCI2NDAxMjFcIjogXCLmsLjlroHljr9cIixcblx0ICAgIFwiNjQwMTIyXCI6IFwi6LS65YWw5Y6/XCIsXG5cdCAgICBcIjY0MDE4MVwiOiBcIueBteatpuW4glwiLFxuXHQgICAgXCI2NDAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwMjAwXCI6IFwi55+z5Zi05bGx5biCXCIsXG5cdCAgICBcIjY0MDIwMlwiOiBcIuWkp+atpuWPo+WMulwiLFxuXHQgICAgXCI2NDAyMDVcIjogXCLmg6DlhpzljLpcIixcblx0ICAgIFwiNjQwMjIxXCI6IFwi5bmz572X5Y6/XCIsXG5cdCAgICBcIjY0MDIyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NDAzMDBcIjogXCLlkLTlv6DluIJcIixcblx0ICAgIFwiNjQwMzAyXCI6IFwi5Yip6YCa5Yy6XCIsXG5cdCAgICBcIjY0MDMwM1wiOiBcIue6ouWvuuWgoeWMulwiLFxuXHQgICAgXCI2NDAzMjNcIjogXCLnm5DmsaDljr9cIixcblx0ICAgIFwiNjQwMzI0XCI6IFwi5ZCM5b+D5Y6/XCIsXG5cdCAgICBcIjY0MDM4MVwiOiBcIumdkumTnOWzoeW4glwiLFxuXHQgICAgXCI2NDAzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwNDAwXCI6IFwi5Zu65Y6f5biCXCIsXG5cdCAgICBcIjY0MDQwMlwiOiBcIuWOn+W3nuWMulwiLFxuXHQgICAgXCI2NDA0MjJcIjogXCLopb/lkInljr9cIixcblx0ICAgIFwiNjQwNDIzXCI6IFwi6ZqG5b635Y6/XCIsXG5cdCAgICBcIjY0MDQyNFwiOiBcIuazvua6kOWOv1wiLFxuXHQgICAgXCI2NDA0MjVcIjogXCLlva3pmLPljr9cIixcblx0ICAgIFwiNjQwNDI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY0MDUwMFwiOiBcIuS4reWNq+W4glwiLFxuXHQgICAgXCI2NDA1MDJcIjogXCLmspnlnaHlpLTljLpcIixcblx0ICAgIFwiNjQwNTIxXCI6IFwi5Lit5a6B5Y6/XCIsXG5cdCAgICBcIjY0MDUyMlwiOiBcIua1t+WOn+WOv1wiLFxuXHQgICAgXCI2NDA1MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUwMDAwXCI6IFwi5paw55aG57u05ZC+5bCU6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjY1MDEwMFwiOiBcIuS5jOmygeacqOm9kOW4glwiLFxuXHQgICAgXCI2NTAxMDJcIjogXCLlpKnlsbHljLpcIixcblx0ICAgIFwiNjUwMTAzXCI6IFwi5rKZ5L6d5be05YWL5Yy6XCIsXG5cdCAgICBcIjY1MDEwNFwiOiBcIuaWsOW4guWMulwiLFxuXHQgICAgXCI2NTAxMDVcIjogXCLmsLTno6jmsp/ljLpcIixcblx0ICAgIFwiNjUwMTA2XCI6IFwi5aS05bGv5rKz5Yy6XCIsXG5cdCAgICBcIjY1MDEwN1wiOiBcIui+vuWdguWfjuWMulwiLFxuXHQgICAgXCI2NTAxMDlcIjogXCLnsbPkuJzljLpcIixcblx0ICAgIFwiNjUwMTIxXCI6IFwi5LmM6bKB5pyo6b2Q5Y6/XCIsXG5cdCAgICBcIjY1MDEyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTAyMDBcIjogXCLlhYvmi4nnjpvkvp3luIJcIixcblx0ICAgIFwiNjUwMjAyXCI6IFwi54us5bGx5a2Q5Yy6XCIsXG5cdCAgICBcIjY1MDIwM1wiOiBcIuWFi+aLieeOm+S+neWMulwiLFxuXHQgICAgXCI2NTAyMDRcIjogXCLnmb3norHmu6nljLpcIixcblx0ICAgIFwiNjUwMjA1XCI6IFwi5LmM5bCU56a+5Yy6XCIsXG5cdCAgICBcIjY1MDIwNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTIxMDBcIjogXCLlkJDpsoHnlarlnLDljLpcIixcblx0ICAgIFwiNjUyMTAxXCI6IFwi5ZCQ6bKB55Wq5biCXCIsXG5cdCAgICBcIjY1MjEyMlwiOiBcIumEr+WWhOWOv1wiLFxuXHQgICAgXCI2NTIxMjNcIjogXCLmiZjlhYvpgIrljr9cIixcblx0ICAgIFwiNjUyMTI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MjIwMFwiOiBcIuWTiOWvhuWcsOWMulwiLFxuXHQgICAgXCI2NTIyMDFcIjogXCLlk4jlr4bluIJcIixcblx0ICAgIFwiNjUyMjIyXCI6IFwi5be06YeM5Z2k5ZOI6JCo5YWL6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjY1MjIyM1wiOiBcIuS8iuWQvuWOv1wiLFxuXHQgICAgXCI2NTIyMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyMzAwXCI6IFwi5piM5ZCJ5Zue5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjMwMVwiOiBcIuaYjOWQieW4glwiLFxuXHQgICAgXCI2NTIzMDJcIjogXCLpmJzlurfluIJcIixcblx0ICAgIFwiNjUyMzIzXCI6IFwi5ZG85Zu+5aOB5Y6/XCIsXG5cdCAgICBcIjY1MjMyNFwiOiBcIueOm+e6s+aWr+WOv1wiLFxuXHQgICAgXCI2NTIzMjVcIjogXCLlpYflj7Dljr9cIixcblx0ICAgIFwiNjUyMzI3XCI6IFwi5ZCJ5pyo6JCo5bCU5Y6/XCIsXG5cdCAgICBcIjY1MjMyOFwiOiBcIuacqOWekuWTiOiQqOWFi+iHquayu+WOv1wiLFxuXHQgICAgXCI2NTIzMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyNzAwXCI6IFwi5Y2a5bCU5aGU5ouJ6JKZ5Y+k6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjcwMVwiOiBcIuWNmuS5kOW4glwiLFxuXHQgICAgXCI2NTI3MDJcIjogXCLpmL/mi4nlsbHlj6PluIJcIixcblx0ICAgIFwiNjUyNzIyXCI6IFwi57K+5rKz5Y6/XCIsXG5cdCAgICBcIjY1MjcyM1wiOiBcIua4qeazieWOv1wiLFxuXHQgICAgXCI2NTI3MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyODAwXCI6IFwi5be06Z+z6YOt5qWe6JKZ5Y+k6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjgwMVwiOiBcIuW6k+WwlOWLkuW4glwiLFxuXHQgICAgXCI2NTI4MjJcIjogXCLova7lj7Dljr9cIixcblx0ICAgIFwiNjUyODIzXCI6IFwi5bCJ54qB5Y6/XCIsXG5cdCAgICBcIjY1MjgyNFwiOiBcIuiLpee+jOWOv1wiLFxuXHQgICAgXCI2NTI4MjVcIjogXCLkuJTmnKvljr9cIixcblx0ICAgIFwiNjUyODI2XCI6IFwi54SJ6ICG5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjY1MjgyN1wiOiBcIuWSjOmdmeWOv1wiLFxuXHQgICAgXCI2NTI4MjhcIjogXCLlkoznoZXljr9cIixcblx0ICAgIFwiNjUyODI5XCI6IFwi5Y2a5rmW5Y6/XCIsXG5cdCAgICBcIjY1MjgzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTI5MDBcIjogXCLpmL/lhYvoi4/lnLDljLpcIixcblx0ICAgIFwiNjUyOTAxXCI6IFwi6Zi/5YWL6IuP5biCXCIsXG5cdCAgICBcIjY1MjkyMlwiOiBcIua4qeWuv+WOv1wiLFxuXHQgICAgXCI2NTI5MjNcIjogXCLlupPovabljr9cIixcblx0ICAgIFwiNjUyOTI0XCI6IFwi5rKZ6ZuF5Y6/XCIsXG5cdCAgICBcIjY1MjkyNVwiOiBcIuaWsOWSjOWOv1wiLFxuXHQgICAgXCI2NTI5MjZcIjogXCLmi5zln47ljr9cIixcblx0ICAgIFwiNjUyOTI3XCI6IFwi5LmM5LuA5Y6/XCIsXG5cdCAgICBcIjY1MjkyOFwiOiBcIumYv+eTpuaPkOWOv1wiLFxuXHQgICAgXCI2NTI5MjlcIjogXCLmn6/lnarljr9cIixcblx0ICAgIFwiNjUyOTMwXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MzAwMFwiOiBcIuWFi+WtnOWLkuiLj+afr+WwlOWFi+WtnOiHquayu+W3nlwiLFxuXHQgICAgXCI2NTMwMDFcIjogXCLpmL/lm77ku4DluIJcIixcblx0ICAgIFwiNjUzMDIyXCI6IFwi6Zi/5YWL6Zm25Y6/XCIsXG5cdCAgICBcIjY1MzAyM1wiOiBcIumYv+WQiOWlh+WOv1wiLFxuXHQgICAgXCI2NTMwMjRcIjogXCLkuYzmgbDljr9cIixcblx0ICAgIFwiNjUzMDI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MzEwMFwiOiBcIuWWgOS7gOWcsOWMulwiLFxuXHQgICAgXCI2NTMxMDFcIjogXCLlloDku4DluIJcIixcblx0ICAgIFwiNjUzMTIxXCI6IFwi55aP6ZmE5Y6/XCIsXG5cdCAgICBcIjY1MzEyMlwiOiBcIueWj+WLkuWOv1wiLFxuXHQgICAgXCI2NTMxMjNcIjogXCLoi7HlkInmspnljr9cIixcblx0ICAgIFwiNjUzMTI0XCI6IFwi5rO95pmu5Y6/XCIsXG5cdCAgICBcIjY1MzEyNVwiOiBcIuiOjui9puWOv1wiLFxuXHQgICAgXCI2NTMxMjZcIjogXCLlj7bln47ljr9cIixcblx0ICAgIFwiNjUzMTI3XCI6IFwi6bqm55uW5o+Q5Y6/XCIsXG5cdCAgICBcIjY1MzEyOFwiOiBcIuWys+aZrua5luWOv1wiLFxuXHQgICAgXCI2NTMxMjlcIjogXCLkvL3luIjljr9cIixcblx0ICAgIFwiNjUzMTMwXCI6IFwi5be05qWa5Y6/XCIsXG5cdCAgICBcIjY1MzEzMVwiOiBcIuWhlOS7gOW6k+WwlOW5suWhlOWQieWFi+iHquayu+WOv1wiLFxuXHQgICAgXCI2NTMxMzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUzMjAwXCI6IFwi5ZKM55Sw5Zyw5Yy6XCIsXG5cdCAgICBcIjY1MzIwMVwiOiBcIuWSjOeUsOW4glwiLFxuXHQgICAgXCI2NTMyMjFcIjogXCLlkoznlLDljr9cIixcblx0ICAgIFwiNjUzMjIyXCI6IFwi5aKo546J5Y6/XCIsXG5cdCAgICBcIjY1MzIyM1wiOiBcIuearuWxseWOv1wiLFxuXHQgICAgXCI2NTMyMjRcIjogXCLmtJvmtabljr9cIixcblx0ICAgIFwiNjUzMjI1XCI6IFwi562W5YuS5Y6/XCIsXG5cdCAgICBcIjY1MzIyNlwiOiBcIuS6jueUsOWOv1wiLFxuXHQgICAgXCI2NTMyMjdcIjogXCLmsJHkuLDljr9cIixcblx0ICAgIFwiNjUzMjI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDAwMFwiOiBcIuS8iueKgeWTiOiQqOWFi+iHquayu+W3nlwiLFxuXHQgICAgXCI2NTQwMDJcIjogXCLkvIrlroHluIJcIixcblx0ICAgIFwiNjU0MDAzXCI6IFwi5aWO5bGv5biCXCIsXG5cdCAgICBcIjY1NDAyMVwiOiBcIuS8iuWugeWOv1wiLFxuXHQgICAgXCI2NTQwMjJcIjogXCLlr5/luIPmn6XlsJTplKHkvK/oh6rmsrvljr9cIixcblx0ICAgIFwiNjU0MDIzXCI6IFwi6ZyN5Z+O5Y6/XCIsXG5cdCAgICBcIjY1NDAyNFwiOiBcIuW3qeeVmeWOv1wiLFxuXHQgICAgXCI2NTQwMjVcIjogXCLmlrDmupDljr9cIixcblx0ICAgIFwiNjU0MDI2XCI6IFwi5pit6IuP5Y6/XCIsXG5cdCAgICBcIjY1NDAyN1wiOiBcIueJueWFi+aWr+WOv1wiLFxuXHQgICAgXCI2NTQwMjhcIjogXCLlsLzli5LlhYvljr9cIixcblx0ICAgIFwiNjU0MDI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDIwMFwiOiBcIuWhlOWfjuWcsOWMulwiLFxuXHQgICAgXCI2NTQyMDFcIjogXCLloZTln47luIJcIixcblx0ICAgIFwiNjU0MjAyXCI6IFwi5LmM6IuP5biCXCIsXG5cdCAgICBcIjY1NDIyMVwiOiBcIumineaVj+WOv1wiLFxuXHQgICAgXCI2NTQyMjNcIjogXCLmspnmub7ljr9cIixcblx0ICAgIFwiNjU0MjI0XCI6IFwi5omY6YeM5Y6/XCIsXG5cdCAgICBcIjY1NDIyNVwiOiBcIuijleawkeWOv1wiLFxuXHQgICAgXCI2NTQyMjZcIjogXCLlkozluIPlhYvotZvlsJTokpnlj6Toh6rmsrvljr9cIixcblx0ICAgIFwiNjU0MjI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDMwMFwiOiBcIumYv+WLkuazsOWcsOWMulwiLFxuXHQgICAgXCI2NTQzMDFcIjogXCLpmL/li5Lms7DluIJcIixcblx0ICAgIFwiNjU0MzIxXCI6IFwi5biD5bCU5rSl5Y6/XCIsXG5cdCAgICBcIjY1NDMyMlwiOiBcIuWvjOiVtOWOv1wiLFxuXHQgICAgXCI2NTQzMjNcIjogXCLnpo/mtbfljr9cIixcblx0ICAgIFwiNjU0MzI0XCI6IFwi5ZOI5be05rKz5Y6/XCIsXG5cdCAgICBcIjY1NDMyNVwiOiBcIumdkuays+WOv1wiLFxuXHQgICAgXCI2NTQzMjZcIjogXCLlkInmnKjkuYPljr9cIixcblx0ICAgIFwiNjU0MzI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1OTAwMVwiOiBcIuefs+ays+WtkOW4glwiLFxuXHQgICAgXCI2NTkwMDJcIjogXCLpmL/mi4nlsJTluIJcIixcblx0ICAgIFwiNjU5MDAzXCI6IFwi5Zu+5pyo6IiS5YWL5biCXCIsXG5cdCAgICBcIjY1OTAwNFwiOiBcIuS6lOWutua4oOW4glwiLFxuXHQgICAgXCI3MTAwMDBcIjogXCLlj7Dmub5cIixcblx0ICAgIFwiNzEwMTAwXCI6IFwi5Y+w5YyX5biCXCIsXG5cdCAgICBcIjcxMDEwMVwiOiBcIuS4reato+WMulwiLFxuXHQgICAgXCI3MTAxMDJcIjogXCLlpKflkIzljLpcIixcblx0ICAgIFwiNzEwMTAzXCI6IFwi5Lit5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDEwNFwiOiBcIuadvuWxseWMulwiLFxuXHQgICAgXCI3MTAxMDVcIjogXCLlpKflronljLpcIixcblx0ICAgIFwiNzEwMTA2XCI6IFwi5LiH5Y2O5Yy6XCIsXG5cdCAgICBcIjcxMDEwN1wiOiBcIuS/oeS5ieWMulwiLFxuXHQgICAgXCI3MTAxMDhcIjogXCLlo6vmnpfljLpcIixcblx0ICAgIFwiNzEwMTA5XCI6IFwi5YyX5oqV5Yy6XCIsXG5cdCAgICBcIjcxMDExMFwiOiBcIuWGhea5luWMulwiLFxuXHQgICAgXCI3MTAxMTFcIjogXCLljZfmuK/ljLpcIixcblx0ICAgIFwiNzEwMTEyXCI6IFwi5paH5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDExM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTAyMDBcIjogXCLpq5jpm4TluIJcIixcblx0ICAgIFwiNzEwMjAxXCI6IFwi5paw5YW05Yy6XCIsXG5cdCAgICBcIjcxMDIwMlwiOiBcIuWJjemHkeWMulwiLFxuXHQgICAgXCI3MTAyMDNcIjogXCLoiqnpm4XljLpcIixcblx0ICAgIFwiNzEwMjA0XCI6IFwi55uQ5Z+V5Yy6XCIsXG5cdCAgICBcIjcxMDIwNVwiOiBcIum8k+WxseWMulwiLFxuXHQgICAgXCI3MTAyMDZcIjogXCLml5fmtKXljLpcIixcblx0ICAgIFwiNzEwMjA3XCI6IFwi5YmN6ZWH5Yy6XCIsXG5cdCAgICBcIjcxMDIwOFwiOiBcIuS4ieawkeWMulwiLFxuXHQgICAgXCI3MTAyMDlcIjogXCLlt6bokKXljLpcIixcblx0ICAgIFwiNzEwMjEwXCI6IFwi5qWg5qKT5Yy6XCIsXG5cdCAgICBcIjcxMDIxMVwiOiBcIuWwj+a4r+WMulwiLFxuXHQgICAgXCI3MTAyMTJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNzEwMjQxXCI6IFwi6IuT6ZuF5Yy6XCIsXG5cdCAgICBcIjcxMDI0MlwiOiBcIuS7geatpuWMulwiLFxuXHQgICAgXCI3MTAyNDNcIjogXCLlpKfnpL7ljLpcIixcblx0ICAgIFwiNzEwMjQ0XCI6IFwi5YaI5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDI0NVwiOiBcIui3r+erueWMulwiLFxuXHQgICAgXCI3MTAyNDZcIjogXCLpmL/ojrLljLpcIixcblx0ICAgIFwiNzEwMjQ3XCI6IFwi55Sw5a+u5Yy6XCIsXG5cdCAgICBcIjcxMDI0OFwiOiBcIueHleW3ouWMulwiLFxuXHQgICAgXCI3MTAyNDlcIjogXCLmoaXlpLTljLpcIixcblx0ICAgIFwiNzEwMjUwXCI6IFwi5qKT5a6Y5Yy6XCIsXG5cdCAgICBcIjcxMDI1MVwiOiBcIuW8pemZgOWMulwiLFxuXHQgICAgXCI3MTAyNTJcIjogXCLmsLjlronljLpcIixcblx0ICAgIFwiNzEwMjUzXCI6IFwi5rmW5YaF5Yy6XCIsXG5cdCAgICBcIjcxMDI1NFwiOiBcIuWHpOWxseWMulwiLFxuXHQgICAgXCI3MTAyNTVcIjogXCLlpKflr67ljLpcIixcblx0ICAgIFwiNzEwMjU2XCI6IFwi5p6X5Zut5Yy6XCIsXG5cdCAgICBcIjcxMDI1N1wiOiBcIum4n+advuWMulwiLFxuXHQgICAgXCI3MTAyNThcIjogXCLlpKfmoJHljLpcIixcblx0ICAgIFwiNzEwMjU5XCI6IFwi5peX5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDI2MFwiOiBcIue+jua1k+WMulwiLFxuXHQgICAgXCI3MTAyNjFcIjogXCLlha3pvp/ljLpcIixcblx0ICAgIFwiNzEwMjYyXCI6IFwi5YaF6Zeo5Yy6XCIsXG5cdCAgICBcIjcxMDI2M1wiOiBcIuadieael+WMulwiLFxuXHQgICAgXCI3MTAyNjRcIjogXCLnlLLku5nljLpcIixcblx0ICAgIFwiNzEwMjY1XCI6IFwi5qGD5rqQ5Yy6XCIsXG5cdCAgICBcIjcxMDI2NlwiOiBcIumCo+eOm+Wkj+WMulwiLFxuXHQgICAgXCI3MTAyNjdcIjogXCLojILmnpfljLpcIixcblx0ICAgIFwiNzEwMjY4XCI6IFwi6IyE6JCj5Yy6XCIsXG5cdCAgICBcIjcxMDMwMFwiOiBcIuWPsOWNl+W4glwiLFxuXHQgICAgXCI3MTAzMDFcIjogXCLkuK3opb/ljLpcIixcblx0ICAgIFwiNzEwMzAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDMwM1wiOiBcIuWNl+WMulwiLFxuXHQgICAgXCI3MTAzMDRcIjogXCLljJfljLpcIixcblx0ICAgIFwiNzEwMzA1XCI6IFwi5a6J5bmz5Yy6XCIsXG5cdCAgICBcIjcxMDMwNlwiOiBcIuWuieWNl+WMulwiLFxuXHQgICAgXCI3MTAzMDdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNzEwMzM5XCI6IFwi5rC45bq35Yy6XCIsXG5cdCAgICBcIjcxMDM0MFwiOiBcIuW9kuS7geWMulwiLFxuXHQgICAgXCI3MTAzNDFcIjogXCLmlrDljJbljLpcIixcblx0ICAgIFwiNzEwMzQyXCI6IFwi5bem6ZWH5Yy6XCIsXG5cdCAgICBcIjcxMDM0M1wiOiBcIueOieS6leWMulwiLFxuXHQgICAgXCI3MTAzNDRcIjogXCLmpaDopb/ljLpcIixcblx0ICAgIFwiNzEwMzQ1XCI6IFwi5Y2X5YyW5Yy6XCIsXG5cdCAgICBcIjcxMDM0NlwiOiBcIuS7geW+t+WMulwiLFxuXHQgICAgXCI3MTAzNDdcIjogXCLlhbPlupnljLpcIixcblx0ICAgIFwiNzEwMzQ4XCI6IFwi6b6Z5bSO5Yy6XCIsXG5cdCAgICBcIjcxMDM0OVwiOiBcIuWumOeUsOWMulwiLFxuXHQgICAgXCI3MTAzNTBcIjogXCLpurvosYbljLpcIixcblx0ICAgIFwiNzEwMzUxXCI6IFwi5L2z6YeM5Yy6XCIsXG5cdCAgICBcIjcxMDM1MlwiOiBcIuilv+a4r+WMulwiLFxuXHQgICAgXCI3MTAzNTNcIjogXCLkuIPogqHljLpcIixcblx0ICAgIFwiNzEwMzU0XCI6IFwi5bCG5Yab5Yy6XCIsXG5cdCAgICBcIjcxMDM1NVwiOiBcIuWtpueUsuWMulwiLFxuXHQgICAgXCI3MTAzNTZcIjogXCLljJfpl6jljLpcIixcblx0ICAgIFwiNzEwMzU3XCI6IFwi5paw6JCl5Yy6XCIsXG5cdCAgICBcIjcxMDM1OFwiOiBcIuWQjuWjgeWMulwiLFxuXHQgICAgXCI3MTAzNTlcIjogXCLnmb3msrPljLpcIixcblx0ICAgIFwiNzEwMzYwXCI6IFwi5Lic5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDM2MVwiOiBcIuWFreeUsuWMulwiLFxuXHQgICAgXCI3MTAzNjJcIjogXCLkuIvokKXljLpcIixcblx0ICAgIFwiNzEwMzYzXCI6IFwi5p+z6JCl5Yy6XCIsXG5cdCAgICBcIjcxMDM2NFwiOiBcIuebkOawtOWMulwiLFxuXHQgICAgXCI3MTAzNjVcIjogXCLlloTljJbljLpcIixcblx0ICAgIFwiNzEwMzY2XCI6IFwi5aSn5YaF5Yy6XCIsXG5cdCAgICBcIjcxMDM2N1wiOiBcIuWxseS4iuWMulwiLFxuXHQgICAgXCI3MTAzNjhcIjogXCLmlrDluILljLpcIixcblx0ICAgIFwiNzEwMzY5XCI6IFwi5a6J5a6a5Yy6XCIsXG5cdCAgICBcIjcxMDQwMFwiOiBcIuWPsOS4reW4glwiLFxuXHQgICAgXCI3MTA0MDFcIjogXCLkuK3ljLpcIixcblx0ICAgIFwiNzEwNDAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDQwM1wiOiBcIuWNl+WMulwiLFxuXHQgICAgXCI3MTA0MDRcIjogXCLopb/ljLpcIixcblx0ICAgIFwiNzEwNDA1XCI6IFwi5YyX5Yy6XCIsXG5cdCAgICBcIjcxMDQwNlwiOiBcIuWMl+Wxr+WMulwiLFxuXHQgICAgXCI3MTA0MDdcIjogXCLopb/lsa/ljLpcIixcblx0ICAgIFwiNzEwNDA4XCI6IFwi5Y2X5bGv5Yy6XCIsXG5cdCAgICBcIjcxMDQwOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTA0MzFcIjogXCLlpKrlubPljLpcIixcblx0ICAgIFwiNzEwNDMyXCI6IFwi5aSn6YeM5Yy6XCIsXG5cdCAgICBcIjcxMDQzM1wiOiBcIumbvuWzsOWMulwiLFxuXHQgICAgXCI3MTA0MzRcIjogXCLkuYzml6XljLpcIixcblx0ICAgIFwiNzEwNDM1XCI6IFwi5Liw5Y6f5Yy6XCIsXG5cdCAgICBcIjcxMDQzNlwiOiBcIuWQjumHjOWMulwiLFxuXHQgICAgXCI3MTA0MzdcIjogXCLnn7PlhojljLpcIixcblx0ICAgIFwiNzEwNDM4XCI6IFwi5Lic5Yq/5Yy6XCIsXG5cdCAgICBcIjcxMDQzOVwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCI3MTA0NDBcIjogXCLmlrDnpL7ljLpcIixcblx0ICAgIFwiNzEwNDQxXCI6IFwi5r2t5a2Q5Yy6XCIsXG5cdCAgICBcIjcxMDQ0MlwiOiBcIuWkp+mbheWMulwiLFxuXHQgICAgXCI3MTA0NDNcIjogXCLnpZ7lhojljLpcIixcblx0ICAgIFwiNzEwNDQ0XCI6IFwi5aSn6IKa5Yy6XCIsXG5cdCAgICBcIjcxMDQ0NVwiOiBcIuaymem5v+WMulwiLFxuXHQgICAgXCI3MTA0NDZcIjogXCLpvpnkupXljLpcIixcblx0ICAgIFwiNzEwNDQ3XCI6IFwi5qKn5qCW5Yy6XCIsXG5cdCAgICBcIjcxMDQ0OFwiOiBcIua4heawtOWMulwiLFxuXHQgICAgXCI3MTA0NDlcIjogXCLlpKfnlLLljLpcIixcblx0ICAgIFwiNzEwNDUwXCI6IFwi5aSW5Z+U5Yy6XCIsXG5cdCAgICBcIjcxMDQ1MVwiOiBcIuWkp+WuieWMulwiLFxuXHQgICAgXCI3MTA1MDBcIjogXCLph5Hpl6jljr9cIixcblx0ICAgIFwiNzEwNTA3XCI6IFwi6YeR5rKZ6ZWHXCIsXG5cdCAgICBcIjcxMDUwOFwiOiBcIumHkea5lumVh1wiLFxuXHQgICAgXCI3MTA1MDlcIjogXCLph5HlroHkuaFcIixcblx0ICAgIFwiNzEwNTEwXCI6IFwi6YeR5Z+O6ZWHXCIsXG5cdCAgICBcIjcxMDUxMVwiOiBcIueDiOWxv+S5oVwiLFxuXHQgICAgXCI3MTA1MTJcIjogXCLkuYzlnbXkuaFcIixcblx0ICAgIFwiNzEwNjAwXCI6IFwi5Y2X5oqV5Y6/XCIsXG5cdCAgICBcIjcxMDYxNFwiOiBcIuWNl+aKleW4glwiLFxuXHQgICAgXCI3MTA2MTVcIjogXCLkuK3lr67kuaFcIixcblx0ICAgIFwiNzEwNjE2XCI6IFwi6I2J5bGv6ZWHXCIsXG5cdCAgICBcIjcxMDYxN1wiOiBcIuWbveWnk+S5oVwiLFxuXHQgICAgXCI3MTA2MThcIjogXCLln5Tph4zplYdcIixcblx0ICAgIFwiNzEwNjE5XCI6IFwi5LuB54ix5LmhXCIsXG5cdCAgICBcIjcxMDYyMFwiOiBcIuWQjemXtOS5oVwiLFxuXHQgICAgXCI3MTA2MjFcIjogXCLpm4bpm4bplYdcIixcblx0ICAgIFwiNzEwNjIyXCI6IFwi5rC06YeM5LmhXCIsXG5cdCAgICBcIjcxMDYyM1wiOiBcIumxvOaxoOS5oVwiLFxuXHQgICAgXCI3MTA2MjRcIjogXCLkv6HkuYnkuaFcIixcblx0ICAgIFwiNzEwNjI1XCI6IFwi56u55bGx6ZWHXCIsXG5cdCAgICBcIjcxMDYyNlwiOiBcIum5v+iwt+S5oVwiLFxuXHQgICAgXCI3MTA3MDBcIjogXCLln7rpmobluIJcIixcblx0ICAgIFwiNzEwNzAxXCI6IFwi5LuB54ix5Yy6XCIsXG5cdCAgICBcIjcxMDcwMlwiOiBcIuS/oeS5ieWMulwiLFxuXHQgICAgXCI3MTA3MDNcIjogXCLkuK3mraPljLpcIixcblx0ICAgIFwiNzEwNzA0XCI6IFwi5Lit5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDcwNVwiOiBcIuWuieS5kOWMulwiLFxuXHQgICAgXCI3MTA3MDZcIjogXCLmmpbmmpbljLpcIixcblx0ICAgIFwiNzEwNzA3XCI6IFwi5LiD5aC15Yy6XCIsXG5cdCAgICBcIjcxMDcwOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTA4MDBcIjogXCLmlrDnq7nluIJcIixcblx0ICAgIFwiNzEwODAxXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDgwMlwiOiBcIuWMl+WMulwiLFxuXHQgICAgXCI3MTA4MDNcIjogXCLpppnlsbHljLpcIixcblx0ICAgIFwiNzEwODA0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjcxMDkwMFwiOiBcIuWYieS5ieW4glwiLFxuXHQgICAgXCI3MTA5MDFcIjogXCLkuJzljLpcIixcblx0ICAgIFwiNzEwOTAyXCI6IFwi6KW/5Yy6XCIsXG5cdCAgICBcIjcxMDkwM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTExMDBcIjogXCLmlrDljJfluIJcIixcblx0ICAgIFwiNzExMTMwXCI6IFwi5LiH6YeM5Yy6XCIsXG5cdCAgICBcIjcxMTEzMVwiOiBcIumHkeWxseWMulwiLFxuXHQgICAgXCI3MTExMzJcIjogXCLmnb/moaXljLpcIixcblx0ICAgIFwiNzExMTMzXCI6IFwi5rGQ5q2i5Yy6XCIsXG5cdCAgICBcIjcxMTEzNFwiOiBcIua3seWdkeWMulwiLFxuXHQgICAgXCI3MTExMzVcIjogXCLnn7PnoofljLpcIixcblx0ICAgIFwiNzExMTM2XCI6IFwi55Ge6Iqz5Yy6XCIsXG5cdCAgICBcIjcxMTEzN1wiOiBcIuW5s+a6quWMulwiLFxuXHQgICAgXCI3MTExMzhcIjogXCLlj4zmuqrljLpcIixcblx0ICAgIFwiNzExMTM5XCI6IFwi6LSh5a+u5Yy6XCIsXG5cdCAgICBcIjcxMTE0MFwiOiBcIuaWsOW6l+WMulwiLFxuXHQgICAgXCI3MTExNDFcIjogXCLlnarmnpfljLpcIixcblx0ICAgIFwiNzExMTQyXCI6IFwi5LmM5p2l5Yy6XCIsXG5cdCAgICBcIjcxMTE0M1wiOiBcIuawuOWSjOWMulwiLFxuXHQgICAgXCI3MTExNDRcIjogXCLkuK3lkozljLpcIixcblx0ICAgIFwiNzExMTQ1XCI6IFwi5Zyf5Z+O5Yy6XCIsXG5cdCAgICBcIjcxMTE0NlwiOiBcIuS4ieWzoeWMulwiLFxuXHQgICAgXCI3MTExNDdcIjogXCLmoJHmnpfljLpcIixcblx0ICAgIFwiNzExMTQ4XCI6IFwi6I665q2M5Yy6XCIsXG5cdCAgICBcIjcxMTE0OVwiOiBcIuS4iemHjeWMulwiLFxuXHQgICAgXCI3MTExNTBcIjogXCLmlrDluoTljLpcIixcblx0ICAgIFwiNzExMTUxXCI6IFwi5rOw5bGx5Yy6XCIsXG5cdCAgICBcIjcxMTE1MlwiOiBcIuael+WPo+WMulwiLFxuXHQgICAgXCI3MTExNTNcIjogXCLoiqbmtLLljLpcIixcblx0ICAgIFwiNzExMTU0XCI6IFwi5LqU6IKh5Yy6XCIsXG5cdCAgICBcIjcxMTE1NVwiOiBcIuWFq+mHjOWMulwiLFxuXHQgICAgXCI3MTExNTZcIjogXCLmt6HmsLTljLpcIixcblx0ICAgIFwiNzExMTU3XCI6IFwi5LiJ6Iqd5Yy6XCIsXG5cdCAgICBcIjcxMTE1OFwiOiBcIuefs+mXqOWMulwiLFxuXHQgICAgXCI3MTEyMDBcIjogXCLlrpzlhbDljr9cIixcblx0ICAgIFwiNzExMjE0XCI6IFwi5a6c5YWw5biCXCIsXG5cdCAgICBcIjcxMTIxNVwiOiBcIuWktOWfjumVh1wiLFxuXHQgICAgXCI3MTEyMTZcIjogXCLnpIHmuqrkuaFcIixcblx0ICAgIFwiNzExMjE3XCI6IFwi5aOu5Zu05LmhXCIsXG5cdCAgICBcIjcxMTIxOFwiOiBcIuWRmOWxseS5oVwiLFxuXHQgICAgXCI3MTEyMTlcIjogXCLnvZfkuJzplYdcIixcblx0ICAgIFwiNzExMjIwXCI6IFwi5LiJ5pif5LmhXCIsXG5cdCAgICBcIjcxMTIyMVwiOiBcIuWkp+WQjOS5oVwiLFxuXHQgICAgXCI3MTEyMjJcIjogXCLkupTnu5PkuaFcIixcblx0ICAgIFwiNzExMjIzXCI6IFwi5Yas5bGx5LmhXCIsXG5cdCAgICBcIjcxMTIyNFwiOiBcIuiLj+a+s+mVh1wiLFxuXHQgICAgXCI3MTEyMjVcIjogXCLljZfmvrPkuaFcIixcblx0ICAgIFwiNzExMjI2XCI6IFwi6ZKT6bG85Y+wXCIsXG5cdCAgICBcIjcxMTMwMFwiOiBcIuaWsOerueWOv1wiLFxuXHQgICAgXCI3MTEzMTRcIjogXCLnq7nljJfluIJcIixcblx0ICAgIFwiNzExMzE1XCI6IFwi5rmW5Y+j5LmhXCIsXG5cdCAgICBcIjcxMTMxNlwiOiBcIuaWsOS4sOS5oVwiLFxuXHQgICAgXCI3MTEzMTdcIjogXCLmlrDln5TplYdcIixcblx0ICAgIFwiNzExMzE4XCI6IFwi5YWz6KW/6ZWHXCIsXG5cdCAgICBcIjcxMTMxOVwiOiBcIuiKjuael+S5oVwiLFxuXHQgICAgXCI3MTEzMjBcIjogXCLlrp3lsbHkuaFcIixcblx0ICAgIFwiNzExMzIxXCI6IFwi56u55Lic6ZWHXCIsXG5cdCAgICBcIjcxMTMyMlwiOiBcIuS6lOWzsOS5oVwiLFxuXHQgICAgXCI3MTEzMjNcIjogXCLmqKrlsbHkuaFcIixcblx0ICAgIFwiNzExMzI0XCI6IFwi5bCW55+z5LmhXCIsXG5cdCAgICBcIjcxMTMyNVwiOiBcIuWMl+WflOS5oVwiLFxuXHQgICAgXCI3MTEzMjZcIjogXCLls6jnnInkuaFcIixcblx0ICAgIFwiNzExNDAwXCI6IFwi5qGD5Zut5Y6/XCIsXG5cdCAgICBcIjcxMTQxNFwiOiBcIuS4reWdnOW4glwiLFxuXHQgICAgXCI3MTE0MTVcIjogXCLlubPplYfluIJcIixcblx0ICAgIFwiNzExNDE2XCI6IFwi6b6Z5r2t5LmhXCIsXG5cdCAgICBcIjcxMTQxN1wiOiBcIuadqOaiheW4glwiLFxuXHQgICAgXCI3MTE0MThcIjogXCLmlrDlsYvkuaFcIixcblx0ICAgIFwiNzExNDE5XCI6IFwi6KeC6Z+z5LmhXCIsXG5cdCAgICBcIjcxMTQyMFwiOiBcIuahg+WbreW4glwiLFxuXHQgICAgXCI3MTE0MjFcIjogXCLpvp/lsbHkuaFcIixcblx0ICAgIFwiNzExNDIyXCI6IFwi5YWr5b635biCXCIsXG5cdCAgICBcIjcxMTQyM1wiOiBcIuWkp+a6qumVh1wiLFxuXHQgICAgXCI3MTE0MjRcIjogXCLlpI3lhbTkuaFcIixcblx0ICAgIFwiNzExNDI1XCI6IFwi5aSn5Zut5LmhXCIsXG5cdCAgICBcIjcxMTQyNlwiOiBcIuiKpuerueS5oVwiLFxuXHQgICAgXCI3MTE1MDBcIjogXCLoi5fmoJfljr9cIixcblx0ICAgIFwiNzExNTE5XCI6IFwi56u55Y2X6ZWHXCIsXG5cdCAgICBcIjcxMTUyMFwiOiBcIuWktOS7vemVh1wiLFxuXHQgICAgXCI3MTE1MjFcIjogXCLkuInmub7kuaFcIixcblx0ICAgIFwiNzExNTIyXCI6IFwi5Y2X5bqE5LmhXCIsXG5cdCAgICBcIjcxMTUyM1wiOiBcIueLrua9reS5oVwiLFxuXHQgICAgXCI3MTE1MjRcIjogXCLlkI7pvpnplYdcIixcblx0ICAgIFwiNzExNTI1XCI6IFwi6YCa6ZyE6ZWHXCIsXG5cdCAgICBcIjcxMTUyNlwiOiBcIuiLkemHjOmVh1wiLFxuXHQgICAgXCI3MTE1MjdcIjogXCLoi5fmoJfluIJcIixcblx0ICAgIFwiNzExNTI4XCI6IFwi6YCg5qGl5LmhXCIsXG5cdCAgICBcIjcxMTUyOVwiOiBcIuWktOWxi+S5oVwiLFxuXHQgICAgXCI3MTE1MzBcIjogXCLlhazppobkuaFcIixcblx0ICAgIFwiNzExNTMxXCI6IFwi5aSn5rmW5LmhXCIsXG5cdCAgICBcIjcxMTUzMlwiOiBcIuazsOWuieS5oVwiLFxuXHQgICAgXCI3MTE1MzNcIjogXCLpk5zplKPkuaFcIixcblx0ICAgIFwiNzExNTM0XCI6IFwi5LiJ5LmJ5LmhXCIsXG5cdCAgICBcIjcxMTUzNVwiOiBcIuilv+a5luS5oVwiLFxuXHQgICAgXCI3MTE1MzZcIjogXCLljZPlhbDplYdcIixcblx0ICAgIFwiNzExNzAwXCI6IFwi5b2w5YyW5Y6/XCIsXG5cdCAgICBcIjcxMTcyN1wiOiBcIuW9sOWMluW4glwiLFxuXHQgICAgXCI3MTE3MjhcIjogXCLoiqzlm63kuaFcIixcblx0ICAgIFwiNzExNzI5XCI6IFwi6Iqx5Z2b5LmhXCIsXG5cdCAgICBcIjcxMTczMFwiOiBcIuengOawtOS5oVwiLFxuXHQgICAgXCI3MTE3MzFcIjogXCLpub/muK/plYdcIixcblx0ICAgIFwiNzExNzMyXCI6IFwi56aP5YW05LmhXCIsXG5cdCAgICBcIjcxMTczM1wiOiBcIue6v+ilv+S5oVwiLFxuXHQgICAgXCI3MTE3MzRcIjogXCLlkoznvo7plYdcIixcblx0ICAgIFwiNzExNzM1XCI6IFwi5Ly45riv5LmhXCIsXG5cdCAgICBcIjcxMTczNlwiOiBcIuWRmOael+mVh1wiLFxuXHQgICAgXCI3MTE3MzdcIjogXCLnpL7lpLTkuaFcIixcblx0ICAgIFwiNzExNzM4XCI6IFwi5rC46Z2W5LmhXCIsXG5cdCAgICBcIjcxMTczOVwiOiBcIuWflOW/g+S5oVwiLFxuXHQgICAgXCI3MTE3NDBcIjogXCLmuqrmuZbplYdcIixcblx0ICAgIFwiNzExNzQxXCI6IFwi5aSn5p2R5LmhXCIsXG5cdCAgICBcIjcxMTc0MlwiOiBcIuWflOebkOS5oVwiLFxuXHQgICAgXCI3MTE3NDNcIjogXCLnlLDkuK3plYdcIixcblx0ICAgIFwiNzExNzQ0XCI6IFwi5YyX5paX6ZWHXCIsXG5cdCAgICBcIjcxMTc0NVwiOiBcIueUsOWwvuS5oVwiLFxuXHQgICAgXCI3MTE3NDZcIjogXCLln6TlpLTkuaFcIixcblx0ICAgIFwiNzExNzQ3XCI6IFwi5rqq5bee5LmhXCIsXG5cdCAgICBcIjcxMTc0OFwiOiBcIuerueWhmOS5oVwiLFxuXHQgICAgXCI3MTE3NDlcIjogXCLkuozmnpfplYdcIixcblx0ICAgIFwiNzExNzUwXCI6IFwi5aSn5Z+O5LmhXCIsXG5cdCAgICBcIjcxMTc1MVwiOiBcIuiKs+iLkeS5oVwiLFxuXHQgICAgXCI3MTE3NTJcIjogXCLkuozmsLTkuaFcIixcblx0ICAgIFwiNzExOTAwXCI6IFwi5ZiJ5LmJ5Y6/XCIsXG5cdCAgICBcIjcxMTkxOVwiOiBcIueVqui3r+S5oVwiLFxuXHQgICAgXCI3MTE5MjBcIjogXCLmooXlsbHkuaFcIixcblx0ICAgIFwiNzExOTIxXCI6IFwi56u55bSO5LmhXCIsXG5cdCAgICBcIjcxMTkyMlwiOiBcIumYv+mHjOWxseS5oVwiLFxuXHQgICAgXCI3MTE5MjNcIjogXCLkuK3ln5TkuaFcIixcblx0ICAgIFwiNzExOTI0XCI6IFwi5aSn5Z+U5LmhXCIsXG5cdCAgICBcIjcxMTkyNVwiOiBcIuawtOS4iuS5oVwiLFxuXHQgICAgXCI3MTE5MjZcIjogXCLpub/ojYnkuaFcIixcblx0ICAgIFwiNzExOTI3XCI6IFwi5aSq5L+d5biCXCIsXG5cdCAgICBcIjcxMTkyOFwiOiBcIuactOWtkOW4glwiLFxuXHQgICAgXCI3MTE5MjlcIjogXCLkuJznn7PkuaFcIixcblx0ICAgIFwiNzExOTMwXCI6IFwi5YWt6ISa5LmhXCIsXG5cdCAgICBcIjcxMTkzMVwiOiBcIuaWsOa4r+S5oVwiLFxuXHQgICAgXCI3MTE5MzJcIjogXCLmsJHpm4TkuaFcIixcblx0ICAgIFwiNzExOTMzXCI6IFwi5aSn5p6X6ZWHXCIsXG5cdCAgICBcIjcxMTkzNFwiOiBcIua6quWPo+S5oVwiLFxuXHQgICAgXCI3MTE5MzVcIjogXCLkuYnnq7nkuaFcIixcblx0ICAgIFwiNzExOTM2XCI6IFwi5biD6KKL6ZWHXCIsXG5cdCAgICBcIjcxMjEwMFwiOiBcIuS6keael+WOv1wiLFxuXHQgICAgXCI3MTIxMjFcIjogXCLmlpfljZfplYdcIixcblx0ICAgIFwiNzEyMTIyXCI6IFwi5aSn5Z+k5LmhXCIsXG5cdCAgICBcIjcxMjEyM1wiOiBcIuiZjuWwvumVh1wiLFxuXHQgICAgXCI3MTIxMjRcIjogXCLlnJ/lupPplYdcIixcblx0ICAgIFwiNzEyMTI1XCI6IFwi6KSS5b+g5LmhXCIsXG5cdCAgICBcIjcxMjEyNlwiOiBcIuS4nOWKv+S5oVwiLFxuXHQgICAgXCI3MTIxMjdcIjogXCLlj7Dopb/kuaFcIixcblx0ICAgIFwiNzEyMTI4XCI6IFwi5LuR6IOM5LmhXCIsXG5cdCAgICBcIjcxMjEyOVwiOiBcIum6puWvruS5oVwiLFxuXHQgICAgXCI3MTIxMzBcIjogXCLmlpflha3luIJcIixcblx0ICAgIFwiNzEyMTMxXCI6IFwi5p6X5YaF5LmhXCIsXG5cdCAgICBcIjcxMjEzMlwiOiBcIuWPpOWdkeS5oVwiLFxuXHQgICAgXCI3MTIxMzNcIjogXCLojr/moZDkuaFcIixcblx0ICAgIFwiNzEyMTM0XCI6IFwi6KW/6J666ZWHXCIsXG5cdCAgICBcIjcxMjEzNVwiOiBcIuS6jOS7keS5oVwiLFxuXHQgICAgXCI3MTIxMzZcIjogXCLljJfmuK/plYdcIixcblx0ICAgIFwiNzEyMTM3XCI6IFwi5rC05p6X5LmhXCIsXG5cdCAgICBcIjcxMjEzOFwiOiBcIuWPo+a5luS5oVwiLFxuXHQgICAgXCI3MTIxMzlcIjogXCLlm5vmuZbkuaFcIixcblx0ICAgIFwiNzEyMTQwXCI6IFwi5YWD6ZW/5LmhXCIsXG5cdCAgICBcIjcxMjQwMFwiOiBcIuWxj+S4nOWOv1wiLFxuXHQgICAgXCI3MTI0MzRcIjogXCLlsY/kuJzluIJcIixcblx0ICAgIFwiNzEyNDM1XCI6IFwi5LiJ5Zyw6Zeo5LmhXCIsXG5cdCAgICBcIjcxMjQzNlwiOiBcIumbvuWPsOS5oVwiLFxuXHQgICAgXCI3MTI0MzdcIjogXCLnjpvlrrbkuaFcIixcblx0ICAgIFwiNzEyNDM4XCI6IFwi5Lmd5aaC5LmhXCIsXG5cdCAgICBcIjcxMjQzOVwiOiBcIumHjOa4r+S5oVwiLFxuXHQgICAgXCI3MTI0NDBcIjogXCLpq5jmoJHkuaFcIixcblx0ICAgIFwiNzEyNDQxXCI6IFwi55uQ5Z+U5LmhXCIsXG5cdCAgICBcIjcxMjQ0MlwiOiBcIumVv+ayu+S5oVwiLFxuXHQgICAgXCI3MTI0NDNcIjogXCLpup/mtJvkuaFcIixcblx0ICAgIFwiNzEyNDQ0XCI6IFwi56u555Sw5LmhXCIsXG5cdCAgICBcIjcxMjQ0NVwiOiBcIuWGheWflOS5oVwiLFxuXHQgICAgXCI3MTI0NDZcIjogXCLkuIfkuLnkuaFcIixcblx0ICAgIFwiNzEyNDQ3XCI6IFwi5r2u5bee6ZWHXCIsXG5cdCAgICBcIjcxMjQ0OFwiOiBcIuazsOatpuS5oVwiLFxuXHQgICAgXCI3MTI0NDlcIjogXCLmnaXkuYnkuaFcIixcblx0ICAgIFwiNzEyNDUwXCI6IFwi5LiH5bOm5LmhXCIsXG5cdCAgICBcIjcxMjQ1MVwiOiBcIuW0gemhtuS5oVwiLFxuXHQgICAgXCI3MTI0NTJcIjogXCLmlrDln6TkuaFcIixcblx0ICAgIFwiNzEyNDUzXCI6IFwi5Y2X5bee5LmhXCIsXG5cdCAgICBcIjcxMjQ1NFwiOiBcIuael+i+ueS5oVwiLFxuXHQgICAgXCI3MTI0NTVcIjogXCLkuJzmuK/plYdcIixcblx0ICAgIFwiNzEyNDU2XCI6IFwi55CJ55CD5LmhXCIsXG5cdCAgICBcIjcxMjQ1N1wiOiBcIuS9s+WGrOS5oVwiLFxuXHQgICAgXCI3MTI0NThcIjogXCLmlrDlm63kuaFcIixcblx0ICAgIFwiNzEyNDU5XCI6IFwi5p6L5a+u5LmhXCIsXG5cdCAgICBcIjcxMjQ2MFwiOiBcIuaei+WxseS5oVwiLFxuXHQgICAgXCI3MTI0NjFcIjogXCLmmKXml6XkuaFcIixcblx0ICAgIFwiNzEyNDYyXCI6IFwi54uu5a2Q5LmhXCIsXG5cdCAgICBcIjcxMjQ2M1wiOiBcIui9puWfjuS5oVwiLFxuXHQgICAgXCI3MTI0NjRcIjogXCLniaHkuLnkuaFcIixcblx0ICAgIFwiNzEyNDY1XCI6IFwi5oGS5pil6ZWHXCIsXG5cdCAgICBcIjcxMjQ2NlwiOiBcIua7oeW3nuS5oVwiLFxuXHQgICAgXCI3MTI1MDBcIjogXCLlj7DkuJzljr9cIixcblx0ICAgIFwiNzEyNTE3XCI6IFwi5Y+w5Lic5biCXCIsXG5cdCAgICBcIjcxMjUxOFwiOiBcIue7v+Wym+S5oVwiLFxuXHQgICAgXCI3MTI1MTlcIjogXCLlhbDlsb/kuaFcIixcblx0ICAgIFwiNzEyNTIwXCI6IFwi5bu25bmz5LmhXCIsXG5cdCAgICBcIjcxMjUyMVwiOiBcIuWNkeWNl+S5oVwiLFxuXHQgICAgXCI3MTI1MjJcIjogXCLpub/ph47kuaFcIixcblx0ICAgIFwiNzEyNTIzXCI6IFwi5YWz5bGx6ZWHXCIsXG5cdCAgICBcIjcxMjUyNFwiOiBcIua1t+err+S5oVwiLFxuXHQgICAgXCI3MTI1MjVcIjogXCLmsaDkuIrkuaFcIixcblx0ICAgIFwiNzEyNTI2XCI6IFwi5Lic5rKz5LmhXCIsXG5cdCAgICBcIjcxMjUyN1wiOiBcIuaIkOWKn+mVh1wiLFxuXHQgICAgXCI3MTI1MjhcIjogXCLplb/mu6jkuaFcIixcblx0ICAgIFwiNzEyNTI5XCI6IFwi6YeR5bOw5LmhXCIsXG5cdCAgICBcIjcxMjUzMFwiOiBcIuWkp+atpuS5oVwiLFxuXHQgICAgXCI3MTI1MzFcIjogXCLovr7ku4HkuaFcIixcblx0ICAgIFwiNzEyNTMyXCI6IFwi5aSq6bq76YeM5LmhXCIsXG5cdCAgICBcIjcxMjYwMFwiOiBcIuiKseiOsuWOv1wiLFxuXHQgICAgXCI3MTI2MTVcIjogXCLoirHojrLluIJcIixcblx0ICAgIFwiNzEyNjE2XCI6IFwi5paw5Z+O5LmhXCIsXG5cdCAgICBcIjcxMjYxN1wiOiBcIuWkqumygemYgVwiLFxuXHQgICAgXCI3MTI2MThcIjogXCLnp4DmnpfkuaFcIixcblx0ICAgIFwiNzEyNjE5XCI6IFwi5ZCJ5a6J5LmhXCIsXG5cdCAgICBcIjcxMjYyMFwiOiBcIuWvv+S4sOS5oVwiLFxuXHQgICAgXCI3MTI2MjFcIjogXCLlh6TmnpfplYdcIixcblx0ICAgIFwiNzEyNjIyXCI6IFwi5YWJ5aSN5LmhXCIsXG5cdCAgICBcIjcxMjYyM1wiOiBcIuS4sOa7qOS5oVwiLFxuXHQgICAgXCI3MTI2MjRcIjogXCLnkZ7nqZfkuaFcIixcblx0ICAgIFwiNzEyNjI1XCI6IFwi5LiH6I2j5LmhXCIsXG5cdCAgICBcIjcxMjYyNlwiOiBcIueOiemHjOmVh1wiLFxuXHQgICAgXCI3MTI2MjdcIjogXCLljZPmuqrkuaFcIixcblx0ICAgIFwiNzEyNjI4XCI6IFwi5a+M6YeM5LmhXCIsXG5cdCAgICBcIjcxMjcwMFwiOiBcIua+jua5luWOv1wiLFxuXHQgICAgXCI3MTI3MDdcIjogXCLpqazlhazluIJcIixcblx0ICAgIFwiNzEyNzA4XCI6IFwi6KW/5bG/5LmhXCIsXG5cdCAgICBcIjcxMjcwOVwiOiBcIuacm+WuieS5oVwiLFxuXHQgICAgXCI3MTI3MTBcIjogXCLkuIPnvo7kuaFcIixcblx0ICAgIFwiNzEyNzExXCI6IFwi55m95rKZ5LmhXCIsXG5cdCAgICBcIjcxMjcxMlwiOiBcIua5luilv+S5oVwiLFxuXHQgICAgXCI3MTI4MDBcIjogXCLov57msZ/ljr9cIixcblx0ICAgIFwiNzEyODA1XCI6IFwi5Y2X56u/5LmhXCIsXG5cdCAgICBcIjcxMjgwNlwiOiBcIuWMl+erv+S5oVwiLFxuXHQgICAgXCI3MTI4MDdcIjogXCLojpLlhYnkuaFcIixcblx0ICAgIFwiNzEyODA4XCI6IFwi5Lic5byV5LmhXCIsXG5cdCAgICBcIjgxMDAwMFwiOiBcIummmea4r+eJueWIq+ihjOaUv+WMulwiLFxuXHQgICAgXCI4MTAxMDBcIjogXCLpppnmuK/lsptcIixcblx0ICAgIFwiODEwMTAxXCI6IFwi5Lit6KW/5Yy6XCIsXG5cdCAgICBcIjgxMDEwMlwiOiBcIua5vuS7lFwiLFxuXHQgICAgXCI4MTAxMDNcIjogXCLkuJzljLpcIixcblx0ICAgIFwiODEwMTA0XCI6IFwi5Y2X5Yy6XCIsXG5cdCAgICBcIjgxMDIwMFwiOiBcIuS5nem+mVwiLFxuXHQgICAgXCI4MTAyMDFcIjogXCLkuZ3pvpnln47ljLpcIixcblx0ICAgIFwiODEwMjAyXCI6IFwi5rK55bCW5pe65Yy6XCIsXG5cdCAgICBcIjgxMDIwM1wiOiBcIua3seawtOWfl+WMulwiLFxuXHQgICAgXCI4MTAyMDRcIjogXCLpu4TlpKfku5nljLpcIixcblx0ICAgIFwiODEwMjA1XCI6IFwi6KeC5aGY5Yy6XCIsXG5cdCAgICBcIjgxMDMwMFwiOiBcIuaWsOeVjFwiLFxuXHQgICAgXCI4MTAzMDFcIjogXCLljJfljLpcIixcblx0ICAgIFwiODEwMzAyXCI6IFwi5aSn5Z+U5Yy6XCIsXG5cdCAgICBcIjgxMDMwM1wiOiBcIuaymeeUsOWMulwiLFxuXHQgICAgXCI4MTAzMDRcIjogXCLopb/otKHljLpcIixcblx0ICAgIFwiODEwMzA1XCI6IFwi5YWD5pyX5Yy6XCIsXG5cdCAgICBcIjgxMDMwNlwiOiBcIuWxr+mXqOWMulwiLFxuXHQgICAgXCI4MTAzMDdcIjogXCLojYPmub7ljLpcIixcblx0ICAgIFwiODEwMzA4XCI6IFwi6JG16Z2S5Yy6XCIsXG5cdCAgICBcIjgxMDMwOVwiOiBcIuemu+Wym+WMulwiLFxuXHQgICAgXCI4MjAwMDBcIjogXCLmvrPpl6jnibnliKvooYzmlL/ljLpcIixcblx0ICAgIFwiODIwMTAwXCI6IFwi5r6z6Zeo5Y2K5bKbXCIsXG5cdCAgICBcIjgyMDIwMFwiOiBcIuemu+Wym1wiLFxuXHQgICAgXCI5OTAwMDBcIjogXCLmtbflpJZcIixcblx0ICAgIFwiOTkwMTAwXCI6IFwi5rW35aSWXCJcblx0fVxuXG5cdC8vIGlkIHBpZC9wYXJlbnRJZCBuYW1lIGNoaWxkcmVuXG5cdGZ1bmN0aW9uIHRyZWUobGlzdCkge1xuXHQgICAgdmFyIG1hcHBlZCA9IHt9XG5cdCAgICBmb3IgKHZhciBpID0gMCwgaXRlbTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBpdGVtID0gbGlzdFtpXVxuXHQgICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5pZCkgY29udGludWVcblx0ICAgICAgICBtYXBwZWRbaXRlbS5pZF0gPSBpdGVtXG5cdCAgICB9XG5cblx0ICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxpc3QubGVuZ3RoOyBpaSsrKSB7XG5cdCAgICAgICAgaXRlbSA9IGxpc3RbaWldXG5cblx0ICAgICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlXG5cdCAgICAgICAgICAgIC8qIGpzaGludCAtVzA0MSAqL1xuXHQgICAgICAgIGlmIChpdGVtLnBpZCA9PSB1bmRlZmluZWQgJiYgaXRlbS5wYXJlbnRJZCA9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICAgICAgY29udGludWVcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHBhcmVudCA9IG1hcHBlZFtpdGVtLnBpZF0gfHwgbWFwcGVkW2l0ZW0ucGFyZW50SWRdXG5cdCAgICAgICAgaWYgKCFwYXJlbnQpIGNvbnRpbnVlXG5cdCAgICAgICAgaWYgKCFwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbiA9IFtdXG5cdCAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goaXRlbSlcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRcblx0fVxuXG5cdHZhciBESUNUX0ZJWEVEID0gZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgZml4ZWQgPSBbXVxuXHQgICAgZm9yICh2YXIgaWQgaW4gRElDVCkge1xuXHQgICAgICAgIHZhciBwaWQgPSBpZC5zbGljZSgyLCA2KSA9PT0gJzAwMDAnID8gdW5kZWZpbmVkIDpcblx0ICAgICAgICAgICAgaWQuc2xpY2UoNCwgNikgPT0gJzAwJyA/IChpZC5zbGljZSgwLCAyKSArICcwMDAwJykgOlxuXHQgICAgICAgICAgICBpZC5zbGljZSgwLCA0KSArICcwMCdcblx0ICAgICAgICBmaXhlZC5wdXNoKHtcblx0ICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICBwaWQ6IHBpZCxcblx0ICAgICAgICAgICAgbmFtZTogRElDVFtpZF1cblx0ICAgICAgICB9KVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRyZWUoZml4ZWQpXG5cdH0oKVxuXG5cdG1vZHVsZS5leHBvcnRzID0gRElDVF9GSVhFRFxuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIE1pc2NlbGxhbmVvdXNcblx0Ki9cblx0dmFyIERJQ1QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHQvLyBEaWNlXG5cdFx0ZDQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA0KVxuXHRcdH0sXG5cdFx0ZDY6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA2KVxuXHRcdH0sXG5cdFx0ZDg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA4KVxuXHRcdH0sXG5cdFx0ZDEyOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdHVyYWwoMSwgMTIpXG5cdFx0fSxcblx0XHRkMjA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCAyMClcblx0XHR9LFxuXHRcdGQxMDA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCAxMDApXG5cdFx0fSxcblx0XHQvKlxuXHRcdCAgICDpmo/mnLrnlJ/miJDkuIDkuKogR1VJROOAglxuXG5cdFx0ICAgIGh0dHA6Ly93d3cuYnJvb2ZhLmNvbS8yMDA4LzA5L2phdmFzY3JpcHQtdXVpZC1mdW5jdGlvbi9cblx0XHQgICAgW1VVSUQg6KeE6IyDXShodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dClcblx0XHQgICAgICAgIFVVSURzIChVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllcilcblx0XHQgICAgICAgIEdVSURzIChHbG9iYWxseSBVbmlxdWUgSURlbnRpZmllcilcblx0XHQgICAgICAgIFRoZSBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGUgVVVJRCBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIGZvbGxvd2luZyBBQk5GIFs3XTpcblx0XHQgICAgICAgICAgICBVVUlEICAgICAgICAgICAgICAgICAgID0gdGltZS1sb3cgXCItXCIgdGltZS1taWQgXCItXCJcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUtaGlnaC1hbmQtdmVyc2lvbiBcIi1cIlxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2VxLWFuZC1yZXNlcnZlZFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2VxLWxvdyBcIi1cIiBub2RlXG5cdFx0ICAgICAgICAgICAgdGltZS1sb3cgICAgICAgICAgICAgICA9IDRoZXhPY3RldFxuXHRcdCAgICAgICAgICAgIHRpbWUtbWlkICAgICAgICAgICAgICAgPSAyaGV4T2N0ZXRcblx0XHQgICAgICAgICAgICB0aW1lLWhpZ2gtYW5kLXZlcnNpb24gID0gMmhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgY2xvY2stc2VxLWFuZC1yZXNlcnZlZCA9IGhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgY2xvY2stc2VxLWxvdyAgICAgICAgICA9IGhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgbm9kZSAgICAgICAgICAgICAgICAgICA9IDZoZXhPY3RldFxuXHRcdCAgICAgICAgICAgIGhleE9jdGV0ICAgICAgICAgICAgICAgPSBoZXhEaWdpdCBoZXhEaWdpdFxuXHRcdCAgICAgICAgICAgIGhleERpZ2l0ID1cblx0XHQgICAgICAgICAgICAgICAgXCIwXCIgLyBcIjFcIiAvIFwiMlwiIC8gXCIzXCIgLyBcIjRcIiAvIFwiNVwiIC8gXCI2XCIgLyBcIjdcIiAvIFwiOFwiIC8gXCI5XCIgL1xuXHRcdCAgICAgICAgICAgICAgICBcImFcIiAvIFwiYlwiIC8gXCJjXCIgLyBcImRcIiAvIFwiZVwiIC8gXCJmXCIgL1xuXHRcdCAgICAgICAgICAgICAgICBcIkFcIiAvIFwiQlwiIC8gXCJDXCIgLyBcIkRcIiAvIFwiRVwiIC8gXCJGXCJcblx0XHQgICAgXG5cdFx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS92aWN0b3JxdWlubi9jaGFuY2Vqcy9ibG9iL2RldmVsb3AvY2hhbmNlLmpzI0wxMzQ5XG5cdFx0Ki9cblx0XHRndWlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwb29sID0gXCJhYmNkZWZBQkNERUYxMjM0NTY3ODkwXCIsXG5cdFx0XHRcdGd1aWQgPSB0aGlzLnN0cmluZyhwb29sLCA4KSArICctJyArXG5cdFx0XHRcdHRoaXMuc3RyaW5nKHBvb2wsIDQpICsgJy0nICtcblx0XHRcdFx0dGhpcy5zdHJpbmcocG9vbCwgNCkgKyAnLScgK1xuXHRcdFx0XHR0aGlzLnN0cmluZyhwb29sLCA0KSArICctJyArXG5cdFx0XHRcdHRoaXMuc3RyaW5nKHBvb2wsIDEyKTtcblx0XHRcdHJldHVybiBndWlkXG5cdFx0fSxcblx0XHR1dWlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmd1aWQoKVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAg6ZqP5py655Sf5oiQ5LiA5LiqIDE4IOS9jei6q+S7veivgeOAglxuXG5cdFx0ICAgIFvouqvku73or4FdKGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8xNjk3Lmh0bSM0KVxuXHRcdCAgICAgICAg5Zyw5Z2A56CBIDYgKyDlh7rnlJ/ml6XmnJ/noIEgOCArIOmhuuW6j+eggSAzICsg5qCh6aqM56CBIDFcblx0XHQgICAgW+OAiuS4reWNjuS6uuawkeWFseWSjOWbveihjOaUv+WMuuWIkuS7o+eggeOAi+WbveWutuagh+WHhihHQi9UMjI2MCldKGh0dHA6Ly96aGlkYW8uYmFpZHUuY29tL3F1ZXN0aW9uLzE5NTQ1NjEuaHRtbClcblx0XHQqL1xuXHRcdGlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpZCxcblx0XHRcdFx0c3VtID0gMCxcblx0XHRcdFx0cmFuayA9IFtcblx0XHRcdFx0XHRcIjdcIiwgXCI5XCIsIFwiMTBcIiwgXCI1XCIsIFwiOFwiLCBcIjRcIiwgXCIyXCIsIFwiMVwiLCBcIjZcIiwgXCIzXCIsIFwiN1wiLCBcIjlcIiwgXCIxMFwiLCBcIjVcIiwgXCI4XCIsIFwiNFwiLCBcIjJcIlxuXHRcdFx0XHRdLFxuXHRcdFx0XHRsYXN0ID0gW1xuXHRcdFx0XHRcdFwiMVwiLCBcIjBcIiwgXCJYXCIsIFwiOVwiLCBcIjhcIiwgXCI3XCIsIFwiNlwiLCBcIjVcIiwgXCI0XCIsIFwiM1wiLCBcIjJcIlxuXHRcdFx0XHRdXG5cblx0XHRcdGlkID0gdGhpcy5waWNrKERJQ1QpLmlkICtcblx0XHRcdFx0dGhpcy5kYXRlKCd5eXl5TU1kZCcpICtcblx0XHRcdFx0dGhpcy5zdHJpbmcoJ251bWJlcicsIDMpXG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0c3VtICs9IGlkW2ldICogcmFua1tpXTtcblx0XHRcdH1cblx0XHRcdGlkICs9IGxhc3Rbc3VtICUgMTFdO1xuXG5cdFx0XHRyZXR1cm4gaWRcblx0XHR9LFxuXG5cdFx0Lypcblx0XHQgICAg55Sf5oiQ5LiA5Liq5YWo5bGA55qE6Ieq5aKe5pW05pWw44CCXG5cdFx0ICAgIOexu+S8vOiHquWinuS4u+mUru+8iGF1dG8gaW5jcmVtZW50IHByaW1hcnkga2V577yJ44CCXG5cdFx0Ki9cblx0XHRpbmNyZW1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGtleSA9IDBcblx0XHRcdHJldHVybiBmdW5jdGlvbihzdGVwKSB7XG5cdFx0XHRcdHJldHVybiBrZXkgKz0gKCtzdGVwIHx8IDEpIC8vIHN0ZXA/XG5cdFx0XHR9XG5cdFx0fSgpLFxuXHRcdGluYzogZnVuY3Rpb24oc3RlcCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5jcmVtZW50KHN0ZXApXG5cdFx0fVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgUGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSlcblx0dmFyIEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHRQYXJzZXI6IFBhcnNlcixcblx0XHRIYW5kbGVyOiBIYW5kbGVyXG5cdH1cblxuLyoqKi8gfSksXG4vKiAyMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9udXlzb2Z0L3JlZ2V4cFxuXHQvLyBmb3JrZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vRm9yYmVzTGluZGVzYXkvcmVnZXhwXG5cblx0ZnVuY3Rpb24gcGFyc2Uobikge1xuXHQgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIG4pIHtcblx0ICAgICAgICB2YXIgbCA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgcmVnZXhwIHRvIHBhcnNlIG11c3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXCIpO1xuXHQgICAgICAgIHRocm93IGw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gaW5kZXggPSAxLCBjZ3MgPSB7fSwgcGFyc2VyLnBhcnNlKG4pO1xuXHR9XG5cblx0ZnVuY3Rpb24gVG9rZW4obikge1xuXHQgICAgdGhpcy50eXBlID0gbiwgdGhpcy5vZmZzZXQgPSBUb2tlbi5vZmZzZXQoKSwgdGhpcy50ZXh0ID0gVG9rZW4udGV4dCgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gQWx0ZXJuYXRlKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJhbHRlcm5hdGVcIiksIHRoaXMubGVmdCA9IG4sIHRoaXMucmlnaHQgPSBsO1xuXHR9XG5cblx0ZnVuY3Rpb24gTWF0Y2gobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcIm1hdGNoXCIpLCB0aGlzLmJvZHkgPSBuLmZpbHRlcihCb29sZWFuKTtcblx0fVxuXG5cdGZ1bmN0aW9uIEdyb3VwKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgbiksIHRoaXMuYm9keSA9IGw7XG5cdH1cblxuXHRmdW5jdGlvbiBDYXB0dXJlR3JvdXAobikge1xuXHQgICAgR3JvdXAuY2FsbCh0aGlzLCBcImNhcHR1cmUtZ3JvdXBcIiksIHRoaXMuaW5kZXggPSBjZ3NbdGhpcy5vZmZzZXRdIHx8IChjZ3NbdGhpcy5vZmZzZXRdID0gaW5kZXgrKyksIFxuXHQgICAgdGhpcy5ib2R5ID0gbjtcblx0fVxuXG5cdGZ1bmN0aW9uIFF1YW50aWZpZWQobiwgbCkge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcInF1YW50aWZpZWRcIiksIHRoaXMuYm9keSA9IG4sIHRoaXMucXVhbnRpZmllciA9IGw7XG5cdH1cblxuXHRmdW5jdGlvbiBRdWFudGlmaWVyKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJxdWFudGlmaWVyXCIpLCB0aGlzLm1pbiA9IG4sIHRoaXMubWF4ID0gbCwgdGhpcy5ncmVlZHkgPSAhMDtcblx0fVxuXG5cdGZ1bmN0aW9uIENoYXJTZXQobiwgbCkge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImNoYXJzZXRcIiksIHRoaXMuaW52ZXJ0ID0gbiwgdGhpcy5ib2R5ID0gbDtcblx0fVxuXG5cdGZ1bmN0aW9uIENoYXJhY3RlclJhbmdlKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJyYW5nZVwiKSwgdGhpcy5zdGFydCA9IG4sIHRoaXMuZW5kID0gbDtcblx0fVxuXG5cdGZ1bmN0aW9uIExpdGVyYWwobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImxpdGVyYWxcIiksIHRoaXMuYm9keSA9IG4sIHRoaXMuZXNjYXBlZCA9IHRoaXMuYm9keSAhPSB0aGlzLnRleHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBVbmljb2RlKG4pIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJ1bmljb2RlXCIpLCB0aGlzLmNvZGUgPSBuLnRvVXBwZXJDYXNlKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBIZXgobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImhleFwiKSwgdGhpcy5jb2RlID0gbi50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gT2N0YWwobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcIm9jdGFsXCIpLCB0aGlzLmNvZGUgPSBuLnRvVXBwZXJDYXNlKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBCYWNrUmVmZXJlbmNlKG4pIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJiYWNrLXJlZmVyZW5jZVwiKSwgdGhpcy5jb2RlID0gbi50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gQ29udHJvbENoYXJhY3RlcihuKSB7XG5cdCAgICBUb2tlbi5jYWxsKHRoaXMsIFwiY29udHJvbC1jaGFyYWN0ZXJcIiksIHRoaXMuY29kZSA9IG4udG9VcHBlckNhc2UoKTtcblx0fVxuXG5cdHZhciBwYXJzZXIgPSBmdW5jdGlvbigpIHtcblx0ICAgIGZ1bmN0aW9uIG4obiwgbCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB1LnByb3RvdHlwZSA9IGwucHJvdG90eXBlLCBuLnByb3RvdHlwZSA9IG5ldyB1KCk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBsKG4sIGwsIHUsIHQsIHIpIHtcblx0ICAgICAgICBmdW5jdGlvbiBlKG4sIGwpIHtcblx0ICAgICAgICAgICAgZnVuY3Rpb24gdShuKSB7XG5cdCAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKG4pIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG4ucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXHgwOC9nLCBcIlxcXFxiXCIpLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLnJlcGxhY2UoL1xcZi9nLCBcIlxcXFxmXCIpLnJlcGxhY2UoL1xcci9nLCBcIlxcXFxyXCIpLnJlcGxhY2UoL1tcXHgwMC1cXHgwN1xceDBCXFx4MEVcXHgwRl0vZywgZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlxcXFx4MFwiICsgbChuKTtcblx0ICAgICAgICAgICAgICAgIH0pLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDgwLVxceEZGXS9nLCBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXFxcXHhcIiArIGwobik7XG5cdCAgICAgICAgICAgICAgICB9KS5yZXBsYWNlKC9bXFx1MDE4MC1cXHUwRkZGXS9nLCBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXFxcXHUwXCIgKyBsKG4pO1xuXHQgICAgICAgICAgICAgICAgfSkucmVwbGFjZSgvW1xcdTEwODAtXFx1RkZGRl0vZywgZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlxcXFx1XCIgKyBsKG4pO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHQsIHI7XG5cdCAgICAgICAgICAgIHN3aXRjaCAobi5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgICBjYXNlIDA6XG5cdCAgICAgICAgICAgICAgICB0ID0gXCJlbmQgb2YgaW5wdXRcIjtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgY2FzZSAxOlxuXHQgICAgICAgICAgICAgICAgdCA9IG5bMF07XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICB0ID0gbi5zbGljZSgwLCAtMSkuam9pbihcIiwgXCIpICsgXCIgb3IgXCIgKyBuW24ubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHIgPSBsID8gJ1wiJyArIHUobCkgKyAnXCInIDogXCJlbmQgb2YgaW5wdXRcIiwgXCJFeHBlY3RlZCBcIiArIHQgKyBcIiBidXQgXCIgKyByICsgXCIgZm91bmQuXCI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBuLCB0aGlzLmZvdW5kID0gbCwgdGhpcy5vZmZzZXQgPSB1LCB0aGlzLmxpbmUgPSB0LCB0aGlzLmNvbHVtbiA9IHIsIFxuXHQgICAgICAgIHRoaXMubmFtZSA9IFwiU3ludGF4RXJyb3JcIiwgdGhpcy5tZXNzYWdlID0gZShuLCBsKTtcblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHUobikge1xuXHQgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuLnN1YnN0cmluZyhMdCwgcXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB0KCkge1xuXHQgICAgICAgICAgICByZXR1cm4gTHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHIobCkge1xuXHQgICAgICAgICAgICBmdW5jdGlvbiB1KGwsIHUsIHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByLCBlO1xuXHQgICAgICAgICAgICAgICAgZm9yIChyID0gdTsgdCA+IHI7IHIrKykgZSA9IG4uY2hhckF0KHIpLCBcIlxcblwiID09PSBlID8gKGwuc2VlbkNSIHx8IGwubGluZSsrLCBsLmNvbHVtbiA9IDEsIFxuXHQgICAgICAgICAgICAgICAgbC5zZWVuQ1IgPSAhMSkgOiBcIlxcclwiID09PSBlIHx8IFwiXFx1MjAyOFwiID09PSBlIHx8IFwiXFx1MjAyOVwiID09PSBlID8gKGwubGluZSsrLCBsLmNvbHVtbiA9IDEsIFxuXHQgICAgICAgICAgICAgICAgbC5zZWVuQ1IgPSAhMCkgOiAobC5jb2x1bW4rKywgbC5zZWVuQ1IgPSAhMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIE10ICE9PSBsICYmIChNdCA+IGwgJiYgKE10ID0gMCwgRHQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiAxLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiAxLFxuXHQgICAgICAgICAgICAgICAgc2VlbkNSOiAhMVxuXHQgICAgICAgICAgICB9KSwgdShEdCwgTXQsIGwpLCBNdCA9IGwpLCBEdDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZShuKSB7XG5cdCAgICAgICAgICAgIEh0ID4gcXQgfHwgKHF0ID4gSHQgJiYgKEh0ID0gcXQsIE90ID0gW10pLCBPdC5wdXNoKG4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gbyhuKSB7XG5cdCAgICAgICAgICAgIHZhciBsID0gMDtcblx0ICAgICAgICAgICAgZm9yIChuLnNvcnQoKTsgbCA8IG4ubGVuZ3RoOyApIG5bbCAtIDFdID09PSBuW2xdID8gbi5zcGxpY2UobCwgMSkgOiBsKys7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGMoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCB1ID0gaSgpLCBudWxsICE9PSB1ID8gKHQgPSBxdCwgMTI0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBmbCwgXG5cdCAgICAgICAgICAgIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKHNsKSksIG51bGwgIT09IHIgPyAobyA9IGMoKSwgbnVsbCAhPT0gbyA/IChyID0gWyByLCBvIF0sIFxuXHQgICAgICAgICAgICB0ID0gcikgOiAocXQgPSB0LCB0ID0gaWwpKSA6IChxdCA9IHQsIHQgPSBpbCksIG51bGwgPT09IHQgJiYgKHQgPSBhbCksIG51bGwgIT09IHQgPyAoTHQgPSBsLCBcblx0ICAgICAgICAgICAgdSA9IGhsKHUsIHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gaSgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIGlmIChuID0gcXQsIGwgPSBmKCksIG51bGwgPT09IGwgJiYgKGwgPSBhbCksIG51bGwgIT09IGwpIGlmICh1ID0gcXQsIFd0KyssIHQgPSBkKCksIFxuXHQgICAgICAgICAgICBXdC0tLCBudWxsID09PSB0ID8gdSA9IGFsIDogKHF0ID0gdSwgdSA9IGlsKSwgbnVsbCAhPT0gdSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh0ID0gW10sIHIgPSBoKCksIG51bGwgPT09IHIgJiYgKHIgPSBhKCkpOyBudWxsICE9PSByOyApIHQucHVzaChyKSwgciA9IGgoKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSByICYmIChyID0gYSgpKTtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHQgPyAociA9IHMoKSwgbnVsbCA9PT0gciAmJiAociA9IGFsKSwgbnVsbCAhPT0gciA/IChMdCA9IG4sIGwgPSBkbChsLCB0LCByKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSBsID8gKHF0ID0gbiwgbiA9IGwpIDogbiA9IGwpIDogKHF0ID0gbiwgbiA9IGlsKSkgOiAocXQgPSBuLCBuID0gaWwpO1xuXHQgICAgICAgICAgICB9IGVsc2UgcXQgPSBuLCBuID0gaWw7IGVsc2UgcXQgPSBuLCBuID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBhKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSB4KCksIG51bGwgPT09IG4gJiYgKG4gPSBRKCksIG51bGwgPT09IG4gJiYgKG4gPSBCKCkpKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDk0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBwbCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUodmwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IHdsKCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHMoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAzNiA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gQWwsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKENsKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBnbCgpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBoKCkge1xuXHQgICAgICAgICAgICB2YXIgbiwgbCwgdTtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBxdCwgbCA9IGEoKSwgbnVsbCAhPT0gbCA/ICh1ID0gZCgpLCBudWxsICE9PSB1ID8gKEx0ID0gbiwgbCA9IGJsKGwsIHUpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbCA/IChxdCA9IG4sIG4gPSBsKSA6IG4gPSBsKSA6IChxdCA9IG4sIG4gPSBpbCkpIDogKHF0ID0gbiwgbiA9IGlsKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZCgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBuID0gcXQsIGwgPSBwKCksIG51bGwgIT09IGwgPyAodSA9IGsoKSwgbnVsbCA9PT0gdSAmJiAodSA9IGFsKSwgbnVsbCAhPT0gdSA/IChMdCA9IG4sIFxuXHQgICAgICAgICAgICBsID0gVGwobCwgdSksIG51bGwgPT09IGwgPyAocXQgPSBuLCBuID0gbCkgOiBuID0gbCkgOiAocXQgPSBuLCBuID0gaWwpKSA6IChxdCA9IG4sIFxuXHQgICAgICAgICAgICBuID0gaWwpLCBXdC0tLCBudWxsID09PSBuICYmIChsID0gbnVsbCwgMCA9PT0gV3QgJiYgZShrbCkpLCBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBwKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSB2KCksIG51bGwgPT09IG4gJiYgKG4gPSB3KCksIG51bGwgPT09IG4gJiYgKG4gPSBBKCksIG51bGwgPT09IG4gJiYgKG4gPSBDKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gZygpLCBudWxsID09PSBuICYmIChuID0gYigpKSkpKSksIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHYoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvLCBjO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAxMjMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IHhsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh5bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/ICh0ID0gVCgpLCBudWxsICE9PSB0ID8gKDQ0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBtbCwgcXQrKykgOiAociA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKFJsKSksIG51bGwgIT09IHIgPyAobyA9IFQoKSwgbnVsbCAhPT0gbyA/ICgxMjUgPT09IG4uY2hhckNvZGVBdChxdCkgPyAoYyA9IEZsLCBcblx0ICAgICAgICAgICAgcXQrKykgOiAoYyA9IG51bGwsIDAgPT09IFd0ICYmIGUoUWwpKSwgbnVsbCAhPT0gYyA/IChMdCA9IGwsIHUgPSBTbCh0LCBvKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB3KCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdSwgdCwgcjtcblx0ICAgICAgICAgICAgcmV0dXJuIGwgPSBxdCwgMTIzID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSB4bCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoeWwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IFQoKSwgbnVsbCAhPT0gdCA/IChuLnN1YnN0cihxdCwgMikgPT09IFVsID8gKHIgPSBVbCwgcXQgKz0gMikgOiAociA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKEVsKSksIG51bGwgIT09IHIgPyAoTHQgPSBsLCB1ID0gR2wodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEEoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAxMjMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IHhsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh5bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/ICh0ID0gVCgpLCBudWxsICE9PSB0ID8gKDEyNSA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/IChyID0gRmwsIHF0KyspIDogKHIgPSBudWxsLCBcblx0ICAgICAgICAgICAgMCA9PT0gV3QgJiYgZShRbCkpLCBudWxsICE9PSByID8gKEx0ID0gbCwgdSA9IEJsKHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBDKCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdTtcblx0ICAgICAgICAgICAgcmV0dXJuIGwgPSBxdCwgNDMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IGpsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSgkbCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gcWwoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDQyID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBMbCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoTWwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IERsKCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGIoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA2MyA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gSGwsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKE9sKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBXbCgpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBrKCkge1xuXHQgICAgICAgICAgICB2YXIgbDtcblx0ICAgICAgICAgICAgcmV0dXJuIDYzID09PSBuLmNoYXJDb2RlQXQocXQpID8gKGwgPSBIbCwgcXQrKykgOiAobCA9IG51bGwsIDAgPT09IFd0ICYmIGUoT2wpKSwgXG5cdCAgICAgICAgICAgIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFQoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICBpZiAobCA9IHF0LCB1ID0gW10sIHpsLnRlc3Qobi5jaGFyQXQocXQpKSA/ICh0ID0gbi5jaGFyQXQocXQpLCBxdCsrKSA6ICh0ID0gbnVsbCwgXG5cdCAgICAgICAgICAgIDAgPT09IFd0ICYmIGUoSWwpKSwgbnVsbCAhPT0gdCkgZm9yICg7bnVsbCAhPT0gdDsgKSB1LnB1c2godCksIHpsLnRlc3Qobi5jaGFyQXQocXQpKSA/ICh0ID0gbi5jaGFyQXQocXQpLCBcblx0ICAgICAgICAgICAgcXQrKykgOiAodCA9IG51bGwsIDAgPT09IFd0ICYmIGUoSWwpKTsgZWxzZSB1ID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBKbCh1KSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgXG5cdCAgICAgICAgICAgIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHgoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA0MCA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gS2wsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKE5sKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ID8gKHQgPSBSKCksIG51bGwgPT09IHQgJiYgKHQgPSBGKCksIG51bGwgPT09IHQgJiYgKHQgPSBtKCksIG51bGwgPT09IHQgJiYgKHQgPSB5KCkpKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKDQxID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBQbCwgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVmwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHIgPyAoTHQgPSBsLCB1ID0gWGwodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHkoKSB7XG5cdCAgICAgICAgICAgIHZhciBuLCBsO1xuXHQgICAgICAgICAgICByZXR1cm4gbiA9IHF0LCBsID0gYygpLCBudWxsICE9PSBsICYmIChMdCA9IG4sIGwgPSBZbChsKSksIG51bGwgPT09IGwgPyAocXQgPSBuLCBcblx0ICAgICAgICAgICAgbiA9IGwpIDogbiA9IGwsIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIG0oKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IFpsID8gKHUgPSBabCwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoX2wpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBudSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFIoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IGx1ID8gKHUgPSBsdSwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUodXUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSB0dSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEYoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IHJ1ID8gKHUgPSBydSwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZXUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBvdSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFEoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvO1xuXHQgICAgICAgICAgICBpZiAoV3QrKywgbCA9IHF0LCA5MSA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gaXUsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKGF1KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1KSBpZiAoOTQgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodCA9IHBsLCBxdCsrKSA6ICh0ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh2bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gdCAmJiAodCA9IGFsKSwgbnVsbCAhPT0gdCkge1xuXHQgICAgICAgICAgICAgICAgZm9yIChyID0gW10sIG8gPSBTKCksIG51bGwgPT09IG8gJiYgKG8gPSBVKCkpOyBudWxsICE9PSBvOyApIHIucHVzaChvKSwgbyA9IFMoKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSBvICYmIChvID0gVSgpKTtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHIgPyAoOTMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAobyA9IGZ1LCBxdCsrKSA6IChvID0gbnVsbCwgMCA9PT0gV3QgJiYgZShzdSkpLCBcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IG8gPyAoTHQgPSBsLCB1ID0gaHUodCwgciksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHF0ID0gbCwgbCA9IGlsOyBlbHNlIHF0ID0gbCwgbCA9IGlsO1xuXHQgICAgICAgICAgICByZXR1cm4gV3QtLSwgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoY3UpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gUygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBsID0gcXQsIHUgPSBVKCksIG51bGwgIT09IHUgPyAoNDUgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodCA9IHB1LCBxdCsrKSA6ICh0ID0gbnVsbCwgXG5cdCAgICAgICAgICAgIDAgPT09IFd0ICYmIGUodnUpKSwgbnVsbCAhPT0gdCA/IChyID0gVSgpLCBudWxsICE9PSByID8gKEx0ID0gbCwgdSA9IHd1KHUsIHIpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBXdC0tLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZHUpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVSgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGw7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBuID0gRygpLCBudWxsID09PSBuICYmIChuID0gRSgpKSwgV3QtLSwgbnVsbCA9PT0gbiAmJiAobCA9IG51bGwsIDAgPT09IFd0ICYmIGUoQXUpKSwgXG5cdCAgICAgICAgICAgIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEUoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBDdS50ZXN0KG4uY2hhckF0KHF0KSkgPyAodSA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZ3UpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IGJ1KHUpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBHKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBMKCksIG51bGwgPT09IG4gJiYgKG4gPSBZKCksIG51bGwgPT09IG4gJiYgKG4gPSBIKCksIG51bGwgPT09IG4gJiYgKG4gPSBPKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gVygpLCBudWxsID09PSBuICYmIChuID0geigpLCBudWxsID09PSBuICYmIChuID0gSSgpLCBudWxsID09PSBuICYmIChuID0gSigpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IEsoKSwgbnVsbCA9PT0gbiAmJiAobiA9IE4oKSwgbnVsbCA9PT0gbiAmJiAobiA9IFAoKSwgbnVsbCA9PT0gbiAmJiAobiA9IFYoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSBYKCksIG51bGwgPT09IG4gJiYgKG4gPSBfKCksIG51bGwgPT09IG4gJiYgKG4gPSBubCgpLCBudWxsID09PSBuICYmIChuID0gbGwoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSB1bCgpLCBudWxsID09PSBuICYmIChuID0gdGwoKSkpKSkpKSkpKSkpKSkpKSkpLCBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBCKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBqKCksIG51bGwgPT09IG4gJiYgKG4gPSBxKCksIG51bGwgPT09IG4gJiYgKG4gPSAkKCkpKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gaigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDQ2ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBrdSwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoVHUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IHh1KCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uICQoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gV3QrKywgbCA9IHF0LCBtdS50ZXN0KG4uY2hhckF0KHF0KSkgPyAodSA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodSA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKFJ1KSksIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IGJ1KHUpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBcblx0ICAgICAgICAgICAgV3QtLSwgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoeXUpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gcSgpIHtcblx0ICAgICAgICAgICAgdmFyIG47XG5cdCAgICAgICAgICAgIHJldHVybiBuID0gTSgpLCBudWxsID09PSBuICYmIChuID0gRCgpLCBudWxsID09PSBuICYmIChuID0gWSgpLCBudWxsID09PSBuICYmIChuID0gSCgpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IE8oKSwgbnVsbCA9PT0gbiAmJiAobiA9IFcoKSwgbnVsbCA9PT0gbiAmJiAobiA9IHooKSwgbnVsbCA9PT0gbiAmJiAobiA9IEkoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSBKKCksIG51bGwgPT09IG4gJiYgKG4gPSBLKCksIG51bGwgPT09IG4gJiYgKG4gPSBOKCksIG51bGwgPT09IG4gJiYgKG4gPSBQKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gVigpLCBudWxsID09PSBuICYmIChuID0gWCgpLCBudWxsID09PSBuICYmIChuID0gWigpLCBudWxsID09PSBuICYmIChuID0gXygpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IG5sKCksIG51bGwgPT09IG4gJiYgKG4gPSBsbCgpLCBudWxsID09PSBuICYmIChuID0gdWwoKSwgbnVsbCA9PT0gbiAmJiAobiA9IHRsKCkpKSkpKSkpKSkpKSkpKSkpKSkpLCBcblx0ICAgICAgICAgICAgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRnUgPyAodSA9IEZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShRdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gU3UoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRnUgPyAodSA9IEZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShRdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gVXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gRCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRXUgPyAodSA9IEV1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShHdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gQnUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0ganUgPyAodSA9IGp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSgkdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gcXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gTHUgPyAodSA9IEx1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShNdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gRHUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gSHUgPyAodSA9IEh1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShPdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gV3UoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24geigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0genUgPyAodSA9IHp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShJdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gSnUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gS3UgPyAodSA9IEt1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShOdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gUHUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVnUgPyAodSA9IFZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShYdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gWXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gWnUgPyAodSA9IFp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShfdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gbnQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gbHQgPyAodSA9IGx0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh1dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gdHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gUCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gcnQgPyAodSA9IHJ0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShldCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gb3QoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gY3QgPyAodSA9IGN0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShpdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gYXQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gZnQgPyAodSA9IGZ0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShzdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gaHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQ7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gZHQgPyAodSA9IGR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShwdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/IChuLmxlbmd0aCA+IHF0ID8gKHQgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHQgPSBudWxsLCAwID09PSBXdCAmJiBlKHZ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IHd0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQ7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDkyID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBBdCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoQ3QpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAoZ3QudGVzdChuLmNoYXJBdChxdCkpID8gKHQgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHQgPSBudWxsLCAwID09PSBXdCAmJiBlKGJ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IGt0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gXygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIGlmIChsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVHQgPyAodSA9IFR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh4dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHQgPSBbXSwgeXQudGVzdChuLmNoYXJBdChxdCkpID8gKHIgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKG10KSksIFxuXHQgICAgICAgICAgICAgICAgbnVsbCAhPT0gcikgZm9yICg7bnVsbCAhPT0gcjsgKSB0LnB1c2gociksIHl0LnRlc3Qobi5jaGFyQXQocXQpKSA/IChyID0gbi5jaGFyQXQocXQpLCBcblx0ICAgICAgICAgICAgICAgIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKG10KSk7IGVsc2UgdCA9IGlsO1xuXHQgICAgICAgICAgICAgICAgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBSdCh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICAgICAgbCA9IGlsKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHF0ID0gbCwgbCA9IGlsO1xuXHQgICAgICAgICAgICByZXR1cm4gbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gbmwoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICBpZiAobCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IEZ0ID8gKHUgPSBGdCwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoUXQpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0ID0gW10sIFN0LnRlc3Qobi5jaGFyQXQocXQpKSA/IChyID0gbi5jaGFyQXQocXQpLCBxdCsrKSA6IChyID0gbnVsbCwgMCA9PT0gV3QgJiYgZShVdCkpLCBcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHIpIGZvciAoO251bGwgIT09IHI7ICkgdC5wdXNoKHIpLCBTdC50ZXN0KG4uY2hhckF0KHF0KSkgPyAociA9IG4uY2hhckF0KHF0KSwgXG5cdCAgICAgICAgICAgICAgICBxdCsrKSA6IChyID0gbnVsbCwgMCA9PT0gV3QgJiYgZShVdCkpOyBlbHNlIHQgPSBpbDtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHQgPyAoTHQgPSBsLCB1ID0gRXQodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgICAgIGwgPSBpbCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBxdCA9IGwsIGwgPSBpbDtcblx0ICAgICAgICAgICAgcmV0dXJuIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGxsKCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdSwgdCwgcjtcblx0ICAgICAgICAgICAgaWYgKGwgPSBxdCwgbi5zdWJzdHIocXQsIDIpID09PSBHdCA/ICh1ID0gR3QsIHF0ICs9IDIpIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKEJ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodCA9IFtdLCBTdC50ZXN0KG4uY2hhckF0KHF0KSkgPyAociA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVXQpKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsICE9PSByKSBmb3IgKDtudWxsICE9PSByOyApIHQucHVzaChyKSwgU3QudGVzdChuLmNoYXJBdChxdCkpID8gKHIgPSBuLmNoYXJBdChxdCksIFxuXHQgICAgICAgICAgICAgICAgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVXQpKTsgZWxzZSB0ID0gaWw7XG5cdCAgICAgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IGp0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgICAgICBsID0gaWwpO1xuXHQgICAgICAgICAgICB9IGVsc2UgcXQgPSBsLCBsID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB1bCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVHQgPyAodSA9IFR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh4dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gJHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gdGwoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA5MiA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gQXQsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKEN0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ID8gKG4ubGVuZ3RoID4gcXQgPyAodCA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodCA9IG51bGwsIDAgPT09IFd0ICYmIGUodnQpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHQgPyAoTHQgPSBsLCB1ID0gYnUodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmwsIGVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB7fSwgb2wgPSB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogY1xuXHQgICAgICAgIH0sIGNsID0gYywgaWwgPSBudWxsLCBhbCA9IFwiXCIsIGZsID0gXCJ8XCIsIHNsID0gJ1wifFwiJywgaGwgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBsID8gbmV3IEFsdGVybmF0ZShuLCBsWzFdKSA6IG47XG5cdCAgICAgICAgfSwgZGwgPSBmdW5jdGlvbihuLCBsLCB1KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgTWF0Y2goWyBuIF0uY29uY2F0KGwpLmNvbmNhdChbIHUgXSkpO1xuXHQgICAgICAgIH0sIHBsID0gXCJeXCIsIHZsID0gJ1wiXlwiJywgd2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcInN0YXJ0XCIpO1xuXHQgICAgICAgIH0sIEFsID0gXCIkXCIsIENsID0gJ1wiJFwiJywgZ2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImVuZFwiKTtcblx0ICAgICAgICB9LCBibCA9IGZ1bmN0aW9uKG4sIGwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFudGlmaWVkKG4sIGwpO1xuXHQgICAgICAgIH0sIGtsID0gXCJRdWFudGlmaWVyXCIsIFRsID0gZnVuY3Rpb24obiwgbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbCAmJiAobi5ncmVlZHkgPSAhMSksIG47XG5cdCAgICAgICAgfSwgeGwgPSBcIntcIiwgeWwgPSAnXCJ7XCInLCBtbCA9IFwiLFwiLCBSbCA9ICdcIixcIicsIEZsID0gXCJ9XCIsIFFsID0gJ1wifVwiJywgU2wgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcihuLCBsKTtcblx0ICAgICAgICB9LCBVbCA9IFwiLH1cIiwgRWwgPSAnXCIsfVwiJywgR2wgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcihuLCAxLzApO1xuXHQgICAgICAgIH0sIEJsID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFF1YW50aWZpZXIobiwgbik7XG5cdCAgICAgICAgfSwgamwgPSBcIitcIiwgJGwgPSAnXCIrXCInLCBxbCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFF1YW50aWZpZXIoMSwgMS8wKTtcblx0ICAgICAgICB9LCBMbCA9IFwiKlwiLCBNbCA9ICdcIipcIicsIERsID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcigwLCAxLzApO1xuXHQgICAgICAgIH0sIEhsID0gXCI/XCIsIE9sID0gJ1wiP1wiJywgV2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFudGlmaWVyKDAsIDEpO1xuXHQgICAgICAgIH0sIHpsID0gL15bMC05XS8sIElsID0gXCJbMC05XVwiLCBKbCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuICtuLmpvaW4oXCJcIik7XG5cdCAgICAgICAgfSwgS2wgPSBcIihcIiwgTmwgPSAnXCIoXCInLCBQbCA9IFwiKVwiLCBWbCA9ICdcIilcIicsIFhsID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbjtcblx0ICAgICAgICB9LCBZbCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXB0dXJlR3JvdXAobik7XG5cdCAgICAgICAgfSwgWmwgPSBcIj86XCIsIF9sID0gJ1wiPzpcIicsIG51ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEdyb3VwKFwibm9uLWNhcHR1cmUtZ3JvdXBcIiwgbik7XG5cdCAgICAgICAgfSwgbHUgPSBcIj89XCIsIHV1ID0gJ1wiPz1cIicsIHR1ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEdyb3VwKFwicG9zaXRpdmUtbG9va2FoZWFkXCIsIG4pO1xuXHQgICAgICAgIH0sIHJ1ID0gXCI/IVwiLCBldSA9ICdcIj8hXCInLCBvdSA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm91cChcIm5lZ2F0aXZlLWxvb2thaGVhZFwiLCBuKTtcblx0ICAgICAgICB9LCBjdSA9IFwiQ2hhcmFjdGVyU2V0XCIsIGl1ID0gXCJbXCIsIGF1ID0gJ1wiW1wiJywgZnUgPSBcIl1cIiwgc3UgPSAnXCJdXCInLCBodSA9IGZ1bmN0aW9uKG4sIGwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyU2V0KCEhbiwgbCk7XG5cdCAgICAgICAgfSwgZHUgPSBcIkNoYXJhY3RlclJhbmdlXCIsIHB1ID0gXCItXCIsIHZ1ID0gJ1wiLVwiJywgd3UgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyUmFuZ2UobiwgbCk7XG5cdCAgICAgICAgfSwgQXUgPSBcIkNoYXJhY3RlclwiLCBDdSA9IC9eW15cXFxcXFxdXS8sIGd1ID0gXCJbXlxcXFxcXFxcXFxcXF1dXCIsIGJ1ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWwobik7XG5cdCAgICAgICAgfSwga3UgPSBcIi5cIiwgVHUgPSAnXCIuXCInLCB4dSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwiYW55LWNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9LCB5dSA9IFwiTGl0ZXJhbFwiLCBtdSA9IC9eW158XFxcXFxcLy5bKCk/KyokXFxeXS8sIFJ1ID0gXCJbXnxcXFxcXFxcXFxcXFwvLlsoKT8rKiRcXFxcXl1cIiwgRnUgPSBcIlxcXFxiXCIsIFF1ID0gJ1wiXFxcXFxcXFxiXCInLCBTdSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwiYmFja3NwYWNlXCIpO1xuXHQgICAgICAgIH0sIFV1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3b3JkLWJvdW5kYXJ5XCIpO1xuXHQgICAgICAgIH0sIEV1ID0gXCJcXFxcQlwiLCBHdSA9ICdcIlxcXFxcXFxcQlwiJywgQnUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi13b3JkLWJvdW5kYXJ5XCIpO1xuXHQgICAgICAgIH0sIGp1ID0gXCJcXFxcZFwiLCAkdSA9ICdcIlxcXFxcXFxcZFwiJywgcXUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImRpZ2l0XCIpO1xuXHQgICAgICAgIH0sIEx1ID0gXCJcXFxcRFwiLCBNdSA9ICdcIlxcXFxcXFxcRFwiJywgRHUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi1kaWdpdFwiKTtcblx0ICAgICAgICB9LCBIdSA9IFwiXFxcXGZcIiwgT3UgPSAnXCJcXFxcXFxcXGZcIicsIFd1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJmb3JtLWZlZWRcIik7XG5cdCAgICAgICAgfSwgenUgPSBcIlxcXFxuXCIsIEl1ID0gJ1wiXFxcXFxcXFxuXCInLCBKdSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwibGluZS1mZWVkXCIpO1xuXHQgICAgICAgIH0sIEt1ID0gXCJcXFxcclwiLCBOdSA9ICdcIlxcXFxcXFxcclwiJywgUHUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImNhcnJpYWdlLXJldHVyblwiKTtcblx0ICAgICAgICB9LCBWdSA9IFwiXFxcXHNcIiwgWHUgPSAnXCJcXFxcXFxcXHNcIicsIFl1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3aGl0ZS1zcGFjZVwiKTtcblx0ICAgICAgICB9LCBadSA9IFwiXFxcXFNcIiwgX3UgPSAnXCJcXFxcXFxcXFNcIicsIG50ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJub24td2hpdGUtc3BhY2VcIik7XG5cdCAgICAgICAgfSwgbHQgPSBcIlxcXFx0XCIsIHV0ID0gJ1wiXFxcXFxcXFx0XCInLCB0dCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwidGFiXCIpO1xuXHQgICAgICAgIH0sIHJ0ID0gXCJcXFxcdlwiLCBldCA9ICdcIlxcXFxcXFxcdlwiJywgb3QgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcInZlcnRpY2FsLXRhYlwiKTtcblx0ICAgICAgICB9LCBjdCA9IFwiXFxcXHdcIiwgaXQgPSAnXCJcXFxcXFxcXHdcIicsIGF0ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3b3JkXCIpO1xuXHQgICAgICAgIH0sIGZ0ID0gXCJcXFxcV1wiLCBzdCA9ICdcIlxcXFxcXFxcV1wiJywgaHQgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi13b3JkXCIpO1xuXHQgICAgICAgIH0sIGR0ID0gXCJcXFxcY1wiLCBwdCA9ICdcIlxcXFxcXFxcY1wiJywgdnQgPSBcImFueSBjaGFyYWN0ZXJcIiwgd3QgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbENoYXJhY3RlcihuKTtcblx0ICAgICAgICB9LCBBdCA9IFwiXFxcXFwiLCBDdCA9ICdcIlxcXFxcXFxcXCInLCBndCA9IC9eWzEtOV0vLCBidCA9IFwiWzEtOV1cIiwga3QgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1JlZmVyZW5jZShuKTtcblx0ICAgICAgICB9LCBUdCA9IFwiXFxcXDBcIiwgeHQgPSAnXCJcXFxcXFxcXDBcIicsIHl0ID0gL15bMC03XS8sIG10ID0gXCJbMC03XVwiLCBSdCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBPY3RhbChuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sIEZ0ID0gXCJcXFxceFwiLCBRdCA9ICdcIlxcXFxcXFxceFwiJywgU3QgPSAvXlswLTlhLWZBLUZdLywgVXQgPSBcIlswLTlhLWZBLUZdXCIsIEV0ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEhleChuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sIEd0ID0gXCJcXFxcdVwiLCBCdCA9ICdcIlxcXFxcXFxcdVwiJywganQgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVW5pY29kZShuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sICR0ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJudWxsLWNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9LCBxdCA9IDAsIEx0ID0gMCwgTXQgPSAwLCBEdCA9IHtcblx0ICAgICAgICAgICAgbGluZTogMSxcblx0ICAgICAgICAgICAgY29sdW1uOiAxLFxuXHQgICAgICAgICAgICBzZWVuQ1I6ICExXG5cdCAgICAgICAgfSwgSHQgPSAwLCBPdCA9IFtdLCBXdCA9IDA7XG5cdCAgICAgICAgaWYgKFwic3RhcnRSdWxlXCIgaW4gZWwpIHtcblx0ICAgICAgICAgICAgaWYgKCEoZWwuc3RhcnRSdWxlIGluIG9sKSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgZWwuc3RhcnRSdWxlICsgJ1wiLicpO1xuXHQgICAgICAgICAgICBjbCA9IG9sW2VsLnN0YXJ0UnVsZV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChUb2tlbi5vZmZzZXQgPSB0LCBUb2tlbi50ZXh0ID0gdSwgcmwgPSBjbCgpLCBudWxsICE9PSBybCAmJiBxdCA9PT0gbi5sZW5ndGgpIHJldHVybiBybDtcblx0ICAgICAgICB0aHJvdyBvKE90KSwgTHQgPSBNYXRoLm1heChxdCwgSHQpLCBuZXcgbChPdCwgTHQgPCBuLmxlbmd0aCA/IG4uY2hhckF0KEx0KSA6IG51bGwsIEx0LCByKEx0KS5saW5lLCByKEx0KS5jb2x1bW4pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG4obCwgRXJyb3IpLCB7XG5cdCAgICAgICAgU3ludGF4RXJyb3I6IGwsXG5cdCAgICAgICAgcGFyc2U6IHVcblx0ICAgIH07XG5cdH0oKSwgaW5kZXggPSAxLCBjZ3MgPSB7fTtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHBhcnNlclxuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIFJlZ0V4cCBIYW5kbGVyXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JiZXNMaW5kZXNheS9yZWdleHBcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kbWFqZGEvcGVnanNcblx0ICAgIGh0dHA6Ly93d3cucmVnZXhwZXIuY29tL1xuXG5cdCAgICDmr4/kuKroioLngrnnmoTnu5PmnoRcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6ICcnLFxuXHQgICAgICAgICAgICBvZmZzZXQ6IG51bWJlcixcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGJvZHk6IHt9LFxuXHQgICAgICAgICAgICBlc2NhcGVkOiB0cnVlL2ZhbHNlXG5cdCAgICAgICAgfVxuXG5cdCAgICB0eXBlIOWPr+mAieWAvFxuXHQgICAgICAgIGFsdGVybmF0ZSAgICAgICAgICAgICB8ICAgICAgICAg6YCJ5oupXG5cdCAgICAgICAgbWF0Y2ggICAgICAgICAgICAgICAgIOWMuemFjVxuXHQgICAgICAgIGNhcHR1cmUtZ3JvdXAgICAgICAgICAoKSAgICAgICAg5o2V6I6357uEXG5cdCAgICAgICAgbm9uLWNhcHR1cmUtZ3JvdXAgICAgICg/Oi4uLikgICDpnZ7mjZXojrfnu4Rcblx0ICAgICAgICBwb3NpdGl2ZS1sb29rYWhlYWQgICAgKD89cCkgICAgIOmbtuWuveato+WQkeWFiOihjOaWreiogFxuXHQgICAgICAgIG5lZ2F0aXZlLWxvb2thaGVhZCAgICAoPyFwKSAgICAg6Zu25a696LSf5ZCR5YWI6KGM5pat6KiAXG5cdCAgICAgICAgcXVhbnRpZmllZCAgICAgICAgICAgIGEqICAgICAgICDph43lpI3oioLngrlcblx0ICAgICAgICBxdWFudGlmaWVyICAgICAgICAgICAgKiAgICAgICAgIOmHj+ivjVxuXHQgICAgICAgIGNoYXJzZXQgICAgICAgICAgICAgICBbXSAgICAgICAg5a2X56ym6ZuGXG5cdCAgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgIHttLCBufSAgICDojIPlm7Rcblx0ICAgICAgICBsaXRlcmFsICAgICAgICAgICAgICAgYSAgICAgICAgIOebtOaOpemHj+Wtl+esplxuXHQgICAgICAgIHVuaWNvZGUgICAgICAgICAgICAgICBcXHV4eHh4ICAgIFVuaWNvZGVcblx0ICAgICAgICBoZXggICAgICAgICAgICAgICAgICAgXFx4ICAgICAgICDljYHlha3ov5vliLZcblx0ICAgICAgICBvY3RhbCAgICAgICAgICAgICAgICAg5YWr6L+b5Yi2XG5cdCAgICAgICAgYmFjay1yZWZlcmVuY2UgICAgICAgIFxcbiAgICAgICAg5Y+N5ZCR5byV55SoXG5cdCAgICAgICAgY29udHJvbC1jaGFyYWN0ZXIgICAgIFxcY1ggICAgICAg5o6n5Yi25a2X56ymXG5cblx0ICAgICAgICAvLyBUb2tlblxuXHQgICAgICAgIHN0YXJ0ICAgICAgICAgICAgICAgXiAgICAgICDlvIDlpLRcblx0ICAgICAgICBlbmQgICAgICAgICAgICAgICAgICQgICAgICAg57uT5bC+XG5cdCAgICAgICAgYW55LWNoYXJhY3RlciAgICAgICAuICAgICAgIOS7u+aEj+Wtl+esplxuXHQgICAgICAgIGJhY2tzcGFjZSAgICAgICAgICAgW1xcYl0gICAg6YCA5qC855u05o6l6YePXG5cdCAgICAgICAgd29yZC1ib3VuZGFyeSAgICAgICBcXGIgICAgICDljZXor43ovrnnlYxcblx0ICAgICAgICBub24td29yZC1ib3VuZGFyeSAgIFxcQiAgICAgIOmdnuWNleivjei+ueeVjFxuXHQgICAgICAgIGRpZ2l0ICAgICAgICAgICAgICAgXFxkICAgICAgQVNDSUkg5pWw5a2X77yMWzAtOV1cblx0ICAgICAgICBub24tZGlnaXQgICAgICAgICAgIFxcRCAgICAgIOmdniBBU0NJSSDmlbDlrZfvvIxbXjAtOV1cblx0ICAgICAgICBmb3JtLWZlZWQgICAgICAgICAgIFxcZiAgICAgIOaNoumhteesplxuXHQgICAgICAgIGxpbmUtZmVlZCAgICAgICAgICAgXFxuICAgICAg5o2i6KGM56ymXG5cdCAgICAgICAgY2FycmlhZ2UtcmV0dXJuICAgICBcXHIgICAgICDlm57ovabnrKZcblx0ICAgICAgICB3aGl0ZS1zcGFjZSAgICAgICAgIFxccyAgICAgIOepuueZveesplxuXHQgICAgICAgIG5vbi13aGl0ZS1zcGFjZSAgICAgXFxTICAgICAg6Z2e56m655m956ymXG5cdCAgICAgICAgdGFiICAgICAgICAgICAgICAgICBcXHQgICAgICDliLbooajnrKZcblx0ICAgICAgICB2ZXJ0aWNhbC10YWIgICAgICAgIFxcdiAgICAgIOWeguebtOWItuihqOesplxuXHQgICAgICAgIHdvcmQgICAgICAgICAgICAgICAgXFx3ICAgICAgQVNDSUkg5a2X56ym77yMW2EtekEtWjAtOV1cblx0ICAgICAgICBub24td29yZCAgICAgICAgICAgIFxcVyAgICAgIOmdniBBU0NJSSDlrZfnrKbvvIxbXmEtekEtWjAtOV1cblx0ICAgICAgICBudWxsLWNoYXJhY3RlciAgICAgIFxcbyAgICAgIE5VTCDlrZfnrKZcblx0ICovXG5cblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgICAvKlxuXHQgICAgICAgIFxuXHQgICAgKi9cblx0dmFyIEhhbmRsZXIgPSB7XG5cdCAgICBleHRlbmQ6IFV0aWwuZXh0ZW5kXG5cdH1cblxuXHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FTQ0lJI0FTQ0lJX3ByaW50YWJsZV9jb2RlX2NoYXJ0XG5cdC8qdmFyIEFTQ0lJX0NPTlRST0xfQ09ERV9DSEFSVCA9IHtcblx0ICAgICdAJzogWydcXHUwMDAwJ10sXG5cdCAgICBBOiBbJ1xcdTAwMDEnXSxcblx0ICAgIEI6IFsnXFx1MDAwMiddLFxuXHQgICAgQzogWydcXHUwMDAzJ10sXG5cdCAgICBEOiBbJ1xcdTAwMDQnXSxcblx0ICAgIEU6IFsnXFx1MDAwNSddLFxuXHQgICAgRjogWydcXHUwMDA2J10sXG5cdCAgICBHOiBbJ1xcdTAwMDcnLCAnXFxhJ10sXG5cdCAgICBIOiBbJ1xcdTAwMDgnLCAnXFxiJ10sXG5cdCAgICBJOiBbJ1xcdTAwMDknLCAnXFx0J10sXG5cdCAgICBKOiBbJ1xcdTAwMEEnLCAnXFxuJ10sXG5cdCAgICBLOiBbJ1xcdTAwMEInLCAnXFx2J10sXG5cdCAgICBMOiBbJ1xcdTAwMEMnLCAnXFxmJ10sXG5cdCAgICBNOiBbJ1xcdTAwMEQnLCAnXFxyJ10sXG5cdCAgICBOOiBbJ1xcdTAwMEUnXSxcblx0ICAgIE86IFsnXFx1MDAwRiddLFxuXHQgICAgUDogWydcXHUwMDEwJ10sXG5cdCAgICBROiBbJ1xcdTAwMTEnXSxcblx0ICAgIFI6IFsnXFx1MDAxMiddLFxuXHQgICAgUzogWydcXHUwMDEzJ10sXG5cdCAgICBUOiBbJ1xcdTAwMTQnXSxcblx0ICAgIFU6IFsnXFx1MDAxNSddLFxuXHQgICAgVjogWydcXHUwMDE2J10sXG5cdCAgICBXOiBbJ1xcdTAwMTcnXSxcblx0ICAgIFg6IFsnXFx1MDAxOCddLFxuXHQgICAgWTogWydcXHUwMDE5J10sXG5cdCAgICBaOiBbJ1xcdTAwMUEnXSxcblx0ICAgICdbJzogWydcXHUwMDFCJywgJ1xcZSddLFxuXHQgICAgJ1xcXFwnOiBbJ1xcdTAwMUMnXSxcblx0ICAgICddJzogWydcXHUwMDFEJ10sXG5cdCAgICAnXic6IFsnXFx1MDAxRSddLFxuXHQgICAgJ18nOiBbJ1xcdTAwMUYnXVxuXHR9Ki9cblxuXHQvLyBBU0NJSSBwcmludGFibGUgY29kZSBjaGFydFxuXHQvLyB2YXIgTE9XRVIgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cdC8vIHZhciBVUFBFUiA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidcblx0Ly8gdmFyIE5VTUJFUiA9ICcwMTIzNDU2Nzg5J1xuXHQvLyB2YXIgU1lNQk9MID0gJyAhXCIjJCUmXFwnKCkqKywtLi8nICsgJzo7PD0+P0AnICsgJ1tcXFxcXV5fYCcgKyAne3x9fidcblx0dmFyIExPV0VSID0gYXNjaWkoOTcsIDEyMilcblx0dmFyIFVQUEVSID0gYXNjaWkoNjUsIDkwKVxuXHR2YXIgTlVNQkVSID0gYXNjaWkoNDgsIDU3KVxuXHR2YXIgT1RIRVIgPSBhc2NpaSgzMiwgNDcpICsgYXNjaWkoNTgsIDY0KSArIGFzY2lpKDkxLCA5NikgKyBhc2NpaSgxMjMsIDEyNikgLy8g5o6S6ZmkIDk1IF8gYXNjaWkoOTEsIDk0KSArIGFzY2lpKDk2LCA5Nilcblx0dmFyIFBSSU5UQUJMRSA9IGFzY2lpKDMyLCAxMjYpXG5cdHZhciBTUEFDRSA9ICcgXFxmXFxuXFxyXFx0XFx2XFx1MDBBMFxcdTIwMjhcXHUyMDI5J1xuXHR2YXIgQ0hBUkFDVEVSX0NMQVNTRVMgPSB7XG5cdCAgICAnXFxcXHcnOiBMT1dFUiArIFVQUEVSICsgTlVNQkVSICsgJ18nLCAvLyBhc2NpaSg5NSwgOTUpXG5cdCAgICAnXFxcXFcnOiBPVEhFUi5yZXBsYWNlKCdfJywgJycpLFxuXHQgICAgJ1xcXFxzJzogU1BBQ0UsXG5cdCAgICAnXFxcXFMnOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gUFJJTlRBQkxFXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTUEFDRS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShTUEFDRVtpXSwgJycpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0oKSxcblx0ICAgICdcXFxcZCc6IE5VTUJFUixcblx0ICAgICdcXFxcRCc6IExPV0VSICsgVVBQRVIgKyBPVEhFUlxuXHR9XG5cblx0ZnVuY3Rpb24gYXNjaWkoZnJvbSwgdG8pIHtcblx0ICAgIHZhciByZXN1bHQgPSAnJ1xuXHQgICAgZm9yICh2YXIgaSA9IGZyb207IGkgPD0gdG87IGkrKykge1xuXHQgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0XG5cdH1cblxuXHQvLyB2YXIgYXN0ID0gUmVnRXhwUGFyc2VyLnBhcnNlKHJlZ2V4cC5zb3VyY2UpXG5cdEhhbmRsZXIuZ2VuID0gZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgY2FjaGUgPSBjYWNoZSB8fCB7XG5cdCAgICAgICAgZ3VpZDogMVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIEhhbmRsZXJbbm9kZS50eXBlXSA/IEhhbmRsZXJbbm9kZS50eXBlXShub2RlLCByZXN1bHQsIGNhY2hlKSA6XG5cdCAgICAgICAgSGFuZGxlci50b2tlbihub2RlLCByZXN1bHQsIGNhY2hlKVxuXHR9XG5cblx0SGFuZGxlci5leHRlbmQoe1xuXHQgICAgLyoganNoaW50IHVudXNlZDpmYWxzZSAqL1xuXHQgICAgdG9rZW46IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICdzdGFydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gJydcblx0ICAgICAgICAgICAgY2FzZSAnYW55LWNoYXJhY3Rlcic6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLmNoYXJhY3RlcigpXG5cdCAgICAgICAgICAgIGNhc2UgJ2JhY2tzcGFjZSc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gJydcblx0ICAgICAgICAgICAgY2FzZSAnd29yZC1ib3VuZGFyeSc6IC8vIFRPRE9cblx0ICAgICAgICAgICAgICAgIHJldHVybiAnJ1xuXHQgICAgICAgICAgICBjYXNlICdub24td29yZC1ib3VuZGFyeSc6IC8vIFRPRE9cblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ2RpZ2l0Jzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBOVU1CRVIuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ25vbi1kaWdpdCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soXG5cdCAgICAgICAgICAgICAgICAgICAgKExPV0VSICsgVVBQRVIgKyBPVEhFUikuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ2Zvcm0tZmVlZCc6XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICdsaW5lLWZlZWQnOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuYm9keSB8fCBub2RlLnRleHRcblx0ICAgICAgICAgICAgY2FzZSAnY2FycmlhZ2UtcmV0dXJuJzpcblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ3doaXRlLXNwYWNlJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBTUEFDRS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbm9uLXdoaXRlLXNwYWNlJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICAoTE9XRVIgKyBVUFBFUiArIE5VTUJFUikuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ3RhYic6XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbC10YWInOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAnd29yZCc6IC8vIFxcdyBbYS16QS1aMC05XVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmRvbS5waWNrKFxuXHQgICAgICAgICAgICAgICAgICAgIChMT1dFUiArIFVQUEVSICsgTlVNQkVSKS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbm9uLXdvcmQnOiAvLyBcXFcgW15hLXpBLVowLTldXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soXG5cdCAgICAgICAgICAgICAgICAgICAgT1RIRVIucmVwbGFjZSgnXycsICcnKS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbnVsbC1jaGFyYWN0ZXInOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG5vZGUuYm9keSB8fCBub2RlLnRleHRcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogJ2FsdGVybmF0ZScsXG5cdCAgICAgICAgICAgIG9mZnNldDogMCxcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGxlZnQ6IHtcblx0ICAgICAgICAgICAgICAgIGJveWQ6IFtdXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHJpZ2h0OiB7XG5cdCAgICAgICAgICAgICAgICBib3lkOiBbXVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIGFsdGVybmF0ZTogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUubGVmdC9yaWdodCB7fVxuXHQgICAgICAgIHJldHVybiB0aGlzLmdlbihcblx0ICAgICAgICAgICAgUmFuZG9tLmJvb2xlYW4oKSA/IG5vZGUubGVmdCA6IG5vZGUucmlnaHQsXG5cdCAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgY2FjaGVcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLypcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdtYXRjaCcsXG5cdCAgICAgICAgICAgIG9mZnNldDogMCxcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGJvZHk6IFtdXG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIG1hdGNoOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgcmVzdWx0ID0gJydcblx0ICAgICAgICAgICAgLy8gbm9kZS5ib2R5IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmJvZHkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuZ2VuKG5vZGUuYm9keVtpXSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8vICgpXG5cdCAgICAnY2FwdHVyZS1ncm91cCc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICAvLyBub2RlLmJvZHkge31cblx0ICAgICAgICByZXN1bHQgPSB0aGlzLmdlbihub2RlLmJvZHksIHJlc3VsdCwgY2FjaGUpXG5cdCAgICAgICAgY2FjaGVbY2FjaGUuZ3VpZCsrXSA9IHJlc3VsdFxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICAvLyAoPzouLi4pXG5cdCAgICAnbm9uLWNhcHR1cmUtZ3JvdXAnOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgLy8gbm9kZS5ib2R5IHt9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZ2VuKG5vZGUuYm9keSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgIH0sXG5cdCAgICAvLyAoPz1wKVxuXHQgICAgJ3Bvc2l0aXZlLWxvb2thaGVhZCc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICAvLyBub2RlLmJvZHlcblx0ICAgICAgICByZXR1cm4gdGhpcy5nZW4obm9kZS5ib2R5LCByZXN1bHQsIGNhY2hlKVxuXHQgICAgfSxcblx0ICAgIC8vICg/IXApXG5cdCAgICAnbmVnYXRpdmUtbG9va2FoZWFkJzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUuYm9keVxuXHQgICAgICAgIHJldHVybiAnJ1xuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiAncXVhbnRpZmllZCcsXG5cdCAgICAgICAgICAgIG9mZnNldDogMyxcblx0ICAgICAgICAgICAgdGV4dDogJ2MqJyxcblx0ICAgICAgICAgICAgYm9keToge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0OiAzLFxuXHQgICAgICAgICAgICAgICAgdGV4dDogJ2MnLFxuXHQgICAgICAgICAgICAgICAgYm9keTogJ2MnLFxuXHQgICAgICAgICAgICAgICAgZXNjYXBlZDogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcXVhbnRpZmllcjoge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogJ3F1YW50aWZpZXInLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0OiA0LFxuXHQgICAgICAgICAgICAgICAgdGV4dDogJyonLFxuXHQgICAgICAgICAgICAgICAgbWluOiAwLFxuXHQgICAgICAgICAgICAgICAgbWF4OiBJbmZpbml0eSxcblx0ICAgICAgICAgICAgICAgIGdyZWVkeTogdHJ1ZVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIHF1YW50aWZpZWQ6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXN1bHQgPSAnJ1xuXHQgICAgICAgICAgICAvLyBub2RlLnF1YW50aWZpZXIge31cblx0ICAgICAgICB2YXIgY291bnQgPSB0aGlzLnF1YW50aWZpZXIobm9kZS5xdWFudGlmaWVyKTtcblx0ICAgICAgICAvLyBub2RlLmJvZHkge31cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuZ2VuKG5vZGUuYm9keSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgcXVhbnRpZmllcjoge1xuXHQgICAgICAgICAgICB0eXBlOiAncXVhbnRpZmllcicsXG5cdCAgICAgICAgICAgIG9mZnNldDogNCxcblx0ICAgICAgICAgICAgdGV4dDogJyonLFxuXHQgICAgICAgICAgICBtaW46IDAsXG5cdCAgICAgICAgICAgIG1heDogSW5maW5pdHksXG5cdCAgICAgICAgICAgIGdyZWVkeTogdHJ1ZVxuXHQgICAgICAgIH1cblx0ICAgICovXG5cdCAgICBxdWFudGlmaWVyOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgdmFyIG1pbiA9IE1hdGgubWF4KG5vZGUubWluLCAwKVxuXHQgICAgICAgIHZhciBtYXggPSBpc0Zpbml0ZShub2RlLm1heCkgPyBub2RlLm1heCA6XG5cdCAgICAgICAgICAgIG1pbiArIFJhbmRvbS5pbnRlZ2VyKDMsIDcpXG5cdCAgICAgICAgcmV0dXJuIFJhbmRvbS5pbnRlZ2VyKG1pbiwgbWF4KVxuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgXG5cdCAgICAqL1xuXHQgICAgY2hhcnNldDogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUuaW52ZXJ0XG5cdCAgICAgICAgaWYgKG5vZGUuaW52ZXJ0KSByZXR1cm4gdGhpc1snaW52ZXJ0LWNoYXJzZXQnXShub2RlLCByZXN1bHQsIGNhY2hlKVxuXG5cdCAgICAgICAgLy8gbm9kZS5ib2R5IFtdXG5cdCAgICAgICAgdmFyIGxpdGVyYWwgPSBSYW5kb20ucGljayhub2RlLmJvZHkpXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZ2VuKGxpdGVyYWwsIHJlc3VsdCwgY2FjaGUpXG5cdCAgICB9LFxuXHQgICAgJ2ludmVydC1jaGFyc2V0JzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIHZhciBwb29sID0gUFJJTlRBQkxFXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIGl0ZW07IGkgPCBub2RlLmJvZHkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgaXRlbSA9IG5vZGUuYm9keVtpXVxuXHQgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnbGl0ZXJhbCc6XG5cdCAgICAgICAgICAgICAgICAgICAgcG9vbCA9IHBvb2wucmVwbGFjZShpdGVtLmJvZHksICcnKVxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMuZ2VuKGl0ZW0uc3RhcnQsIHJlc3VsdCwgY2FjaGUpLmNoYXJDb2RlQXQoKVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0aGlzLmdlbihpdGVtLmVuZCwgcmVzdWx0LCBjYWNoZSkuY2hhckNvZGVBdCgpXG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSBtaW47IGlpIDw9IG1heDsgaWkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gcG9vbC5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoaWkpLCAnJylcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXHQgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVycyA9IENIQVJBQ1RFUl9DTEFTU0VTW2l0ZW0udGV4dF1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaWkgPSAwOyBpaWkgPD0gY2hhcmFjdGVycy5sZW5ndGg7IGlpaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gcG9vbC5yZXBsYWNlKGNoYXJhY3RlcnNbaWlpXSwgJycpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFJhbmRvbS5waWNrKHBvb2wuc3BsaXQoJycpKVxuXHQgICAgfSxcblx0ICAgIHJhbmdlOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgLy8gbm9kZS5zdGFydCwgbm9kZS5lbmRcblx0ICAgICAgICB2YXIgbWluID0gdGhpcy5nZW4obm9kZS5zdGFydCwgcmVzdWx0LCBjYWNoZSkuY2hhckNvZGVBdCgpXG5cdCAgICAgICAgdmFyIG1heCA9IHRoaXMuZ2VuKG5vZGUuZW5kLCByZXN1bHQsIGNhY2hlKS5jaGFyQ29kZUF0KClcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgUmFuZG9tLmludGVnZXIobWluLCBtYXgpXG5cdCAgICAgICAgKVxuXHQgICAgfSxcblx0ICAgIGxpdGVyYWw6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gbm9kZS5lc2NhcGVkID8gbm9kZS5ib2R5IDogbm9kZS50ZXh0XG5cdCAgICB9LFxuXHQgICAgLy8gVW5pY29kZSBcXHVcblx0ICAgIHVuaWNvZGU6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCAxNilcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g5Y2B5YWt6L+b5Yi2IFxceEZGXG5cdCAgICBoZXg6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCAxNilcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g5YWr6L+b5Yi2IFxcMFxuXHQgICAgb2N0YWw6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCA4KVxuXHQgICAgICAgIClcblx0ICAgIH0sXG5cdCAgICAvLyDlj43lkJHlvJXnlKhcblx0ICAgICdiYWNrLXJlZmVyZW5jZSc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gY2FjaGVbbm9kZS5jb2RlXSB8fCAnJ1xuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DMF9hbmRfQzFfY29udHJvbF9jb2Rlc1xuXHQgICAgKi9cblx0ICAgIENPTlRST0xfQ0hBUkFDVEVSX01BUDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIENPTlRST0xfQ0hBUkFDVEVSID0gJ0AgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaIFsgXFxcXCBdIF4gXycuc3BsaXQoJyAnKVxuXHQgICAgICAgIHZhciBDT05UUk9MX0NIQVJBQ1RFUl9VTklDT0RFID0gJ1xcdTAwMDAgXFx1MDAwMSBcXHUwMDAyIFxcdTAwMDMgXFx1MDAwNCBcXHUwMDA1IFxcdTAwMDYgXFx1MDAwNyBcXHUwMDA4IFxcdTAwMDkgXFx1MDAwQSBcXHUwMDBCIFxcdTAwMEMgXFx1MDAwRCBcXHUwMDBFIFxcdTAwMEYgXFx1MDAxMCBcXHUwMDExIFxcdTAwMTIgXFx1MDAxMyBcXHUwMDE0IFxcdTAwMTUgXFx1MDAxNiBcXHUwMDE3IFxcdTAwMTggXFx1MDAxOSBcXHUwMDFBIFxcdTAwMUIgXFx1MDAxQyBcXHUwMDFEIFxcdTAwMUUgXFx1MDAxRicuc3BsaXQoJyAnKVxuXHQgICAgICAgIHZhciBtYXAgPSB7fVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ09OVFJPTF9DSEFSQUNURVIubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgbWFwW0NPTlRST0xfQ0hBUkFDVEVSW2ldXSA9IENPTlRST0xfQ0hBUkFDVEVSX1VOSUNPREVbaV1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG1hcFxuXHQgICAgfSgpLFxuXHQgICAgJ2NvbnRyb2wtY2hhcmFjdGVyJzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLkNPTlRST0xfQ0hBUkFDVEVSX01BUFtub2RlLmNvZGVdXG5cdCAgICB9XG5cdH0pXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBIYW5kbGVyXG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgdG9KU09OU2NoZW1hXG5cblx0ICAgIOaKiiBNb2NrLmpzIOmjjuagvOeahOaVsOaNruaooeadv+i9rOaNouaIkCBKU09OIFNjaGVtYeOAglxuXG5cdCAgICA+IFtKU09OIFNjaGVtYV0oaHR0cDovL2pzb24tc2NoZW1hLm9yZy8pXG5cdCAqL1xuXHR2YXIgQ29uc3RhbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG5cdHZhciBVdGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuXHR2YXIgUGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuXG5cdGZ1bmN0aW9uIHRvSlNPTlNjaGVtYSh0ZW1wbGF0ZSwgbmFtZSwgcGF0aCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0ICAgIC8vIHR5cGUgcnVsZSBwcm9wZXJ0aWVzIGl0ZW1zXG5cdCAgICBwYXRoID0gcGF0aCB8fCBbXVxuXHQgICAgdmFyIHJlc3VsdCA9IHtcblx0ICAgICAgICBuYW1lOiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgPyBuYW1lLnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKSA6IG5hbWUsXG5cdCAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuXHQgICAgICAgIHR5cGU6IFV0aWwudHlwZSh0ZW1wbGF0ZSksIC8vIOWPr+iDveS4jeWHhuehru+8jOS+i+WmgiB7ICduYW1lfDEnOiBbe30sIHt9IC4uLl0gfVxuXHQgICAgICAgIHJ1bGU6IFBhcnNlci5wYXJzZShuYW1lKVxuXHQgICAgfVxuXHQgICAgcmVzdWx0LnBhdGggPSBwYXRoLnNsaWNlKDApXG5cdCAgICByZXN1bHQucGF0aC5wdXNoKG5hbWUgPT09IHVuZGVmaW5lZCA/ICdST09UJyA6IHJlc3VsdC5uYW1lKVxuXG5cdCAgICBzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG5cdCAgICAgICAgY2FzZSAnYXJyYXknOlxuXHQgICAgICAgICAgICByZXN1bHQuaXRlbXMgPSBbXVxuXHQgICAgICAgICAgICBVdGlsLmVhY2godGVtcGxhdGUsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0Lml0ZW1zLnB1c2goXG5cdCAgICAgICAgICAgICAgICAgICAgdG9KU09OU2NoZW1hKHZhbHVlLCBpbmRleCwgcmVzdWx0LnBhdGgpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgY2FzZSAnb2JqZWN0Jzpcblx0ICAgICAgICAgICAgcmVzdWx0LnByb3BlcnRpZXMgPSBbXVxuXHQgICAgICAgICAgICBVdGlsLmVhY2godGVtcGxhdGUsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQucHJvcGVydGllcy5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgIHRvSlNPTlNjaGVtYSh2YWx1ZSwgbmFtZSwgcmVzdWx0LnBhdGgpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIGJyZWFrXG5cdCAgICB9XG5cblx0ICAgIHJldHVybiByZXN1bHRcblxuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0b0pTT05TY2hlbWFcblxuXG4vKioqLyB9KSxcbi8qIDI1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KVxuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIHZhbGlkKHRlbXBsYXRlLCBkYXRhKVxuXG5cdCAgICDmoKHpqoznnJ/lrp7mlbDmja4gZGF0YSDmmK/lkKbkuI7mlbDmja7mqKHmnb8gdGVtcGxhdGUg5Yy56YWN44CCXG5cdCAgICBcblx0ICAgIOWunueOsOaAnei3r++8mlxuXHQgICAgMS4g6Kej5p6Q6KeE5YiZ44CCXG5cdCAgICAgICAg5YWI5oqK5pWw5o2u5qih5p2/IHRlbXBsYXRlIOino+aekOS4uuabtOaWueS+v+acuuWZqOino+aekOeahCBKU09OLVNjaGFtZVxuXHQgICAgICAgIG5hbWUgICAgICAgICAgICAgICDlsZ7mgKflkI0gXG5cdCAgICAgICAgdHlwZSAgICAgICAgICAgICAgIOWxnuaAp+WAvOexu+Wei1xuXHQgICAgICAgIHRlbXBsYXRlICAgICAgICAgICDlsZ7mgKflgLzmqKHmnb9cblx0ICAgICAgICBwcm9wZXJ0aWVzICAgICAgICAg5a+56LGh5bGe5oCn5pWw57uEXG5cdCAgICAgICAgaXRlbXMgICAgICAgICAgICAgIOaVsOe7hOWFg+e0oOaVsOe7hFxuXHQgICAgICAgIHJ1bGUgICAgICAgICAgICAgICDlsZ7mgKflgLznlJ/miJDop4TliJlcblx0ICAgIDIuIOmAkuW9kumqjOivgeinhOWImeOAglxuXHQgICAgICAgIOeEtuWQjueUqCBKU09OLVNjaGVtYSDmoKHpqoznnJ/lrp7mlbDmja7vvIzmoKHpqozpobnljIXmi6zlsZ7mgKflkI3jgIHlgLznsbvlnovjgIHlgLzjgIHlgLznlJ/miJDop4TliJnjgIJcblxuXHQgICAg5o+Q56S65L+h5oGvIFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL2ZnZS9qc29uLXNjaGVtYS12YWxpZGF0b3IvYmxvYi9tYXN0ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9naXRodWIvZmdlL2pzb25zY2hlbWEvdmFsaWRhdG9yL3ZhbGlkYXRpb24ucHJvcGVydGllc1xuXHQgICAgW0pTT04tU2NoYW1hIHZhbGlkYXRvcl0oaHR0cDovL2pzb24tc2NoZW1hLXZhbGlkYXRvci5oZXJva3VhcHAuY29tLylcblx0ICAgIFtSZWdleHAgRGVtb10oaHR0cDovL2RlbW9zLmZvcmJlc2xpbmRlc2F5LmNvLnVrL3JlZ2V4cC8pXG5cdCovXG5cdHZhciBDb25zdGFudCA9IF9fd2VicGFja19yZXF1aXJlX18oMilcblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciB0b0pTT05TY2hlbWEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKVxuXG5cdGZ1bmN0aW9uIHZhbGlkKHRlbXBsYXRlLCBkYXRhKSB7XG5cdCAgICB2YXIgc2NoZW1hID0gdG9KU09OU2NoZW1hKHRlbXBsYXRlKVxuXHQgICAgdmFyIHJlc3VsdCA9IERpZmYuZGlmZihzY2hlbWEsIGRhdGEpXG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIC8vIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBkYXRhKVxuXHQgICAgICAgIC8vIGNvbnNvbGUud2FybihBc3NlcnQubWVzc2FnZShyZXN1bHRbaV0pKVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdFxuXHR9XG5cblx0Lypcblx0ICAgICMjIG5hbWVcblx0ICAgICAgICDmnInnlJ/miJDop4TliJnvvJrmr5TovoPop6PmnpDlkI7nmoQgbmFtZVxuXHQgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muebtOaOpeavlOi+g1xuXHQgICAgIyMgdHlwZVxuXHQgICAgICAgIOaXoOexu+Wei+i9rOaNou+8muebtOaOpeavlOi+g1xuXHQgICAgICAgIOacieexu+Wei+i9rOaNou+8muWFiOivleedgOino+aekCB0ZW1wbGF0Ze+8jOeEtuWQjuWGjeajgOafpe+8n1xuXHQgICAgIyMgdmFsdWUgdnMuIHRlbXBsYXRlXG5cdCAgICAgICAg5Z+65pys57G75Z6LXG5cdCAgICAgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muebtOaOpeavlOi+g1xuXHQgICAgICAgICAgICDmnInnlJ/miJDop4TliJnvvJpcblx0ICAgICAgICAgICAgICAgIG51bWJlclxuXHQgICAgICAgICAgICAgICAgICAgIG1pbi1tYXguZG1pbi1kbWF4XG5cdCAgICAgICAgICAgICAgICAgICAgbWluLW1heC5kY291bnRcblx0ICAgICAgICAgICAgICAgICAgICBjb3VudC5kbWluLWRtYXhcblx0ICAgICAgICAgICAgICAgICAgICBjb3VudC5kY291bnRcblx0ICAgICAgICAgICAgICAgICAgICArc3RlcFxuXHQgICAgICAgICAgICAgICAgICAgIOaVtOaVsOmDqOWIhlxuXHQgICAgICAgICAgICAgICAgICAgIOWwj+aVsOmDqOWIhlxuXHQgICAgICAgICAgICAgICAgYm9vbGVhbiBcblx0ICAgICAgICAgICAgICAgIHN0cmluZyAgXG5cdCAgICAgICAgICAgICAgICAgICAgbWluLW1heFxuXHQgICAgICAgICAgICAgICAgICAgIGNvdW50XG5cdCAgICAjIyBwcm9wZXJ0aWVzXG5cdCAgICAgICAg5a+56LGhXG5cdCAgICAgICAgICAgIOacieeUn+aIkOinhOWIme+8muajgOa1i+acn+acm+eahOWxnuaAp+S4quaVsO+8jOe7p+e7remAkuW9klxuXHQgICAgICAgICAgICDml6DnlJ/miJDop4TliJnvvJrmo4DmtYvlhajpg6jnmoTlsZ7mgKfkuKrmlbDvvIznu6fnu63pgJLlvZJcblx0ICAgICMjIGl0ZW1zXG5cdCAgICAgICAg5pWw57uEXG5cdCAgICAgICAgICAgIOacieeUn+aIkOinhOWIme+8mlxuXHQgICAgICAgICAgICAgICAgYCduYW1lfDEnOiBbe30sIHt9IC4uLl1gICAgICAgICAgICAg5YW25Lit5LmL5LiA77yM57un57ut6YCS5b2SXG5cdCAgICAgICAgICAgICAgICBgJ25hbWV8KzEnOiBbe30sIHt9IC4uLl1gICAgICAgICAgICDpobrluo/mo4DmtYvvvIznu6fnu63pgJLlvZJcblx0ICAgICAgICAgICAgICAgIGAnbmFtZXxtaW4tbWF4JzogW3t9LCB7fSAuLi5dYCAgICAgIOajgOa1i+S4quaVsO+8jOe7p+e7remAkuW9klxuXHQgICAgICAgICAgICAgICAgYCduYW1lfGNvdW50JzogW3t9LCB7fSAuLi5dYCAgICAgICAg5qOA5rWL5Liq5pWw77yM57un57ut6YCS5b2SXG5cdCAgICAgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muajgOa1i+WFqOmDqOeahOWFg+e0oOS4quaVsO+8jOe7p+e7remAkuW9klxuXHQqL1xuXHR2YXIgRGlmZiA9IHtcblx0ICAgIGRpZmY6IGZ1bmN0aW9uIGRpZmYoc2NoZW1hLCBkYXRhLCBuYW1lIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXG5cdCAgICAgICAgLy8g5YWI5qOA5rWL5ZCN56ewIG5hbWUg5ZKM57G75Z6LIHR5cGXvvIzlpoLmnpzljLnphY3vvIzmiY3mnInlv4XopoHnu6fnu63mo4DmtYtcblx0ICAgICAgICBpZiAoXG5cdCAgICAgICAgICAgIHRoaXMubmFtZShzY2hlbWEsIGRhdGEsIG5hbWUsIHJlc3VsdCkgJiZcblx0ICAgICAgICAgICAgdGhpcy50eXBlKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KVxuXHQgICAgICAgICkge1xuXHQgICAgICAgICAgICB0aGlzLnZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KVxuXHQgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpXG5cdCAgICAgICAgICAgIHRoaXMuaXRlbXMoc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8qIGpzaGludCB1bnVzZWQ6ZmFsc2UgKi9cblx0ICAgIG5hbWU6IGZ1bmN0aW9uKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KSB7XG5cdCAgICAgICAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGhcblxuXHQgICAgICAgIEFzc2VydC5lcXVhbCgnbmFtZScsIHNjaGVtYS5wYXRoLCBuYW1lICsgJycsIHNjaGVtYS5uYW1lICsgJycsIHJlc3VsdClcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgIH0sXG5cdCAgICB0eXBlOiBmdW5jdGlvbihzY2hlbWEsIGRhdGEsIG5hbWUsIHJlc3VsdCkge1xuXHQgICAgICAgIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoXG5cblx0ICAgICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG5cdCAgICAgICAgICAgICAgICAvLyDot7Pov4flkKvmnInjgI7ljaDkvY3nrKbjgI/nmoTlsZ7mgKflgLzvvIzlm6DkuLrjgI7ljaDkvY3nrKbjgI/ov5Tlm57lgLznmoTnsbvlnovlj6/og73lkozmqKHmnb/kuI3kuIDoh7TvvIzkvovlpoIgJ0BpbnQnIOS8mui/lOWbnuS4gOS4quaVtOW9ouWAvFxuXHQgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS50ZW1wbGF0ZS5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikpIHJldHVybiB0cnVlXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICdhcnJheSc6XG5cdCAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIG5hbWV8Y291bnQ6IGFycmF5XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5ydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5ydWxlLm1heCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi3s+i/hyBuYW1lfDE6IGFycmF577yM5Zug5Li65pyA57uI5YC855qE57G75Z6L77yI5b6I5Y+v6IO977yJ5LiN5piv5pWw57uE77yM5Lmf5LiN5LiA5a6a5LiOIGBhcnJheWAg5Lit55qE57G75Z6L5LiA6Ie0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucnVsZS5jb3VudCA9PT0gMSkgcmV0dXJuIHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8g6Lez6L+HIG5hbWV8K2luYzogYXJyYXlcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJ1bGUucGFyYW1ldGVyc1syXSkgcmV0dXJuIHRydWVcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgIC8vIOi3s+i/hyBgJ25hbWUnOiBmdW5jdGlvbmDvvIzlm6DkuLrlh73mlbDlj6/ku6Xov5Tlm57ku7vkvZXnsbvlnovnmoTlgLzjgIJcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgQXNzZXJ0LmVxdWFsKCd0eXBlJywgc2NoZW1hLnBhdGgsIFV0aWwudHlwZShkYXRhKSwgc2NoZW1hLnR5cGUsIHJlc3VsdClcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24oc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpIHtcblx0ICAgICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aFxuXG5cdCAgICAgICAgdmFyIHJ1bGUgPSBzY2hlbWEucnVsZVxuXHQgICAgICAgIHZhciB0ZW1wbGF0ZVR5cGUgPSBzY2hlbWEudHlwZVxuXHQgICAgICAgIGlmICh0ZW1wbGF0ZVR5cGUgPT09ICdvYmplY3QnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2FycmF5JyB8fCB0ZW1wbGF0ZVR5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiB0cnVlXG5cblx0ICAgICAgICAvLyDml6DnlJ/miJDop4TliJlcblx0ICAgICAgICBpZiAoIXJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuXHQgICAgICAgICAgICAgICAgY2FzZSAncmVnZXhwJzpcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubWF0Y2goJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIGRhdGEsIHNjaGVtYS50ZW1wbGF0ZSwgcmVzdWx0KVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG5cdCAgICAgICAgICAgICAgICAgICAgLy8g5ZCM5qC36Lez6L+H5ZCr5pyJ44CO5Y2g5L2N56ym44CP55qE5bGe5oCn5YC877yM5Zug5Li644CO5Y2g5L2N56ym44CP55qE6L+U5Zue5YC85Lya6YCa5bi45Lya5LiO5qih5p2/5LiN5LiA6Ie0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS50ZW1wbGF0ZS5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikpIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIEFzc2VydC5lcXVhbCgndmFsdWUnLCBzY2hlbWEucGF0aCwgZGF0YSwgc2NoZW1hLnRlbXBsYXRlLCByZXN1bHQpXG5cdCAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmnInnlJ/miJDop4TliJlcblx0ICAgICAgICB2YXIgYWN0dWFsUmVwZWF0Q291bnRcblx0ICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuXHQgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gKGRhdGEgKyAnJykuc3BsaXQoJy4nKVxuXHQgICAgICAgICAgICAgICAgcGFydHNbMF0gPSArcGFydHNbMF1cblxuXHQgICAgICAgICAgICAgICAgLy8g5pW05pWw6YOo5YiGXG5cdCAgICAgICAgICAgICAgICAvLyB8bWluLW1heFxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIEFzc2VydC5ncmVhdGVyVGhhbk9yRXF1YWxUbygndmFsdWUnLCBzY2hlbWEucGF0aCwgcGFydHNbMF0sIE1hdGgubWluKHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gLCAnbnVtZXJpYyBpbnN0YW5jZSBpcyBsb3dlciB0aGFuIHRoZSByZXF1aXJlZCBtaW5pbXVtIChtaW5pbXVtOiB7ZXhwZWN0ZWR9LCBmb3VuZDoge2FjdHVhbH0pJylcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubGVzc1RoYW5PckVxdWFsVG8oJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzBdLCBNYXRoLm1heChydWxlLm1pbiwgcnVsZS5tYXgpLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzBdLCBydWxlLm1pbiwgcmVzdWx0LCAnW3ZhbHVlXSAnICsgbmFtZSlcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8g5bCP5pWw6YOo5YiGXG5cdCAgICAgICAgICAgICAgICBpZiAocnVsZS5kZWNpbWFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gfGRtaW4tZG1heFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmRtaW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLmRtYXggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzFdLmxlbmd0aCwgcnVsZS5kbWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygndmFsdWUnLCBzY2hlbWEucGF0aCwgcGFydHNbMV0ubGVuZ3RoLCBydWxlLmRtYXgsIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gfGRjb3VudFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmRtaW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLmRtYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzFdLmxlbmd0aCwgcnVsZS5kbWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblxuXHQgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuXHQgICAgICAgICAgICAgICAgLy8gJ2FhYScubWF0Y2goL2EvZylcblx0ICAgICAgICAgICAgICAgIGFjdHVhbFJlcGVhdENvdW50ID0gZGF0YS5tYXRjaChuZXcgUmVnRXhwKHNjaGVtYS50ZW1wbGF0ZSwgJ2cnKSlcblx0ICAgICAgICAgICAgICAgIGFjdHVhbFJlcGVhdENvdW50ID0gYWN0dWFsUmVwZWF0Q291bnQgPyBhY3R1YWxSZXBlYXRDb3VudC5sZW5ndGggOiAwXG5cblx0ICAgICAgICAgICAgICAgIC8vIHxtaW4tbWF4XG5cdCAgICAgICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmdyZWF0ZXJUaGFuT3JFcXVhbFRvKCdyZXBlYXQgY291bnQnLCBzY2hlbWEucGF0aCwgYWN0dWFsUmVwZWF0Q291bnQsIHJ1bGUubWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgQXNzZXJ0Lmxlc3NUaGFuT3JFcXVhbFRvKCdyZXBlYXQgY291bnQnLCBzY2hlbWEucGF0aCwgYWN0dWFsUmVwZWF0Q291bnQsIHJ1bGUubWF4LCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5taW4sIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblxuXHQgICAgICAgICAgICBjYXNlICdyZWdleHAnOlxuXHQgICAgICAgICAgICAgICAgYWN0dWFsUmVwZWF0Q291bnQgPSBkYXRhLm1hdGNoKG5ldyBSZWdFeHAoc2NoZW1hLnRlbXBsYXRlLnNvdXJjZS5yZXBsYWNlKC9eXFxefFxcJCQvZywgJycpLCAnZycpKVxuXHQgICAgICAgICAgICAgICAgYWN0dWFsUmVwZWF0Q291bnQgPSBhY3R1YWxSZXBlYXRDb3VudCA/IGFjdHVhbFJlcGVhdENvdW50Lmxlbmd0aCA6IDBcblxuXHQgICAgICAgICAgICAgICAgLy8gfG1pbi1tYXhcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5taW4sIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubGVzc1RoYW5PckVxdWFsVG8oJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5tYXgsIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIHxjb3VudFxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIEFzc2VydC5lcXVhbCgncmVwZWF0IGNvdW50Jywgc2NoZW1hLnBhdGgsIGFjdHVhbFJlcGVhdENvdW50LCBydWxlLm1pbiwgcmVzdWx0KVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gbGVuZ3RoXG5cdCAgICB9LFxuXHQgICAgcHJvcGVydGllczogZnVuY3Rpb24oc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpIHtcblx0ICAgICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aFxuXG5cdCAgICAgICAgdmFyIHJ1bGUgPSBzY2hlbWEucnVsZVxuXHQgICAgICAgIHZhciBrZXlzID0gVXRpbC5rZXlzKGRhdGEpXG5cdCAgICAgICAgaWYgKCFzY2hlbWEucHJvcGVydGllcykgcmV0dXJuXG5cblx0ICAgICAgICAvLyDml6DnlJ/miJDop4TliJlcblx0ICAgICAgICBpZiAoIXNjaGVtYS5ydWxlLnBhcmFtZXRlcnMpIHtcblx0ICAgICAgICAgICAgQXNzZXJ0LmVxdWFsKCdwcm9wZXJ0aWVzIGxlbmd0aCcsIHNjaGVtYS5wYXRoLCBrZXlzLmxlbmd0aCwgc2NoZW1hLnByb3BlcnRpZXMubGVuZ3RoLCByZXN1bHQpXG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLy8g5pyJ55Sf5oiQ6KeE5YiZXG5cdCAgICAgICAgICAgIC8vIHxtaW4tbWF4XG5cdCAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5ncmVhdGVyVGhhbk9yRXF1YWxUbygncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIE1hdGgubWluKHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIE1hdGgubWF4KHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgLy8gfDEsIHw+MVxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY291bnQgIT09IDEpIEFzc2VydC5lcXVhbCgncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIHJ1bGUubWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaC5hcHBseShcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgIHRoaXMuZGlmZihcblx0ICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZWFjaChzY2hlbWEucHJvcGVydGllcywgZnVuY3Rpb24oaXRlbSAvKiwgaW5kZXgqLyApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09IGtleXNbaV0pIHByb3BlcnR5ID0gaXRlbVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkgfHwgc2NoZW1hLnByb3BlcnRpZXNbaV1cblx0ICAgICAgICAgICAgICAgICAgICB9KCksXG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXlzW2ldXSxcblx0ICAgICAgICAgICAgICAgICAgICBrZXlzW2ldXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gbGVuZ3RoXG5cdCAgICB9LFxuXHQgICAgaXRlbXM6IGZ1bmN0aW9uKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KSB7XG5cdCAgICAgICAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGhcblxuXHQgICAgICAgIGlmICghc2NoZW1hLml0ZW1zKSByZXR1cm5cblxuXHQgICAgICAgIHZhciBydWxlID0gc2NoZW1hLnJ1bGVcblxuXHQgICAgICAgIC8vIOaXoOeUn+aIkOinhOWImVxuXHQgICAgICAgIGlmICghc2NoZW1hLnJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ2l0ZW1zIGxlbmd0aCcsIHNjaGVtYS5wYXRoLCBkYXRhLmxlbmd0aCwgc2NoZW1hLml0ZW1zLmxlbmd0aCwgcmVzdWx0KVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vIOacieeUn+aIkOinhOWImVxuXHQgICAgICAgICAgICAvLyB8bWluLW1heFxuXHQgICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ2l0ZW1zJywgc2NoZW1hLnBhdGgsIGRhdGEubGVuZ3RoLCAoTWF0aC5taW4ocnVsZS5taW4sIHJ1bGUubWF4KSAqIHNjaGVtYS5pdGVtcy5sZW5ndGgpLCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgJ1t7dXR5cGV9XSBhcnJheSBpcyB0b28gc2hvcnQ6IHtwYXRofSBtdXN0IGhhdmUgYXQgbGVhc3Qge2V4cGVjdGVkfSBlbGVtZW50cyBidXQgaW5zdGFuY2UgaGFzIHthY3R1YWx9IGVsZW1lbnRzJylcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygnaXRlbXMnLCBzY2hlbWEucGF0aCwgZGF0YS5sZW5ndGgsIChNYXRoLm1heChydWxlLm1pbiwgcnVsZS5tYXgpICogc2NoZW1hLml0ZW1zLmxlbmd0aCksIHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAnW3t1dHlwZX1dIGFycmF5IGlzIHRvbyBsb25nOiB7cGF0aH0gbXVzdCBoYXZlIGF0IG1vc3Qge2V4cGVjdGVkfSBlbGVtZW50cyBidXQgaW5zdGFuY2UgaGFzIHthY3R1YWx9IGVsZW1lbnRzJylcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgLy8gfDEsIHw+MVxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY291bnQgPT09IDEpIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgIGVsc2UgQXNzZXJ0LmVxdWFsKCdpdGVtcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwgZGF0YS5sZW5ndGgsIChydWxlLm1pbiAqIHNjaGVtYS5pdGVtcy5sZW5ndGgpLCByZXN1bHQpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gfCtpbmNcblx0ICAgICAgICAgICAgaWYgKHJ1bGUucGFyYW1ldGVyc1syXSkgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IGxlbmd0aFxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSBsZW5ndGgpIHJldHVybiBmYWxzZVxuXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KFxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgdGhpcy5kaWZmKFxuXHQgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5pdGVtc1tpICUgc2NoZW1hLml0ZW1zLmxlbmd0aF0sXG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSxcblx0ICAgICAgICAgICAgICAgICAgICBpICUgc2NoZW1hLml0ZW1zLmxlbmd0aFxuXHQgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICApXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IGxlbmd0aFxuXHQgICAgfVxuXHR9XG5cblx0Lypcblx0ICAgIOWujOWWhOOAgeWPi+WlveeahOaPkOekuuS/oeaBr1xuXHQgICAgXG5cdCAgICBFcXVhbCwgbm90IGVxdWFsIHRvLCBncmVhdGVyIHRoYW4sIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLCBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cblx0ICAgIOi3r+W+hCDpqozor4Hnsbvlnosg5o+P6L+wIFxuXG5cdCAgICBFeHBlY3QgcGF0aC5uYW1lIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBleHBlY3RlZCwgYnV0IHBhdGgubmFtZSBpcyBhY3R1YWwuXG5cblx0ICAgIEV4cGVjdCBwYXRoLm5hbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGV4cGVjdGVkLCBidXQgcGF0aC5uYW1lIGlzIGFjdHVhbC5cblx0ICAgIEV4cGVjdCBwYXRoLm5hbWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGV4cGVjdGVkLCBidXQgcGF0aC5uYW1lIGlzIGFjdHVhbC5cblxuXHQqL1xuXHR2YXIgQXNzZXJ0ID0ge1xuXHQgICAgbWVzc2FnZTogZnVuY3Rpb24oaXRlbSkge1xuXHQgICAgICAgIHJldHVybiAoaXRlbS5tZXNzYWdlIHx8XG5cdCAgICAgICAgICAgICAgICAnW3t1dHlwZX1dIEV4cGVjdCB7cGF0aH1cXCd7bHR5cGV9IHthY3Rpb259IHtleHBlY3RlZH0sIGJ1dCBpcyB7YWN0dWFsfScpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7dXR5cGV9JywgaXRlbS50eXBlLnRvVXBwZXJDYXNlKCkpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7bHR5cGV9JywgaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7cGF0aH0nLCBVdGlsLmlzQXJyYXkoaXRlbS5wYXRoKSAmJiBpdGVtLnBhdGguam9pbignLicpIHx8IGl0ZW0ucGF0aClcblx0ICAgICAgICAgICAgLnJlcGxhY2UoJ3thY3Rpb259JywgaXRlbS5hY3Rpb24pXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7ZXhwZWN0ZWR9JywgaXRlbS5leHBlY3RlZClcblx0ICAgICAgICAgICAgLnJlcGxhY2UoJ3thY3R1YWx9JywgaXRlbS5hY3R1YWwpXG5cdCAgICB9LFxuXHQgICAgZXF1YWw6IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHN3aXRjaCAodHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICd0eXBlJzpcblx0ICAgICAgICAgICAgICAgIC8vIOato+WImeaooeadvyA9PT0g5a2X56ym5Liy5pyA57uI5YC8XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgPT09ICdyZWdleHAnICYmIGFjdHVhbCA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBlcXVhbCB0bycsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Vcblx0ICAgICAgICB9XG5cdCAgICAgICAgaXRlbS5tZXNzYWdlID0gQXNzZXJ0Lm1lc3NhZ2UoaXRlbSlcblx0ICAgICAgICByZXN1bHQucHVzaChpdGVtKVxuXHQgICAgICAgIHJldHVybiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIC8vIGFjdHVhbCBtYXRjaGVzIGV4cGVjdGVkXG5cdCAgICBtYXRjaDogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGV4cGVjdGVkLnRlc3QoYWN0dWFsKSkgcmV0dXJuIHRydWVcblxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdtYXRjaGVzJyxcblx0ICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpdGVtLm1lc3NhZ2UgPSBBc3NlcnQubWVzc2FnZShpdGVtKVxuXHQgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbm90RXF1YWw6IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBub3QgZXF1YWwgdG8nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBncmVhdGVyVGhhbjogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGFjdHVhbCA+IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBncmVhdGVyIHRoYW4nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBsZXNzVGhhbjogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGFjdHVhbCA8IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBsZXNzIHRvJyxcblx0ICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpdGVtLm1lc3NhZ2UgPSBBc3NlcnQubWVzc2FnZShpdGVtKVxuXHQgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlXG5cdCAgICB9LFxuXHQgICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgPj0gZXhwZWN0ZWQpIHJldHVybiB0cnVlXG5cdCAgICAgICAgdmFyIGl0ZW0gPSB7XG5cdCAgICAgICAgICAgIHBhdGg6IHBhdGgsXG5cdCAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuXHQgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG5cdCAgICAgICAgICAgIGFjdGlvbjogJ2lzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Vcblx0ICAgICAgICB9XG5cdCAgICAgICAgaXRlbS5tZXNzYWdlID0gQXNzZXJ0Lm1lc3NhZ2UoaXRlbSlcblx0ICAgICAgICByZXN1bHQucHVzaChpdGVtKVxuXHQgICAgICAgIHJldHVybiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBmdW5jdGlvbih0eXBlLCBwYXRoLCBhY3R1YWwsIGV4cGVjdGVkLCByZXN1bHQsIG1lc3NhZ2UpIHtcblx0ICAgICAgICBpZiAoYWN0dWFsIDw9IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH1cblx0fVxuXG5cdHZhbGlkLkRpZmYgPSBEaWZmXG5cdHZhbGlkLkFzc2VydCA9IEFzc2VydFxuXG5cdG1vZHVsZS5leHBvcnRzID0gdmFsaWRcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIGdsb2JhbCB3aW5kb3csIGRvY3VtZW50LCBsb2NhdGlvbiwgRXZlbnQsIHNldFRpbWVvdXQgKi9cblx0Lypcblx0ICAgICMjIE1vY2tYTUxIdHRwUmVxdWVzdFxuXG5cdCAgICDmnJ/mnJvnmoTlip/og73vvJpcblx0ICAgIDEuIOWujOaVtOWcsOimhuebluWOn+eUnyBYSFIg55qE6KGM5Li6XG5cdCAgICAyLiDlrozmlbTlnLDmqKHmi5/ljp/nlJ8gWEhSIOeahOihjOS4ulxuXHQgICAgMy4g5Zyo5Y+R6LW36K+35rGC5pe277yM6Ieq5Yqo5qOA5rWL5piv5ZCm6ZyA6KaB5oum5oiqXG5cdCAgICA0LiDlpoLmnpzkuI3lv4Xmi6bmiKrvvIzliJnmiafooYzljp/nlJ8gWEhSIOeahOihjOS4ulxuXHQgICAgNS4g5aaC5p6c6ZyA6KaB5oum5oiq77yM5YiZ5omn6KGM6Jma5oufIFhIUiDnmoTooYzkuLpcblx0ICAgIDYuIOWFvOWuuSBYTUxIdHRwUmVxdWVzdCDlkowgQWN0aXZlWE9iamVjdFxuXHQgICAgICAgIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKVxuXHQgICAgICAgIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpXG5cblx0ICAgIOWFs+mUruaWueazleeahOmAu+i+ke+8mlxuXHQgICAgKiBuZXcgICDmraTml7blsJrml6Dms5Xnoa7lrprmmK/lkKbpnIDopoHmi6bmiKrvvIzmiYDku6XliJvlu7rljp/nlJ8gWEhSIOWvueixoeaYr+W/hemhu+eahOOAglxuXHQgICAgKiBvcGVuICDmraTml7blj6/ku6Xlj5bliLAgVVJM77yM5Y+v5Lul5Yaz5a6a5piv5ZCm6L+b6KGM5oum5oiq44CCXG5cdCAgICAqIHNlbmQgIOatpOaXtuW3sue7j+ehruWumuS6huivt+axguaWueW8j+OAglxuXG5cdCAgICDop4TojIPvvJpcblx0ICAgIGh0dHA6Ly94aHIuc3BlYy53aGF0d2cub3JnL1xuXHQgICAgaHR0cDovL3d3dy53My5vcmcvVFIvWE1MSHR0cFJlcXVlc3QyL1xuXG5cdCAgICDlj4LogIPlrp7njrDvvJpcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsaWtvbi9Nb2NrSHR0cFJlcXVlc3QvYmxvYi9tYXN0ZXIvbGliL21vY2suanNcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90cmVrL0Zha2VYTUxIdHRwUmVxdWVzdC9ibG9iL21hc3Rlci9mYWtlX3htbF9odHRwX3JlcXVlc3QuanNcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9pbGluc2t5L3htbGh0dHByZXF1ZXN0L2Jsb2IvbWFzdGVyL1hNTEh0dHBSZXF1ZXN0LmpzXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJ1Zy9maXJlYnVnLWxpdGUvYmxvYi9tYXN0ZXIvY29udGVudC9saXRlL3hoci5qc1xuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL3RoeC9SQVAvYmxvYi9tYXN0ZXIvbGFiL3JhcC5wbHVnaW4ueGluZ2xpZS5qc1xuXG5cdCAgICAqKumcgOS4jemcgOimgeWFqOmdoumHjeWGmSBYTUxIdHRwUmVxdWVzdO+8nyoqXG5cdCAgICAgICAgaHR0cDovL3hoci5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS14bWxodHRwcmVxdWVzdFxuXHQgICAgICAgIOWFs+mUruWxnuaApyByZWFkeVN0YXRl44CBc3RhdHVz44CBc3RhdHVzVGV4dOOAgXJlc3BvbnNl44CBcmVzcG9uc2VUZXh044CBcmVzcG9uc2VYTUwg5pivIHJlYWRvbmx577yM5omA5Lul77yM6K+V5Zu+6YCa6L+H5L+u5pS56L+Z5Lqb54q25oCB77yM5p2l5qih5ouf5ZON5bqU5piv5LiN5Y+v6KGM55qE44CCXG5cdCAgICAgICAg5Zug5q2k77yM5ZSv5LiA55qE5Yqe5rOV5piv5qih5ouf5pW05LiqIFhNTEh0dHBSZXF1ZXN077yM5bCx5YOPIGpRdWVyeSDlr7nkuovku7bmqKHlnovnmoTlsIHoo4XjgIJcblxuXHQgICAgLy8gRXZlbnQgaGFuZGxlcnNcblx0ICAgIG9ubG9hZHN0YXJ0ICAgICAgICAgbG9hZHN0YXJ0XG5cdCAgICBvbnByb2dyZXNzICAgICAgICAgIHByb2dyZXNzXG5cdCAgICBvbmFib3J0ICAgICAgICAgICAgIGFib3J0XG5cdCAgICBvbmVycm9yICAgICAgICAgICAgIGVycm9yXG5cdCAgICBvbmxvYWQgICAgICAgICAgICAgIGxvYWRcblx0ICAgIG9udGltZW91dCAgICAgICAgICAgdGltZW91dFxuXHQgICAgb25sb2FkZW5kICAgICAgICAgICBsb2FkZW5kXG5cdCAgICBvbnJlYWR5c3RhdGVjaGFuZ2UgIHJlYWR5c3RhdGVjaGFuZ2Vcblx0ICovXG5cblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cblx0Ly8g5aSH5Lu95Y6f55SfIFhNTEh0dHBSZXF1ZXN0XG5cdHdpbmRvdy5fWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3Rcblx0d2luZG93Ll9BY3RpdmVYT2JqZWN0ID0gd2luZG93LkFjdGl2ZVhPYmplY3RcblxuXHQvKlxuXHQgICAgUGhhbnRvbUpTXG5cdCAgICBUeXBlRXJyb3I6ICdbb2JqZWN0IEV2ZW50Q29uc3RydWN0b3JdJyBpcyBub3QgYSBjb25zdHJ1Y3RvciAoZXZhbHVhdGluZyAnbmV3IEV2ZW50KFwicmVhZHlzdGF0ZWNoYW5nZVwiKScpXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlcmFpbC90d2l0dGVyLWJvb3RzdHJhcC1yYWlscy1jb25maXJtL2lzc3Vlcy8xOFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTEyODlcblx0Ki9cblx0dHJ5IHtcblx0ICAgIG5ldyB3aW5kb3cuRXZlbnQoJ2N1c3RvbScpXG5cdH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuXHQgICAgd2luZG93LkV2ZW50ID0gZnVuY3Rpb24odHlwZSwgYnViYmxlcywgY2FuY2VsYWJsZSwgZGV0YWlsKSB7XG5cdCAgICAgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JykgLy8gTVVTVCBiZSAnQ3VzdG9tRXZlbnQnXG5cdCAgICAgICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRldGFpbClcblx0ICAgICAgICByZXR1cm4gZXZlbnRcblx0ICAgIH1cblx0fVxuXG5cdHZhciBYSFJfU1RBVEVTID0ge1xuXHQgICAgLy8gVGhlIG9iamVjdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZC5cblx0ICAgIFVOU0VOVDogMCxcblx0ICAgIC8vIFRoZSBvcGVuKCkgbWV0aG9kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbnZva2VkLlxuXHQgICAgT1BFTkVEOiAxLFxuXHQgICAgLy8gQWxsIHJlZGlyZWN0cyAoaWYgYW55KSBoYXZlIGJlZW4gZm9sbG93ZWQgYW5kIGFsbCBIVFRQIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlIGhhdmUgYmVlbiByZWNlaXZlZC5cblx0ICAgIEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdCAgICAvLyBUaGUgcmVzcG9uc2UncyBib2R5IGlzIGJlaW5nIHJlY2VpdmVkLlxuXHQgICAgTE9BRElORzogMyxcblx0ICAgIC8vIFRoZSBkYXRhIHRyYW5zZmVyIGhhcyBiZWVuIGNvbXBsZXRlZCBvciBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIHRyYW5zZmVyIChlLmcuIGluZmluaXRlIHJlZGlyZWN0cykuXG5cdCAgICBET05FOiA0XG5cdH1cblxuXHR2YXIgWEhSX0VWRU5UUyA9ICdyZWFkeXN0YXRlY2hhbmdlIGxvYWRzdGFydCBwcm9ncmVzcyBhYm9ydCBlcnJvciBsb2FkIHRpbWVvdXQgbG9hZGVuZCcuc3BsaXQoJyAnKVxuXHR2YXIgWEhSX1JFUVVFU1RfUFJPUEVSVElFUyA9ICd0aW1lb3V0IHdpdGhDcmVkZW50aWFscycuc3BsaXQoJyAnKVxuXHR2YXIgWEhSX1JFU1BPTlNFX1BST1BFUlRJRVMgPSAncmVhZHlTdGF0ZSByZXNwb25zZVVSTCBzdGF0dXMgc3RhdHVzVGV4dCByZXNwb25zZVR5cGUgcmVzcG9uc2UgcmVzcG9uc2VUZXh0IHJlc3BvbnNlWE1MJy5zcGxpdCgnICcpXG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RyZWsvRmFrZVhNTEh0dHBSZXF1ZXN0L2Jsb2IvbWFzdGVyL2Zha2VfeG1sX2h0dHBfcmVxdWVzdC5qcyNMMzJcblx0dmFyIEhUVFBfU1RBVFVTX0NPREVTID0ge1xuXHQgICAgMTAwOiBcIkNvbnRpbnVlXCIsXG5cdCAgICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuXHQgICAgMjAwOiBcIk9LXCIsXG5cdCAgICAyMDE6IFwiQ3JlYXRlZFwiLFxuXHQgICAgMjAyOiBcIkFjY2VwdGVkXCIsXG5cdCAgICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcblx0ICAgIDIwNDogXCJObyBDb250ZW50XCIsXG5cdCAgICAyMDU6IFwiUmVzZXQgQ29udGVudFwiLFxuXHQgICAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuXHQgICAgMzAwOiBcIk11bHRpcGxlIENob2ljZVwiLFxuXHQgICAgMzAxOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG5cdCAgICAzMDI6IFwiRm91bmRcIixcblx0ICAgIDMwMzogXCJTZWUgT3RoZXJcIixcblx0ICAgIDMwNDogXCJOb3QgTW9kaWZpZWRcIixcblx0ICAgIDMwNTogXCJVc2UgUHJveHlcIixcblx0ICAgIDMwNzogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcblx0ICAgIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuXHQgICAgNDAxOiBcIlVuYXV0aG9yaXplZFwiLFxuXHQgICAgNDAyOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcblx0ICAgIDQwMzogXCJGb3JiaWRkZW5cIixcblx0ICAgIDQwNDogXCJOb3QgRm91bmRcIixcblx0ICAgIDQwNTogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcblx0ICAgIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuXHQgICAgNDA3OiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG5cdCAgICA0MDg6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG5cdCAgICA0MDk6IFwiQ29uZmxpY3RcIixcblx0ICAgIDQxMDogXCJHb25lXCIsXG5cdCAgICA0MTE6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG5cdCAgICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuXHQgICAgNDEzOiBcIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVwiLFxuXHQgICAgNDE0OiBcIlJlcXVlc3QtVVJJIFRvbyBMb25nXCIsXG5cdCAgICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuXHQgICAgNDE2OiBcIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcblx0ICAgIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcblx0ICAgIDQyMjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuXHQgICAgNTAwOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuXHQgICAgNTAxOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuXHQgICAgNTAyOiBcIkJhZCBHYXRld2F5XCIsXG5cdCAgICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuXHQgICAgNTA0OiBcIkdhdGV3YXkgVGltZW91dFwiLFxuXHQgICAgNTA1OiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCJcblx0fVxuXG5cdC8qXG5cdCAgICBNb2NrWE1MSHR0cFJlcXVlc3Rcblx0Ki9cblxuXHRmdW5jdGlvbiBNb2NrWE1MSHR0cFJlcXVlc3QoKSB7XG5cdCAgICAvLyDliJ3lp4vljJYgY3VzdG9tIOWvueixoe+8jOeUqOS6juWtmOWCqOiHquWumuS5ieWxnuaAp1xuXHQgICAgdGhpcy5jdXN0b20gPSB7XG5cdCAgICAgICAgZXZlbnRzOiB7fSxcblx0ICAgICAgICByZXF1ZXN0SGVhZGVyczoge30sXG5cdCAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7fVxuXHQgICAgfVxuXHR9XG5cblx0TW9ja1hNTEh0dHBSZXF1ZXN0Ll9zZXR0aW5ncyA9IHtcblx0ICAgIHRpbWVvdXQ6ICcxMC0xMDAnLFxuXHQgICAgLypcblx0ICAgICAgICB0aW1lb3V0OiA1MCxcblx0ICAgICAgICB0aW1lb3V0OiAnMTAtMTAwJyxcblx0ICAgICAqL1xuXHR9XG5cblx0TW9ja1hNTEh0dHBSZXF1ZXN0LnNldHVwID0gZnVuY3Rpb24oc2V0dGluZ3MpIHtcblx0ICAgIFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdC5fc2V0dGluZ3MsIHNldHRpbmdzKVxuXHQgICAgcmV0dXJuIE1vY2tYTUxIdHRwUmVxdWVzdC5fc2V0dGluZ3Ncblx0fVxuXG5cdFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdCwgWEhSX1NUQVRFUylcblx0VXRpbC5leHRlbmQoTW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgWEhSX1NUQVRFUylcblxuXHQvLyDmoIforrDlvZPliY3lr7nosaHkuLogTW9ja1hNTEh0dHBSZXF1ZXN0XG5cdE1vY2tYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUubW9jayA9IHRydWVcblxuXHQvLyDmmK/lkKbmi6bmiKogQWpheCDor7fmsYJcblx0TW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5tYXRjaCA9IGZhbHNlXG5cblx0Ly8g5Yid5aeL5YyWIFJlcXVlc3Qg55u45YWz55qE5bGe5oCn5ZKM5pa55rOVXG5cdFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0ICAgIC8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLW9wZW4oKS1tZXRob2Rcblx0ICAgIC8vIFNldHMgdGhlIHJlcXVlc3QgbWV0aG9kLCByZXF1ZXN0IFVSTCwgYW5kIHN5bmNocm9ub3VzIGZsYWcuXG5cdCAgICBvcGVuOiBmdW5jdGlvbihtZXRob2QsIHVybCwgYXN5bmMsIHVzZXJuYW1lLCBwYXNzd29yZCkge1xuXHQgICAgICAgIHZhciB0aGF0ID0gdGhpc1xuXG5cdCAgICAgICAgVXRpbC5leHRlbmQodGhpcy5jdXN0b20sIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG5cdCAgICAgICAgICAgIHVybDogdXJsLFxuXHQgICAgICAgICAgICBhc3luYzogdHlwZW9mIGFzeW5jID09PSAnYm9vbGVhbicgPyBhc3luYyA6IHRydWUsXG5cdCAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcblx0ICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuXHQgICAgICAgICAgICBvcHRpb25zOiB7XG5cdCAgICAgICAgICAgICAgICB1cmw6IHVybCxcblx0ICAgICAgICAgICAgICAgIHR5cGU6IG1ldGhvZFxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIHRoaXMuY3VzdG9tLnRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZW91dCA9PT0gJ251bWJlcicpIHJldHVybiB0aW1lb3V0XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZW91dCA9PT0gJ3N0cmluZycgJiYgIX50aW1lb3V0LmluZGV4T2YoJy0nKSkgcmV0dXJuIHBhcnNlSW50KHRpbWVvdXQsIDEwKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdzdHJpbmcnICYmIH50aW1lb3V0LmluZGV4T2YoJy0nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHRpbWVvdXQuc3BsaXQoJy0nKVxuXHQgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHBhcnNlSW50KHRtcFswXSwgMTApXG5cdCAgICAgICAgICAgICAgICB2YXIgbWF4ID0gcGFyc2VJbnQodG1wWzFdLCAxMClcblx0ICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW5cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0oTW9ja1hNTEh0dHBSZXF1ZXN0Ll9zZXR0aW5ncy50aW1lb3V0KVxuXG5cdCAgICAgICAgLy8g5p+l5om+5LiO6K+35rGC5Y+C5pWw5Yy56YWN55qE5pWw5o2u5qih5p2/XG5cdCAgICAgICAgdmFyIGl0ZW0gPSBmaW5kKHRoaXMuY3VzdG9tLm9wdGlvbnMpXG5cblx0ICAgICAgICBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgLy8g5ZCM5q2l5bGe5oCnIE5hdGl2ZVhNTEh0dHBSZXF1ZXN0ID0+IE1vY2tYTUxIdHRwUmVxdWVzdFxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFhIUl9SRVNQT05TRV9QUk9QRVJUSUVTLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoYXRbWEhSX1JFU1BPTlNFX1BST1BFUlRJRVNbaV1dID0geGhyW1hIUl9SRVNQT05TRV9QUk9QRVJUSUVTW2ldXVxuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyDop6blj5EgTW9ja1hNTEh0dHBSZXF1ZXN0IOS4iueahOWQjOWQjeS6i+S7tlxuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGV2ZW50LnR5cGUgLyosIGZhbHNlLCBmYWxzZSwgdGhhdCovICkpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5aaC5p6c5pyq5om+5Yiw5Yy56YWN55qE5pWw5o2u5qih5p2/77yM5YiZ6YeH55So5Y6f55SfIFhIUiDlj5HpgIHor7fmsYLjgIJcblx0ICAgICAgICBpZiAoIWl0ZW0pIHtcblx0ICAgICAgICAgICAgLy8g5Yib5bu65Y6f55SfIFhIUiDlr7nosaHvvIzosIPnlKjljp/nlJ8gb3Blbigp77yM55uR5ZCs5omA5pyJ5Y6f55Sf5LqL5Lu2XG5cdCAgICAgICAgICAgIHZhciB4aHIgPSBjcmVhdGVOYXRpdmVYTUxIdHRwUmVxdWVzdCgpXG5cdCAgICAgICAgICAgIHRoaXMuY3VzdG9tLnhociA9IHhoclxuXG5cdCAgICAgICAgICAgIC8vIOWIneWni+WMluaJgOacieS6i+S7tu+8jOeUqOS6juebkeWQrOWOn+eUnyBYSFIg5a+56LGh55qE5LqL5Lu2XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgWEhSX0VWRU5UUy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoWEhSX0VWRU5UU1tpXSwgaGFuZGxlKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8geGhyLm9wZW4oKVxuXHQgICAgICAgICAgICBpZiAodXNlcm5hbWUpIHhoci5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYywgdXNlcm5hbWUsIHBhc3N3b3JkKVxuXHQgICAgICAgICAgICBlbHNlIHhoci5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYylcblxuXHQgICAgICAgICAgICAvLyDlkIzmraXlsZ7mgKcgTW9ja1hNTEh0dHBSZXF1ZXN0ID0+IE5hdGl2ZVhNTEh0dHBSZXF1ZXN0XG5cdCAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgWEhSX1JFUVVFU1RfUFJPUEVSVElFUy5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICB4aHJbWEhSX1JFUVVFU1RfUFJPUEVSVElFU1tqXV0gPSB0aGF0W1hIUl9SRVFVRVNUX1BST1BFUlRJRVNbal1dXG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5om+5Yiw5LqG5Yy56YWN55qE5pWw5o2u5qih5p2/77yM5byA5aeL5oum5oiqIFhIUiDor7fmsYJcblx0ICAgICAgICB0aGlzLm1hdGNoID0gdHJ1ZVxuXHQgICAgICAgIHRoaXMuY3VzdG9tLnRlbXBsYXRlID0gaXRlbVxuXHQgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5PUEVORURcblx0ICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGlzKi8gKSlcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyKCktbWV0aG9kXG5cdCAgICAvLyBDb21iaW5lcyBhIGhlYWRlciBpbiBhdXRob3IgcmVxdWVzdCBoZWFkZXJzLlxuXHQgICAgc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY3VzdG9tLnhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuXHQgICAgICAgICAgICByZXR1cm5cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgdmFyIHJlcXVlc3RIZWFkZXJzID0gdGhpcy5jdXN0b20ucmVxdWVzdEhlYWRlcnNcblx0ICAgICAgICBpZiAocmVxdWVzdEhlYWRlcnNbbmFtZV0pIHJlcXVlc3RIZWFkZXJzW25hbWVdICs9ICcsJyArIHZhbHVlXG5cdCAgICAgICAgZWxzZSByZXF1ZXN0SGVhZGVyc1tuYW1lXSA9IHZhbHVlXG5cdCAgICB9LFxuXHQgICAgdGltZW91dDogMCxcblx0ICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG5cdCAgICB1cGxvYWQ6IHt9LFxuXHQgICAgLy8gaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyN0aGUtc2VuZCgpLW1ldGhvZFxuXHQgICAgLy8gSW5pdGlhdGVzIHRoZSByZXF1ZXN0LlxuXHQgICAgc2VuZDogZnVuY3Rpb24gc2VuZChkYXRhKSB7XG5cdCAgICAgICAgdmFyIHRoYXQgPSB0aGlzXG5cdCAgICAgICAgdGhpcy5jdXN0b20ub3B0aW9ucy5ib2R5ID0gZGF0YVxuXG5cdCAgICAgICAgLy8g5Y6f55SfIFhIUlxuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCkge1xuXHQgICAgICAgICAgICB0aGlzLmN1c3RvbS54aHIuc2VuZChkYXRhKVxuXHQgICAgICAgICAgICByZXR1cm5cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cblx0ICAgICAgICAvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHQgICAgICAgIHRoaXMuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdNb2NrWE1MSHR0cFJlcXVlc3QnKVxuXG5cdCAgICAgICAgLy8gbG9hZHN0YXJ0IFRoZSBmZXRjaCBpbml0aWF0ZXMuXG5cdCAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZHN0YXJ0JyAvKiwgZmFsc2UsIGZhbHNlLCB0aGlzKi8gKSlcblxuXHQgICAgICAgIGlmICh0aGlzLmN1c3RvbS5hc3luYykgc2V0VGltZW91dChkb25lLCB0aGlzLmN1c3RvbS50aW1lb3V0KSAvLyDlvILmraVcblx0ICAgICAgICBlbHNlIGRvbmUoKSAvLyDlkIzmraVcblxuXHQgICAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG5cdCAgICAgICAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEXG5cdCAgICAgICAgICAgIHRoYXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnIC8qLCBmYWxzZSwgZmFsc2UsIHRoYXQqLyApKVxuXHQgICAgICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSBNb2NrWE1MSHR0cFJlcXVlc3QuTE9BRElOR1xuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSlcblxuXHQgICAgICAgICAgICB0aGF0LnN0YXR1cyA9IDIwMFxuXHQgICAgICAgICAgICB0aGF0LnN0YXR1c1RleHQgPSBIVFRQX1NUQVRVU19DT0RFU1syMDBdXG5cblx0ICAgICAgICAgICAgLy8gZml4ICM5MiAjOTMgYnkgQHFkZGVndHlhXG5cdCAgICAgICAgICAgIHRoYXQucmVzcG9uc2UgPSB0aGF0LnJlc3BvbnNlVGV4dCA9IEpTT04uc3RyaW5naWZ5KFxuXHQgICAgICAgICAgICAgICAgY29udmVydCh0aGF0LmN1c3RvbS50ZW1wbGF0ZSwgdGhhdC5jdXN0b20ub3B0aW9ucyksXG5cdCAgICAgICAgICAgICAgICBudWxsLCA0XG5cdCAgICAgICAgICAgIClcblxuXHQgICAgICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSBNb2NrWE1MSHR0cFJlcXVlc3QuRE9ORVxuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSlcblx0ICAgICAgICAgICAgdGhhdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcgLyosIGZhbHNlLCBmYWxzZSwgdGhhdCovICkpO1xuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdsb2FkZW5kJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLWFib3J0KCktbWV0aG9kXG5cdCAgICAvLyBDYW5jZWxzIGFueSBuZXR3b3JrIGFjdGl2aXR5LlxuXHQgICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KCkge1xuXHQgICAgICAgIC8vIOWOn+eUnyBYSFJcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcblx0ICAgICAgICAgICAgdGhpcy5jdXN0b20ueGhyLmFib3J0KClcblx0ICAgICAgICAgICAgcmV0dXJuXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5oum5oiqIFhIUlxuXHQgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5VTlNFTlRcblx0ICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhYm9ydCcsIGZhbHNlLCBmYWxzZSwgdGhpcykpXG5cdCAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InLCBmYWxzZSwgZmFsc2UsIHRoaXMpKVxuXHQgICAgfVxuXHR9KVxuXG5cdC8vIOWIneWni+WMliBSZXNwb25zZSDnm7jlhbPnmoTlsZ7mgKflkozmlrnms5Vcblx0VXRpbC5leHRlbmQoTW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwge1xuXHQgICAgcmVzcG9uc2VVUkw6ICcnLFxuXHQgICAgc3RhdHVzOiBNb2NrWE1MSHR0cFJlcXVlc3QuVU5TRU5ULFxuXHQgICAgc3RhdHVzVGV4dDogJycsXG5cdCAgICAvLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1nZXRyZXNwb25zZWhlYWRlcigpLW1ldGhvZFxuXHQgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbS54aHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSlcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tLnJlc3BvbnNlSGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyN0aGUtZ2V0YWxscmVzcG9uc2VoZWFkZXJzKCktbWV0aG9kXG5cdCAgICAvLyBodHRwOi8vd3d3LnV0ZjgtY2hhcnRhYmxlLmRlL1xuXHQgICAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbS54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9IHRoaXMuY3VzdG9tLnJlc3BvbnNlSGVhZGVyc1xuXHQgICAgICAgIHZhciBoZWFkZXJzID0gJydcblx0ICAgICAgICBmb3IgKHZhciBoIGluIHJlc3BvbnNlSGVhZGVycykge1xuXHQgICAgICAgICAgICBpZiAoIXJlc3BvbnNlSGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoKSkgY29udGludWVcblx0ICAgICAgICAgICAgaGVhZGVycyArPSBoICsgJzogJyArIHJlc3BvbnNlSGVhZGVyc1toXSArICdcXHJcXG4nXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBoZWFkZXJzXG5cdCAgICB9LFxuXHQgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIC8qbWltZSovICkge30sXG5cdCAgICByZXNwb25zZVR5cGU6ICcnLCAvLyAnJywgJ3RleHQnLCAnYXJyYXlidWZmZXInLCAnYmxvYicsICdkb2N1bWVudCcsICdqc29uJ1xuXHQgICAgcmVzcG9uc2U6IG51bGwsXG5cdCAgICByZXNwb25zZVRleHQ6ICcnLFxuXHQgICAgcmVzcG9uc2VYTUw6IG51bGxcblx0fSlcblxuXHQvLyBFdmVudFRhcmdldFxuXHRVdGlsLmV4dGVuZChNb2NrWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XG5cdCAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZSkge1xuXHQgICAgICAgIHZhciBldmVudHMgPSB0aGlzLmN1c3RvbS5ldmVudHNcblx0ICAgICAgICBpZiAoIWV2ZW50c1t0eXBlXSkgZXZlbnRzW3R5cGVdID0gW11cblx0ICAgICAgICBldmVudHNbdHlwZV0ucHVzaChoYW5kbGUpXG5cdCAgICB9LFxuXHQgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpIHtcblx0ICAgICAgICB2YXIgaGFuZGxlcyA9IHRoaXMuY3VzdG9tLmV2ZW50c1t0eXBlXSB8fCBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICBpZiAoaGFuZGxlc1tpXSA9PT0gaGFuZGxlKSB7XG5cdCAgICAgICAgICAgICAgICBoYW5kbGVzLnNwbGljZShpLS0sIDEpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChldmVudCkge1xuXHQgICAgICAgIHZhciBoYW5kbGVzID0gdGhpcy5jdXN0b20uZXZlbnRzW2V2ZW50LnR5cGVdIHx8IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGhhbmRsZXNbaV0uY2FsbCh0aGlzLCBldmVudClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgb250eXBlID0gJ29uJyArIGV2ZW50LnR5cGVcblx0ICAgICAgICBpZiAodGhpc1tvbnR5cGVdKSB0aGlzW29udHlwZV0oZXZlbnQpXG5cdCAgICB9XG5cdH0pXG5cblx0Ly8gSW5zcGlyZWQgYnkgalF1ZXJ5XG5cdGZ1bmN0aW9uIGNyZWF0ZU5hdGl2ZVhNTEh0dHBSZXF1ZXN0KCkge1xuXHQgICAgdmFyIGlzTG9jYWwgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokL1xuXHQgICAgICAgIHZhciBydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS9cblx0ICAgICAgICB2YXIgYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZlxuXHQgICAgICAgIHZhciBhamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkpIHx8IFtdXG5cdCAgICAgICAgcmV0dXJuIHJsb2NhbFByb3RvY29sLnRlc3QoYWpheExvY1BhcnRzWzFdKVxuXHQgICAgfSgpXG5cblx0ICAgIHJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/XG5cdCAgICAgICAgKCFpc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCkpIDogY3JlYXRlU3RhbmRhcmRYSFIoKVxuXG5cdCAgICBmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IHdpbmRvdy5fWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuX0FjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MSFRUUFwiKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgfVxuXHR9XG5cblxuXHQvLyDmn6Xmib7kuI7or7fmsYLlj4LmlbDljLnphY3nmoTmlbDmja7mqKHmnb/vvJpVUkzvvIxUeXBlXG5cdGZ1bmN0aW9uIGZpbmQob3B0aW9ucykge1xuXG5cdCAgICBmb3IgKHZhciBzVXJsVHlwZSBpbiBNb2NrWE1MSHR0cFJlcXVlc3QuTW9jay5fbW9ja2VkKSB7XG5cdCAgICAgICAgdmFyIGl0ZW0gPSBNb2NrWE1MSHR0cFJlcXVlc3QuTW9jay5fbW9ja2VkW3NVcmxUeXBlXVxuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAgICAgKCFpdGVtLnJ1cmwgfHwgbWF0Y2goaXRlbS5ydXJsLCBvcHRpb25zLnVybCkpICYmXG5cdCAgICAgICAgICAgICghaXRlbS5ydHlwZSB8fCBtYXRjaChpdGVtLnJ0eXBlLCBvcHRpb25zLnR5cGUudG9Mb3dlckNhc2UoKSkpXG5cdCAgICAgICAgKSB7XG5cdCAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbbW9ja10nLCBvcHRpb25zLnVybCwgJz4nLCBpdGVtLnJ1cmwpXG5cdCAgICAgICAgICAgIHJldHVybiBpdGVtXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBtYXRjaChleHBlY3RlZCwgYWN0dWFsKSB7XG5cdCAgICAgICAgaWYgKFV0aWwudHlwZShleHBlY3RlZCkgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gYWN0dWFsXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChVdGlsLnR5cGUoZXhwZWN0ZWQpID09PSAncmVnZXhwJykge1xuXHQgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdH1cblxuXHQvLyDmlbDmja7mqKHmnb8g77ydPiDlk43lupTmlbDmja5cblx0ZnVuY3Rpb24gY29udmVydChpdGVtLCBvcHRpb25zKSB7XG5cdCAgICByZXR1cm4gVXRpbC5pc0Z1bmN0aW9uKGl0ZW0udGVtcGxhdGUpID9cblx0ICAgICAgICBpdGVtLnRlbXBsYXRlKG9wdGlvbnMpIDogTW9ja1hNTEh0dHBSZXF1ZXN0Lk1vY2subW9jayhpdGVtLnRlbXBsYXRlKVxuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBNb2NrWE1MSHR0cFJlcXVlc3RcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pXG59KTtcbjsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFFBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js\n");
/***/ }),
/***/ "./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js":
/*!*******************************************************************************!*\
!*** ./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX25vZGUtbGlicy1icm93c2VyQDIuMi4xQG5vZGUtbGlicy1icm93c2VyL21vY2svZW1wdHkuanMuanMiLCJzb3VyY2VzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js\n");
/***/ }),
/***/ "./node_modules/_object-is@1.0.1@object-is/index.js":
/*!**********************************************************!*\
!*** ./node_modules/_object-is@1.0.1@object-is/index.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\n/* https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.is */\n\nvar NumberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t} else if (a === b) {\n\t\treturn true;\n\t} else if (NumberIsNaN(a) && NumberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1pc0AxLjAuMUBvYmplY3QtaXMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX29iamVjdC1pc0AxLjAuMUBvYmplY3QtaXMvaW5kZXguanM/MTMzNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5pcyAqL1xuXG52YXIgTnVtYmVySXNOYU4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXMoYSwgYikge1xuXHRpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG5cdFx0cmV0dXJuIDEgLyBhID09PSAxIC8gYjtcblx0fSBlbHNlIGlmIChhID09PSBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSBpZiAoTnVtYmVySXNOYU4oYSkgJiYgTnVtYmVySXNOYU4oYikpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_object-is@1.0.1@object-is/index.js\n");
/***/ }),
/***/ "./node_modules/_object-keys@1.1.1@object-keys/implementation.js":
/*!***********************************************************************!*\
!*** ./node_modules/_object-keys@1.1.1@object-keys/implementation.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = __webpack_require__(/*! ./isArguments */ \"./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\"); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pbXBsZW1lbnRhdGlvbi5qcz9jMmIyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/implementation.js\n");
/***/ }),
/***/ "./node_modules/_object-keys@1.1.1@object-keys/index.js":
/*!**************************************************************!*\
!*** ./node_modules/_object-keys@1.1.1@object-keys/index.js ***!
\**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar slice = Array.prototype.slice;\nvar isArgs = __webpack_require__(/*! ./isArguments */ \"./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\");\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : __webpack_require__(/*! ./implementation */ \"./node_modules/_object-keys@1.1.1@object-keys/implementation.js\");\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pbmRleC5qcz8wOTkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTtcblxudmFyIG9yaWdLZXlzID0gT2JqZWN0LmtleXM7XG52YXIga2V5c1NoaW0gPSBvcmlnS2V5cyA/IGZ1bmN0aW9uIGtleXMobykgeyByZXR1cm4gb3JpZ0tleXMobyk7IH0gOiByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblxua2V5c1NoaW0uc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RLZXlzKCkge1xuXHRpZiAoT2JqZWN0LmtleXMpIHtcblx0XHR2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBTYWZhcmkgNS4wIGJ1Z1xuXHRcdFx0dmFyIGFyZ3MgPSBPYmplY3Qua2V5cyhhcmd1bWVudHMpO1xuXHRcdFx0cmV0dXJuIGFyZ3MgJiYgYXJncy5sZW5ndGggPT09IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0fSgxLCAyKSk7XG5cdFx0aWYgKCFrZXlzV29ya3NXaXRoQXJndW1lbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG5cdFx0XHRcdGlmIChpc0FyZ3Mob2JqZWN0KSkge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRPYmplY3Qua2V5cyA9IGtleXNTaGltO1xuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyB8fCBrZXlzU2hpbTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/index.js\n");
/***/ }),
/***/ "./node_modules/_object-keys@1.1.1@object-keys/isArguments.js":
/*!********************************************************************!*\
!*** ./node_modules/_object-keys@1.1.1@object-keys/isArguments.js ***!
\********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pc0FyZ3VtZW50cy5qcz81N2MyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXHRpZiAoIWlzQXJncykge1xuXHRcdGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0XHR2YWx1ZS5sZW5ndGggPj0gMCAmJlxuXHRcdFx0dG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHR9XG5cdHJldHVybiBpc0FyZ3M7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\n");
/***/ }),
/***/ "./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js":
/*!**************************************************************************!*\
!*** ./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var trim = function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n}\n , isArray = function(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n }\n\nmodule.exports = function (headers) {\n if (!headers)\n return {}\n\n var result = {}\n\n var headersArr = trim(headers).split('\\n')\n\n for (var i = 0; i < headersArr.length; i++) {\n var row = headersArr[i]\n var index = row.indexOf(':')\n , key = trim(row.slice(0, index)).toLowerCase()\n , value = trim(row.slice(index + 1))\n\n if (typeof(result[key]) === 'undefined') {\n result[key] = value\n } else if (isArray(result[key])) {\n result[key].push(value)\n } else {\n result[key] = [ result[key], value ]\n }\n }\n\n return result\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3BhcnNlLWhlYWRlcnNAMi4wLjNAcGFyc2UtaGVhZGVycy9wYXJzZS1oZWFkZXJzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19wYXJzZS1oZWFkZXJzQDIuMC4zQHBhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qcz80ZGFiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0cmltID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xufVxuICAsIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKVxuICAgIHJldHVybiB7fVxuXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIHZhciBoZWFkZXJzQXJyID0gdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnNBcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcm93ID0gaGVhZGVyc0FycltpXVxuICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js\n");
/***/ }),
/***/ "./node_modules/_process@0.11.10@process/browser.js":
/*!**********************************************************!*\
!*** ./node_modules/_process@0.11.10@process/browser.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Byb2Nlc3NAMC4xMS4xMEBwcm9jZXNzL2Jyb3dzZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Byb2Nlc3NAMC4xMS4xMEBwcm9jZXNzL2Jyb3dzZXIuanM/NGMzOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_process@0.11.10@process/browser.js\n");
/***/ }),
/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js":
/*!*********************************************************************************************!*\
!*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js ***!
\*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar toObject = Object;\nvar TypeErr = TypeError;\n\nmodule.exports = function flags() {\n\tif (this != null && this !== toObject(this)) {\n\t\tthrow new TypeErr('RegExp.prototype.flags getter called on non-object');\n\t}\n\tvar result = '';\n\tif (this.global) {\n\t\tresult += 'g';\n\t}\n\tif (this.ignoreCase) {\n\t\tresult += 'i';\n\t}\n\tif (this.multiline) {\n\t\tresult += 'm';\n\t}\n\tif (this.dotAll) {\n\t\tresult += 's';\n\t}\n\tif (this.unicode) {\n\t\tresult += 'u';\n\t}\n\tif (this.sticky) {\n\t\tresult += 'y';\n\t}\n\treturn result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbXBsZW1lbnRhdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL2ltcGxlbWVudGF0aW9uLmpzPzY1MjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9PYmplY3QgPSBPYmplY3Q7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGFncygpIHtcblx0aWYgKHRoaXMgIT0gbnVsbCAmJiB0aGlzICE9PSB0b09iamVjdCh0aGlzKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIGdldHRlciBjYWxsZWQgb24gbm9uLW9iamVjdCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSAnJztcblx0aWYgKHRoaXMuZ2xvYmFsKSB7XG5cdFx0cmVzdWx0ICs9ICdnJztcblx0fVxuXHRpZiAodGhpcy5pZ25vcmVDYXNlKSB7XG5cdFx0cmVzdWx0ICs9ICdpJztcblx0fVxuXHRpZiAodGhpcy5tdWx0aWxpbmUpIHtcblx0XHRyZXN1bHQgKz0gJ20nO1xuXHR9XG5cdGlmICh0aGlzLmRvdEFsbCkge1xuXHRcdHJlc3VsdCArPSAncyc7XG5cdH1cblx0aWYgKHRoaXMudW5pY29kZSkge1xuXHRcdHJlc3VsdCArPSAndSc7XG5cdH1cblx0aWYgKHRoaXMuc3RpY2t5KSB7XG5cdFx0cmVzdWx0ICs9ICd5Jztcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\n");
/***/ }),
/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js":
/*!************************************************************************************!*\
!*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js ***!
\************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar define = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\");\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\");\nvar getPolyfill = __webpack_require__(/*! ./polyfill */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\");\nvar shim = __webpack_require__(/*! ./shim */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js\");\n\nvar flagsBound = Function.call.bind(implementation);\n\ndefine(flagsBound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = flagsBound;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL2luZGV4LmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGZsYWdzQm91bmQgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaW1wbGVtZW50YXRpb24pO1xuXG5kZWZpbmUoZmxhZ3NCb3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhZ3NCb3VuZDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js\n");
/***/ }),
/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js":
/*!***************************************************************************************!*\
!*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js ***!
\***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\");\n\nvar supportsDescriptors = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\").supportsDescriptors;\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar TypeErr = TypeError;\n\nmodule.exports = function getPolyfill() {\n\tif (!supportsDescriptors) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tif (/a/mig.flags === 'gim') {\n\t\tvar descriptor = gOPD(RegExp.prototype, 'flags');\n\t\tif (descriptor && typeof descriptor.get === 'function' && typeof (/a/).dotAll === 'boolean') {\n\t\t\treturn descriptor.get;\n\t\t}\n\t}\n\treturn implementation;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9wb2x5ZmlsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL3BvbHlmaWxsLmpzP2NlM2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIFR5cGVFcnIgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdGlmICgvYS9taWcuZmxhZ3MgPT09ICdnaW0nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXHRcdGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKC9hLykuZG90QWxsID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHJldHVybiBkZXNjcmlwdG9yLmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\n");
/***/ }),
/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js":
/*!***********************************************************************************!*\
!*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js ***!
\***********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nvar supportsDescriptors = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\").supportsDescriptors;\nvar getPolyfill = __webpack_require__(/*! ./polyfill */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\");\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar defineProperty = Object.defineProperty;\nvar TypeErr = TypeError;\nvar getProto = Object.getPrototypeOf;\nvar regex = /a/;\n\nmodule.exports = function shimFlags() {\n\tif (!supportsDescriptors || !getProto) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tvar polyfill = getPolyfill();\n\tvar proto = getProto(regex);\n\tvar descriptor = gOPD(proto, 'flags');\n\tif (!descriptor || descriptor.get !== polyfill) {\n\t\tdefineProperty(proto, 'flags', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tget: polyfill\n\t\t});\n\t}\n\treturn polyfill;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9zaGltLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19yZWdleHAucHJvdG90eXBlLmZsYWdzQDEuMi4wQHJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Mvc2hpbS5qcz9kNjY0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciByZWdleCA9IC9hLztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRmxhZ3MoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyB8fCAhZ2V0UHJvdG8pIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcblx0fVxuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHR2YXIgcHJvdG8gPSBnZXRQcm90byhyZWdleCk7XG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgJ2ZsYWdzJyk7XG5cdGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmdldCAhPT0gcG9seWZpbGwpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShwcm90bywgJ2ZsYWdzJywge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6IHBvbHlmaWxsXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js\n");
/***/ }),
/***/ "./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js":
/*!**********************************************************************!*\
!*** ./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n var json\n var error = null\n\n try {\n json = JSON.parse(obj, reviver)\n } catch (err) {\n error = err\n }\n\n return [error, json]\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3NhZmUtanNvbi1wYXJzZUA0LjAuMEBzYWZlLWpzb24tcGFyc2UvdHVwbGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3NhZmUtanNvbi1wYXJzZUA0LjAuMEBzYWZlLWpzb24tcGFyc2UvdHVwbGUuanM/MDYzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFNhZmVQYXJzZVR1cGxlXG5cbmZ1bmN0aW9uIFNhZmVQYXJzZVR1cGxlKG9iaiwgcmV2aXZlcikge1xuICAgIHZhciBqc29uXG4gICAgdmFyIGVycm9yID0gbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgICAganNvbiA9IEpTT04ucGFyc2Uob2JqLCByZXZpdmVyKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvciA9IGVyclxuICAgIH1cblxuICAgIHJldHVybiBbZXJyb3IsIGpzb25dXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js\n");
/***/ }),
/***/ "./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css":
/*!***************************************************************!*\
!*** ./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"49a14e50\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\", function() {\n var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9jc3Mvc3dpcGVyLmNzcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fc3dpcGVyQDQuNS4xQHN3aXBlci9kaXN0L2Nzcy9zd2lwZXIuY3NzPzJiNjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3N3aXBlci5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI0OWExNGU1MFwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3N3aXBlci5jc3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vc3dpcGVyLmNzc1wiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\n");
/***/ }),
/***/ "./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js":
/*!*************************************************************!*\
!*** ./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/**\n * Swiper 4.5.1\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * http://www.idangero.us/swiper/\n *\n * Copyright 2014-2019 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: September 13, 2019\n */\n\n(function (global, factory) {\n true ? module.exports = factory() :\n undefined;\n}(this, function () { 'use strict';\n\n /**\n * SSR Window 1.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2018, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: July 18, 2018\n */\n var doc = (typeof document === 'undefined') ? {\n body: {},\n addEventListener: function addEventListener() {},\n removeEventListener: function removeEventListener() {},\n activeElement: {\n blur: function blur() {},\n nodeName: '',\n },\n querySelector: function querySelector() {\n return null;\n },\n querySelectorAll: function querySelectorAll() {\n return [];\n },\n getElementById: function getElementById() {\n return null;\n },\n createEvent: function createEvent() {\n return {\n initEvent: function initEvent() {},\n };\n },\n createElement: function createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute: function setAttribute() {},\n getElementsByTagName: function getElementsByTagName() {\n return [];\n },\n };\n },\n location: { hash: '' },\n } : document; // eslint-disable-line\n\n var win = (typeof window === 'undefined') ? {\n document: doc,\n navigator: {\n userAgent: '',\n },\n location: {},\n history: {},\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener: function addEventListener() {},\n removeEventListener: function removeEventListener() {},\n getComputedStyle: function getComputedStyle() {\n return {\n getPropertyValue: function getPropertyValue() {\n return '';\n },\n };\n },\n Image: function Image() {},\n Date: function Date() {},\n screen: {},\n setTimeout: function setTimeout() {},\n clearTimeout: function clearTimeout() {},\n } : window; // eslint-disable-line\n\n /**\n * Dom7 2.1.3\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * http://framework7.io/docs/dom.html\n *\n * Copyright 2019, Vladimir Kharlampidi\n * The iDangero.us\n * http://www.idangero.us/\n *\n * Licensed under MIT\n *\n * Released on: February 11, 2019\n */\n\n var Dom7 = function Dom7(arr) {\n var self = this;\n // Create array-like object\n for (var i = 0; i < arr.length; i += 1) {\n self[i] = arr[i];\n }\n self.length = arr.length;\n // Return collection with methods\n return this;\n };\n\n function $(selector, context) {\n var arr = [];\n var i = 0;\n if (selector && !context) {\n if (selector instanceof Dom7) {\n return selector;\n }\n }\n if (selector) {\n // String\n if (typeof selector === 'string') {\n var els;\n var tempParent;\n var html = selector.trim();\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n var toCreate = 'div';\n if (html.indexOf('<li') === 0) { toCreate = 'ul'; }\n if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }\n if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }\n if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }\n if (html.indexOf('<option') === 0) { toCreate = 'select'; }\n tempParent = doc.createElement(toCreate);\n tempParent.innerHTML = html;\n for (i = 0; i < tempParent.childNodes.length; i += 1) {\n arr.push(tempParent.childNodes[i]);\n }\n } else {\n if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {\n // Pure ID selector\n els = [doc.getElementById(selector.trim().split('#')[1])];\n } else {\n // Other selectors\n els = (context || doc).querySelectorAll(selector.trim());\n }\n for (i = 0; i < els.length; i += 1) {\n if (els[i]) { arr.push(els[i]); }\n }\n }\n } else if (selector.nodeType || selector === win || selector === doc) {\n // Node/element\n arr.push(selector);\n } else if (selector.length > 0 && selector[0].nodeType) {\n // Array of elements or instance of Dom\n for (i = 0; i < selector.length; i += 1) {\n arr.push(selector[i]);\n }\n }\n }\n return new Dom7(arr);\n }\n\n $.fn = Dom7.prototype;\n $.Class = Dom7;\n $.Dom7 = Dom7;\n\n function unique(arr) {\n var uniqueArray = [];\n for (var i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }\n }\n return uniqueArray;\n }\n\n // Classes and attributes\n function addClass(className) {\n if (typeof className === 'undefined') {\n return this;\n }\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }\n }\n }\n return this;\n }\n function removeClass(className) {\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }\n }\n }\n return this;\n }\n function hasClass(className) {\n if (!this[0]) { return false; }\n return this[0].classList.contains(className);\n }\n function toggleClass(className) {\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }\n }\n }\n return this;\n }\n function attr(attrs, value) {\n var arguments$1 = arguments;\n\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) { return this[0].getAttribute(attrs); }\n return undefined;\n }\n\n // Set attrs\n for (var i = 0; i < this.length; i += 1) {\n if (arguments$1.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n // eslint-disable-next-line\n for (var attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n return this;\n }\n // eslint-disable-next-line\n function removeAttr(attr) {\n for (var i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n return this;\n }\n function data(key, value) {\n var el;\n if (typeof value === 'undefined') {\n el = this[0];\n // Get value\n if (el) {\n if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {\n return el.dom7ElementDataStorage[key];\n }\n\n var dataKey = el.getAttribute((\"data-\" + key));\n if (dataKey) {\n return dataKey;\n }\n return undefined;\n }\n return undefined;\n }\n\n // Set value\n for (var i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }\n el.dom7ElementDataStorage[key] = value;\n }\n return this;\n }\n // Transforms\n // eslint-disable-next-line\n function transform(transform) {\n for (var i = 0; i < this.length; i += 1) {\n var elStyle = this[i].style;\n elStyle.webkitTransform = transform;\n elStyle.transform = transform;\n }\n return this;\n }\n function transition(duration) {\n if (typeof duration !== 'string') {\n duration = duration + \"ms\"; // eslint-disable-line\n }\n for (var i = 0; i < this.length; i += 1) {\n var elStyle = this[i].style;\n elStyle.webkitTransitionDuration = duration;\n elStyle.transitionDuration = duration;\n }\n return this;\n }\n // Events\n function on() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var eventType = args[0];\n var targetSelector = args[1];\n var listener = args[2];\n var capture = args[3];\n if (typeof args[1] === 'function') {\n (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n targetSelector = undefined;\n }\n if (!capture) { capture = false; }\n\n function handleLiveEvent(e) {\n var target = e.target;\n if (!target) { return; }\n var eventData = e.target.dom7EventData || [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n if ($(target).is(targetSelector)) { listener.apply(target, eventData); }\n else {\n var parents = $(target).parents(); // eslint-disable-line\n for (var k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }\n }\n }\n }\n function handleEvent(e) {\n var eventData = e && e.target ? e.target.dom7EventData || [] : [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n listener.apply(this, eventData);\n }\n var events = eventType.split(' ');\n var j;\n for (var i = 0; i < this.length; i += 1) {\n var el = this[i];\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n var event = events[j];\n if (!el.dom7Listeners) { el.dom7Listeners = {}; }\n if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }\n el.dom7Listeners[event].push({\n listener: listener,\n proxyListener: handleEvent,\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n var event$1 = events[j];\n if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }\n if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }\n el.dom7LiveListeners[event$1].push({\n listener: listener,\n proxyListener: handleLiveEvent,\n });\n el.addEventListener(event$1, handleLiveEvent, capture);\n }\n }\n }\n return this;\n }\n function off() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var eventType = args[0];\n var targetSelector = args[1];\n var listener = args[2];\n var capture = args[3];\n if (typeof args[1] === 'function') {\n (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n targetSelector = undefined;\n }\n if (!capture) { capture = false; }\n\n var events = eventType.split(' ');\n for (var i = 0; i < events.length; i += 1) {\n var event = events[i];\n for (var j = 0; j < this.length; j += 1) {\n var el = this[j];\n var handlers = (void 0);\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n if (handlers && handlers.length) {\n for (var k = handlers.length - 1; k >= 0; k -= 1) {\n var handler = handlers[k];\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n return this;\n }\n function trigger() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var events = args[0].split(' ');\n var eventData = args[1];\n for (var i = 0; i < events.length; i += 1) {\n var event = events[i];\n for (var j = 0; j < this.length; j += 1) {\n var el = this[j];\n var evt = (void 0);\n try {\n evt = new win.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true,\n });\n } catch (e) {\n evt = doc.createEvent('Event');\n evt.initEvent(event, true, true);\n evt.detail = eventData;\n }\n // eslint-disable-next-line\n el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n return this;\n }\n function transitionEnd(callback) {\n var events = ['webkitTransitionEnd', 'transitionend'];\n var dom = this;\n var i;\n function fireCallBack(e) {\n /* jshint validthis:true */\n if (e.target !== this) { return; }\n callback.call(this, e);\n for (i = 0; i < events.length; i += 1) {\n dom.off(events[i], fireCallBack);\n }\n }\n if (callback) {\n for (i = 0; i < events.length; i += 1) {\n dom.on(events[i], fireCallBack);\n }\n }\n return this;\n }\n function outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n // eslint-disable-next-line\n var styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n return this[0].offsetWidth;\n }\n return null;\n }\n function outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n // eslint-disable-next-line\n var styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n return this[0].offsetHeight;\n }\n return null;\n }\n function offset() {\n if (this.length > 0) {\n var el = this[0];\n var box = el.getBoundingClientRect();\n var body = doc.body;\n var clientTop = el.clientTop || body.clientTop || 0;\n var clientLeft = el.clientLeft || body.clientLeft || 0;\n var scrollTop = el === win ? win.scrollY : el.scrollTop;\n var scrollLeft = el === win ? win.scrollX : el.scrollLeft;\n return {\n top: (box.top + scrollTop) - clientTop,\n left: (box.left + scrollLeft) - clientLeft,\n };\n }\n\n return null;\n }\n function styles() {\n if (this[0]) { return win.getComputedStyle(this[0], null); }\n return {};\n }\n function css(props, value) {\n var i;\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }\n } else {\n for (i = 0; i < this.length; i += 1) {\n // eslint-disable-next-line\n for (var prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n return this;\n }\n }\n if (arguments.length === 2 && typeof props === 'string') {\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n return this;\n }\n return this;\n }\n // Iterate over the collection passing elements to `callback`\n function each(callback) {\n // Don't bother continuing without a callback\n if (!callback) { return this; }\n // Iterate over the current collection\n for (var i = 0; i < this.length; i += 1) {\n // If the callback returns false\n if (callback.call(this[i], i, this[i]) === false) {\n // End the loop early\n return this;\n }\n }\n // Return `this` to allow chained DOM operations\n return this;\n }\n // eslint-disable-next-line\n function html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : undefined;\n }\n\n for (var i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n return this;\n }\n // eslint-disable-next-line\n function text(text) {\n if (typeof text === 'undefined') {\n if (this[0]) {\n return this[0].textContent.trim();\n }\n return null;\n }\n\n for (var i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n return this;\n }\n function is(selector) {\n var el = this[0];\n var compareWith;\n var i;\n if (!el || typeof selector === 'undefined') { return false; }\n if (typeof selector === 'string') {\n if (el.matches) { return el.matches(selector); }\n else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }\n else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }\n\n compareWith = $(selector);\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) { return true; }\n }\n return false;\n } else if (selector === doc) { return el === doc; }\n else if (selector === win) { return el === win; }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) { return true; }\n }\n return false;\n }\n return false;\n }\n function index() {\n var child = this[0];\n var i;\n if (child) {\n i = 0;\n // eslint-disable-next-line\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) { i += 1; }\n }\n return i;\n }\n return undefined;\n }\n // eslint-disable-next-line\n function eq(index) {\n if (typeof index === 'undefined') { return this; }\n var length = this.length;\n var returnIndex;\n if (index > length - 1) {\n return new Dom7([]);\n }\n if (index < 0) {\n returnIndex = length + index;\n if (returnIndex < 0) { return new Dom7([]); }\n return new Dom7([this[returnIndex]]);\n }\n return new Dom7([this[index]]);\n }\n function append() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var newChild;\n\n for (var k = 0; k < args.length; k += 1) {\n newChild = args[k];\n for (var i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n var tempDiv = doc.createElement('div');\n tempDiv.innerHTML = newChild;\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (var j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n }\n function prepend(newChild) {\n var i;\n var j;\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n var tempDiv = doc.createElement('div');\n tempDiv.innerHTML = newChild;\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n return this;\n }\n function next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return new Dom7([this[0].nextElementSibling]);\n }\n return new Dom7([]);\n }\n\n if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }\n return new Dom7([]);\n }\n return new Dom7([]);\n }\n function nextAll(selector) {\n var nextEls = [];\n var el = this[0];\n if (!el) { return new Dom7([]); }\n while (el.nextElementSibling) {\n var next = el.nextElementSibling; // eslint-disable-line\n if (selector) {\n if ($(next).is(selector)) { nextEls.push(next); }\n } else { nextEls.push(next); }\n el = next;\n }\n return new Dom7(nextEls);\n }\n function prev(selector) {\n if (this.length > 0) {\n var el = this[0];\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return new Dom7([el.previousElementSibling]);\n }\n return new Dom7([]);\n }\n\n if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }\n return new Dom7([]);\n }\n return new Dom7([]);\n }\n function prevAll(selector) {\n var prevEls = [];\n var el = this[0];\n if (!el) { return new Dom7([]); }\n while (el.previousElementSibling) {\n var prev = el.previousElementSibling; // eslint-disable-line\n if (selector) {\n if ($(prev).is(selector)) { prevEls.push(prev); }\n } else { prevEls.push(prev); }\n el = prev;\n }\n return new Dom7(prevEls);\n }\n function parent(selector) {\n var parents = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n return $(unique(parents));\n }\n function parents(selector) {\n var parents = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n var parent = this[i].parentNode; // eslint-disable-line\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) { parents.push(parent); }\n } else {\n parents.push(parent);\n }\n parent = parent.parentNode;\n }\n }\n return $(unique(parents));\n }\n function closest(selector) {\n var closest = this; // eslint-disable-line\n if (typeof selector === 'undefined') {\n return new Dom7([]);\n }\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n return closest;\n }\n function find(selector) {\n var foundElements = [];\n for (var i = 0; i < this.length; i += 1) {\n var found = this[i].querySelectorAll(selector);\n for (var j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n return new Dom7(foundElements);\n }\n function children(selector) {\n var children = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n var childNodes = this[i].childNodes;\n\n for (var j = 0; j < childNodes.length; j += 1) {\n if (!selector) {\n if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }\n } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n return new Dom7(unique(children));\n }\n function remove() {\n for (var i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }\n }\n return this;\n }\n function add() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var dom = this;\n var i;\n var j;\n for (i = 0; i < args.length; i += 1) {\n var toAdd = $(args[i]);\n for (j = 0; j < toAdd.length; j += 1) {\n dom[dom.length] = toAdd[j];\n dom.length += 1;\n }\n }\n return dom;\n }\n\n var Methods = {\n addClass: addClass,\n removeClass: removeClass,\n hasClass: hasClass,\n toggleClass: toggleClass,\n attr: attr,\n removeAttr: removeAttr,\n data: data,\n transform: transform,\n transition: transition,\n on: on,\n off: off,\n trigger: trigger,\n transitionEnd: transitionEnd,\n outerWidth: outerWidth,\n outerHeight: outerHeight,\n offset: offset,\n css: css,\n each: each,\n html: html,\n text: text,\n is: is,\n index: index,\n eq: eq,\n append: append,\n prepend: prepend,\n next: next,\n nextAll: nextAll,\n prev: prev,\n prevAll: prevAll,\n parent: parent,\n parents: parents,\n closest: closest,\n find: find,\n children: children,\n remove: remove,\n add: add,\n styles: styles,\n };\n\n Object.keys(Methods).forEach(function (methodName) {\n $.fn[methodName] = $.fn[methodName] || Methods[methodName];\n });\n\n var Utils = {\n deleteProps: function deleteProps(obj) {\n var object = obj;\n Object.keys(object).forEach(function (key) {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n },\n nextTick: function nextTick(callback, delay) {\n if ( delay === void 0 ) delay = 0;\n\n return setTimeout(callback, delay);\n },\n now: function now() {\n return Date.now();\n },\n getTranslate: function getTranslate(el, axis) {\n if ( axis === void 0 ) axis = 'x';\n\n var matrix;\n var curTransform;\n var transformMatrix;\n\n var curStyle = win.getComputedStyle(el, null);\n\n if (win.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }\n // Crazy IE10 Matrix\n else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }\n // Normal Browsers\n else { curTransform = parseFloat(matrix[4]); }\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }\n // Crazy IE10 Matrix\n else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }\n // Normal Browsers\n else { curTransform = parseFloat(matrix[5]); }\n }\n return curTransform || 0;\n },\n parseUrlQuery: function parseUrlQuery(url) {\n var query = {};\n var urlToParse = url || win.location.href;\n var i;\n var params;\n var param;\n var length;\n if (typeof urlToParse === 'string' && urlToParse.length) {\n urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\\S*\\?/, '') : '';\n params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });\n length = params.length;\n\n for (i = 0; i < length; i += 1) {\n param = params[i].replace(/#\\S+/g, '').split('=');\n query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';\n }\n }\n return query;\n },\n isObject: function isObject(o) {\n return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;\n },\n extend: function extend() {\n var args = [], len$1 = arguments.length;\n while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];\n\n var to = Object(args[0]);\n for (var i = 1; i < args.length; i += 1) {\n var nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null) {\n var keysArray = Object.keys(Object(nextSource));\n for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n var nextKey = keysArray[nextIndex];\n var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n Utils.extend(to[nextKey], nextSource[nextKey]);\n } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n Utils.extend(to[nextKey], nextSource[nextKey]);\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n },\n };\n\n var Support = (function Support() {\n var testDiv = doc.createElement('div');\n return {\n touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {\n return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));\n }()),\n\n pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)),\n prefixedPointerEvents: !!win.navigator.msPointerEnabled,\n\n transition: (function checkTransition() {\n var style = testDiv.style;\n return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);\n }()),\n transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {\n var style = testDiv.style;\n return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);\n }()),\n\n flexbox: (function checkFlexbox() {\n var style = testDiv.style;\n var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');\n for (var i = 0; i < styles.length; i += 1) {\n if (styles[i] in style) { return true; }\n }\n return false;\n }()),\n\n observer: (function checkObserver() {\n return ('MutationObserver' in win || 'WebkitMutationObserver' in win);\n }()),\n\n passiveListener: (function checkPassiveListener() {\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get: function get() {\n supportsPassive = true;\n },\n });\n win.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n }()),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in win;\n }()),\n };\n }());\n\n var Browser = (function Browser() {\n function isSafari() {\n var ua = win.navigator.userAgent.toLowerCase();\n return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);\n }\n return {\n isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),\n isEdge: !!win.navigator.userAgent.match(/Edge/g),\n isSafari: isSafari(),\n isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),\n };\n }());\n\n var SwiperClass = function SwiperClass(params) {\n if ( params === void 0 ) params = {};\n\n var self = this;\n self.params = params;\n\n // Events\n self.eventsListeners = {};\n\n if (self.params && self.params.on) {\n Object.keys(self.params.on).forEach(function (eventName) {\n self.on(eventName, self.params.on[eventName]);\n });\n }\n };\n\n var staticAccessors = { components: { configurable: true } };\n\n SwiperClass.prototype.on = function on (events, handler, priority) {\n var self = this;\n if (typeof handler !== 'function') { return self; }\n var method = priority ? 'unshift' : 'push';\n events.split(' ').forEach(function (event) {\n if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }\n self.eventsListeners[event][method](handler);\n });\n return self;\n };\n\n SwiperClass.prototype.once = function once (events, handler, priority) {\n var self = this;\n if (typeof handler !== 'function') { return self; }\n function onceHandler() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n handler.apply(self, args);\n self.off(events, onceHandler);\n if (onceHandler.f7proxy) {\n delete onceHandler.f7proxy;\n }\n }\n onceHandler.f7proxy = handler;\n return self.on(events, onceHandler, priority);\n };\n\n SwiperClass.prototype.off = function off (events, handler) {\n var self = this;\n if (!self.eventsListeners) { return self; }\n events.split(' ').forEach(function (event) {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {\n self.eventsListeners[event].forEach(function (eventHandler, index) {\n if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n };\n\n SwiperClass.prototype.emit = function emit () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var self = this;\n if (!self.eventsListeners) { return self; }\n var events;\n var data;\n var context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n var eventsArray = Array.isArray(events) ? events : events.split(' ');\n eventsArray.forEach(function (event) {\n if (self.eventsListeners && self.eventsListeners[event]) {\n var handlers = [];\n self.eventsListeners[event].forEach(function (eventHandler) {\n handlers.push(eventHandler);\n });\n handlers.forEach(function (eventHandler) {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n };\n\n SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {\n var instance = this;\n if (!instance.modules) { return; }\n Object.keys(instance.modules).forEach(function (moduleName) {\n var module = instance.modules[moduleName];\n // Extend params\n if (module.params) {\n Utils.extend(instanceParams, module.params);\n }\n });\n };\n\n SwiperClass.prototype.useModules = function useModules (modulesParams) {\n if ( modulesParams === void 0 ) modulesParams = {};\n\n var instance = this;\n if (!instance.modules) { return; }\n Object.keys(instance.modules).forEach(function (moduleName) {\n var module = instance.modules[moduleName];\n var moduleParams = modulesParams[moduleName] || {};\n // Extend instance methods and props\n if (module.instance) {\n Object.keys(module.instance).forEach(function (modulePropName) {\n var moduleProp = module.instance[modulePropName];\n if (typeof moduleProp === 'function') {\n instance[modulePropName] = moduleProp.bind(instance);\n } else {\n instance[modulePropName] = moduleProp;\n }\n });\n }\n // Add event listeners\n if (module.on && instance.on) {\n Object.keys(module.on).forEach(function (moduleEventName) {\n instance.on(moduleEventName, module.on[moduleEventName]);\n });\n }\n\n // Module create callback\n if (module.create) {\n module.create.bind(instance)(moduleParams);\n }\n });\n };\n\n staticAccessors.components.set = function (components) {\n var Class = this;\n if (!Class.use) { return; }\n Class.use(components);\n };\n\n SwiperClass.installModule = function installModule (module) {\n var params = [], len = arguments.length - 1;\n while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n var Class = this;\n if (!Class.prototype.modules) { Class.prototype.modules = {}; }\n var name = module.name || (((Object.keys(Class.prototype.modules).length) + \"_\" + (Utils.now())));\n Class.prototype.modules[name] = module;\n // Prototype\n if (module.proto) {\n Object.keys(module.proto).forEach(function (key) {\n Class.prototype[key] = module.proto[key];\n });\n }\n // Class\n if (module.static) {\n Object.keys(module.static).forEach(function (key) {\n Class[key] = module.static[key];\n });\n }\n // Callback\n if (module.install) {\n module.install.apply(Class, params);\n }\n return Class;\n };\n\n SwiperClass.use = function use (module) {\n var params = [], len = arguments.length - 1;\n while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n var Class = this;\n if (Array.isArray(module)) {\n module.forEach(function (m) { return Class.installModule(m); });\n return Class;\n }\n return Class.installModule.apply(Class, [ module ].concat( params ));\n };\n\n Object.defineProperties( SwiperClass, staticAccessors );\n\n function updateSize () {\n var swiper = this;\n var width;\n var height;\n var $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined') {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined') {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);\n height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);\n\n Utils.extend(swiper, {\n width: width,\n height: height,\n size: swiper.isHorizontal() ? width : height,\n });\n }\n\n function updateSlides () {\n var swiper = this;\n var params = swiper.params;\n\n var $wrapperEl = swiper.$wrapperEl;\n var swiperSize = swiper.size;\n var rtl = swiper.rtlTranslate;\n var wrongRTL = swiper.wrongRTL;\n var isVirtual = swiper.virtual && params.virtual.enabled;\n var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n var slides = $wrapperEl.children((\".\" + (swiper.params.slideClass)));\n var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n var snapGrid = [];\n var slidesGrid = [];\n var slidesSizesGrid = [];\n\n var offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n var offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n var previousSnapGridLength = swiper.snapGrid.length;\n var previousSlidesGridLength = swiper.snapGrid.length;\n\n var spaceBetween = params.spaceBetween;\n var slidePosition = -offsetBefore;\n var prevSlideSize = 0;\n var index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }\n else { slides.css({ marginRight: '', marginBottom: '' }); }\n\n var slidesNumberEvenToRows;\n if (params.slidesPerColumn > 1) {\n if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;\n }\n if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);\n }\n }\n\n // Calc slides\n var slideSize;\n var slidesPerColumn = params.slidesPerColumn;\n var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;\n var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);\n for (var i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n var slide = slides.eq(i);\n if (params.slidesPerColumn > 1) {\n // Set slides order\n var newSlideOrderIndex = (void 0);\n var column = (void 0);\n var row = (void 0);\n if (\n (params.slidesPerColumnFill === 'column')\n || (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1)\n ) {\n if (params.slidesPerColumnFill === 'column') {\n column = Math.floor(i / slidesPerColumn);\n row = i - (column * slidesPerColumn);\n if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {\n row += 1;\n if (row >= slidesPerColumn) {\n row = 0;\n column += 1;\n }\n }\n } else {\n var groupIndex = Math.floor(i / params.slidesPerGroup);\n row = Math.floor(i / params.slidesPerView) - groupIndex * params.slidesPerColumn;\n column = i - row * params.slidesPerView - groupIndex * params.slidesPerView;\n }\n newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);\n slide\n .css({\n '-webkit-box-ordinal-group': newSlideOrderIndex,\n '-moz-box-ordinal-group': newSlideOrderIndex,\n '-ms-flex-order': newSlideOrderIndex,\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - (row * slidesPerRow);\n }\n slide\n .css(\n (\"margin-\" + (swiper.isHorizontal() ? 'top' : 'left')),\n (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + \"px\"))\n )\n .attr('data-swiper-column', column)\n .attr('data-swiper-row', row);\n }\n if (slide.css('display') === 'none') { continue; } // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n var slideStyles = win.getComputedStyle(slide[0], null);\n var currentTransform = slide[0].style.transform;\n var currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal()\n ? slide.outerWidth(true)\n : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n if (swiper.isHorizontal()) {\n var width = parseFloat(slideStyles.getPropertyValue('width'));\n var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));\n var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));\n var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));\n var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));\n var boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box' && !Browser.isIE) {\n slideSize = width + marginLeft + marginRight;\n } else {\n slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;\n }\n } else {\n var height = parseFloat(slideStyles.getPropertyValue('height'));\n var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));\n var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));\n var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));\n var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));\n var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing$1 && boxSizing$1 === 'border-box' && !Browser.isIE) {\n slideSize = height + marginTop + marginBottom;\n } else {\n slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;\n }\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n } else {\n slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;\n if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n\n if (slides[i]) {\n if (swiper.isHorizontal()) {\n slides[i].style.width = slideSize + \"px\";\n } else {\n slides[i].style.height = slideSize + \"px\";\n }\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;\n if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }\n if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n var newSlidesGrid;\n\n if (\n rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") });\n }\n if (!Support.flexbox || params.setWrapperSize) {\n if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n }\n\n if (params.slidesPerColumn > 1) {\n swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;\n if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n if (params.centeredSlides) {\n newSlidesGrid = [];\n for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {\n var slidesGridItem = snapGrid[i$1];\n if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }\n if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }\n }\n snapGrid = newSlidesGrid;\n }\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n newSlidesGrid = [];\n for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {\n var slidesGridItem$1 = snapGrid[i$2];\n if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }\n if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem$1);\n }\n }\n snapGrid = newSlidesGrid;\n if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) { snapGrid = [0]; }\n\n if (params.spaceBetween !== 0) {\n if (swiper.isHorizontal()) {\n if (rtl) { slides.css({ marginLeft: (spaceBetween + \"px\") }); }\n else { slides.css({ marginRight: (spaceBetween + \"px\") }); }\n } else { slides.css({ marginBottom: (spaceBetween + \"px\") }); }\n }\n\n if (params.centerInsufficientSlides) {\n var allSlidesSize = 0;\n slidesSizesGrid.forEach(function (slideSizeValue) {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n var allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach(function (snap, snapIndex) {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach(function (snap, snapIndex) {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Utils.extend(swiper, {\n slides: slides,\n snapGrid: snapGrid,\n slidesGrid: slidesGrid,\n slidesSizesGrid: slidesSizesGrid,\n });\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) { swiper.checkOverflow(); }\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress || params.watchSlidesVisibility) {\n swiper.updateSlidesOffset();\n }\n }\n\n function updateAutoHeight (speed) {\n var swiper = this;\n var activeSlides = [];\n var newHeight = 0;\n var i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n var index = swiper.activeIndex + i;\n if (index > swiper.slides.length) { break; }\n activeSlides.push(swiper.slides.eq(index)[0]);\n }\n } else {\n activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n var height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + \"px\")); }\n }\n\n function updateSlidesOffset () {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n }\n }\n\n function updateSlidesProgress (translate) {\n if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n var swiper = this;\n var params = swiper.params;\n\n var slides = swiper.slides;\n var rtl = swiper.rtlTranslate;\n\n if (slides.length === 0) { return; }\n if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }\n\n var offsetCenter = -translate;\n if (rtl) { offsetCenter = translate; }\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (var i = 0; i < slides.length; i += 1) {\n var slide = slides[i];\n var slideProgress = (\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset\n ) / (slide.swiperSlideSize + params.spaceBetween);\n if (params.watchSlidesVisibility) {\n var slideBefore = -(offsetCenter - slide.swiperSlideOffset);\n var slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)\n || (slideAfter > 1 && slideAfter <= swiper.size)\n || (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n }\n\n function updateProgress (translate) {\n if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n var swiper = this;\n var params = swiper.params;\n\n var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n var progress = swiper.progress;\n var isBeginning = swiper.isBeginning;\n var isEnd = swiper.isEnd;\n var wasBeginning = isBeginning;\n var wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / (translatesDiff);\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Utils.extend(swiper, {\n progress: progress,\n isBeginning: isBeginning,\n isEnd: isEnd,\n });\n\n if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n }\n\n function updateSlidesClasses () {\n var swiper = this;\n\n var slides = swiper.slides;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n var realIndex = swiper.realIndex;\n var isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(((params.slideActiveClass) + \" \" + (params.slideNextClass) + \" \" + (params.slidePrevClass) + \" \" + (params.slideDuplicateActiveClass) + \" \" + (params.slideDuplicateNextClass) + \" \" + (params.slideDuplicatePrevClass)));\n\n var activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + activeIndex + \"\\\"]\"));\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n var nextSlide = activeSlide.nextAll((\".\" + (params.slideClass))).eq(0).addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n var prevSlide = activeSlide.prevAll((\".\" + (params.slideClass))).eq(0).addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n }\n\n function updateActiveIndex (newActiveIndex) {\n var swiper = this;\n var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n var slidesGrid = swiper.slidesGrid;\n var snapGrid = swiper.snapGrid;\n var params = swiper.params;\n var previousIndex = swiper.activeIndex;\n var previousRealIndex = swiper.realIndex;\n var previousSnapIndex = swiper.snapIndex;\n var activeIndex = newActiveIndex;\n var snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (var i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n snapIndex = Math.floor(activeIndex / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n\n Utils.extend(swiper, {\n snapIndex: snapIndex,\n realIndex: realIndex,\n previousIndex: previousIndex,\n activeIndex: activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n if (swiper.initialized || swiper.runCallbacksOnInit) {\n swiper.emit('slideChange');\n }\n }\n\n function updateClickedSlide (e) {\n var swiper = this;\n var params = swiper.params;\n var slide = $(e.target).closest((\".\" + (params.slideClass)))[0];\n var slideFound = false;\n if (slide) {\n for (var i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) { slideFound = true; }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = $(slide).index();\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n swiper.slideToClickedSlide();\n }\n }\n\n var update = {\n updateSize: updateSize,\n updateSlides: updateSlides,\n updateAutoHeight: updateAutoHeight,\n updateSlidesOffset: updateSlidesOffset,\n updateSlidesProgress: updateSlidesProgress,\n updateProgress: updateProgress,\n updateSlidesClasses: updateSlidesClasses,\n updateActiveIndex: updateActiveIndex,\n updateClickedSlide: updateClickedSlide,\n };\n\n function getTranslate (axis) {\n if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';\n\n var swiper = this;\n\n var params = swiper.params;\n var rtl = swiper.rtlTranslate;\n var translate = swiper.translate;\n var $wrapperEl = swiper.$wrapperEl;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n\n var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);\n if (rtl) { currentTranslate = -currentTranslate; }\n\n return currentTranslate || 0;\n }\n\n function setTranslate (translate, byController) {\n var swiper = this;\n var rtl = swiper.rtlTranslate;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var progress = swiper.progress;\n var x = 0;\n var y = 0;\n var z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (!params.virtualTranslate) {\n if (Support.transforms3d) { $wrapperEl.transform((\"translate3d(\" + x + \"px, \" + y + \"px, \" + z + \"px)\")); }\n else { $wrapperEl.transform((\"translate(\" + x + \"px, \" + y + \"px)\")); }\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n var newProgress;\n var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / (translatesDiff);\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n }\n\n function minTranslate () {\n return (-this.snapGrid[0]);\n }\n\n function maxTranslate () {\n return (-this.snapGrid[this.snapGrid.length - 1]);\n }\n\n var translate = {\n getTranslate: getTranslate,\n setTranslate: setTranslate,\n minTranslate: minTranslate,\n maxTranslate: maxTranslate,\n };\n\n function setTransition (duration, byController) {\n var swiper = this;\n\n swiper.$wrapperEl.transition(duration);\n\n swiper.emit('setTransition', duration, byController);\n }\n\n function transitionStart (runCallbacks, direction) {\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var params = swiper.params;\n var previousIndex = swiper.previousIndex;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n var dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) { dir = 'next'; }\n else if (activeIndex < previousIndex) { dir = 'prev'; }\n else { dir = 'reset'; }\n }\n\n swiper.emit('transitionStart');\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit('slideResetTransitionStart');\n return;\n }\n swiper.emit('slideChangeTransitionStart');\n if (dir === 'next') {\n swiper.emit('slideNextTransitionStart');\n } else {\n swiper.emit('slidePrevTransitionStart');\n }\n }\n }\n\n function transitionEnd$1 (runCallbacks, direction) {\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var previousIndex = swiper.previousIndex;\n swiper.animating = false;\n swiper.setTransition(0);\n\n var dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) { dir = 'next'; }\n else if (activeIndex < previousIndex) { dir = 'prev'; }\n else { dir = 'reset'; }\n }\n\n swiper.emit('transitionEnd');\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit('slideResetTransitionEnd');\n return;\n }\n swiper.emit('slideChangeTransitionEnd');\n if (dir === 'next') {\n swiper.emit('slideNextTransitionEnd');\n } else {\n swiper.emit('slidePrevTransitionEnd');\n }\n }\n }\n\n var transition$1 = {\n setTransition: setTransition,\n transitionStart: transitionStart,\n transitionEnd: transitionEnd$1,\n };\n\n function slideTo (index, speed, runCallbacks, internal) {\n if ( index === void 0 ) index = 0;\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var slideIndex = index;\n if (slideIndex < 0) { slideIndex = 0; }\n\n var params = swiper.params;\n var snapGrid = swiper.snapGrid;\n var slidesGrid = swiper.slidesGrid;\n var previousIndex = swiper.previousIndex;\n var activeIndex = swiper.activeIndex;\n var rtl = swiper.rtlTranslate;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n var translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (var i = 0; i < slidesGrid.length; i += 1) {\n if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n return false;\n }\n if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n if ((activeIndex || 0) !== slideIndex) { return false; }\n }\n }\n\n var direction;\n if (slideIndex > activeIndex) { direction = 'next'; }\n else if (slideIndex < activeIndex) { direction = 'prev'; }\n else { direction = 'reset'; }\n\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n\n if (speed === 0 || !Support.transition) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) { return; }\n if (e.target !== this) { return; }\n swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n }\n }\n\n return true;\n }\n\n function slideToLoop (index, speed, runCallbacks, internal) {\n if ( index === void 0 ) index = 0;\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideNext (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n }\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slidePrev (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n var snapGrid = swiper.snapGrid;\n var slidesGrid = swiper.slidesGrid;\n var rtlTranslate = swiper.rtlTranslate;\n\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n var translate = rtlTranslate ? swiper.translate : -swiper.translate;\n function normalize(val) {\n if (val < 0) { return -Math.floor(Math.abs(val)); }\n return Math.floor(val);\n }\n var normalizedTranslate = normalize(translate);\n var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });\n var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });\n\n var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];\n var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n var prevIndex;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideReset (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideToClosest (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var index = swiper.activeIndex;\n var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);\n\n if (snapIndex < swiper.snapGrid.length - 1) {\n var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n var currentSnap = swiper.snapGrid[snapIndex];\n var nextSnap = swiper.snapGrid[snapIndex + 1];\n\n if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {\n index = swiper.params.slidesPerGroup;\n }\n }\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n }\n\n function slideToClickedSlide () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n\n var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n var slideToIndex = swiper.clickedIndex;\n var realIndex;\n if (params.loop) {\n if (swiper.animating) { return; }\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))\n || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n }\n\n var slide = {\n slideTo: slideTo,\n slideToLoop: slideToLoop,\n slideNext: slideNext,\n slidePrev: slidePrev,\n slideReset: slideReset,\n slideToClosest: slideToClosest,\n slideToClickedSlide: slideToClickedSlide,\n };\n\n function loopCreate () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n // Remove duplicated slides\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass))).remove();\n\n var slides = $wrapperEl.children((\".\" + (params.slideClass)));\n\n if (params.loopFillGroupWithBlank) {\n var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (var i = 0; i < blankSlidesNum; i += 1) {\n var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + \" \" + (params.slideBlankClass)));\n $wrapperEl.append(blankNode);\n }\n slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }\n\n swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n var prependSlides = [];\n var appendSlides = [];\n slides.each(function (index, el) {\n var slide = $(el);\n if (index < swiper.loopedSlides) { appendSlides.push(el); }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }\n slide.attr('data-swiper-slide-index', index);\n });\n for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {\n $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {\n $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n }\n\n function loopFix () {\n var swiper = this;\n var params = swiper.params;\n var activeIndex = swiper.activeIndex;\n var slides = swiper.slides;\n var loopedSlides = swiper.loopedSlides;\n var allowSlidePrev = swiper.allowSlidePrev;\n var allowSlideNext = swiper.allowSlideNext;\n var snapGrid = swiper.snapGrid;\n var rtl = swiper.rtlTranslate;\n var newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n var snapTranslate = -snapGrid[activeIndex];\n var diff = snapTranslate - swiper.getTranslate();\n\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;\n newIndex += loopedSlides;\n var slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged$1 && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n }\n\n function loopDestroy () {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n var slides = swiper.slides;\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \",.\" + (params.slideClass) + \".\" + (params.slideBlankClass))).remove();\n slides.removeAttr('data-swiper-slide-index');\n }\n\n var loop = {\n loopCreate: loopCreate,\n loopFix: loopFix,\n loopDestroy: loopDestroy,\n };\n\n function setGrabCursor (moving) {\n var swiper = this;\n if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n var el = swiper.el;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n }\n\n function unsetGrabCursor () {\n var swiper = this;\n if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n swiper.el.style.cursor = '';\n }\n\n var grabCursor = {\n setGrabCursor: setGrabCursor,\n unsetGrabCursor: unsetGrabCursor,\n };\n\n function appendSlide (slides) {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.append(slides[i]); }\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n }\n\n function prependSlide (slides) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n var newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.prepend(slides[i]); }\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n }\n\n function addSlide (index, slides) {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n var activeIndex = swiper.activeIndex;\n var activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n var baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n var slidesBuffer = [];\n for (var i = baseLength - 1; i >= index; i -= 1) {\n var currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }\n }\n newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {\n $wrapperEl.append(slidesBuffer[i$2]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n }\n\n function removeSlide (slidesIndexes) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n var activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n var newActiveIndex = activeIndexBuffer;\n var indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (var i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n }\n\n function removeAllSlides () {\n var swiper = this;\n\n var slidesIndexes = [];\n for (var i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n }\n\n var manipulation = {\n appendSlide: appendSlide,\n prependSlide: prependSlide,\n addSlide: addSlide,\n removeSlide: removeSlide,\n removeAllSlides: removeAllSlides,\n };\n\n var Device = (function Device() {\n var ua = win.navigator.userAgent;\n\n var device = {\n ios: false,\n android: false,\n androidChrome: false,\n desktop: false,\n windows: false,\n iphone: false,\n ipod: false,\n ipad: false,\n cordova: win.cordova || win.phonegap,\n phonegap: win.cordova || win.phonegap,\n };\n\n var windows = ua.match(/(Windows Phone);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n var iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n\n\n // Windows\n if (windows) {\n device.os = 'windows';\n device.osVersion = windows[2];\n device.windows = true;\n }\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.osVersion = android[2];\n device.android = true;\n device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n // iOS\n if (iphone && !ipod) {\n device.osVersion = iphone[2].replace(/_/g, '.');\n device.iphone = true;\n }\n if (ipad) {\n device.osVersion = ipad[2].replace(/_/g, '.');\n device.ipad = true;\n }\n if (ipod) {\n device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n device.iphone = true;\n }\n // iOS 8+ changed UA\n if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n if (device.osVersion.split('.')[0] === '10') {\n device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n }\n }\n\n // Desktop\n device.desktop = !(device.os || device.android || device.webView);\n\n // Webview\n device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n\n // Minimal UI\n if (device.os && device.os === 'ios') {\n var osVersionArr = device.osVersion.split('.');\n var metaViewport = doc.querySelector('meta[name=\"viewport\"]');\n device.minimalUi = !device.webView\n && (ipod || iphone)\n && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)\n && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;\n }\n\n // Pixel Ratio\n device.pixelRatio = win.devicePixelRatio || 1;\n\n // Export object\n return device;\n }());\n\n function onTouchStart (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }\n if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }\n if (data.isTouched && data.isMoved) { return; }\n if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : (\".\" + (params.noSwipingClass)))[0]) {\n swiper.allowClick = true;\n return;\n }\n if (params.swipeHandler) {\n if (!$(e).closest(params.swipeHandler)[0]) { return; }\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n var startX = touches.currentX;\n var startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore\n\n var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection\n && ((startX <= edgeSwipeThreshold)\n || (startX >= win.screen.width - edgeSwipeThreshold))\n ) {\n return;\n }\n\n Utils.extend(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = Utils.now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) { data.allowThresholdMove = false; }\n if (e.type !== 'touchstart') {\n var preventDefault = true;\n if ($(e.target).is(data.formElements)) { preventDefault = false; }\n if (\n doc.activeElement\n && $(doc.activeElement).is(data.formElements)\n && doc.activeElement !== e.target\n ) {\n doc.activeElement.blur();\n }\n\n var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (params.touchStartForcePreventDefault || shouldPreventDefault) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n }\n\n function onTouchMove (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtlTranslate;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type === 'mousemove') { return; }\n var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Utils.extend(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = Utils.now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())\n || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())\n || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && doc.activeElement) {\n if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) { return; }\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n var diffX = touches.currentX - touches.startX;\n var diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }\n\n if (typeof data.isScrolling === 'undefined') {\n var touchAngle;\n if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if ((diffX * diffX) + (diffY * diffY) >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n e.preventDefault();\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n var diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) { diff = -diff; }\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n var disableParentSwiper = true;\n var resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger) { return; }\n\n // Update active index in free mode\n if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (params.freeMode) {\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: Utils.now(),\n });\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n }\n\n function onTouchEnd (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtlTranslate;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesGrid = swiper.slidesGrid;\n var snapGrid = swiper.snapGrid;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n var touchEndTime = Utils.now();\n var timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap', e);\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n data.clickTimeout = Utils.nextTick(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.emit('click', e);\n }, 300);\n }\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n swiper.emit('doubleTap', e);\n }\n }\n\n data.lastClickTime = Utils.now();\n Utils.nextTick(function () {\n if (!swiper.destroyed) { swiper.allowClick = true; }\n });\n\n if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n var currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.freeMode) {\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeModeMomentum) {\n if (data.velocities.length > 1) {\n var lastMoveEvent = data.velocities.pop();\n var velocityEvent = data.velocities.pop();\n\n var distance = lastMoveEvent.position - velocityEvent.position;\n var time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeModeMomentumVelocityRatio;\n\n data.velocities.length = 0;\n var momentumDuration = 1000 * params.freeModeMomentumRatio;\n var momentumDistance = swiper.velocity * momentumDuration;\n\n var newPosition = swiper.translate + momentumDistance;\n if (rtl) { newPosition = -newPosition; }\n\n var doBounce = false;\n var afterBouncePosition;\n var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;\n var needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n } else if (params.freeModeSticky) {\n var nextSlide;\n for (var j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n swiper.once('transitionEnd', function () {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n } else if (params.freeModeSticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeModeMomentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }\n swiper.emit('momentumBounce');\n\n swiper.setTransition(params.speed);\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n });\n } else if (swiper.velocity) {\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeModeSticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n return;\n }\n\n // Find current slide\n var stopIndex = 0;\n var groupSize = swiper.slidesSizesGrid[0];\n for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {\n if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {\n stopIndex = i;\n groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + params.slidesPerGroup);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n }\n }\n\n function onResize () {\n var swiper = this;\n\n var params = swiper.params;\n var el = swiper.el;\n\n if (el && el.offsetWidth === 0) { return; }\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n var allowSlideNext = swiper.allowSlideNext;\n var allowSlidePrev = swiper.allowSlidePrev;\n var snapGrid = swiper.snapGrid;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n if (params.freeMode) {\n var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n swiper.updateSlidesClasses();\n if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n }\n if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n swiper.autoplay.run();\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n }\n\n function onClick (e) {\n var swiper = this;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) { e.preventDefault(); }\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n }\n\n function attachEvents() {\n var swiper = this;\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n {\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n target.addEventListener(touchEvents.start, swiper.onTouchStart, false);\n doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);\n doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);\n target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.addEventListener('mousedown', swiper.onTouchStart, false);\n doc.addEventListener('mousemove', swiper.onTouchMove, capture);\n doc.addEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.addEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);\n }\n\n function detachEvents() {\n var swiper = this;\n\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);\n doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.removeEventListener('mousedown', swiper.onTouchStart, false);\n doc.removeEventListener('mousemove', swiper.onTouchMove, capture);\n doc.removeEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.removeEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);\n }\n\n var events = {\n attachEvents: attachEvents,\n detachEvents: detachEvents,\n };\n\n function setBreakpoint () {\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var initialized = swiper.initialized;\n var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;\n var params = swiper.params;\n var breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }\n\n // Set breakpoint for window width and update parameters\n var breakpoint = swiper.getBreakpoint(breakpoints);\n\n if (breakpoint && swiper.currentBreakpoint !== breakpoint) {\n var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n if (breakpointOnlyParams) {\n ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {\n var paramValue = breakpointOnlyParams[param];\n if (typeof paramValue === 'undefined') { return; }\n if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {\n breakpointOnlyParams[param] = 'auto';\n } else if (param === 'slidesPerView') {\n breakpointOnlyParams[param] = parseFloat(paramValue);\n } else {\n breakpointOnlyParams[param] = parseInt(paramValue, 10);\n }\n });\n }\n\n var breakpointParams = breakpointOnlyParams || swiper.originalParams;\n var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n\n Utils.extend(swiper.params, breakpointParams);\n\n Utils.extend(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n swiper.currentBreakpoint = breakpoint;\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n }\n }\n\n function getBreakpoint (breakpoints) {\n var swiper = this;\n // Get breakpoint for window width\n if (!breakpoints) { return undefined; }\n var breakpoint = false;\n var points = [];\n Object.keys(breakpoints).forEach(function (point) {\n points.push(point);\n });\n points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });\n for (var i = 0; i < points.length; i += 1) {\n var point = points[i];\n if (swiper.params.breakpointsInverse) {\n if (point <= win.innerWidth) {\n breakpoint = point;\n }\n } else if (point >= win.innerWidth && !breakpoint) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n }\n\n var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };\n\n function addClasses () {\n var swiper = this;\n var classNames = swiper.classNames;\n var params = swiper.params;\n var rtl = swiper.rtl;\n var $el = swiper.$el;\n var suffixes = [];\n\n suffixes.push('initialized');\n suffixes.push(params.direction);\n\n if (params.freeMode) {\n suffixes.push('free-mode');\n }\n if (!Support.flexbox) {\n suffixes.push('no-flexbox');\n }\n if (params.autoHeight) {\n suffixes.push('autoheight');\n }\n if (rtl) {\n suffixes.push('rtl');\n }\n if (params.slidesPerColumn > 1) {\n suffixes.push('multirow');\n }\n if (Device.android) {\n suffixes.push('android');\n }\n if (Device.ios) {\n suffixes.push('ios');\n }\n // WP8 Touch Events Fix\n if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n suffixes.push((\"wp8-\" + (params.direction)));\n }\n\n suffixes.forEach(function (suffix) {\n classNames.push(params.containerModifierClass + suffix);\n });\n\n $el.addClass(classNames.join(' '));\n }\n\n function removeClasses () {\n var swiper = this;\n var $el = swiper.$el;\n var classNames = swiper.classNames;\n\n $el.removeClass(classNames.join(' '));\n }\n\n var classes = { addClasses: addClasses, removeClasses: removeClasses };\n\n function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {\n var image;\n function onReady() {\n if (callback) { callback(); }\n }\n if (!imageEl.complete || !checkForComplete) {\n if (src) {\n image = new win.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n }\n\n function preloadImages () {\n var swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }\n if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) { swiper.update(); }\n swiper.emit('imagesReady');\n }\n }\n for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {\n var imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady\n );\n }\n }\n\n var images = {\n loadImage: loadImage,\n preloadImages: preloadImages,\n };\n\n function checkOverflow() {\n var swiper = this;\n var wasLocked = swiper.isLocked;\n\n swiper.isLocked = swiper.snapGrid.length === 1;\n swiper.allowSlideNext = !swiper.isLocked;\n swiper.allowSlidePrev = !swiper.isLocked;\n\n // events\n if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n swiper.navigation.update();\n }\n }\n\n var checkOverflow$1 = { checkOverflow: checkOverflow };\n\n var defaults = {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'container',\n initialSlide: 0,\n speed: 300,\n //\n preventInteractionOnTransition: false,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Free mode\n freeMode: false,\n freeModeMomentum: true,\n freeModeMomentumRatio: 1,\n freeModeMomentumBounce: true,\n freeModeMomentumBounceRatio: 1,\n freeModeMomentumVelocityRatio: 1,\n freeModeSticky: false,\n freeModeMinimumVelocity: 0.02,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsInverse: false,\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerColumnFill: 'column',\n slidesPerGroup: 1,\n centeredSlides: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: false,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: true,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n watchSlidesVisibility: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-container-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n };\n\n /* eslint no-param-reassign: \"off\" */\n\n var prototypes = {\n update: update,\n translate: translate,\n transition: transition$1,\n slide: slide,\n loop: loop,\n grabCursor: grabCursor,\n manipulation: manipulation,\n events: events,\n breakpoints: breakpoints,\n checkOverflow: checkOverflow$1,\n classes: classes,\n images: images,\n };\n\n var extendedDefaults = {};\n\n var Swiper = /*@__PURE__*/(function (SwiperClass) {\n function Swiper() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var el;\n var params;\n if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {\n params = args[0];\n } else {\n (assign = args, el = assign[0], params = assign[1]);\n }\n if (!params) { params = {}; }\n\n params = Utils.extend({}, params);\n if (el && !params.el) { params.el = el; }\n\n SwiperClass.call(this, params);\n\n Object.keys(prototypes).forEach(function (prototypeGroup) {\n Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {\n if (!Swiper.prototype[protoMethod]) {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n }\n });\n });\n\n // Swiper Instance\n var swiper = this;\n if (typeof swiper.modules === 'undefined') {\n swiper.modules = {};\n }\n Object.keys(swiper.modules).forEach(function (moduleName) {\n var module = swiper.modules[moduleName];\n if (module.params) {\n var moduleParamName = Object.keys(module.params)[0];\n var moduleParams = module.params[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) { return; }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (\n typeof params[moduleParamName] === 'object'\n && !('enabled' in params[moduleParamName])\n ) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }\n }\n });\n\n // Extend defaults with modules params\n var swiperParams = Utils.extend({}, defaults);\n swiper.useModulesParams(swiperParams);\n\n // Extend defaults with passed params\n swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = Utils.extend({}, swiper.params);\n swiper.passedParams = Utils.extend({}, params);\n\n // Save Dom lib\n swiper.$ = $;\n\n // Find el\n var $el = $(swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return undefined;\n }\n\n if ($el.length > 1) {\n var swipers = [];\n $el.each(function (index, containerEl) {\n var newParams = Utils.extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n el.swiper = swiper;\n $el.data('swiper', swiper);\n\n // Find Wrapper\n var $wrapperEl = $el.children((\".\" + (swiper.params.wrapperClass)));\n\n // Extend Swiper\n Utils.extend(swiper, {\n $el: $el,\n el: el,\n $wrapperEl: $wrapperEl,\n wrapperEl: $wrapperEl[0],\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal: function isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical: function isVertical() {\n return swiper.params.direction === 'vertical';\n },\n // RTL\n rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n var touch = ['touchstart', 'touchmove', 'touchend'];\n var desktop = ['mousedown', 'mousemove', 'mouseup'];\n if (Support.pointerEvents) {\n desktop = ['pointerdown', 'pointermove', 'pointerup'];\n } else if (Support.prefixedPointerEvents) {\n desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];\n }\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n }()),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n formElements: 'input, select, option, textarea, button, video',\n // Last click time\n lastClickTime: Utils.now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n\n });\n\n // Install Modules\n swiper.useModules();\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n if ( SwiperClass ) Swiper.__proto__ = SwiperClass;\n Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );\n Swiper.prototype.constructor = Swiper;\n\n var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };\n\n Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {\n var swiper = this;\n var params = swiper.params;\n var slides = swiper.slides;\n var slidesGrid = swiper.slidesGrid;\n var swiperSize = swiper.size;\n var activeIndex = swiper.activeIndex;\n var spv = 1;\n if (params.centeredSlides) {\n var slideSize = slides[activeIndex].swiperSlideSize;\n var breakLoop;\n for (var i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {\n if (slides[i$1] && !breakLoop) {\n slideSize += slides[i$1].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n } else {\n for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {\n if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {\n spv += 1;\n }\n }\n }\n return spv;\n };\n\n Swiper.prototype.update = function update () {\n var swiper = this;\n if (!swiper || swiper.destroyed) { return; }\n var snapGrid = swiper.snapGrid;\n var params = swiper.params;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n var translated;\n if (swiper.params.freeMode) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n };\n\n Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {\n if ( needUpdate === void 0 ) needUpdate = true;\n\n var swiper = this;\n var currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {\n return swiper;\n }\n\n swiper.$el\n .removeClass((\"\" + (swiper.params.containerModifierClass) + currentDirection + \" wp8-\" + currentDirection))\n .addClass((\"\" + (swiper.params.containerModifierClass) + newDirection));\n\n if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n swiper.$el.addClass(((swiper.params.containerModifierClass) + \"wp8-\" + newDirection));\n }\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each(function (slideIndex, slideEl) {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) { swiper.update(); }\n\n return swiper;\n };\n\n Swiper.prototype.init = function init () {\n var swiper = this;\n if (swiper.initialized) { return; }\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n };\n\n Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {\n if ( deleteInstance === void 0 ) deleteInstance = true;\n if ( cleanStyles === void 0 ) cleanStyles = true;\n\n var swiper = this;\n var params = swiper.params;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass([\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass ].join(' '))\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index')\n .removeAttr('data-swiper-column')\n .removeAttr('data-swiper-row');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach(function (eventName) {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n swiper.$el.data('swiper', null);\n Utils.deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n };\n\n Swiper.extendDefaults = function extendDefaults (newDefaults) {\n Utils.extend(extendedDefaults, newDefaults);\n };\n\n staticAccessors.extendedDefaults.get = function () {\n return extendedDefaults;\n };\n\n staticAccessors.defaults.get = function () {\n return defaults;\n };\n\n staticAccessors.Class.get = function () {\n return SwiperClass;\n };\n\n staticAccessors.$.get = function () {\n return $;\n };\n\n Object.defineProperties( Swiper, staticAccessors );\n\n return Swiper;\n }(SwiperClass));\n\n var Device$1 = {\n name: 'device',\n proto: {\n device: Device,\n },\n static: {\n device: Device,\n },\n };\n\n var Support$1 = {\n name: 'support',\n proto: {\n support: Support,\n },\n static: {\n support: Support,\n },\n };\n\n var Browser$1 = {\n name: 'browser',\n proto: {\n browser: Browser,\n },\n static: {\n browser: Browser,\n },\n };\n\n var Resize = {\n name: 'resize',\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n resize: {\n resizeHandler: function resizeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('beforeResize');\n swiper.emit('resize');\n },\n orientationChangeHandler: function orientationChangeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('orientationchange');\n },\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n // Emit resize\n win.addEventListener('resize', swiper.resize.resizeHandler);\n\n // Emit orientationchange\n win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n destroy: function destroy() {\n var swiper = this;\n win.removeEventListener('resize', swiper.resize.resizeHandler);\n win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n },\n };\n\n var Observer = {\n func: win.MutationObserver || win.WebkitMutationObserver,\n attach: function attach(target, options) {\n if ( options === void 0 ) options = {};\n\n var swiper = this;\n\n var ObserverFunc = Observer.func;\n var observer = new ObserverFunc(function (mutations) {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n swiper.emit('observerUpdate', mutations[0]);\n return;\n }\n var observerUpdate = function observerUpdate() {\n swiper.emit('observerUpdate', mutations[0]);\n };\n\n if (win.requestAnimationFrame) {\n win.requestAnimationFrame(observerUpdate);\n } else {\n win.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n swiper.observer.observers.push(observer);\n },\n init: function init() {\n var swiper = this;\n if (!Support.observer || !swiper.params.observer) { return; }\n if (swiper.params.observeParents) {\n var containerParents = swiper.$el.parents();\n for (var i = 0; i < containerParents.length; i += 1) {\n swiper.observer.attach(containerParents[i]);\n }\n }\n // Observe container\n swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });\n\n // Observe wrapper\n swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.observers.forEach(function (observer) {\n observer.disconnect();\n });\n swiper.observer.observers = [];\n },\n };\n\n var Observer$1 = {\n name: 'observer',\n params: {\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n observer: {\n init: Observer.init.bind(swiper),\n attach: Observer.attach.bind(swiper),\n destroy: Observer.destroy.bind(swiper),\n observers: [],\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.observer.init();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.destroy();\n },\n },\n };\n\n var Virtual = {\n update: function update(force) {\n var swiper = this;\n var ref = swiper.params;\n var slidesPerView = ref.slidesPerView;\n var slidesPerGroup = ref.slidesPerGroup;\n var centeredSlides = ref.centeredSlides;\n var ref$1 = swiper.params.virtual;\n var addSlidesBefore = ref$1.addSlidesBefore;\n var addSlidesAfter = ref$1.addSlidesAfter;\n var ref$2 = swiper.virtual;\n var previousFrom = ref$2.from;\n var previousTo = ref$2.to;\n var slides = ref$2.slides;\n var previousSlidesGrid = ref$2.slidesGrid;\n var renderSlide = ref$2.renderSlide;\n var previousOffset = ref$2.offset;\n swiper.updateActiveIndex();\n var activeIndex = swiper.activeIndex || 0;\n\n var offsetProp;\n if (swiper.rtlTranslate) { offsetProp = 'right'; }\n else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }\n\n var slidesAfter;\n var slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;\n slidesBefore = slidesPerGroup + addSlidesAfter;\n }\n var from = Math.max((activeIndex || 0) - slidesBefore, 0);\n var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Utils.extend(swiper.virtual, {\n from: from,\n to: to,\n offset: offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, (offset + \"px\"));\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset: offset,\n from: from,\n to: to,\n slides: (function getSlides() {\n var slidesToRender = [];\n for (var i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n }()),\n });\n onRendered();\n return;\n }\n var prependIndexes = [];\n var appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass))).remove();\n } else {\n for (var i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + i + \"\\\"]\")).remove();\n }\n }\n }\n for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n if (i$1 >= from && i$1 <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i$1);\n } else {\n if (i$1 > previousTo) { appendIndexes.push(i$1); }\n if (i$1 < previousFrom) { prependIndexes.push(i$1); }\n }\n }\n }\n appendIndexes.forEach(function (index) {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + \"px\"));\n onRendered();\n },\n renderSlide: function renderSlide(slide, index) {\n var swiper = this;\n var params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n var $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $((\"<div class=\\\"\" + (swiper.params.slideClass) + \"\\\" data-swiper-slide-index=\\\"\" + index + \"\\\">\" + slide + \"</div>\"));\n if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }\n if (params.cache) { swiper.virtual.cache[index] = $slideEl; }\n return $slideEl;\n },\n appendSlide: function appendSlide(slides) {\n var swiper = this;\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { swiper.virtual.slides.push(slides[i]); }\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n swiper.virtual.update(true);\n },\n prependSlide: function prependSlide(slides) {\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var newActiveIndex = activeIndex + 1;\n var numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n var cache = swiper.virtual.cache;\n var newCache = {};\n Object.keys(cache).forEach(function (cachedIndex) {\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex];\n });\n swiper.virtual.cache = newCache;\n }\n swiper.virtual.update(true);\n swiper.slideTo(newActiveIndex, 0);\n },\n removeSlide: function removeSlide(slidesIndexes) {\n var swiper = this;\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }\n var activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) { activeIndex -= 1; }\n activeIndex = Math.max(activeIndex, 0);\n }\n swiper.virtual.update(true);\n swiper.slideTo(activeIndex, 0);\n },\n removeAllSlides: function removeAllSlides() {\n var swiper = this;\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n swiper.virtual.update(true);\n swiper.slideTo(0, 0);\n },\n };\n\n var Virtual$1 = {\n name: 'virtual',\n params: {\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n virtual: {\n update: Virtual.update.bind(swiper),\n appendSlide: Virtual.appendSlide.bind(swiper),\n prependSlide: Virtual.prependSlide.bind(swiper),\n removeSlide: Virtual.removeSlide.bind(swiper),\n removeAllSlides: Virtual.removeAllSlides.bind(swiper),\n renderSlide: Virtual.renderSlide.bind(swiper),\n slides: swiper.params.virtual.slides,\n cache: {},\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"virtual\"));\n var overwriteParams = {\n watchSlidesProgress: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n\n if (!swiper.params.initialSlide) {\n swiper.virtual.update();\n }\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.virtual.update();\n },\n },\n };\n\n var Keyboard = {\n handle: function handle(event) {\n var swiper = this;\n var rtl = swiper.rtlTranslate;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var kc = e.keyCode || e.charCode;\n // Directions locks\n if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {\n return false;\n }\n if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {\n return undefined;\n }\n if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {\n var inView = false;\n // Check that swiper should be inside of visible area of window\n if (swiper.$el.parents((\".\" + (swiper.params.slideClass))).length > 0 && swiper.$el.parents((\".\" + (swiper.params.slideActiveClass))).length === 0) {\n return undefined;\n }\n var windowWidth = win.innerWidth;\n var windowHeight = win.innerHeight;\n var swiperOffset = swiper.$el.offset();\n if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }\n var swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];\n for (var i = 0; i < swiperCoord.length; i += 1) {\n var point = swiperCoord[i];\n if (\n point[0] >= 0 && point[0] <= windowWidth\n && point[1] >= 0 && point[1] <= windowHeight\n ) {\n inView = true;\n }\n }\n if (!inView) { return undefined; }\n }\n if (swiper.isHorizontal()) {\n if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }\n if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }\n } else {\n if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if (kc === 34 || kc === 40) { swiper.slideNext(); }\n if (kc === 33 || kc === 38) { swiper.slidePrev(); }\n }\n swiper.emit('keyPress', kc);\n return undefined;\n },\n enable: function enable() {\n var swiper = this;\n if (swiper.keyboard.enabled) { return; }\n $(doc).on('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = true;\n },\n disable: function disable() {\n var swiper = this;\n if (!swiper.keyboard.enabled) { return; }\n $(doc).off('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = false;\n },\n };\n\n var Keyboard$1 = {\n name: 'keyboard',\n params: {\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n keyboard: {\n enabled: false,\n enable: Keyboard.enable.bind(swiper),\n disable: Keyboard.disable.bind(swiper),\n handle: Keyboard.handle.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.keyboard.enabled) {\n swiper.keyboard.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.keyboard.enabled) {\n swiper.keyboard.disable();\n }\n },\n },\n };\n\n function isEventSupported() {\n var eventName = 'onwheel';\n var isSupported = eventName in doc;\n\n if (!isSupported) {\n var element = doc.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported\n && doc.implementation\n && doc.implementation.hasFeature\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n && doc.implementation.hasFeature('', '') !== true\n ) {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n }\n var Mousewheel = {\n lastScrollTime: Utils.now(),\n event: (function getEvent() {\n if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }\n return isEventSupported() ? 'wheel' : 'mousewheel';\n }()),\n normalize: function normalize(e) {\n // Reasonable defaults\n var PIXEL_STEP = 10;\n var LINE_HEIGHT = 40;\n var PAGE_HEIGHT = 800;\n\n var sX = 0;\n var sY = 0; // spinX, spinY\n var pX = 0;\n var pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = (pX < 1) ? -1 : 1;\n }\n if (pY && !sY) {\n sY = (pY < 1) ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n },\n handleMouseEnter: function handleMouseEnter() {\n var swiper = this;\n swiper.mouseEntered = true;\n },\n handleMouseLeave: function handleMouseLeave() {\n var swiper = this;\n swiper.mouseEntered = false;\n },\n handle: function handle(event) {\n var e = event;\n var swiper = this;\n var params = swiper.params.mousewheel;\n\n if (!swiper.mouseEntered && !params.releaseOnEdges) { return true; }\n\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var delta = 0;\n var rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n var data = Mousewheel.normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }\n else { return true; }\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }\n else { return true; }\n } else {\n delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) { return true; }\n\n if (params.invert) { delta = -delta; }\n\n if (!swiper.params.freeMode) {\n if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) {\n if (delta < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n }\n swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();\n } else {\n // Freemode or scrollContainer:\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n var position = swiper.getTranslate() + (delta * params.sensitivity);\n var wasBeginning = swiper.isBeginning;\n var wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }\n if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeModeSticky) {\n clearTimeout(swiper.mousewheel.timeout);\n swiper.mousewheel.timeout = Utils.nextTick(function () {\n swiper.slideToClosest();\n }, 300);\n }\n // Emit event\n swiper.emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }\n }\n\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n return false;\n },\n enable: function enable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarged);\n }\n target.on('mouseenter', swiper.mousewheel.handleMouseEnter);\n target.on('mouseleave', swiper.mousewheel.handleMouseLeave);\n target.on(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = true;\n return true;\n },\n disable: function disable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (!swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarged);\n }\n target.off(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = false;\n return true;\n },\n };\n\n var Mousewheel$1 = {\n name: 'mousewheel',\n params: {\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarged: 'container',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n mousewheel: {\n enabled: false,\n enable: Mousewheel.enable.bind(swiper),\n disable: Mousewheel.disable.bind(swiper),\n handle: Mousewheel.handle.bind(swiper),\n handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),\n handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),\n lastScrollTime: Utils.now(),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }\n },\n },\n };\n\n var Navigation = {\n update: function update() {\n // Update Navigation Buttons\n var swiper = this;\n var params = swiper.params.navigation;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n $prevEl.addClass(params.disabledClass);\n } else {\n $prevEl.removeClass(params.disabledClass);\n }\n $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n $nextEl.addClass(params.disabledClass);\n } else {\n $nextEl.removeClass(params.disabledClass);\n }\n $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n },\n onPrevClick: function onPrevClick(e) {\n var swiper = this;\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) { return; }\n swiper.slidePrev();\n },\n onNextClick: function onNextClick(e) {\n var swiper = this;\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) { return; }\n swiper.slideNext();\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.navigation;\n if (!(params.nextEl || params.prevEl)) { return; }\n\n var $nextEl;\n var $prevEl;\n if (params.nextEl) {\n $nextEl = $(params.nextEl);\n if (\n swiper.params.uniqueNavElements\n && typeof params.nextEl === 'string'\n && $nextEl.length > 1\n && swiper.$el.find(params.nextEl).length === 1\n ) {\n $nextEl = swiper.$el.find(params.nextEl);\n }\n }\n if (params.prevEl) {\n $prevEl = $(params.prevEl);\n if (\n swiper.params.uniqueNavElements\n && typeof params.prevEl === 'string'\n && $prevEl.length > 1\n && swiper.$el.find(params.prevEl).length === 1\n ) {\n $prevEl = swiper.$el.find(params.prevEl);\n }\n }\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', swiper.navigation.onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', swiper.navigation.onPrevClick);\n }\n\n Utils.extend(swiper.navigation, {\n $nextEl: $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl: $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', swiper.navigation.onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', swiper.navigation.onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n },\n };\n\n var Navigation$1 = {\n name: 'navigation',\n params: {\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n navigation: {\n init: Navigation.init.bind(swiper),\n update: Navigation.update.bind(swiper),\n destroy: Navigation.destroy.bind(swiper),\n onNextClick: Navigation.onNextClick.bind(swiper),\n onPrevClick: Navigation.onPrevClick.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.navigation.init();\n swiper.navigation.update();\n },\n toEdge: function toEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.navigation.destroy();\n },\n click: function click(e) {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if (\n swiper.params.navigation.hideOnClick\n && !$(e.target).is($prevEl)\n && !$(e.target).is($nextEl)\n ) {\n var isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n swiper.emit('navigationShow', swiper);\n } else {\n swiper.emit('navigationHide', swiper);\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n },\n },\n };\n\n var Pagination = {\n update: function update() {\n // Render || Update Pagination bullets/items\n var swiper = this;\n var rtl = swiper.rtl;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n var $el = swiper.pagination.$el;\n // Current/Total\n var current;\n var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {\n current -= (slidesLength - (swiper.loopedSlides * 2));\n }\n if (current > total - 1) { current -= total; }\n if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n var bullets = swiper.pagination.bullets;\n var firstIndex;\n var lastIndex;\n var midIndex;\n if (params.dynamicBullets) {\n swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + \"px\"));\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);\n if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {\n swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (swiper.pagination.dynamicBulletIndex < 0) {\n swiper.pagination.dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - swiper.pagination.dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(((params.bulletActiveClass) + \" \" + (params.bulletActiveClass) + \"-next \" + (params.bulletActiveClass) + \"-next-next \" + (params.bulletActiveClass) + \"-prev \" + (params.bulletActiveClass) + \"-prev-prev \" + (params.bulletActiveClass) + \"-main\"));\n if ($el.length > 1) {\n bullets.each(function (index, bullet) {\n var $bullet = $(bullet);\n var bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(((params.bulletActiveClass) + \"-main\"));\n }\n if (bulletIndex === firstIndex) {\n $bullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n }\n if (bulletIndex === lastIndex) {\n $bullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n });\n } else {\n var $bullet = bullets.eq(current);\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n var $firstDisplayedBullet = bullets.eq(firstIndex);\n var $lastDisplayedBullet = bullets.eq(lastIndex);\n for (var i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(((params.bulletActiveClass) + \"-main\"));\n }\n $firstDisplayedBullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n $lastDisplayedBullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n if (params.dynamicBullets) {\n var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);\n var offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + \"px\"));\n }\n }\n if (params.type === 'fraction') {\n $el.find((\".\" + (params.currentClass))).text(params.formatFractionCurrent(current + 1));\n $el.find((\".\" + (params.totalClass))).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n var progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n var scale = (current + 1) / total;\n var scaleX = 1;\n var scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el.find((\".\" + (params.progressbarFillClass))).transform((\"translate3d(0,0,0) scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\")).transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n swiper.emit('paginationRender', swiper, $el[0]);\n } else {\n swiper.emit('paginationUpdate', swiper, $el[0]);\n }\n $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n },\n render: function render() {\n // Render Container\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n\n var $el = swiper.pagination.$el;\n var paginationHTML = '';\n if (params.type === 'bullets') {\n var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n for (var i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += \"<\" + (params.bulletElement) + \" class=\\\"\" + (params.bulletClass) + \"\\\"></\" + (params.bulletElement) + \">\";\n }\n }\n $el.html(paginationHTML);\n swiper.pagination.bullets = $el.find((\".\" + (params.bulletClass)));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML = \"<span class=\\\"\" + (params.currentClass) + \"\\\"></span>\"\n + ' / '\n + \"<span class=\\\"\" + (params.totalClass) + \"\\\"></span>\";\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = \"<span class=\\\"\" + (params.progressbarFillClass) + \"\\\"></span>\";\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n swiper.emit('paginationRender', swiper.pagination.$el[0]);\n }\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el) { return; }\n\n var $el = $(params.el);\n if ($el.length === 0) { return; }\n\n if (\n swiper.params.uniqueNavElements\n && typeof params.el === 'string'\n && $el.length > 1\n && swiper.$el.find(params.el).length === 1\n ) {\n $el = swiper.$el.find(params.el);\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass((\"\" + (params.modifierClass) + (params.type) + \"-dynamic\"));\n swiper.pagination.dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', (\".\" + (params.bulletClass)), function onClick(e) {\n e.preventDefault();\n var index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) { index += swiper.loopedSlides; }\n swiper.slideTo(index);\n });\n }\n\n Utils.extend(swiper.pagination, {\n $el: $el,\n el: $el[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }\n if (params.clickable) {\n $el.off('click', (\".\" + (params.bulletClass)));\n }\n },\n };\n\n var Pagination$1 = {\n name: 'pagination',\n params: {\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: function (number) { return number; },\n formatFractionTotal: function (number) { return number; },\n bulletClass: 'swiper-pagination-bullet',\n bulletActiveClass: 'swiper-pagination-bullet-active',\n modifierClass: 'swiper-pagination-', // NEW\n currentClass: 'swiper-pagination-current',\n totalClass: 'swiper-pagination-total',\n hiddenClass: 'swiper-pagination-hidden',\n progressbarFillClass: 'swiper-pagination-progressbar-fill',\n progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',\n clickableClass: 'swiper-pagination-clickable', // NEW\n lockClass: 'swiper-pagination-lock',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n pagination: {\n init: Pagination.init.bind(swiper),\n render: Pagination.render.bind(swiper),\n update: Pagination.update.bind(swiper),\n destroy: Pagination.destroy.bind(swiper),\n dynamicBulletIndex: 0,\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.pagination.init();\n swiper.pagination.render();\n swiper.pagination.update();\n },\n activeIndexChange: function activeIndexChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n swiper.pagination.update();\n }\n },\n snapIndexChange: function snapIndexChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.update();\n }\n },\n slidesLengthChange: function slidesLengthChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n snapGridLengthChange: function snapGridLengthChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.pagination.destroy();\n },\n click: function click(e) {\n var swiper = this;\n if (\n swiper.params.pagination.el\n && swiper.params.pagination.hideOnClick\n && swiper.pagination.$el.length > 0\n && !$(e.target).hasClass(swiper.params.pagination.bulletClass)\n ) {\n var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n swiper.emit('paginationShow', swiper);\n } else {\n swiper.emit('paginationHide', swiper);\n }\n swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n },\n },\n };\n\n var Scrollbar = {\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var rtl = swiper.rtlTranslate;\n var progress = swiper.progress;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n var params = swiper.params.scrollbar;\n\n var newSize = dragSize;\n var newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(\" + newPos + \"px, 0, 0)\"));\n } else {\n $dragEl.transform((\"translateX(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.width = newSize + \"px\";\n } else {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(0px, \" + newPos + \"px, 0)\"));\n } else {\n $dragEl.transform((\"translateY(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.height = newSize + \"px\";\n }\n if (params.hide) {\n clearTimeout(swiper.scrollbar.timeout);\n $el[0].style.opacity = 1;\n swiper.scrollbar.timeout = setTimeout(function () {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n swiper.scrollbar.$dragEl.transition(duration);\n },\n updateSize: function updateSize() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n\n var scrollbar = swiper.scrollbar;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n var divider = swiper.size / swiper.virtualSize;\n var moveDivider = divider * (trackSize / swiper.size);\n var dragSize;\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = dragSize + \"px\";\n } else {\n $dragEl[0].style.height = dragSize + \"px\";\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n Utils.extend(scrollbar, {\n trackSize: trackSize,\n divider: divider,\n moveDivider: moveDivider,\n dragSize: dragSize,\n });\n scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n },\n getPointerPosition: function getPointerPosition(e) {\n var swiper = this;\n if (swiper.isHorizontal()) {\n return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);\n }\n return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);\n },\n setDragPosition: function setDragPosition(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var rtl = swiper.rtlTranslate;\n var $el = scrollbar.$el;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n var dragStartPos = scrollbar.dragStartPos;\n\n var positionRatio;\n positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']\n - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n },\n onDragStart: function onDragStart(e) {\n var swiper = this;\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n swiper.scrollbar.isTouched = true;\n swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)\n ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n scrollbar.setDragPosition(e);\n\n clearTimeout(swiper.scrollbar.dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n swiper.emit('scrollbarDragStart', e);\n },\n onDragMove: function onDragMove(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n\n if (!swiper.scrollbar.isTouched) { return; }\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n scrollbar.setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n swiper.emit('scrollbarDragMove', e);\n },\n onDragEnd: function onDragEnd(e) {\n var swiper = this;\n\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n\n if (!swiper.scrollbar.isTouched) { return; }\n swiper.scrollbar.isTouched = false;\n if (params.hide) {\n clearTimeout(swiper.scrollbar.dragTimeout);\n swiper.scrollbar.dragTimeout = Utils.nextTick(function () {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n swiper.emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n },\n enableDraggable: function enableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var touchEventsTouch = swiper.touchEventsTouch;\n var touchEventsDesktop = swiper.touchEventsDesktop;\n var params = swiper.params;\n var $el = scrollbar.$el;\n var target = $el[0];\n var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n if (!Support.touch) {\n target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n } else {\n target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n }\n },\n disableDraggable: function disableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var touchEventsTouch = swiper.touchEventsTouch;\n var touchEventsDesktop = swiper.touchEventsDesktop;\n var params = swiper.params;\n var $el = scrollbar.$el;\n var target = $el[0];\n var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n if (!Support.touch) {\n target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n } else {\n target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n }\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var $swiperEl = swiper.$el;\n var params = swiper.params.scrollbar;\n\n var $el = $(params.el);\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n $el = $swiperEl.find(params.el);\n }\n\n var $dragEl = $el.find((\".\" + (swiper.params.scrollbar.dragClass)));\n if ($dragEl.length === 0) {\n $dragEl = $((\"<div class=\\\"\" + (swiper.params.scrollbar.dragClass) + \"\\\"></div>\"));\n $el.append($dragEl);\n }\n\n Utils.extend(scrollbar, {\n $el: $el,\n el: $el[0],\n $dragEl: $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n scrollbar.enableDraggable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.disableDraggable();\n },\n };\n\n var Scrollbar$1 = {\n name: 'scrollbar',\n params: {\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n scrollbar: {\n init: Scrollbar.init.bind(swiper),\n destroy: Scrollbar.destroy.bind(swiper),\n updateSize: Scrollbar.updateSize.bind(swiper),\n setTranslate: Scrollbar.setTranslate.bind(swiper),\n setTransition: Scrollbar.setTransition.bind(swiper),\n enableDraggable: Scrollbar.enableDraggable.bind(swiper),\n disableDraggable: Scrollbar.disableDraggable.bind(swiper),\n setDragPosition: Scrollbar.setDragPosition.bind(swiper),\n getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),\n onDragStart: Scrollbar.onDragStart.bind(swiper),\n onDragMove: Scrollbar.onDragMove.bind(swiper),\n onDragEnd: Scrollbar.onDragEnd.bind(swiper),\n isTouched: false,\n timeout: null,\n dragTimeout: null,\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.scrollbar.init();\n swiper.scrollbar.updateSize();\n swiper.scrollbar.setTranslate();\n },\n update: function update() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n resize: function resize() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n swiper.scrollbar.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.scrollbar.setTransition(duration);\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.destroy();\n },\n },\n };\n\n var Parallax = {\n setTransform: function setTransform(el, progress) {\n var swiper = this;\n var rtl = swiper.rtl;\n\n var $el = $(el);\n var rtlFactor = rtl ? -1 : 1;\n\n var p = $el.attr('data-swiper-parallax') || '0';\n var x = $el.attr('data-swiper-parallax-x');\n var y = $el.attr('data-swiper-parallax-y');\n var scale = $el.attr('data-swiper-parallax-scale');\n var opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if ((x).indexOf('%') >= 0) {\n x = (parseInt(x, 10) * progress * rtlFactor) + \"%\";\n } else {\n x = (x * progress * rtlFactor) + \"px\";\n }\n if ((y).indexOf('%') >= 0) {\n y = (parseInt(y, 10) * progress) + \"%\";\n } else {\n y = (y * progress) + \"px\";\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px)\"));\n } else {\n var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px) scale(\" + currentScale + \")\"));\n }\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n var progress = swiper.progress;\n var snapGrid = swiper.snapGrid;\n $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, progress);\n });\n slides.each(function (slideIndex, slideEl) {\n var slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, slideProgress);\n });\n });\n },\n setTransition: function setTransition(duration) {\n if ( duration === void 0 ) duration = this.params.speed;\n\n var swiper = this;\n var $el = swiper.$el;\n $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n .each(function (index, parallaxEl) {\n var $parallaxEl = $(parallaxEl);\n var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) { parallaxDuration = 0; }\n $parallaxEl.transition(parallaxDuration);\n });\n },\n };\n\n var Parallax$1 = {\n name: 'parallax',\n params: {\n parallax: {\n enabled: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n parallax: {\n setTransform: Parallax.setTransform.bind(swiper),\n setTranslate: Parallax.setTranslate.bind(swiper),\n setTransition: Parallax.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTranslate();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTransition(duration);\n },\n },\n };\n\n var Zoom = {\n // Calc Scale From Multi-touches\n getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) { return 1; }\n var x1 = e.targetTouches[0].pageX;\n var y1 = e.targetTouches[0].pageY;\n var x2 = e.targetTouches[1].pageX;\n var y2 = e.targetTouches[1].pageY;\n var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));\n return distance;\n },\n // Events\n onGestureStart: function onGestureStart(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n if (!Support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureTouched = true;\n gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest('.swiper-slide');\n if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n gesture.$imageEl.transition(0);\n swiper.zoom.isScaling = true;\n },\n onGestureChange: function onGestureChange(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureMoved = true;\n gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (Support.gestures) {\n zoom.scale = e.scale * zoom.currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));\n }\n gesture.$imageEl.transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n onGestureEnd: function onGestureEnd(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {\n return;\n }\n if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {\n return;\n }\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl.transition(swiper.params.speed).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n zoom.currentScale = zoom.scale;\n zoom.isScaling = false;\n if (zoom.scale === 1) { gesture.$slideEl = undefined; }\n },\n onTouchStart: function onTouchStart(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (image.isTouched) { return; }\n if (Device.android) { e.preventDefault(); }\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n },\n onTouchMove: function onTouchMove(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) { return; }\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n if (swiper.rtl) {\n image.startX = -image.startX;\n image.startY = -image.startY;\n }\n }\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }\n\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !zoom.isScaling) {\n if (\n swiper.isHorizontal()\n && (\n (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)\n || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)\n )\n ) {\n image.isTouched = false;\n return;\n } if (\n !swiper.isHorizontal()\n && (\n (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)\n || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)\n )\n ) {\n image.isTouched = false;\n return;\n }\n }\n e.preventDefault();\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;\n image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));\n }\n if (image.currentX > image.maxX) {\n image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));\n }\n\n if (image.currentY < image.minY) {\n image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));\n }\n if (image.currentY > image.maxY) {\n image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));\n }\n\n // Velocity\n if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }\n if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }\n if (!velocity.prevTime) { velocity.prevTime = Date.now(); }\n velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTouchEnd: function onTouchEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n var momentumDurationX = 300;\n var momentumDurationY = 300;\n var momentumDistanceX = velocity.x * momentumDurationX;\n var newPositionX = image.currentX + momentumDistanceX;\n var momentumDistanceY = velocity.y * momentumDurationY;\n var newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }\n if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }\n var momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl.transition(momentumDuration).transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTransitionEnd: function onTransitionEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n },\n // Toggle Zoom\n toggle: function toggle(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoom.out();\n } else {\n // Zoom In\n zoom.in(e);\n }\n },\n in: function in$1(e) {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n gesture.$slideEl.addClass((\"\" + (params.zoomedSlideClass)));\n\n var touchX;\n var touchY;\n var offsetX;\n var offsetY;\n var diffX;\n var diffY;\n var translateX;\n var translateY;\n var imageWidth;\n var imageHeight;\n var scaledWidth;\n var scaledHeight;\n var translateMinX;\n var translateMinY;\n var translateMaxX;\n var translateMaxY;\n var slideWidth;\n var slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left;\n offsetY = gesture.$slideEl.offset().top;\n diffX = (offsetX + (slideWidth / 2)) - touchX;\n diffY = (offsetY + (slideHeight / 2)) - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);\n translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl.transition(300).transform((\"translate3d(\" + translateX + \"px, \" + translateY + \"px,0)\"));\n gesture.$imageEl.transition(300).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n out: function out() {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass((\"\" + (params.zoomedSlideClass)));\n gesture.$slideEl = undefined;\n },\n // Attach/Detach Events\n enable: function enable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (zoom.enabled) { return; }\n zoom.enabled = true;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.$wrapperEl.on(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n },\n disable: function disable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (!zoom.enabled) { return; }\n\n swiper.zoom.enabled = false;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.$wrapperEl.off(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n },\n };\n\n var Zoom$1 = {\n name: 'zoom',\n params: {\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n },\n create: function create() {\n var swiper = this;\n var zoom = {\n enabled: false,\n scale: 1,\n currentScale: 1,\n isScaling: false,\n gesture: {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n },\n image: {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n },\n velocity: {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n },\n };\n\n ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {\n zoom[methodName] = Zoom[methodName].bind(swiper);\n });\n Utils.extend(swiper, {\n zoom: zoom,\n });\n\n var scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get: function get() {\n return scale;\n },\n set: function set(value) {\n if (scale !== value) {\n var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;\n var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;\n swiper.emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.zoom.enabled) {\n swiper.zoom.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.zoom.disable();\n },\n touchStart: function touchStart(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchStart(e);\n },\n touchEnd: function touchEnd(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchEnd(e);\n },\n doubleTap: function doubleTap(e) {\n var swiper = this;\n if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n swiper.zoom.toggle(e);\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n swiper.zoom.onTransitionEnd();\n }\n },\n },\n };\n\n var Lazy = {\n loadInSlide: function loadInSlide(index, loadInDuplicate) {\n if ( loadInDuplicate === void 0 ) loadInDuplicate = true;\n\n var swiper = this;\n var params = swiper.params.lazy;\n if (typeof index === 'undefined') { return; }\n if (swiper.slides.length === 0) { return; }\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n var $slideEl = isVirtual\n ? swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\"))\n : swiper.slides.eq(index);\n\n var $images = $slideEl.find((\".\" + (params.elementClass) + \":not(.\" + (params.loadedClass) + \"):not(.\" + (params.loadingClass) + \")\"));\n if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {\n $images = $images.add($slideEl[0]);\n }\n if ($images.length === 0) { return; }\n\n $images.each(function (imageIndex, imageEl) {\n var $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n var background = $imageEl.attr('data-background');\n var src = $imageEl.attr('data-src');\n var srcset = $imageEl.attr('data-srcset');\n var sizes = $imageEl.attr('data-sizes');\n\n swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }\n if (background) {\n $imageEl.css('background-image', (\"url(\\\"\" + background + \"\\\")\"));\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find((\".\" + (params.preloaderClass))).remove();\n if (swiper.params.loop && loadInDuplicate) {\n var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n var originalSlide = swiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]:not(.\" + (swiper.params.slideDuplicateClass) + \")\"));\n swiper.lazy.loadInSlide(originalSlide.index(), false);\n } else {\n var duplicatedSlide = swiper.$wrapperEl.children((\".\" + (swiper.params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]\"));\n swiper.lazy.loadInSlide(duplicatedSlide.index(), false);\n }\n }\n swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n });\n\n swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n },\n load: function load() {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var swiperParams = swiper.params;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n var params = swiperParams.lazy;\n\n var slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if ($wrapperEl.children((\".\" + (swiperParams.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\")).length) {\n return true;\n }\n } else if (slides[index]) { return true; }\n return false;\n }\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }\n if (swiper.params.watchSlidesVisibility) {\n $wrapperEl.children((\".\" + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {\n var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n swiper.lazy.loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) { swiper.lazy.loadInSlide(i); }\n }\n } else {\n swiper.lazy.loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n var amount = params.loadPrevNextAmount;\n var spv = slidesPerView;\n var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {\n if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }\n }\n // Prev Slides\n for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {\n if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }\n }\n } else {\n var nextSlide = $wrapperEl.children((\".\" + (swiperParams.slideNextClass)));\n if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }\n\n var prevSlide = $wrapperEl.children((\".\" + (swiperParams.slidePrevClass)));\n if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }\n }\n }\n },\n };\n\n var Lazy$1 = {\n name: 'lazy',\n params: {\n lazy: {\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n lazy: {\n initialImageLoaded: false,\n load: Lazy.load.bind(swiper),\n loadInSlide: Lazy.loadInSlide.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n },\n init: function init() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {\n swiper.lazy.load();\n }\n },\n scroll: function scroll() {\n var swiper = this;\n if (swiper.params.freeMode && !swiper.params.freeModeSticky) {\n swiper.lazy.load();\n }\n },\n resize: function resize() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n scrollbarDragMove: function scrollbarDragMove() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n transitionStart: function transitionStart() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {\n swiper.lazy.load();\n }\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n swiper.lazy.load();\n }\n },\n },\n };\n\n /* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\n\n var Controller = {\n LinearSpline: function LinearSpline(x, y) {\n var binarySearch = (function search() {\n var maxIndex;\n var minIndex;\n var guess;\n return function (array, val) {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = maxIndex + minIndex >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n }());\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n var i1;\n var i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) { return 0; }\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];\n };\n return this;\n },\n // xxx: for now i will just save one spline function to to\n getInterpolateFunction: function getInterpolateFunction(c) {\n var swiper = this;\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n },\n setTranslate: function setTranslate(setTranslate$1, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var multiplier;\n var controlledTranslate;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n swiper.controller.getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (var i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n Utils.nextTick(function () {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(function () {\n if (!controlled) { return; }\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n },\n };\n var Controller$1 = {\n name: 'controller',\n params: {\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n controller: {\n control: swiper.params.controller.control,\n getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),\n setTranslate: Controller.setTranslate.bind(swiper),\n setTransition: Controller.setTransition.bind(swiper),\n },\n });\n },\n on: {\n update: function update() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n resize: function resize() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n setTranslate: function setTranslate(translate, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTranslate(translate, byController);\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTransition(duration, byController);\n },\n },\n };\n\n var a11y = {\n makeElFocusable: function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n return $el;\n },\n addElRole: function addElRole($el, role) {\n $el.attr('role', role);\n return $el;\n },\n addElLabel: function addElLabel($el, label) {\n $el.attr('aria-label', label);\n return $el;\n },\n disableEl: function disableEl($el) {\n $el.attr('aria-disabled', true);\n return $el;\n },\n enableEl: function enableEl($el) {\n $el.attr('aria-disabled', false);\n return $el;\n },\n onEnterKey: function onEnterKey(e) {\n var swiper = this;\n var params = swiper.params.a11y;\n if (e.keyCode !== 13) { return; }\n var $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n swiper.a11y.notify(params.lastSlideMessage);\n } else {\n swiper.a11y.notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n swiper.a11y.notify(params.firstSlideMessage);\n } else {\n swiper.a11y.notify(params.prevSlideMessage);\n }\n }\n if (swiper.pagination && $targetEl.is((\".\" + (swiper.params.pagination.bulletClass)))) {\n $targetEl[0].click();\n }\n },\n notify: function notify(message) {\n var swiper = this;\n var notification = swiper.a11y.liveRegion;\n if (notification.length === 0) { return; }\n notification.html('');\n notification.html(message);\n },\n updateNavigation: function updateNavigation() {\n var swiper = this;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n swiper.a11y.disableEl($prevEl);\n } else {\n swiper.a11y.enableEl($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n swiper.a11y.disableEl($nextEl);\n } else {\n swiper.a11y.enableEl($nextEl);\n }\n }\n },\n updatePagination: function updatePagination() {\n var swiper = this;\n var params = swiper.params.a11y;\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {\n var $bulletEl = $(bulletEl);\n swiper.a11y.makeElFocusable($bulletEl);\n swiper.a11y.addElRole($bulletEl, 'button');\n swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));\n });\n }\n },\n init: function init() {\n var swiper = this;\n\n swiper.$el.append(swiper.a11y.liveRegion);\n\n // Navigation\n var params = swiper.params.a11y;\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n swiper.a11y.makeElFocusable($nextEl);\n swiper.a11y.addElRole($nextEl, 'button');\n swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);\n $nextEl.on('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n swiper.a11y.makeElFocusable($prevEl);\n swiper.a11y.addElRole($prevEl, 'button');\n swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);\n $prevEl.on('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.on('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }\n\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.off('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n };\n var A11y = {\n name: 'a11y',\n params: {\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n a11y: {\n liveRegion: $((\"<span class=\\\"\" + (swiper.params.a11y.notificationClass) + \"\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\"></span>\")),\n },\n });\n Object.keys(a11y).forEach(function (methodName) {\n swiper.a11y[methodName] = a11y[methodName].bind(swiper);\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.init();\n swiper.a11y.updateNavigation();\n },\n toEdge: function toEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n paginationUpdate: function paginationUpdate() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updatePagination();\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.destroy();\n },\n },\n };\n\n var History = {\n init: function init() {\n var swiper = this;\n if (!swiper.params.history) { return; }\n if (!win.history || !win.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n var history = swiper.history;\n history.initialized = true;\n history.paths = History.getPathValues();\n if (!history.paths.key && !history.paths.value) { return; }\n history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n win.addEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.history.replaceState) {\n win.removeEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n setHistoryPopState: function setHistoryPopState() {\n var swiper = this;\n swiper.history.paths = History.getPathValues();\n swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);\n },\n getPathValues: function getPathValues() {\n var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });\n var total = pathArray.length;\n var key = pathArray[total - 2];\n var value = pathArray[total - 1];\n return { key: key, value: value };\n },\n setHistory: function setHistory(key, index) {\n var swiper = this;\n if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }\n var slide = swiper.slides.eq(index);\n var value = History.slugify(slide.attr('data-history'));\n if (!win.location.pathname.includes(key)) {\n value = key + \"/\" + value;\n }\n var currentState = win.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n win.history.replaceState({ value: value }, null, value);\n } else {\n win.history.pushState({ value: value }, null, value);\n }\n },\n slugify: function slugify(text) {\n return text.toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n },\n scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {\n var swiper = this;\n if (value) {\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHistory = History.slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n },\n };\n\n var History$1 = {\n name: 'history',\n params: {\n history: {\n enabled: false,\n replaceState: false,\n key: 'slides',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n history: {\n init: History.init.bind(swiper),\n setHistory: History.setHistory.bind(swiper),\n setHistoryPopState: History.setHistoryPopState.bind(swiper),\n scrollToSlide: History.scrollToSlide.bind(swiper),\n destroy: History.destroy.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.history.initialized) {\n swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n },\n },\n };\n\n var HashNavigation = {\n onHashCange: function onHashCange() {\n var swiper = this;\n var newHash = doc.location.hash.replace('#', '');\n var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n var newIndex = swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-hash=\\\"\" + newHash + \"\\\"]\")).index();\n if (typeof newIndex === 'undefined') { return; }\n swiper.slideTo(newIndex);\n }\n },\n setHash: function setHash() {\n var swiper = this;\n if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }\n if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {\n win.history.replaceState(null, null, ((\"#\" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || false));\n } else {\n var slide = swiper.slides.eq(swiper.activeIndex);\n var hash = slide.attr('data-hash') || slide.attr('data-history');\n doc.location.hash = hash || '';\n }\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }\n swiper.hashNavigation.initialized = true;\n var hash = doc.location.hash.replace('#', '');\n if (hash) {\n var speed = 0;\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(win).on('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.watchState) {\n $(win).off('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n };\n var HashNavigation$1 = {\n name: 'hash-navigation',\n params: {\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n hashNavigation: {\n initialized: false,\n init: HashNavigation.init.bind(swiper),\n destroy: HashNavigation.destroy.bind(swiper),\n setHash: HashNavigation.setHash.bind(swiper),\n onHashCange: HashNavigation.onHashCange.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.hashNavigation.initialized) {\n swiper.hashNavigation.setHash();\n }\n },\n },\n };\n\n /* eslint no-underscore-dangle: \"off\" */\n\n var Autoplay = {\n run: function run() {\n var swiper = this;\n var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n var delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n clearTimeout(swiper.autoplay.timeout);\n swiper.autoplay.timeout = Utils.nextTick(function () {\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n swiper.slidePrev(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.isBeginning) {\n swiper.slidePrev(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else {\n swiper.autoplay.stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.isEnd) {\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(0, swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else {\n swiper.autoplay.stop();\n }\n }, delay);\n },\n start: function start() {\n var swiper = this;\n if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }\n if (swiper.autoplay.running) { return false; }\n swiper.autoplay.running = true;\n swiper.emit('autoplayStart');\n swiper.autoplay.run();\n return true;\n },\n stop: function stop() {\n var swiper = this;\n if (!swiper.autoplay.running) { return false; }\n if (typeof swiper.autoplay.timeout === 'undefined') { return false; }\n\n if (swiper.autoplay.timeout) {\n clearTimeout(swiper.autoplay.timeout);\n swiper.autoplay.timeout = undefined;\n }\n swiper.autoplay.running = false;\n swiper.emit('autoplayStop');\n return true;\n },\n pause: function pause(speed) {\n var swiper = this;\n if (!swiper.autoplay.running) { return; }\n if (swiper.autoplay.paused) { return; }\n if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n swiper.autoplay.run();\n } else {\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n }\n },\n };\n\n var Autoplay$1 = {\n name: 'autoplay',\n params: {\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n autoplay: {\n running: false,\n paused: false,\n run: Autoplay.run.bind(swiper),\n start: Autoplay.start.bind(swiper),\n stop: Autoplay.stop.bind(swiper),\n pause: Autoplay.pause.bind(swiper),\n onTransitionEnd: function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }\n if (e.target !== this) { return; }\n swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.run();\n }\n },\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.autoplay.enabled) {\n swiper.autoplay.start();\n }\n },\n beforeTransitionStart: function beforeTransitionStart(speed, internal) {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n swiper.autoplay.stop();\n }\n }\n },\n sliderFirstMove: function sliderFirstMove() {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.pause();\n }\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.autoplay.running) {\n swiper.autoplay.stop();\n }\n },\n },\n };\n\n var Fade = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = swiper.slides.eq(i);\n var offset = $slideEl[0].swiperSlideOffset;\n var tx = -offset;\n if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n var slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n $slideEl\n .css({\n opacity: slideOpacity,\n })\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n slides.transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n slides.transitionEnd(function () {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n };\n\n var EffectFade = {\n name: 'effect-fade',\n params: {\n fadeEffect: {\n crossFade: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n fadeEffect: {\n setTranslate: Fade.setTranslate.bind(swiper),\n setTransition: Fade.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"fade\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTransition(duration);\n },\n },\n };\n\n var Cube = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var rtl = swiper.rtlTranslate;\n var swiperSize = swiper.size;\n var params = swiper.params.cubeEffect;\n var isHorizontal = swiper.isHorizontal();\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n var wrapperRotate = 0;\n var $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: (swiperWidth + \"px\") });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n var slideAngle = slideIndex * 90;\n var round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n var tx = 0;\n var ty = 0;\n var tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + (round * 4 * swiperSize);\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = (3 * swiperSize) + (swiperSize * 4 * round);\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n var transform = \"rotateX(\" + (isHorizontal ? 0 : -slideAngle) + \"deg) rotateY(\" + (isHorizontal ? slideAngle : 0) + \"deg) translate3d(\" + tx + \"px, \" + ty + \"px, \" + tz + \"px)\";\n if (progress <= 1 && progress > -1) {\n wrapperRotate = (slideIndex * 90) + (progress * 90);\n if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'left' : 'top') + \"\\\"></div>\"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'right' : 'bottom') + \"\\\"></div>\"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-moz-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-ms-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n 'transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform((\"translate3d(0px, \" + ((swiperWidth / 2) + params.shadowOffset) + \"px, \" + (-swiperWidth / 2) + \"px) rotateX(90deg) rotateZ(0deg) scale(\" + (params.shadowScale) + \")\"));\n } else {\n var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);\n var multiplier = 1.5 - (\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)\n + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)\n );\n var scale1 = params.shadowScale;\n var scale2 = params.shadowScale / multiplier;\n var offset = params.shadowOffset;\n $cubeShadowEl.transform((\"scale3d(\" + scale1 + \", 1, \" + scale2 + \") translate3d(0px, \" + ((swiperHeight / 2) + offset) + \"px, \" + (-swiperHeight / 2 / scale2) + \"px) rotateX(-90deg)\"));\n }\n }\n var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;\n $wrapperEl\n .transform((\"translate3d(0px,0,\" + zFactor + \"px) rotateX(\" + (swiper.isHorizontal() ? 0 : wrapperRotate) + \"deg) rotateY(\" + (swiper.isHorizontal() ? -wrapperRotate : 0) + \"deg)\"));\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n },\n };\n\n var EffectCube = {\n name: 'effect-cube',\n params: {\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n cubeEffect: {\n setTranslate: Cube.setTranslate.bind(swiper),\n setTransition: Cube.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"cube\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTransition(duration);\n },\n },\n };\n\n var Flip = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n var rtl = swiper.rtlTranslate;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n var offset = $slideEl[0].swiperSlideOffset;\n var rotate = -180 * progress;\n var rotateY = rotate;\n var rotateX = 0;\n var tx = -offset;\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (swiper.params.flipEffect.slideShadows) {\n // Set shadows\n var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $((\"<div class=\\\"swiper-slide-shadow-\" + (swiper.isHorizontal() ? 'left' : 'top') + \"\\\"></div>\"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $((\"<div class=\\\"swiper-slide-shadow-\" + (swiper.isHorizontal() ? 'right' : 'bottom') + \"\\\"></div>\"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n $slideEl\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var $wrapperEl = swiper.$wrapperEl;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n // eslint-disable-next-line\n slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n };\n\n var EffectFlip = {\n name: 'effect-flip',\n params: {\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n flipEffect: {\n setTranslate: Flip.setTranslate.bind(swiper),\n setTransition: Flip.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"flip\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTransition(duration);\n },\n },\n };\n\n var Coverflow = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesSizesGrid = swiper.slidesSizesGrid;\n var params = swiper.params.coverflowEffect;\n var isHorizontal = swiper.isHorizontal();\n var transform = swiper.translate;\n var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);\n var rotate = isHorizontal ? params.rotate : -params.rotate;\n var translate = params.depth;\n // Each slide offset from center\n for (var i = 0, length = slides.length; i < length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideSize = slidesSizesGrid[i];\n var slideOffset = $slideEl[0].swiperSlideOffset;\n var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;\n\n var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n var translateZ = -translate * Math.abs(offsetMultiplier);\n\n var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);\n var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) { translateX = 0; }\n if (Math.abs(translateY) < 0.001) { translateY = 0; }\n if (Math.abs(translateZ) < 0.001) { translateZ = 0; }\n if (Math.abs(rotateY) < 0.001) { rotateY = 0; }\n if (Math.abs(rotateX) < 0.001) { rotateX = 0; }\n\n var slideTransform = \"translate3d(\" + translateX + \"px,\" + translateY + \"px,\" + translateZ + \"px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\";\n\n $slideEl.transform(slideTransform);\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n if (params.slideShadows) {\n // Set shadows\n var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'left' : 'top') + \"\\\"></div>\"));\n $slideEl.append($shadowBeforeEl);\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'right' : 'bottom') + \"\\\"></div>\"));\n $slideEl.append($shadowAfterEl);\n }\n if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }\n if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }\n }\n }\n\n // Set correct perspective for IE10\n if (Support.pointerEvents || Support.prefixedPointerEvents) {\n var ws = $wrapperEl[0].style;\n ws.perspectiveOrigin = center + \"px 50%\";\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n },\n };\n\n var EffectCoverflow = {\n name: 'effect-coverflow',\n params: {\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n modifier: 1,\n slideShadows: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n coverflowEffect: {\n setTranslate: Coverflow.setTranslate.bind(swiper),\n setTransition: Coverflow.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"coverflow\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTransition(duration);\n },\n },\n };\n\n var Thumbs = {\n init: function init() {\n var swiper = this;\n var ref = swiper.params;\n var thumbsParams = ref.thumbs;\n var SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Utils.extend(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Utils.extend(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (Utils.isObject(thumbsParams.swiper)) {\n swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {\n watchSlidesVisibility: true,\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n }));\n swiper.thumbs.swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);\n },\n onThumbClick: function onThumbClick() {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n var clickedIndex = thumbsSwiper.clickedIndex;\n var clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }\n var slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n var currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n var prevIndex = swiper.slides.eq(currentIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n var nextIndex = swiper.slides.eq(currentIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }\n else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }\n else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }\n else { slideToIndex = prevIndex; }\n }\n swiper.slideTo(slideToIndex);\n },\n update: function update(initial) {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n\n var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n if (swiper.realIndex !== thumbsSwiper.realIndex) {\n var currentThumbsIndex = thumbsSwiper.activeIndex;\n var newThumbsIndex;\n if (thumbsSwiper.params.loop) {\n if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }\n else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }\n else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }\n else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }\n else { newThumbsIndex = prevThumbsIndex; }\n } else {\n newThumbsIndex = swiper.realIndex;\n }\n if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n var thumbsToActivate = 1;\n var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual) {\n for (var i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex + i) + \"\\\"]\")).addClass(thumbActiveClass);\n }\n } else {\n for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);\n }\n }\n },\n };\n var Thumbs$1 = {\n name: 'thumbs',\n params: {\n thumbs: {\n swiper: null,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-container-thumbs',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n thumbs: {\n swiper: null,\n init: Thumbs.init.bind(swiper),\n update: Thumbs.update.bind(swiper),\n onThumbClick: Thumbs.onThumbClick.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n var ref = swiper.params;\n var thumbs = ref.thumbs;\n if (!thumbs || !thumbs.swiper) { return; }\n swiper.thumbs.init();\n swiper.thumbs.update(true);\n },\n slideChange: function slideChange() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n update: function update() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n resize: function resize() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n thumbsSwiper.setTransition(duration);\n },\n beforeDestroy: function beforeDestroy() {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n if (swiper.thumbs.swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n },\n },\n };\n\n // Swiper Class\n\n var components = [\n Device$1,\n Support$1,\n Browser$1,\n Resize,\n Observer$1,\n Virtual$1,\n Keyboard$1,\n Mousewheel$1,\n Navigation$1,\n Pagination$1,\n Scrollbar$1,\n Parallax$1,\n Zoom$1,\n Lazy$1,\n Controller$1,\n A11y,\n History$1,\n HashNavigation$1,\n Autoplay$1,\n EffectFade,\n EffectCube,\n EffectFlip,\n EffectCoverflow,\n Thumbs$1\n ];\n\n if (typeof Swiper.use === 'undefined') {\n Swiper.use = Swiper.Class.use;\n Swiper.installModule = Swiper.Class.installModule;\n }\n\n Swiper.use(components);\n\n return Swiper;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanM/YzAwNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN3aXBlciA0LjUuMVxuICogTW9zdCBtb2Rlcm4gbW9iaWxlIHRvdWNoIHNsaWRlciBhbmQgZnJhbWV3b3JrIHdpdGggaGFyZHdhcmUgYWNjZWxlcmF0ZWQgdHJhbnNpdGlvbnNcbiAqIGh0dHA6Ly93d3cuaWRhbmdlcm8udXMvc3dpcGVyL1xuICpcbiAqIENvcHlyaWdodCAyMDE0LTIwMTkgVmxhZGltaXIgS2hhcmxhbXBpZGlcbiAqXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqXG4gKiBSZWxlYXNlZCBvbjogU2VwdGVtYmVyIDEzLCAyMDE5XG4gKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Td2lwZXIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogU1NSIFdpbmRvdyAxLjAuMVxuICAgKiBCZXR0ZXIgaGFuZGxpbmcgZm9yIHdpbmRvdyBvYmplY3QgaW4gU1NSIGVudmlyb25tZW50XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2xpbWl0czR3ZWIvc3NyLXdpbmRvd1xuICAgKlxuICAgKiBDb3B5cmlnaHQgMjAxOCwgVmxhZGltaXIgS2hhcmxhbXBpZGlcbiAgICpcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUXG4gICAqXG4gICAqIFJlbGVhc2VkIG9uOiBKdWx5IDE4LCAyMDE4XG4gICAqL1xuICB2YXIgZG9jID0gKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpID8ge1xuICAgIGJvZHk6IHt9LFxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoKSB7fSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gICAgYWN0aXZlRWxlbWVudDoge1xuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHt9LFxuICAgICAgbm9kZU5hbWU6ICcnLFxuICAgIH0sXG4gICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gcXVlcnlTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgY3JlYXRlRXZlbnQ6IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdEV2ZW50OiBmdW5jdGlvbiBpbml0RXZlbnQoKSB7fSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICBzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZSgpIHt9LFxuICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZTogZnVuY3Rpb24gZ2V0RWxlbWVudHNCeVRhZ05hbWUoKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7IGhhc2g6ICcnIH0sXG4gIH0gOiBkb2N1bWVudDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIHZhciB3aW4gPSAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpID8ge1xuICAgIGRvY3VtZW50OiBkb2MsXG4gICAgbmF2aWdhdG9yOiB7XG4gICAgICB1c2VyQWdlbnQ6ICcnLFxuICAgIH0sXG4gICAgbG9jYXRpb246IHt9LFxuICAgIGhpc3Rvcnk6IHt9LFxuICAgIEN1c3RvbUV2ZW50OiBmdW5jdGlvbiBDdXN0b21FdmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoKSB7fSxcbiAgICBnZXRDb21wdXRlZFN0eWxlOiBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZSgpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgSW1hZ2U6IGZ1bmN0aW9uIEltYWdlKCkge30sXG4gICAgRGF0ZTogZnVuY3Rpb24gRGF0ZSgpIHt9LFxuICAgIHNjcmVlbjoge30sXG4gICAgc2V0VGltZW91dDogZnVuY3Rpb24gc2V0VGltZW91dCgpIHt9LFxuICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24gY2xlYXJUaW1lb3V0KCkge30sXG4gIH0gOiB3aW5kb3c7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvKipcbiAgICogRG9tNyAyLjEuM1xuICAgKiBNaW5pbWFsaXN0aWMgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBET00gbWFuaXB1bGF0aW9uLCB3aXRoIGEgalF1ZXJ5LWNvbXBhdGlibGUgQVBJXG4gICAqIGh0dHA6Ly9mcmFtZXdvcms3LmlvL2RvY3MvZG9tLmh0bWxcbiAgICpcbiAgICogQ29weXJpZ2h0IDIwMTksIFZsYWRpbWlyIEtoYXJsYW1waWRpXG4gICAqIFRoZSBpRGFuZ2Vyby51c1xuICAgKiBodHRwOi8vd3d3LmlkYW5nZXJvLnVzL1xuICAgKlxuICAgKiBMaWNlbnNlZCB1bmRlciBNSVRcbiAgICpcbiAgICogUmVsZWFzZWQgb246IEZlYnJ1YXJ5IDExLCAyMDE5XG4gICAqL1xuXG4gIHZhciBEb203ID0gZnVuY3Rpb24gRG9tNyhhcnIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gQ3JlYXRlIGFycmF5LWxpa2Ugb2JqZWN0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHNlbGZbaV0gPSBhcnJbaV07XG4gICAgfVxuICAgIHNlbGYubGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICAvLyBSZXR1cm4gY29sbGVjdGlvbiB3aXRoIG1ldGhvZHNcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBmdW5jdGlvbiAkKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICBpZiAoc2VsZWN0b3IgJiYgIWNvbnRleHQpIHtcbiAgICAgIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIERvbTcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgLy8gU3RyaW5nXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZWxzO1xuICAgICAgICB2YXIgdGVtcFBhcmVudDtcbiAgICAgICAgdmFyIGh0bWwgPSBzZWxlY3Rvci50cmltKCk7XG4gICAgICAgIGlmIChodG1sLmluZGV4T2YoJzwnKSA+PSAwICYmIGh0bWwuaW5kZXhPZignPicpID49IDApIHtcbiAgICAgICAgICB2YXIgdG9DcmVhdGUgPSAnZGl2JztcbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8bGknKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICd1bCc7IH1cbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8dHInKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICd0Ym9keSc7IH1cbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8dGQnKSA9PT0gMCB8fCBodG1sLmluZGV4T2YoJzx0aCcpID09PSAwKSB7IHRvQ3JlYXRlID0gJ3RyJzsgfVxuICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJzx0Ym9keScpID09PSAwKSB7IHRvQ3JlYXRlID0gJ3RhYmxlJzsgfVxuICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJzxvcHRpb24nKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICdzZWxlY3QnOyB9XG4gICAgICAgICAgdGVtcFBhcmVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHRvQ3JlYXRlKTtcbiAgICAgICAgICB0ZW1wUGFyZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXBQYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgYXJyLnB1c2godGVtcFBhcmVudC5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0ICYmIHNlbGVjdG9yWzBdID09PSAnIycgJiYgIXNlbGVjdG9yLm1hdGNoKC9bIC48Pjp+XS8pKSB7XG4gICAgICAgICAgICAvLyBQdXJlIElEIHNlbGVjdG9yXG4gICAgICAgICAgICBlbHMgPSBbZG9jLmdldEVsZW1lbnRCeUlkKHNlbGVjdG9yLnRyaW0oKS5zcGxpdCgnIycpWzFdKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyIHNlbGVjdG9yc1xuICAgICAgICAgICAgZWxzID0gKGNvbnRleHQgfHwgZG9jKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yLnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChlbHNbaV0pIHsgYXJyLnB1c2goZWxzW2ldKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5ub2RlVHlwZSB8fCBzZWxlY3RvciA9PT0gd2luIHx8IHNlbGVjdG9yID09PSBkb2MpIHtcbiAgICAgICAgLy8gTm9kZS9lbGVtZW50XG4gICAgICAgIGFyci5wdXNoKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCAmJiBzZWxlY3RvclswXS5ub2RlVHlwZSkge1xuICAgICAgICAvLyBBcnJheSBvZiBlbGVtZW50cyBvciBpbnN0YW5jZSBvZiBEb21cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgYXJyLnB1c2goc2VsZWN0b3JbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhhcnIpO1xuICB9XG5cbiAgJC5mbiA9IERvbTcucHJvdG90eXBlO1xuICAkLkNsYXNzID0gRG9tNztcbiAgJC5Eb203ID0gRG9tNztcblxuICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gICAgdmFyIHVuaXF1ZUFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICh1bmlxdWVBcnJheS5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7IHVuaXF1ZUFycmF5LnB1c2goYXJyW2ldKTsgfVxuICAgIH1cbiAgICByZXR1cm4gdW5pcXVlQXJyYXk7XG4gIH1cblxuICAvLyBDbGFzc2VzIGFuZCBhdHRyaWJ1dGVzXG4gIGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2pdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpc1tqXS5jbGFzc0xpc3QgIT09ICd1bmRlZmluZWQnKSB7IHRoaXNbal0uY2xhc3NMaXN0LmFkZChjbGFzc2VzW2ldKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc05hbWUpIHtcbiAgICB2YXIgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1tqXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRoaXNbal0uY2xhc3NMaXN0ICE9PSAndW5kZWZpbmVkJykgeyB0aGlzW2pdLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlc1tpXSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCF0aGlzWzBdKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0aGlzWzBdLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xuICB9XG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2pdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpc1tqXS5jbGFzc0xpc3QgIT09ICd1bmRlZmluZWQnKSB7IHRoaXNbal0uY2xhc3NMaXN0LnRvZ2dsZShjbGFzc2VzW2ldKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBhdHRyKGF0dHJzLCB2YWx1ZSkge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhdHRycyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdldCBhdHRyXG4gICAgICBpZiAodGhpc1swXSkgeyByZXR1cm4gdGhpc1swXS5nZXRBdHRyaWJ1dGUoYXR0cnMpOyB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNldCBhdHRyc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGFyZ3VtZW50cyQxLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgdGhpc1tpXS5zZXRBdHRyaWJ1dGUoYXR0cnMsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9iamVjdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgZm9yICh2YXIgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgICB0aGlzW2ldW2F0dHJOYW1lXSA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICAgICAgICB0aGlzW2ldLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0cnNbYXR0ck5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZnVuY3Rpb24gcmVtb3ZlQXR0cihhdHRyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzW2ldLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gZGF0YShrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVsO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlbCA9IHRoaXNbMF07XG4gICAgICAvLyBHZXQgdmFsdWVcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBpZiAoZWwuZG9tN0VsZW1lbnREYXRhU3RvcmFnZSAmJiAoa2V5IGluIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhS2V5ID0gZWwuZ2V0QXR0cmlidXRlKChcImRhdGEtXCIgKyBrZXkpKTtcbiAgICAgICAgaWYgKGRhdGFLZXkpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YUtleTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBTZXQgdmFsdWVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGVsID0gdGhpc1tpXTtcbiAgICAgIGlmICghZWwuZG9tN0VsZW1lbnREYXRhU3RvcmFnZSkgeyBlbC5kb203RWxlbWVudERhdGFTdG9yYWdlID0ge307IH1cbiAgICAgIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBUcmFuc2Zvcm1zXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxTdHlsZSA9IHRoaXNbaV0uc3R5bGU7XG4gICAgICBlbFN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgIGVsU3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiB0cmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGR1cmF0aW9uID0gZHVyYXRpb24gKyBcIm1zXCI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxTdHlsZSA9IHRoaXNbaV0uc3R5bGU7XG4gICAgICBlbFN0eWxlLndlYmtpdFRyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgZWxTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gRXZlbnRzXG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHZhciBhc3NpZ247XG5cbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG4gICAgdmFyIGV2ZW50VHlwZSA9IGFyZ3NbMF07XG4gICAgdmFyIHRhcmdldFNlbGVjdG9yID0gYXJnc1sxXTtcbiAgICB2YXIgbGlzdGVuZXIgPSBhcmdzWzJdO1xuICAgIHZhciBjYXB0dXJlID0gYXJnc1szXTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIChhc3NpZ24gPSBhcmdzLCBldmVudFR5cGUgPSBhc3NpZ25bMF0sIGxpc3RlbmVyID0gYXNzaWduWzFdLCBjYXB0dXJlID0gYXNzaWduWzJdKTtcbiAgICAgIHRhcmdldFNlbGVjdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIWNhcHR1cmUpIHsgY2FwdHVyZSA9IGZhbHNlOyB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVMaXZlRXZlbnQoZSkge1xuICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCF0YXJnZXQpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgZXZlbnREYXRhID0gZS50YXJnZXQuZG9tN0V2ZW50RGF0YSB8fCBbXTtcbiAgICAgIGlmIChldmVudERhdGEuaW5kZXhPZihlKSA8IDApIHtcbiAgICAgICAgZXZlbnREYXRhLnVuc2hpZnQoZSk7XG4gICAgICB9XG4gICAgICBpZiAoJCh0YXJnZXQpLmlzKHRhcmdldFNlbGVjdG9yKSkgeyBsaXN0ZW5lci5hcHBseSh0YXJnZXQsIGV2ZW50RGF0YSk7IH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgcGFyZW50cyA9ICQodGFyZ2V0KS5wYXJlbnRzKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwYXJlbnRzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgICAgaWYgKCQocGFyZW50c1trXSkuaXModGFyZ2V0U2VsZWN0b3IpKSB7IGxpc3RlbmVyLmFwcGx5KHBhcmVudHNba10sIGV2ZW50RGF0YSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVFdmVudChlKSB7XG4gICAgICB2YXIgZXZlbnREYXRhID0gZSAmJiBlLnRhcmdldCA/IGUudGFyZ2V0LmRvbTdFdmVudERhdGEgfHwgW10gOiBbXTtcbiAgICAgIGlmIChldmVudERhdGEuaW5kZXhPZihlKSA8IDApIHtcbiAgICAgICAgZXZlbnREYXRhLnVuc2hpZnQoZSk7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbiAgICB2YXIgZXZlbnRzID0gZXZlbnRUeXBlLnNwbGl0KCcgJyk7XG4gICAgdmFyIGo7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzW2ldO1xuICAgICAgaWYgKCF0YXJnZXRTZWxlY3Rvcikge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgZXZlbnRzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2pdO1xuICAgICAgICAgIGlmICghZWwuZG9tN0xpc3RlbmVycykgeyBlbC5kb203TGlzdGVuZXJzID0ge307IH1cbiAgICAgICAgICBpZiAoIWVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdKSB7IGVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdID0gW107IH1cbiAgICAgICAgICBlbC5kb203TGlzdGVuZXJzW2V2ZW50XS5wdXNoKHtcbiAgICAgICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgICAgIHByb3h5TGlzdGVuZXI6IGhhbmRsZUV2ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZUV2ZW50LCBjYXB0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGl2ZSBldmVudHNcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGV2ZW50cy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIHZhciBldmVudCQxID0gZXZlbnRzW2pdO1xuICAgICAgICAgIGlmICghZWwuZG9tN0xpdmVMaXN0ZW5lcnMpIHsgZWwuZG9tN0xpdmVMaXN0ZW5lcnMgPSB7fTsgfVxuICAgICAgICAgIGlmICghZWwuZG9tN0xpdmVMaXN0ZW5lcnNbZXZlbnQkMV0pIHsgZWwuZG9tN0xpdmVMaXN0ZW5lcnNbZXZlbnQkMV0gPSBbXTsgfVxuICAgICAgICAgIGVsLmRvbTdMaXZlTGlzdGVuZXJzW2V2ZW50JDFdLnB1c2goe1xuICAgICAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICAgICAgcHJveHlMaXN0ZW5lcjogaGFuZGxlTGl2ZUV2ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQkMSwgaGFuZGxlTGl2ZUV2ZW50LCBjYXB0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBvZmYoKSB7XG4gICAgdmFyIGFzc2lnbjtcblxuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcbiAgICB2YXIgZXZlbnRUeXBlID0gYXJnc1swXTtcbiAgICB2YXIgdGFyZ2V0U2VsZWN0b3IgPSBhcmdzWzFdO1xuICAgIHZhciBsaXN0ZW5lciA9IGFyZ3NbMl07XG4gICAgdmFyIGNhcHR1cmUgPSBhcmdzWzNdO1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKGFzc2lnbiA9IGFyZ3MsIGV2ZW50VHlwZSA9IGFzc2lnblswXSwgbGlzdGVuZXIgPSBhc3NpZ25bMV0sIGNhcHR1cmUgPSBhc3NpZ25bMl0pO1xuICAgICAgdGFyZ2V0U2VsZWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY2FwdHVyZSkgeyBjYXB0dXJlID0gZmFsc2U7IH1cblxuICAgIHZhciBldmVudHMgPSBldmVudFR5cGUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXNbal07XG4gICAgICAgIHZhciBoYW5kbGVycyA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoIXRhcmdldFNlbGVjdG9yICYmIGVsLmRvbTdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBoYW5kbGVycyA9IGVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFNlbGVjdG9yICYmIGVsLmRvbTdMaXZlTGlzdGVuZXJzKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBlbC5kb203TGl2ZUxpc3RlbmVyc1tldmVudF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAodmFyIGsgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBrID49IDA7IGsgLT0gMSkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1trXTtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAmJiBoYW5kbGVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLnByb3h5TGlzdGVuZXIsIGNhcHR1cmUpO1xuICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaywgMSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RlbmVyICYmIGhhbmRsZXIubGlzdGVuZXIgJiYgaGFuZGxlci5saXN0ZW5lci5kb203cHJveHkgJiYgaGFuZGxlci5saXN0ZW5lci5kb203cHJveHkgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIucHJveHlMaXN0ZW5lciwgY2FwdHVyZSk7XG4gICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShrLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIucHJveHlMaXN0ZW5lciwgY2FwdHVyZSk7XG4gICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShrLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gdHJpZ2dlcigpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgZXZlbnRzID0gYXJnc1swXS5zcGxpdCgnICcpO1xuICAgIHZhciBldmVudERhdGEgPSBhcmdzWzFdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpc1tqXTtcbiAgICAgICAgdmFyIGV2dCA9ICh2b2lkIDApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2dCA9IG5ldyB3aW4uQ3VzdG9tRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICAgIGRldGFpbDogZXZlbnREYXRhLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBldnQgPSBkb2MuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICAgICAgZXZ0LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgZXZ0LmRldGFpbCA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgZWwuZG9tN0V2ZW50RGF0YSA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uIChkYXRhLCBkYXRhSW5kZXgpIHsgcmV0dXJuIGRhdGFJbmRleCA+IDA7IH0pO1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgICAgIGVsLmRvbTdFdmVudERhdGEgPSBbXTtcbiAgICAgICAgZGVsZXRlIGVsLmRvbTdFdmVudERhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoY2FsbGJhY2spIHtcbiAgICB2YXIgZXZlbnRzID0gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgICB2YXIgZG9tID0gdGhpcztcbiAgICB2YXIgaTtcbiAgICBmdW5jdGlvbiBmaXJlQ2FsbEJhY2soZSkge1xuICAgICAgLyoganNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHsgcmV0dXJuOyB9XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBkb20ub2ZmKGV2ZW50c1tpXSwgZmlyZUNhbGxCYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGRvbS5vbihldmVudHNbaV0sIGZpcmVDYWxsQmFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIG91dGVyV2lkdGgoaW5jbHVkZU1hcmdpbnMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoaW5jbHVkZU1hcmdpbnMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHZhciBzdHlsZXMgPSB0aGlzLnN0eWxlcygpO1xuICAgICAgICByZXR1cm4gdGhpc1swXS5vZmZzZXRXaWR0aCArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1yaWdodCcpKSArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0JykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0V2lkdGg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIG91dGVySGVpZ2h0KGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB2YXIgc3R5bGVzID0gdGhpcy5zdHlsZXMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0SGVpZ2h0ICsgcGFyc2VGbG9hdChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLXRvcCcpKSArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1ib3R0b20nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1swXS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzWzBdO1xuICAgICAgdmFyIGJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICAgIHZhciBjbGllbnRUb3AgPSBlbC5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcbiAgICAgIHZhciBjbGllbnRMZWZ0ID0gZWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgICAgIHZhciBzY3JvbGxUb3AgPSBlbCA9PT0gd2luID8gd2luLnNjcm9sbFkgOiBlbC5zY3JvbGxUb3A7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGVsID09PSB3aW4gPyB3aW4uc2Nyb2xsWCA6IGVsLnNjcm9sbExlZnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IChib3gudG9wICsgc2Nyb2xsVG9wKSAtIGNsaWVudFRvcCxcbiAgICAgICAgbGVmdDogKGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCkgLSBjbGllbnRMZWZ0LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBzdHlsZXMoKSB7XG4gICAgaWYgKHRoaXNbMF0pIHsgcmV0dXJuIHdpbi5nZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0sIG51bGwpOyB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGZ1bmN0aW9uIGNzcyhwcm9wcywgdmFsdWUpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRoaXNbMF0pIHsgcmV0dXJuIHdpbi5nZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0sIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcHMpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXNbaV0uc3R5bGVbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRoaXNbaV0uc3R5bGVbcHJvcHNdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjb2xsZWN0aW9uIHBhc3NpbmcgZWxlbWVudHMgdG8gYGNhbGxiYWNrYFxuICBmdW5jdGlvbiBlYWNoKGNhbGxiYWNrKSB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbnRpbnVpbmcgd2l0aG91dCBhIGNhbGxiYWNrXG4gICAgaWYgKCFjYWxsYmFjaykgeyByZXR1cm4gdGhpczsgfVxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBjb2xsZWN0aW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpc1tpXSwgaSwgdGhpc1tpXSkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIEVuZCB0aGUgbG9vcCBlYXJseVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmV0dXJuIGB0aGlzYCB0byBhbGxvdyBjaGFpbmVkIERPTSBvcGVyYXRpb25zXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGZ1bmN0aW9uIGh0bWwoaHRtbCkge1xuICAgIGlmICh0eXBlb2YgaHRtbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzWzBdID8gdGhpc1swXS5pbm5lckhUTUwgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzW2ldLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiB0ZXh0KHRleHQpIHtcbiAgICBpZiAodHlwZW9mIHRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpc1swXSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXNbaV0udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBlbCA9IHRoaXNbMF07XG4gICAgdmFyIGNvbXBhcmVXaXRoO1xuICAgIHZhciBpO1xuICAgIGlmICghZWwgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHsgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpOyB9XG4gICAgICBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHsgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7IH1cbiAgICAgIGVsc2UgaWYgKGVsLm1zTWF0Y2hlc1NlbGVjdG9yKSB7IHJldHVybiBlbC5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7IH1cblxuICAgICAgY29tcGFyZVdpdGggPSAkKHNlbGVjdG9yKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlV2l0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoY29tcGFyZVdpdGhbaV0gPT09IGVsKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gZG9jKSB7IHJldHVybiBlbCA9PT0gZG9jOyB9XG4gICAgZWxzZSBpZiAoc2VsZWN0b3IgPT09IHdpbikgeyByZXR1cm4gZWwgPT09IHdpbjsgfVxuXG4gICAgaWYgKHNlbGVjdG9yLm5vZGVUeXBlIHx8IHNlbGVjdG9yIGluc3RhbmNlb2YgRG9tNykge1xuICAgICAgY29tcGFyZVdpdGggPSBzZWxlY3Rvci5ub2RlVHlwZSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3RvcjtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlV2l0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoY29tcGFyZVdpdGhbaV0gPT09IGVsKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBpbmRleCgpIHtcbiAgICB2YXIgY2hpbGQgPSB0aGlzWzBdO1xuICAgIHZhciBpO1xuICAgIGlmIChjaGlsZCkge1xuICAgICAgaSA9IDA7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIHdoaWxlICgoY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkgeyBpICs9IDE7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiBlcShpbmRleCkge1xuICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiB0aGlzOyB9XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciByZXR1cm5JbmRleDtcbiAgICBpZiAoaW5kZXggPiBsZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm5JbmRleCA9IGxlbmd0aCArIGluZGV4O1xuICAgICAgaWYgKHJldHVybkluZGV4IDwgMCkgeyByZXR1cm4gbmV3IERvbTcoW10pOyB9XG4gICAgICByZXR1cm4gbmV3IERvbTcoW3RoaXNbcmV0dXJuSW5kZXhdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhbdGhpc1tpbmRleF1dKTtcbiAgfVxuICBmdW5jdGlvbiBhcHBlbmQoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIG5ld0NoaWxkO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBhcmdzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICBuZXdDaGlsZCA9IGFyZ3Nba107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgdGVtcERpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IG5ld0NoaWxkO1xuICAgICAgICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXNbaV0uYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBEb203KSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuZXdDaGlsZC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdGhpc1tpXS5hcHBlbmRDaGlsZChuZXdDaGlsZFtqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXNbaV0uYXBwZW5kQ2hpbGQobmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGVuZChuZXdDaGlsZCkge1xuICAgIHZhciBpO1xuICAgIHZhciBqO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdGVtcERpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBuZXdDaGlsZDtcbiAgICAgICAgZm9yIChqID0gdGVtcERpdi5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAxKSB7XG4gICAgICAgICAgdGhpc1tpXS5pbnNlcnRCZWZvcmUodGVtcERpdi5jaGlsZE5vZGVzW2pdLCB0aGlzW2ldLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgRG9tNykge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmV3Q2hpbGQubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICB0aGlzW2ldLmluc2VydEJlZm9yZShuZXdDaGlsZFtqXSwgdGhpc1tpXS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tpXS5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHRoaXNbaV0uY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoc2VsZWN0b3IpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXNbMF0ubmV4dEVsZW1lbnRTaWJsaW5nICYmICQodGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmcpLmlzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRG9tNyhbdGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmcpIHsgcmV0dXJuIG5ldyBEb203KFt0aGlzWzBdLm5leHRFbGVtZW50U2libGluZ10pOyB9XG4gICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICB9XG4gIGZ1bmN0aW9uIG5leHRBbGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgbmV4dEVscyA9IFtdO1xuICAgIHZhciBlbCA9IHRoaXNbMF07XG4gICAgaWYgKCFlbCkgeyByZXR1cm4gbmV3IERvbTcoW10pOyB9XG4gICAgd2hpbGUgKGVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdmFyIG5leHQgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICBpZiAoJChuZXh0KS5pcyhzZWxlY3RvcikpIHsgbmV4dEVscy5wdXNoKG5leHQpOyB9XG4gICAgICB9IGVsc2UgeyBuZXh0RWxzLnB1c2gobmV4dCk7IH1cbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb203KG5leHRFbHMpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXYoc2VsZWN0b3IpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzWzBdO1xuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICQoZWwucHJldmlvdXNFbGVtZW50U2libGluZykuaXMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEb203KFtlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEb203KFtdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHsgcmV0dXJuIG5ldyBEb203KFtlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXSk7IH1cbiAgICAgIHJldHVybiBuZXcgRG9tNyhbXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhbXSk7XG4gIH1cbiAgZnVuY3Rpb24gcHJldkFsbChzZWxlY3Rvcikge1xuICAgIHZhciBwcmV2RWxzID0gW107XG4gICAgdmFyIGVsID0gdGhpc1swXTtcbiAgICBpZiAoIWVsKSB7IHJldHVybiBuZXcgRG9tNyhbXSk7IH1cbiAgICB3aGlsZSAoZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdmFyIHByZXYgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKCQocHJldikuaXMoc2VsZWN0b3IpKSB7IHByZXZFbHMucHVzaChwcmV2KTsgfVxuICAgICAgfSBlbHNlIHsgcHJldkVscy5wdXNoKHByZXYpOyB9XG4gICAgICBlbCA9IHByZXY7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhwcmV2RWxzKTtcbiAgfVxuICBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodGhpc1tpXS5wYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgIGlmICgkKHRoaXNbaV0ucGFyZW50Tm9kZSkuaXMoc2VsZWN0b3IpKSB7IHBhcmVudHMucHVzaCh0aGlzW2ldLnBhcmVudE5vZGUpOyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50cy5wdXNoKHRoaXNbaV0ucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICQodW5pcXVlKHBhcmVudHMpKTtcbiAgfVxuICBmdW5jdGlvbiBwYXJlbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBbXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXNbaV0ucGFyZW50Tm9kZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICBpZiAoJChwYXJlbnQpLmlzKHNlbGVjdG9yKSkgeyBwYXJlbnRzLnB1c2gocGFyZW50KTsgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJCh1bmlxdWUocGFyZW50cykpO1xuICB9XG4gIGZ1bmN0aW9uIGNsb3Nlc3Qoc2VsZWN0b3IpIHtcbiAgICB2YXIgY2xvc2VzdCA9IHRoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBEb203KFtdKTtcbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0LmlzKHNlbGVjdG9yKSkge1xuICAgICAgY2xvc2VzdCA9IGNsb3Nlc3QucGFyZW50cyhzZWxlY3RvcikuZXEoMCk7XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IpIHtcbiAgICB2YXIgZm91bmRFbGVtZW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpc1tpXS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm91bmQubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgZm91bmRFbGVtZW50cy5wdXNoKGZvdW5kW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb203KGZvdW5kRWxlbWVudHMpO1xuICB9XG4gIGZ1bmN0aW9uIGNoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gdGhpc1tpXS5jaGlsZE5vZGVzO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2pdLm5vZGVUeXBlID09PSAxKSB7IGNoaWxkcmVuLnB1c2goY2hpbGROb2Rlc1tqXSk7IH1cbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZE5vZGVzW2pdLm5vZGVUeXBlID09PSAxICYmICQoY2hpbGROb2Rlc1tqXSkuaXMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZE5vZGVzW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IERvbTcodW5pcXVlKGNoaWxkcmVuKSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHRoaXNbaV0ucGFyZW50Tm9kZSkgeyB0aGlzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpc1tpXSk7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gYWRkKCkge1xuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHZhciBkb20gPSB0aGlzO1xuICAgIHZhciBpO1xuICAgIHZhciBqO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgdG9BZGQgPSAkKGFyZ3NbaV0pO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHRvQWRkLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGRvbVtkb20ubGVuZ3RoXSA9IHRvQWRkW2pdO1xuICAgICAgICBkb20ubGVuZ3RoICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkb207XG4gIH1cblxuICB2YXIgTWV0aG9kcyA9IHtcbiAgICBhZGRDbGFzczogYWRkQ2xhc3MsXG4gICAgcmVtb3ZlQ2xhc3M6IHJlbW92ZUNsYXNzLFxuICAgIGhhc0NsYXNzOiBoYXNDbGFzcyxcbiAgICB0b2dnbGVDbGFzczogdG9nZ2xlQ2xhc3MsXG4gICAgYXR0cjogYXR0cixcbiAgICByZW1vdmVBdHRyOiByZW1vdmVBdHRyLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbixcbiAgICBvbjogb24sXG4gICAgb2ZmOiBvZmYsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICB0cmFuc2l0aW9uRW5kOiB0cmFuc2l0aW9uRW5kLFxuICAgIG91dGVyV2lkdGg6IG91dGVyV2lkdGgsXG4gICAgb3V0ZXJIZWlnaHQ6IG91dGVySGVpZ2h0LFxuICAgIG9mZnNldDogb2Zmc2V0LFxuICAgIGNzczogY3NzLFxuICAgIGVhY2g6IGVhY2gsXG4gICAgaHRtbDogaHRtbCxcbiAgICB0ZXh0OiB0ZXh0LFxuICAgIGlzOiBpcyxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgZXE6IGVxLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgbmV4dDogbmV4dCxcbiAgICBuZXh0QWxsOiBuZXh0QWxsLFxuICAgIHByZXY6IHByZXYsXG4gICAgcHJldkFsbDogcHJldkFsbCxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBwYXJlbnRzOiBwYXJlbnRzLFxuICAgIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gICAgZmluZDogZmluZCxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgcmVtb3ZlOiByZW1vdmUsXG4gICAgYWRkOiBhZGQsXG4gICAgc3R5bGVzOiBzdHlsZXMsXG4gIH07XG5cbiAgT2JqZWN0LmtleXMoTWV0aG9kcykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICQuZm5bbWV0aG9kTmFtZV0gPSAkLmZuW21ldGhvZE5hbWVdIHx8IE1ldGhvZHNbbWV0aG9kTmFtZV07XG4gIH0pO1xuXG4gIHZhciBVdGlscyA9IHtcbiAgICBkZWxldGVQcm9wczogZnVuY3Rpb24gZGVsZXRlUHJvcHMob2JqKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gb2JqO1xuICAgICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvYmplY3Rba2V5XSA9IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBubyBnZXR0ZXIgZm9yIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gc29tZXRoaW5nIGdvdCB3cm9uZ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG5leHRUaWNrOiBmdW5jdGlvbiBuZXh0VGljayhjYWxsYmFjaywgZGVsYXkpIHtcbiAgICAgIGlmICggZGVsYXkgPT09IHZvaWQgMCApIGRlbGF5ID0gMDtcblxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5KTtcbiAgICB9LFxuICAgIG5vdzogZnVuY3Rpb24gbm93KCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCk7XG4gICAgfSxcbiAgICBnZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbCwgYXhpcykge1xuICAgICAgaWYgKCBheGlzID09PSB2b2lkIDAgKSBheGlzID0gJ3gnO1xuXG4gICAgICB2YXIgbWF0cml4O1xuICAgICAgdmFyIGN1clRyYW5zZm9ybTtcbiAgICAgIHZhciB0cmFuc2Zvcm1NYXRyaXg7XG5cbiAgICAgIHZhciBjdXJTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcblxuICAgICAgaWYgKHdpbi5XZWJLaXRDU1NNYXRyaXgpIHtcbiAgICAgICAgY3VyVHJhbnNmb3JtID0gY3VyU3R5bGUudHJhbnNmb3JtIHx8IGN1clN0eWxlLndlYmtpdFRyYW5zZm9ybTtcbiAgICAgICAgaWYgKGN1clRyYW5zZm9ybS5zcGxpdCgnLCcpLmxlbmd0aCA+IDYpIHtcbiAgICAgICAgICBjdXJUcmFuc2Zvcm0gPSBjdXJUcmFuc2Zvcm0uc3BsaXQoJywgJykubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnJlcGxhY2UoJywnLCAnLicpOyB9KS5qb2luKCcsICcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgb2xkIHZlcnNpb25zIG9mIFdlYmtpdCBjaG9rZSB3aGVuICdub25lJyBpcyBwYXNzZWQ7IHBhc3NcbiAgICAgICAgLy8gZW1wdHkgc3RyaW5nIGluc3RlYWQgaW4gdGhpcyBjYXNlXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeCA9IG5ldyB3aW4uV2ViS2l0Q1NTTWF0cml4KGN1clRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjdXJUcmFuc2Zvcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4ID0gY3VyU3R5bGUuTW96VHJhbnNmb3JtIHx8IGN1clN0eWxlLk9UcmFuc2Zvcm0gfHwgY3VyU3R5bGUuTXNUcmFuc2Zvcm0gfHwgY3VyU3R5bGUubXNUcmFuc2Zvcm0gfHwgY3VyU3R5bGUudHJhbnNmb3JtIHx8IGN1clN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpLnJlcGxhY2UoJ3RyYW5zbGF0ZSgnLCAnbWF0cml4KDEsIDAsIDAsIDEsJyk7XG4gICAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeC50b1N0cmluZygpLnNwbGl0KCcsJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzID09PSAneCcpIHtcbiAgICAgICAgLy8gTGF0ZXN0IENocm9tZSBhbmQgd2Via2l0cyBGaXhcbiAgICAgICAgaWYgKHdpbi5XZWJLaXRDU1NNYXRyaXgpIHsgY3VyVHJhbnNmb3JtID0gdHJhbnNmb3JtTWF0cml4Lm00MTsgfVxuICAgICAgICAvLyBDcmF6eSBJRTEwIE1hdHJpeFxuICAgICAgICBlbHNlIGlmIChtYXRyaXgubGVuZ3RoID09PSAxNikgeyBjdXJUcmFuc2Zvcm0gPSBwYXJzZUZsb2F0KG1hdHJpeFsxMl0pOyB9XG4gICAgICAgIC8vIE5vcm1hbCBCcm93c2Vyc1xuICAgICAgICBlbHNlIHsgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbNF0pOyB9XG4gICAgICB9XG4gICAgICBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICAgIC8vIExhdGVzdCBDaHJvbWUgYW5kIHdlYmtpdHMgRml4XG4gICAgICAgIGlmICh3aW4uV2ViS2l0Q1NTTWF0cml4KSB7IGN1clRyYW5zZm9ybSA9IHRyYW5zZm9ybU1hdHJpeC5tNDI7IH1cbiAgICAgICAgLy8gQ3JhenkgSUUxMCBNYXRyaXhcbiAgICAgICAgZWxzZSBpZiAobWF0cml4Lmxlbmd0aCA9PT0gMTYpIHsgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbMTNdKTsgfVxuICAgICAgICAvLyBOb3JtYWwgQnJvd3NlcnNcbiAgICAgICAgZWxzZSB7IGN1clRyYW5zZm9ybSA9IHBhcnNlRmxvYXQobWF0cml4WzVdKTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGN1clRyYW5zZm9ybSB8fCAwO1xuICAgIH0sXG4gICAgcGFyc2VVcmxRdWVyeTogZnVuY3Rpb24gcGFyc2VVcmxRdWVyeSh1cmwpIHtcbiAgICAgIHZhciBxdWVyeSA9IHt9O1xuICAgICAgdmFyIHVybFRvUGFyc2UgPSB1cmwgfHwgd2luLmxvY2F0aW9uLmhyZWY7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBwYXJhbXM7XG4gICAgICB2YXIgcGFyYW07XG4gICAgICB2YXIgbGVuZ3RoO1xuICAgICAgaWYgKHR5cGVvZiB1cmxUb1BhcnNlID09PSAnc3RyaW5nJyAmJiB1cmxUb1BhcnNlLmxlbmd0aCkge1xuICAgICAgICB1cmxUb1BhcnNlID0gdXJsVG9QYXJzZS5pbmRleE9mKCc/JykgPiAtMSA/IHVybFRvUGFyc2UucmVwbGFjZSgvXFxTKlxcPy8sICcnKSA6ICcnO1xuICAgICAgICBwYXJhbXMgPSB1cmxUb1BhcnNlLnNwbGl0KCcmJykuZmlsdGVyKGZ1bmN0aW9uIChwYXJhbXNQYXJ0KSB7IHJldHVybiBwYXJhbXNQYXJ0ICE9PSAnJzsgfSk7XG4gICAgICAgIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgcGFyYW0gPSBwYXJhbXNbaV0ucmVwbGFjZSgvI1xcUysvZywgJycpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgcXVlcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtWzBdKV0gPSB0eXBlb2YgcGFyYW1bMV0gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtWzFdKSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH0sXG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgbyAhPT0gbnVsbCAmJiBvLmNvbnN0cnVjdG9yICYmIG8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9LFxuICAgIGV4dGVuZDogZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuJDEgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4kMS0tICkgYXJnc1sgbGVuJDEgXSA9IGFyZ3VtZW50c1sgbGVuJDEgXTtcblxuICAgICAgdmFyIHRvID0gT2JqZWN0KGFyZ3NbMF0pO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBuZXh0U291cmNlID0gYXJnc1tpXTtcbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBuZXh0U291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKE9iamVjdChuZXh0U291cmNlKSk7XG4gICAgICAgICAgZm9yICh2YXIgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXggKz0gMSkge1xuICAgICAgICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTtcbiAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0U291cmNlLCBuZXh0S2V5KTtcbiAgICAgICAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgICAgIGlmIChVdGlscy5pc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgVXRpbHMuaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgICAgICBVdGlscy5leHRlbmQodG9bbmV4dEtleV0sIG5leHRTb3VyY2VbbmV4dEtleV0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFVdGlscy5pc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgVXRpbHMuaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIFV0aWxzLmV4dGVuZCh0b1tuZXh0S2V5XSwgbmV4dFNvdXJjZVtuZXh0S2V5XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfSxcbiAgfTtcblxuICB2YXIgU3VwcG9ydCA9IChmdW5jdGlvbiBTdXBwb3J0KCkge1xuICAgIHZhciB0ZXN0RGl2ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldHVybiB7XG4gICAgICB0b3VjaDogKHdpbi5Nb2Rlcm5penIgJiYgd2luLk1vZGVybml6ci50b3VjaCA9PT0gdHJ1ZSkgfHwgKGZ1bmN0aW9uIGNoZWNrVG91Y2goKSB7XG4gICAgICAgIHJldHVybiAhISgod2luLm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHx8ICgnb250b3VjaHN0YXJ0JyBpbiB3aW4pIHx8ICh3aW4uRG9jdW1lbnRUb3VjaCAmJiBkb2MgaW5zdGFuY2VvZiB3aW4uRG9jdW1lbnRUb3VjaCkpO1xuICAgICAgfSgpKSxcblxuICAgICAgcG9pbnRlckV2ZW50czogISEod2luLm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCB8fCB3aW4uUG9pbnRlckV2ZW50IHx8ICgnbWF4VG91Y2hQb2ludHMnIGluIHdpbi5uYXZpZ2F0b3IgJiYgd2luLm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApKSxcbiAgICAgIHByZWZpeGVkUG9pbnRlckV2ZW50czogISF3aW4ubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQsXG5cbiAgICAgIHRyYW5zaXRpb246IChmdW5jdGlvbiBjaGVja1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRlc3REaXYuc3R5bGU7XG4gICAgICAgIHJldHVybiAoJ3RyYW5zaXRpb24nIGluIHN0eWxlIHx8ICd3ZWJraXRUcmFuc2l0aW9uJyBpbiBzdHlsZSB8fCAnTW96VHJhbnNpdGlvbicgaW4gc3R5bGUpO1xuICAgICAgfSgpKSxcbiAgICAgIHRyYW5zZm9ybXMzZDogKHdpbi5Nb2Rlcm5penIgJiYgd2luLk1vZGVybml6ci5jc3N0cmFuc2Zvcm1zM2QgPT09IHRydWUpIHx8IChmdW5jdGlvbiBjaGVja1RyYW5zZm9ybXMzZCgpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGVzdERpdi5zdHlsZTtcbiAgICAgICAgcmV0dXJuICgnd2Via2l0UGVyc3BlY3RpdmUnIGluIHN0eWxlIHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gc3R5bGUgfHwgJ09QZXJzcGVjdGl2ZScgaW4gc3R5bGUgfHwgJ01zUGVyc3BlY3RpdmUnIGluIHN0eWxlIHx8ICdwZXJzcGVjdGl2ZScgaW4gc3R5bGUpO1xuICAgICAgfSgpKSxcblxuICAgICAgZmxleGJveDogKGZ1bmN0aW9uIGNoZWNrRmxleGJveCgpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGVzdERpdi5zdHlsZTtcbiAgICAgICAgdmFyIHN0eWxlcyA9ICgnYWxpZ25JdGVtcyB3ZWJraXRBbGlnbkl0ZW1zIHdlYmtpdEJveEFsaWduIG1zRmxleEFsaWduIG1vekJveEFsaWduIHdlYmtpdEZsZXhEaXJlY3Rpb24gbXNGbGV4RGlyZWN0aW9uIG1vekJveERpcmVjdGlvbiBtb3pCb3hPcmllbnQgd2Via2l0Qm94RGlyZWN0aW9uIHdlYmtpdEJveE9yaWVudCcpLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHN0eWxlc1tpXSBpbiBzdHlsZSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0oKSksXG5cbiAgICAgIG9ic2VydmVyOiAoZnVuY3Rpb24gY2hlY2tPYnNlcnZlcigpIHtcbiAgICAgICAgcmV0dXJuICgnTXV0YXRpb25PYnNlcnZlcicgaW4gd2luIHx8ICdXZWJraXRNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW4pO1xuICAgICAgfSgpKSxcblxuICAgICAgcGFzc2l2ZUxpc3RlbmVyOiAoZnVuY3Rpb24gY2hlY2tQYXNzaXZlTGlzdGVuZXIoKSB7XG4gICAgICAgIHZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmVMaXN0ZW5lcicsIG51bGwsIG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gTm8gc3VwcG9ydFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBwb3J0c1Bhc3NpdmU7XG4gICAgICB9KCkpLFxuXG4gICAgICBnZXN0dXJlczogKGZ1bmN0aW9uIGNoZWNrR2VzdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiAnb25nZXN0dXJlc3RhcnQnIGluIHdpbjtcbiAgICAgIH0oKSksXG4gICAgfTtcbiAgfSgpKTtcblxuICB2YXIgQnJvd3NlciA9IChmdW5jdGlvbiBCcm93c2VyKCkge1xuICAgIGZ1bmN0aW9uIGlzU2FmYXJpKCkge1xuICAgICAgdmFyIHVhID0gd2luLm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAodWEuaW5kZXhPZignc2FmYXJpJykgPj0gMCAmJiB1YS5pbmRleE9mKCdjaHJvbWUnKSA8IDAgJiYgdWEuaW5kZXhPZignYW5kcm9pZCcpIDwgMCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpc0lFOiAhIXdpbi5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50L2cpIHx8ICEhd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUvZyksXG4gICAgICBpc0VkZ2U6ICEhd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2UvZyksXG4gICAgICBpc1NhZmFyaTogaXNTYWZhcmkoKSxcbiAgICAgIGlzVWlXZWJWaWV3OiAvKGlQaG9uZXxpUG9kfGlQYWQpLipBcHBsZVdlYktpdCg/IS4qU2FmYXJpKS9pLnRlc3Qod2luLm5hdmlnYXRvci51c2VyQWdlbnQpLFxuICAgIH07XG4gIH0oKSk7XG5cbiAgdmFyIFN3aXBlckNsYXNzID0gZnVuY3Rpb24gU3dpcGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgaWYgKCBwYXJhbXMgPT09IHZvaWQgMCApIHBhcmFtcyA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYucGFyYW1zID0gcGFyYW1zO1xuXG4gICAgLy8gRXZlbnRzXG4gICAgc2VsZi5ldmVudHNMaXN0ZW5lcnMgPSB7fTtcblxuICAgIGlmIChzZWxmLnBhcmFtcyAmJiBzZWxmLnBhcmFtcy5vbikge1xuICAgICAgT2JqZWN0LmtleXMoc2VsZi5wYXJhbXMub24pLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBzZWxmLm9uKGV2ZW50TmFtZSwgc2VsZi5wYXJhbXMub25bZXZlbnROYW1lXSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN0YXRpY0FjY2Vzc29ycyA9IHsgY29tcG9uZW50czogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uIChldmVudHMsIGhhbmRsZXIsIHByaW9yaXR5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gc2VsZjsgfVxuICAgIHZhciBtZXRob2QgPSBwcmlvcml0eSA/ICd1bnNoaWZ0JyA6ICdwdXNoJztcbiAgICBldmVudHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHsgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdID0gW107IH1cbiAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XVttZXRob2RdKGhhbmRsZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSAoZXZlbnRzLCBoYW5kbGVyLCBwcmlvcml0eSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIHNlbGY7IH1cbiAgICBmdW5jdGlvbiBvbmNlSGFuZGxlcigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIHNlbGYub2ZmKGV2ZW50cywgb25jZUhhbmRsZXIpO1xuICAgICAgaWYgKG9uY2VIYW5kbGVyLmY3cHJveHkpIHtcbiAgICAgICAgZGVsZXRlIG9uY2VIYW5kbGVyLmY3cHJveHk7XG4gICAgICB9XG4gICAgfVxuICAgIG9uY2VIYW5kbGVyLmY3cHJveHkgPSBoYW5kbGVyO1xuICAgIHJldHVybiBzZWxmLm9uKGV2ZW50cywgb25jZUhhbmRsZXIsIHByaW9yaXR5KTtcbiAgfTtcblxuICBTd2lwZXJDbGFzcy5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gb2ZmIChldmVudHMsIGhhbmRsZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycykgeyByZXR1cm4gc2VsZjsgfVxuICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0gJiYgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLmxlbmd0aCkge1xuICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRIYW5kbGVyLCBpbmRleCkge1xuICAgICAgICAgIGlmIChldmVudEhhbmRsZXIgPT09IGhhbmRsZXIgfHwgKGV2ZW50SGFuZGxlci5mN3Byb3h5ICYmIGV2ZW50SGFuZGxlci5mN3Byb3h5ID09PSBoYW5kbGVyKSkge1xuICAgICAgICAgICAgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICBTd2lwZXJDbGFzcy5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQgKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycykgeyByZXR1cm4gc2VsZjsgfVxuICAgIHZhciBldmVudHM7XG4gICAgdmFyIGRhdGE7XG4gICAgdmFyIGNvbnRleHQ7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBldmVudHMgPSBhcmdzWzBdO1xuICAgICAgZGF0YSA9IGFyZ3Muc2xpY2UoMSwgYXJncy5sZW5ndGgpO1xuICAgICAgY29udGV4dCA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50cyA9IGFyZ3NbMF0uZXZlbnRzO1xuICAgICAgZGF0YSA9IGFyZ3NbMF0uZGF0YTtcbiAgICAgIGNvbnRleHQgPSBhcmdzWzBdLmNvbnRleHQgfHwgc2VsZjtcbiAgICB9XG4gICAgdmFyIGV2ZW50c0FycmF5ID0gQXJyYXkuaXNBcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KCcgJyk7XG4gICAgZXZlbnRzQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVycyAmJiBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gW107XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICBoYW5kbGVycy5wdXNoKGV2ZW50SGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkoY29udGV4dCwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS51c2VNb2R1bGVzUGFyYW1zID0gZnVuY3Rpb24gdXNlTW9kdWxlc1BhcmFtcyAoaW5zdGFuY2VQYXJhbXMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzO1xuICAgIGlmICghaW5zdGFuY2UubW9kdWxlcykgeyByZXR1cm47IH1cbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZS5tb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgICB2YXIgbW9kdWxlID0gaW5zdGFuY2UubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgIC8vIEV4dGVuZCBwYXJhbXNcbiAgICAgIGlmIChtb2R1bGUucGFyYW1zKSB7XG4gICAgICAgIFV0aWxzLmV4dGVuZChpbnN0YW5jZVBhcmFtcywgbW9kdWxlLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU3dpcGVyQ2xhc3MucHJvdG90eXBlLnVzZU1vZHVsZXMgPSBmdW5jdGlvbiB1c2VNb2R1bGVzIChtb2R1bGVzUGFyYW1zKSB7XG4gICAgICBpZiAoIG1vZHVsZXNQYXJhbXMgPT09IHZvaWQgMCApIG1vZHVsZXNQYXJhbXMgPSB7fTtcblxuICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG4gICAgaWYgKCFpbnN0YW5jZS5tb2R1bGVzKSB7IHJldHVybjsgfVxuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlLm1vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHtcbiAgICAgIHZhciBtb2R1bGUgPSBpbnN0YW5jZS5tb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgICAgdmFyIG1vZHVsZVBhcmFtcyA9IG1vZHVsZXNQYXJhbXNbbW9kdWxlTmFtZV0gfHwge307XG4gICAgICAvLyBFeHRlbmQgaW5zdGFuY2UgbWV0aG9kcyBhbmQgcHJvcHNcbiAgICAgIGlmIChtb2R1bGUuaW5zdGFuY2UpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLmluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVQcm9wTmFtZSkge1xuICAgICAgICAgIHZhciBtb2R1bGVQcm9wID0gbW9kdWxlLmluc3RhbmNlW21vZHVsZVByb3BOYW1lXTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZVByb3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGluc3RhbmNlW21vZHVsZVByb3BOYW1lXSA9IG1vZHVsZVByb3AuYmluZChpbnN0YW5jZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlW21vZHVsZVByb3BOYW1lXSA9IG1vZHVsZVByb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIGlmIChtb2R1bGUub24gJiYgaW5zdGFuY2Uub24pIHtcbiAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLm9uKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVFdmVudE5hbWUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5vbihtb2R1bGVFdmVudE5hbWUsIG1vZHVsZS5vblttb2R1bGVFdmVudE5hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vZHVsZSBjcmVhdGUgY2FsbGJhY2tcbiAgICAgIGlmIChtb2R1bGUuY3JlYXRlKSB7XG4gICAgICAgIG1vZHVsZS5jcmVhdGUuYmluZChpbnN0YW5jZSkobW9kdWxlUGFyYW1zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBzdGF0aWNBY2Nlc3NvcnMuY29tcG9uZW50cy5zZXQgPSBmdW5jdGlvbiAoY29tcG9uZW50cykge1xuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKCFDbGFzcy51c2UpIHsgcmV0dXJuOyB9XG4gICAgQ2xhc3MudXNlKGNvbXBvbmVudHMpO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLmluc3RhbGxNb2R1bGUgPSBmdW5jdGlvbiBpbnN0YWxsTW9kdWxlIChtb2R1bGUpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHBhcmFtc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKCFDbGFzcy5wcm90b3R5cGUubW9kdWxlcykgeyBDbGFzcy5wcm90b3R5cGUubW9kdWxlcyA9IHt9OyB9XG4gICAgdmFyIG5hbWUgPSBtb2R1bGUubmFtZSB8fCAoKChPYmplY3Qua2V5cyhDbGFzcy5wcm90b3R5cGUubW9kdWxlcykubGVuZ3RoKSArIFwiX1wiICsgKFV0aWxzLm5vdygpKSkpO1xuICAgIENsYXNzLnByb3RvdHlwZS5tb2R1bGVzW25hbWVdID0gbW9kdWxlO1xuICAgIC8vIFByb3RvdHlwZVxuICAgIGlmIChtb2R1bGUucHJvdG8pIHtcbiAgICAgIE9iamVjdC5rZXlzKG1vZHVsZS5wcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVtrZXldID0gbW9kdWxlLnByb3RvW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ2xhc3NcbiAgICBpZiAobW9kdWxlLnN0YXRpYykge1xuICAgICAgT2JqZWN0LmtleXMobW9kdWxlLnN0YXRpYykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIENsYXNzW2tleV0gPSBtb2R1bGUuc3RhdGljW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ2FsbGJhY2tcbiAgICBpZiAobW9kdWxlLmluc3RhbGwpIHtcbiAgICAgIG1vZHVsZS5pbnN0YWxsLmFwcGx5KENsYXNzLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG4gIH07XG5cbiAgU3dpcGVyQ2xhc3MudXNlID0gZnVuY3Rpb24gdXNlIChtb2R1bGUpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHBhcmFtc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgbW9kdWxlLmZvckVhY2goZnVuY3Rpb24gKG0pIHsgcmV0dXJuIENsYXNzLmluc3RhbGxNb2R1bGUobSk7IH0pO1xuICAgICAgcmV0dXJuIENsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3MuaW5zdGFsbE1vZHVsZS5hcHBseShDbGFzcywgWyBtb2R1bGUgXS5jb25jYXQoIHBhcmFtcyApKTtcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3dpcGVyQ2xhc3MsIHN0YXRpY0FjY2Vzc29ycyApO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNpemUgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgaGVpZ2h0O1xuICAgIHZhciAkZWwgPSBzd2lwZXIuJGVsO1xuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnBhcmFtcy53aWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdpZHRoID0gc3dpcGVyLnBhcmFtcy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggPSAkZWxbMF0uY2xpZW50V2lkdGg7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnBhcmFtcy5oZWlnaHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBoZWlnaHQgPSBzd2lwZXIucGFyYW1zLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0ID0gJGVsWzBdLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgaWYgKCh3aWR0aCA9PT0gMCAmJiBzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHx8IChoZWlnaHQgPT09IDAgJiYgc3dpcGVyLmlzVmVydGljYWwoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdWJ0cmFjdCBwYWRkaW5nc1xuICAgIHdpZHRoID0gd2lkdGggLSBwYXJzZUludCgkZWwuY3NzKCdwYWRkaW5nLWxlZnQnKSwgMTApIC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy1yaWdodCcpLCAxMCk7XG4gICAgaGVpZ2h0ID0gaGVpZ2h0IC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy10b3AnKSwgMTApIC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy1ib3R0b20nKSwgMTApO1xuXG4gICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzaXplOiBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB3aWR0aCA6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlcyAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG5cbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBzd2lwZXJTaXplID0gc3dpcGVyLnNpemU7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgdmFyIHdyb25nUlRMID0gc3dpcGVyLndyb25nUlRMO1xuICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICAgIHZhciBwcmV2aW91c1NsaWRlc0xlbmd0aCA9IGlzVmlydHVhbCA/IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGggOiBzd2lwZXIuc2xpZGVzLmxlbmd0aDtcbiAgICB2YXIgc2xpZGVzID0gJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSkpO1xuICAgIHZhciBzbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc2xpZGVzLmxlbmd0aDtcbiAgICB2YXIgc25hcEdyaWQgPSBbXTtcbiAgICB2YXIgc2xpZGVzR3JpZCA9IFtdO1xuICAgIHZhciBzbGlkZXNTaXplc0dyaWQgPSBbXTtcblxuICAgIHZhciBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlO1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0QmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlLmNhbGwoc3dpcGVyKTtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0QWZ0ZXIgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QWZ0ZXI7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXRBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2Zmc2V0QWZ0ZXIgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QWZ0ZXIuY2FsbChzd2lwZXIpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICB2YXIgcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcblxuICAgIHZhciBzcGFjZUJldHdlZW4gPSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICAgIHZhciBzbGlkZVBvc2l0aW9uID0gLW9mZnNldEJlZm9yZTtcbiAgICB2YXIgcHJldlNsaWRlU2l6ZSA9IDA7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpZiAodHlwZW9mIHN3aXBlclNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJyAmJiBzcGFjZUJldHdlZW4uaW5kZXhPZignJScpID49IDApIHtcbiAgICAgIHNwYWNlQmV0d2VlbiA9IChwYXJzZUZsb2F0KHNwYWNlQmV0d2Vlbi5yZXBsYWNlKCclJywgJycpKSAvIDEwMCkgKiBzd2lwZXJTaXplO1xuICAgIH1cblxuICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IC1zcGFjZUJldHdlZW47XG5cbiAgICAvLyByZXNldCBtYXJnaW5zXG4gICAgaWYgKHJ0bCkgeyBzbGlkZXMuY3NzKHsgbWFyZ2luTGVmdDogJycsIG1hcmdpblRvcDogJycgfSk7IH1cbiAgICBlbHNlIHsgc2xpZGVzLmNzcyh7IG1hcmdpblJpZ2h0OiAnJywgbWFyZ2luQm90dG9tOiAnJyB9KTsgfVxuXG4gICAgdmFyIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3M7XG4gICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4gPiAxKSB7XG4gICAgICBpZiAoTWF0aC5mbG9vcihzbGlkZXNMZW5ndGggLyBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uKSA9PT0gc2xpZGVzTGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pIHtcbiAgICAgICAgc2xpZGVzTnVtYmVyRXZlblRvUm93cyA9IHNsaWRlc0xlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MgPSBNYXRoLmNlaWwoc2xpZGVzTGVuZ3RoIC8gcGFyYW1zLnNsaWRlc1BlckNvbHVtbikgKiBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJWaWV3ICE9PSAnYXV0bycgJiYgcGFyYW1zLnNsaWRlc1BlckNvbHVtbkZpbGwgPT09ICdyb3cnKSB7XG4gICAgICAgIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MgPSBNYXRoLm1heChzbGlkZXNOdW1iZXJFdmVuVG9Sb3dzLCBwYXJhbXMuc2xpZGVzUGVyVmlldyAqIHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGMgc2xpZGVzXG4gICAgdmFyIHNsaWRlU2l6ZTtcbiAgICB2YXIgc2xpZGVzUGVyQ29sdW1uID0gcGFyYW1zLnNsaWRlc1BlckNvbHVtbjtcbiAgICB2YXIgc2xpZGVzUGVyUm93ID0gc2xpZGVzTnVtYmVyRXZlblRvUm93cyAvIHNsaWRlc1BlckNvbHVtbjtcbiAgICB2YXIgbnVtRnVsbENvbHVtbnMgPSBNYXRoLmZsb29yKHNsaWRlc0xlbmd0aCAvIHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHNsaWRlU2l6ZSA9IDA7XG4gICAgICB2YXIgc2xpZGUgPSBzbGlkZXMuZXEoaSk7XG4gICAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgICAgLy8gU2V0IHNsaWRlcyBvcmRlclxuICAgICAgICB2YXIgbmV3U2xpZGVPcmRlckluZGV4ID0gKHZvaWQgMCk7XG4gICAgICAgIHZhciBjb2x1bW4gPSAodm9pZCAwKTtcbiAgICAgICAgdmFyIHJvdyA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBhcmFtcy5zbGlkZXNQZXJDb2x1bW5GaWxsID09PSAnY29sdW1uJylcbiAgICAgICAgICB8fCAocGFyYW1zLnNsaWRlc1BlckNvbHVtbkZpbGwgPT09ICdyb3cnICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA+IDEpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyQ29sdW1uRmlsbCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IE1hdGguZmxvb3IoaSAvIHNsaWRlc1BlckNvbHVtbik7XG4gICAgICAgICAgICByb3cgPSBpIC0gKGNvbHVtbiAqIHNsaWRlc1BlckNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sdW1uID4gbnVtRnVsbENvbHVtbnMgfHwgKGNvbHVtbiA9PT0gbnVtRnVsbENvbHVtbnMgJiYgcm93ID09PSBzbGlkZXNQZXJDb2x1bW4gLSAxKSkge1xuICAgICAgICAgICAgICByb3cgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKHJvdyA+PSBzbGlkZXNQZXJDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByb3cgPSAwO1xuICAgICAgICAgICAgICAgIGNvbHVtbiArPSAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBncm91cEluZGV4ID0gTWF0aC5mbG9vcihpIC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICAgICAgICAgIHJvdyA9IE1hdGguZmxvb3IoaSAvIHBhcmFtcy5zbGlkZXNQZXJWaWV3KSAtIGdyb3VwSW5kZXggKiBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uO1xuICAgICAgICAgICAgY29sdW1uID0gaSAtIHJvdyAqIHBhcmFtcy5zbGlkZXNQZXJWaWV3IC0gZ3JvdXBJbmRleCAqIHBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdTbGlkZU9yZGVySW5kZXggPSBjb2x1bW4gKyAoKHJvdyAqIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MpIC8gc2xpZGVzUGVyQ29sdW1uKTtcbiAgICAgICAgICBzbGlkZVxuICAgICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAgICctd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwJzogbmV3U2xpZGVPcmRlckluZGV4LFxuICAgICAgICAgICAgICAnLW1vei1ib3gtb3JkaW5hbC1ncm91cCc6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgICAgJy1tcy1mbGV4LW9yZGVyJzogbmV3U2xpZGVPcmRlckluZGV4LFxuICAgICAgICAgICAgICAnLXdlYmtpdC1vcmRlcic6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgICAgb3JkZXI6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvdyA9IE1hdGguZmxvb3IoaSAvIHNsaWRlc1BlclJvdyk7XG4gICAgICAgICAgY29sdW1uID0gaSAtIChyb3cgKiBzbGlkZXNQZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHNsaWRlXG4gICAgICAgICAgLmNzcyhcbiAgICAgICAgICAgIChcIm1hcmdpbi1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAndG9wJyA6ICdsZWZ0JykpLFxuICAgICAgICAgICAgKHJvdyAhPT0gMCAmJiBwYXJhbXMuc3BhY2VCZXR3ZWVuKSAmJiAoKChwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLXN3aXBlci1jb2x1bW4nLCBjb2x1bW4pXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtc3dpcGVyLXJvdycsIHJvdyk7XG4gICAgICB9XG4gICAgICBpZiAoc2xpZGUuY3NzKCdkaXNwbGF5JykgPT09ICdub25lJykgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHZhciBzbGlkZVN0eWxlcyA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHNsaWRlWzBdLCBudWxsKTtcbiAgICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBzbGlkZVswXS5zdHlsZS50cmFuc2Zvcm07XG4gICAgICAgIHZhciBjdXJyZW50V2ViS2l0VHJhbnNmb3JtID0gc2xpZGVbMF0uc3R5bGUud2Via2l0VHJhbnNmb3JtO1xuICAgICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLnRyYW5zZm9ybSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykge1xuICAgICAgICAgIHNsaWRlU2l6ZSA9IHN3aXBlci5pc0hvcml6b250YWwoKVxuICAgICAgICAgICAgPyBzbGlkZS5vdXRlcldpZHRoKHRydWUpXG4gICAgICAgICAgICA6IHNsaWRlLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWxlZnQnKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luUmlnaHQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1yaWdodCcpKTtcbiAgICAgICAgICAgIHZhciBib3hTaXppbmcgPSBzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2l6aW5nJyk7XG4gICAgICAgICAgICBpZiAoYm94U2l6aW5nICYmIGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnICYmICFCcm93c2VyLmlzSUUpIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gd2lkdGggKyBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzbGlkZVNpemUgPSB3aWR0aCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcGFyc2VGbG9hdChzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VGbG9hdChzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdtYXJnaW4tdG9wJykpO1xuICAgICAgICAgICAgdmFyIG1hcmdpbkJvdHRvbSA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWJvdHRvbScpKTtcbiAgICAgICAgICAgIHZhciBib3hTaXppbmckMSA9IHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKTtcbiAgICAgICAgICAgIGlmIChib3hTaXppbmckMSAmJiBib3hTaXppbmckMSA9PT0gJ2JvcmRlci1ib3gnICYmICFCcm93c2VyLmlzSUUpIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gaGVpZ2h0ICsgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gaGVpZ2h0ICsgcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b20gKyBtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50VHJhbnNmb3JtKSB7XG4gICAgICAgICAgc2xpZGVbMF0uc3R5bGUudHJhbnNmb3JtID0gY3VycmVudFRyYW5zZm9ybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHsgc2xpZGVTaXplID0gTWF0aC5mbG9vcihzbGlkZVNpemUpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZVNpemUgPSAoc3dpcGVyU2l6ZSAtICgocGFyYW1zLnNsaWRlc1BlclZpZXcgLSAxKSAqIHNwYWNlQmV0d2VlbikpIC8gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlU2l6ZSA9IE1hdGguZmxvb3Ioc2xpZGVTaXplKTsgfVxuXG4gICAgICAgIGlmIChzbGlkZXNbaV0pIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICBzbGlkZXNbaV0uc3R5bGUud2lkdGggPSBzbGlkZVNpemUgKyBcInB4XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsaWRlc1tpXS5zdHlsZS5oZWlnaHQgPSBzbGlkZVNpemUgKyBcInB4XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2xpZGVzW2ldKSB7XG4gICAgICAgIHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUgPSBzbGlkZVNpemU7XG4gICAgICB9XG4gICAgICBzbGlkZXNTaXplc0dyaWQucHVzaChzbGlkZVNpemUpO1xuXG5cbiAgICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyAoc2xpZGVTaXplIC8gMikgKyAocHJldlNsaWRlU2l6ZSAvIDIpICsgc3BhY2VCZXR3ZWVuO1xuICAgICAgICBpZiAocHJldlNsaWRlU2l6ZSA9PT0gMCAmJiBpICE9PSAwKSB7IHNsaWRlUG9zaXRpb24gPSBzbGlkZVBvc2l0aW9uIC0gKHN3aXBlclNpemUgLyAyKSAtIHNwYWNlQmV0d2VlbjsgfVxuICAgICAgICBpZiAoaSA9PT0gMCkgeyBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiAtIChzd2lwZXJTaXplIC8gMikgLSBzcGFjZUJldHdlZW47IH1cbiAgICAgICAgaWYgKE1hdGguYWJzKHNsaWRlUG9zaXRpb24pIDwgMSAvIDEwMDApIHsgc2xpZGVQb3NpdGlvbiA9IDA7IH1cbiAgICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHsgc2xpZGVQb3NpdGlvbiA9IE1hdGguZmxvb3Ioc2xpZGVQb3NpdGlvbik7IH1cbiAgICAgICAgaWYgKChpbmRleCkgJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHsgc25hcEdyaWQucHVzaChzbGlkZVBvc2l0aW9uKTsgfVxuICAgICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3RocykgeyBzbGlkZVBvc2l0aW9uID0gTWF0aC5mbG9vcihzbGlkZVBvc2l0aW9uKTsgfVxuICAgICAgICBpZiAoKGluZGV4KSAlIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA9PT0gMCkgeyBzbmFwR3JpZC5wdXNoKHNsaWRlUG9zaXRpb24pOyB9XG4gICAgICAgIHNsaWRlc0dyaWQucHVzaChzbGlkZVBvc2l0aW9uKTtcbiAgICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyBzbGlkZVNpemUgKyBzcGFjZUJldHdlZW47XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSArPSBzbGlkZVNpemUgKyBzcGFjZUJldHdlZW47XG5cbiAgICAgIHByZXZTbGlkZVNpemUgPSBzbGlkZVNpemU7XG5cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IE1hdGgubWF4KHN3aXBlci52aXJ0dWFsU2l6ZSwgc3dpcGVyU2l6ZSkgKyBvZmZzZXRBZnRlcjtcbiAgICB2YXIgbmV3U2xpZGVzR3JpZDtcblxuICAgIGlmIChcbiAgICAgIHJ0bCAmJiB3cm9uZ1JUTCAmJiAocGFyYW1zLmVmZmVjdCA9PT0gJ3NsaWRlJyB8fCBwYXJhbXMuZWZmZWN0ID09PSAnY292ZXJmbG93JykpIHtcbiAgICAgICR3cmFwcGVyRWwuY3NzKHsgd2lkdGg6ICgoc3dpcGVyLnZpcnR1YWxTaXplICsgcGFyYW1zLnNwYWNlQmV0d2VlbikgKyBcInB4XCIpIH0pO1xuICAgIH1cbiAgICBpZiAoIVN1cHBvcnQuZmxleGJveCB8fCBwYXJhbXMuc2V0V3JhcHBlclNpemUpIHtcbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHsgJHdyYXBwZXJFbC5jc3MoeyB3aWR0aDogKChzd2lwZXIudmlydHVhbFNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikgfSk7IH1cbiAgICAgIGVsc2UgeyAkd3JhcHBlckVsLmNzcyh7IGhlaWdodDogKChzd2lwZXIudmlydHVhbFNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikgfSk7IH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IChzbGlkZVNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSAqIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3M7XG4gICAgICBzd2lwZXIudmlydHVhbFNpemUgPSBNYXRoLmNlaWwoc3dpcGVyLnZpcnR1YWxTaXplIC8gcGFyYW1zLnNsaWRlc1BlckNvbHVtbikgLSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICAgICAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkgeyAkd3JhcHBlckVsLmNzcyh7IHdpZHRoOiAoKHN3aXBlci52aXJ0dWFsU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pICsgXCJweFwiKSB9KTsgfVxuICAgICAgZWxzZSB7ICR3cmFwcGVyRWwuY3NzKHsgaGVpZ2h0OiAoKHN3aXBlci52aXJ0dWFsU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pICsgXCJweFwiKSB9KTsgfVxuICAgICAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBuZXdTbGlkZXNHcmlkID0gW107XG4gICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHNuYXBHcmlkLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgICB2YXIgc2xpZGVzR3JpZEl0ZW0gPSBzbmFwR3JpZFtpJDFdO1xuICAgICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlc0dyaWRJdGVtID0gTWF0aC5mbG9vcihzbGlkZXNHcmlkSXRlbSk7IH1cbiAgICAgICAgICBpZiAoc25hcEdyaWRbaSQxXSA8IHN3aXBlci52aXJ0dWFsU2l6ZSArIHNuYXBHcmlkWzBdKSB7IG5ld1NsaWRlc0dyaWQucHVzaChzbGlkZXNHcmlkSXRlbSk7IH1cbiAgICAgICAgfVxuICAgICAgICBzbmFwR3JpZCA9IG5ld1NsaWRlc0dyaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGxhc3QgZ3JpZCBlbGVtZW50cyBkZXBlbmRpbmcgb24gd2lkdGhcbiAgICBpZiAoIXBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgbmV3U2xpZGVzR3JpZCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgc25hcEdyaWQubGVuZ3RoOyBpJDIgKz0gMSkge1xuICAgICAgICB2YXIgc2xpZGVzR3JpZEl0ZW0kMSA9IHNuYXBHcmlkW2kkMl07XG4gICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlc0dyaWRJdGVtJDEgPSBNYXRoLmZsb29yKHNsaWRlc0dyaWRJdGVtJDEpOyB9XG4gICAgICAgIGlmIChzbmFwR3JpZFtpJDJdIDw9IHN3aXBlci52aXJ0dWFsU2l6ZSAtIHN3aXBlclNpemUpIHtcbiAgICAgICAgICBuZXdTbGlkZXNHcmlkLnB1c2goc2xpZGVzR3JpZEl0ZW0kMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNuYXBHcmlkID0gbmV3U2xpZGVzR3JpZDtcbiAgICAgIGlmIChNYXRoLmZsb29yKHN3aXBlci52aXJ0dWFsU2l6ZSAtIHN3aXBlclNpemUpIC0gTWF0aC5mbG9vcihzbmFwR3JpZFtzbmFwR3JpZC5sZW5ndGggLSAxXSkgPiAxKSB7XG4gICAgICAgIHNuYXBHcmlkLnB1c2goc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzbmFwR3JpZC5sZW5ndGggPT09IDApIHsgc25hcEdyaWQgPSBbMF07IH1cblxuICAgIGlmIChwYXJhbXMuc3BhY2VCZXR3ZWVuICE9PSAwKSB7XG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgIGlmIChydGwpIHsgc2xpZGVzLmNzcyh7IG1hcmdpbkxlZnQ6IChzcGFjZUJldHdlZW4gKyBcInB4XCIpIH0pOyB9XG4gICAgICAgIGVsc2UgeyBzbGlkZXMuY3NzKHsgbWFyZ2luUmlnaHQ6IChzcGFjZUJldHdlZW4gKyBcInB4XCIpIH0pOyB9XG4gICAgICB9IGVsc2UgeyBzbGlkZXMuY3NzKHsgbWFyZ2luQm90dG9tOiAoc3BhY2VCZXR3ZWVuICsgXCJweFwiKSB9KTsgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2VudGVySW5zdWZmaWNpZW50U2xpZGVzKSB7XG4gICAgICB2YXIgYWxsU2xpZGVzU2l6ZSA9IDA7XG4gICAgICBzbGlkZXNTaXplc0dyaWQuZm9yRWFjaChmdW5jdGlvbiAoc2xpZGVTaXplVmFsdWUpIHtcbiAgICAgICAgYWxsU2xpZGVzU2l6ZSArPSBzbGlkZVNpemVWYWx1ZSArIChwYXJhbXMuc3BhY2VCZXR3ZWVuID8gcGFyYW1zLnNwYWNlQmV0d2VlbiA6IDApO1xuICAgICAgfSk7XG4gICAgICBhbGxTbGlkZXNTaXplIC09IHBhcmFtcy5zcGFjZUJldHdlZW47XG4gICAgICBpZiAoYWxsU2xpZGVzU2l6ZSA8IHN3aXBlclNpemUpIHtcbiAgICAgICAgdmFyIGFsbFNsaWRlc09mZnNldCA9IChzd2lwZXJTaXplIC0gYWxsU2xpZGVzU2l6ZSkgLyAyO1xuICAgICAgICBzbmFwR3JpZC5mb3JFYWNoKGZ1bmN0aW9uIChzbmFwLCBzbmFwSW5kZXgpIHtcbiAgICAgICAgICBzbmFwR3JpZFtzbmFwSW5kZXhdID0gc25hcCAtIGFsbFNsaWRlc09mZnNldDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNsaWRlc0dyaWQuZm9yRWFjaChmdW5jdGlvbiAoc25hcCwgc25hcEluZGV4KSB7XG4gICAgICAgICAgc2xpZGVzR3JpZFtzbmFwSW5kZXhdID0gc25hcCArIGFsbFNsaWRlc09mZnNldDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgc2xpZGVzOiBzbGlkZXMsXG4gICAgICBzbmFwR3JpZDogc25hcEdyaWQsXG4gICAgICBzbGlkZXNHcmlkOiBzbGlkZXNHcmlkLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkOiBzbGlkZXNTaXplc0dyaWQsXG4gICAgfSk7XG5cbiAgICBpZiAoc2xpZGVzTGVuZ3RoICE9PSBwcmV2aW91c1NsaWRlc0xlbmd0aCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0xlbmd0aENoYW5nZScpO1xuICAgIH1cbiAgICBpZiAoc25hcEdyaWQubGVuZ3RoICE9PSBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoKSB7XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7IHN3aXBlci5jaGVja092ZXJmbG93KCk7IH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbmFwR3JpZExlbmd0aENoYW5nZScpO1xuICAgIH1cbiAgICBpZiAoc2xpZGVzR3JpZC5sZW5ndGggIT09IHByZXZpb3VzU2xpZGVzR3JpZExlbmd0aCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgfHwgcGFyYW1zLndhdGNoU2xpZGVzVmlzaWJpbGl0eSkge1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc09mZnNldCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUF1dG9IZWlnaHQgKHNwZWVkKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZVNsaWRlcyA9IFtdO1xuICAgIHZhciBuZXdIZWlnaHQgPSAwO1xuICAgIHZhciBpO1xuICAgIGlmICh0eXBlb2Ygc3BlZWQgPT09ICdudW1iZXInKSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgfSBlbHNlIGlmIChzcGVlZCA9PT0gdHJ1ZSkge1xuICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24oc3dpcGVyLnBhcmFtcy5zcGVlZCk7XG4gICAgfVxuICAgIC8vIEZpbmQgc2xpZGVzIGN1cnJlbnRseSBpbiB2aWV3XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyA+IDEpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBNYXRoLmNlaWwoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3KTsgaSArPSAxKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCArIGk7XG4gICAgICAgIGlmIChpbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoKSB7IGJyZWFrOyB9XG4gICAgICAgIGFjdGl2ZVNsaWRlcy5wdXNoKHN3aXBlci5zbGlkZXMuZXEoaW5kZXgpWzBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlU2xpZGVzLnB1c2goc3dpcGVyLnNsaWRlcy5lcShzd2lwZXIuYWN0aXZlSW5kZXgpWzBdKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5ldyBoZWlnaHQgZnJvbSBoaWdoZXN0IHNsaWRlIGluIHZpZXdcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlU2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2ZVNsaWRlc1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGhlaWdodCA9IGFjdGl2ZVNsaWRlc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIG5ld0hlaWdodCA9IGhlaWdodCA+IG5ld0hlaWdodCA/IGhlaWdodCA6IG5ld0hlaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgSGVpZ2h0XG4gICAgaWYgKG5ld0hlaWdodCkgeyBzd2lwZXIuJHdyYXBwZXJFbC5jc3MoJ2hlaWdodCcsIChuZXdIZWlnaHQgKyBcInB4XCIpKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xpZGVzT2Zmc2V0ICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgc2xpZGVzW2ldLnN3aXBlclNsaWRlT2Zmc2V0ID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gc2xpZGVzW2ldLm9mZnNldExlZnQgOiBzbGlkZXNbaV0ub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlc1Byb2dyZXNzICh0cmFuc2xhdGUpIHtcbiAgICBpZiAoIHRyYW5zbGF0ZSA9PT0gdm9pZCAwICkgdHJhbnNsYXRlID0gKHRoaXMgJiYgdGhpcy50cmFuc2xhdGUpIHx8IDA7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcblxuICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuXG4gICAgaWYgKHNsaWRlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgaWYgKHR5cGVvZiBzbGlkZXNbMF0uc3dpcGVyU2xpZGVPZmZzZXQgPT09ICd1bmRlZmluZWQnKSB7IHN3aXBlci51cGRhdGVTbGlkZXNPZmZzZXQoKTsgfVxuXG4gICAgdmFyIG9mZnNldENlbnRlciA9IC10cmFuc2xhdGU7XG4gICAgaWYgKHJ0bCkgeyBvZmZzZXRDZW50ZXIgPSB0cmFuc2xhdGU7IH1cblxuICAgIC8vIFZpc2libGUgU2xpZGVzXG4gICAgc2xpZGVzLnJlbW92ZUNsYXNzKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcyk7XG5cbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlc0luZGV4ZXMgPSBbXTtcbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBzbGlkZSA9IHNsaWRlc1tpXTtcbiAgICAgIHZhciBzbGlkZVByb2dyZXNzID0gKFxuICAgICAgICAob2Zmc2V0Q2VudGVyICsgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyA/IHN3aXBlci5taW5UcmFuc2xhdGUoKSA6IDApKSAtIHNsaWRlLnN3aXBlclNsaWRlT2Zmc2V0XG4gICAgICApIC8gKHNsaWRlLnN3aXBlclNsaWRlU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pO1xuICAgICAgaWYgKHBhcmFtcy53YXRjaFNsaWRlc1Zpc2liaWxpdHkpIHtcbiAgICAgICAgdmFyIHNsaWRlQmVmb3JlID0gLShvZmZzZXRDZW50ZXIgLSBzbGlkZS5zd2lwZXJTbGlkZU9mZnNldCk7XG4gICAgICAgIHZhciBzbGlkZUFmdGVyID0gc2xpZGVCZWZvcmUgKyBzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkW2ldO1xuICAgICAgICB2YXIgaXNWaXNpYmxlID0gKHNsaWRlQmVmb3JlID49IDAgJiYgc2xpZGVCZWZvcmUgPCBzd2lwZXIuc2l6ZSAtIDEpXG4gICAgICAgICAgICAgICAgICB8fCAoc2xpZGVBZnRlciA+IDEgJiYgc2xpZGVBZnRlciA8PSBzd2lwZXIuc2l6ZSlcbiAgICAgICAgICAgICAgICAgIHx8IChzbGlkZUJlZm9yZSA8PSAwICYmIHNsaWRlQWZ0ZXIgPj0gc3dpcGVyLnNpemUpO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXMucHVzaChzbGlkZSk7XG4gICAgICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgc2xpZGVzLmVxKGkpLmFkZENsYXNzKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNsaWRlLnByb2dyZXNzID0gcnRsID8gLXNsaWRlUHJvZ3Jlc3MgOiBzbGlkZVByb2dyZXNzO1xuICAgIH1cbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlcyA9ICQoc3dpcGVyLnZpc2libGVTbGlkZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MgKHRyYW5zbGF0ZSkge1xuICAgIGlmICggdHJhbnNsYXRlID09PSB2b2lkIDAgKSB0cmFuc2xhdGUgPSAodGhpcyAmJiB0aGlzLnRyYW5zbGF0ZSkgfHwgMDtcblxuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuXG4gICAgdmFyIHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIHZhciBwcm9ncmVzcyA9IHN3aXBlci5wcm9ncmVzcztcbiAgICB2YXIgaXNCZWdpbm5pbmcgPSBzd2lwZXIuaXNCZWdpbm5pbmc7XG4gICAgdmFyIGlzRW5kID0gc3dpcGVyLmlzRW5kO1xuICAgIHZhciB3YXNCZWdpbm5pbmcgPSBpc0JlZ2lubmluZztcbiAgICB2YXIgd2FzRW5kID0gaXNFbmQ7XG4gICAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgICBwcm9ncmVzcyA9IDA7XG4gICAgICBpc0JlZ2lubmluZyA9IHRydWU7XG4gICAgICBpc0VuZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyZXNzID0gKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgLyAodHJhbnNsYXRlc0RpZmYpO1xuICAgICAgaXNCZWdpbm5pbmcgPSBwcm9ncmVzcyA8PSAwO1xuICAgICAgaXNFbmQgPSBwcm9ncmVzcyA+PSAxO1xuICAgIH1cbiAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICBpc0JlZ2lubmluZzogaXNCZWdpbm5pbmcsXG4gICAgICBpc0VuZDogaXNFbmQsXG4gICAgfSk7XG5cbiAgICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgfHwgcGFyYW1zLndhdGNoU2xpZGVzVmlzaWJpbGl0eSkgeyBzd2lwZXIudXBkYXRlU2xpZGVzUHJvZ3Jlc3ModHJhbnNsYXRlKTsgfVxuXG4gICAgaWYgKGlzQmVnaW5uaW5nICYmICF3YXNCZWdpbm5pbmcpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFjaEJlZ2lubmluZyB0b0VkZ2UnKTtcbiAgICB9XG4gICAgaWYgKGlzRW5kICYmICF3YXNFbmQpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFjaEVuZCB0b0VkZ2UnKTtcbiAgICB9XG4gICAgaWYgKCh3YXNCZWdpbm5pbmcgJiYgIWlzQmVnaW5uaW5nKSB8fCAod2FzRW5kICYmICFpc0VuZCkpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdmcm9tRWRnZScpO1xuICAgIH1cblxuICAgIHN3aXBlci5lbWl0KCdwcm9ncmVzcycsIHByb2dyZXNzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlc0NsYXNzZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuXG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHJlYWxJbmRleCA9IHN3aXBlci5yZWFsSW5kZXg7XG4gICAgdmFyIGlzVmlydHVhbCA9IHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG5cbiAgICBzbGlkZXMucmVtb3ZlQ2xhc3MoKChwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuc2xpZGVOZXh0Q2xhc3MpICsgXCIgXCIgKyAocGFyYW1zLnNsaWRlUHJldkNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZU5leHRDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3MpKSk7XG5cbiAgICB2YXIgYWN0aXZlU2xpZGU7XG4gICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgYWN0aXZlU2xpZGUgPSBzd2lwZXIuJHdyYXBwZXJFbC5maW5kKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBhY3RpdmVJbmRleCArIFwiXFxcIl1cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVTbGlkZSA9IHNsaWRlcy5lcShhY3RpdmVJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIGNsYXNzZXNcbiAgICBhY3RpdmVTbGlkZS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcyk7XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIC8vIER1cGxpY2F0ZSB0byBhbGwgbG9vcGVkIHNsaWRlc1xuICAgICAgaWYgKGFjdGl2ZVNsaWRlLmhhc0NsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSkge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIjpub3QoLlwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSArIFwiKVtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVBY3RpdmVDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVBY3RpdmVDbGFzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5leHQgU2xpZGVcbiAgICB2YXIgbmV4dFNsaWRlID0gYWN0aXZlU2xpZGUubmV4dEFsbCgoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSkuZXEoMCkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlTmV4dENsYXNzKTtcbiAgICBpZiAocGFyYW1zLmxvb3AgJiYgbmV4dFNsaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV4dFNsaWRlID0gc2xpZGVzLmVxKDApO1xuICAgICAgbmV4dFNsaWRlLmFkZENsYXNzKHBhcmFtcy5zbGlkZU5leHRDbGFzcyk7XG4gICAgfVxuICAgIC8vIFByZXYgU2xpZGVcbiAgICB2YXIgcHJldlNsaWRlID0gYWN0aXZlU2xpZGUucHJldkFsbCgoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSkuZXEoMCkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlUHJldkNsYXNzKTtcbiAgICBpZiAocGFyYW1zLmxvb3AgJiYgcHJldlNsaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJldlNsaWRlID0gc2xpZGVzLmVxKC0xKTtcbiAgICAgIHByZXZTbGlkZS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVQcmV2Q2xhc3MpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIC8vIER1cGxpY2F0ZSB0byBhbGwgbG9vcGVkIHNsaWRlc1xuICAgICAgaWYgKG5leHRTbGlkZS5oYXNDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpIHtcbiAgICAgICAgJHdyYXBwZXJFbFxuICAgICAgICAgIC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCI6bm90KC5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIilbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKG5leHRTbGlkZS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpKSArIFwiXFxcIl1cIikpXG4gICAgICAgICAgLmFkZENsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZU5leHRDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyAobmV4dFNsaWRlLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykpICsgXCJcXFwiXVwiKSlcbiAgICAgICAgICAuYWRkQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlTmV4dENsYXNzKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2U2xpZGUuaGFzQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICR3cmFwcGVyRWxcbiAgICAgICAgICAuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiOm5vdCguXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIChwcmV2U2xpZGUuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSkgKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHdyYXBwZXJFbFxuICAgICAgICAgIC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCIuXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHByZXZTbGlkZS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpKSArIFwiXFxcIl1cIikpXG4gICAgICAgICAgLmFkZENsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZVByZXZDbGFzcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWN0aXZlSW5kZXggKG5ld0FjdGl2ZUluZGV4KSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG4gICAgdmFyIHNsaWRlc0dyaWQgPSBzd2lwZXIuc2xpZGVzR3JpZDtcbiAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHByZXZpb3VzSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHByZXZpb3VzUmVhbEluZGV4ID0gc3dpcGVyLnJlYWxJbmRleDtcbiAgICB2YXIgcHJldmlvdXNTbmFwSW5kZXggPSBzd2lwZXIuc25hcEluZGV4O1xuICAgIHZhciBhY3RpdmVJbmRleCA9IG5ld0FjdGl2ZUluZGV4O1xuICAgIHZhciBzbmFwSW5kZXg7XG4gICAgaWYgKHR5cGVvZiBhY3RpdmVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIDFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0cmFuc2xhdGUgPj0gc2xpZGVzR3JpZFtpXSAmJiB0cmFuc2xhdGUgPCBzbGlkZXNHcmlkW2kgKyAxXSAtICgoc2xpZGVzR3JpZFtpICsgMV0gLSBzbGlkZXNHcmlkW2ldKSAvIDIpKSB7XG4gICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGUgPj0gc2xpZGVzR3JpZFtpXSAmJiB0cmFuc2xhdGUgPCBzbGlkZXNHcmlkW2kgKyAxXSkge1xuICAgICAgICAgICAgYWN0aXZlSW5kZXggPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlID49IHNsaWRlc0dyaWRbaV0pIHtcbiAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gICAgICBpZiAocGFyYW1zLm5vcm1hbGl6ZVNsaWRlSW5kZXgpIHtcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDwgMCB8fCB0eXBlb2YgYWN0aXZlSW5kZXggPT09ICd1bmRlZmluZWQnKSB7IGFjdGl2ZUluZGV4ID0gMDsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc25hcEdyaWQuaW5kZXhPZih0cmFuc2xhdGUpID49IDApIHtcbiAgICAgIHNuYXBJbmRleCA9IHNuYXBHcmlkLmluZGV4T2YodHJhbnNsYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hcEluZGV4ID0gTWF0aC5mbG9vcihhY3RpdmVJbmRleCAvIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgfVxuICAgIGlmIChzbmFwSW5kZXggPj0gc25hcEdyaWQubGVuZ3RoKSB7IHNuYXBJbmRleCA9IHNuYXBHcmlkLmxlbmd0aCAtIDE7IH1cbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChzbmFwSW5kZXggIT09IHByZXZpb3VzU25hcEluZGV4KSB7XG4gICAgICAgIHN3aXBlci5zbmFwSW5kZXggPSBzbmFwSW5kZXg7XG4gICAgICAgIHN3aXBlci5lbWl0KCdzbmFwSW5kZXhDaGFuZ2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVhbCBpbmRleFxuICAgIHZhciByZWFsSW5kZXggPSBwYXJzZUludChzd2lwZXIuc2xpZGVzLmVxKGFjdGl2ZUluZGV4KS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpIHx8IGFjdGl2ZUluZGV4LCAxMCk7XG5cbiAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICBzbmFwSW5kZXg6IHNuYXBJbmRleCxcbiAgICAgIHJlYWxJbmRleDogcmVhbEluZGV4LFxuICAgICAgcHJldmlvdXNJbmRleDogcHJldmlvdXNJbmRleCxcbiAgICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICB9KTtcbiAgICBzd2lwZXIuZW1pdCgnYWN0aXZlSW5kZXhDaGFuZ2UnKTtcbiAgICBzd2lwZXIuZW1pdCgnc25hcEluZGV4Q2hhbmdlJyk7XG4gICAgaWYgKHByZXZpb3VzUmVhbEluZGV4ICE9PSByZWFsSW5kZXgpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFsSW5kZXhDaGFuZ2UnKTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCB8fCBzd2lwZXIucnVuQ2FsbGJhY2tzT25Jbml0KSB7XG4gICAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2UnKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVDbGlja2VkU2xpZGUgKGUpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgc2xpZGUgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKVswXTtcbiAgICB2YXIgc2xpZGVGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChzbGlkZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzW2ldID09PSBzbGlkZSkgeyBzbGlkZUZvdW5kID0gdHJ1ZTsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzbGlkZSAmJiBzbGlkZUZvdW5kKSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gc2xpZGU7XG4gICAgICBpZiAoc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgICAgc3dpcGVyLmNsaWNrZWRJbmRleCA9IHBhcnNlSW50KCQoc2xpZGUpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSAkKHNsaWRlKS5pbmRleCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gdW5kZWZpbmVkO1xuICAgICAgc3dpcGVyLmNsaWNrZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5zbGlkZVRvQ2xpY2tlZFNsaWRlICYmIHN3aXBlci5jbGlja2VkSW5kZXggIT09IHVuZGVmaW5lZCAmJiBzd2lwZXIuY2xpY2tlZEluZGV4ICE9PSBzd2lwZXIuYWN0aXZlSW5kZXgpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvQ2xpY2tlZFNsaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICB1cGRhdGVTaXplOiB1cGRhdGVTaXplLFxuICAgIHVwZGF0ZVNsaWRlczogdXBkYXRlU2xpZGVzLFxuICAgIHVwZGF0ZUF1dG9IZWlnaHQ6IHVwZGF0ZUF1dG9IZWlnaHQsXG4gICAgdXBkYXRlU2xpZGVzT2Zmc2V0OiB1cGRhdGVTbGlkZXNPZmZzZXQsXG4gICAgdXBkYXRlU2xpZGVzUHJvZ3Jlc3M6IHVwZGF0ZVNsaWRlc1Byb2dyZXNzLFxuICAgIHVwZGF0ZVByb2dyZXNzOiB1cGRhdGVQcm9ncmVzcyxcbiAgICB1cGRhdGVTbGlkZXNDbGFzc2VzOiB1cGRhdGVTbGlkZXNDbGFzc2VzLFxuICAgIHVwZGF0ZUFjdGl2ZUluZGV4OiB1cGRhdGVBY3RpdmVJbmRleCxcbiAgICB1cGRhdGVDbGlja2VkU2xpZGU6IHVwZGF0ZUNsaWNrZWRTbGlkZSxcbiAgfTtcblxuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGUgKGF4aXMpIHtcbiAgICBpZiAoIGF4aXMgPT09IHZvaWQgMCApIGF4aXMgPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gJ3gnIDogJ3knO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgdHJhbnNsYXRlID0gc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuXG4gICAgaWYgKHBhcmFtcy52aXJ0dWFsVHJhbnNsYXRlKSB7XG4gICAgICByZXR1cm4gcnRsID8gLXRyYW5zbGF0ZSA6IHRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudFRyYW5zbGF0ZSA9IFV0aWxzLmdldFRyYW5zbGF0ZSgkd3JhcHBlckVsWzBdLCBheGlzKTtcbiAgICBpZiAocnRsKSB7IGN1cnJlbnRUcmFuc2xhdGUgPSAtY3VycmVudFRyYW5zbGF0ZTsgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRUcmFuc2xhdGUgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSAodHJhbnNsYXRlLCBieUNvbnRyb2xsZXIpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBwcm9ncmVzcyA9IHN3aXBlci5wcm9ncmVzcztcbiAgICB2YXIgeCA9IDA7XG4gICAgdmFyIHkgPSAwO1xuICAgIHZhciB6ID0gMDtcblxuICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHggPSBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB5ID0gdHJhbnNsYXRlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7XG4gICAgICB4ID0gTWF0aC5mbG9vcih4KTtcbiAgICAgIHkgPSBNYXRoLmZsb29yKHkpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnZpcnR1YWxUcmFuc2xhdGUpIHtcbiAgICAgIGlmIChTdXBwb3J0LnRyYW5zZm9ybXMzZCkgeyAkd3JhcHBlckVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCBcIiArIHogKyBcInB4KVwiKSk7IH1cbiAgICAgIGVsc2UgeyAkd3JhcHBlckVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIikpOyB9XG4gICAgfVxuICAgIHN3aXBlci5wcmV2aW91c1RyYW5zbGF0ZSA9IHN3aXBlci50cmFuc2xhdGU7XG4gICAgc3dpcGVyLnRyYW5zbGF0ZSA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/IHggOiB5O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgcHJvZ3Jlc3NcbiAgICB2YXIgbmV3UHJvZ3Jlc3M7XG4gICAgdmFyIHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIGlmICh0cmFuc2xhdGVzRGlmZiA9PT0gMCkge1xuICAgICAgbmV3UHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdQcm9ncmVzcyA9ICh0cmFuc2xhdGUgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIC8gKHRyYW5zbGF0ZXNEaWZmKTtcbiAgICB9XG4gICAgaWYgKG5ld1Byb2dyZXNzICE9PSBwcm9ncmVzcykge1xuICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKHRyYW5zbGF0ZSk7XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3NldFRyYW5zbGF0ZScsIHN3aXBlci50cmFuc2xhdGUsIGJ5Q29udHJvbGxlcik7XG4gIH1cblxuICBmdW5jdGlvbiBtaW5UcmFuc2xhdGUgKCkge1xuICAgIHJldHVybiAoLXRoaXMuc25hcEdyaWRbMF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF4VHJhbnNsYXRlICgpIHtcbiAgICByZXR1cm4gKC10aGlzLnNuYXBHcmlkW3RoaXMuc25hcEdyaWQubGVuZ3RoIC0gMV0pO1xuICB9XG5cbiAgdmFyIHRyYW5zbGF0ZSA9IHtcbiAgICBnZXRUcmFuc2xhdGU6IGdldFRyYW5zbGF0ZSxcbiAgICBzZXRUcmFuc2xhdGU6IHNldFRyYW5zbGF0ZSxcbiAgICBtaW5UcmFuc2xhdGU6IG1pblRyYW5zbGF0ZSxcbiAgICBtYXhUcmFuc2xhdGU6IG1heFRyYW5zbGF0ZSxcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uIChkdXJhdGlvbiwgYnlDb250cm9sbGVyKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICBzd2lwZXIuJHdyYXBwZXJFbC50cmFuc2l0aW9uKGR1cmF0aW9uKTtcblxuICAgIHN3aXBlci5lbWl0KCdzZXRUcmFuc2l0aW9uJywgZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uU3RhcnQgKHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKSB7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHByZXZpb3VzSW5kZXggPSBzd2lwZXIucHJldmlvdXNJbmRleDtcbiAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgdmFyIGRpciA9IGRpcmVjdGlvbjtcbiAgICBpZiAoIWRpcikge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID4gcHJldmlvdXNJbmRleCkgeyBkaXIgPSAnbmV4dCc7IH1cbiAgICAgIGVsc2UgaWYgKGFjdGl2ZUluZGV4IDwgcHJldmlvdXNJbmRleCkgeyBkaXIgPSAncHJldic7IH1cbiAgICAgIGVsc2UgeyBkaXIgPSAncmVzZXQnOyB9XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25TdGFydCcpO1xuXG4gICAgaWYgKHJ1bkNhbGxiYWNrcyAmJiBhY3RpdmVJbmRleCAhPT0gcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKGRpciA9PT0gJ3Jlc2V0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVSZXNldFRyYW5zaXRpb25TdGFydCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnKTtcbiAgICAgIGlmIChkaXIgPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVOZXh0VHJhbnNpdGlvblN0YXJ0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVQcmV2VHJhbnNpdGlvblN0YXJ0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZCQxIChydW5DYWxsYmFja3MsIGRpcmVjdGlvbikge1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzSW5kZXg7XG4gICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuXG4gICAgdmFyIGRpciA9IGRpcmVjdGlvbjtcbiAgICBpZiAoIWRpcikge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID4gcHJldmlvdXNJbmRleCkgeyBkaXIgPSAnbmV4dCc7IH1cbiAgICAgIGVsc2UgaWYgKGFjdGl2ZUluZGV4IDwgcHJldmlvdXNJbmRleCkgeyBkaXIgPSAncHJldic7IH1cbiAgICAgIGVsc2UgeyBkaXIgPSAncmVzZXQnOyB9XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25FbmQnKTtcblxuICAgIGlmIChydW5DYWxsYmFja3MgJiYgYWN0aXZlSW5kZXggIT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChkaXIgPT09ICdyZXNldCcpIHtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlUmVzZXRUcmFuc2l0aW9uRW5kJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbGlkZUNoYW5nZVRyYW5zaXRpb25FbmQnKTtcbiAgICAgIGlmIChkaXIgPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVOZXh0VHJhbnNpdGlvbkVuZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlUHJldlRyYW5zaXRpb25FbmQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdHJhbnNpdGlvbiQxID0ge1xuICAgIHNldFRyYW5zaXRpb246IHNldFRyYW5zaXRpb24sXG4gICAgdHJhbnNpdGlvblN0YXJ0OiB0cmFuc2l0aW9uU3RhcnQsXG4gICAgdHJhbnNpdGlvbkVuZDogdHJhbnNpdGlvbkVuZCQxLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNsaWRlVG8gKGluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICAgIGlmICggaW5kZXggPT09IHZvaWQgMCApIGluZGV4ID0gMDtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHNsaWRlSW5kZXggPSBpbmRleDtcbiAgICBpZiAoc2xpZGVJbmRleCA8IDApIHsgc2xpZGVJbmRleCA9IDA7IH1cblxuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciBzbmFwR3JpZCA9IHN3aXBlci5zbmFwR3JpZDtcbiAgICB2YXIgc2xpZGVzR3JpZCA9IHN3aXBlci5zbGlkZXNHcmlkO1xuICAgIHZhciBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzSW5kZXg7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc25hcEluZGV4ID0gTWF0aC5mbG9vcihzbGlkZUluZGV4IC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgeyBzbmFwSW5kZXggPSBzbmFwR3JpZC5sZW5ndGggLSAxOyB9XG5cbiAgICBpZiAoKGFjdGl2ZUluZGV4IHx8IHBhcmFtcy5pbml0aWFsU2xpZGUgfHwgMCkgPT09IChwcmV2aW91c0luZGV4IHx8IDApICYmIHJ1bkNhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhbnNsYXRlID0gLXNuYXBHcmlkW3NuYXBJbmRleF07XG5cbiAgICAvLyBVcGRhdGUgcHJvZ3Jlc3NcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcblxuICAgIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gICAgaWYgKHBhcmFtcy5ub3JtYWxpemVTbGlkZUluZGV4KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKC1NYXRoLmZsb29yKHRyYW5zbGF0ZSAqIDEwMCkgPj0gTWF0aC5mbG9vcihzbGlkZXNHcmlkW2ldICogMTAwKSkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERpcmVjdGlvbnMgbG9ja3NcbiAgICBpZiAoc3dpcGVyLmluaXRpYWxpemVkICYmIHNsaWRlSW5kZXggIT09IGFjdGl2ZUluZGV4KSB7XG4gICAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiB0cmFuc2xhdGUgPCBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA8IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiB0cmFuc2xhdGUgPiBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA+IHN3aXBlci5tYXhUcmFuc2xhdGUoKSkge1xuICAgICAgICBpZiAoKGFjdGl2ZUluZGV4IHx8IDApICE9PSBzbGlkZUluZGV4KSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaXJlY3Rpb247XG4gICAgaWYgKHNsaWRlSW5kZXggPiBhY3RpdmVJbmRleCkgeyBkaXJlY3Rpb24gPSAnbmV4dCc7IH1cbiAgICBlbHNlIGlmIChzbGlkZUluZGV4IDwgYWN0aXZlSW5kZXgpIHsgZGlyZWN0aW9uID0gJ3ByZXYnOyB9XG4gICAgZWxzZSB7IGRpcmVjdGlvbiA9ICdyZXNldCc7IH1cblxuXG4gICAgLy8gVXBkYXRlIEluZGV4XG4gICAgaWYgKChydGwgJiYgLXRyYW5zbGF0ZSA9PT0gc3dpcGVyLnRyYW5zbGF0ZSkgfHwgKCFydGwgJiYgdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlKSkge1xuICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICAgICAgLy8gVXBkYXRlIEhlaWdodFxuICAgICAgaWYgKHBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgaWYgKHBhcmFtcy5lZmZlY3QgIT09ICdzbGlkZScpIHtcbiAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZSh0cmFuc2xhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGRpcmVjdGlvbiAhPT0gJ3Jlc2V0Jykge1xuICAgICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzcGVlZCA9PT0gMCB8fCAhU3VwcG9ydC50cmFuc2l0aW9uKSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleChzbGlkZUluZGV4KTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgICBzd2lwZXIuZW1pdCgnYmVmb3JlVHJhbnNpdGlvblN0YXJ0Jywgc3BlZWQsIGludGVybmFsKTtcbiAgICAgIHN3aXBlci50cmFuc2l0aW9uU3RhcnQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSk7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoc2xpZGVJbmRleCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVRyYW5zaXRpb25TdGFydCcsIHNwZWVkLCBpbnRlcm5hbCk7XG4gICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgICAgIGlmICghc3dpcGVyLmFuaW1hdGluZykge1xuICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQpIHtcbiAgICAgICAgICBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIHN3aXBlci4kd3JhcHBlckVsWzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgICAgIGRlbGV0ZSBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQ7XG4gICAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHN3aXBlci5vblNsaWRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZVRvTG9vcCAoaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gICAgaWYgKCBpbmRleCA9PT0gdm9pZCAwICkgaW5kZXggPSAwO1xuICAgIGlmICggc3BlZWQgPT09IHZvaWQgMCApIHNwZWVkID0gdGhpcy5wYXJhbXMuc3BlZWQ7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgbmV3SW5kZXggPSBpbmRleDtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICBuZXdJbmRleCArPSBzd2lwZXIubG9vcGVkU2xpZGVzO1xuICAgIH1cblxuICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhuZXdJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlTmV4dCAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGFuaW1hdGluZyA9IHN3aXBlci5hbmltYXRpbmc7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBpZiAoYW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgc3dpcGVyLl9jbGllbnRMZWZ0ID0gc3dpcGVyLiR3cmFwcGVyRWxbMF0uY2xpZW50TGVmdDtcbiAgICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXAsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIHBhcmFtcy5zbGlkZXNQZXJHcm91cCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlUHJldiAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGFuaW1hdGluZyA9IHN3aXBlci5hbmltYXRpbmc7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuICAgIHZhciBzbGlkZXNHcmlkID0gc3dpcGVyLnNsaWRlc0dyaWQ7XG4gICAgdmFyIHJ0bFRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChhbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIuJHdyYXBwZXJFbFswXS5jbGllbnRMZWZ0O1xuICAgIH1cbiAgICB2YXIgdHJhbnNsYXRlID0gcnRsVHJhbnNsYXRlID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPCAwKSB7IHJldHVybiAtTWF0aC5mbG9vcihNYXRoLmFicyh2YWwpKTsgfVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsKTtcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZWRUcmFuc2xhdGUgPSBub3JtYWxpemUodHJhbnNsYXRlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNuYXBHcmlkID0gc25hcEdyaWQubWFwKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG5vcm1hbGl6ZSh2YWwpOyB9KTtcbiAgICB2YXIgbm9ybWFsaXplZFNsaWRlc0dyaWQgPSBzbGlkZXNHcmlkLm1hcChmdW5jdGlvbiAodmFsKSB7IHJldHVybiBub3JtYWxpemUodmFsKTsgfSk7XG5cbiAgICB2YXIgY3VycmVudFNuYXAgPSBzbmFwR3JpZFtub3JtYWxpemVkU25hcEdyaWQuaW5kZXhPZihub3JtYWxpemVkVHJhbnNsYXRlKV07XG4gICAgdmFyIHByZXZTbmFwID0gc25hcEdyaWRbbm9ybWFsaXplZFNuYXBHcmlkLmluZGV4T2Yobm9ybWFsaXplZFRyYW5zbGF0ZSkgLSAxXTtcbiAgICB2YXIgcHJldkluZGV4O1xuICAgIGlmICh0eXBlb2YgcHJldlNuYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwcmV2SW5kZXggPSBzbGlkZXNHcmlkLmluZGV4T2YocHJldlNuYXApO1xuICAgICAgaWYgKHByZXZJbmRleCA8IDApIHsgcHJldkluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4IC0gMTsgfVxuICAgIH1cbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlVG8ocHJldkluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH1cblxuICAvKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbiAgZnVuY3Rpb24gc2xpZGVSZXNldCAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlVG9DbG9zZXN0IChzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICAgIGlmICggc3BlZWQgPT09IHZvaWQgMCApIHNwZWVkID0gdGhpcy5wYXJhbXMuc3BlZWQ7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgaW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHNuYXBJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcblxuICAgIGlmIChzbmFwSW5kZXggPCBzd2lwZXIuc25hcEdyaWQubGVuZ3RoIC0gMSkge1xuICAgICAgdmFyIHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG5cbiAgICAgIHZhciBjdXJyZW50U25hcCA9IHN3aXBlci5zbmFwR3JpZFtzbmFwSW5kZXhdO1xuICAgICAgdmFyIG5leHRTbmFwID0gc3dpcGVyLnNuYXBHcmlkW3NuYXBJbmRleCArIDFdO1xuXG4gICAgICBpZiAoKHRyYW5zbGF0ZSAtIGN1cnJlbnRTbmFwKSA+IChuZXh0U25hcCAtIGN1cnJlbnRTbmFwKSAvIDIpIHtcbiAgICAgICAgaW5kZXggPSBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhpbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2xpZGVUb0NsaWNrZWRTbGlkZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcblxuICAgIHZhciBzbGlkZXNQZXJWaWV3ID0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyA/IHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpIDogcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgdmFyIHNsaWRlVG9JbmRleCA9IHN3aXBlci5jbGlja2VkSW5kZXg7XG4gICAgdmFyIHJlYWxJbmRleDtcbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7IHJldHVybjsgfVxuICAgICAgcmVhbEluZGV4ID0gcGFyc2VJbnQoJChzd2lwZXIuY2xpY2tlZFNsaWRlKS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgICBpZiAocGFyYW1zLmNlbnRlcmVkU2xpZGVzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoc2xpZGVUb0luZGV4IDwgc3dpcGVyLmxvb3BlZFNsaWRlcyAtIChzbGlkZXNQZXJWaWV3IC8gMikpXG4gICAgICAgICAgfHwgKHNsaWRlVG9JbmRleCA+IChzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIHN3aXBlci5sb29wZWRTbGlkZXMpICsgKHNsaWRlc1BlclZpZXcgLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICBzbGlkZVRvSW5kZXggPSAkd3JhcHBlckVsXG4gICAgICAgICAgICAuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHJlYWxJbmRleCArIFwiXFxcIl06bm90KC5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIilcIikpXG4gICAgICAgICAgICAuZXEoMClcbiAgICAgICAgICAgIC5pbmRleCgpO1xuXG4gICAgICAgICAgVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNsaWRlVG9JbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gc2xpZGVzUGVyVmlldykge1xuICAgICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgICBzbGlkZVRvSW5kZXggPSAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdOm5vdCguXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpXCIpKVxuICAgICAgICAgIC5lcSgwKVxuICAgICAgICAgIC5pbmRleCgpO1xuXG4gICAgICAgIFV0aWxzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWRlID0ge1xuICAgIHNsaWRlVG86IHNsaWRlVG8sXG4gICAgc2xpZGVUb0xvb3A6IHNsaWRlVG9Mb29wLFxuICAgIHNsaWRlTmV4dDogc2xpZGVOZXh0LFxuICAgIHNsaWRlUHJldjogc2xpZGVQcmV2LFxuICAgIHNsaWRlUmVzZXQ6IHNsaWRlUmVzZXQsXG4gICAgc2xpZGVUb0Nsb3Nlc3Q6IHNsaWRlVG9DbG9zZXN0LFxuICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IHNsaWRlVG9DbGlja2VkU2xpZGUsXG4gIH07XG5cbiAgZnVuY3Rpb24gbG9vcENyZWF0ZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAvLyBSZW1vdmUgZHVwbGljYXRlZCBzbGlkZXNcbiAgICAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpKS5yZW1vdmUoKTtcblxuICAgIHZhciBzbGlkZXMgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKTtcblxuICAgIGlmIChwYXJhbXMubG9vcEZpbGxHcm91cFdpdGhCbGFuaykge1xuICAgICAgdmFyIGJsYW5rU2xpZGVzTnVtID0gcGFyYW1zLnNsaWRlc1Blckdyb3VwIC0gKHNsaWRlcy5sZW5ndGggJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXApO1xuICAgICAgaWYgKGJsYW5rU2xpZGVzTnVtICE9PSBwYXJhbXMuc2xpZGVzUGVyR3JvdXApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibGFua1NsaWRlc051bTsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIGJsYW5rTm9kZSA9ICQoZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpKS5hZGRDbGFzcygoKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUJsYW5rQ2xhc3MpKSk7XG4gICAgICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoYmxhbmtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBzbGlkZXMgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyAmJiAhcGFyYW1zLmxvb3BlZFNsaWRlcykgeyBwYXJhbXMubG9vcGVkU2xpZGVzID0gc2xpZGVzLmxlbmd0aDsgfVxuXG4gICAgc3dpcGVyLmxvb3BlZFNsaWRlcyA9IHBhcnNlSW50KHBhcmFtcy5sb29wZWRTbGlkZXMgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcsIDEwKTtcbiAgICBzd2lwZXIubG9vcGVkU2xpZGVzICs9IHBhcmFtcy5sb29wQWRkaXRpb25hbFNsaWRlcztcbiAgICBpZiAoc3dpcGVyLmxvb3BlZFNsaWRlcyA+IHNsaWRlcy5sZW5ndGgpIHtcbiAgICAgIHN3aXBlci5sb29wZWRTbGlkZXMgPSBzbGlkZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBwcmVwZW5kU2xpZGVzID0gW107XG4gICAgdmFyIGFwcGVuZFNsaWRlcyA9IFtdO1xuICAgIHNsaWRlcy5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWwpIHtcbiAgICAgIHZhciBzbGlkZSA9ICQoZWwpO1xuICAgICAgaWYgKGluZGV4IDwgc3dpcGVyLmxvb3BlZFNsaWRlcykgeyBhcHBlbmRTbGlkZXMucHVzaChlbCk7IH1cbiAgICAgIGlmIChpbmRleCA8IHNsaWRlcy5sZW5ndGggJiYgaW5kZXggPj0gc2xpZGVzLmxlbmd0aCAtIHN3aXBlci5sb29wZWRTbGlkZXMpIHsgcHJlcGVuZFNsaWRlcy5wdXNoKGVsKTsgfVxuICAgICAgc2xpZGUuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnLCBpbmRleCk7XG4gICAgfSk7XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgYXBwZW5kU2xpZGVzLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICR3cmFwcGVyRWwuYXBwZW5kKCQoYXBwZW5kU2xpZGVzW2kkMV0uY2xvbmVOb2RlKHRydWUpKS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpJDIgPSBwcmVwZW5kU2xpZGVzLmxlbmd0aCAtIDE7IGkkMiA+PSAwOyBpJDIgLT0gMSkge1xuICAgICAgJHdyYXBwZXJFbC5wcmVwZW5kKCQocHJlcGVuZFNsaWRlc1tpJDJdLmNsb25lTm9kZSh0cnVlKSkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb29wRml4ICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgdmFyIGxvb3BlZFNsaWRlcyA9IHN3aXBlci5sb29wZWRTbGlkZXM7XG4gICAgdmFyIGFsbG93U2xpZGVQcmV2ID0gc3dpcGVyLmFsbG93U2xpZGVQcmV2O1xuICAgIHZhciBhbGxvd1NsaWRlTmV4dCA9IHN3aXBlci5hbGxvd1NsaWRlTmV4dDtcbiAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgdmFyIG5ld0luZGV4O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG4gICAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcblxuICAgIHZhciBzbmFwVHJhbnNsYXRlID0gLXNuYXBHcmlkW2FjdGl2ZUluZGV4XTtcbiAgICB2YXIgZGlmZiA9IHNuYXBUcmFuc2xhdGUgLSBzd2lwZXIuZ2V0VHJhbnNsYXRlKCk7XG5cblxuICAgIC8vIEZpeCBGb3IgTmVnYXRpdmUgT3ZlcnNsaWRpbmdcbiAgICBpZiAoYWN0aXZlSW5kZXggPCBsb29wZWRTbGlkZXMpIHtcbiAgICAgIG5ld0luZGV4ID0gKHNsaWRlcy5sZW5ndGggLSAobG9vcGVkU2xpZGVzICogMykpICsgYWN0aXZlSW5kZXg7XG4gICAgICBuZXdJbmRleCArPSBsb29wZWRTbGlkZXM7XG4gICAgICB2YXIgc2xpZGVDaGFuZ2VkID0gc3dpcGVyLnNsaWRlVG8obmV3SW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIGlmIChzbGlkZUNoYW5nZWQgJiYgZGlmZiAhPT0gMCkge1xuICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKChydGwgPyAtc3dpcGVyLnRyYW5zbGF0ZSA6IHN3aXBlci50cmFuc2xhdGUpIC0gZGlmZik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyAmJiBhY3RpdmVJbmRleCA+PSBsb29wZWRTbGlkZXMgKiAyKSB8fCAoYWN0aXZlSW5kZXggPj0gc2xpZGVzLmxlbmd0aCAtIGxvb3BlZFNsaWRlcykpIHtcbiAgICAgIC8vIEZpeCBGb3IgUG9zaXRpdmUgT3ZlcnNsaWRpbmdcbiAgICAgIG5ld0luZGV4ID0gLXNsaWRlcy5sZW5ndGggKyBhY3RpdmVJbmRleCArIGxvb3BlZFNsaWRlcztcbiAgICAgIG5ld0luZGV4ICs9IGxvb3BlZFNsaWRlcztcbiAgICAgIHZhciBzbGlkZUNoYW5nZWQkMSA9IHN3aXBlci5zbGlkZVRvKG5ld0luZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICBpZiAoc2xpZGVDaGFuZ2VkJDEgJiYgZGlmZiAhPT0gMCkge1xuICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKChydGwgPyAtc3dpcGVyLnRyYW5zbGF0ZSA6IHN3aXBlci50cmFuc2xhdGUpIC0gZGlmZik7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICB9XG5cbiAgZnVuY3Rpb24gbG9vcERlc3Ryb3kgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCIuXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIsLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiLlwiICsgKHBhcmFtcy5zbGlkZUJsYW5rQ2xhc3MpKSkucmVtb3ZlKCk7XG4gICAgc2xpZGVzLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gIH1cblxuICB2YXIgbG9vcCA9IHtcbiAgICBsb29wQ3JlYXRlOiBsb29wQ3JlYXRlLFxuICAgIGxvb3BGaXg6IGxvb3BGaXgsXG4gICAgbG9vcERlc3Ryb3k6IGxvb3BEZXN0cm95LFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNldEdyYWJDdXJzb3IgKG1vdmluZykge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIGlmIChTdXBwb3J0LnRvdWNoIHx8ICFzd2lwZXIucGFyYW1zLnNpbXVsYXRlVG91Y2ggfHwgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQpKSB7IHJldHVybjsgfVxuICAgIHZhciBlbCA9IHN3aXBlci5lbDtcbiAgICBlbC5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gbW92aW5nID8gJy13ZWJraXQtZ3JhYmJpbmcnIDogJy13ZWJraXQtZ3JhYic7XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gbW92aW5nID8gJy1tb3otZ3JhYmJpbicgOiAnLW1vei1ncmFiJztcbiAgICBlbC5zdHlsZS5jdXJzb3IgPSBtb3ZpbmcgPyAnZ3JhYmJpbmcnIDogJ2dyYWInO1xuICB9XG5cbiAgZnVuY3Rpb24gdW5zZXRHcmFiQ3Vyc29yICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoU3VwcG9ydC50b3VjaCB8fCAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93ICYmIHN3aXBlci5pc0xvY2tlZCkpIHsgcmV0dXJuOyB9XG4gICAgc3dpcGVyLmVsLnN0eWxlLmN1cnNvciA9ICcnO1xuICB9XG5cbiAgdmFyIGdyYWJDdXJzb3IgPSB7XG4gICAgc2V0R3JhYkN1cnNvcjogc2V0R3JhYkN1cnNvcixcbiAgICB1bnNldEdyYWJDdXJzb3I6IHVuc2V0R3JhYkN1cnNvcixcbiAgfTtcblxuICBmdW5jdGlvbiBhcHBlbmRTbGlkZSAoc2xpZGVzKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldKSB7ICR3cmFwcGVyRWwuYXBwZW5kKHNsaWRlc1tpXSk7IH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgIH1cbiAgICBpZiAoIShwYXJhbXMub2JzZXJ2ZXIgJiYgU3VwcG9ydC5vYnNlcnZlcikpIHtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwZW5kU2xpZGUgKHNsaWRlcykge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuXG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcERlc3Ryb3koKTtcbiAgICB9XG4gICAgdmFyIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyAxO1xuICAgIGlmICh0eXBlb2Ygc2xpZGVzID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBzbGlkZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChzbGlkZXNbaV0pIHsgJHdyYXBwZXJFbC5wcmVwZW5kKHNsaWRlc1tpXSk7IH1cbiAgICAgIH1cbiAgICAgIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyBzbGlkZXMubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAkd3JhcHBlckVsLnByZXBlbmQoc2xpZGVzKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgIH1cbiAgICBpZiAoIShwYXJhbXMub2JzZXJ2ZXIgJiYgU3VwcG9ydC5vYnNlcnZlcikpIHtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICB9XG4gICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXgsIDAsIGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNsaWRlIChpbmRleCwgc2xpZGVzKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIGFjdGl2ZUluZGV4QnVmZmVyID0gYWN0aXZlSW5kZXg7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBhY3RpdmVJbmRleEJ1ZmZlciAtPSBzd2lwZXIubG9vcGVkU2xpZGVzO1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgICBzd2lwZXIuc2xpZGVzID0gJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSk7XG4gICAgfVxuICAgIHZhciBiYXNlTGVuZ3RoID0gc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgIHN3aXBlci5wcmVwZW5kU2xpZGUoc2xpZGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IGJhc2VMZW5ndGgpIHtcbiAgICAgIHN3aXBlci5hcHBlbmRTbGlkZShzbGlkZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleEJ1ZmZlciA+IGluZGV4ID8gYWN0aXZlSW5kZXhCdWZmZXIgKyAxIDogYWN0aXZlSW5kZXhCdWZmZXI7XG5cbiAgICB2YXIgc2xpZGVzQnVmZmVyID0gW107XG4gICAgZm9yICh2YXIgaSA9IGJhc2VMZW5ndGggLSAxOyBpID49IGluZGV4OyBpIC09IDEpIHtcbiAgICAgIHZhciBjdXJyZW50U2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgY3VycmVudFNsaWRlLnJlbW92ZSgpO1xuICAgICAgc2xpZGVzQnVmZmVyLnVuc2hpZnQoY3VycmVudFNsaWRlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBzbGlkZXMubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2kkMV0pIHsgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzW2kkMV0pOyB9XG4gICAgICB9XG4gICAgICBuZXdBY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4QnVmZmVyID4gaW5kZXggPyBhY3RpdmVJbmRleEJ1ZmZlciArIHNsaWRlcy5sZW5ndGggOiBhY3RpdmVJbmRleEJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBzbGlkZXNCdWZmZXIubGVuZ3RoOyBpJDIgKz0gMSkge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzQnVmZmVyW2kkMl0pO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BDcmVhdGUoKTtcbiAgICB9XG4gICAgaWYgKCEocGFyYW1zLm9ic2VydmVyICYmIFN1cHBvcnQub2JzZXJ2ZXIpKSB7XG4gICAgICBzd2lwZXIudXBkYXRlKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXggKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0FjdGl2ZUluZGV4LCAwLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlU2xpZGUgKHNsaWRlc0luZGV4ZXMpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcblxuICAgIHZhciBhY3RpdmVJbmRleEJ1ZmZlciA9IGFjdGl2ZUluZGV4O1xuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgYWN0aXZlSW5kZXhCdWZmZXIgLT0gc3dpcGVyLmxvb3BlZFNsaWRlcztcbiAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgc3dpcGVyLnNsaWRlcyA9ICR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSkpO1xuICAgIH1cbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleEJ1ZmZlcjtcbiAgICB2YXIgaW5kZXhUb1JlbW92ZTtcblxuICAgIGlmICh0eXBlb2Ygc2xpZGVzSW5kZXhlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzSW5kZXhlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXNJbmRleGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGluZGV4VG9SZW1vdmUgPSBzbGlkZXNJbmRleGVzW2ldO1xuICAgICAgICBpZiAoc3dpcGVyLnNsaWRlc1tpbmRleFRvUmVtb3ZlXSkgeyBzd2lwZXIuc2xpZGVzLmVxKGluZGV4VG9SZW1vdmUpLnJlbW92ZSgpOyB9XG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlIDwgbmV3QWN0aXZlSW5kZXgpIHsgbmV3QWN0aXZlSW5kZXggLT0gMTsgfVxuICAgICAgfVxuICAgICAgbmV3QWN0aXZlSW5kZXggPSBNYXRoLm1heChuZXdBY3RpdmVJbmRleCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4VG9SZW1vdmUgPSBzbGlkZXNJbmRleGVzO1xuICAgICAgaWYgKHN3aXBlci5zbGlkZXNbaW5kZXhUb1JlbW92ZV0pIHsgc3dpcGVyLnNsaWRlcy5lcShpbmRleFRvUmVtb3ZlKS5yZW1vdmUoKTsgfVxuICAgICAgaWYgKGluZGV4VG9SZW1vdmUgPCBuZXdBY3RpdmVJbmRleCkgeyBuZXdBY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICBuZXdBY3RpdmVJbmRleCA9IE1hdGgubWF4KG5ld0FjdGl2ZUluZGV4LCAwKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCEocGFyYW1zLm9ic2VydmVyICYmIFN1cHBvcnQub2JzZXJ2ZXIpKSB7XG4gICAgICBzd2lwZXIudXBkYXRlKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXggKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0FjdGl2ZUluZGV4LCAwLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsU2xpZGVzICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgIHZhciBzbGlkZXNJbmRleGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBzbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICAgIHN3aXBlci5yZW1vdmVTbGlkZShzbGlkZXNJbmRleGVzKTtcbiAgfVxuXG4gIHZhciBtYW5pcHVsYXRpb24gPSB7XG4gICAgYXBwZW5kU2xpZGU6IGFwcGVuZFNsaWRlLFxuICAgIHByZXBlbmRTbGlkZTogcHJlcGVuZFNsaWRlLFxuICAgIGFkZFNsaWRlOiBhZGRTbGlkZSxcbiAgICByZW1vdmVTbGlkZTogcmVtb3ZlU2xpZGUsXG4gICAgcmVtb3ZlQWxsU2xpZGVzOiByZW1vdmVBbGxTbGlkZXMsXG4gIH07XG5cbiAgdmFyIERldmljZSA9IChmdW5jdGlvbiBEZXZpY2UoKSB7XG4gICAgdmFyIHVhID0gd2luLm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICB2YXIgZGV2aWNlID0ge1xuICAgICAgaW9zOiBmYWxzZSxcbiAgICAgIGFuZHJvaWQ6IGZhbHNlLFxuICAgICAgYW5kcm9pZENocm9tZTogZmFsc2UsXG4gICAgICBkZXNrdG9wOiBmYWxzZSxcbiAgICAgIHdpbmRvd3M6IGZhbHNlLFxuICAgICAgaXBob25lOiBmYWxzZSxcbiAgICAgIGlwb2Q6IGZhbHNlLFxuICAgICAgaXBhZDogZmFsc2UsXG4gICAgICBjb3Jkb3ZhOiB3aW4uY29yZG92YSB8fCB3aW4ucGhvbmVnYXAsXG4gICAgICBwaG9uZWdhcDogd2luLmNvcmRvdmEgfHwgd2luLnBob25lZ2FwLFxuICAgIH07XG5cbiAgICB2YXIgd2luZG93cyA9IHVhLm1hdGNoKC8oV2luZG93cyBQaG9uZSk7P1tcXHNcXC9dKyhbXFxkLl0rKT8vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIHZhciBhbmRyb2lkID0gdWEubWF0Y2goLyhBbmRyb2lkKTs/W1xcc1xcL10rKFtcXGQuXSspPy8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgdmFyIGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICAgIHZhciBpcG9kID0gdWEubWF0Y2goLyhpUG9kKSguKk9TXFxzKFtcXGRfXSspKT8vKTtcbiAgICB2YXIgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPU3xpT1MpXFxzKFtcXGRfXSspLyk7XG5cblxuICAgIC8vIFdpbmRvd3NcbiAgICBpZiAod2luZG93cykge1xuICAgICAgZGV2aWNlLm9zID0gJ3dpbmRvd3MnO1xuICAgICAgZGV2aWNlLm9zVmVyc2lvbiA9IHdpbmRvd3NbMl07XG4gICAgICBkZXZpY2Uud2luZG93cyA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuZHJvaWRcbiAgICBpZiAoYW5kcm9pZCAmJiAhd2luZG93cykge1xuICAgICAgZGV2aWNlLm9zID0gJ2FuZHJvaWQnO1xuICAgICAgZGV2aWNlLm9zVmVyc2lvbiA9IGFuZHJvaWRbMl07XG4gICAgICBkZXZpY2UuYW5kcm9pZCA9IHRydWU7XG4gICAgICBkZXZpY2UuYW5kcm9pZENocm9tZSA9IHVhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2hyb21lJykgPj0gMDtcbiAgICB9XG4gICAgaWYgKGlwYWQgfHwgaXBob25lIHx8IGlwb2QpIHtcbiAgICAgIGRldmljZS5vcyA9ICdpb3MnO1xuICAgICAgZGV2aWNlLmlvcyA9IHRydWU7XG4gICAgfVxuICAgIC8vIGlPU1xuICAgIGlmIChpcGhvbmUgJiYgIWlwb2QpIHtcbiAgICAgIGRldmljZS5vc1ZlcnNpb24gPSBpcGhvbmVbMl0ucmVwbGFjZSgvXy9nLCAnLicpO1xuICAgICAgZGV2aWNlLmlwaG9uZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpcGFkKSB7XG4gICAgICBkZXZpY2Uub3NWZXJzaW9uID0gaXBhZFsyXS5yZXBsYWNlKC9fL2csICcuJyk7XG4gICAgICBkZXZpY2UuaXBhZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpcG9kKSB7XG4gICAgICBkZXZpY2Uub3NWZXJzaW9uID0gaXBvZFszXSA/IGlwb2RbM10ucmVwbGFjZSgvXy9nLCAnLicpIDogbnVsbDtcbiAgICAgIGRldmljZS5pcGhvbmUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpT1MgOCsgY2hhbmdlZCBVQVxuICAgIGlmIChkZXZpY2UuaW9zICYmIGRldmljZS5vc1ZlcnNpb24gJiYgdWEuaW5kZXhPZignVmVyc2lvbi8nKSA+PSAwKSB7XG4gICAgICBpZiAoZGV2aWNlLm9zVmVyc2lvbi5zcGxpdCgnLicpWzBdID09PSAnMTAnKSB7XG4gICAgICAgIGRldmljZS5vc1ZlcnNpb24gPSB1YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCd2ZXJzaW9uLycpWzFdLnNwbGl0KCcgJylbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVza3RvcFxuICAgIGRldmljZS5kZXNrdG9wID0gIShkZXZpY2Uub3MgfHwgZGV2aWNlLmFuZHJvaWQgfHwgZGV2aWNlLndlYlZpZXcpO1xuXG4gICAgLy8gV2Vidmlld1xuICAgIGRldmljZS53ZWJWaWV3ID0gKGlwaG9uZSB8fCBpcGFkIHx8IGlwb2QpICYmIHVhLm1hdGNoKC8uKkFwcGxlV2ViS2l0KD8hLipTYWZhcmkpL2kpO1xuXG4gICAgLy8gTWluaW1hbCBVSVxuICAgIGlmIChkZXZpY2Uub3MgJiYgZGV2aWNlLm9zID09PSAnaW9zJykge1xuICAgICAgdmFyIG9zVmVyc2lvbkFyciA9IGRldmljZS5vc1ZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgIHZhciBtZXRhVmlld3BvcnQgPSBkb2MucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmlld3BvcnRcIl0nKTtcbiAgICAgIGRldmljZS5taW5pbWFsVWkgPSAhZGV2aWNlLndlYlZpZXdcbiAgICAgICAgJiYgKGlwb2QgfHwgaXBob25lKVxuICAgICAgICAmJiAob3NWZXJzaW9uQXJyWzBdICogMSA9PT0gNyA/IG9zVmVyc2lvbkFyclsxXSAqIDEgPj0gMSA6IG9zVmVyc2lvbkFyclswXSAqIDEgPiA3KVxuICAgICAgICAmJiBtZXRhVmlld3BvcnQgJiYgbWV0YVZpZXdwb3J0LmdldEF0dHJpYnV0ZSgnY29udGVudCcpLmluZGV4T2YoJ21pbmltYWwtdWknKSA+PSAwO1xuICAgIH1cblxuICAgIC8vIFBpeGVsIFJhdGlvXG4gICAgZGV2aWNlLnBpeGVsUmF0aW8gPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgLy8gRXhwb3J0IG9iamVjdFxuICAgIHJldHVybiBkZXZpY2U7XG4gIH0oKSk7XG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0IChldmVudCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgdG91Y2hlcyA9IHN3aXBlci50b3VjaGVzO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGUgPSBldmVudDtcbiAgICBpZiAoZS5vcmlnaW5hbEV2ZW50KSB7IGUgPSBlLm9yaWdpbmFsRXZlbnQ7IH1cbiAgICBkYXRhLmlzVG91Y2hFdmVudCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnO1xuICAgIGlmICghZGF0YS5pc1RvdWNoRXZlbnQgJiYgJ3doaWNoJyBpbiBlICYmIGUud2hpY2ggPT09IDMpIHsgcmV0dXJuOyB9XG4gICAgaWYgKCFkYXRhLmlzVG91Y2hFdmVudCAmJiAnYnV0dG9uJyBpbiBlICYmIGUuYnV0dG9uID4gMCkgeyByZXR1cm47IH1cbiAgICBpZiAoZGF0YS5pc1RvdWNoZWQgJiYgZGF0YS5pc01vdmVkKSB7IHJldHVybjsgfVxuICAgIGlmIChwYXJhbXMubm9Td2lwaW5nICYmICQoZS50YXJnZXQpLmNsb3Nlc3QocGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yID8gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yIDogKFwiLlwiICsgKHBhcmFtcy5ub1N3aXBpbmdDbGFzcykpKVswXSkge1xuICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnN3aXBlSGFuZGxlcikge1xuICAgICAgaWYgKCEkKGUpLmNsb3Nlc3QocGFyYW1zLnN3aXBlSGFuZGxlcilbMF0pIHsgcmV0dXJuOyB9XG4gICAgfVxuXG4gICAgdG91Y2hlcy5jdXJyZW50WCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICB0b3VjaGVzLmN1cnJlbnRZID0gZS50eXBlID09PSAndG91Y2hzdGFydCcgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZO1xuICAgIHZhciBzdGFydFggPSB0b3VjaGVzLmN1cnJlbnRYO1xuICAgIHZhciBzdGFydFkgPSB0b3VjaGVzLmN1cnJlbnRZO1xuXG4gICAgLy8gRG8gTk9UIHN0YXJ0IGlmIGlPUyBlZGdlIHN3aXBlIGlzIGRldGVjdGVkLiBPdGhlcndpc2UgaU9TIGFwcCAoVUlXZWJWaWV3KSBjYW5ub3Qgc3dpcGUtdG8tZ28tYmFjayBhbnltb3JlXG5cbiAgICB2YXIgZWRnZVN3aXBlRGV0ZWN0aW9uID0gcGFyYW1zLmVkZ2VTd2lwZURldGVjdGlvbiB8fCBwYXJhbXMuaU9TRWRnZVN3aXBlRGV0ZWN0aW9uO1xuICAgIHZhciBlZGdlU3dpcGVUaHJlc2hvbGQgPSBwYXJhbXMuZWRnZVN3aXBlVGhyZXNob2xkIHx8IHBhcmFtcy5pT1NFZGdlU3dpcGVUaHJlc2hvbGQ7XG4gICAgaWYgKFxuICAgICAgZWRnZVN3aXBlRGV0ZWN0aW9uXG4gICAgICAmJiAoKHN0YXJ0WCA8PSBlZGdlU3dpcGVUaHJlc2hvbGQpXG4gICAgICB8fCAoc3RhcnRYID49IHdpbi5zY3JlZW4ud2lkdGggLSBlZGdlU3dpcGVUaHJlc2hvbGQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIFV0aWxzLmV4dGVuZChkYXRhLCB7XG4gICAgICBpc1RvdWNoZWQ6IHRydWUsXG4gICAgICBpc01vdmVkOiBmYWxzZSxcbiAgICAgIGFsbG93VG91Y2hDYWxsYmFja3M6IHRydWUsXG4gICAgICBpc1Njcm9sbGluZzogdW5kZWZpbmVkLFxuICAgICAgc3RhcnRNb3Zpbmc6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRvdWNoZXMuc3RhcnRYID0gc3RhcnRYO1xuICAgIHRvdWNoZXMuc3RhcnRZID0gc3RhcnRZO1xuICAgIGRhdGEudG91Y2hTdGFydFRpbWUgPSBVdGlscy5ub3coKTtcbiAgICBzd2lwZXIuYWxsb3dDbGljayA9IHRydWU7XG4gICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgICBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmFtcy50aHJlc2hvbGQgPiAwKSB7IGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gZmFsc2U7IH1cbiAgICBpZiAoZS50eXBlICE9PSAndG91Y2hzdGFydCcpIHtcbiAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICBpZiAoJChlLnRhcmdldCkuaXMoZGF0YS5mb3JtRWxlbWVudHMpKSB7IHByZXZlbnREZWZhdWx0ID0gZmFsc2U7IH1cbiAgICAgIGlmIChcbiAgICAgICAgZG9jLmFjdGl2ZUVsZW1lbnRcbiAgICAgICAgJiYgJChkb2MuYWN0aXZlRWxlbWVudCkuaXMoZGF0YS5mb3JtRWxlbWVudHMpXG4gICAgICAgICYmIGRvYy5hY3RpdmVFbGVtZW50ICE9PSBlLnRhcmdldFxuICAgICAgKSB7XG4gICAgICAgIGRvYy5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3VsZFByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQgJiYgc3dpcGVyLmFsbG93VG91Y2hNb3ZlICYmIHBhcmFtcy50b3VjaFN0YXJ0UHJldmVudERlZmF1bHQ7XG4gICAgICBpZiAocGFyYW1zLnRvdWNoU3RhcnRGb3JjZVByZXZlbnREZWZhdWx0IHx8IHNob3VsZFByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ3RvdWNoU3RhcnQnLCBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlIChldmVudCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgdG91Y2hlcyA9IHN3aXBlci50b3VjaGVzO1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgIHZhciBlID0gZXZlbnQ7XG4gICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9XG4gICAgaWYgKCFkYXRhLmlzVG91Y2hlZCkge1xuICAgICAgaWYgKGRhdGEuc3RhcnRNb3ZpbmcgJiYgZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRhdGEuaXNUb3VjaEV2ZW50ICYmIGUudHlwZSA9PT0gJ21vdXNlbW92ZScpIHsgcmV0dXJuOyB9XG4gICAgdmFyIHBhZ2VYID0gZS50eXBlID09PSAndG91Y2htb3ZlJyA/IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCA6IGUucGFnZVg7XG4gICAgdmFyIHBhZ2VZID0gZS50eXBlID09PSAndG91Y2htb3ZlJyA/IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWSA6IGUucGFnZVk7XG4gICAgaWYgKGUucHJldmVudGVkQnlOZXN0ZWRTd2lwZXIpIHtcbiAgICAgIHRvdWNoZXMuc3RhcnRYID0gcGFnZVg7XG4gICAgICB0b3VjaGVzLnN0YXJ0WSA9IHBhZ2VZO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXN3aXBlci5hbGxvd1RvdWNoTW92ZSkge1xuICAgICAgLy8gaXNNb3ZlZCA9IHRydWU7XG4gICAgICBzd2lwZXIuYWxsb3dDbGljayA9IGZhbHNlO1xuICAgICAgaWYgKGRhdGEuaXNUb3VjaGVkKSB7XG4gICAgICAgIFV0aWxzLmV4dGVuZCh0b3VjaGVzLCB7XG4gICAgICAgICAgc3RhcnRYOiBwYWdlWCxcbiAgICAgICAgICBzdGFydFk6IHBhZ2VZLFxuICAgICAgICAgIGN1cnJlbnRYOiBwYWdlWCxcbiAgICAgICAgICBjdXJyZW50WTogcGFnZVksXG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhLnRvdWNoU3RhcnRUaW1lID0gVXRpbHMubm93KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hFdmVudCAmJiBwYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcyAmJiAhcGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChzd2lwZXIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgIC8vIFZlcnRpY2FsXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFnZVkgPCB0b3VjaGVzLnN0YXJ0WSAmJiBzd2lwZXIudHJhbnNsYXRlIDw9IHN3aXBlci5tYXhUcmFuc2xhdGUoKSlcbiAgICAgICAgICB8fCAocGFnZVkgPiB0b3VjaGVzLnN0YXJ0WSAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChwYWdlWCA8IHRvdWNoZXMuc3RhcnRYICYmIHN3aXBlci50cmFuc2xhdGUgPD0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpKVxuICAgICAgICB8fCAocGFnZVggPiB0b3VjaGVzLnN0YXJ0WCAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hFdmVudCAmJiBkb2MuYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKGUudGFyZ2V0ID09PSBkb2MuYWN0aXZlRWxlbWVudCAmJiAkKGUudGFyZ2V0KS5pcyhkYXRhLmZvcm1FbGVtZW50cykpIHtcbiAgICAgICAgZGF0YS5pc01vdmVkID0gdHJ1ZTtcbiAgICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5hbGxvd1RvdWNoQ2FsbGJhY2tzKSB7XG4gICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlJywgZSk7XG4gICAgfVxuICAgIGlmIChlLnRhcmdldFRvdWNoZXMgJiYgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA+IDEpIHsgcmV0dXJuOyB9XG5cbiAgICB0b3VjaGVzLmN1cnJlbnRYID0gcGFnZVg7XG4gICAgdG91Y2hlcy5jdXJyZW50WSA9IHBhZ2VZO1xuXG4gICAgdmFyIGRpZmZYID0gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYO1xuICAgIHZhciBkaWZmWSA9IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy50aHJlc2hvbGQgJiYgTWF0aC5zcXJ0KChNYXRoLnBvdyggZGlmZlgsIDIgKSkgKyAoTWF0aC5wb3coIGRpZmZZLCAyICkpKSA8IHN3aXBlci5wYXJhbXMudGhyZXNob2xkKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhLmlzU2Nyb2xsaW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHRvdWNoQW5nbGU7XG4gICAgICBpZiAoKHN3aXBlci5pc0hvcml6b250YWwoKSAmJiB0b3VjaGVzLmN1cnJlbnRZID09PSB0b3VjaGVzLnN0YXJ0WSkgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYgdG91Y2hlcy5jdXJyZW50WCA9PT0gdG91Y2hlcy5zdGFydFgpKSB7XG4gICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBpZiAoKGRpZmZYICogZGlmZlgpICsgKGRpZmZZICogZGlmZlkpID49IDI1KSB7XG4gICAgICAgICAgdG91Y2hBbmdsZSA9IChNYXRoLmF0YW4yKE1hdGguYWJzKGRpZmZZKSwgTWF0aC5hYnMoZGlmZlgpKSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUgOiAoOTAgLSB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmlzU2Nyb2xsaW5nKSB7XG4gICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLnN0YXJ0TW92aW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRvdWNoZXMuY3VycmVudFggIT09IHRvdWNoZXMuc3RhcnRYIHx8IHRvdWNoZXMuY3VycmVudFkgIT09IHRvdWNoZXMuc3RhcnRZKSB7XG4gICAgICAgIGRhdGEuc3RhcnRNb3ZpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnN0YXJ0TW92aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd0NsaWNrID0gZmFsc2U7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChwYXJhbXMudG91Y2hNb3ZlU3RvcFByb3BhZ2F0aW9uICYmICFwYXJhbXMubmVzdGVkKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5pc01vdmVkKSB7XG4gICAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc3RhcnRUcmFuc2xhdGUgPSBzd2lwZXIuZ2V0VHJhbnNsYXRlKCk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLnRyaWdnZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZCcpO1xuICAgICAgfVxuICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gZmFsc2U7XG4gICAgICAvLyBHcmFiIEN1cnNvclxuICAgICAgaWYgKHBhcmFtcy5ncmFiQ3Vyc29yICYmIChzd2lwZXIuYWxsb3dTbGlkZU5leHQgPT09IHRydWUgfHwgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID09PSB0cnVlKSkge1xuICAgICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcih0cnVlKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbGlkZXJGaXJzdE1vdmUnLCBlKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlck1vdmUnLCBlKTtcbiAgICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuXG4gICAgdmFyIGRpZmYgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBkaWZmWCA6IGRpZmZZO1xuICAgIHRvdWNoZXMuZGlmZiA9IGRpZmY7XG5cbiAgICBkaWZmICo9IHBhcmFtcy50b3VjaFJhdGlvO1xuICAgIGlmIChydGwpIHsgZGlmZiA9IC1kaWZmOyB9XG5cbiAgICBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPSBkaWZmID4gMCA/ICdwcmV2JyA6ICduZXh0JztcbiAgICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkaWZmICsgZGF0YS5zdGFydFRyYW5zbGF0ZTtcblxuICAgIHZhciBkaXNhYmxlUGFyZW50U3dpcGVyID0gdHJ1ZTtcbiAgICB2YXIgcmVzaXN0YW5jZVJhdGlvID0gcGFyYW1zLnJlc2lzdGFuY2VSYXRpbztcbiAgICBpZiAocGFyYW1zLnRvdWNoUmVsZWFzZU9uRWRnZXMpIHtcbiAgICAgIHJlc2lzdGFuY2VSYXRpbyA9IDA7XG4gICAgfVxuICAgIGlmICgoZGlmZiA+IDAgJiYgZGF0YS5jdXJyZW50VHJhbnNsYXRlID4gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSkge1xuICAgICAgZGlzYWJsZVBhcmVudFN3aXBlciA9IGZhbHNlO1xuICAgICAgaWYgKHBhcmFtcy5yZXNpc3RhbmNlKSB7IGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IChzd2lwZXIubWluVHJhbnNsYXRlKCkgLSAxKSArIChNYXRoLnBvdyggKC1zd2lwZXIubWluVHJhbnNsYXRlKCkgKyBkYXRhLnN0YXJ0VHJhbnNsYXRlICsgZGlmZiksIHJlc2lzdGFuY2VSYXRpbyApKTsgfVxuICAgIH0gZWxzZSBpZiAoZGlmZiA8IDAgJiYgZGF0YS5jdXJyZW50VHJhbnNsYXRlIDwgc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFyZW50U3dpcGVyID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLnJlc2lzdGFuY2UpIHsgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gKHN3aXBlci5tYXhUcmFuc2xhdGUoKSArIDEpIC0gKE1hdGgucG93KCAoc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gZGF0YS5zdGFydFRyYW5zbGF0ZSAtIGRpZmYpLCByZXNpc3RhbmNlUmF0aW8gKSk7IH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZVBhcmVudFN3aXBlcikge1xuICAgICAgZS5wcmV2ZW50ZWRCeU5lc3RlZFN3aXBlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGlyZWN0aW9ucyBsb2Nrc1xuICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVOZXh0ICYmIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ25leHQnICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA8IGRhdGEuc3RhcnRUcmFuc2xhdGUpIHtcbiAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgfVxuICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVQcmV2ICYmIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ3ByZXYnICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IGRhdGEuc3RhcnRUcmFuc2xhdGUpIHtcbiAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgfVxuXG5cbiAgICAvLyBUaHJlc2hvbGRcbiAgICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIHtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmKSA+IHBhcmFtcy50aHJlc2hvbGQgfHwgZGF0YS5hbGxvd1RocmVzaG9sZE1vdmUpIHtcbiAgICAgICAgaWYgKCFkYXRhLmFsbG93VGhyZXNob2xkTW92ZSkge1xuICAgICAgICAgIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gdHJ1ZTtcbiAgICAgICAgICB0b3VjaGVzLnN0YXJ0WCA9IHRvdWNoZXMuY3VycmVudFg7XG4gICAgICAgICAgdG91Y2hlcy5zdGFydFkgPSB0b3VjaGVzLmN1cnJlbnRZO1xuICAgICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgICAgICAgdG91Y2hlcy5kaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYIDogdG91Y2hlcy5jdXJyZW50WSAtIHRvdWNoZXMuc3RhcnRZO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmZvbGxvd0ZpbmdlcikgeyByZXR1cm47IH1cblxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgaW5kZXggaW4gZnJlZSBtb2RlXG4gICAgaWYgKHBhcmFtcy5mcmVlTW9kZSB8fCBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcyB8fCBwYXJhbXMud2F0Y2hTbGlkZXNWaXNpYmlsaXR5KSB7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUpIHtcbiAgICAgIC8vIFZlbG9jaXR5XG4gICAgICBpZiAoZGF0YS52ZWxvY2l0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkYXRhLnZlbG9jaXRpZXMucHVzaCh7XG4gICAgICAgICAgcG9zaXRpb246IHRvdWNoZXNbc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ3N0YXJ0WCcgOiAnc3RhcnRZJ10sXG4gICAgICAgICAgdGltZTogZGF0YS50b3VjaFN0YXJ0VGltZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkYXRhLnZlbG9jaXRpZXMucHVzaCh7XG4gICAgICAgIHBvc2l0aW9uOiB0b3VjaGVzW3N3aXBlci5pc0hvcml6b250YWwoKSA/ICdjdXJyZW50WCcgOiAnY3VycmVudFknXSxcbiAgICAgICAgdGltZTogVXRpbHMubm93KCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHByb2dyZXNzXG4gICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKGRhdGEuY3VycmVudFRyYW5zbGF0ZSk7XG4gICAgLy8gVXBkYXRlIHRyYW5zbGF0ZVxuICAgIHN3aXBlci5zZXRUcmFuc2xhdGUoZGF0YS5jdXJyZW50VHJhbnNsYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hFbmQgKGV2ZW50KSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGRhdGEgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhO1xuXG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHRvdWNoZXMgPSBzd2lwZXIudG91Y2hlcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBzbGlkZXNHcmlkID0gc3dpcGVyLnNsaWRlc0dyaWQ7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuICAgIHZhciBlID0gZXZlbnQ7XG4gICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9XG4gICAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ3RvdWNoRW5kJywgZSk7XG4gICAgfVxuICAgIGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcyA9IGZhbHNlO1xuICAgIGlmICghZGF0YS5pc1RvdWNoZWQpIHtcbiAgICAgIGlmIChkYXRhLmlzTW92ZWQgJiYgcGFyYW1zLmdyYWJDdXJzb3IpIHtcbiAgICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICAgICAgfVxuICAgICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgICBkYXRhLnN0YXJ0TW92aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJldHVybiBHcmFiIEN1cnNvclxuICAgIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiBkYXRhLmlzTW92ZWQgJiYgZGF0YS5pc1RvdWNoZWQgJiYgKHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSB8fCBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPT09IHRydWUpKSB7XG4gICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcihmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gVGltZSBkaWZmXG4gICAgdmFyIHRvdWNoRW5kVGltZSA9IFV0aWxzLm5vdygpO1xuICAgIHZhciB0aW1lRGlmZiA9IHRvdWNoRW5kVGltZSAtIGRhdGEudG91Y2hTdGFydFRpbWU7XG5cbiAgICAvLyBUYXAsIGRvdWJsZVRhcCwgQ2xpY2tcbiAgICBpZiAoc3dpcGVyLmFsbG93Q2xpY2spIHtcbiAgICAgIHN3aXBlci51cGRhdGVDbGlja2VkU2xpZGUoZSk7XG4gICAgICBzd2lwZXIuZW1pdCgndGFwJywgZSk7XG4gICAgICBpZiAodGltZURpZmYgPCAzMDAgJiYgKHRvdWNoRW5kVGltZSAtIGRhdGEubGFzdENsaWNrVGltZSkgPiAzMDApIHtcbiAgICAgICAgaWYgKGRhdGEuY2xpY2tUaW1lb3V0KSB7IGNsZWFyVGltZW91dChkYXRhLmNsaWNrVGltZW91dCk7IH1cbiAgICAgICAgZGF0YS5jbGlja1RpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzd2lwZXIuZW1pdCgnY2xpY2snLCBlKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lRGlmZiA8IDMwMCAmJiAodG91Y2hFbmRUaW1lIC0gZGF0YS5sYXN0Q2xpY2tUaW1lKSA8IDMwMCkge1xuICAgICAgICBpZiAoZGF0YS5jbGlja1RpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRhdGEuY2xpY2tUaW1lb3V0KTsgfVxuICAgICAgICBzd2lwZXIuZW1pdCgnZG91YmxlVGFwJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGF0YS5sYXN0Q2xpY2tUaW1lID0gVXRpbHMubm93KCk7XG4gICAgVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzd2lwZXIuZGVzdHJveWVkKSB7IHN3aXBlci5hbGxvd0NsaWNrID0gdHJ1ZTsgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRhLmlzVG91Y2hlZCB8fCAhZGF0YS5pc01vdmVkIHx8ICFzd2lwZXIuc3dpcGVEaXJlY3Rpb24gfHwgdG91Y2hlcy5kaWZmID09PSAwIHx8IGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9PT0gZGF0YS5zdGFydFRyYW5zbGF0ZSkge1xuICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgIGRhdGEuaXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIGRhdGEuaXNNb3ZlZCA9IGZhbHNlO1xuICAgIGRhdGEuc3RhcnRNb3ZpbmcgPSBmYWxzZTtcblxuICAgIHZhciBjdXJyZW50UG9zO1xuICAgIGlmIChwYXJhbXMuZm9sbG93RmluZ2VyKSB7XG4gICAgICBjdXJyZW50UG9zID0gcnRsID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50UG9zID0gLWRhdGEuY3VycmVudFRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICBpZiAoY3VycmVudFBvcyA8IC1zd2lwZXIubWluVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRQb3MgPiAtc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzLmxlbmd0aCA8IHNuYXBHcmlkLmxlbmd0aCkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHNuYXBHcmlkLmxlbmd0aCAtIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW0pIHtcbiAgICAgICAgaWYgKGRhdGEudmVsb2NpdGllcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdmFyIGxhc3RNb3ZlRXZlbnQgPSBkYXRhLnZlbG9jaXRpZXMucG9wKCk7XG4gICAgICAgICAgdmFyIHZlbG9jaXR5RXZlbnQgPSBkYXRhLnZlbG9jaXRpZXMucG9wKCk7XG5cbiAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBsYXN0TW92ZUV2ZW50LnBvc2l0aW9uIC0gdmVsb2NpdHlFdmVudC5wb3NpdGlvbjtcbiAgICAgICAgICB2YXIgdGltZSA9IGxhc3RNb3ZlRXZlbnQudGltZSAtIHZlbG9jaXR5RXZlbnQudGltZTtcbiAgICAgICAgICBzd2lwZXIudmVsb2NpdHkgPSBkaXN0YW5jZSAvIHRpbWU7XG4gICAgICAgICAgc3dpcGVyLnZlbG9jaXR5IC89IDI7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKHN3aXBlci52ZWxvY2l0eSkgPCBwYXJhbXMuZnJlZU1vZGVNaW5pbXVtVmVsb2NpdHkpIHtcbiAgICAgICAgICAgIHN3aXBlci52ZWxvY2l0eSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB1c2VyIHN0b3BwZWQgbW92aW5nIGEgZmluZ2VyIHRoZW4gcmVsZWFzZWQuXG4gICAgICAgICAgLy8gVGhlcmUgd291bGQgYmUgbm8gZXZlbnRzIHdpdGggZGlzdGFuY2UgemVybywgc28gdGhlIGxhc3QgZXZlbnQgaXMgc3RhbGUuXG4gICAgICAgICAgaWYgKHRpbWUgPiAxNTAgfHwgKFV0aWxzLm5vdygpIC0gbGFzdE1vdmVFdmVudC50aW1lKSA+IDMwMCkge1xuICAgICAgICAgICAgc3dpcGVyLnZlbG9jaXR5ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLnZlbG9jaXR5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzd2lwZXIudmVsb2NpdHkgKj0gcGFyYW1zLmZyZWVNb2RlTW9tZW50dW1WZWxvY2l0eVJhdGlvO1xuXG4gICAgICAgIGRhdGEudmVsb2NpdGllcy5sZW5ndGggPSAwO1xuICAgICAgICB2YXIgbW9tZW50dW1EdXJhdGlvbiA9IDEwMDAgKiBwYXJhbXMuZnJlZU1vZGVNb21lbnR1bVJhdGlvO1xuICAgICAgICB2YXIgbW9tZW50dW1EaXN0YW5jZSA9IHN3aXBlci52ZWxvY2l0eSAqIG1vbWVudHVtRHVyYXRpb247XG5cbiAgICAgICAgdmFyIG5ld1Bvc2l0aW9uID0gc3dpcGVyLnRyYW5zbGF0ZSArIG1vbWVudHVtRGlzdGFuY2U7XG4gICAgICAgIGlmIChydGwpIHsgbmV3UG9zaXRpb24gPSAtbmV3UG9zaXRpb247IH1cblxuICAgICAgICB2YXIgZG9Cb3VuY2UgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFmdGVyQm91bmNlUG9zaXRpb247XG4gICAgICAgIHZhciBib3VuY2VBbW91bnQgPSBNYXRoLmFicyhzd2lwZXIudmVsb2NpdHkpICogMjAgKiBwYXJhbXMuZnJlZU1vZGVNb21lbnR1bUJvdW5jZVJhdGlvO1xuICAgICAgICB2YXIgbmVlZHNMb29wRml4O1xuICAgICAgICBpZiAobmV3UG9zaXRpb24gPCBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW1Cb3VuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdQb3NpdGlvbiArIHN3aXBlci5tYXhUcmFuc2xhdGUoKSA8IC1ib3VuY2VBbW91bnQpIHtcbiAgICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBib3VuY2VBbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZnRlckJvdW5jZVBvc2l0aW9uID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpO1xuICAgICAgICAgICAgZG9Cb3VuY2UgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJhbXMubG9vcCAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHsgbmVlZHNMb29wRml4ID0gdHJ1ZTsgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1Bvc2l0aW9uID4gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSB7XG4gICAgICAgICAgaWYgKHBhcmFtcy5mcmVlTW9kZU1vbWVudHVtQm91bmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3UG9zaXRpb24gLSBzd2lwZXIubWluVHJhbnNsYXRlKCkgPiBib3VuY2VBbW91bnQpIHtcbiAgICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWluVHJhbnNsYXRlKCkgKyBib3VuY2VBbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZnRlckJvdW5jZVBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgICAgICAgICAgZG9Cb3VuY2UgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJhbXMubG9vcCAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHsgbmVlZHNMb29wRml4ID0gdHJ1ZTsgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5mcmVlTW9kZVN0aWNreSkge1xuICAgICAgICAgIHZhciBuZXh0U2xpZGU7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzbmFwR3JpZC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNuYXBHcmlkW2pdID4gLW5ld1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgIG5leHRTbGlkZSA9IGo7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChNYXRoLmFicyhzbmFwR3JpZFtuZXh0U2xpZGVdIC0gbmV3UG9zaXRpb24pIDwgTWF0aC5hYnMoc25hcEdyaWRbbmV4dFNsaWRlIC0gMV0gLSBuZXdQb3NpdGlvbikgfHwgc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgICAgICAgIG5ld1Bvc2l0aW9uID0gc25hcEdyaWRbbmV4dFNsaWRlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzbmFwR3JpZFtuZXh0U2xpZGUgLSAxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3UG9zaXRpb24gPSAtbmV3UG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRzTG9vcEZpeCkge1xuICAgICAgICAgIHN3aXBlci5vbmNlKCd0cmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaXggZHVyYXRpb25cbiAgICAgICAgaWYgKHN3aXBlci52ZWxvY2l0eSAhPT0gMCkge1xuICAgICAgICAgIGlmIChydGwpIHtcbiAgICAgICAgICAgIG1vbWVudHVtRHVyYXRpb24gPSBNYXRoLmFicygoLW5ld1Bvc2l0aW9uIC0gc3dpcGVyLnRyYW5zbGF0ZSkgLyBzd2lwZXIudmVsb2NpdHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb21lbnR1bUR1cmF0aW9uID0gTWF0aC5hYnMoKG5ld1Bvc2l0aW9uIC0gc3dpcGVyLnRyYW5zbGF0ZSkgLyBzd2lwZXIudmVsb2NpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZnJlZU1vZGVTdGlja3kpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUb0Nsb3Nlc3QoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW1Cb3VuY2UgJiYgZG9Cb3VuY2UpIHtcbiAgICAgICAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MoYWZ0ZXJCb3VuY2VQb3NpdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24obW9tZW50dW1EdXJhdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdQb3NpdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25TdGFydCh0cnVlLCBzd2lwZXIuc3dpcGVEaXJlY3Rpb24pO1xuICAgICAgICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbkVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFkYXRhLmFsbG93TW9tZW50dW1Cb3VuY2UpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBzd2lwZXIuZW1pdCgnbW9tZW50dW1Cb3VuY2UnKTtcblxuICAgICAgICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24ocGFyYW1zLnNwZWVkKTtcbiAgICAgICAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUoYWZ0ZXJCb3VuY2VQb3NpdGlvbik7XG4gICAgICAgICAgICAkd3JhcHBlckVsLnRyYW5zaXRpb25FbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3dpcGVyLnZlbG9jaXR5KSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihtb21lbnR1bUR1cmF0aW9uKTtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHRydWUsIHN3aXBlci5zd2lwZURpcmVjdGlvbik7XG4gICAgICAgICAgaWYgKCFzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbkVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgIHN3aXBlci50cmFuc2l0aW9uRW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZnJlZU1vZGVTdGlja3kpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG9DbG9zZXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJhbXMuZnJlZU1vZGVNb21lbnR1bSB8fCB0aW1lRGlmZiA+PSBwYXJhbXMubG9uZ1N3aXBlc01zKSB7XG4gICAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGN1cnJlbnQgc2xpZGVcbiAgICB2YXIgc3RvcEluZGV4ID0gMDtcbiAgICB2YXIgZ3JvdXBTaXplID0gc3dpcGVyLnNsaWRlc1NpemVzR3JpZFswXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IHBhcmFtcy5zbGlkZXNQZXJHcm91cCkge1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldICYmIGN1cnJlbnRQb3MgPCBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdKSB7XG4gICAgICAgICAgc3RvcEluZGV4ID0gaTtcbiAgICAgICAgICBncm91cFNpemUgPSBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdIC0gc2xpZGVzR3JpZFtpXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UG9zID49IHNsaWRlc0dyaWRbaV0pIHtcbiAgICAgICAgc3RvcEluZGV4ID0gaTtcbiAgICAgICAgZ3JvdXBTaXplID0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDFdIC0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbmQgY3VycmVudCBzbGlkZSBzaXplXG4gICAgdmFyIHJhdGlvID0gKGN1cnJlbnRQb3MgLSBzbGlkZXNHcmlkW3N0b3BJbmRleF0pIC8gZ3JvdXBTaXplO1xuXG4gICAgaWYgKHRpbWVEaWZmID4gcGFyYW1zLmxvbmdTd2lwZXNNcykge1xuICAgICAgLy8gTG9uZyB0b3VjaGVzXG4gICAgICBpZiAoIXBhcmFtcy5sb25nU3dpcGVzKSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICBpZiAocmF0aW8gPj0gcGFyYW1zLmxvbmdTd2lwZXNSYXRpbykgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXApOyB9XG4gICAgICAgIGVsc2UgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgaWYgKHJhdGlvID4gKDEgLSBwYXJhbXMubG9uZ1N3aXBlc1JhdGlvKSkgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXApOyB9XG4gICAgICAgIGVsc2UgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXgpOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNob3J0IHN3aXBlc1xuICAgICAgaWYgKCFwYXJhbXMuc2hvcnRTd2lwZXMpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ25leHQnKSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCArIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3RvcEluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvblJlc2l6ZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgZWwgPSBzd2lwZXIuZWw7XG5cbiAgICBpZiAoZWwgJiYgZWwub2Zmc2V0V2lkdGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAvLyBCcmVha3BvaW50c1xuICAgIGlmIChwYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBsb2Nrc1xuICAgIHZhciBhbGxvd1NsaWRlTmV4dCA9IHN3aXBlci5hbGxvd1NsaWRlTmV4dDtcbiAgICB2YXIgYWxsb3dTbGlkZVByZXYgPSBzd2lwZXIuYWxsb3dTbGlkZVByZXY7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuXG4gICAgLy8gRGlzYWJsZSBsb2NrcyBvbiByZXNpemVcbiAgICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSB0cnVlO1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG5cbiAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcblxuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUpIHtcbiAgICAgIHZhciBuZXdUcmFuc2xhdGUgPSBNYXRoLm1pbihNYXRoLm1heChzd2lwZXIudHJhbnNsYXRlLCBzd2lwZXIubWF4VHJhbnNsYXRlKCkpLCBzd2lwZXIubWluVHJhbnNsYXRlKCkpO1xuICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdUcmFuc2xhdGUpO1xuICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuXG4gICAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZUF1dG9IZWlnaHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIGlmICgocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyB8fCBwYXJhbXMuc2xpZGVzUGVyVmlldyA+IDEpICYmIHN3aXBlci5pc0VuZCAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDEsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgMCwgZmFsc2UsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dpcGVyLmF1dG9wbGF5ICYmIHN3aXBlci5hdXRvcGxheS5ydW5uaW5nICYmIHN3aXBlci5hdXRvcGxheS5wYXVzZWQpIHtcbiAgICAgIHN3aXBlci5hdXRvcGxheS5ydW4oKTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGxvY2tzIGFmdGVyIHJlc2l6ZVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuXG4gICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2xpY2sgKGUpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5hbGxvd0NsaWNrKSB7XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5wcmV2ZW50Q2xpY2tzKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMucHJldmVudENsaWNrc1Byb3BhZ2F0aW9uICYmIHN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhdHRhY2hFdmVudHMoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHRvdWNoRXZlbnRzID0gc3dpcGVyLnRvdWNoRXZlbnRzO1xuICAgIHZhciBlbCA9IHN3aXBlci5lbDtcbiAgICB2YXIgd3JhcHBlckVsID0gc3dpcGVyLndyYXBwZXJFbDtcblxuICAgIHtcbiAgICAgIHN3aXBlci5vblRvdWNoU3RhcnQgPSBvblRvdWNoU3RhcnQuYmluZChzd2lwZXIpO1xuICAgICAgc3dpcGVyLm9uVG91Y2hNb3ZlID0gb25Ub3VjaE1vdmUuYmluZChzd2lwZXIpO1xuICAgICAgc3dpcGVyLm9uVG91Y2hFbmQgPSBvblRvdWNoRW5kLmJpbmQoc3dpcGVyKTtcbiAgICB9XG5cbiAgICBzd2lwZXIub25DbGljayA9IG9uQ2xpY2suYmluZChzd2lwZXIpO1xuXG4gICAgdmFyIHRhcmdldCA9IHBhcmFtcy50b3VjaEV2ZW50c1RhcmdldCA9PT0gJ2NvbnRhaW5lcicgPyBlbCA6IHdyYXBwZXJFbDtcbiAgICB2YXIgY2FwdHVyZSA9ICEhcGFyYW1zLm5lc3RlZDtcblxuICAgIC8vIFRvdWNoIEV2ZW50c1xuICAgIHtcbiAgICAgIGlmICghU3VwcG9ydC50b3VjaCAmJiAoU3VwcG9ydC5wb2ludGVyRXZlbnRzIHx8IFN1cHBvcnQucHJlZml4ZWRQb2ludGVyRXZlbnRzKSkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5zdGFydCwgc3dpcGVyLm9uVG91Y2hTdGFydCwgZmFsc2UpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5tb3ZlLCBzd2lwZXIub25Ub3VjaE1vdmUsIGNhcHR1cmUpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5lbmQsIHN3aXBlci5vblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoU3VwcG9ydC50b3VjaCkge1xuICAgICAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSB0b3VjaEV2ZW50cy5zdGFydCA9PT0gJ3RvdWNoc3RhcnQnICYmIFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlOiBmYWxzZSB9IDogZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMuc3RhcnQsIHN3aXBlci5vblRvdWNoU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMubW92ZSwgc3dpcGVyLm9uVG91Y2hNb3ZlLCBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciA/IHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGNhcHR1cmUgfSA6IGNhcHR1cmUpO1xuICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLmVuZCwgc3dpcGVyLm9uVG91Y2hFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJiAhRGV2aWNlLmlvcyAmJiAhRGV2aWNlLmFuZHJvaWQpIHx8IChwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJiAhU3VwcG9ydC50b3VjaCAmJiBEZXZpY2UuaW9zKSkge1xuICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBzd2lwZXIub25Ub3VjaEVuZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IExpbmtzIENsaWNrc1xuICAgICAgaWYgKHBhcmFtcy5wcmV2ZW50Q2xpY2tzIHx8IHBhcmFtcy5wcmV2ZW50Q2xpY2tzUHJvcGFnYXRpb24pIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3dpcGVyLm9uQ2xpY2ssIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2l6ZSBoYW5kbGVyXG4gICAgc3dpcGVyLm9uKChEZXZpY2UuaW9zIHx8IERldmljZS5hbmRyb2lkID8gJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBvYnNlcnZlclVwZGF0ZScgOiAncmVzaXplIG9ic2VydmVyVXBkYXRlJyksIG9uUmVzaXplLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRldGFjaEV2ZW50cygpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciB0b3VjaEV2ZW50cyA9IHN3aXBlci50b3VjaEV2ZW50cztcbiAgICB2YXIgZWwgPSBzd2lwZXIuZWw7XG4gICAgdmFyIHdyYXBwZXJFbCA9IHN3aXBlci53cmFwcGVyRWw7XG5cbiAgICB2YXIgdGFyZ2V0ID0gcGFyYW1zLnRvdWNoRXZlbnRzVGFyZ2V0ID09PSAnY29udGFpbmVyJyA/IGVsIDogd3JhcHBlckVsO1xuICAgIHZhciBjYXB0dXJlID0gISFwYXJhbXMubmVzdGVkO1xuXG4gICAgLy8gVG91Y2ggRXZlbnRzXG4gICAge1xuICAgICAgaWYgKCFTdXBwb3J0LnRvdWNoICYmIChTdXBwb3J0LnBvaW50ZXJFdmVudHMgfHwgU3VwcG9ydC5wcmVmaXhlZFBvaW50ZXJFdmVudHMpKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLnN0YXJ0LCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLm1vdmUsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLmVuZCwgc3dpcGVyLm9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChTdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgICAgdmFyIHBhc3NpdmVMaXN0ZW5lciA9IHRvdWNoRXZlbnRzLnN0YXJ0ID09PSAnb25Ub3VjaFN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLnN0YXJ0LCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLm1vdmUsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMuZW5kLCBzd2lwZXIub25Ub3VjaEVuZCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmFtcy5zaW11bGF0ZVRvdWNoICYmICFEZXZpY2UuaW9zICYmICFEZXZpY2UuYW5kcm9pZCkgfHwgKHBhcmFtcy5zaW11bGF0ZVRvdWNoICYmICFTdXBwb3J0LnRvdWNoICYmIERldmljZS5pb3MpKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHN3aXBlci5vblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc3dpcGVyLm9uVG91Y2hNb3ZlLCBjYXB0dXJlKTtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHN3aXBlci5vblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFByZXZlbnQgTGlua3MgQ2xpY2tzXG4gICAgICBpZiAocGFyYW1zLnByZXZlbnRDbGlja3MgfHwgcGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzd2lwZXIub25DbGljaywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIGhhbmRsZXJcbiAgICBzd2lwZXIub2ZmKChEZXZpY2UuaW9zIHx8IERldmljZS5hbmRyb2lkID8gJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBvYnNlcnZlclVwZGF0ZScgOiAncmVzaXplIG9ic2VydmVyVXBkYXRlJyksIG9uUmVzaXplKTtcbiAgfVxuXG4gIHZhciBldmVudHMgPSB7XG4gICAgYXR0YWNoRXZlbnRzOiBhdHRhY2hFdmVudHMsXG4gICAgZGV0YWNoRXZlbnRzOiBkZXRhY2hFdmVudHMsXG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0QnJlYWtwb2ludCAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBpbml0aWFsaXplZCA9IHN3aXBlci5pbml0aWFsaXplZDtcbiAgICB2YXIgbG9vcGVkU2xpZGVzID0gc3dpcGVyLmxvb3BlZFNsaWRlczsgaWYgKCBsb29wZWRTbGlkZXMgPT09IHZvaWQgMCApIGxvb3BlZFNsaWRlcyA9IDA7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGJyZWFrcG9pbnRzID0gcGFyYW1zLmJyZWFrcG9pbnRzO1xuICAgIGlmICghYnJlYWtwb2ludHMgfHwgKGJyZWFrcG9pbnRzICYmIE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5sZW5ndGggPT09IDApKSB7IHJldHVybjsgfVxuXG4gICAgLy8gU2V0IGJyZWFrcG9pbnQgZm9yIHdpbmRvdyB3aWR0aCBhbmQgdXBkYXRlIHBhcmFtZXRlcnNcbiAgICB2YXIgYnJlYWtwb2ludCA9IHN3aXBlci5nZXRCcmVha3BvaW50KGJyZWFrcG9pbnRzKTtcblxuICAgIGlmIChicmVha3BvaW50ICYmIHN3aXBlci5jdXJyZW50QnJlYWtwb2ludCAhPT0gYnJlYWtwb2ludCkge1xuICAgICAgdmFyIGJyZWFrcG9pbnRPbmx5UGFyYW1zID0gYnJlYWtwb2ludCBpbiBicmVha3BvaW50cyA/IGJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGJyZWFrcG9pbnRPbmx5UGFyYW1zKSB7XG4gICAgICAgIFsnc2xpZGVzUGVyVmlldycsICdzcGFjZUJldHdlZW4nLCAnc2xpZGVzUGVyR3JvdXAnXS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gYnJlYWtwb2ludE9ubHlQYXJhbXNbcGFyYW1dO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgaWYgKHBhcmFtID09PSAnc2xpZGVzUGVyVmlldycgJiYgKHBhcmFtVmFsdWUgPT09ICdBVVRPJyB8fCBwYXJhbVZhbHVlID09PSAnYXV0bycpKSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSAnYXV0byc7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSA9PT0gJ3NsaWRlc1BlclZpZXcnKSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSBwYXJzZUZsb2F0KHBhcmFtVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSBwYXJzZUludChwYXJhbVZhbHVlLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJyZWFrcG9pbnRQYXJhbXMgPSBicmVha3BvaW50T25seVBhcmFtcyB8fCBzd2lwZXIub3JpZ2luYWxQYXJhbXM7XG4gICAgICB2YXIgZGlyZWN0aW9uQ2hhbmdlZCA9IGJyZWFrcG9pbnRQYXJhbXMuZGlyZWN0aW9uICYmIGJyZWFrcG9pbnRQYXJhbXMuZGlyZWN0aW9uICE9PSBwYXJhbXMuZGlyZWN0aW9uO1xuICAgICAgdmFyIG5lZWRzUmVMb29wID0gcGFyYW1zLmxvb3AgJiYgKGJyZWFrcG9pbnRQYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgfHwgZGlyZWN0aW9uQ2hhbmdlZCk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb25DaGFuZ2VkICYmIGluaXRpYWxpemVkKSB7XG4gICAgICAgIHN3aXBlci5jaGFuZ2VEaXJlY3Rpb24oKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIGJyZWFrcG9pbnRQYXJhbXMpO1xuXG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGFsbG93VG91Y2hNb3ZlOiBzd2lwZXIucGFyYW1zLmFsbG93VG91Y2hNb3ZlLFxuICAgICAgICBhbGxvd1NsaWRlTmV4dDogc3dpcGVyLnBhcmFtcy5hbGxvd1NsaWRlTmV4dCxcbiAgICAgICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXYsXG4gICAgICB9KTtcblxuICAgICAgc3dpcGVyLmN1cnJlbnRCcmVha3BvaW50ID0gYnJlYWtwb2ludDtcblxuICAgICAgaWYgKG5lZWRzUmVMb29wICYmIGluaXRpYWxpemVkKSB7XG4gICAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgICAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKChhY3RpdmVJbmRleCAtIGxvb3BlZFNsaWRlcykgKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QnJlYWtwb2ludCAoYnJlYWtwb2ludHMpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAvLyBHZXQgYnJlYWtwb2ludCBmb3Igd2luZG93IHdpZHRoXG4gICAgaWYgKCFicmVha3BvaW50cykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgdmFyIGJyZWFrcG9pbnQgPSBmYWxzZTtcbiAgICB2YXIgcG9pbnRzID0gW107XG4gICAgT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgfSk7XG4gICAgcG9pbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHBhcnNlSW50KGEsIDEwKSAtIHBhcnNlSW50KGIsIDEwKTsgfSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmJyZWFrcG9pbnRzSW52ZXJzZSkge1xuICAgICAgICBpZiAocG9pbnQgPD0gd2luLmlubmVyV2lkdGgpIHtcbiAgICAgICAgICBicmVha3BvaW50ID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPj0gd2luLmlubmVyV2lkdGggJiYgIWJyZWFrcG9pbnQpIHtcbiAgICAgICAgYnJlYWtwb2ludCA9IHBvaW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnJlYWtwb2ludCB8fCAnbWF4JztcbiAgfVxuXG4gIHZhciBicmVha3BvaW50cyA9IHsgc2V0QnJlYWtwb2ludDogc2V0QnJlYWtwb2ludCwgZ2V0QnJlYWtwb2ludDogZ2V0QnJlYWtwb2ludCB9O1xuXG4gIGZ1bmN0aW9uIGFkZENsYXNzZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBjbGFzc05hbWVzID0gc3dpcGVyLmNsYXNzTmFtZXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGw7XG4gICAgdmFyICRlbCA9IHN3aXBlci4kZWw7XG4gICAgdmFyIHN1ZmZpeGVzID0gW107XG5cbiAgICBzdWZmaXhlcy5wdXNoKCdpbml0aWFsaXplZCcpO1xuICAgIHN1ZmZpeGVzLnB1c2gocGFyYW1zLmRpcmVjdGlvbik7XG5cbiAgICBpZiAocGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKCdmcmVlLW1vZGUnKTtcbiAgICB9XG4gICAgaWYgKCFTdXBwb3J0LmZsZXhib3gpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ25vLWZsZXhib3gnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKCdhdXRvaGVpZ2h0Jyk7XG4gICAgfVxuICAgIGlmIChydGwpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ3J0bCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ211bHRpcm93Jyk7XG4gICAgfVxuICAgIGlmIChEZXZpY2UuYW5kcm9pZCkge1xuICAgICAgc3VmZml4ZXMucHVzaCgnYW5kcm9pZCcpO1xuICAgIH1cbiAgICBpZiAoRGV2aWNlLmlvcykge1xuICAgICAgc3VmZml4ZXMucHVzaCgnaW9zJyk7XG4gICAgfVxuICAgIC8vIFdQOCBUb3VjaCBFdmVudHMgRml4XG4gICAgaWYgKChCcm93c2VyLmlzSUUgfHwgQnJvd3Nlci5pc0VkZ2UpICYmIChTdXBwb3J0LnBvaW50ZXJFdmVudHMgfHwgU3VwcG9ydC5wcmVmaXhlZFBvaW50ZXJFdmVudHMpKSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKChcIndwOC1cIiArIChwYXJhbXMuZGlyZWN0aW9uKSkpO1xuICAgIH1cblxuICAgIHN1ZmZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHN1ZmZpeCkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKHBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzICsgc3VmZml4KTtcbiAgICB9KTtcblxuICAgICRlbC5hZGRDbGFzcyhjbGFzc05hbWVzLmpvaW4oJyAnKSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IHN3aXBlci5jbGFzc05hbWVzO1xuXG4gICAgJGVsLnJlbW92ZUNsYXNzKGNsYXNzTmFtZXMuam9pbignICcpKTtcbiAgfVxuXG4gIHZhciBjbGFzc2VzID0geyBhZGRDbGFzc2VzOiBhZGRDbGFzc2VzLCByZW1vdmVDbGFzc2VzOiByZW1vdmVDbGFzc2VzIH07XG5cbiAgZnVuY3Rpb24gbG9hZEltYWdlIChpbWFnZUVsLCBzcmMsIHNyY3NldCwgc2l6ZXMsIGNoZWNrRm9yQ29tcGxldGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGltYWdlO1xuICAgIGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfVxuICAgIH1cbiAgICBpZiAoIWltYWdlRWwuY29tcGxldGUgfHwgIWNoZWNrRm9yQ29tcGxldGUpIHtcbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgaW1hZ2UgPSBuZXcgd2luLkltYWdlKCk7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IG9uUmVhZHk7XG4gICAgICAgIGltYWdlLm9uZXJyb3IgPSBvblJlYWR5O1xuICAgICAgICBpZiAoc2l6ZXMpIHtcbiAgICAgICAgICBpbWFnZS5zaXplcyA9IHNpemVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcmNzZXQpIHtcbiAgICAgICAgICBpbWFnZS5zcmNzZXQgPSBzcmNzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25SZWFkeSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbWFnZSBhbHJlYWR5IGxvYWRlZC4uLlxuICAgICAgb25SZWFkeSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWxvYWRJbWFnZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHN3aXBlci5pbWFnZXNUb0xvYWQgPSBzd2lwZXIuJGVsLmZpbmQoJ2ltZycpO1xuICAgIGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICBpZiAodHlwZW9mIHN3aXBlciA9PT0gJ3VuZGVmaW5lZCcgfHwgc3dpcGVyID09PSBudWxsIHx8ICFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuaW1hZ2VzTG9hZGVkICE9PSB1bmRlZmluZWQpIHsgc3dpcGVyLmltYWdlc0xvYWRlZCArPSAxOyB9XG4gICAgICBpZiAoc3dpcGVyLmltYWdlc0xvYWRlZCA9PT0gc3dpcGVyLmltYWdlc1RvTG9hZC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMudXBkYXRlT25JbWFnZXNSZWFkeSkgeyBzd2lwZXIudXBkYXRlKCk7IH1cbiAgICAgICAgc3dpcGVyLmVtaXQoJ2ltYWdlc1JlYWR5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3dpcGVyLmltYWdlc1RvTG9hZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGltYWdlRWwgPSBzd2lwZXIuaW1hZ2VzVG9Mb2FkW2ldO1xuICAgICAgc3dpcGVyLmxvYWRJbWFnZShcbiAgICAgICAgaW1hZ2VFbCxcbiAgICAgICAgaW1hZ2VFbC5jdXJyZW50U3JjIHx8IGltYWdlRWwuZ2V0QXR0cmlidXRlKCdzcmMnKSxcbiAgICAgICAgaW1hZ2VFbC5zcmNzZXQgfHwgaW1hZ2VFbC5nZXRBdHRyaWJ1dGUoJ3NyY3NldCcpLFxuICAgICAgICBpbWFnZUVsLnNpemVzIHx8IGltYWdlRWwuZ2V0QXR0cmlidXRlKCdzaXplcycpLFxuICAgICAgICB0cnVlLFxuICAgICAgICBvblJlYWR5XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbWFnZXMgPSB7XG4gICAgbG9hZEltYWdlOiBsb2FkSW1hZ2UsXG4gICAgcHJlbG9hZEltYWdlczogcHJlbG9hZEltYWdlcyxcbiAgfTtcblxuICBmdW5jdGlvbiBjaGVja092ZXJmbG93KCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciB3YXNMb2NrZWQgPSBzd2lwZXIuaXNMb2NrZWQ7XG5cbiAgICBzd2lwZXIuaXNMb2NrZWQgPSBzd2lwZXIuc25hcEdyaWQubGVuZ3RoID09PSAxO1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gICAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gIXN3aXBlci5pc0xvY2tlZDtcblxuICAgIC8vIGV2ZW50c1xuICAgIGlmICh3YXNMb2NrZWQgIT09IHN3aXBlci5pc0xvY2tlZCkgeyBzd2lwZXIuZW1pdChzd2lwZXIuaXNMb2NrZWQgPyAnbG9jaycgOiAndW5sb2NrJyk7IH1cblxuICAgIGlmICh3YXNMb2NrZWQgJiYgd2FzTG9ja2VkICE9PSBzd2lwZXIuaXNMb2NrZWQpIHtcbiAgICAgIHN3aXBlci5pc0VuZCA9IGZhbHNlO1xuICAgICAgc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoZWNrT3ZlcmZsb3ckMSA9IHsgY2hlY2tPdmVyZmxvdzogY2hlY2tPdmVyZmxvdyB9O1xuXG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBpbml0OiB0cnVlLFxuICAgIGRpcmVjdGlvbjogJ2hvcml6b250YWwnLFxuICAgIHRvdWNoRXZlbnRzVGFyZ2V0OiAnY29udGFpbmVyJyxcbiAgICBpbml0aWFsU2xpZGU6IDAsXG4gICAgc3BlZWQ6IDMwMCxcbiAgICAvL1xuICAgIHByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbjogZmFsc2UsXG5cbiAgICAvLyBUbyBzdXBwb3J0IGlPUydzIHN3aXBlLXRvLWdvLWJhY2sgZ2VzdHVyZSAod2hlbiBiZWluZyB1c2VkIGluLWFwcCwgd2l0aCBVSVdlYlZpZXcpLlxuICAgIGVkZ2VTd2lwZURldGVjdGlvbjogZmFsc2UsXG4gICAgZWRnZVN3aXBlVGhyZXNob2xkOiAyMCxcblxuICAgIC8vIEZyZWUgbW9kZVxuICAgIGZyZWVNb2RlOiBmYWxzZSxcbiAgICBmcmVlTW9kZU1vbWVudHVtOiB0cnVlLFxuICAgIGZyZWVNb2RlTW9tZW50dW1SYXRpbzogMSxcbiAgICBmcmVlTW9kZU1vbWVudHVtQm91bmNlOiB0cnVlLFxuICAgIGZyZWVNb2RlTW9tZW50dW1Cb3VuY2VSYXRpbzogMSxcbiAgICBmcmVlTW9kZU1vbWVudHVtVmVsb2NpdHlSYXRpbzogMSxcbiAgICBmcmVlTW9kZVN0aWNreTogZmFsc2UsXG4gICAgZnJlZU1vZGVNaW5pbXVtVmVsb2NpdHk6IDAuMDIsXG5cbiAgICAvLyBBdXRvaGVpZ2h0XG4gICAgYXV0b0hlaWdodDogZmFsc2UsXG5cbiAgICAvLyBTZXQgd3JhcHBlciB3aWR0aFxuICAgIHNldFdyYXBwZXJTaXplOiBmYWxzZSxcblxuICAgIC8vIFZpcnR1YWwgVHJhbnNsYXRlXG4gICAgdmlydHVhbFRyYW5zbGF0ZTogZmFsc2UsXG5cbiAgICAvLyBFZmZlY3RzXG4gICAgZWZmZWN0OiAnc2xpZGUnLCAvLyAnc2xpZGUnIG9yICdmYWRlJyBvciAnY3ViZScgb3IgJ2NvdmVyZmxvdycgb3IgJ2ZsaXAnXG5cbiAgICAvLyBCcmVha3BvaW50c1xuICAgIGJyZWFrcG9pbnRzOiB1bmRlZmluZWQsXG4gICAgYnJlYWtwb2ludHNJbnZlcnNlOiBmYWxzZSxcblxuICAgIC8vIFNsaWRlcyBncmlkXG4gICAgc3BhY2VCZXR3ZWVuOiAwLFxuICAgIHNsaWRlc1BlclZpZXc6IDEsXG4gICAgc2xpZGVzUGVyQ29sdW1uOiAxLFxuICAgIHNsaWRlc1BlckNvbHVtbkZpbGw6ICdjb2x1bW4nLFxuICAgIHNsaWRlc1Blckdyb3VwOiAxLFxuICAgIGNlbnRlcmVkU2xpZGVzOiBmYWxzZSxcbiAgICBzbGlkZXNPZmZzZXRCZWZvcmU6IDAsIC8vIGluIHB4XG4gICAgc2xpZGVzT2Zmc2V0QWZ0ZXI6IDAsIC8vIGluIHB4XG4gICAgbm9ybWFsaXplU2xpZGVJbmRleDogdHJ1ZSxcbiAgICBjZW50ZXJJbnN1ZmZpY2llbnRTbGlkZXM6IGZhbHNlLFxuXG4gICAgLy8gRGlzYWJsZSBzd2lwZXIgYW5kIGhpZGUgbmF2aWdhdGlvbiB3aGVuIGNvbnRhaW5lciBub3Qgb3ZlcmZsb3dcbiAgICB3YXRjaE92ZXJmbG93OiBmYWxzZSxcblxuICAgIC8vIFJvdW5kIGxlbmd0aFxuICAgIHJvdW5kTGVuZ3RoczogZmFsc2UsXG5cbiAgICAvLyBUb3VjaGVzXG4gICAgdG91Y2hSYXRpbzogMSxcbiAgICB0b3VjaEFuZ2xlOiA0NSxcbiAgICBzaW11bGF0ZVRvdWNoOiB0cnVlLFxuICAgIHNob3J0U3dpcGVzOiB0cnVlLFxuICAgIGxvbmdTd2lwZXM6IHRydWUsXG4gICAgbG9uZ1N3aXBlc1JhdGlvOiAwLjUsXG4gICAgbG9uZ1N3aXBlc01zOiAzMDAsXG4gICAgZm9sbG93RmluZ2VyOiB0cnVlLFxuICAgIGFsbG93VG91Y2hNb3ZlOiB0cnVlLFxuICAgIHRocmVzaG9sZDogMCxcbiAgICB0b3VjaE1vdmVTdG9wUHJvcGFnYXRpb246IHRydWUsXG4gICAgdG91Y2hTdGFydFByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHRvdWNoU3RhcnRGb3JjZVByZXZlbnREZWZhdWx0OiBmYWxzZSxcbiAgICB0b3VjaFJlbGVhc2VPbkVkZ2VzOiBmYWxzZSxcblxuICAgIC8vIFVuaXF1ZSBOYXZpZ2F0aW9uIEVsZW1lbnRzXG4gICAgdW5pcXVlTmF2RWxlbWVudHM6IHRydWUsXG5cbiAgICAvLyBSZXNpc3RhbmNlXG4gICAgcmVzaXN0YW5jZTogdHJ1ZSxcbiAgICByZXNpc3RhbmNlUmF0aW86IDAuODUsXG5cbiAgICAvLyBQcm9ncmVzc1xuICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IGZhbHNlLFxuICAgIHdhdGNoU2xpZGVzVmlzaWJpbGl0eTogZmFsc2UsXG5cbiAgICAvLyBDdXJzb3JcbiAgICBncmFiQ3Vyc29yOiBmYWxzZSxcblxuICAgIC8vIENsaWNrc1xuICAgIHByZXZlbnRDbGlja3M6IHRydWUsXG4gICAgcHJldmVudENsaWNrc1Byb3BhZ2F0aW9uOiB0cnVlLFxuICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuXG4gICAgLy8gSW1hZ2VzXG4gICAgcHJlbG9hZEltYWdlczogdHJ1ZSxcbiAgICB1cGRhdGVPbkltYWdlc1JlYWR5OiB0cnVlLFxuXG4gICAgLy8gbG9vcFxuICAgIGxvb3A6IGZhbHNlLFxuICAgIGxvb3BBZGRpdGlvbmFsU2xpZGVzOiAwLFxuICAgIGxvb3BlZFNsaWRlczogbnVsbCxcbiAgICBsb29wRmlsbEdyb3VwV2l0aEJsYW5rOiBmYWxzZSxcblxuICAgIC8vIFN3aXBpbmcvbm8gc3dpcGluZ1xuICAgIGFsbG93U2xpZGVQcmV2OiB0cnVlLFxuICAgIGFsbG93U2xpZGVOZXh0OiB0cnVlLFxuICAgIHN3aXBlSGFuZGxlcjogbnVsbCwgLy8gJy5zd2lwZS1oYW5kbGVyJyxcbiAgICBub1N3aXBpbmc6IHRydWUsXG4gICAgbm9Td2lwaW5nQ2xhc3M6ICdzd2lwZXItbm8tc3dpcGluZycsXG4gICAgbm9Td2lwaW5nU2VsZWN0b3I6IG51bGwsXG5cbiAgICAvLyBQYXNzaXZlIExpc3RlbmVyc1xuICAgIHBhc3NpdmVMaXN0ZW5lcnM6IHRydWUsXG5cbiAgICAvLyBOU1xuICAgIGNvbnRhaW5lck1vZGlmaWVyQ2xhc3M6ICdzd2lwZXItY29udGFpbmVyLScsIC8vIE5FV1xuICAgIHNsaWRlQ2xhc3M6ICdzd2lwZXItc2xpZGUnLFxuICAgIHNsaWRlQmxhbmtDbGFzczogJ3N3aXBlci1zbGlkZS1pbnZpc2libGUtYmxhbmsnLFxuICAgIHNsaWRlQWN0aXZlQ2xhc3M6ICdzd2lwZXItc2xpZGUtYWN0aXZlJyxcbiAgICBzbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzOiAnc3dpcGVyLXNsaWRlLWR1cGxpY2F0ZS1hY3RpdmUnLFxuICAgIHNsaWRlVmlzaWJsZUNsYXNzOiAnc3dpcGVyLXNsaWRlLXZpc2libGUnLFxuICAgIHNsaWRlRHVwbGljYXRlQ2xhc3M6ICdzd2lwZXItc2xpZGUtZHVwbGljYXRlJyxcbiAgICBzbGlkZU5leHRDbGFzczogJ3N3aXBlci1zbGlkZS1uZXh0JyxcbiAgICBzbGlkZUR1cGxpY2F0ZU5leHRDbGFzczogJ3N3aXBlci1zbGlkZS1kdXBsaWNhdGUtbmV4dCcsXG4gICAgc2xpZGVQcmV2Q2xhc3M6ICdzd2lwZXItc2xpZGUtcHJldicsXG4gICAgc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3M6ICdzd2lwZXItc2xpZGUtZHVwbGljYXRlLXByZXYnLFxuICAgIHdyYXBwZXJDbGFzczogJ3N3aXBlci13cmFwcGVyJyxcblxuICAgIC8vIENhbGxiYWNrc1xuICAgIHJ1bkNhbGxiYWNrc09uSW5pdDogdHJ1ZSxcbiAgfTtcblxuICAvKiBlc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246IFwib2ZmXCIgKi9cblxuICB2YXIgcHJvdG90eXBlcyA9IHtcbiAgICB1cGRhdGU6IHVwZGF0ZSxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSxcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uJDEsXG4gICAgc2xpZGU6IHNsaWRlLFxuICAgIGxvb3A6IGxvb3AsXG4gICAgZ3JhYkN1cnNvcjogZ3JhYkN1cnNvcixcbiAgICBtYW5pcHVsYXRpb246IG1hbmlwdWxhdGlvbixcbiAgICBldmVudHM6IGV2ZW50cyxcbiAgICBicmVha3BvaW50czogYnJlYWtwb2ludHMsXG4gICAgY2hlY2tPdmVyZmxvdzogY2hlY2tPdmVyZmxvdyQxLFxuICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgaW1hZ2VzOiBpbWFnZXMsXG4gIH07XG5cbiAgdmFyIGV4dGVuZGVkRGVmYXVsdHMgPSB7fTtcblxuICB2YXIgU3dpcGVyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3dpcGVyQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiBTd2lwZXIoKSB7XG4gICAgICB2YXIgYXNzaWduO1xuXG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcbiAgICAgIHZhciBlbDtcbiAgICAgIHZhciBwYXJhbXM7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXS5jb25zdHJ1Y3RvciAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgcGFyYW1zID0gYXJnc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChhc3NpZ24gPSBhcmdzLCBlbCA9IGFzc2lnblswXSwgcGFyYW1zID0gYXNzaWduWzFdKTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyYW1zKSB7IHBhcmFtcyA9IHt9OyB9XG5cbiAgICAgIHBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICAgIGlmIChlbCAmJiAhcGFyYW1zLmVsKSB7IHBhcmFtcy5lbCA9IGVsOyB9XG5cbiAgICAgIFN3aXBlckNsYXNzLmNhbGwodGhpcywgcGFyYW1zKTtcblxuICAgICAgT2JqZWN0LmtleXMocHJvdG90eXBlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvdG90eXBlR3JvdXApIHtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvdG90eXBlc1twcm90b3R5cGVHcm91cF0pLmZvckVhY2goZnVuY3Rpb24gKHByb3RvTWV0aG9kKSB7XG4gICAgICAgICAgaWYgKCFTd2lwZXIucHJvdG90eXBlW3Byb3RvTWV0aG9kXSkge1xuICAgICAgICAgICAgU3dpcGVyLnByb3RvdHlwZVtwcm90b01ldGhvZF0gPSBwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXVtwcm90b01ldGhvZF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTd2lwZXIgSW5zdGFuY2VcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBzd2lwZXIubW9kdWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc3dpcGVyLm1vZHVsZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKHN3aXBlci5tb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBzd2lwZXIubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgICAgaWYgKG1vZHVsZS5wYXJhbXMpIHtcbiAgICAgICAgICB2YXIgbW9kdWxlUGFyYW1OYW1lID0gT2JqZWN0LmtleXMobW9kdWxlLnBhcmFtcylbMF07XG4gICAgICAgICAgdmFyIG1vZHVsZVBhcmFtcyA9IG1vZHVsZS5wYXJhbXNbbW9kdWxlUGFyYW1OYW1lXTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZVBhcmFtcyAhPT0gJ29iamVjdCcgfHwgbW9kdWxlUGFyYW1zID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmICghKG1vZHVsZVBhcmFtTmFtZSBpbiBwYXJhbXMgJiYgJ2VuYWJsZWQnIGluIG1vZHVsZVBhcmFtcykpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgaWYgKHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHsgZW5hYmxlZDogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0gPT09ICdvYmplY3QnXG4gICAgICAgICAgICAmJiAhKCdlbmFibGVkJyBpbiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdKSB7IHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID0geyBlbmFibGVkOiBmYWxzZSB9OyB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBFeHRlbmQgZGVmYXVsdHMgd2l0aCBtb2R1bGVzIHBhcmFtc1xuICAgICAgdmFyIHN3aXBlclBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgZGVmYXVsdHMpO1xuICAgICAgc3dpcGVyLnVzZU1vZHVsZXNQYXJhbXMoc3dpcGVyUGFyYW1zKTtcblxuICAgICAgLy8gRXh0ZW5kIGRlZmF1bHRzIHdpdGggcGFzc2VkIHBhcmFtc1xuICAgICAgc3dpcGVyLnBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgc3dpcGVyUGFyYW1zLCBleHRlbmRlZERlZmF1bHRzLCBwYXJhbXMpO1xuICAgICAgc3dpcGVyLm9yaWdpbmFsUGFyYW1zID0gVXRpbHMuZXh0ZW5kKHt9LCBzd2lwZXIucGFyYW1zKTtcbiAgICAgIHN3aXBlci5wYXNzZWRQYXJhbXMgPSBVdGlscy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgICAgIC8vIFNhdmUgRG9tIGxpYlxuICAgICAgc3dpcGVyLiQgPSAkO1xuXG4gICAgICAvLyBGaW5kIGVsXG4gICAgICB2YXIgJGVsID0gJChzd2lwZXIucGFyYW1zLmVsKTtcbiAgICAgIGVsID0gJGVsWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICgkZWwubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgc3dpcGVycyA9IFtdO1xuICAgICAgICAkZWwuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGNvbnRhaW5lckVsKSB7XG4gICAgICAgICAgdmFyIG5ld1BhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgcGFyYW1zLCB7IGVsOiBjb250YWluZXJFbCB9KTtcbiAgICAgICAgICBzd2lwZXJzLnB1c2gobmV3IFN3aXBlcihuZXdQYXJhbXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzd2lwZXJzO1xuICAgICAgfVxuXG4gICAgICBlbC5zd2lwZXIgPSBzd2lwZXI7XG4gICAgICAkZWwuZGF0YSgnc3dpcGVyJywgc3dpcGVyKTtcblxuICAgICAgLy8gRmluZCBXcmFwcGVyXG4gICAgICB2YXIgJHdyYXBwZXJFbCA9ICRlbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy53cmFwcGVyQ2xhc3MpKSk7XG5cbiAgICAgIC8vIEV4dGVuZCBTd2lwZXJcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgJGVsOiAkZWwsXG4gICAgICAgIGVsOiBlbCxcbiAgICAgICAgJHdyYXBwZXJFbDogJHdyYXBwZXJFbCxcbiAgICAgICAgd3JhcHBlckVsOiAkd3JhcHBlckVsWzBdLFxuXG4gICAgICAgIC8vIENsYXNzZXNcbiAgICAgICAgY2xhc3NOYW1lczogW10sXG5cbiAgICAgICAgLy8gU2xpZGVzXG4gICAgICAgIHNsaWRlczogJCgpLFxuICAgICAgICBzbGlkZXNHcmlkOiBbXSxcbiAgICAgICAgc25hcEdyaWQ6IFtdLFxuICAgICAgICBzbGlkZXNTaXplc0dyaWQ6IFtdLFxuXG4gICAgICAgIC8vIGlzRGlyZWN0aW9uXG4gICAgICAgIGlzSG9yaXpvbnRhbDogZnVuY3Rpb24gaXNIb3Jpem9udGFsKCkge1xuICAgICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICB9LFxuICAgICAgICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUlRMXG4gICAgICAgIHJ0bDogKGVsLmRpci50b0xvd2VyQ2FzZSgpID09PSAncnRsJyB8fCAkZWwuY3NzKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcpLFxuICAgICAgICBydGxUcmFuc2xhdGU6IHN3aXBlci5wYXJhbXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgKGVsLmRpci50b0xvd2VyQ2FzZSgpID09PSAncnRsJyB8fCAkZWwuY3NzKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcpLFxuICAgICAgICB3cm9uZ1JUTDogJHdyYXBwZXJFbC5jc3MoJ2Rpc3BsYXknKSA9PT0gJy13ZWJraXQtYm94JyxcblxuICAgICAgICAvLyBJbmRleGVzXG4gICAgICAgIGFjdGl2ZUluZGV4OiAwLFxuICAgICAgICByZWFsSW5kZXg6IDAsXG5cbiAgICAgICAgLy9cbiAgICAgICAgaXNCZWdpbm5pbmc6IHRydWUsXG4gICAgICAgIGlzRW5kOiBmYWxzZSxcblxuICAgICAgICAvLyBQcm9wc1xuICAgICAgICB0cmFuc2xhdGU6IDAsXG4gICAgICAgIHByZXZpb3VzVHJhbnNsYXRlOiAwLFxuICAgICAgICBwcm9ncmVzczogMCxcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG5cbiAgICAgICAgLy8gTG9ja3NcbiAgICAgICAgYWxsb3dTbGlkZU5leHQ6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZU5leHQsXG4gICAgICAgIGFsbG93U2xpZGVQcmV2OiBzd2lwZXIucGFyYW1zLmFsbG93U2xpZGVQcmV2LFxuXG4gICAgICAgIC8vIFRvdWNoIEV2ZW50c1xuICAgICAgICB0b3VjaEV2ZW50czogKGZ1bmN0aW9uIHRvdWNoRXZlbnRzKCkge1xuICAgICAgICAgIHZhciB0b3VjaCA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnXTtcbiAgICAgICAgICB2YXIgZGVza3RvcCA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJ107XG4gICAgICAgICAgaWYgKFN1cHBvcnQucG9pbnRlckV2ZW50cykge1xuICAgICAgICAgICAgZGVza3RvcCA9IFsncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJ107XG4gICAgICAgICAgfSBlbHNlIGlmIChTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykge1xuICAgICAgICAgICAgZGVza3RvcCA9IFsnTVNQb2ludGVyRG93bicsICdNU1BvaW50ZXJNb3ZlJywgJ01TUG9pbnRlclVwJ107XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXBlci50b3VjaEV2ZW50c1RvdWNoID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHRvdWNoWzBdLFxuICAgICAgICAgICAgbW92ZTogdG91Y2hbMV0sXG4gICAgICAgICAgICBlbmQ6IHRvdWNoWzJdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGVza3RvcCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBkZXNrdG9wWzBdLFxuICAgICAgICAgICAgbW92ZTogZGVza3RvcFsxXSxcbiAgICAgICAgICAgIGVuZDogZGVza3RvcFsyXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBTdXBwb3J0LnRvdWNoIHx8ICFzd2lwZXIucGFyYW1zLnNpbXVsYXRlVG91Y2ggPyBzd2lwZXIudG91Y2hFdmVudHNUb3VjaCA6IHN3aXBlci50b3VjaEV2ZW50c0Rlc2t0b3A7XG4gICAgICAgIH0oKSksXG4gICAgICAgIHRvdWNoRXZlbnRzRGF0YToge1xuICAgICAgICAgIGlzVG91Y2hlZDogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzTW92ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB1bmRlZmluZWQsXG4gICAgICAgICAgdG91Y2hTdGFydFRpbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc1Njcm9sbGluZzogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1cnJlbnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFRyYW5zbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGFsbG93VGhyZXNob2xkTW92ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIC8vIEZvcm0gZWxlbWVudHMgdG8gbWF0Y2hcbiAgICAgICAgICBmb3JtRWxlbWVudHM6ICdpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhLCBidXR0b24sIHZpZGVvJyxcbiAgICAgICAgICAvLyBMYXN0IGNsaWNrIHRpbWVcbiAgICAgICAgICBsYXN0Q2xpY2tUaW1lOiBVdGlscy5ub3coKSxcbiAgICAgICAgICBjbGlja1RpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAvLyBWZWxvY2l0aWVzXG4gICAgICAgICAgdmVsb2NpdGllczogW10sXG4gICAgICAgICAgYWxsb3dNb21lbnR1bUJvdW5jZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzVG91Y2hFdmVudDogdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXJ0TW92aW5nOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gQ2xpY2tzXG4gICAgICAgIGFsbG93Q2xpY2s6IHRydWUsXG5cbiAgICAgICAgLy8gVG91Y2hlc1xuICAgICAgICBhbGxvd1RvdWNoTW92ZTogc3dpcGVyLnBhcmFtcy5hbGxvd1RvdWNoTW92ZSxcblxuICAgICAgICB0b3VjaGVzOiB7XG4gICAgICAgICAgc3RhcnRYOiAwLFxuICAgICAgICAgIHN0YXJ0WTogMCxcbiAgICAgICAgICBjdXJyZW50WDogMCxcbiAgICAgICAgICBjdXJyZW50WTogMCxcbiAgICAgICAgICBkaWZmOiAwLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEltYWdlc1xuICAgICAgICBpbWFnZXNUb0xvYWQ6IFtdLFxuICAgICAgICBpbWFnZXNMb2FkZWQ6IDAsXG5cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbnN0YWxsIE1vZHVsZXNcbiAgICAgIHN3aXBlci51c2VNb2R1bGVzKCk7XG5cbiAgICAgIC8vIEluaXRcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmluaXQpIHtcbiAgICAgICAgc3dpcGVyLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGFwcCBpbnN0YW5jZVxuICAgICAgcmV0dXJuIHN3aXBlcjtcbiAgICB9XG5cbiAgICBpZiAoIFN3aXBlckNsYXNzICkgU3dpcGVyLl9fcHJvdG9fXyA9IFN3aXBlckNsYXNzO1xuICAgIFN3aXBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTd2lwZXJDbGFzcyAmJiBTd2lwZXJDbGFzcy5wcm90b3R5cGUgKTtcbiAgICBTd2lwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3dpcGVyO1xuXG4gICAgdmFyIHN0YXRpY0FjY2Vzc29ycyA9IHsgZXh0ZW5kZWREZWZhdWx0czogeyBjb25maWd1cmFibGU6IHRydWUgfSxkZWZhdWx0czogeyBjb25maWd1cmFibGU6IHRydWUgfSxDbGFzczogeyBjb25maWd1cmFibGU6IHRydWUgfSwkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLnNsaWRlc1BlclZpZXdEeW5hbWljID0gZnVuY3Rpb24gc2xpZGVzUGVyVmlld0R5bmFtaWMgKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgdmFyIHNsaWRlc0dyaWQgPSBzd2lwZXIuc2xpZGVzR3JpZDtcbiAgICAgIHZhciBzd2lwZXJTaXplID0gc3dpcGVyLnNpemU7XG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICB2YXIgc3B2ID0gMTtcbiAgICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgdmFyIHNsaWRlU2l6ZSA9IHNsaWRlc1thY3RpdmVJbmRleF0uc3dpcGVyU2xpZGVTaXplO1xuICAgICAgICB2YXIgYnJlYWtMb29wO1xuICAgICAgICBmb3IgKHZhciBpID0gYWN0aXZlSW5kZXggKyAxOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXSAmJiAhYnJlYWtMb29wKSB7XG4gICAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2ldLnN3aXBlclNsaWRlU2l6ZTtcbiAgICAgICAgICAgIHNwdiArPSAxO1xuICAgICAgICAgICAgaWYgKHNsaWRlU2l6ZSA+IHN3aXBlclNpemUpIHsgYnJlYWtMb29wID0gdHJ1ZTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpJDEgPSBhY3RpdmVJbmRleCAtIDE7IGkkMSA+PSAwOyBpJDEgLT0gMSkge1xuICAgICAgICAgIGlmIChzbGlkZXNbaSQxXSAmJiAhYnJlYWtMb29wKSB7XG4gICAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2kkMV0uc3dpcGVyU2xpZGVTaXplO1xuICAgICAgICAgICAgc3B2ICs9IDE7XG4gICAgICAgICAgICBpZiAoc2xpZGVTaXplID4gc3dpcGVyU2l6ZSkgeyBicmVha0xvb3AgPSB0cnVlOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpJDIgPSBhY3RpdmVJbmRleCArIDE7IGkkMiA8IHNsaWRlcy5sZW5ndGg7IGkkMiArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc0dyaWRbaSQyXSAtIHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIDwgc3dpcGVyU2l6ZSkge1xuICAgICAgICAgICAgc3B2ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3B2O1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIC8vIEJyZWFrcG9pbnRzXG4gICAgICBpZiAocGFyYW1zLmJyZWFrcG9pbnRzKSB7XG4gICAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuXG4gICAgICBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlICogLTEgOiBzd2lwZXIudHJhbnNsYXRlO1xuICAgICAgICB2YXIgbmV3VHJhbnNsYXRlID0gTWF0aC5taW4oTWF0aC5tYXgodHJhbnNsYXRlVmFsdWUsIHN3aXBlci5tYXhUcmFuc2xhdGUoKSksIHN3aXBlci5taW5UcmFuc2xhdGUoKSk7XG4gICAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUobmV3VHJhbnNsYXRlKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNsYXRlZDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICAgIHNldFRyYW5zbGF0ZSgpO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZUF1dG9IZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyB8fCBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgICB0cmFuc2xhdGVkID0gc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNsYXRlZCA9IHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgMCwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdHJhbnNsYXRlZCkge1xuICAgICAgICAgIHNldFRyYW5zbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc25hcEdyaWQgIT09IHN3aXBlci5zbmFwR3JpZCkge1xuICAgICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ3VwZGF0ZScpO1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLmNoYW5nZURpcmVjdGlvbiA9IGZ1bmN0aW9uIGNoYW5nZURpcmVjdGlvbiAobmV3RGlyZWN0aW9uLCBuZWVkVXBkYXRlKSB7XG4gICAgICBpZiAoIG5lZWRVcGRhdGUgPT09IHZvaWQgMCApIG5lZWRVcGRhdGUgPSB0cnVlO1xuXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50RGlyZWN0aW9uID0gc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb247XG4gICAgICBpZiAoIW5ld0RpcmVjdGlvbikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgbmV3RGlyZWN0aW9uID0gY3VycmVudERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgIH1cbiAgICAgIGlmICgobmV3RGlyZWN0aW9uID09PSBjdXJyZW50RGlyZWN0aW9uKSB8fCAobmV3RGlyZWN0aW9uICE9PSAnaG9yaXpvbnRhbCcgJiYgbmV3RGlyZWN0aW9uICE9PSAndmVydGljYWwnKSkge1xuICAgICAgICByZXR1cm4gc3dpcGVyO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIuJGVsXG4gICAgICAgIC5yZW1vdmVDbGFzcygoXCJcIiArIChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgY3VycmVudERpcmVjdGlvbiArIFwiIHdwOC1cIiArIGN1cnJlbnREaXJlY3Rpb24pKVxuICAgICAgICAuYWRkQ2xhc3MoKFwiXCIgKyAoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIG5ld0RpcmVjdGlvbikpO1xuXG4gICAgICBpZiAoKEJyb3dzZXIuaXNJRSB8fCBCcm93c2VyLmlzRWRnZSkgJiYgKFN1cHBvcnQucG9pbnRlckV2ZW50cyB8fCBTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykpIHtcbiAgICAgICAgc3dpcGVyLiRlbC5hZGRDbGFzcygoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcIndwOC1cIiArIG5ld0RpcmVjdGlvbikpO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjtcblxuICAgICAgc3dpcGVyLnNsaWRlcy5lYWNoKGZ1bmN0aW9uIChzbGlkZUluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgIGlmIChuZXdEaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICBzbGlkZUVsLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2xpZGVFbC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHN3aXBlci5lbWl0KCdjaGFuZ2VEaXJlY3Rpb24nKTtcbiAgICAgIGlmIChuZWVkVXBkYXRlKSB7IHN3aXBlci51cGRhdGUoKTsgfVxuXG4gICAgICByZXR1cm4gc3dpcGVyO1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiBpbml0ICgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCkgeyByZXR1cm47IH1cblxuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZUluaXQnKTtcblxuICAgICAgLy8gU2V0IGJyZWFrcG9pbnRcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmJyZWFrcG9pbnRzKSB7XG4gICAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBDbGFzc2VzXG4gICAgICBzd2lwZXIuYWRkQ2xhc3NlcygpO1xuXG4gICAgICAvLyBDcmVhdGUgbG9vcFxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgc2l6ZVxuICAgICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcblxuICAgICAgLy8gVXBkYXRlIHNsaWRlc1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7XG4gICAgICAgIHN3aXBlci5jaGVja092ZXJmbG93KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBHcmFiIEN1cnNvclxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5wcmVsb2FkSW1hZ2VzKSB7XG4gICAgICAgIHN3aXBlci5wcmVsb2FkSW1hZ2VzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNsaWRlIFRvIEluaXRpYWwgU2xpZGVcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnBhcmFtcy5pbml0aWFsU2xpZGUgKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBzd2lwZXIucGFyYW1zLnJ1bkNhbGxiYWNrc09uSW5pdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucGFyYW1zLmluaXRpYWxTbGlkZSwgMCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRhY2ggZXZlbnRzXG4gICAgICBzd2lwZXIuYXR0YWNoRXZlbnRzKCk7XG5cbiAgICAgIC8vIEluaXQgRmxhZ1xuICAgICAgc3dpcGVyLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgLy8gRW1pdFxuICAgICAgc3dpcGVyLmVtaXQoJ2luaXQnKTtcbiAgICB9O1xuXG4gICAgU3dpcGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoZGVsZXRlSW5zdGFuY2UsIGNsZWFuU3R5bGVzKSB7XG4gICAgICBpZiAoIGRlbGV0ZUluc3RhbmNlID09PSB2b2lkIDAgKSBkZWxldGVJbnN0YW5jZSA9IHRydWU7XG4gICAgICBpZiAoIGNsZWFuU3R5bGVzID09PSB2b2lkIDAgKSBjbGVhblN0eWxlcyA9IHRydWU7XG5cbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcblxuICAgICAgaWYgKHR5cGVvZiBzd2lwZXIucGFyYW1zID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIuZW1pdCgnYmVmb3JlRGVzdHJveScpO1xuXG4gICAgICAvLyBJbml0IEZsYWdcbiAgICAgIHN3aXBlci5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAvLyBEZXRhY2ggZXZlbnRzXG4gICAgICBzd2lwZXIuZGV0YWNoRXZlbnRzKCk7XG5cbiAgICAgIC8vIERlc3Ryb3kgbG9vcFxuICAgICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhbnVwIHN0eWxlc1xuICAgICAgaWYgKGNsZWFuU3R5bGVzKSB7XG4gICAgICAgIHN3aXBlci5yZW1vdmVDbGFzc2VzKCk7XG4gICAgICAgICRlbC5yZW1vdmVBdHRyKCdzdHlsZScpO1xuICAgICAgICAkd3JhcHBlckVsLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG4gICAgICAgIGlmIChzbGlkZXMgJiYgc2xpZGVzLmxlbmd0aCkge1xuICAgICAgICAgIHNsaWRlc1xuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFtcbiAgICAgICAgICAgICAgcGFyYW1zLnNsaWRlVmlzaWJsZUNsYXNzLFxuICAgICAgICAgICAgICBwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcyxcbiAgICAgICAgICAgICAgcGFyYW1zLnNsaWRlTmV4dENsYXNzLFxuICAgICAgICAgICAgICBwYXJhbXMuc2xpZGVQcmV2Q2xhc3MgXS5qb2luKCcgJykpXG4gICAgICAgICAgICAucmVtb3ZlQXR0cignc3R5bGUnKVxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JylcbiAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXN3aXBlci1jb2x1bW4nKVxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXJvdycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci5lbWl0KCdkZXN0cm95Jyk7XG5cbiAgICAgIC8vIERldGFjaCBlbWl0dGVyIGV2ZW50c1xuICAgICAgT2JqZWN0LmtleXMoc3dpcGVyLmV2ZW50c0xpc3RlbmVycykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHN3aXBlci5vZmYoZXZlbnROYW1lKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVsZXRlSW5zdGFuY2UgIT09IGZhbHNlKSB7XG4gICAgICAgIHN3aXBlci4kZWxbMF0uc3dpcGVyID0gbnVsbDtcbiAgICAgICAgc3dpcGVyLiRlbC5kYXRhKCdzd2lwZXInLCBudWxsKTtcbiAgICAgICAgVXRpbHMuZGVsZXRlUHJvcHMoc3dpcGVyKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgU3dpcGVyLmV4dGVuZERlZmF1bHRzID0gZnVuY3Rpb24gZXh0ZW5kRGVmYXVsdHMgKG5ld0RlZmF1bHRzKSB7XG4gICAgICBVdGlscy5leHRlbmQoZXh0ZW5kZWREZWZhdWx0cywgbmV3RGVmYXVsdHMpO1xuICAgIH07XG5cbiAgICBzdGF0aWNBY2Nlc3NvcnMuZXh0ZW5kZWREZWZhdWx0cy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZXh0ZW5kZWREZWZhdWx0cztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLmRlZmF1bHRzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLkNsYXNzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBTd2lwZXJDbGFzcztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLiQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICQ7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTd2lwZXIsIHN0YXRpY0FjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIFN3aXBlcjtcbiAgfShTd2lwZXJDbGFzcykpO1xuXG4gIHZhciBEZXZpY2UkMSA9IHtcbiAgICBuYW1lOiAnZGV2aWNlJyxcbiAgICBwcm90bzoge1xuICAgICAgZGV2aWNlOiBEZXZpY2UsXG4gICAgfSxcbiAgICBzdGF0aWM6IHtcbiAgICAgIGRldmljZTogRGV2aWNlLFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFN1cHBvcnQkMSA9IHtcbiAgICBuYW1lOiAnc3VwcG9ydCcsXG4gICAgcHJvdG86IHtcbiAgICAgIHN1cHBvcnQ6IFN1cHBvcnQsXG4gICAgfSxcbiAgICBzdGF0aWM6IHtcbiAgICAgIHN1cHBvcnQ6IFN1cHBvcnQsXG4gICAgfSxcbiAgfTtcblxuICB2YXIgQnJvd3NlciQxID0ge1xuICAgIG5hbWU6ICdicm93c2VyJyxcbiAgICBwcm90bzoge1xuICAgICAgYnJvd3NlcjogQnJvd3NlcixcbiAgICB9LFxuICAgIHN0YXRpYzoge1xuICAgICAgYnJvd3NlcjogQnJvd3NlcixcbiAgICB9LFxuICB9O1xuXG4gIHZhciBSZXNpemUgPSB7XG4gICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlcjogZnVuY3Rpb24gcmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5pbml0aWFsaXplZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdiZWZvcmVSZXNpemUnKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdyZXNpemUnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlcjogZnVuY3Rpb24gb3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmluaXRpYWxpemVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ29yaWVudGF0aW9uY2hhbmdlJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICAvLyBFbWl0IHJlc2l6ZVxuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3dpcGVyLnJlc2l6ZS5yZXNpemVIYW5kbGVyKTtcblxuICAgICAgICAvLyBFbWl0IG9yaWVudGF0aW9uY2hhbmdlXG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHN3aXBlci5yZXNpemUub3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN3aXBlci5yZXNpemUucmVzaXplSGFuZGxlcik7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHN3aXBlci5yZXNpemUub3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgT2JzZXJ2ZXIgPSB7XG4gICAgZnVuYzogd2luLk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luLldlYmtpdE11dGF0aW9uT2JzZXJ2ZXIsXG4gICAgYXR0YWNoOiBmdW5jdGlvbiBhdHRhY2godGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICAgIHZhciBPYnNlcnZlckZ1bmMgPSBPYnNlcnZlci5mdW5jO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE9ic2VydmVyRnVuYyhmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgIC8vIFRoZSBvYnNlcnZlclVwZGF0ZSBldmVudCBzaG91bGQgb25seSBiZSB0cmlnZ2VyZWRcbiAgICAgICAgLy8gb25jZSBkZXNwaXRlIHRoZSBudW1iZXIgb2YgbXV0YXRpb25zLiAgQWRkaXRpb25hbFxuICAgICAgICAvLyB0cmlnZ2VycyBhcmUgcmVkdW5kYW50IGFuZCBhcmUgdmVyeSBjb3N0bHlcbiAgICAgICAgaWYgKG11dGF0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnb2JzZXJ2ZXJVcGRhdGUnLCBtdXRhdGlvbnNbMF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2JzZXJ2ZXJVcGRhdGUgPSBmdW5jdGlvbiBvYnNlcnZlclVwZGF0ZSgpIHtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnb2JzZXJ2ZXJVcGRhdGUnLCBtdXRhdGlvbnNbMF0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgd2luLnJlcXVlc3RBbmltYXRpb25GcmFtZShvYnNlcnZlclVwZGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luLnNldFRpbWVvdXQob2JzZXJ2ZXJVcGRhdGUsIDApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHlwZW9mIG9wdGlvbnMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgICBjaGlsZExpc3Q6IHR5cGVvZiBvcHRpb25zLmNoaWxkTGlzdCA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5jaGlsZExpc3QsXG4gICAgICAgIGNoYXJhY3RlckRhdGE6IHR5cGVvZiBvcHRpb25zLmNoYXJhY3RlckRhdGEgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IG9wdGlvbnMuY2hhcmFjdGVyRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICBzd2lwZXIub2JzZXJ2ZXIub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFTdXBwb3J0Lm9ic2VydmVyIHx8ICFzd2lwZXIucGFyYW1zLm9ic2VydmVyKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMub2JzZXJ2ZVBhcmVudHMpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lclBhcmVudHMgPSBzd2lwZXIuJGVsLnBhcmVudHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250YWluZXJQYXJlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgc3dpcGVyLm9ic2VydmVyLmF0dGFjaChjb250YWluZXJQYXJlbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT2JzZXJ2ZSBjb250YWluZXJcbiAgICAgIHN3aXBlci5vYnNlcnZlci5hdHRhY2goc3dpcGVyLiRlbFswXSwgeyBjaGlsZExpc3Q6IHN3aXBlci5wYXJhbXMub2JzZXJ2ZVNsaWRlQ2hpbGRyZW4gfSk7XG5cbiAgICAgIC8vIE9ic2VydmUgd3JhcHBlclxuICAgICAgc3dpcGVyLm9ic2VydmVyLmF0dGFjaChzd2lwZXIuJHdyYXBwZXJFbFswXSwgeyBhdHRyaWJ1dGVzOiBmYWxzZSB9KTtcbiAgICB9LFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5vYnNlcnZlci5vYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfSk7XG4gICAgICBzd2lwZXIub2JzZXJ2ZXIub2JzZXJ2ZXJzID0gW107XG4gICAgfSxcbiAgfTtcblxuICB2YXIgT2JzZXJ2ZXIkMSA9IHtcbiAgICBuYW1lOiAnb2JzZXJ2ZXInLFxuICAgIHBhcmFtczoge1xuICAgICAgb2JzZXJ2ZXI6IGZhbHNlLFxuICAgICAgb2JzZXJ2ZVBhcmVudHM6IGZhbHNlLFxuICAgICAgb2JzZXJ2ZVNsaWRlQ2hpbGRyZW46IGZhbHNlLFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgb2JzZXJ2ZXI6IHtcbiAgICAgICAgICBpbml0OiBPYnNlcnZlci5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBhdHRhY2g6IE9ic2VydmVyLmF0dGFjaC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogT2JzZXJ2ZXIuZGVzdHJveS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb2JzZXJ2ZXJzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIub2JzZXJ2ZXIuaW5pdCgpO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIub2JzZXJ2ZXIuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBWaXJ0dWFsID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGZvcmNlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciByZWYgPSBzd2lwZXIucGFyYW1zO1xuICAgICAgdmFyIHNsaWRlc1BlclZpZXcgPSByZWYuc2xpZGVzUGVyVmlldztcbiAgICAgIHZhciBzbGlkZXNQZXJHcm91cCA9IHJlZi5zbGlkZXNQZXJHcm91cDtcbiAgICAgIHZhciBjZW50ZXJlZFNsaWRlcyA9IHJlZi5jZW50ZXJlZFNsaWRlcztcbiAgICAgIHZhciByZWYkMSA9IHN3aXBlci5wYXJhbXMudmlydHVhbDtcbiAgICAgIHZhciBhZGRTbGlkZXNCZWZvcmUgPSByZWYkMS5hZGRTbGlkZXNCZWZvcmU7XG4gICAgICB2YXIgYWRkU2xpZGVzQWZ0ZXIgPSByZWYkMS5hZGRTbGlkZXNBZnRlcjtcbiAgICAgIHZhciByZWYkMiA9IHN3aXBlci52aXJ0dWFsO1xuICAgICAgdmFyIHByZXZpb3VzRnJvbSA9IHJlZiQyLmZyb207XG4gICAgICB2YXIgcHJldmlvdXNUbyA9IHJlZiQyLnRvO1xuICAgICAgdmFyIHNsaWRlcyA9IHJlZiQyLnNsaWRlcztcbiAgICAgIHZhciBwcmV2aW91c1NsaWRlc0dyaWQgPSByZWYkMi5zbGlkZXNHcmlkO1xuICAgICAgdmFyIHJlbmRlclNsaWRlID0gcmVmJDIucmVuZGVyU2xpZGU7XG4gICAgICB2YXIgcHJldmlvdXNPZmZzZXQgPSByZWYkMi5vZmZzZXQ7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCB8fCAwO1xuXG4gICAgICB2YXIgb2Zmc2V0UHJvcDtcbiAgICAgIGlmIChzd2lwZXIucnRsVHJhbnNsYXRlKSB7IG9mZnNldFByb3AgPSAncmlnaHQnOyB9XG4gICAgICBlbHNlIHsgb2Zmc2V0UHJvcCA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICdsZWZ0JyA6ICd0b3AnOyB9XG5cbiAgICAgIHZhciBzbGlkZXNBZnRlcjtcbiAgICAgIHZhciBzbGlkZXNCZWZvcmU7XG4gICAgICBpZiAoY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgc2xpZGVzQWZ0ZXIgPSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIHNsaWRlc1Blckdyb3VwICsgYWRkU2xpZGVzQmVmb3JlO1xuICAgICAgICBzbGlkZXNCZWZvcmUgPSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIHNsaWRlc1Blckdyb3VwICsgYWRkU2xpZGVzQWZ0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZXNBZnRlciA9IHNsaWRlc1BlclZpZXcgKyAoc2xpZGVzUGVyR3JvdXAgLSAxKSArIGFkZFNsaWRlc0JlZm9yZTtcbiAgICAgICAgc2xpZGVzQmVmb3JlID0gc2xpZGVzUGVyR3JvdXAgKyBhZGRTbGlkZXNBZnRlcjtcbiAgICAgIH1cbiAgICAgIHZhciBmcm9tID0gTWF0aC5tYXgoKGFjdGl2ZUluZGV4IHx8IDApIC0gc2xpZGVzQmVmb3JlLCAwKTtcbiAgICAgIHZhciB0byA9IE1hdGgubWluKChhY3RpdmVJbmRleCB8fCAwKSArIHNsaWRlc0FmdGVyLCBzbGlkZXMubGVuZ3RoIC0gMSk7XG4gICAgICB2YXIgb2Zmc2V0ID0gKHN3aXBlci5zbGlkZXNHcmlkW2Zyb21dIHx8IDApIC0gKHN3aXBlci5zbGlkZXNHcmlkWzBdIHx8IDApO1xuXG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnZpcnR1YWwsIHtcbiAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgdG86IHRvLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgc2xpZGVzR3JpZDogc3dpcGVyLnNsaWRlc0dyaWQsXG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gb25SZW5kZXJlZCgpIHtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgICAgaWYgKHN3aXBlci5sYXp5ICYmIHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2aW91c0Zyb20gPT09IGZyb20gJiYgcHJldmlvdXNUbyA9PT0gdG8gJiYgIWZvcmNlKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzR3JpZCAhPT0gcHJldmlvdXNTbGlkZXNHcmlkICYmIG9mZnNldCAhPT0gcHJldmlvdXNPZmZzZXQpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVzLmNzcyhvZmZzZXRQcm9wLCAob2Zmc2V0ICsgXCJweFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwucmVuZGVyRXh0ZXJuYWwpIHtcbiAgICAgICAgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLnJlbmRlckV4dGVybmFsLmNhbGwoc3dpcGVyLCB7XG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgc2xpZGVzOiAoZnVuY3Rpb24gZ2V0U2xpZGVzKCkge1xuICAgICAgICAgICAgdmFyIHNsaWRlc1RvUmVuZGVyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8PSB0bzsgaSArPSAxKSB7XG4gICAgICAgICAgICAgIHNsaWRlc1RvUmVuZGVyLnB1c2goc2xpZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzbGlkZXNUb1JlbmRlcjtcbiAgICAgICAgICB9KCkpLFxuICAgICAgICB9KTtcbiAgICAgICAgb25SZW5kZXJlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcHJlcGVuZEluZGV4ZXMgPSBbXTtcbiAgICAgIHZhciBhcHBlbmRJbmRleGVzID0gW107XG4gICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwuZmluZCgoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSkpLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHByZXZpb3VzRnJvbTsgaSA8PSBwcmV2aW91c1RvOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAoaSA8IGZyb20gfHwgaSA+IHRvKSB7XG4gICAgICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5maW5kKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3MpICsgXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgaSArIFwiXFxcIl1cIikpLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2xpZGVzLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgaWYgKGkkMSA+PSBmcm9tICYmIGkkMSA8PSB0bykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJldmlvdXNUbyA9PT0gJ3VuZGVmaW5lZCcgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGFwcGVuZEluZGV4ZXMucHVzaChpJDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaSQxID4gcHJldmlvdXNUbykgeyBhcHBlbmRJbmRleGVzLnB1c2goaSQxKTsgfVxuICAgICAgICAgICAgaWYgKGkkMSA8IHByZXZpb3VzRnJvbSkgeyBwcmVwZW5kSW5kZXhlcy5wdXNoKGkkMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFwcGVuZEluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwuYXBwZW5kKHJlbmRlclNsaWRlKHNsaWRlc1tpbmRleF0sIGluZGV4KSk7XG4gICAgICB9KTtcbiAgICAgIHByZXBlbmRJbmRleGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIgLSBhOyB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5wcmVwZW5kKHJlbmRlclNsaWRlKHNsaWRlc1tpbmRleF0sIGluZGV4KSk7XG4gICAgICB9KTtcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLmNoaWxkcmVuKCcuc3dpcGVyLXNsaWRlJykuY3NzKG9mZnNldFByb3AsIChvZmZzZXQgKyBcInB4XCIpKTtcbiAgICAgIG9uUmVuZGVyZWQoKTtcbiAgICB9LFxuICAgIHJlbmRlclNsaWRlOiBmdW5jdGlvbiByZW5kZXJTbGlkZShzbGlkZSwgaW5kZXgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMudmlydHVhbDtcbiAgICAgIGlmIChwYXJhbXMuY2FjaGUgJiYgc3dpcGVyLnZpcnR1YWwuY2FjaGVbaW5kZXhdKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIudmlydHVhbC5jYWNoZVtpbmRleF07XG4gICAgICB9XG4gICAgICB2YXIgJHNsaWRlRWwgPSBwYXJhbXMucmVuZGVyU2xpZGVcbiAgICAgICAgPyAkKHBhcmFtcy5yZW5kZXJTbGlkZS5jYWxsKHN3aXBlciwgc2xpZGUsIGluZGV4KSlcbiAgICAgICAgOiAkKChcIjxkaXYgY2xhc3M9XFxcIlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVDbGFzcykgKyBcIlxcXCIgZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgaW5kZXggKyBcIlxcXCI+XCIgKyBzbGlkZSArIFwiPC9kaXY+XCIpKTtcbiAgICAgIGlmICghJHNsaWRlRWwuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSkgeyAkc2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcsIGluZGV4KTsgfVxuICAgICAgaWYgKHBhcmFtcy5jYWNoZSkgeyBzd2lwZXIudmlydHVhbC5jYWNoZVtpbmRleF0gPSAkc2xpZGVFbDsgfVxuICAgICAgcmV0dXJuICRzbGlkZUVsO1xuICAgIH0sXG4gICAgYXBwZW5kU2xpZGU6IGZ1bmN0aW9uIGFwcGVuZFNsaWRlKHNsaWRlcykge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXSkgeyBzd2lwZXIudmlydHVhbC5zbGlkZXMucHVzaChzbGlkZXNbaV0pOyB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcy5wdXNoKHNsaWRlcyk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudmlydHVhbC51cGRhdGUodHJ1ZSk7XG4gICAgfSxcbiAgICBwcmVwZW5kU2xpZGU6IGZ1bmN0aW9uIHByZXBlbmRTbGlkZShzbGlkZXMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgdmFyIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyAxO1xuICAgICAgdmFyIG51bWJlck9mTmV3U2xpZGVzID0gMTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpZGVzKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChzbGlkZXNbaV0pIHsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzLnVuc2hpZnQoc2xpZGVzW2ldKTsgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyBzbGlkZXMubGVuZ3RoO1xuICAgICAgICBudW1iZXJPZk5ld1NsaWRlcyA9IHNsaWRlcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIudmlydHVhbC5zbGlkZXMudW5zaGlmdChzbGlkZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbC5jYWNoZSkge1xuICAgICAgICB2YXIgY2FjaGUgPSBzd2lwZXIudmlydHVhbC5jYWNoZTtcbiAgICAgICAgdmFyIG5ld0NhY2hlID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGNhY2hlKS5mb3JFYWNoKGZ1bmN0aW9uIChjYWNoZWRJbmRleCkge1xuICAgICAgICAgIG5ld0NhY2hlW3BhcnNlSW50KGNhY2hlZEluZGV4LCAxMCkgKyBudW1iZXJPZk5ld1NsaWRlc10gPSBjYWNoZVtjYWNoZWRJbmRleF07XG4gICAgICAgIH0pO1xuICAgICAgICBzd2lwZXIudmlydHVhbC5jYWNoZSA9IG5ld0NhY2hlO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXgsIDApO1xuICAgIH0sXG4gICAgcmVtb3ZlU2xpZGU6IGZ1bmN0aW9uIHJlbW92ZVNsaWRlKHNsaWRlc0luZGV4ZXMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZXNJbmRleGVzID09PSAndW5kZWZpbmVkJyB8fCBzbGlkZXNJbmRleGVzID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpZGVzSW5kZXhlcykpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHNsaWRlc0luZGV4ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICBzd2lwZXIudmlydHVhbC5zbGlkZXMuc3BsaWNlKHNsaWRlc0luZGV4ZXNbaV0sIDEpO1xuICAgICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwuY2FjaGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzd2lwZXIudmlydHVhbC5jYWNoZVtzbGlkZXNJbmRleGVzW2ldXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNsaWRlc0luZGV4ZXNbaV0gPCBhY3RpdmVJbmRleCkgeyBhY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICAgICAgYWN0aXZlSW5kZXggPSBNYXRoLm1heChhY3RpdmVJbmRleCwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcy5zcGxpY2Uoc2xpZGVzSW5kZXhlcywgMSk7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwuY2FjaGUpIHtcbiAgICAgICAgICBkZWxldGUgc3dpcGVyLnZpcnR1YWwuY2FjaGVbc2xpZGVzSW5kZXhlc107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNsaWRlc0luZGV4ZXMgPCBhY3RpdmVJbmRleCkgeyBhY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gTWF0aC5tYXgoYWN0aXZlSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8oYWN0aXZlSW5kZXgsIDApO1xuICAgIH0sXG4gICAgcmVtb3ZlQWxsU2xpZGVzOiBmdW5jdGlvbiByZW1vdmVBbGxTbGlkZXMoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcyA9IFtdO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbC5jYWNoZSkge1xuICAgICAgICBzd2lwZXIudmlydHVhbC5jYWNoZSA9IHt9O1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgMCk7XG4gICAgfSxcbiAgfTtcblxuICB2YXIgVmlydHVhbCQxID0ge1xuICAgIG5hbWU6ICd2aXJ0dWFsJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHZpcnR1YWw6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNsaWRlczogW10sXG4gICAgICAgIGNhY2hlOiB0cnVlLFxuICAgICAgICByZW5kZXJTbGlkZTogbnVsbCxcbiAgICAgICAgcmVuZGVyRXh0ZXJuYWw6IG51bGwsXG4gICAgICAgIGFkZFNsaWRlc0JlZm9yZTogMCxcbiAgICAgICAgYWRkU2xpZGVzQWZ0ZXI6IDAsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgdmlydHVhbDoge1xuICAgICAgICAgIHVwZGF0ZTogVmlydHVhbC51cGRhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGFwcGVuZFNsaWRlOiBWaXJ0dWFsLmFwcGVuZFNsaWRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBwcmVwZW5kU2xpZGU6IFZpcnR1YWwucHJlcGVuZFNsaWRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICByZW1vdmVTbGlkZTogVmlydHVhbC5yZW1vdmVTbGlkZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgcmVtb3ZlQWxsU2xpZGVzOiBWaXJ0dWFsLnJlbW92ZUFsbFNsaWRlcy5iaW5kKHN3aXBlciksXG4gICAgICAgICAgcmVuZGVyU2xpZGU6IFZpcnR1YWwucmVuZGVyU2xpZGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHNsaWRlczogc3dpcGVyLnBhcmFtcy52aXJ0dWFsLnNsaWRlcyxcbiAgICAgICAgICBjYWNoZToge30sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmNsYXNzTmFtZXMucHVzaCgoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcInZpcnR1YWxcIikpO1xuICAgICAgICB2YXIgb3ZlcndyaXRlUGFyYW1zID0ge1xuICAgICAgICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIucGFyYW1zLCBvdmVyd3JpdGVQYXJhbXMpO1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLm9yaWdpbmFsUGFyYW1zLCBvdmVyd3JpdGVQYXJhbXMpO1xuXG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5pbml0aWFsU2xpZGUpIHtcbiAgICAgICAgICBzd2lwZXIudmlydHVhbC51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKCk7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEtleWJvYXJkID0ge1xuICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV2ZW50KSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgICAgdmFyIGUgPSBldmVudDtcbiAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQpIHsgZSA9IGUub3JpZ2luYWxFdmVudDsgfSAvLyBqcXVlcnkgZml4XG4gICAgICB2YXIga2MgPSBlLmtleUNvZGUgfHwgZS5jaGFyQ29kZTtcbiAgICAgIC8vIERpcmVjdGlvbnMgbG9ja3NcbiAgICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVOZXh0ICYmICgoc3dpcGVyLmlzSG9yaXpvbnRhbCgpICYmIGtjID09PSAzOSkgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYga2MgPT09IDQwKSB8fCBrYyA9PT0gMzQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVQcmV2ICYmICgoc3dpcGVyLmlzSG9yaXpvbnRhbCgpICYmIGtjID09PSAzNykgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYga2MgPT09IDM4KSB8fCBrYyA9PT0gMzMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChlLnNoaWZ0S2V5IHx8IGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChkb2MuYWN0aXZlRWxlbWVudCAmJiBkb2MuYWN0aXZlRWxlbWVudC5ub2RlTmFtZSAmJiAoZG9jLmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fCBkb2MuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGV4dGFyZWEnKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMua2V5Ym9hcmQub25seUluVmlld3BvcnQgJiYgKGtjID09PSAzMyB8fCBrYyA9PT0gMzQgfHwga2MgPT09IDM3IHx8IGtjID09PSAzOSB8fCBrYyA9PT0gMzggfHwga2MgPT09IDQwKSkge1xuICAgICAgICB2YXIgaW5WaWV3ID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgc3dpcGVyIHNob3VsZCBiZSBpbnNpZGUgb2YgdmlzaWJsZSBhcmVhIG9mIHdpbmRvd1xuICAgICAgICBpZiAoc3dpcGVyLiRlbC5wYXJlbnRzKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3MpKSkubGVuZ3RoID4gMCAmJiBzd2lwZXIuJGVsLnBhcmVudHMoKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykpKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbi5pbm5lcldpZHRoO1xuICAgICAgICB2YXIgd2luZG93SGVpZ2h0ID0gd2luLmlubmVySGVpZ2h0O1xuICAgICAgICB2YXIgc3dpcGVyT2Zmc2V0ID0gc3dpcGVyLiRlbC5vZmZzZXQoKTtcbiAgICAgICAgaWYgKHJ0bCkgeyBzd2lwZXJPZmZzZXQubGVmdCAtPSBzd2lwZXIuJGVsWzBdLnNjcm9sbExlZnQ7IH1cbiAgICAgICAgdmFyIHN3aXBlckNvb3JkID0gW1xuICAgICAgICAgIFtzd2lwZXJPZmZzZXQubGVmdCwgc3dpcGVyT2Zmc2V0LnRvcF0sXG4gICAgICAgICAgW3N3aXBlck9mZnNldC5sZWZ0ICsgc3dpcGVyLndpZHRoLCBzd2lwZXJPZmZzZXQudG9wXSxcbiAgICAgICAgICBbc3dpcGVyT2Zmc2V0LmxlZnQsIHN3aXBlck9mZnNldC50b3AgKyBzd2lwZXIuaGVpZ2h0XSxcbiAgICAgICAgICBbc3dpcGVyT2Zmc2V0LmxlZnQgKyBzd2lwZXIud2lkdGgsIHN3aXBlck9mZnNldC50b3AgKyBzd2lwZXIuaGVpZ2h0XSBdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN3aXBlckNvb3JkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHBvaW50ID0gc3dpcGVyQ29vcmRbaV07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9pbnRbMF0gPj0gMCAmJiBwb2ludFswXSA8PSB3aW5kb3dXaWR0aFxuICAgICAgICAgICAgJiYgcG9pbnRbMV0gPj0gMCAmJiBwb2ludFsxXSA8PSB3aW5kb3dIZWlnaHRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGluVmlldyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW5WaWV3KSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgaWYgKGtjID09PSAzMyB8fCBrYyA9PT0gMzQgfHwga2MgPT09IDM3IHx8IGtjID09PSAzOSkge1xuICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgICAgIGVsc2UgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKChrYyA9PT0gMzQgfHwga2MgPT09IDM5KSAmJiAhcnRsKSB8fCAoKGtjID09PSAzMyB8fCBrYyA9PT0gMzcpICYmIHJ0bCkpIHsgc3dpcGVyLnNsaWRlTmV4dCgpOyB9XG4gICAgICAgIGlmICgoKGtjID09PSAzMyB8fCBrYyA9PT0gMzcpICYmICFydGwpIHx8ICgoa2MgPT09IDM0IHx8IGtjID09PSAzOSkgJiYgcnRsKSkgeyBzd2lwZXIuc2xpZGVQcmV2KCk7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChrYyA9PT0gMzMgfHwga2MgPT09IDM0IHx8IGtjID09PSAzOCB8fCBrYyA9PT0gNDApIHtcbiAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgICAgICBlbHNlIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtjID09PSAzNCB8fCBrYyA9PT0gNDApIHsgc3dpcGVyLnNsaWRlTmV4dCgpOyB9XG4gICAgICAgIGlmIChrYyA9PT0gMzMgfHwga2MgPT09IDM4KSB7IHN3aXBlci5zbGlkZVByZXYoKTsgfVxuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ2tleVByZXNzJywga2MpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGVuYWJsZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAkKGRvYykub24oJ2tleWRvd24nLCBzd2lwZXIua2V5Ym9hcmQuaGFuZGxlKTtcbiAgICAgIHN3aXBlci5rZXlib2FyZC5lbmFibGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAkKGRvYykub2ZmKCdrZXlkb3duJywgc3dpcGVyLmtleWJvYXJkLmhhbmRsZSk7XG4gICAgICBzd2lwZXIua2V5Ym9hcmQuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH0sXG4gIH07XG5cbiAgdmFyIEtleWJvYXJkJDEgPSB7XG4gICAgbmFtZTogJ2tleWJvYXJkJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGtleWJvYXJkOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBvbmx5SW5WaWV3cG9ydDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBrZXlib2FyZDoge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZTogS2V5Ym9hcmQuZW5hYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkaXNhYmxlOiBLZXlib2FyZC5kaXNhYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBoYW5kbGU6IEtleWJvYXJkLmhhbmRsZS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMua2V5Ym9hcmQuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIua2V5Ym9hcmQuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZCgpIHtcbiAgICB2YXIgZXZlbnROYW1lID0gJ29ud2hlZWwnO1xuICAgIHZhciBpc1N1cHBvcnRlZCA9IGV2ZW50TmFtZSBpbiBkb2M7XG5cbiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBpZiAoIWlzU3VwcG9ydGVkXG4gICAgICAmJiBkb2MuaW1wbGVtZW50YXRpb25cbiAgICAgICYmIGRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlXG4gICAgICAvLyBhbHdheXMgcmV0dXJucyB0cnVlIGluIG5ld2VyIGJyb3dzZXJzIGFzIHBlciB0aGUgc3RhbmRhcmQuXG4gICAgICAvLyBAc2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZG9taW1wbGVtZW50YXRpb24taGFzZmVhdHVyZVxuICAgICAgJiYgZG9jLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoJycsICcnKSAhPT0gdHJ1ZVxuICAgICkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gdGVzdCBzdXBwb3J0IGZvciB0aGUgYHdoZWVsYCBldmVudCBpbiBJRTkrLlxuICAgICAgaXNTdXBwb3J0ZWQgPSBkb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnRXZlbnRzLndoZWVsJywgJzMuMCcpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1N1cHBvcnRlZDtcbiAgfVxuICB2YXIgTW91c2V3aGVlbCA9IHtcbiAgICBsYXN0U2Nyb2xsVGltZTogVXRpbHMubm93KCksXG4gICAgZXZlbnQ6IChmdW5jdGlvbiBnZXRFdmVudCgpIHtcbiAgICAgIGlmICh3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdmaXJlZm94JykgPiAtMSkgeyByZXR1cm4gJ0RPTU1vdXNlU2Nyb2xsJzsgfVxuICAgICAgcmV0dXJuIGlzRXZlbnRTdXBwb3J0ZWQoKSA/ICd3aGVlbCcgOiAnbW91c2V3aGVlbCc7XG4gICAgfSgpKSxcbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uIG5vcm1hbGl6ZShlKSB7XG4gICAgICAvLyBSZWFzb25hYmxlIGRlZmF1bHRzXG4gICAgICB2YXIgUElYRUxfU1RFUCA9IDEwO1xuICAgICAgdmFyIExJTkVfSEVJR0hUID0gNDA7XG4gICAgICB2YXIgUEFHRV9IRUlHSFQgPSA4MDA7XG5cbiAgICAgIHZhciBzWCA9IDA7XG4gICAgICB2YXIgc1kgPSAwOyAvLyBzcGluWCwgc3BpbllcbiAgICAgIHZhciBwWCA9IDA7XG4gICAgICB2YXIgcFkgPSAwOyAvLyBwaXhlbFgsIHBpeGVsWVxuXG4gICAgICAvLyBMZWdhY3lcbiAgICAgIGlmICgnZGV0YWlsJyBpbiBlKSB7XG4gICAgICAgIHNZID0gZS5kZXRhaWw7XG4gICAgICB9XG4gICAgICBpZiAoJ3doZWVsRGVsdGEnIGluIGUpIHtcbiAgICAgICAgc1kgPSAtZS53aGVlbERlbHRhIC8gMTIwO1xuICAgICAgfVxuICAgICAgaWYgKCd3aGVlbERlbHRhWScgaW4gZSkge1xuICAgICAgICBzWSA9IC1lLndoZWVsRGVsdGFZIC8gMTIwO1xuICAgICAgfVxuICAgICAgaWYgKCd3aGVlbERlbHRhWCcgaW4gZSkge1xuICAgICAgICBzWCA9IC1lLndoZWVsRGVsdGFYIC8gMTIwO1xuICAgICAgfVxuXG4gICAgICAvLyBzaWRlIHNjcm9sbGluZyBvbiBGRiB3aXRoIERPTU1vdXNlU2Nyb2xsXG4gICAgICBpZiAoJ2F4aXMnIGluIGUgJiYgZS5heGlzID09PSBlLkhPUklaT05UQUxfQVhJUykge1xuICAgICAgICBzWCA9IHNZO1xuICAgICAgICBzWSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHBYID0gc1ggKiBQSVhFTF9TVEVQO1xuICAgICAgcFkgPSBzWSAqIFBJWEVMX1NURVA7XG5cbiAgICAgIGlmICgnZGVsdGFZJyBpbiBlKSB7XG4gICAgICAgIHBZID0gZS5kZWx0YVk7XG4gICAgICB9XG4gICAgICBpZiAoJ2RlbHRhWCcgaW4gZSkge1xuICAgICAgICBwWCA9IGUuZGVsdGFYO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHBYIHx8IHBZKSAmJiBlLmRlbHRhTW9kZSkge1xuICAgICAgICBpZiAoZS5kZWx0YU1vZGUgPT09IDEpIHsgLy8gZGVsdGEgaW4gTElORSB1bml0c1xuICAgICAgICAgIHBYICo9IExJTkVfSEVJR0hUO1xuICAgICAgICAgIHBZICo9IExJTkVfSEVJR0hUO1xuICAgICAgICB9IGVsc2UgeyAvLyBkZWx0YSBpbiBQQUdFIHVuaXRzXG4gICAgICAgICAgcFggKj0gUEFHRV9IRUlHSFQ7XG4gICAgICAgICAgcFkgKj0gUEFHRV9IRUlHSFQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbC1iYWNrIGlmIHNwaW4gY2Fubm90IGJlIGRldGVybWluZWRcbiAgICAgIGlmIChwWCAmJiAhc1gpIHtcbiAgICAgICAgc1ggPSAocFggPCAxKSA/IC0xIDogMTtcbiAgICAgIH1cbiAgICAgIGlmIChwWSAmJiAhc1kpIHtcbiAgICAgICAgc1kgPSAocFkgPCAxKSA/IC0xIDogMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3Bpblg6IHNYLFxuICAgICAgICBzcGluWTogc1ksXG4gICAgICAgIHBpeGVsWDogcFgsXG4gICAgICAgIHBpeGVsWTogcFksXG4gICAgICB9O1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VFbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgc3dpcGVyLm1vdXNlRW50ZXJlZCA9IHRydWU7XG4gICAgfSxcbiAgICBoYW5kbGVNb3VzZUxlYXZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZUxlYXZlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBzd2lwZXIubW91c2VFbnRlcmVkID0gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGU6IGZ1bmN0aW9uIGhhbmRsZShldmVudCkge1xuICAgICAgdmFyIGUgPSBldmVudDtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMubW91c2V3aGVlbDtcblxuICAgICAgaWYgKCFzd2lwZXIubW91c2VFbnRlcmVkICYmICFwYXJhbXMucmVsZWFzZU9uRWRnZXMpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9IC8vIGpxdWVyeSBmaXhcbiAgICAgIHZhciBkZWx0YSA9IDA7XG4gICAgICB2YXIgcnRsRmFjdG9yID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IC0xIDogMTtcblxuICAgICAgdmFyIGRhdGEgPSBNb3VzZXdoZWVsLm5vcm1hbGl6ZShlKTtcblxuICAgICAgaWYgKHBhcmFtcy5mb3JjZVRvQXhpcykge1xuICAgICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEucGl4ZWxYKSA+IE1hdGguYWJzKGRhdGEucGl4ZWxZKSkgeyBkZWx0YSA9IGRhdGEucGl4ZWxYICogcnRsRmFjdG9yOyB9XG4gICAgICAgICAgZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGF0YS5waXhlbFkpID4gTWF0aC5hYnMoZGF0YS5waXhlbFgpKSB7IGRlbHRhID0gZGF0YS5waXhlbFk7IH1cbiAgICAgICAgZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWx0YSA9IE1hdGguYWJzKGRhdGEucGl4ZWxYKSA+IE1hdGguYWJzKGRhdGEucGl4ZWxZKSA/IC1kYXRhLnBpeGVsWCAqIHJ0bEZhY3RvciA6IC1kYXRhLnBpeGVsWTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbHRhID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgIGlmIChwYXJhbXMuaW52ZXJ0KSB7IGRlbHRhID0gLWRlbHRhOyB9XG5cbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSkge1xuICAgICAgICBpZiAoVXRpbHMubm93KCkgLSBzd2lwZXIubW91c2V3aGVlbC5sYXN0U2Nyb2xsVGltZSA+IDYwKSB7XG4gICAgICAgICAgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICAgICAgaWYgKCghc3dpcGVyLmlzRW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCkgJiYgIXN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgICAgICAgICAgICBzd2lwZXIuZW1pdCgnc2Nyb2xsJywgZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZWxlYXNlT25FZGdlcykgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoKCFzd2lwZXIuaXNCZWdpbm5pbmcgfHwgc3dpcGVyLnBhcmFtcy5sb29wKSAmJiAhc3dpcGVyLmFuaW1hdGluZykge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbCcsIGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnJlbGVhc2VPbkVkZ2VzKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpcGVyLm1vdXNld2hlZWwubGFzdFNjcm9sbFRpbWUgPSAobmV3IHdpbi5EYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZyZWVtb2RlIG9yIHNjcm9sbENvbnRhaW5lcjpcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICAgIHN3aXBlci5sb29wRml4KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gc3dpcGVyLmdldFRyYW5zbGF0ZSgpICsgKGRlbHRhICogcGFyYW1zLnNlbnNpdGl2aXR5KTtcbiAgICAgICAgdmFyIHdhc0JlZ2lubmluZyA9IHN3aXBlci5pc0JlZ2lubmluZztcbiAgICAgICAgdmFyIHdhc0VuZCA9IHN3aXBlci5pc0VuZDtcblxuICAgICAgICBpZiAocG9zaXRpb24gPj0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSB7IHBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpOyB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA8PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHsgcG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCk7IH1cblxuICAgICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShwb3NpdGlvbik7XG4gICAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcblxuICAgICAgICBpZiAoKCF3YXNCZWdpbm5pbmcgJiYgc3dpcGVyLmlzQmVnaW5uaW5nKSB8fCAoIXdhc0VuZCAmJiBzd2lwZXIuaXNFbmQpKSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmZyZWVNb2RlU3RpY2t5KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5tb3VzZXdoZWVsLnRpbWVvdXQpO1xuICAgICAgICAgIHN3aXBlci5tb3VzZXdoZWVsLnRpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzd2lwZXIuc2xpZGVUb0Nsb3Nlc3QoKTtcbiAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbCcsIGUpO1xuXG4gICAgICAgIC8vIFN0b3AgYXV0b3BsYXlcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkgJiYgc3dpcGVyLnBhcmFtcy5hdXRvcGxheURpc2FibGVPbkludGVyYWN0aW9uKSB7IHN3aXBlci5hdXRvcGxheS5zdG9wKCk7IH1cbiAgICAgICAgLy8gUmV0dXJuIHBhZ2Ugc2Nyb2xsIG9uIGVkZ2UgcG9zaXRpb25zXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIHx8IHBvc2l0aW9uID09PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICBlbHNlIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFNb3VzZXdoZWVsLmV2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKHN3aXBlci5tb3VzZXdoZWVsLmVuYWJsZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICB2YXIgdGFyZ2V0ID0gc3dpcGVyLiRlbDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLm1vdXNld2hlZWwuZXZlbnRzVGFyZ2VkICE9PSAnY29udGFpbmVyJykge1xuICAgICAgICB0YXJnZXQgPSAkKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5ldmVudHNUYXJnZWQpO1xuICAgICAgfVxuICAgICAgdGFyZ2V0Lm9uKCdtb3VzZWVudGVyJywgc3dpcGVyLm1vdXNld2hlZWwuaGFuZGxlTW91c2VFbnRlcik7XG4gICAgICB0YXJnZXQub24oJ21vdXNlbGVhdmUnLCBzd2lwZXIubW91c2V3aGVlbC5oYW5kbGVNb3VzZUxlYXZlKTtcbiAgICAgIHRhcmdldC5vbihNb3VzZXdoZWVsLmV2ZW50LCBzd2lwZXIubW91c2V3aGVlbC5oYW5kbGUpO1xuICAgICAgc3dpcGVyLm1vdXNld2hlZWwuZW5hYmxlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghTW91c2V3aGVlbC5ldmVudCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmICghc3dpcGVyLm1vdXNld2hlZWwuZW5hYmxlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIHZhciB0YXJnZXQgPSBzd2lwZXIuJGVsO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5ldmVudHNUYXJnZWQgIT09ICdjb250YWluZXInKSB7XG4gICAgICAgIHRhcmdldCA9ICQoc3dpcGVyLnBhcmFtcy5tb3VzZXdoZWVsLmV2ZW50c1RhcmdlZCk7XG4gICAgICB9XG4gICAgICB0YXJnZXQub2ZmKE1vdXNld2hlZWwuZXZlbnQsIHN3aXBlci5tb3VzZXdoZWVsLmhhbmRsZSk7XG4gICAgICBzd2lwZXIubW91c2V3aGVlbC5lbmFibGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBNb3VzZXdoZWVsJDEgPSB7XG4gICAgbmFtZTogJ21vdXNld2hlZWwnLFxuICAgIHBhcmFtczoge1xuICAgICAgbW91c2V3aGVlbDoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmVsZWFzZU9uRWRnZXM6IGZhbHNlLFxuICAgICAgICBpbnZlcnQ6IGZhbHNlLFxuICAgICAgICBmb3JjZVRvQXhpczogZmFsc2UsXG4gICAgICAgIHNlbnNpdGl2aXR5OiAxLFxuICAgICAgICBldmVudHNUYXJnZWQ6ICdjb250YWluZXInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIG1vdXNld2hlZWw6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGU6IE1vdXNld2hlZWwuZW5hYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkaXNhYmxlOiBNb3VzZXdoZWVsLmRpc2FibGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGhhbmRsZTogTW91c2V3aGVlbC5oYW5kbGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGhhbmRsZU1vdXNlRW50ZXI6IE1vdXNld2hlZWwuaGFuZGxlTW91c2VFbnRlci5iaW5kKHN3aXBlciksXG4gICAgICAgICAgaGFuZGxlTW91c2VMZWF2ZTogTW91c2V3aGVlbC5oYW5kbGVNb3VzZUxlYXZlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBsYXN0U2Nyb2xsVGltZTogVXRpbHMubm93KCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5lbmFibGVkKSB7IHN3aXBlci5tb3VzZXdoZWVsLmVuYWJsZSgpOyB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIubW91c2V3aGVlbC5lbmFibGVkKSB7IHN3aXBlci5tb3VzZXdoZWVsLmRpc2FibGUoKTsgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBOYXZpZ2F0aW9uID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgLy8gVXBkYXRlIE5hdmlnYXRpb24gQnV0dG9uc1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHJlZiA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgICAgdmFyICRuZXh0RWwgPSByZWYuJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG5cbiAgICAgIGlmICgkcHJldkVsICYmICRwcmV2RWwubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3dpcGVyLmlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgJHByZXZFbC5hZGRDbGFzcyhwYXJhbXMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHByZXZFbC5yZW1vdmVDbGFzcyhwYXJhbXMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgJHByZXZFbFtzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCRuZXh0RWwgJiYgJG5leHRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzd2lwZXIuaXNFbmQpIHtcbiAgICAgICAgICAkbmV4dEVsLmFkZENsYXNzKHBhcmFtcy5kaXNhYmxlZENsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkbmV4dEVsLnJlbW92ZUNsYXNzKHBhcmFtcy5kaXNhYmxlZENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICAkbmV4dEVsW3N3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10ocGFyYW1zLmxvY2tDbGFzcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblByZXZDbGljazogZnVuY3Rpb24gb25QcmV2Q2xpY2soZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgfSxcbiAgICBvbk5leHRDbGljazogZnVuY3Rpb24gb25OZXh0Q2xpY2soZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoc3dpcGVyLmlzRW5kICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uO1xuICAgICAgaWYgKCEocGFyYW1zLm5leHRFbCB8fCBwYXJhbXMucHJldkVsKSkgeyByZXR1cm47IH1cblxuICAgICAgdmFyICRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbDtcbiAgICAgIGlmIChwYXJhbXMubmV4dEVsKSB7XG4gICAgICAgICRuZXh0RWwgPSAkKHBhcmFtcy5uZXh0RWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLnBhcmFtcy51bmlxdWVOYXZFbGVtZW50c1xuICAgICAgICAgICYmIHR5cGVvZiBwYXJhbXMubmV4dEVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICYmICRuZXh0RWwubGVuZ3RoID4gMVxuICAgICAgICAgICYmIHN3aXBlci4kZWwuZmluZChwYXJhbXMubmV4dEVsKS5sZW5ndGggPT09IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgJG5leHRFbCA9IHN3aXBlci4kZWwuZmluZChwYXJhbXMubmV4dEVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5wcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbCA9ICQocGFyYW1zLnByZXZFbCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzXG4gICAgICAgICAgJiYgdHlwZW9mIHBhcmFtcy5wcmV2RWwgPT09ICdzdHJpbmcnXG4gICAgICAgICAgJiYgJHByZXZFbC5sZW5ndGggPiAxXG4gICAgICAgICAgJiYgc3dpcGVyLiRlbC5maW5kKHBhcmFtcy5wcmV2RWwpLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAkcHJldkVsID0gc3dpcGVyLiRlbC5maW5kKHBhcmFtcy5wcmV2RWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgkbmV4dEVsICYmICRuZXh0RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAkbmV4dEVsLm9uKCdjbGljaycsIHN3aXBlci5uYXZpZ2F0aW9uLm9uTmV4dENsaWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICgkcHJldkVsICYmICRwcmV2RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAkcHJldkVsLm9uKCdjbGljaycsIHN3aXBlci5uYXZpZ2F0aW9uLm9uUHJldkNsaWNrKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5uYXZpZ2F0aW9uLCB7XG4gICAgICAgICRuZXh0RWw6ICRuZXh0RWwsXG4gICAgICAgIG5leHRFbDogJG5leHRFbCAmJiAkbmV4dEVsWzBdLFxuICAgICAgICAkcHJldkVsOiAkcHJldkVsLFxuICAgICAgICBwcmV2RWw6ICRwcmV2RWwgJiYgJHByZXZFbFswXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJlZiA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgICAgdmFyICRuZXh0RWwgPSByZWYuJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG4gICAgICBpZiAoJG5leHRFbCAmJiAkbmV4dEVsLmxlbmd0aCkge1xuICAgICAgICAkbmV4dEVsLm9mZignY2xpY2snLCBzd2lwZXIubmF2aWdhdGlvbi5vbk5leHRDbGljayk7XG4gICAgICAgICRuZXh0RWwucmVtb3ZlQ2xhc3Moc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uLmRpc2FibGVkQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCRwcmV2RWwgJiYgJHByZXZFbC5sZW5ndGgpIHtcbiAgICAgICAgJHByZXZFbC5vZmYoJ2NsaWNrJywgc3dpcGVyLm5hdmlnYXRpb24ub25QcmV2Q2xpY2spO1xuICAgICAgICAkcHJldkVsLnJlbW92ZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5kaXNhYmxlZENsYXNzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHZhciBOYXZpZ2F0aW9uJDEgPSB7XG4gICAgbmFtZTogJ25hdmlnYXRpb24nLFxuICAgIHBhcmFtczoge1xuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBuZXh0RWw6IG51bGwsXG4gICAgICAgIHByZXZFbDogbnVsbCxcblxuICAgICAgICBoaWRlT25DbGljazogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWRpc2FibGVkJyxcbiAgICAgICAgaGlkZGVuQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWhpZGRlbicsXG4gICAgICAgIGxvY2tDbGFzczogJ3N3aXBlci1idXR0b24tbG9jaycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICAgIGluaXQ6IE5hdmlnYXRpb24uaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgdXBkYXRlOiBOYXZpZ2F0aW9uLnVwZGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogTmF2aWdhdGlvbi5kZXN0cm95LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBvbk5leHRDbGljazogTmF2aWdhdGlvbi5vbk5leHRDbGljay5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25QcmV2Q2xpY2s6IE5hdmlnYXRpb24ub25QcmV2Q2xpY2suYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5uYXZpZ2F0aW9uLmluaXQoKTtcbiAgICAgICAgc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgdG9FZGdlOiBmdW5jdGlvbiB0b0VkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIubmF2aWdhdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBmcm9tRWRnZTogZnVuY3Rpb24gZnJvbUVkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIubmF2aWdhdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLm5hdmlnYXRpb24uZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICB2YXIgcmVmID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgICAgIHZhciAkbmV4dEVsID0gcmVmLiRuZXh0RWw7XG4gICAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZU9uQ2xpY2tcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaXMoJHByZXZFbClcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaXMoJG5leHRFbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuO1xuICAgICAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgICAgICBpc0hpZGRlbiA9ICRuZXh0RWwuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCRwcmV2RWwpIHtcbiAgICAgICAgICAgIGlzSGlkZGVuID0gJHByZXZFbC5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCduYXZpZ2F0aW9uU2hvdycsIHN3aXBlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCduYXZpZ2F0aW9uSGlkZScsIHN3aXBlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgICAgICAkbmV4dEVsLnRvZ2dsZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkcHJldkVsKSB7XG4gICAgICAgICAgICAkcHJldkVsLnRvZ2dsZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFBhZ2luYXRpb24gPSB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAvLyBSZW5kZXIgfHwgVXBkYXRlIFBhZ2luYXRpb24gYnVsbGV0cy9pdGVtc1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bDtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgICBpZiAoIXBhcmFtcy5lbCB8fCAhc3dpcGVyLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLiRlbCB8fCBzd2lwZXIucGFnaW5hdGlvbi4kZWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuICAgICAgdmFyICRlbCA9IHN3aXBlci5wYWdpbmF0aW9uLiRlbDtcbiAgICAgIC8vIEN1cnJlbnQvVG90YWxcbiAgICAgIHZhciBjdXJyZW50O1xuICAgICAgdmFyIHRvdGFsID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKChzbGlkZXNMZW5ndGggLSAoc3dpcGVyLmxvb3BlZFNsaWRlcyAqIDIpKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgY3VycmVudCA9IE1hdGguY2VpbCgoc3dpcGVyLmFjdGl2ZUluZGV4IC0gc3dpcGVyLmxvb3BlZFNsaWRlcykgLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPiBzbGlkZXNMZW5ndGggLSAxIC0gKHN3aXBlci5sb29wZWRTbGlkZXMgKiAyKSkge1xuICAgICAgICAgIGN1cnJlbnQgLT0gKHNsaWRlc0xlbmd0aCAtIChzd2lwZXIubG9vcGVkU2xpZGVzICogMikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ID4gdG90YWwgLSAxKSB7IGN1cnJlbnQgLT0gdG90YWw7IH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPCAwICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvblR5cGUgIT09ICdidWxsZXRzJykgeyBjdXJyZW50ID0gdG90YWwgKyBjdXJyZW50OyB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzd2lwZXIuc25hcEluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjdXJyZW50ID0gc3dpcGVyLnNuYXBJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQgPSBzd2lwZXIuYWN0aXZlSW5kZXggfHwgMDtcbiAgICAgIH1cbiAgICAgIC8vIFR5cGVzXG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzICYmIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgYnVsbGV0cyA9IHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHM7XG4gICAgICAgIHZhciBmaXJzdEluZGV4O1xuICAgICAgICB2YXIgbGFzdEluZGV4O1xuICAgICAgICB2YXIgbWlkSW5kZXg7XG4gICAgICAgIGlmIChwYXJhbXMuZHluYW1pY0J1bGxldHMpIHtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplID0gYnVsbGV0cy5lcSgwKVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnb3V0ZXJXaWR0aCcgOiAnb3V0ZXJIZWlnaHQnXSh0cnVlKTtcbiAgICAgICAgICAkZWwuY3NzKHN3aXBlci5pc0hvcml6b250YWwoKSA/ICd3aWR0aCcgOiAnaGVpZ2h0JywgKChzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplICogKHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgKyA0KSkgKyBcInB4XCIpKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA+IDEgJiYgc3dpcGVyLnByZXZpb3VzSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ICs9IChjdXJyZW50IC0gc3dpcGVyLnByZXZpb3VzSW5kZXgpO1xuICAgICAgICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmR5bmFtaWNCdWxsZXRJbmRleCA+IChwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzIC0gMSkpIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ID0gcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmR5bmFtaWNCdWxsZXRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmlyc3RJbmRleCA9IGN1cnJlbnQgLSBzd2lwZXIucGFnaW5hdGlvbi5keW5hbWljQnVsbGV0SW5kZXg7XG4gICAgICAgICAgbGFzdEluZGV4ID0gZmlyc3RJbmRleCArIChNYXRoLm1pbihidWxsZXRzLmxlbmd0aCwgcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cykgLSAxKTtcbiAgICAgICAgICBtaWRJbmRleCA9IChsYXN0SW5kZXggKyBmaXJzdEluZGV4KSAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgYnVsbGV0cy5yZW1vdmVDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dCBcIiArIChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dC1uZXh0IFwiICsgKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2IFwiICsgKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2LXByZXYgXCIgKyAocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW1haW5cIikpO1xuICAgICAgICBpZiAoJGVsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBidWxsZXRzLmVhY2goZnVuY3Rpb24gKGluZGV4LCBidWxsZXQpIHtcbiAgICAgICAgICAgIHZhciAkYnVsbGV0ID0gJChidWxsZXQpO1xuICAgICAgICAgICAgdmFyIGJ1bGxldEluZGV4ID0gJGJ1bGxldC5pbmRleCgpO1xuICAgICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICRidWxsZXQuYWRkQ2xhc3MocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMuZHluYW1pY0J1bGxldHMpIHtcbiAgICAgICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID49IGZpcnN0SW5kZXggJiYgYnVsbGV0SW5kZXggPD0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgJGJ1bGxldC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1tYWluXCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPT09IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAkYnVsbGV0XG4gICAgICAgICAgICAgICAgICAucHJldigpXG4gICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoKChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItcHJldlwiKSlcbiAgICAgICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2LXByZXZcIikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChidWxsZXRJbmRleCA9PT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgJGJ1bGxldFxuICAgICAgICAgICAgICAgICAgLm5leHQoKVxuICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW5leHRcIikpXG4gICAgICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoKChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dC1uZXh0XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciAkYnVsbGV0ID0gYnVsbGV0cy5lcShjdXJyZW50KTtcbiAgICAgICAgICAkYnVsbGV0LmFkZENsYXNzKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAgICAgdmFyICRmaXJzdERpc3BsYXllZEJ1bGxldCA9IGJ1bGxldHMuZXEoZmlyc3RJbmRleCk7XG4gICAgICAgICAgICB2YXIgJGxhc3REaXNwbGF5ZWRCdWxsZXQgPSBidWxsZXRzLmVxKGxhc3RJbmRleCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZmlyc3RJbmRleDsgaSA8PSBsYXN0SW5kZXg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBidWxsZXRzLmVxKGkpLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW1haW5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJGZpcnN0RGlzcGxheWVkQnVsbGV0XG4gICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLXByZXZcIikpXG4gICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLXByZXYtcHJldlwiKSk7XG4gICAgICAgICAgICAkbGFzdERpc3BsYXllZEJ1bGxldFxuICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1uZXh0XCIpKVxuICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1uZXh0LW5leHRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgICAgdmFyIGR5bmFtaWNCdWxsZXRzTGVuZ3RoID0gTWF0aC5taW4oYnVsbGV0cy5sZW5ndGgsIHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgKyA0KTtcbiAgICAgICAgICB2YXIgYnVsbGV0c09mZnNldCA9ICgoKHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldFNpemUgKiBkeW5hbWljQnVsbGV0c0xlbmd0aCkgLSAoc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0U2l6ZSkpIC8gMikgLSAobWlkSW5kZXggKiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplKTtcbiAgICAgICAgICB2YXIgb2Zmc2V0UHJvcCA9IHJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgICAgICAgYnVsbGV0cy5jc3Moc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gb2Zmc2V0UHJvcCA6ICd0b3AnLCAoYnVsbGV0c09mZnNldCArIFwicHhcIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdmcmFjdGlvbicpIHtcbiAgICAgICAgJGVsLmZpbmQoKFwiLlwiICsgKHBhcmFtcy5jdXJyZW50Q2xhc3MpKSkudGV4dChwYXJhbXMuZm9ybWF0RnJhY3Rpb25DdXJyZW50KGN1cnJlbnQgKyAxKSk7XG4gICAgICAgICRlbC5maW5kKChcIi5cIiArIChwYXJhbXMudG90YWxDbGFzcykpKS50ZXh0KHBhcmFtcy5mb3JtYXRGcmFjdGlvblRvdGFsKHRvdGFsKSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwcm9ncmVzc2JhcicpIHtcbiAgICAgICAgdmFyIHByb2dyZXNzYmFyRGlyZWN0aW9uO1xuICAgICAgICBpZiAocGFyYW1zLnByb2dyZXNzYmFyT3Bwb3NpdGUpIHtcbiAgICAgICAgICBwcm9ncmVzc2JhckRpcmVjdGlvbiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvZ3Jlc3NiYXJEaXJlY3Rpb24gPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZSA9IChjdXJyZW50ICsgMSkgLyB0b3RhbDtcbiAgICAgICAgdmFyIHNjYWxlWCA9IDE7XG4gICAgICAgIHZhciBzY2FsZVkgPSAxO1xuICAgICAgICBpZiAocHJvZ3Jlc3NiYXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIHNjYWxlWCA9IHNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjYWxlWSA9IHNjYWxlO1xuICAgICAgICB9XG4gICAgICAgICRlbC5maW5kKChcIi5cIiArIChwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3MpKSkudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZVgoXCIgKyBzY2FsZVggKyBcIikgc2NhbGVZKFwiICsgc2NhbGVZICsgXCIpXCIpKS50cmFuc2l0aW9uKHN3aXBlci5wYXJhbXMuc3BlZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnY3VzdG9tJyAmJiBwYXJhbXMucmVuZGVyQ3VzdG9tKSB7XG4gICAgICAgICRlbC5odG1sKHBhcmFtcy5yZW5kZXJDdXN0b20oc3dpcGVyLCBjdXJyZW50ICsgMSwgdG90YWwpKTtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3BhZ2luYXRpb25SZW5kZXInLCBzd2lwZXIsICRlbFswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuZW1pdCgncGFnaW5hdGlvblVwZGF0ZScsIHN3aXBlciwgJGVsWzBdKTtcbiAgICAgIH1cbiAgICAgICRlbFtzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgIH0sXG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAvLyBSZW5kZXIgQ29udGFpbmVyXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgICBpZiAoIXBhcmFtcy5lbCB8fCAhc3dpcGVyLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLiRlbCB8fCBzd2lwZXIucGFnaW5hdGlvbi4kZWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuXG4gICAgICB2YXIgJGVsID0gc3dpcGVyLnBhZ2luYXRpb24uJGVsO1xuICAgICAgdmFyIHBhZ2luYXRpb25IVE1MID0gJyc7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJykge1xuICAgICAgICB2YXIgbnVtYmVyT2ZCdWxsZXRzID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKChzbGlkZXNMZW5ndGggLSAoc3dpcGVyLmxvb3BlZFNsaWRlcyAqIDIpKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkJ1bGxldHM7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChwYXJhbXMucmVuZGVyQnVsbGV0KSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBwYXJhbXMucmVuZGVyQnVsbGV0LmNhbGwoc3dpcGVyLCBpLCBwYXJhbXMuYnVsbGV0Q2xhc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBcIjxcIiArIChwYXJhbXMuYnVsbGV0RWxlbWVudCkgKyBcIiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLmJ1bGxldENsYXNzKSArIFwiXFxcIj48L1wiICsgKHBhcmFtcy5idWxsZXRFbGVtZW50KSArIFwiPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkZWwuaHRtbChwYWdpbmF0aW9uSFRNTCk7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMgPSAkZWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLmJ1bGxldENsYXNzKSkpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnZnJhY3Rpb24nKSB7XG4gICAgICAgIGlmIChwYXJhbXMucmVuZGVyRnJhY3Rpb24pIHtcbiAgICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJGcmFjdGlvbi5jYWxsKHN3aXBlciwgcGFyYW1zLmN1cnJlbnRDbGFzcywgcGFyYW1zLnRvdGFsQ2xhc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLmN1cnJlbnRDbGFzcykgKyBcIlxcXCI+PC9zcGFuPlwiXG4gICAgICAgICAgKyAnIC8gJ1xuICAgICAgICAgICsgXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLnRvdGFsQ2xhc3MpICsgXCJcXFwiPjwvc3Bhbj5cIjtcbiAgICAgICAgfVxuICAgICAgICAkZWwuaHRtbChwYWdpbmF0aW9uSFRNTCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwcm9ncmVzc2JhcicpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhcikge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gcGFyYW1zLnJlbmRlclByb2dyZXNzYmFyLmNhbGwoc3dpcGVyLCBwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLnByb2dyZXNzYmFyRmlsbENsYXNzKSArIFwiXFxcIj48L3NwYW4+XCI7XG4gICAgICAgIH1cbiAgICAgICAgJGVsLmh0bWwocGFnaW5hdGlvbkhUTUwpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgICBzd2lwZXIuZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIHN3aXBlci5wYWdpbmF0aW9uLiRlbFswXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgICAgaWYgKCFwYXJhbXMuZWwpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHZhciAkZWwgPSAkKHBhcmFtcy5lbCk7XG4gICAgICBpZiAoJGVsLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgaWYgKFxuICAgICAgICBzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzXG4gICAgICAgICYmIHR5cGVvZiBwYXJhbXMuZWwgPT09ICdzdHJpbmcnXG4gICAgICAgICYmICRlbC5sZW5ndGggPiAxXG4gICAgICAgICYmIHN3aXBlci4kZWwuZmluZChwYXJhbXMuZWwpLmxlbmd0aCA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgICRlbCA9IHN3aXBlci4kZWwuZmluZChwYXJhbXMuZWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBwYXJhbXMuY2xpY2thYmxlKSB7XG4gICAgICAgICRlbC5hZGRDbGFzcyhwYXJhbXMuY2xpY2thYmxlQ2xhc3MpO1xuICAgICAgfVxuXG4gICAgICAkZWwuYWRkQ2xhc3MocGFyYW1zLm1vZGlmaWVyQ2xhc3MgKyBwYXJhbXMudHlwZSk7XG5cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2J1bGxldHMnICYmIHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAkZWwuYWRkQ2xhc3MoKFwiXCIgKyAocGFyYW1zLm1vZGlmaWVyQ2xhc3MpICsgKHBhcmFtcy50eXBlKSArIFwiLWR5bmFtaWNcIikpO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5keW5hbWljQnVsbGV0SW5kZXggPSAwO1xuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA8IDEpIHtcbiAgICAgICAgICBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAncHJvZ3Jlc3NiYXInICYmIHBhcmFtcy5wcm9ncmVzc2Jhck9wcG9zaXRlKSB7XG4gICAgICAgICRlbC5hZGRDbGFzcyhwYXJhbXMucHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5jbGlja2FibGUpIHtcbiAgICAgICAgJGVsLm9uKCdjbGljaycsIChcIi5cIiArIChwYXJhbXMuYnVsbGV0Q2xhc3MpKSwgZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHZhciBpbmRleCA9ICQodGhpcykuaW5kZXgoKSAqIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gICAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkgeyBpbmRleCArPSBzd2lwZXIubG9vcGVkU2xpZGVzOyB9XG4gICAgICAgICAgc3dpcGVyLnNsaWRlVG8oaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYWdpbmF0aW9uLCB7XG4gICAgICAgICRlbDogJGVsLFxuICAgICAgICBlbDogJGVsWzBdLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgICAgaWYgKCFwYXJhbXMuZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsIHx8ICFzd2lwZXIucGFnaW5hdGlvbi4kZWwgfHwgc3dpcGVyLnBhZ2luYXRpb24uJGVsLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICAgIHZhciAkZWwgPSBzd2lwZXIucGFnaW5hdGlvbi4kZWw7XG5cbiAgICAgICRlbC5yZW1vdmVDbGFzcyhwYXJhbXMuaGlkZGVuQ2xhc3MpO1xuICAgICAgJGVsLnJlbW92ZUNsYXNzKHBhcmFtcy5tb2RpZmllckNsYXNzICsgcGFyYW1zLnR5cGUpO1xuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMpIHsgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cy5yZW1vdmVDbGFzcyhwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpOyB9XG4gICAgICBpZiAocGFyYW1zLmNsaWNrYWJsZSkge1xuICAgICAgICAkZWwub2ZmKCdjbGljaycsIChcIi5cIiArIChwYXJhbXMuYnVsbGV0Q2xhc3MpKSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgUGFnaW5hdGlvbiQxID0ge1xuICAgIG5hbWU6ICdwYWdpbmF0aW9uJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgZWw6IG51bGwsXG4gICAgICAgIGJ1bGxldEVsZW1lbnQ6ICdzcGFuJyxcbiAgICAgICAgY2xpY2thYmxlOiBmYWxzZSxcbiAgICAgICAgaGlkZU9uQ2xpY2s6IGZhbHNlLFxuICAgICAgICByZW5kZXJCdWxsZXQ6IG51bGwsXG4gICAgICAgIHJlbmRlclByb2dyZXNzYmFyOiBudWxsLFxuICAgICAgICByZW5kZXJGcmFjdGlvbjogbnVsbCxcbiAgICAgICAgcmVuZGVyQ3VzdG9tOiBudWxsLFxuICAgICAgICBwcm9ncmVzc2Jhck9wcG9zaXRlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ2J1bGxldHMnLCAvLyAnYnVsbGV0cycgb3IgJ3Byb2dyZXNzYmFyJyBvciAnZnJhY3Rpb24nIG9yICdjdXN0b20nXG4gICAgICAgIGR5bmFtaWNCdWxsZXRzOiBmYWxzZSxcbiAgICAgICAgZHluYW1pY01haW5CdWxsZXRzOiAxLFxuICAgICAgICBmb3JtYXRGcmFjdGlvbkN1cnJlbnQ6IGZ1bmN0aW9uIChudW1iZXIpIHsgcmV0dXJuIG51bWJlcjsgfSxcbiAgICAgICAgZm9ybWF0RnJhY3Rpb25Ub3RhbDogZnVuY3Rpb24gKG51bWJlcikgeyByZXR1cm4gbnVtYmVyOyB9LFxuICAgICAgICBidWxsZXRDbGFzczogJ3N3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCcsXG4gICAgICAgIGJ1bGxldEFjdGl2ZUNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZScsXG4gICAgICAgIG1vZGlmaWVyQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi0nLCAvLyBORVdcbiAgICAgICAgY3VycmVudENsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tY3VycmVudCcsXG4gICAgICAgIHRvdGFsQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi10b3RhbCcsXG4gICAgICAgIGhpZGRlbkNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24taGlkZGVuJyxcbiAgICAgICAgcHJvZ3Jlc3NiYXJGaWxsQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1maWxsJyxcbiAgICAgICAgcHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXItb3Bwb3NpdGUnLFxuICAgICAgICBjbGlja2FibGVDbGFzczogJ3N3aXBlci1wYWdpbmF0aW9uLWNsaWNrYWJsZScsIC8vIE5FV1xuICAgICAgICBsb2NrQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi1sb2NrJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgaW5pdDogUGFnaW5hdGlvbi5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICByZW5kZXI6IFBhZ2luYXRpb24ucmVuZGVyLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICB1cGRhdGU6IFBhZ2luYXRpb24udXBkYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkZXN0cm95OiBQYWdpbmF0aW9uLmRlc3Ryb3kuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleDogMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5pbml0KCk7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLnJlbmRlcigpO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBhY3RpdmVJbmRleENoYW5nZTogZnVuY3Rpb24gYWN0aXZlSW5kZXhDaGFuZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN3aXBlci5zbmFwSW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzbmFwSW5kZXhDaGFuZ2U6IGZ1bmN0aW9uIHNuYXBJbmRleENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzbGlkZXNMZW5ndGhDaGFuZ2U6IGZ1bmN0aW9uIHNsaWRlc0xlbmd0aENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5yZW5kZXIoKTtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNuYXBHcmlkTGVuZ3RoQ2hhbmdlOiBmdW5jdGlvbiBzbmFwR3JpZExlbmd0aENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24ucmVuZGVyKCk7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmVsXG4gICAgICAgICAgJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGVPbkNsaWNrXG4gICAgICAgICAgJiYgc3dpcGVyLnBhZ2luYXRpb24uJGVsLmxlbmd0aCA+IDBcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmJ1bGxldENsYXNzKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBzd2lwZXIucGFnaW5hdGlvbi4kZWwuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdwYWdpbmF0aW9uU2hvdycsIHN3aXBlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdwYWdpbmF0aW9uSGlkZScsIHN3aXBlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLiRlbC50b2dnbGVDbGFzcyhzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFNjcm9sbGJhciA9IHtcbiAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCB8fCAhc3dpcGVyLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgcHJvZ3Jlc3MgPSBzd2lwZXIucHJvZ3Jlc3M7XG4gICAgICB2YXIgZHJhZ1NpemUgPSBzY3JvbGxiYXIuZHJhZ1NpemU7XG4gICAgICB2YXIgdHJhY2tTaXplID0gc2Nyb2xsYmFyLnRyYWNrU2l6ZTtcbiAgICAgIHZhciAkZHJhZ0VsID0gc2Nyb2xsYmFyLiRkcmFnRWw7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnNjcm9sbGJhcjtcblxuICAgICAgdmFyIG5ld1NpemUgPSBkcmFnU2l6ZTtcbiAgICAgIHZhciBuZXdQb3MgPSAodHJhY2tTaXplIC0gZHJhZ1NpemUpICogcHJvZ3Jlc3M7XG4gICAgICBpZiAocnRsKSB7XG4gICAgICAgIG5ld1BvcyA9IC1uZXdQb3M7XG4gICAgICAgIGlmIChuZXdQb3MgPiAwKSB7XG4gICAgICAgICAgbmV3U2l6ZSA9IGRyYWdTaXplIC0gbmV3UG9zO1xuICAgICAgICAgIG5ld1BvcyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoLW5ld1BvcyArIGRyYWdTaXplID4gdHJhY2tTaXplKSB7XG4gICAgICAgICAgbmV3U2l6ZSA9IHRyYWNrU2l6ZSArIG5ld1BvcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXdQb3MgPCAwKSB7XG4gICAgICAgIG5ld1NpemUgPSBkcmFnU2l6ZSArIG5ld1BvcztcbiAgICAgICAgbmV3UG9zID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UG9zICsgZHJhZ1NpemUgPiB0cmFja1NpemUpIHtcbiAgICAgICAgbmV3U2l6ZSA9IHRyYWNrU2l6ZSAtIG5ld1BvcztcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgaWYgKFN1cHBvcnQudHJhbnNmb3JtczNkKSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyBuZXdQb3MgKyBcInB4LCAwLCAwKVwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlWChcIiArIG5ld1BvcyArIFwicHgpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAkZHJhZ0VsWzBdLnN0eWxlLndpZHRoID0gbmV3U2l6ZSArIFwicHhcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChTdXBwb3J0LnRyYW5zZm9ybXMzZCkge1xuICAgICAgICAgICRkcmFnRWwudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDBweCwgXCIgKyBuZXdQb3MgKyBcInB4LCAwKVwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlWShcIiArIG5ld1BvcyArIFwicHgpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAkZHJhZ0VsWzBdLnN0eWxlLmhlaWdodCA9IG5ld1NpemUgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5zY3JvbGxiYXIudGltZW91dCk7XG4gICAgICAgICRlbFswXS5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJGVsWzBdLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICRlbC50cmFuc2l0aW9uKDQwMCk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmVsIHx8ICFzd2lwZXIuc2Nyb2xsYmFyLmVsKSB7IHJldHVybjsgfVxuICAgICAgc3dpcGVyLnNjcm9sbGJhci4kZHJhZ0VsLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgIH0sXG4gICAgdXBkYXRlU2l6ZTogZnVuY3Rpb24gdXBkYXRlU2l6ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCB8fCAhc3dpcGVyLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cblxuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgJGRyYWdFbCA9IHNjcm9sbGJhci4kZHJhZ0VsO1xuICAgICAgdmFyICRlbCA9IHNjcm9sbGJhci4kZWw7XG5cbiAgICAgICRkcmFnRWxbMF0uc3R5bGUud2lkdGggPSAnJztcbiAgICAgICRkcmFnRWxbMF0uc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICB2YXIgdHJhY2tTaXplID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJGVsWzBdLm9mZnNldFdpZHRoIDogJGVsWzBdLm9mZnNldEhlaWdodDtcblxuICAgICAgdmFyIGRpdmlkZXIgPSBzd2lwZXIuc2l6ZSAvIHN3aXBlci52aXJ0dWFsU2l6ZTtcbiAgICAgIHZhciBtb3ZlRGl2aWRlciA9IGRpdmlkZXIgKiAodHJhY2tTaXplIC8gc3dpcGVyLnNpemUpO1xuICAgICAgdmFyIGRyYWdTaXplO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmRyYWdTaXplID09PSAnYXV0bycpIHtcbiAgICAgICAgZHJhZ1NpemUgPSB0cmFja1NpemUgKiBkaXZpZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ1NpemUgPSBwYXJzZUludChzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5kcmFnU2l6ZSwgMTApO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICRkcmFnRWxbMF0uc3R5bGUud2lkdGggPSBkcmFnU2l6ZSArIFwicHhcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRkcmFnRWxbMF0uc3R5bGUuaGVpZ2h0ID0gZHJhZ1NpemUgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXZpZGVyID49IDEpIHtcbiAgICAgICAgJGVsWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZWxbMF0uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmhpZGUpIHtcbiAgICAgICAgJGVsWzBdLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgfVxuICAgICAgVXRpbHMuZXh0ZW5kKHNjcm9sbGJhciwge1xuICAgICAgICB0cmFja1NpemU6IHRyYWNrU2l6ZSxcbiAgICAgICAgZGl2aWRlcjogZGl2aWRlcixcbiAgICAgICAgbW92ZURpdmlkZXI6IG1vdmVEaXZpZGVyLFxuICAgICAgICBkcmFnU2l6ZTogZHJhZ1NpemUsXG4gICAgICB9KTtcbiAgICAgIHNjcm9sbGJhci4kZWxbc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93ICYmIHN3aXBlci5pc0xvY2tlZCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXShzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5sb2NrQ2xhc3MpO1xuICAgIH0sXG4gICAgZ2V0UG9pbnRlclBvc2l0aW9uOiBmdW5jdGlvbiBnZXRQb2ludGVyUG9zaXRpb24oZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgIHJldHVybiAoKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PT0gJ3RvdWNobW92ZScpID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWCB8fCBlLmNsaWVudFgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgoZS50eXBlID09PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09PSAndG91Y2htb3ZlJykgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZIHx8IGUuY2xpZW50WSk7XG4gICAgfSxcbiAgICBzZXREcmFnUG9zaXRpb246IGZ1bmN0aW9uIHNldERyYWdQb3NpdGlvbihlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciBkcmFnU2l6ZSA9IHNjcm9sbGJhci5kcmFnU2l6ZTtcbiAgICAgIHZhciB0cmFja1NpemUgPSBzY3JvbGxiYXIudHJhY2tTaXplO1xuICAgICAgdmFyIGRyYWdTdGFydFBvcyA9IHNjcm9sbGJhci5kcmFnU3RhcnRQb3M7XG5cbiAgICAgIHZhciBwb3NpdGlvblJhdGlvO1xuICAgICAgcG9zaXRpb25SYXRpbyA9ICgoc2Nyb2xsYmFyLmdldFBvaW50ZXJQb3NpdGlvbihlKSkgLSAkZWwub2Zmc2V0KClbc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ2xlZnQnIDogJ3RvcCddXG4gICAgICAgIC0gKGRyYWdTdGFydFBvcyAhPT0gbnVsbCA/IGRyYWdTdGFydFBvcyA6IGRyYWdTaXplIC8gMikpIC8gKHRyYWNrU2l6ZSAtIGRyYWdTaXplKTtcbiAgICAgIHBvc2l0aW9uUmF0aW8gPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvblJhdGlvLCAxKSwgMCk7XG4gICAgICBpZiAocnRsKSB7XG4gICAgICAgIHBvc2l0aW9uUmF0aW8gPSAxIC0gcG9zaXRpb25SYXRpbztcbiAgICAgIH1cblxuICAgICAgdmFyIHBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpICsgKChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpICogcG9zaXRpb25SYXRpbyk7XG5cbiAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcyhwb3NpdGlvbik7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHBvc2l0aW9uKTtcbiAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICB9LFxuICAgIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBvbkRyYWdTdGFydChlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnNjcm9sbGJhcjtcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyICRkcmFnRWwgPSBzY3JvbGxiYXIuJGRyYWdFbDtcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuaXNUb3VjaGVkID0gdHJ1ZTtcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuZHJhZ1N0YXJ0UG9zID0gKGUudGFyZ2V0ID09PSAkZHJhZ0VsWzBdIHx8IGUudGFyZ2V0ID09PSAkZHJhZ0VsKVxuICAgICAgICA/IHNjcm9sbGJhci5nZXRQb2ludGVyUG9zaXRpb24oZSkgLSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnbGVmdCcgOiAndG9wJ10gOiBudWxsO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgJHdyYXBwZXJFbC50cmFuc2l0aW9uKDEwMCk7XG4gICAgICAkZHJhZ0VsLnRyYW5zaXRpb24oMTAwKTtcbiAgICAgIHNjcm9sbGJhci5zZXREcmFnUG9zaXRpb24oZSk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzd2lwZXIuc2Nyb2xsYmFyLmRyYWdUaW1lb3V0KTtcblxuICAgICAgJGVsLnRyYW5zaXRpb24oMCk7XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgJGVsLmNzcygnb3BhY2l0eScsIDEpO1xuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbGJhckRyYWdTdGFydCcsIGUpO1xuICAgIH0sXG4gICAgb25EcmFnTW92ZTogZnVuY3Rpb24gb25EcmFnTW92ZShlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyICRkcmFnRWwgPSBzY3JvbGxiYXIuJGRyYWdFbDtcblxuICAgICAgaWYgKCFzd2lwZXIuc2Nyb2xsYmFyLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgZWxzZSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfVxuICAgICAgc2Nyb2xsYmFyLnNldERyYWdQb3NpdGlvbihlKTtcbiAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbigwKTtcbiAgICAgICRlbC50cmFuc2l0aW9uKDApO1xuICAgICAgJGRyYWdFbC50cmFuc2l0aW9uKDApO1xuICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbGJhckRyYWdNb3ZlJywgZSk7XG4gICAgfSxcbiAgICBvbkRyYWdFbmQ6IGZ1bmN0aW9uIG9uRHJhZ0VuZChlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcblxuICAgICAgaWYgKCFzd2lwZXIuc2Nyb2xsYmFyLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5zY3JvbGxiYXIuZHJhZ1RpbWVvdXQpO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLmRyYWdUaW1lb3V0ID0gVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRlbC5jc3MoJ29wYWNpdHknLCAwKTtcbiAgICAgICAgICAkZWwudHJhbnNpdGlvbig0MDApO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzY3JvbGxiYXJEcmFnRW5kJywgZSk7XG4gICAgICBpZiAocGFyYW1zLnNuYXBPblJlbGVhc2UpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG9DbG9zZXN0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVEcmFnZ2FibGU6IGZ1bmN0aW9uIGVuYWJsZURyYWdnYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHRvdWNoRXZlbnRzVG91Y2ggPSBzd2lwZXIudG91Y2hFdmVudHNUb3VjaDtcbiAgICAgIHZhciB0b3VjaEV2ZW50c0Rlc2t0b3AgPSBzd2lwZXIudG91Y2hFdmVudHNEZXNrdG9wO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciB0YXJnZXQgPSAkZWxbMF07XG4gICAgICB2YXIgYWN0aXZlTGlzdGVuZXIgPSBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgaWYgKCFTdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5zdGFydCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdTdGFydCwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c0Rlc2t0b3AubW92ZSwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdNb3ZlLCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5lbmQsIHN3aXBlci5zY3JvbGxiYXIub25EcmFnRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNUb3VjaC5zdGFydCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdTdGFydCwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLm1vdmUsIHN3aXBlci5zY3JvbGxiYXIub25EcmFnTW92ZSwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLmVuZCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBkaXNhYmxlRHJhZ2dhYmxlOiBmdW5jdGlvbiBkaXNhYmxlRHJhZ2dhYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmVsKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgdG91Y2hFdmVudHNUb3VjaCA9IHN3aXBlci50b3VjaEV2ZW50c1RvdWNoO1xuICAgICAgdmFyIHRvdWNoRXZlbnRzRGVza3RvcCA9IHN3aXBlci50b3VjaEV2ZW50c0Rlc2t0b3A7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyIHRhcmdldCA9ICRlbFswXTtcbiAgICAgIHZhciBhY3RpdmVMaXN0ZW5lciA9IFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgdmFyIHBhc3NpdmVMaXN0ZW5lciA9IFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlOiBmYWxzZSB9IDogZmFsc2U7XG4gICAgICBpZiAoIVN1cHBvcnQudG91Y2gpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNEZXNrdG9wLnN0YXJ0LCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ1N0YXJ0LCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5tb3ZlLCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ01vdmUsIGFjdGl2ZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNEZXNrdG9wLmVuZCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLnN0YXJ0LCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ1N0YXJ0LCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzVG91Y2gubW92ZSwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdNb3ZlLCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzVG91Y2guZW5kLCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ0VuZCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5zY3JvbGxiYXIuZWwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc2Nyb2xsYmFyID0gc3dpcGVyLnNjcm9sbGJhcjtcbiAgICAgIHZhciAkc3dpcGVyRWwgPSBzd2lwZXIuJGVsO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyO1xuXG4gICAgICB2YXIgJGVsID0gJChwYXJhbXMuZWwpO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudW5pcXVlTmF2RWxlbWVudHMgJiYgdHlwZW9mIHBhcmFtcy5lbCA9PT0gJ3N0cmluZycgJiYgJGVsLmxlbmd0aCA+IDEgJiYgJHN3aXBlckVsLmZpbmQocGFyYW1zLmVsKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgJGVsID0gJHN3aXBlckVsLmZpbmQocGFyYW1zLmVsKTtcbiAgICAgIH1cblxuICAgICAgdmFyICRkcmFnRWwgPSAkZWwuZmluZCgoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zY3JvbGxiYXIuZHJhZ0NsYXNzKSkpO1xuICAgICAgaWYgKCRkcmFnRWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICRkcmFnRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcIlwiICsgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmRyYWdDbGFzcykgKyBcIlxcXCI+PC9kaXY+XCIpKTtcbiAgICAgICAgJGVsLmFwcGVuZCgkZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHNjcm9sbGJhciwge1xuICAgICAgICAkZWw6ICRlbCxcbiAgICAgICAgZWw6ICRlbFswXSxcbiAgICAgICAgJGRyYWdFbDogJGRyYWdFbCxcbiAgICAgICAgZHJhZ0VsOiAkZHJhZ0VsWzBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwYXJhbXMuZHJhZ2dhYmxlKSB7XG4gICAgICAgIHNjcm9sbGJhci5lbmFibGVEcmFnZ2FibGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuZGlzYWJsZURyYWdnYWJsZSgpO1xuICAgIH0sXG4gIH07XG5cbiAgdmFyIFNjcm9sbGJhciQxID0ge1xuICAgIG5hbWU6ICdzY3JvbGxiYXInLFxuICAgIHBhcmFtczoge1xuICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgIGVsOiBudWxsLFxuICAgICAgICBkcmFnU2l6ZTogJ2F1dG8nLFxuICAgICAgICBoaWRlOiBmYWxzZSxcbiAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgICAgc25hcE9uUmVsZWFzZTogdHJ1ZSxcbiAgICAgICAgbG9ja0NsYXNzOiAnc3dpcGVyLXNjcm9sbGJhci1sb2NrJyxcbiAgICAgICAgZHJhZ0NsYXNzOiAnc3dpcGVyLXNjcm9sbGJhci1kcmFnJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBzY3JvbGxiYXI6IHtcbiAgICAgICAgICBpbml0OiBTY3JvbGxiYXIuaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogU2Nyb2xsYmFyLmRlc3Ryb3kuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHVwZGF0ZVNpemU6IFNjcm9sbGJhci51cGRhdGVTaXplLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IFNjcm9sbGJhci5zZXRUcmFuc2xhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHNldFRyYW5zaXRpb246IFNjcm9sbGJhci5zZXRUcmFuc2l0aW9uLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBlbmFibGVEcmFnZ2FibGU6IFNjcm9sbGJhci5lbmFibGVEcmFnZ2FibGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGRpc2FibGVEcmFnZ2FibGU6IFNjcm9sbGJhci5kaXNhYmxlRHJhZ2dhYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXREcmFnUG9zaXRpb246IFNjcm9sbGJhci5zZXREcmFnUG9zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICAgIGdldFBvaW50ZXJQb3NpdGlvbjogU2Nyb2xsYmFyLmdldFBvaW50ZXJQb3NpdGlvbi5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25EcmFnU3RhcnQ6IFNjcm9sbGJhci5vbkRyYWdTdGFydC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25EcmFnTW92ZTogU2Nyb2xsYmFyLm9uRHJhZ01vdmUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uRHJhZ0VuZDogU2Nyb2xsYmFyLm9uRHJhZ0VuZC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgICAgICB0aW1lb3V0OiBudWxsLFxuICAgICAgICAgIGRyYWdUaW1lb3V0OiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuaW5pdCgpO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIudXBkYXRlU2l6ZSgpO1xuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci51cGRhdGVTaXplKCk7XG4gICAgICB9LFxuICAgICAgb2JzZXJ2ZXJVcGRhdGU6IGZ1bmN0aW9uIG9ic2VydmVyVXBkYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci51cGRhdGVTaXplKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLnNldFRyYW5zbGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuc2V0VHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBQYXJhbGxheCA9IHtcbiAgICBzZXRUcmFuc2Zvcm06IGZ1bmN0aW9uIHNldFRyYW5zZm9ybShlbCwgcHJvZ3Jlc3MpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGw7XG5cbiAgICAgIHZhciAkZWwgPSAkKGVsKTtcbiAgICAgIHZhciBydGxGYWN0b3IgPSBydGwgPyAtMSA6IDE7XG5cbiAgICAgIHZhciBwID0gJGVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4JykgfHwgJzAnO1xuICAgICAgdmFyIHggPSAkZWwuYXR0cignZGF0YS1zd2lwZXItcGFyYWxsYXgteCcpO1xuICAgICAgdmFyIHkgPSAkZWwuYXR0cignZGF0YS1zd2lwZXItcGFyYWxsYXgteScpO1xuICAgICAgdmFyIHNjYWxlID0gJGVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4LXNjYWxlJyk7XG4gICAgICB2YXIgb3BhY2l0eSA9ICRlbC5hdHRyKCdkYXRhLXN3aXBlci1wYXJhbGxheC1vcGFjaXR5Jyk7XG5cbiAgICAgIGlmICh4IHx8IHkpIHtcbiAgICAgICAgeCA9IHggfHwgJzAnO1xuICAgICAgICB5ID0geSB8fCAnMCc7XG4gICAgICB9IGVsc2UgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgICAgICB4ID0gcDtcbiAgICAgICAgeSA9ICcwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkgPSBwO1xuICAgICAgICB4ID0gJzAnO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHgpLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgICAgIHggPSAocGFyc2VJbnQoeCwgMTApICogcHJvZ3Jlc3MgKiBydGxGYWN0b3IpICsgXCIlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gKHggKiBwcm9ncmVzcyAqIHJ0bEZhY3RvcikgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBpZiAoKHkpLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgICAgIHkgPSAocGFyc2VJbnQoeSwgMTApICogcHJvZ3Jlc3MpICsgXCIlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5ID0gKHkgKiBwcm9ncmVzcykgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3BhY2l0eSAhPT0gJ3VuZGVmaW5lZCcgJiYgb3BhY2l0eSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY3VycmVudE9wYWNpdHkgPSBvcGFjaXR5IC0gKChvcGFjaXR5IC0gMSkgKiAoMSAtIE1hdGguYWJzKHByb2dyZXNzKSkpO1xuICAgICAgICAkZWxbMF0uc3R5bGUub3BhY2l0eSA9IGN1cnJlbnRPcGFjaXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzY2FsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2NhbGUgPT09IG51bGwpIHtcbiAgICAgICAgJGVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIDBweClcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY2FsZSA9IHNjYWxlIC0gKChzY2FsZSAtIDEpICogKDEgLSBNYXRoLmFicyhwcm9ncmVzcykpKTtcbiAgICAgICAgJGVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIDBweCkgc2NhbGUoXCIgKyBjdXJyZW50U2NhbGUgKyBcIilcIikpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciAkZWwgPSBzd2lwZXIuJGVsO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgcHJvZ3Jlc3MgPSBzd2lwZXIucHJvZ3Jlc3M7XG4gICAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgICAkZWwuY2hpbGRyZW4oJ1tkYXRhLXN3aXBlci1wYXJhbGxheF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC14XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LXldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtb3BhY2l0eV0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC1zY2FsZV0nKVxuICAgICAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsKSB7XG4gICAgICAgICAgc3dpcGVyLnBhcmFsbGF4LnNldFRyYW5zZm9ybShlbCwgcHJvZ3Jlc3MpO1xuICAgICAgICB9KTtcbiAgICAgIHNsaWRlcy5lYWNoKGZ1bmN0aW9uIChzbGlkZUluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgIHZhciBzbGlkZVByb2dyZXNzID0gc2xpZGVFbC5wcm9ncmVzcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXAgPiAxICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgc2xpZGVQcm9ncmVzcyArPSBNYXRoLmNlaWwoc2xpZGVJbmRleCAvIDIpIC0gKHByb2dyZXNzICogKHNuYXBHcmlkLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBzbGlkZVByb2dyZXNzID0gTWF0aC5taW4oTWF0aC5tYXgoc2xpZGVQcm9ncmVzcywgLTEpLCAxKTtcbiAgICAgICAgJChzbGlkZUVsKS5maW5kKCdbZGF0YS1zd2lwZXItcGFyYWxsYXhdLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgteF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC15XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LW9wYWNpdHldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtc2NhbGVdJylcbiAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsKSB7XG4gICAgICAgICAgICBzd2lwZXIucGFyYWxsYXguc2V0VHJhbnNmb3JtKGVsLCBzbGlkZVByb2dyZXNzKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgaWYgKCBkdXJhdGlvbiA9PT0gdm9pZCAwICkgZHVyYXRpb24gPSB0aGlzLnBhcmFtcy5zcGVlZDtcblxuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgICRlbC5maW5kKCdbZGF0YS1zd2lwZXItcGFyYWxsYXhdLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgteF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC15XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LW9wYWNpdHldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtc2NhbGVdJylcbiAgICAgICAgLmVhY2goZnVuY3Rpb24gKGluZGV4LCBwYXJhbGxheEVsKSB7XG4gICAgICAgICAgdmFyICRwYXJhbGxheEVsID0gJChwYXJhbGxheEVsKTtcbiAgICAgICAgICB2YXIgcGFyYWxsYXhEdXJhdGlvbiA9IHBhcnNlSW50KCRwYXJhbGxheEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4LWR1cmF0aW9uJyksIDEwKSB8fCBkdXJhdGlvbjtcbiAgICAgICAgICBpZiAoZHVyYXRpb24gPT09IDApIHsgcGFyYWxsYXhEdXJhdGlvbiA9IDA7IH1cbiAgICAgICAgICAkcGFyYWxsYXhFbC50cmFuc2l0aW9uKHBhcmFsbGF4RHVyYXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBQYXJhbGxheCQxID0ge1xuICAgIG5hbWU6ICdwYXJhbGxheCcsXG4gICAgcGFyYW1zOiB7XG4gICAgICBwYXJhbGxheDoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBwYXJhbGxheDoge1xuICAgICAgICAgIHNldFRyYW5zZm9ybTogUGFyYWxsYXguc2V0VHJhbnNmb3JtLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IFBhcmFsbGF4LnNldFRyYW5zbGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0VHJhbnNpdGlvbjogUGFyYWxsYXguc2V0VHJhbnNpdGlvbi5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHN3aXBlci5vcmlnaW5hbFBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbGxheC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5wYXJhbGxheC5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIucGFyYWxsYXguc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbGxheC5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgWm9vbSA9IHtcbiAgICAvLyBDYWxjIFNjYWxlIEZyb20gTXVsdGktdG91Y2hlc1xuICAgIGdldERpc3RhbmNlQmV0d2VlblRvdWNoZXM6IGZ1bmN0aW9uIGdldERpc3RhbmNlQmV0d2VlblRvdWNoZXMoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPCAyKSB7IHJldHVybiAxOyB9XG4gICAgICB2YXIgeDEgPSBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICB2YXIgeTEgPSBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICB2YXIgeDIgPSBlLnRhcmdldFRvdWNoZXNbMV0ucGFnZVg7XG4gICAgICB2YXIgeTIgPSBlLnRhcmdldFRvdWNoZXNbMV0ucGFnZVk7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKE1hdGgucG93KCAoeDIgLSB4MSksIDIgKSkgKyAoTWF0aC5wb3coICh5MiAtIHkxKSwgMiApKSk7XG4gICAgICByZXR1cm4gZGlzdGFuY2U7XG4gICAgfSxcbiAgICAvLyBFdmVudHNcbiAgICBvbkdlc3R1cmVTdGFydDogZnVuY3Rpb24gb25HZXN0dXJlU3RhcnQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy56b29tO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgPSBmYWxzZTtcbiAgICAgIHpvb20uZmFrZUdlc3R1cmVNb3ZlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIGlmIChlLnR5cGUgIT09ICd0b3VjaHN0YXJ0JyB8fCAoZS50eXBlID09PSAndG91Y2hzdGFydCcgJiYgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA8IDIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHpvb20uZmFrZUdlc3R1cmVUb3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgZ2VzdHVyZS5zY2FsZVN0YXJ0ID0gWm9vbS5nZXREaXN0YW5jZUJldHdlZW5Ub3VjaGVzKGUpO1xuICAgICAgfVxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsIHx8ICFnZXN0dXJlLiRzbGlkZUVsLmxlbmd0aCkge1xuICAgICAgICBnZXN0dXJlLiRzbGlkZUVsID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLnN3aXBlci1zbGlkZScpO1xuICAgICAgICBpZiAoZ2VzdHVyZS4kc2xpZGVFbC5sZW5ndGggPT09IDApIHsgZ2VzdHVyZS4kc2xpZGVFbCA9IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTsgfVxuICAgICAgICBnZXN0dXJlLiRpbWFnZUVsID0gZ2VzdHVyZS4kc2xpZGVFbC5maW5kKCdpbWcsIHN2ZywgY2FudmFzJyk7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsID0gZ2VzdHVyZS4kaW1hZ2VFbC5wYXJlbnQoKFwiLlwiICsgKHBhcmFtcy5jb250YWluZXJDbGFzcykpKTtcbiAgICAgICAgZ2VzdHVyZS5tYXhSYXRpbyA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICAgIGlmIChnZXN0dXJlLiRpbWFnZVdyYXBFbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBnZXN0dXJlLiRpbWFnZUVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZ2VzdHVyZS4kaW1hZ2VFbC50cmFuc2l0aW9uKDApO1xuICAgICAgc3dpcGVyLnpvb20uaXNTY2FsaW5nID0gdHJ1ZTtcbiAgICB9LFxuICAgIG9uR2VzdHVyZUNoYW5nZTogZnVuY3Rpb24gb25HZXN0dXJlQ2hhbmdlKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuem9vbTtcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcbiAgICAgIGlmICghU3VwcG9ydC5nZXN0dXJlcykge1xuICAgICAgICBpZiAoZS50eXBlICE9PSAndG91Y2htb3ZlJyB8fCAoZS50eXBlID09PSAndG91Y2htb3ZlJyAmJiBlLnRhcmdldFRvdWNoZXMubGVuZ3RoIDwgMikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZU1vdmVkID0gdHJ1ZTtcbiAgICAgICAgZ2VzdHVyZS5zY2FsZU1vdmUgPSBab29tLmdldERpc3RhbmNlQmV0d2VlblRvdWNoZXMoZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBpZiAoU3VwcG9ydC5nZXN0dXJlcykge1xuICAgICAgICB6b29tLnNjYWxlID0gZS5zY2FsZSAqIHpvb20uY3VycmVudFNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgem9vbS5zY2FsZSA9IChnZXN0dXJlLnNjYWxlTW92ZSAvIGdlc3R1cmUuc2NhbGVTdGFydCkgKiB6b29tLmN1cnJlbnRTY2FsZTtcbiAgICAgIH1cbiAgICAgIGlmICh6b29tLnNjYWxlID4gZ2VzdHVyZS5tYXhSYXRpbykge1xuICAgICAgICB6b29tLnNjYWxlID0gKGdlc3R1cmUubWF4UmF0aW8gLSAxKSArIChNYXRoLnBvdyggKCh6b29tLnNjYWxlIC0gZ2VzdHVyZS5tYXhSYXRpbykgKyAxKSwgMC41ICkpO1xuICAgICAgfVxuICAgICAgaWYgKHpvb20uc2NhbGUgPCBwYXJhbXMubWluUmF0aW8pIHtcbiAgICAgICAgem9vbS5zY2FsZSA9IChwYXJhbXMubWluUmF0aW8gKyAxKSAtIChNYXRoLnBvdyggKChwYXJhbXMubWluUmF0aW8gLSB6b29tLnNjYWxlKSArIDEpLCAwLjUgKSk7XG4gICAgICB9XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoXCIgKyAoem9vbS5zY2FsZSkgKyBcIilcIikpO1xuICAgIH0sXG4gICAgb25HZXN0dXJlRW5kOiBmdW5jdGlvbiBvbkdlc3R1cmVFbmQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy56b29tO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgaWYgKCFTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIGlmICghem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgfHwgIXpvb20uZmFrZUdlc3R1cmVNb3ZlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS50eXBlICE9PSAndG91Y2hlbmQnIHx8IChlLnR5cGUgPT09ICd0b3VjaGVuZCcgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPCAyICYmICFEZXZpY2UuYW5kcm9pZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZU1vdmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICB6b29tLnNjYWxlID0gTWF0aC5tYXgoTWF0aC5taW4oem9vbS5zY2FsZSwgZ2VzdHVyZS5tYXhSYXRpbyksIHBhcmFtcy5taW5SYXRpbyk7XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zaXRpb24oc3dpcGVyLnBhcmFtcy5zcGVlZCkudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZShcIiArICh6b29tLnNjYWxlKSArIFwiKVwiKSk7XG4gICAgICB6b29tLmN1cnJlbnRTY2FsZSA9IHpvb20uc2NhbGU7XG4gICAgICB6b29tLmlzU2NhbGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHpvb20uc2NhbGUgPT09IDEpIHsgZ2VzdHVyZS4kc2xpZGVFbCA9IHVuZGVmaW5lZDsgfVxuICAgIH0sXG4gICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIGdlc3R1cmUgPSB6b29tLmdlc3R1cmU7XG4gICAgICB2YXIgaW1hZ2UgPSB6b29tLmltYWdlO1xuICAgICAgaWYgKCFnZXN0dXJlLiRpbWFnZUVsIHx8IGdlc3R1cmUuJGltYWdlRWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgaWYgKGltYWdlLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChEZXZpY2UuYW5kcm9pZCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgIGltYWdlLmlzVG91Y2hlZCA9IHRydWU7XG4gICAgICBpbWFnZS50b3VjaGVzU3RhcnQueCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICAgIGltYWdlLnRvdWNoZXNTdGFydC55ID0gZS50eXBlID09PSAndG91Y2hzdGFydCcgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZO1xuICAgIH0sXG4gICAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgdmFyIGltYWdlID0gem9vbS5pbWFnZTtcbiAgICAgIHZhciB2ZWxvY2l0eSA9IHpvb20udmVsb2NpdHk7XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuYWxsb3dDbGljayA9IGZhbHNlO1xuICAgICAgaWYgKCFpbWFnZS5pc1RvdWNoZWQgfHwgIWdlc3R1cmUuJHNsaWRlRWwpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmICghaW1hZ2UuaXNNb3ZlZCkge1xuICAgICAgICBpbWFnZS53aWR0aCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGltYWdlLmhlaWdodCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBpbWFnZS5zdGFydFggPSBVdGlscy5nZXRUcmFuc2xhdGUoZ2VzdHVyZS4kaW1hZ2VXcmFwRWxbMF0sICd4JykgfHwgMDtcbiAgICAgICAgaW1hZ2Uuc3RhcnRZID0gVXRpbHMuZ2V0VHJhbnNsYXRlKGdlc3R1cmUuJGltYWdlV3JhcEVsWzBdLCAneScpIHx8IDA7XG4gICAgICAgIGdlc3R1cmUuc2xpZGVXaWR0aCA9IGdlc3R1cmUuJHNsaWRlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGdlc3R1cmUuc2xpZGVIZWlnaHQgPSBnZXN0dXJlLiRzbGlkZUVsWzBdLm9mZnNldEhlaWdodDtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigwKTtcbiAgICAgICAgaWYgKHN3aXBlci5ydGwpIHtcbiAgICAgICAgICBpbWFnZS5zdGFydFggPSAtaW1hZ2Uuc3RhcnRYO1xuICAgICAgICAgIGltYWdlLnN0YXJ0WSA9IC1pbWFnZS5zdGFydFk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpZiB3ZSBuZWVkIGltYWdlIGRyYWdcbiAgICAgIHZhciBzY2FsZWRXaWR0aCA9IGltYWdlLndpZHRoICogem9vbS5zY2FsZTtcbiAgICAgIHZhciBzY2FsZWRIZWlnaHQgPSBpbWFnZS5oZWlnaHQgKiB6b29tLnNjYWxlO1xuXG4gICAgICBpZiAoc2NhbGVkV2lkdGggPCBnZXN0dXJlLnNsaWRlV2lkdGggJiYgc2NhbGVkSGVpZ2h0IDwgZ2VzdHVyZS5zbGlkZUhlaWdodCkgeyByZXR1cm47IH1cblxuICAgICAgaW1hZ2UubWluWCA9IE1hdGgubWluKCgoZ2VzdHVyZS5zbGlkZVdpZHRoIC8gMikgLSAoc2NhbGVkV2lkdGggLyAyKSksIDApO1xuICAgICAgaW1hZ2UubWF4WCA9IC1pbWFnZS5taW5YO1xuICAgICAgaW1hZ2UubWluWSA9IE1hdGgubWluKCgoZ2VzdHVyZS5zbGlkZUhlaWdodCAvIDIpIC0gKHNjYWxlZEhlaWdodCAvIDIpKSwgMCk7XG4gICAgICBpbWFnZS5tYXhZID0gLWltYWdlLm1pblk7XG5cbiAgICAgIGltYWdlLnRvdWNoZXNDdXJyZW50LnggPSBlLnR5cGUgPT09ICd0b3VjaG1vdmUnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICAgIGltYWdlLnRvdWNoZXNDdXJyZW50LnkgPSBlLnR5cGUgPT09ICd0b3VjaG1vdmUnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcblxuICAgICAgaWYgKCFpbWFnZS5pc01vdmVkICYmICF6b29tLmlzU2NhbGluZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLmlzSG9yaXpvbnRhbCgpXG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKE1hdGguZmxvb3IoaW1hZ2UubWluWCkgPT09IE1hdGguZmxvb3IoaW1hZ2Uuc3RhcnRYKSAmJiBpbWFnZS50b3VjaGVzQ3VycmVudC54IDwgaW1hZ2UudG91Y2hlc1N0YXJ0LngpXG4gICAgICAgICAgICB8fCAoTWF0aC5mbG9vcihpbWFnZS5tYXhYKSA9PT0gTWF0aC5mbG9vcihpbWFnZS5zdGFydFgpICYmIGltYWdlLnRvdWNoZXNDdXJyZW50LnggPiBpbWFnZS50b3VjaGVzU3RhcnQueClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGltYWdlLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBpZiAoXG4gICAgICAgICAgIXN3aXBlci5pc0hvcml6b250YWwoKVxuICAgICAgICAgICYmIChcbiAgICAgICAgICAgIChNYXRoLmZsb29yKGltYWdlLm1pblkpID09PSBNYXRoLmZsb29yKGltYWdlLnN0YXJ0WSkgJiYgaW1hZ2UudG91Y2hlc0N1cnJlbnQueSA8IGltYWdlLnRvdWNoZXNTdGFydC55KVxuICAgICAgICAgICAgfHwgKE1hdGguZmxvb3IoaW1hZ2UubWF4WSkgPT09IE1hdGguZmxvb3IoaW1hZ2Uuc3RhcnRZKSAmJiBpbWFnZS50b3VjaGVzQ3VycmVudC55ID4gaW1hZ2UudG91Y2hlc1N0YXJ0LnkpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpbWFnZS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGltYWdlLmlzTW92ZWQgPSB0cnVlO1xuICAgICAgaW1hZ2UuY3VycmVudFggPSAoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIGltYWdlLnRvdWNoZXNTdGFydC54KSArIGltYWdlLnN0YXJ0WDtcbiAgICAgIGltYWdlLmN1cnJlbnRZID0gKGltYWdlLnRvdWNoZXNDdXJyZW50LnkgLSBpbWFnZS50b3VjaGVzU3RhcnQueSkgKyBpbWFnZS5zdGFydFk7XG5cbiAgICAgIGlmIChpbWFnZS5jdXJyZW50WCA8IGltYWdlLm1pblgpIHtcbiAgICAgICAgaW1hZ2UuY3VycmVudFggPSAoaW1hZ2UubWluWCArIDEpIC0gKE1hdGgucG93KCAoKGltYWdlLm1pblggLSBpbWFnZS5jdXJyZW50WCkgKyAxKSwgMC44ICkpO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLmN1cnJlbnRYID4gaW1hZ2UubWF4WCkge1xuICAgICAgICBpbWFnZS5jdXJyZW50WCA9IChpbWFnZS5tYXhYIC0gMSkgKyAoTWF0aC5wb3coICgoaW1hZ2UuY3VycmVudFggLSBpbWFnZS5tYXhYKSArIDEpLCAwLjggKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5jdXJyZW50WSA8IGltYWdlLm1pblkpIHtcbiAgICAgICAgaW1hZ2UuY3VycmVudFkgPSAoaW1hZ2UubWluWSArIDEpIC0gKE1hdGgucG93KCAoKGltYWdlLm1pblkgLSBpbWFnZS5jdXJyZW50WSkgKyAxKSwgMC44ICkpO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLmN1cnJlbnRZID4gaW1hZ2UubWF4WSkge1xuICAgICAgICBpbWFnZS5jdXJyZW50WSA9IChpbWFnZS5tYXhZIC0gMSkgKyAoTWF0aC5wb3coICgoaW1hZ2UuY3VycmVudFkgLSBpbWFnZS5tYXhZKSArIDEpLCAwLjggKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlbG9jaXR5XG4gICAgICBpZiAoIXZlbG9jaXR5LnByZXZQb3NpdGlvblgpIHsgdmVsb2NpdHkucHJldlBvc2l0aW9uWCA9IGltYWdlLnRvdWNoZXNDdXJyZW50Lng7IH1cbiAgICAgIGlmICghdmVsb2NpdHkucHJldlBvc2l0aW9uWSkgeyB2ZWxvY2l0eS5wcmV2UG9zaXRpb25ZID0gaW1hZ2UudG91Y2hlc0N1cnJlbnQueTsgfVxuICAgICAgaWYgKCF2ZWxvY2l0eS5wcmV2VGltZSkgeyB2ZWxvY2l0eS5wcmV2VGltZSA9IERhdGUubm93KCk7IH1cbiAgICAgIHZlbG9jaXR5LnggPSAoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIHZlbG9jaXR5LnByZXZQb3NpdGlvblgpIC8gKERhdGUubm93KCkgLSB2ZWxvY2l0eS5wcmV2VGltZSkgLyAyO1xuICAgICAgdmVsb2NpdHkueSA9IChpbWFnZS50b3VjaGVzQ3VycmVudC55IC0gdmVsb2NpdHkucHJldlBvc2l0aW9uWSkgLyAoRGF0ZS5ub3coKSAtIHZlbG9jaXR5LnByZXZUaW1lKSAvIDI7XG4gICAgICBpZiAoTWF0aC5hYnMoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIHZlbG9jaXR5LnByZXZQb3NpdGlvblgpIDwgMikgeyB2ZWxvY2l0eS54ID0gMDsgfVxuICAgICAgaWYgKE1hdGguYWJzKGltYWdlLnRvdWNoZXNDdXJyZW50LnkgLSB2ZWxvY2l0eS5wcmV2UG9zaXRpb25ZKSA8IDIpIHsgdmVsb2NpdHkueSA9IDA7IH1cbiAgICAgIHZlbG9jaXR5LnByZXZQb3NpdGlvblggPSBpbWFnZS50b3VjaGVzQ3VycmVudC54O1xuICAgICAgdmVsb2NpdHkucHJldlBvc2l0aW9uWSA9IGltYWdlLnRvdWNoZXNDdXJyZW50Lnk7XG4gICAgICB2ZWxvY2l0eS5wcmV2VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIChpbWFnZS5jdXJyZW50WCkgKyBcInB4LCBcIiArIChpbWFnZS5jdXJyZW50WSkgKyBcInB4LDApXCIpKTtcbiAgICB9LFxuICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcbiAgICAgIHZhciBpbWFnZSA9IHpvb20uaW1hZ2U7XG4gICAgICB2YXIgdmVsb2NpdHkgPSB6b29tLnZlbG9jaXR5O1xuICAgICAgaWYgKCFnZXN0dXJlLiRpbWFnZUVsIHx8IGdlc3R1cmUuJGltYWdlRWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgaWYgKCFpbWFnZS5pc1RvdWNoZWQgfHwgIWltYWdlLmlzTW92ZWQpIHtcbiAgICAgICAgaW1hZ2UuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICAgIGltYWdlLmlzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW1hZ2UuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICBpbWFnZS5pc01vdmVkID0gZmFsc2U7XG4gICAgICB2YXIgbW9tZW50dW1EdXJhdGlvblggPSAzMDA7XG4gICAgICB2YXIgbW9tZW50dW1EdXJhdGlvblkgPSAzMDA7XG4gICAgICB2YXIgbW9tZW50dW1EaXN0YW5jZVggPSB2ZWxvY2l0eS54ICogbW9tZW50dW1EdXJhdGlvblg7XG4gICAgICB2YXIgbmV3UG9zaXRpb25YID0gaW1hZ2UuY3VycmVudFggKyBtb21lbnR1bURpc3RhbmNlWDtcbiAgICAgIHZhciBtb21lbnR1bURpc3RhbmNlWSA9IHZlbG9jaXR5LnkgKiBtb21lbnR1bUR1cmF0aW9uWTtcbiAgICAgIHZhciBuZXdQb3NpdGlvblkgPSBpbWFnZS5jdXJyZW50WSArIG1vbWVudHVtRGlzdGFuY2VZO1xuXG4gICAgICAvLyBGaXggZHVyYXRpb25cbiAgICAgIGlmICh2ZWxvY2l0eS54ICE9PSAwKSB7IG1vbWVudHVtRHVyYXRpb25YID0gTWF0aC5hYnMoKG5ld1Bvc2l0aW9uWCAtIGltYWdlLmN1cnJlbnRYKSAvIHZlbG9jaXR5LngpOyB9XG4gICAgICBpZiAodmVsb2NpdHkueSAhPT0gMCkgeyBtb21lbnR1bUR1cmF0aW9uWSA9IE1hdGguYWJzKChuZXdQb3NpdGlvblkgLSBpbWFnZS5jdXJyZW50WSkgLyB2ZWxvY2l0eS55KTsgfVxuICAgICAgdmFyIG1vbWVudHVtRHVyYXRpb24gPSBNYXRoLm1heChtb21lbnR1bUR1cmF0aW9uWCwgbW9tZW50dW1EdXJhdGlvblkpO1xuXG4gICAgICBpbWFnZS5jdXJyZW50WCA9IG5ld1Bvc2l0aW9uWDtcbiAgICAgIGltYWdlLmN1cnJlbnRZID0gbmV3UG9zaXRpb25ZO1xuXG4gICAgICAvLyBEZWZpbmUgaWYgd2UgbmVlZCBpbWFnZSBkcmFnXG4gICAgICB2YXIgc2NhbGVkV2lkdGggPSBpbWFnZS53aWR0aCAqIHpvb20uc2NhbGU7XG4gICAgICB2YXIgc2NhbGVkSGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0ICogem9vbS5zY2FsZTtcbiAgICAgIGltYWdlLm1pblggPSBNYXRoLm1pbigoKGdlc3R1cmUuc2xpZGVXaWR0aCAvIDIpIC0gKHNjYWxlZFdpZHRoIC8gMikpLCAwKTtcbiAgICAgIGltYWdlLm1heFggPSAtaW1hZ2UubWluWDtcbiAgICAgIGltYWdlLm1pblkgPSBNYXRoLm1pbigoKGdlc3R1cmUuc2xpZGVIZWlnaHQgLyAyKSAtIChzY2FsZWRIZWlnaHQgLyAyKSksIDApO1xuICAgICAgaW1hZ2UubWF4WSA9IC1pbWFnZS5taW5ZO1xuICAgICAgaW1hZ2UuY3VycmVudFggPSBNYXRoLm1heChNYXRoLm1pbihpbWFnZS5jdXJyZW50WCwgaW1hZ2UubWF4WCksIGltYWdlLm1pblgpO1xuICAgICAgaW1hZ2UuY3VycmVudFkgPSBNYXRoLm1heChNYXRoLm1pbihpbWFnZS5jdXJyZW50WSwgaW1hZ2UubWF4WSksIGltYWdlLm1pblkpO1xuXG4gICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbC50cmFuc2l0aW9uKG1vbWVudHVtRHVyYXRpb24pLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIChpbWFnZS5jdXJyZW50WCkgKyBcInB4LCBcIiArIChpbWFnZS5jdXJyZW50WSkgKyBcInB4LDApXCIpKTtcbiAgICB9LFxuICAgIG9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIGdlc3R1cmUgPSB6b29tLmdlc3R1cmU7XG4gICAgICBpZiAoZ2VzdHVyZS4kc2xpZGVFbCAmJiBzd2lwZXIucHJldmlvdXNJbmRleCAhPT0gc3dpcGVyLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlRWwudHJhbnNmb3JtKCd0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoMSknKTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNmb3JtKCd0cmFuc2xhdGUzZCgwLDAsMCknKTtcblxuICAgICAgICB6b29tLnNjYWxlID0gMTtcbiAgICAgICAgem9vbS5jdXJyZW50U2NhbGUgPSAxO1xuXG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlRWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gVG9nZ2xlIFpvb21cbiAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG5cbiAgICAgIGlmICh6b29tLnNjYWxlICYmIHpvb20uc2NhbGUgIT09IDEpIHtcbiAgICAgICAgLy8gWm9vbSBPdXRcbiAgICAgICAgem9vbS5vdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFpvb20gSW5cbiAgICAgICAgem9vbS5pbihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluOiBmdW5jdGlvbiBpbiQxKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuXG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgdmFyIGltYWdlID0gem9vbS5pbWFnZTtcblxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsKSB7XG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSBzd2lwZXIuY2xpY2tlZFNsaWRlID8gJChzd2lwZXIuY2xpY2tlZFNsaWRlKSA6IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VFbCA9IGdlc3R1cmUuJHNsaWRlRWwuZmluZCgnaW1nLCBzdmcsIGNhbnZhcycpO1xuICAgICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbCA9IGdlc3R1cmUuJGltYWdlRWwucGFyZW50KChcIi5cIiArIChwYXJhbXMuY29udGFpbmVyQ2xhc3MpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIGdlc3R1cmUuJHNsaWRlRWwuYWRkQ2xhc3MoKFwiXCIgKyAocGFyYW1zLnpvb21lZFNsaWRlQ2xhc3MpKSk7XG5cbiAgICAgIHZhciB0b3VjaFg7XG4gICAgICB2YXIgdG91Y2hZO1xuICAgICAgdmFyIG9mZnNldFg7XG4gICAgICB2YXIgb2Zmc2V0WTtcbiAgICAgIHZhciBkaWZmWDtcbiAgICAgIHZhciBkaWZmWTtcbiAgICAgIHZhciB0cmFuc2xhdGVYO1xuICAgICAgdmFyIHRyYW5zbGF0ZVk7XG4gICAgICB2YXIgaW1hZ2VXaWR0aDtcbiAgICAgIHZhciBpbWFnZUhlaWdodDtcbiAgICAgIHZhciBzY2FsZWRXaWR0aDtcbiAgICAgIHZhciBzY2FsZWRIZWlnaHQ7XG4gICAgICB2YXIgdHJhbnNsYXRlTWluWDtcbiAgICAgIHZhciB0cmFuc2xhdGVNaW5ZO1xuICAgICAgdmFyIHRyYW5zbGF0ZU1heFg7XG4gICAgICB2YXIgdHJhbnNsYXRlTWF4WTtcbiAgICAgIHZhciBzbGlkZVdpZHRoO1xuICAgICAgdmFyIHNsaWRlSGVpZ2h0O1xuXG4gICAgICBpZiAodHlwZW9mIGltYWdlLnRvdWNoZXNTdGFydC54ID09PSAndW5kZWZpbmVkJyAmJiBlKSB7XG4gICAgICAgIHRvdWNoWCA9IGUudHlwZSA9PT0gJ3RvdWNoZW5kJyA/IGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVggOiBlLnBhZ2VYO1xuICAgICAgICB0b3VjaFkgPSBlLnR5cGUgPT09ICd0b3VjaGVuZCcgPyBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdWNoWCA9IGltYWdlLnRvdWNoZXNTdGFydC54O1xuICAgICAgICB0b3VjaFkgPSBpbWFnZS50b3VjaGVzU3RhcnQueTtcbiAgICAgIH1cblxuICAgICAgem9vbS5zY2FsZSA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICB6b29tLmN1cnJlbnRTY2FsZSA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICBpZiAoZSkge1xuICAgICAgICBzbGlkZVdpZHRoID0gZ2VzdHVyZS4kc2xpZGVFbFswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgc2xpZGVIZWlnaHQgPSBnZXN0dXJlLiRzbGlkZUVsWzBdLm9mZnNldEhlaWdodDtcbiAgICAgICAgb2Zmc2V0WCA9IGdlc3R1cmUuJHNsaWRlRWwub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgb2Zmc2V0WSA9IGdlc3R1cmUuJHNsaWRlRWwub2Zmc2V0KCkudG9wO1xuICAgICAgICBkaWZmWCA9IChvZmZzZXRYICsgKHNsaWRlV2lkdGggLyAyKSkgLSB0b3VjaFg7XG4gICAgICAgIGRpZmZZID0gKG9mZnNldFkgKyAoc2xpZGVIZWlnaHQgLyAyKSkgLSB0b3VjaFk7XG5cbiAgICAgICAgaW1hZ2VXaWR0aCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGltYWdlSGVpZ2h0ID0gZ2VzdHVyZS4kaW1hZ2VFbFswXS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHNjYWxlZFdpZHRoID0gaW1hZ2VXaWR0aCAqIHpvb20uc2NhbGU7XG4gICAgICAgIHNjYWxlZEhlaWdodCA9IGltYWdlSGVpZ2h0ICogem9vbS5zY2FsZTtcblxuICAgICAgICB0cmFuc2xhdGVNaW5YID0gTWF0aC5taW4oKChzbGlkZVdpZHRoIC8gMikgLSAoc2NhbGVkV2lkdGggLyAyKSksIDApO1xuICAgICAgICB0cmFuc2xhdGVNaW5ZID0gTWF0aC5taW4oKChzbGlkZUhlaWdodCAvIDIpIC0gKHNjYWxlZEhlaWdodCAvIDIpKSwgMCk7XG4gICAgICAgIHRyYW5zbGF0ZU1heFggPSAtdHJhbnNsYXRlTWluWDtcbiAgICAgICAgdHJhbnNsYXRlTWF4WSA9IC10cmFuc2xhdGVNaW5ZO1xuXG4gICAgICAgIHRyYW5zbGF0ZVggPSBkaWZmWCAqIHpvb20uc2NhbGU7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSBkaWZmWSAqIHpvb20uc2NhbGU7XG5cbiAgICAgICAgaWYgKHRyYW5zbGF0ZVggPCB0cmFuc2xhdGVNaW5YKSB7XG4gICAgICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZU1pblg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zbGF0ZVggPiB0cmFuc2xhdGVNYXhYKSB7XG4gICAgICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZU1heFg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhbnNsYXRlWSA8IHRyYW5zbGF0ZU1pblkpIHtcbiAgICAgICAgICB0cmFuc2xhdGVZID0gdHJhbnNsYXRlTWluWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNsYXRlWSA+IHRyYW5zbGF0ZU1heFkpIHtcbiAgICAgICAgICB0cmFuc2xhdGVZID0gdHJhbnNsYXRlTWF4WTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNsYXRlWCA9IDA7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAwO1xuICAgICAgfVxuICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHRyYW5zbGF0ZVggKyBcInB4LCBcIiArIHRyYW5zbGF0ZVkgKyBcInB4LDApXCIpKTtcbiAgICAgIGdlc3R1cmUuJGltYWdlRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoXCIgKyAoem9vbS5zY2FsZSkgKyBcIilcIikpO1xuICAgIH0sXG4gICAgb3V0OiBmdW5jdGlvbiBvdXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcblxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsKSB7XG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSBzd2lwZXIuY2xpY2tlZFNsaWRlID8gJChzd2lwZXIuY2xpY2tlZFNsaWRlKSA6IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VFbCA9IGdlc3R1cmUuJHNsaWRlRWwuZmluZCgnaW1nLCBzdmcsIGNhbnZhcycpO1xuICAgICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbCA9IGdlc3R1cmUuJGltYWdlRWwucGFyZW50KChcIi5cIiArIChwYXJhbXMuY29udGFpbmVyQ2xhc3MpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIHpvb20uc2NhbGUgPSAxO1xuICAgICAgem9vbS5jdXJyZW50U2NhbGUgPSAxO1xuICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoMCwwLDApJyk7XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zaXRpb24oMzAwKS50cmFuc2Zvcm0oJ3RyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKScpO1xuICAgICAgZ2VzdHVyZS4kc2xpZGVFbC5yZW1vdmVDbGFzcygoXCJcIiArIChwYXJhbXMuem9vbWVkU2xpZGVDbGFzcykpKTtcbiAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICAvLyBBdHRhY2gvRGV0YWNoIEV2ZW50c1xuICAgIGVuYWJsZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgaWYgKHpvb20uZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgIHpvb20uZW5hYmxlZCA9IHRydWU7XG5cbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBzd2lwZXIucGFyYW1zLnBhc3NpdmVMaXN0ZW5lcnMgPyB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcblxuICAgICAgLy8gU2NhbGUgaW1hZ2VcbiAgICAgIGlmIChTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKCdnZXN0dXJlc3RhcnQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKCdnZXN0dXJlY2hhbmdlJywgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZUNoYW5nZSwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub24oJ2dlc3R1cmVlbmQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vbihzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVTdGFydCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub24oc3dpcGVyLnRvdWNoRXZlbnRzLm1vdmUsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVDaGFuZ2UsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKHN3aXBlci50b3VjaEV2ZW50cy5lbmQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgaW1hZ2VcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKHN3aXBlci50b3VjaEV2ZW50cy5tb3ZlLCAoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy56b29tLmNvbnRhaW5lckNsYXNzKSksIHpvb20ub25Ub3VjaE1vdmUpO1xuICAgIH0sXG4gICAgZGlzYWJsZTogZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIGlmICghem9vbS5lbmFibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICBzd2lwZXIuem9vbS5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBzd2lwZXIucGFyYW1zLnBhc3NpdmVMaXN0ZW5lcnMgPyB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcblxuICAgICAgLy8gU2NhbGUgaW1hZ2VcbiAgICAgIGlmIChTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZignZ2VzdHVyZXN0YXJ0JywgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZVN0YXJ0LCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoJ2dlc3R1cmVjaGFuZ2UnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlQ2hhbmdlLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoJ2dlc3R1cmVlbmQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoc3dpcGVyLnRvdWNoRXZlbnRzLnN0YXJ0LCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZihzd2lwZXIudG91Y2hFdmVudHMubW92ZSwgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZUNoYW5nZSwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub2ZmKHN3aXBlci50b3VjaEV2ZW50cy5lbmQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgaW1hZ2VcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZihzd2lwZXIudG91Y2hFdmVudHMubW92ZSwgKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuem9vbS5jb250YWluZXJDbGFzcykpLCB6b29tLm9uVG91Y2hNb3ZlKTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBab29tJDEgPSB7XG4gICAgbmFtZTogJ3pvb20nLFxuICAgIHBhcmFtczoge1xuICAgICAgem9vbToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbWF4UmF0aW86IDMsXG4gICAgICAgIG1pblJhdGlvOiAxLFxuICAgICAgICB0b2dnbGU6IHRydWUsXG4gICAgICAgIGNvbnRhaW5lckNsYXNzOiAnc3dpcGVyLXpvb20tY29udGFpbmVyJyxcbiAgICAgICAgem9vbWVkU2xpZGVDbGFzczogJ3N3aXBlci1zbGlkZS16b29tZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBjdXJyZW50U2NhbGU6IDEsXG4gICAgICAgIGlzU2NhbGluZzogZmFsc2UsXG4gICAgICAgIGdlc3R1cmU6IHtcbiAgICAgICAgICAkc2xpZGVFbDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNsaWRlV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzbGlkZUhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICRpbWFnZUVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgJGltYWdlV3JhcEVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4UmF0aW86IDMsXG4gICAgICAgIH0sXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgaXNUb3VjaGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXNNb3ZlZDogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1cnJlbnRYOiB1bmRlZmluZWQsXG4gICAgICAgICAgY3VycmVudFk6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtaW5YOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWluWTogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhZOiB1bmRlZmluZWQsXG4gICAgICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFk6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0b3VjaGVzU3RhcnQ6IHt9LFxuICAgICAgICAgIHRvdWNoZXNDdXJyZW50OiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgdmVsb2NpdHk6IHtcbiAgICAgICAgICB4OiB1bmRlZmluZWQsXG4gICAgICAgICAgeTogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZXZQb3NpdGlvblg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcmV2UG9zaXRpb25ZOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldlRpbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgICgnb25HZXN0dXJlU3RhcnQgb25HZXN0dXJlQ2hhbmdlIG9uR2VzdHVyZUVuZCBvblRvdWNoU3RhcnQgb25Ub3VjaE1vdmUgb25Ub3VjaEVuZCBvblRyYW5zaXRpb25FbmQgdG9nZ2xlIGVuYWJsZSBkaXNhYmxlIGluIG91dCcpLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICAgICB6b29tW21ldGhvZE5hbWVdID0gWm9vbVttZXRob2ROYW1lXS5iaW5kKHN3aXBlcik7XG4gICAgICB9KTtcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2NhbGUgPSAxO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN3aXBlci56b29tLCAnc2NhbGUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2NhbGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgaW1hZ2VFbCA9IHN3aXBlci56b29tLmdlc3R1cmUuJGltYWdlRWwgPyBzd2lwZXIuem9vbS5nZXN0dXJlLiRpbWFnZUVsWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIHNsaWRlRWwgPSBzd2lwZXIuem9vbS5nZXN0dXJlLiRzbGlkZUVsID8gc3dpcGVyLnpvb20uZ2VzdHVyZS4kc2xpZGVFbFswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCd6b29tQ2hhbmdlJywgdmFsdWUsIGltYWdlRWwsIHNsaWRlRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzY2FsZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnpvb20uZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci56b29tLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci56b29tLmRpc2FibGUoKTtcbiAgICAgIH0sXG4gICAgICB0b3VjaFN0YXJ0OiBmdW5jdGlvbiB0b3VjaFN0YXJ0KGUpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnpvb20uZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnpvb20ub25Ub3VjaFN0YXJ0KGUpO1xuICAgICAgfSxcbiAgICAgIHRvdWNoRW5kOiBmdW5jdGlvbiB0b3VjaEVuZChlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci56b29tLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci56b29tLm9uVG91Y2hFbmQoZSk7XG4gICAgICB9LFxuICAgICAgZG91YmxlVGFwOiBmdW5jdGlvbiBkb3VibGVUYXAoZSkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuem9vbS5lbmFibGVkICYmIHN3aXBlci56b29tLmVuYWJsZWQgJiYgc3dpcGVyLnBhcmFtcy56b29tLnRvZ2dsZSkge1xuICAgICAgICAgIHN3aXBlci56b29tLnRvZ2dsZShlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnpvb20uZW5hYmxlZCAmJiBzd2lwZXIucGFyYW1zLnpvb20uZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci56b29tLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIExhenkgPSB7XG4gICAgbG9hZEluU2xpZGU6IGZ1bmN0aW9uIGxvYWRJblNsaWRlKGluZGV4LCBsb2FkSW5EdXBsaWNhdGUpIHtcbiAgICAgIGlmICggbG9hZEluRHVwbGljYXRlID09PSB2b2lkIDAgKSBsb2FkSW5EdXBsaWNhdGUgPSB0cnVlO1xuXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmxhenk7XG4gICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuc2xpZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcblxuICAgICAgdmFyICRzbGlkZUVsID0gaXNWaXJ0dWFsXG4gICAgICAgID8gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBpbmRleCArIFwiXFxcIl1cIikpXG4gICAgICAgIDogc3dpcGVyLnNsaWRlcy5lcShpbmRleCk7XG5cbiAgICAgIHZhciAkaW1hZ2VzID0gJHNsaWRlRWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLmVsZW1lbnRDbGFzcykgKyBcIjpub3QoLlwiICsgKHBhcmFtcy5sb2FkZWRDbGFzcykgKyBcIik6bm90KC5cIiArIChwYXJhbXMubG9hZGluZ0NsYXNzKSArIFwiKVwiKSk7XG4gICAgICBpZiAoJHNsaWRlRWwuaGFzQ2xhc3MocGFyYW1zLmVsZW1lbnRDbGFzcykgJiYgISRzbGlkZUVsLmhhc0NsYXNzKHBhcmFtcy5sb2FkZWRDbGFzcykgJiYgISRzbGlkZUVsLmhhc0NsYXNzKHBhcmFtcy5sb2FkaW5nQ2xhc3MpKSB7XG4gICAgICAgICRpbWFnZXMgPSAkaW1hZ2VzLmFkZCgkc2xpZGVFbFswXSk7XG4gICAgICB9XG4gICAgICBpZiAoJGltYWdlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgICRpbWFnZXMuZWFjaChmdW5jdGlvbiAoaW1hZ2VJbmRleCwgaW1hZ2VFbCkge1xuICAgICAgICB2YXIgJGltYWdlRWwgPSAkKGltYWdlRWwpO1xuICAgICAgICAkaW1hZ2VFbC5hZGRDbGFzcyhwYXJhbXMubG9hZGluZ0NsYXNzKTtcblxuICAgICAgICB2YXIgYmFja2dyb3VuZCA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtYmFja2dyb3VuZCcpO1xuICAgICAgICB2YXIgc3JjID0gJGltYWdlRWwuYXR0cignZGF0YS1zcmMnKTtcbiAgICAgICAgdmFyIHNyY3NldCA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtc3Jjc2V0Jyk7XG4gICAgICAgIHZhciBzaXplcyA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtc2l6ZXMnKTtcblxuICAgICAgICBzd2lwZXIubG9hZEltYWdlKCRpbWFnZUVsWzBdLCAoc3JjIHx8IGJhY2tncm91bmQpLCBzcmNzZXQsIHNpemVzLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3dpcGVyID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIgPT09IG51bGwgfHwgIXN3aXBlciB8fCAoc3dpcGVyICYmICFzd2lwZXIucGFyYW1zKSB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmIChiYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAkaW1hZ2VFbC5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCAoXCJ1cmwoXFxcIlwiICsgYmFja2dyb3VuZCArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzcmNzZXQpIHtcbiAgICAgICAgICAgICAgJGltYWdlRWwuYXR0cignc3Jjc2V0Jywgc3Jjc2V0KTtcbiAgICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1zcmNzZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaXplcykge1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5hdHRyKCdzaXplcycsIHNpemVzKTtcbiAgICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1zaXplcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5hdHRyKCdzcmMnLCBzcmMpO1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5yZW1vdmVBdHRyKCdkYXRhLXNyYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICRpbWFnZUVsLmFkZENsYXNzKHBhcmFtcy5sb2FkZWRDbGFzcykucmVtb3ZlQ2xhc3MocGFyYW1zLmxvYWRpbmdDbGFzcyk7XG4gICAgICAgICAgJHNsaWRlRWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLnByZWxvYWRlckNsYXNzKSkpLnJlbW92ZSgpO1xuICAgICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgbG9hZEluRHVwbGljYXRlKSB7XG4gICAgICAgICAgICB2YXIgc2xpZGVPcmlnaW5hbEluZGV4ID0gJHNsaWRlRWwuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKTtcbiAgICAgICAgICAgIGlmICgkc2xpZGVFbC5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5hbFNsaWRlID0gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHNsaWRlT3JpZ2luYWxJbmRleCArIFwiXFxcIl06bm90KC5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUob3JpZ2luYWxTbGlkZS5pbmRleCgpLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlZFNsaWRlID0gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBzbGlkZU9yaWdpbmFsSW5kZXggKyBcIlxcXCJdXCIpKTtcbiAgICAgICAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoZHVwbGljYXRlZFNsaWRlLmluZGV4KCksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpcGVyLmVtaXQoJ2xhenlJbWFnZVJlYWR5JywgJHNsaWRlRWxbMF0sICRpbWFnZUVsWzBdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3dpcGVyLmVtaXQoJ2xhenlJbWFnZUxvYWQnLCAkc2xpZGVFbFswXSwgJGltYWdlRWxbMF0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBsb2FkOiBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgdmFyIHN3aXBlclBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXJQYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlclBhcmFtcy5sYXp5O1xuXG4gICAgICB2YXIgc2xpZGVzUGVyVmlldyA9IHN3aXBlclBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gMDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2xpZGVFeGlzdChpbmRleCkge1xuICAgICAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgaWYgKCR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlclBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIGluZGV4ICsgXCJcXFwiXVwiKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2xpZGVzW2luZGV4XSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzbGlkZUluZGV4KHNsaWRlRWwpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgICAgIHJldHVybiAkKHNsaWRlRWwpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQoc2xpZGVFbCkuaW5kZXgoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzd2lwZXIubGF6eS5pbml0aWFsSW1hZ2VMb2FkZWQpIHsgc3dpcGVyLmxhenkuaW5pdGlhbEltYWdlTG9hZGVkID0gdHJ1ZTsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hTbGlkZXNWaXNpYmlsaXR5KSB7XG4gICAgICAgICR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlclBhcmFtcy5zbGlkZVZpc2libGVDbGFzcykpKS5lYWNoKGZ1bmN0aW9uIChlbEluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gaXNWaXJ0dWFsID8gJChzbGlkZUVsKS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpIDogJChzbGlkZUVsKS5pbmRleCgpO1xuICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNsaWRlc1BlclZpZXcgPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBhY3RpdmVJbmRleDsgaSA8IGFjdGl2ZUluZGV4ICsgc2xpZGVzUGVyVmlldzsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSkpIHsgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoaSk7IH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoYWN0aXZlSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5sb2FkUHJldk5leHQpIHtcbiAgICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPiAxIHx8IChwYXJhbXMubG9hZFByZXZOZXh0QW1vdW50ICYmIHBhcmFtcy5sb2FkUHJldk5leHRBbW91bnQgPiAxKSkge1xuICAgICAgICAgIHZhciBhbW91bnQgPSBwYXJhbXMubG9hZFByZXZOZXh0QW1vdW50O1xuICAgICAgICAgIHZhciBzcHYgPSBzbGlkZXNQZXJWaWV3O1xuICAgICAgICAgIHZhciBtYXhJbmRleCA9IE1hdGgubWluKGFjdGl2ZUluZGV4ICsgc3B2ICsgTWF0aC5tYXgoYW1vdW50LCBzcHYpLCBzbGlkZXMubGVuZ3RoKTtcbiAgICAgICAgICB2YXIgbWluSW5kZXggPSBNYXRoLm1heChhY3RpdmVJbmRleCAtIE1hdGgubWF4KHNwdiwgYW1vdW50KSwgMCk7XG4gICAgICAgICAgLy8gTmV4dCBTbGlkZXNcbiAgICAgICAgICBmb3IgKHZhciBpJDEgPSBhY3RpdmVJbmRleCArIHNsaWRlc1BlclZpZXc7IGkkMSA8IG1heEluZGV4OyBpJDEgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSQxKSkgeyBzd2lwZXIubGF6eS5sb2FkSW5TbGlkZShpJDEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFByZXYgU2xpZGVzXG4gICAgICAgICAgZm9yICh2YXIgaSQyID0gbWluSW5kZXg7IGkkMiA8IGFjdGl2ZUluZGV4OyBpJDIgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSQyKSkgeyBzd2lwZXIubGF6eS5sb2FkSW5TbGlkZShpJDIpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXh0U2xpZGUgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChzd2lwZXJQYXJhbXMuc2xpZGVOZXh0Q2xhc3MpKSk7XG4gICAgICAgICAgaWYgKG5leHRTbGlkZS5sZW5ndGggPiAwKSB7IHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKHNsaWRlSW5kZXgobmV4dFNsaWRlKSk7IH1cblxuICAgICAgICAgIHZhciBwcmV2U2xpZGUgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChzd2lwZXJQYXJhbXMuc2xpZGVQcmV2Q2xhc3MpKSk7XG4gICAgICAgICAgaWYgKHByZXZTbGlkZS5sZW5ndGggPiAwKSB7IHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKHNsaWRlSW5kZXgocHJldlNsaWRlKSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIExhenkkMSA9IHtcbiAgICBuYW1lOiAnbGF6eScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBsYXp5OiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBsb2FkUHJldk5leHQ6IGZhbHNlLFxuICAgICAgICBsb2FkUHJldk5leHRBbW91bnQ6IDEsXG4gICAgICAgIGxvYWRPblRyYW5zaXRpb25TdGFydDogZmFsc2UsXG5cbiAgICAgICAgZWxlbWVudENsYXNzOiAnc3dpcGVyLWxhenknLFxuICAgICAgICBsb2FkaW5nQ2xhc3M6ICdzd2lwZXItbGF6eS1sb2FkaW5nJyxcbiAgICAgICAgbG9hZGVkQ2xhc3M6ICdzd2lwZXItbGF6eS1sb2FkZWQnLFxuICAgICAgICBwcmVsb2FkZXJDbGFzczogJ3N3aXBlci1sYXp5LXByZWxvYWRlcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgbGF6eToge1xuICAgICAgICAgIGluaXRpYWxJbWFnZUxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgbG9hZDogTGF6eS5sb2FkLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBsb2FkSW5TbGlkZTogTGF6eS5sb2FkSW5TbGlkZS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkICYmIHN3aXBlci5wYXJhbXMucHJlbG9hZEltYWdlcykge1xuICAgICAgICAgIHN3aXBlci5wYXJhbXMucHJlbG9hZEltYWdlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxhenkuZW5hYmxlZCAmJiAhc3dpcGVyLnBhcmFtcy5sb29wICYmIHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlID09PSAwKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2Nyb2xsOiBmdW5jdGlvbiBzY3JvbGwoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSAmJiAhc3dpcGVyLnBhcmFtcy5mcmVlTW9kZVN0aWNreSkge1xuICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2Nyb2xsYmFyRHJhZ01vdmU6IGZ1bmN0aW9uIHNjcm9sbGJhckRyYWdNb3ZlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNpdGlvblN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uU3RhcnQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sYXp5LmVuYWJsZWQpIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sYXp5LmxvYWRPblRyYW5zaXRpb25TdGFydCB8fCAoIXN3aXBlci5wYXJhbXMubGF6eS5sb2FkT25UcmFuc2l0aW9uU3RhcnQgJiYgIXN3aXBlci5sYXp5LmluaXRpYWxJbWFnZUxvYWRlZCkpIHtcbiAgICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uRW5kOiBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkICYmICFzd2lwZXIucGFyYW1zLmxhenkubG9hZE9uVHJhbnNpdGlvblN0YXJ0KSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcImVycm9yXCIsIHsgXCJhbGxvd1wiOiBbXCI+PlwiXSB9XSAqL1xuXG4gIHZhciBDb250cm9sbGVyID0ge1xuICAgIExpbmVhclNwbGluZTogZnVuY3Rpb24gTGluZWFyU3BsaW5lKHgsIHkpIHtcbiAgICAgIHZhciBiaW5hcnlTZWFyY2ggPSAoZnVuY3Rpb24gc2VhcmNoKCkge1xuICAgICAgICB2YXIgbWF4SW5kZXg7XG4gICAgICAgIHZhciBtaW5JbmRleDtcbiAgICAgICAgdmFyIGd1ZXNzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFycmF5LCB2YWwpIHtcbiAgICAgICAgICBtaW5JbmRleCA9IC0xO1xuICAgICAgICAgIG1heEluZGV4ID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChtYXhJbmRleCAtIG1pbkluZGV4ID4gMSkge1xuICAgICAgICAgICAgZ3Vlc3MgPSBtYXhJbmRleCArIG1pbkluZGV4ID4+IDE7XG4gICAgICAgICAgICBpZiAoYXJyYXlbZ3Vlc3NdIDw9IHZhbCkge1xuICAgICAgICAgICAgICBtaW5JbmRleCA9IGd1ZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWF4SW5kZXggPSBndWVzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heEluZGV4O1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5sYXN0SW5kZXggPSB4Lmxlbmd0aCAtIDE7XG4gICAgICAvLyBHaXZlbiBhbiB4IHZhbHVlICh4MiksIHJldHVybiB0aGUgZXhwZWN0ZWQgeTIgdmFsdWU6XG4gICAgICAvLyAoeDEseTEpIGlzIHRoZSBrbm93biBwb2ludCBiZWZvcmUgZ2l2ZW4gdmFsdWUsXG4gICAgICAvLyAoeDMseTMpIGlzIHRoZSBrbm93biBwb2ludCBhZnRlciBnaXZlbiB2YWx1ZS5cbiAgICAgIHZhciBpMTtcbiAgICAgIHZhciBpMztcblxuICAgICAgdGhpcy5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGludGVycG9sYXRlKHgyKSB7XG4gICAgICAgIGlmICgheDIpIHsgcmV0dXJuIDA7IH1cblxuICAgICAgICAvLyBHZXQgdGhlIGluZGV4ZXMgb2YgeDEgYW5kIHgzICh0aGUgYXJyYXkgaW5kZXhlcyBiZWZvcmUgYW5kIGFmdGVyIGdpdmVuIHgyKTpcbiAgICAgICAgaTMgPSBiaW5hcnlTZWFyY2godGhpcy54LCB4Mik7XG4gICAgICAgIGkxID0gaTMgLSAxO1xuXG4gICAgICAgIC8vIFdlIGhhdmUgb3VyIGluZGV4ZXMgaTEgJiBpMywgc28gd2UgY2FuIGNhbGN1bGF0ZSBhbHJlYWR5OlxuICAgICAgICAvLyB5MiA6PSAoKHgy4oiSeDEpIMOXICh5M+KIknkxKSkgw7cgKHgz4oiSeDEpICsgeTFcbiAgICAgICAgcmV0dXJuICgoKHgyIC0gdGhpcy54W2kxXSkgKiAodGhpcy55W2kzXSAtIHRoaXMueVtpMV0pKSAvICh0aGlzLnhbaTNdIC0gdGhpcy54W2kxXSkpICsgdGhpcy55W2kxXTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8vIHh4eDogZm9yIG5vdyBpIHdpbGwganVzdCBzYXZlIG9uZSBzcGxpbmUgZnVuY3Rpb24gdG8gdG9cbiAgICBnZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiBnZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uKGMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lID0gc3dpcGVyLnBhcmFtcy5sb29wXG4gICAgICAgICAgPyBuZXcgQ29udHJvbGxlci5MaW5lYXJTcGxpbmUoc3dpcGVyLnNsaWRlc0dyaWQsIGMuc2xpZGVzR3JpZClcbiAgICAgICAgICA6IG5ldyBDb250cm9sbGVyLkxpbmVhclNwbGluZShzd2lwZXIuc25hcEdyaWQsIGMuc25hcEdyaWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoc2V0VHJhbnNsYXRlJDEsIGJ5Q29udHJvbGxlcikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgY29udHJvbGxlZCA9IHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2w7XG4gICAgICB2YXIgbXVsdGlwbGllcjtcbiAgICAgIHZhciBjb250cm9sbGVkVHJhbnNsYXRlO1xuICAgICAgZnVuY3Rpb24gc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjKSB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBjcmVhdGUgYW4gSW50ZXJwb2xhdGUgZnVuY3Rpb24gYmFzZWQgb24gdGhlIHNuYXBHcmlkc1xuICAgICAgICAvLyB4IGlzIHRoZSBHcmlkIG9mIHRoZSBzY3JvbGxlZCBzY3JvbGxlciBhbmQgeSB3aWxsIGJlIHRoZSBjb250cm9sbGVkIHNjcm9sbGVyXG4gICAgICAgIC8vIGl0IG1ha2VzIHNlbnNlIHRvIGNyZWF0ZSB0aGlzIG9ubHkgb25jZSBhbmQgcmVjYWxsIGl0IGZvciB0aGUgaW50ZXJwb2xhdGlvblxuICAgICAgICAvLyB0aGUgZnVuY3Rpb24gZG9lcyBhIGxvdCBvZiB2YWx1ZSBjYWNoaW5nIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICB2YXIgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IC1zd2lwZXIudHJhbnNsYXRlIDogc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ3NsaWRlJykge1xuICAgICAgICAgIHN3aXBlci5jb250cm9sbGVyLmdldEludGVycG9sYXRlRnVuY3Rpb24oYyk7XG4gICAgICAgICAgLy8gaSBhbSBub3Qgc3VyZSB3aHkgdGhlIHZhbHVlcyBoYXZlIHRvIGJlIG11bHRpcGxpY2F0ZWQgdGhpcyB3YXksIHRyaWVkIHRvIGludmVydCB0aGUgc25hcEdyaWRcbiAgICAgICAgICAvLyBidXQgaXQgZGlkIG5vdCB3b3JrIG91dFxuICAgICAgICAgIGNvbnRyb2xsZWRUcmFuc2xhdGUgPSAtc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lLmludGVycG9sYXRlKC10cmFuc2xhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sbGVkVHJhbnNsYXRlIHx8IHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgICBtdWx0aXBsaWVyID0gKGMubWF4VHJhbnNsYXRlKCkgLSBjLm1pblRyYW5zbGF0ZSgpKSAvIChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpO1xuICAgICAgICAgIGNvbnRyb2xsZWRUcmFuc2xhdGUgPSAoKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgKiBtdWx0aXBsaWVyKSArIGMubWluVHJhbnNsYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5jb250cm9sbGVyLmludmVyc2UpIHtcbiAgICAgICAgICBjb250cm9sbGVkVHJhbnNsYXRlID0gYy5tYXhUcmFuc2xhdGUoKSAtIGNvbnRyb2xsZWRUcmFuc2xhdGU7XG4gICAgICAgIH1cbiAgICAgICAgYy51cGRhdGVQcm9ncmVzcyhjb250cm9sbGVkVHJhbnNsYXRlKTtcbiAgICAgICAgYy5zZXRUcmFuc2xhdGUoY29udHJvbGxlZFRyYW5zbGF0ZSwgc3dpcGVyKTtcbiAgICAgICAgYy51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgICBjLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xsZWQpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJvbGxlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChjb250cm9sbGVkW2ldICE9PSBieUNvbnRyb2xsZXIgJiYgY29udHJvbGxlZFtpXSBpbnN0YW5jZW9mIFN3aXBlcikge1xuICAgICAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjb250cm9sbGVkW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbGxlZCBpbnN0YW5jZW9mIFN3aXBlciAmJiBieUNvbnRyb2xsZXIgIT09IGNvbnRyb2xsZWQpIHtcbiAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjb250cm9sbGVkKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgY29udHJvbGxlZCA9IHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2w7XG4gICAgICB2YXIgaTtcbiAgICAgIGZ1bmN0aW9uIHNldENvbnRyb2xsZWRUcmFuc2l0aW9uKGMpIHtcbiAgICAgICAgYy5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uLCBzd2lwZXIpO1xuICAgICAgICBpZiAoZHVyYXRpb24gIT09IDApIHtcbiAgICAgICAgICBjLnRyYW5zaXRpb25TdGFydCgpO1xuICAgICAgICAgIGlmIChjLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGMudXBkYXRlQXV0b0hlaWdodCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGMuJHdyYXBwZXJFbC50cmFuc2l0aW9uRW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjLnBhcmFtcy5sb29wICYmIHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ3NsaWRlJykge1xuICAgICAgICAgICAgICBjLmxvb3BGaXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGMudHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVkKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udHJvbGxlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChjb250cm9sbGVkW2ldICE9PSBieUNvbnRyb2xsZXIgJiYgY29udHJvbGxlZFtpXSBpbnN0YW5jZW9mIFN3aXBlcikge1xuICAgICAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zaXRpb24oY29udHJvbGxlZFtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZWQgaW5zdGFuY2VvZiBTd2lwZXIgJiYgYnlDb250cm9sbGVyICE9PSBjb250cm9sbGVkKSB7XG4gICAgICAgIHNldENvbnRyb2xsZWRUcmFuc2l0aW9uKGNvbnRyb2xsZWQpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIHZhciBDb250cm9sbGVyJDEgPSB7XG4gICAgbmFtZTogJ2NvbnRyb2xsZXInLFxuICAgIHBhcmFtczoge1xuICAgICAgY29udHJvbGxlcjoge1xuICAgICAgICBjb250cm9sOiB1bmRlZmluZWQsXG4gICAgICAgIGludmVyc2U6IGZhbHNlLFxuICAgICAgICBieTogJ3NsaWRlJywgLy8gb3IgJ2NvbnRhaW5lcidcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBjb250cm9sbGVyOiB7XG4gICAgICAgICAgY29udHJvbDogc3dpcGVyLnBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2wsXG4gICAgICAgICAgZ2V0SW50ZXJwb2xhdGVGdW5jdGlvbjogQ29udHJvbGxlci5nZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IENvbnRyb2xsZXIuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBDb250cm9sbGVyLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgICBzd2lwZXIuY29udHJvbGxlci5zcGxpbmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5jb250cm9sbGVyLnNwbGluZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIuY29udHJvbGxlci5jb250cm9sKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAoc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lKSB7XG4gICAgICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBzd2lwZXIuY29udHJvbGxlci5zcGxpbmU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvYnNlcnZlclVwZGF0ZTogZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgICBzd2lwZXIuY29udHJvbGxlci5zcGxpbmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5jb250cm9sbGVyLnNwbGluZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5jb250cm9sbGVyLnNldFRyYW5zbGF0ZSh0cmFuc2xhdGUsIGJ5Q29udHJvbGxlcik7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbiwgYnlDb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5jb250cm9sbGVyLnNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIGExMXkgPSB7XG4gICAgbWFrZUVsRm9jdXNhYmxlOiBmdW5jdGlvbiBtYWtlRWxGb2N1c2FibGUoJGVsKSB7XG4gICAgICAkZWwuYXR0cigndGFiSW5kZXgnLCAnMCcpO1xuICAgICAgcmV0dXJuICRlbDtcbiAgICB9LFxuICAgIGFkZEVsUm9sZTogZnVuY3Rpb24gYWRkRWxSb2xlKCRlbCwgcm9sZSkge1xuICAgICAgJGVsLmF0dHIoJ3JvbGUnLCByb2xlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBhZGRFbExhYmVsOiBmdW5jdGlvbiBhZGRFbExhYmVsKCRlbCwgbGFiZWwpIHtcbiAgICAgICRlbC5hdHRyKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xuICAgICAgcmV0dXJuICRlbDtcbiAgICB9LFxuICAgIGRpc2FibGVFbDogZnVuY3Rpb24gZGlzYWJsZUVsKCRlbCkge1xuICAgICAgJGVsLmF0dHIoJ2FyaWEtZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBlbmFibGVFbDogZnVuY3Rpb24gZW5hYmxlRWwoJGVsKSB7XG4gICAgICAkZWwuYXR0cignYXJpYS1kaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBvbkVudGVyS2V5OiBmdW5jdGlvbiBvbkVudGVyS2V5KGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuYTExeTtcbiAgICAgIGlmIChlLmtleUNvZGUgIT09IDEzKSB7IHJldHVybjsgfVxuICAgICAgdmFyICR0YXJnZXRFbCA9ICQoZS50YXJnZXQpO1xuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwgJiYgJHRhcmdldEVsLmlzKHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwpKSB7XG4gICAgICAgIGlmICghKHN3aXBlci5pc0VuZCAmJiAhc3dpcGVyLnBhcmFtcy5sb29wKSkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZU5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dpcGVyLmlzRW5kKSB7XG4gICAgICAgICAgc3dpcGVyLmExMXkubm90aWZ5KHBhcmFtcy5sYXN0U2xpZGVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLm5leHRTbGlkZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCAmJiAkdGFyZ2V0RWwuaXMoc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCkpIHtcbiAgICAgICAgaWYgKCEoc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLmxvb3ApKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLmZpcnN0U2xpZGVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLnByZXZTbGlkZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24gJiYgJHRhcmdldEVsLmlzKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uYnVsbGV0Q2xhc3MpKSkpIHtcbiAgICAgICAgJHRhcmdldEVsWzBdLmNsaWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeShtZXNzYWdlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBub3RpZmljYXRpb24gPSBzd2lwZXIuYTExeS5saXZlUmVnaW9uO1xuICAgICAgaWYgKG5vdGlmaWNhdGlvbi5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBub3RpZmljYXRpb24uaHRtbCgnJyk7XG4gICAgICBub3RpZmljYXRpb24uaHRtbChtZXNzYWdlKTtcbiAgICB9LFxuICAgIHVwZGF0ZU5hdmlnYXRpb246IGZ1bmN0aW9uIHVwZGF0ZU5hdmlnYXRpb24oKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkgeyByZXR1cm47IH1cbiAgICAgIHZhciByZWYgPSBzd2lwZXIubmF2aWdhdGlvbjtcbiAgICAgIHZhciAkbmV4dEVsID0gcmVmLiRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbCA9IHJlZi4kcHJldkVsO1xuXG4gICAgICBpZiAoJHByZXZFbCAmJiAkcHJldkVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHN3aXBlci5pc0JlZ2lubmluZykge1xuICAgICAgICAgIHN3aXBlci5hMTF5LmRpc2FibGVFbCgkcHJldkVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5lbmFibGVFbCgkcHJldkVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCRuZXh0RWwgJiYgJG5leHRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzd2lwZXIuaXNFbmQpIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5kaXNhYmxlRWwoJG5leHRFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLmExMXkuZW5hYmxlRWwoJG5leHRFbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZVBhZ2luYXRpb246IGZ1bmN0aW9uIHVwZGF0ZVBhZ2luYXRpb24oKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmExMXk7XG4gICAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24gJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmNsaWNrYWJsZSAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzICYmIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMubGVuZ3RoKSB7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMuZWFjaChmdW5jdGlvbiAoYnVsbGV0SW5kZXgsIGJ1bGxldEVsKSB7XG4gICAgICAgICAgdmFyICRidWxsZXRFbCA9ICQoYnVsbGV0RWwpO1xuICAgICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkYnVsbGV0RWwpO1xuICAgICAgICAgIHN3aXBlci5hMTF5LmFkZEVsUm9sZSgkYnVsbGV0RWwsICdidXR0b24nKTtcbiAgICAgICAgICBzd2lwZXIuYTExeS5hZGRFbExhYmVsKCRidWxsZXRFbCwgcGFyYW1zLnBhZ2luYXRpb25CdWxsZXRNZXNzYWdlLnJlcGxhY2UoL3t7aW5kZXh9fS8sICRidWxsZXRFbC5pbmRleCgpICsgMSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgc3dpcGVyLiRlbC5hcHBlbmQoc3dpcGVyLmExMXkubGl2ZVJlZ2lvbik7XG5cbiAgICAgIC8vIE5hdmlnYXRpb25cbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmExMXk7XG4gICAgICB2YXIgJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsO1xuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwpIHtcbiAgICAgICAgJG5leHRFbCA9IHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWw7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCkge1xuICAgICAgICAkcHJldkVsID0gc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbDtcbiAgICAgIH1cbiAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkbmV4dEVsKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxSb2xlKCRuZXh0RWwsICdidXR0b24nKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxMYWJlbCgkbmV4dEVsLCBwYXJhbXMubmV4dFNsaWRlTWVzc2FnZSk7XG4gICAgICAgICRuZXh0RWwub24oJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cbiAgICAgIGlmICgkcHJldkVsKSB7XG4gICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkcHJldkVsKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxSb2xlKCRwcmV2RWwsICdidXR0b24nKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxMYWJlbCgkcHJldkVsLCBwYXJhbXMucHJldlNsaWRlTWVzc2FnZSk7XG4gICAgICAgICRwcmV2RWwub24oJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFnaW5hdGlvblxuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5jbGlja2FibGUgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCkge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi4kZWwub24oJ2tleWRvd24nLCAoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmJ1bGxldENsYXNzKSksIHN3aXBlci5hMTF5Lm9uRW50ZXJLZXkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5hMTF5LmxpdmVSZWdpb24gJiYgc3dpcGVyLmExMXkubGl2ZVJlZ2lvbi5sZW5ndGggPiAwKSB7IHN3aXBlci5hMTF5LmxpdmVSZWdpb24ucmVtb3ZlKCk7IH1cblxuICAgICAgdmFyICRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbDtcbiAgICAgIGlmIChzd2lwZXIubmF2aWdhdGlvbiAmJiBzd2lwZXIubmF2aWdhdGlvbi4kbmV4dEVsKSB7XG4gICAgICAgICRuZXh0RWwgPSBzd2lwZXIubmF2aWdhdGlvbi4kbmV4dEVsO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRwcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbCA9IHN3aXBlci5uYXZpZ2F0aW9uLiRwcmV2RWw7XG4gICAgICB9XG4gICAgICBpZiAoJG5leHRFbCkge1xuICAgICAgICAkbmV4dEVsLm9mZigna2V5ZG93bicsIHN3aXBlci5hMTF5Lm9uRW50ZXJLZXkpO1xuICAgICAgfVxuICAgICAgaWYgKCRwcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbC5vZmYoJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFnaW5hdGlvblxuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5jbGlja2FibGUgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCkge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi4kZWwub2ZmKCdrZXlkb3duJywgKFwiLlwiICsgKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5idWxsZXRDbGFzcykpLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgQTExeSA9IHtcbiAgICBuYW1lOiAnYTExeScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBhMTF5OiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIG5vdGlmaWNhdGlvbkNsYXNzOiAnc3dpcGVyLW5vdGlmaWNhdGlvbicsXG4gICAgICAgIHByZXZTbGlkZU1lc3NhZ2U6ICdQcmV2aW91cyBzbGlkZScsXG4gICAgICAgIG5leHRTbGlkZU1lc3NhZ2U6ICdOZXh0IHNsaWRlJyxcbiAgICAgICAgZmlyc3RTbGlkZU1lc3NhZ2U6ICdUaGlzIGlzIHRoZSBmaXJzdCBzbGlkZScsXG4gICAgICAgIGxhc3RTbGlkZU1lc3NhZ2U6ICdUaGlzIGlzIHRoZSBsYXN0IHNsaWRlJyxcbiAgICAgICAgcGFnaW5hdGlvbkJ1bGxldE1lc3NhZ2U6ICdHbyB0byBzbGlkZSB7e2luZGV4fX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGExMXk6IHtcbiAgICAgICAgICBsaXZlUmVnaW9uOiAkKChcIjxzcGFuIGNsYXNzPVxcXCJcIiArIChzd2lwZXIucGFyYW1zLmExMXkubm90aWZpY2F0aW9uQ2xhc3MpICsgXCJcXFwiIGFyaWEtbGl2ZT1cXFwiYXNzZXJ0aXZlXFxcIiBhcmlhLWF0b21pYz1cXFwidHJ1ZVxcXCI+PC9zcGFuPlwiKSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5rZXlzKGExMXkpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgc3dpcGVyLmExMXlbbWV0aG9kTmFtZV0gPSBhMTF5W21ldGhvZE5hbWVdLmJpbmQoc3dpcGVyKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5wYXJhbXMuYTExeS5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuYTExeS5pbml0KCk7XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB0b0VkZ2U6IGZ1bmN0aW9uIHRvRWRnZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5hMTF5LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBmcm9tRWRnZTogZnVuY3Rpb24gZnJvbUVkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5wYXJhbXMuYTExeS5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuYTExeS51cGRhdGVOYXZpZ2F0aW9uKCk7XG4gICAgICB9LFxuICAgICAgcGFnaW5hdGlvblVwZGF0ZTogZnVuY3Rpb24gcGFnaW5hdGlvblVwZGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5hMTF5LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLmExMXkuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmExMXkuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBIaXN0b3J5ID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5oaXN0b3J5KSB7IHJldHVybjsgfVxuICAgICAgaWYgKCF3aW4uaGlzdG9yeSB8fCAhd2luLmhpc3RvcnkucHVzaFN0YXRlKSB7XG4gICAgICAgIHN3aXBlci5wYXJhbXMuaGlzdG9yeS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24uZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBoaXN0b3J5ID0gc3dpcGVyLmhpc3Rvcnk7XG4gICAgICBoaXN0b3J5LmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGhpc3RvcnkucGF0aHMgPSBIaXN0b3J5LmdldFBhdGhWYWx1ZXMoKTtcbiAgICAgIGlmICghaGlzdG9yeS5wYXRocy5rZXkgJiYgIWhpc3RvcnkucGF0aHMudmFsdWUpIHsgcmV0dXJuOyB9XG4gICAgICBoaXN0b3J5LnNjcm9sbFRvU2xpZGUoMCwgaGlzdG9yeS5wYXRocy52YWx1ZSwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHN3aXBlci5oaXN0b3J5LnNldEhpc3RvcnlQb3BTdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuaGlzdG9yeS5yZXBsYWNlU3RhdGUpIHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgc3dpcGVyLmhpc3Rvcnkuc2V0SGlzdG9yeVBvcFN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldEhpc3RvcnlQb3BTdGF0ZTogZnVuY3Rpb24gc2V0SGlzdG9yeVBvcFN0YXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBzd2lwZXIuaGlzdG9yeS5wYXRocyA9IEhpc3RvcnkuZ2V0UGF0aFZhbHVlcygpO1xuICAgICAgc3dpcGVyLmhpc3Rvcnkuc2Nyb2xsVG9TbGlkZShzd2lwZXIucGFyYW1zLnNwZWVkLCBzd2lwZXIuaGlzdG9yeS5wYXRocy52YWx1ZSwgZmFsc2UpO1xuICAgIH0sXG4gICAgZ2V0UGF0aFZhbHVlczogZnVuY3Rpb24gZ2V0UGF0aFZhbHVlcygpIHtcbiAgICAgIHZhciBwYXRoQXJyYXkgPSB3aW4ubG9jYXRpb24ucGF0aG5hbWUuc2xpY2UoMSkuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHBhcnQpIHsgcmV0dXJuIHBhcnQgIT09ICcnOyB9KTtcbiAgICAgIHZhciB0b3RhbCA9IHBhdGhBcnJheS5sZW5ndGg7XG4gICAgICB2YXIga2V5ID0gcGF0aEFycmF5W3RvdGFsIC0gMl07XG4gICAgICB2YXIgdmFsdWUgPSBwYXRoQXJyYXlbdG90YWwgLSAxXTtcbiAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICB9LFxuICAgIHNldEhpc3Rvcnk6IGZ1bmN0aW9uIHNldEhpc3Rvcnkoa2V5LCBpbmRleCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5oaXN0b3J5LmluaXRpYWxpemVkIHx8ICFzd2lwZXIucGFyYW1zLmhpc3RvcnkuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzbGlkZSA9IHN3aXBlci5zbGlkZXMuZXEoaW5kZXgpO1xuICAgICAgdmFyIHZhbHVlID0gSGlzdG9yeS5zbHVnaWZ5KHNsaWRlLmF0dHIoJ2RhdGEtaGlzdG9yeScpKTtcbiAgICAgIGlmICghd2luLmxvY2F0aW9uLnBhdGhuYW1lLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSBrZXkgKyBcIi9cIiArIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IHdpbi5oaXN0b3J5LnN0YXRlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IHZhbHVlOiB2YWx1ZSB9LCBudWxsLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4uaGlzdG9yeS5wdXNoU3RhdGUoeyB2YWx1ZTogdmFsdWUgfSwgbnVsbCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2x1Z2lmeTogZnVuY3Rpb24gc2x1Z2lmeSh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gICAgICAgIC5yZXBsYWNlKC9cXHMrL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1teXFx3LV0rL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvLS0rL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL14tKy8sICcnKVxuICAgICAgICAucmVwbGFjZSgvLSskLywgJycpO1xuICAgIH0sXG4gICAgc2Nyb2xsVG9TbGlkZTogZnVuY3Rpb24gc2Nyb2xsVG9TbGlkZShzcGVlZCwgdmFsdWUsIHJ1bkNhbGxiYWNrcykge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHN3aXBlci5zbGlkZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgc2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgICAgIHZhciBzbGlkZUhpc3RvcnkgPSBIaXN0b3J5LnNsdWdpZnkoc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5JykpO1xuICAgICAgICAgIGlmIChzbGlkZUhpc3RvcnkgPT09IHZhbHVlICYmICFzbGlkZS5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBzbGlkZS5pbmRleCgpO1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlVG8oaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgc3BlZWQsIHJ1bkNhbGxiYWNrcyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgSGlzdG9yeSQxID0ge1xuICAgIG5hbWU6ICdoaXN0b3J5JyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJlcGxhY2VTdGF0ZTogZmFsc2UsXG4gICAgICAgIGtleTogJ3NsaWRlcycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGluaXQ6IEhpc3RvcnkuaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0SGlzdG9yeTogSGlzdG9yeS5zZXRIaXN0b3J5LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRIaXN0b3J5UG9wU3RhdGU6IEhpc3Rvcnkuc2V0SGlzdG9yeVBvcFN0YXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzY3JvbGxUb1NsaWRlOiBIaXN0b3J5LnNjcm9sbFRvU2xpZGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGRlc3Ryb3k6IEhpc3RvcnkuZGVzdHJveS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGlzdG9yeS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmhpc3RvcnkuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhpc3RvcnkuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5oaXN0b3J5LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmhpc3RvcnkuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGlzdG9yeS5zZXRIaXN0b3J5KHN3aXBlci5wYXJhbXMuaGlzdG9yeS5rZXksIHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgSGFzaE5hdmlnYXRpb24gPSB7XG4gICAgb25IYXNoQ2FuZ2U6IGZ1bmN0aW9uIG9uSGFzaENhbmdlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgbmV3SGFzaCA9IGRvYy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICB2YXIgYWN0aXZlU2xpZGVIYXNoID0gc3dpcGVyLnNsaWRlcy5lcShzd2lwZXIuYWN0aXZlSW5kZXgpLmF0dHIoJ2RhdGEtaGFzaCcpO1xuICAgICAgaWYgKG5ld0hhc2ggIT09IGFjdGl2ZVNsaWRlSGFzaCkge1xuICAgICAgICB2YXIgbmV3SW5kZXggPSBzd2lwZXIuJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtaGFzaD1cXFwiXCIgKyBuZXdIYXNoICsgXCJcXFwiXVwiKSkuaW5kZXgoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0luZGV4KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldEhhc2g6IGZ1bmN0aW9uIHNldEhhc2goKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLmluaXRpYWxpemVkIHx8ICFzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5oYXNoTmF2aWdhdGlvbi5yZXBsYWNlU3RhdGUgJiYgd2luLmhpc3RvcnkgJiYgd2luLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAoKFwiI1wiICsgKHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KS5hdHRyKCdkYXRhLWhhc2gnKSkpIHx8ICcnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIHZhciBoYXNoID0gc2xpZGUuYXR0cignZGF0YS1oYXNoJykgfHwgc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5Jyk7XG4gICAgICAgIGRvYy5sb2NhdGlvbi5oYXNoID0gaGFzaCB8fCAnJztcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5oYXNoTmF2aWdhdGlvbi5lbmFibGVkIHx8IChzd2lwZXIucGFyYW1zLmhpc3RvcnkgJiYgc3dpcGVyLnBhcmFtcy5oaXN0b3J5LmVuYWJsZWQpKSB7IHJldHVybjsgfVxuICAgICAgc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHZhciBoYXNoID0gZG9jLmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICcnKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIHZhciBzcGVlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHNsaWRlID0gc3dpcGVyLnNsaWRlcy5lcShpKTtcbiAgICAgICAgICB2YXIgc2xpZGVIYXNoID0gc2xpZGUuYXR0cignZGF0YS1oYXNoJykgfHwgc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5Jyk7XG4gICAgICAgICAgaWYgKHNsaWRlSGFzaCA9PT0gaGFzaCAmJiAhc2xpZGUuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gc2xpZGUuaW5kZXgoKTtcbiAgICAgICAgICAgIHN3aXBlci5zbGlkZVRvKGluZGV4LCBzcGVlZCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24ud2F0Y2hTdGF0ZSkge1xuICAgICAgICAkKHdpbikub24oJ2hhc2hjaGFuZ2UnLCBzd2lwZXIuaGFzaE5hdmlnYXRpb24ub25IYXNoQ2FuZ2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24ud2F0Y2hTdGF0ZSkge1xuICAgICAgICAkKHdpbikub2ZmKCdoYXNoY2hhbmdlJywgc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLm9uSGFzaENhbmdlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgSGFzaE5hdmlnYXRpb24kMSA9IHtcbiAgICBuYW1lOiAnaGFzaC1uYXZpZ2F0aW9uJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGhhc2hOYXZpZ2F0aW9uOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByZXBsYWNlU3RhdGU6IGZhbHNlLFxuICAgICAgICB3YXRjaFN0YXRlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBoYXNoTmF2aWdhdGlvbjoge1xuICAgICAgICAgIGluaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgICBpbml0OiBIYXNoTmF2aWdhdGlvbi5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkZXN0cm95OiBIYXNoTmF2aWdhdGlvbi5kZXN0cm95LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRIYXNoOiBIYXNoTmF2aWdhdGlvbi5zZXRIYXNoLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBvbkhhc2hDYW5nZTogSGFzaE5hdmlnYXRpb24ub25IYXNoQ2FuZ2UuYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uaW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIuaGFzaE5hdmlnYXRpb24uaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uc2V0SGFzaCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBcIm9mZlwiICovXG5cbiAgdmFyIEF1dG9wbGF5ID0ge1xuICAgIHJ1bjogZnVuY3Rpb24gcnVuKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGFjdGl2ZVNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmVxKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICB2YXIgZGVsYXkgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgICAgaWYgKCRhY3RpdmVTbGlkZUVsLmF0dHIoJ2RhdGEtc3dpcGVyLWF1dG9wbGF5JykpIHtcbiAgICAgICAgZGVsYXkgPSAkYWN0aXZlU2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1hdXRvcGxheScpIHx8IHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGVsYXk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQpO1xuICAgICAgc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnJldmVyc2VEaXJlY3Rpb24pIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldihzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdhdXRvcGxheScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5pc0JlZ2lubmluZykge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldihzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdhdXRvcGxheScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuc3RvcE9uTGFzdFNsaWRlKSB7XG4gICAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDEsIHN3aXBlci5wYXJhbXMuc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICAgIHN3aXBlci5sb29wRml4KCk7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dChzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIGlmICghc3dpcGVyLmlzRW5kKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dChzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIGlmICghc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5zdG9wT25MYXN0U2xpZGUpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbygwLCBzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYXV0b3BsYXkuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2Ygc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKHN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5U3RhcnQnKTtcbiAgICAgIHN3aXBlci5hdXRvcGxheS5ydW4oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmICh0eXBlb2Ygc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5hdXRvcGxheS50aW1lb3V0KTtcbiAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzd2lwZXIuYXV0b3BsYXkucnVubmluZyA9IGZhbHNlO1xuICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5U3RvcCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBwYXVzZTogZnVuY3Rpb24gcGF1c2Uoc3BlZWQpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHN3aXBlci5hdXRvcGxheS50aW1lb3V0KSB7IGNsZWFyVGltZW91dChzd2lwZXIuYXV0b3BsYXkudGltZW91dCk7IH1cbiAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSB0cnVlO1xuICAgICAgaWYgKHNwZWVkID09PSAwIHx8ICFzd2lwZXIucGFyYW1zLmF1dG9wbGF5LndhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgc3dpcGVyLmF1dG9wbGF5Lm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgQXV0b3BsYXkkMSA9IHtcbiAgICBuYW1lOiAnYXV0b3BsYXknLFxuICAgIHBhcmFtczoge1xuICAgICAgYXV0b3BsYXk6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGRlbGF5OiAzMDAwLFxuICAgICAgICB3YWl0Rm9yVHJhbnNpdGlvbjogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZU9uSW50ZXJhY3Rpb246IHRydWUsXG4gICAgICAgIHN0b3BPbkxhc3RTbGlkZTogZmFsc2UsXG4gICAgICAgIHJldmVyc2VEaXJlY3Rpb246IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGF1dG9wbGF5OiB7XG4gICAgICAgICAgcnVubmluZzogZmFsc2UsXG4gICAgICAgICAgcGF1c2VkOiBmYWxzZSxcbiAgICAgICAgICBydW46IEF1dG9wbGF5LnJ1bi5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc3RhcnQ6IEF1dG9wbGF5LnN0YXJ0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzdG9wOiBBdXRvcGxheS5zdG9wLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBwYXVzZTogQXV0b3BsYXkucGF1c2UuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci4kd3JhcHBlckVsKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykge1xuICAgICAgICAgICAgICBzd2lwZXIuYXV0b3BsYXkuc3RvcCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmVmb3JlVHJhbnNpdGlvblN0YXJ0OiBmdW5jdGlvbiBiZWZvcmVUcmFuc2l0aW9uU3RhcnQoc3BlZWQsIGludGVybmFsKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJuYWwgfHwgIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZShzcGVlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2xpZGVyRmlyc3RNb3ZlOiBmdW5jdGlvbiBzbGlkZXJGaXJzdE1vdmUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnN0b3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucnVubmluZykge1xuICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgRmFkZSA9IHtcbiAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gJHNsaWRlRWxbMF0uc3dpcGVyU2xpZGVPZmZzZXQ7XG4gICAgICAgIHZhciB0eCA9IC1vZmZzZXQ7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy52aXJ0dWFsVHJhbnNsYXRlKSB7IHR4IC09IHN3aXBlci50cmFuc2xhdGU7IH1cbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgaWYgKCFzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICB0eSA9IHR4O1xuICAgICAgICAgIHR4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2xpZGVPcGFjaXR5ID0gc3dpcGVyLnBhcmFtcy5mYWRlRWZmZWN0LmNyb3NzRmFkZVxuICAgICAgICAgID8gTWF0aC5tYXgoMSAtIE1hdGguYWJzKCRzbGlkZUVsWzBdLnByb2dyZXNzKSwgMClcbiAgICAgICAgICA6IDEgKyBNYXRoLm1pbihNYXRoLm1heCgkc2xpZGVFbFswXS5wcm9ncmVzcywgLTEpLCAwKTtcbiAgICAgICAgJHNsaWRlRWxcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHNsaWRlT3BhY2l0eSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyB0eCArIFwicHgsIFwiICsgdHkgKyBcInB4LCAwcHgpXCIpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgc2xpZGVzLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbFRyYW5zbGF0ZSAmJiBkdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICB2YXIgZXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgc2xpZGVzLnRyYW5zaXRpb25FbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChldmVudFRyaWdnZXJlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGV2ZW50VHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdmFyIHRyaWdnZXJFdmVudHMgPSBbJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCAndHJhbnNpdGlvbmVuZCddO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpZ2dlckV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgJHdyYXBwZXJFbC50cmlnZ2VyKHRyaWdnZXJFdmVudHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgRWZmZWN0RmFkZSA9IHtcbiAgICBuYW1lOiAnZWZmZWN0LWZhZGUnLFxuICAgIHBhcmFtczoge1xuICAgICAgZmFkZUVmZmVjdDoge1xuICAgICAgICBjcm9zc0ZhZGU6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGZhZGVFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEZhZGUuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBGYWRlLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2ZhZGUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiZmFkZVwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzcGFjZUJldHdlZW46IDAsXG4gICAgICAgICAgdmlydHVhbFRyYW5zbGF0ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIub3JpZ2luYWxQYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdmYWRlJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmZhZGVFZmZlY3Quc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnZmFkZScpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5mYWRlRWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBDdWJlID0ge1xuICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICAgIHZhciBzd2lwZXJXaWR0aCA9IHN3aXBlci53aWR0aDtcbiAgICAgIHZhciBzd2lwZXJIZWlnaHQgPSBzd2lwZXIuaGVpZ2h0O1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgc3dpcGVyU2l6ZSA9IHN3aXBlci5zaXplO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuY3ViZUVmZmVjdDtcbiAgICAgIHZhciBpc0hvcml6b250YWwgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgICB2YXIgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG4gICAgICB2YXIgd3JhcHBlclJvdGF0ZSA9IDA7XG4gICAgICB2YXIgJGN1YmVTaGFkb3dFbDtcbiAgICAgIGlmIChwYXJhbXMuc2hhZG93KSB7XG4gICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAkY3ViZVNoYWRvd0VsID0gJHdyYXBwZXJFbC5maW5kKCcuc3dpcGVyLWN1YmUtc2hhZG93Jyk7XG4gICAgICAgICAgaWYgKCRjdWJlU2hhZG93RWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkY3ViZVNoYWRvd0VsID0gJCgnPGRpdiBjbGFzcz1cInN3aXBlci1jdWJlLXNoYWRvd1wiPjwvZGl2PicpO1xuICAgICAgICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoJGN1YmVTaGFkb3dFbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgICRjdWJlU2hhZG93RWwuY3NzKHsgaGVpZ2h0OiAoc3dpcGVyV2lkdGggKyBcInB4XCIpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRjdWJlU2hhZG93RWwgPSAkZWwuZmluZCgnLnN3aXBlci1jdWJlLXNoYWRvdycpO1xuICAgICAgICAgIGlmICgkY3ViZVNoYWRvd0VsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJGN1YmVTaGFkb3dFbCA9ICQoJzxkaXYgY2xhc3M9XCJzd2lwZXItY3ViZS1zaGFkb3dcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICRlbC5hcHBlbmQoJGN1YmVTaGFkb3dFbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzbGlkZXMuZXEoaSk7XG4gICAgICAgIHZhciBzbGlkZUluZGV4ID0gaTtcbiAgICAgICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBwYXJzZUludCgkc2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNsaWRlQW5nbGUgPSBzbGlkZUluZGV4ICogOTA7XG4gICAgICAgIHZhciByb3VuZCA9IE1hdGguZmxvb3Ioc2xpZGVBbmdsZSAvIDM2MCk7XG4gICAgICAgIGlmIChydGwpIHtcbiAgICAgICAgICBzbGlkZUFuZ2xlID0gLXNsaWRlQW5nbGU7XG4gICAgICAgICAgcm91bmQgPSBNYXRoLmZsb29yKC1zbGlkZUFuZ2xlIC8gMzYwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBNYXRoLm1heChNYXRoLm1pbigkc2xpZGVFbFswXS5wcm9ncmVzcywgMSksIC0xKTtcbiAgICAgICAgdmFyIHR4ID0gMDtcbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgdmFyIHR6ID0gMDtcbiAgICAgICAgaWYgKHNsaWRlSW5kZXggJSA0ID09PSAwKSB7XG4gICAgICAgICAgdHggPSAtcm91bmQgKiA0ICogc3dpcGVyU2l6ZTtcbiAgICAgICAgICB0eiA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoKHNsaWRlSW5kZXggLSAxKSAlIDQgPT09IDApIHtcbiAgICAgICAgICB0eCA9IDA7XG4gICAgICAgICAgdHogPSAtcm91bmQgKiA0ICogc3dpcGVyU2l6ZTtcbiAgICAgICAgfSBlbHNlIGlmICgoc2xpZGVJbmRleCAtIDIpICUgNCA9PT0gMCkge1xuICAgICAgICAgIHR4ID0gc3dpcGVyU2l6ZSArIChyb3VuZCAqIDQgKiBzd2lwZXJTaXplKTtcbiAgICAgICAgICB0eiA9IHN3aXBlclNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAoKHNsaWRlSW5kZXggLSAzKSAlIDQgPT09IDApIHtcbiAgICAgICAgICB0eCA9IC1zd2lwZXJTaXplO1xuICAgICAgICAgIHR6ID0gKDMgKiBzd2lwZXJTaXplKSArIChzd2lwZXJTaXplICogNCAqIHJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnRsKSB7XG4gICAgICAgICAgdHggPSAtdHg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgIHR5ID0gdHg7XG4gICAgICAgICAgdHggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IFwicm90YXRlWChcIiArIChpc0hvcml6b250YWwgPyAwIDogLXNsaWRlQW5nbGUpICsgXCJkZWcpIHJvdGF0ZVkoXCIgKyAoaXNIb3Jpem9udGFsID8gc2xpZGVBbmdsZSA6IDApICsgXCJkZWcpIHRyYW5zbGF0ZTNkKFwiICsgdHggKyBcInB4LCBcIiArIHR5ICsgXCJweCwgXCIgKyB0eiArIFwicHgpXCI7XG4gICAgICAgIGlmIChwcm9ncmVzcyA8PSAxICYmIHByb2dyZXNzID4gLTEpIHtcbiAgICAgICAgICB3cmFwcGVyUm90YXRlID0gKHNsaWRlSW5kZXggKiA5MCkgKyAocHJvZ3Jlc3MgKiA5MCk7XG4gICAgICAgICAgaWYgKHJ0bCkgeyB3cmFwcGVyUm90YXRlID0gKC1zbGlkZUluZGV4ICogOTApIC0gKHByb2dyZXNzICogOTApOyB9XG4gICAgICAgIH1cbiAgICAgICAgJHNsaWRlRWwudHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGlmIChwYXJhbXMuc2xpZGVTaGFkb3dzKSB7XG4gICAgICAgICAgLy8gU2V0IHNoYWRvd3NcbiAgICAgICAgICB2YXIgc2hhZG93QmVmb3JlID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wJyk7XG4gICAgICAgICAgdmFyIHNoYWRvd0FmdGVyID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQnKSA6ICRzbGlkZUVsLmZpbmQoJy5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbScpO1xuICAgICAgICAgIGlmIChzaGFkb3dCZWZvcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzaGFkb3dCZWZvcmUgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ2xlZnQnIDogJ3RvcCcpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoc2hhZG93QmVmb3JlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNoYWRvd0FmdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2hhZG93QWZ0ZXIgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ3JpZ2h0JyA6ICdib3R0b20nKSArIFwiXFxcIj48L2Rpdj5cIikpO1xuICAgICAgICAgICAgJHNsaWRlRWwuYXBwZW5kKHNoYWRvd0FmdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNoYWRvd0JlZm9yZS5sZW5ndGgpIHsgc2hhZG93QmVmb3JlWzBdLnN0eWxlLm9wYWNpdHkgPSBNYXRoLm1heCgtcHJvZ3Jlc3MsIDApOyB9XG4gICAgICAgICAgaWYgKHNoYWRvd0FmdGVyLmxlbmd0aCkgeyBzaGFkb3dBZnRlclswXS5zdHlsZS5vcGFjaXR5ID0gTWF0aC5tYXgocHJvZ3Jlc3MsIDApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICR3cmFwcGVyRWwuY3NzKHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbic6IChcIjUwJSA1MCUgLVwiICsgKHN3aXBlclNpemUgLyAyKSArIFwicHhcIiksXG4gICAgICAgICctbW96LXRyYW5zZm9ybS1vcmlnaW4nOiAoXCI1MCUgNTAlIC1cIiArIChzd2lwZXJTaXplIC8gMikgKyBcInB4XCIpLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybS1vcmlnaW4nOiAoXCI1MCUgNTAlIC1cIiArIChzd2lwZXJTaXplIC8gMikgKyBcInB4XCIpLFxuICAgICAgICAndHJhbnNmb3JtLW9yaWdpbic6IChcIjUwJSA1MCUgLVwiICsgKHN3aXBlclNpemUgLyAyKSArIFwicHhcIiksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHBhcmFtcy5zaGFkb3cpIHtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICRjdWJlU2hhZG93RWwudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDBweCwgXCIgKyAoKHN3aXBlcldpZHRoIC8gMikgKyBwYXJhbXMuc2hhZG93T2Zmc2V0KSArIFwicHgsIFwiICsgKC1zd2lwZXJXaWR0aCAvIDIpICsgXCJweCkgcm90YXRlWCg5MGRlZykgcm90YXRlWigwZGVnKSBzY2FsZShcIiArIChwYXJhbXMuc2hhZG93U2NhbGUpICsgXCIpXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2hhZG93QW5nbGUgPSBNYXRoLmFicyh3cmFwcGVyUm90YXRlKSAtIChNYXRoLmZsb29yKE1hdGguYWJzKHdyYXBwZXJSb3RhdGUpIC8gOTApICogOTApO1xuICAgICAgICAgIHZhciBtdWx0aXBsaWVyID0gMS41IC0gKFxuICAgICAgICAgICAgKE1hdGguc2luKChzaGFkb3dBbmdsZSAqIDIgKiBNYXRoLlBJKSAvIDM2MCkgLyAyKVxuICAgICAgICAgICAgKyAoTWF0aC5jb3MoKHNoYWRvd0FuZ2xlICogMiAqIE1hdGguUEkpIC8gMzYwKSAvIDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgc2NhbGUxID0gcGFyYW1zLnNoYWRvd1NjYWxlO1xuICAgICAgICAgIHZhciBzY2FsZTIgPSBwYXJhbXMuc2hhZG93U2NhbGUgLyBtdWx0aXBsaWVyO1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBwYXJhbXMuc2hhZG93T2Zmc2V0O1xuICAgICAgICAgICRjdWJlU2hhZG93RWwudHJhbnNmb3JtKChcInNjYWxlM2QoXCIgKyBzY2FsZTEgKyBcIiwgMSwgXCIgKyBzY2FsZTIgKyBcIikgdHJhbnNsYXRlM2QoMHB4LCBcIiArICgoc3dpcGVySGVpZ2h0IC8gMikgKyBvZmZzZXQpICsgXCJweCwgXCIgKyAoLXN3aXBlckhlaWdodCAvIDIgLyBzY2FsZTIpICsgXCJweCkgcm90YXRlWCgtOTBkZWcpXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHpGYWN0b3IgPSAoQnJvd3Nlci5pc1NhZmFyaSB8fCBCcm93c2VyLmlzVWlXZWJWaWV3KSA/ICgtc3dpcGVyU2l6ZSAvIDIpIDogMDtcbiAgICAgICR3cmFwcGVyRWxcbiAgICAgICAgLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwcHgsMCxcIiArIHpGYWN0b3IgKyBcInB4KSByb3RhdGVYKFwiICsgKHN3aXBlci5pc0hvcml6b250YWwoKSA/IDAgOiB3cmFwcGVyUm90YXRlKSArIFwiZGVnKSByb3RhdGVZKFwiICsgKHN3aXBlci5pc0hvcml6b250YWwoKSA/IC13cmFwcGVyUm90YXRlIDogMCkgKyBcImRlZylcIikpO1xuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgc2xpZGVzXG4gICAgICAgIC50cmFuc2l0aW9uKGR1cmF0aW9uKVxuICAgICAgICAuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JylcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuY3ViZUVmZmVjdC5zaGFkb3cgJiYgIXN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAkZWwuZmluZCgnLnN3aXBlci1jdWJlLXNoYWRvdycpLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEVmZmVjdEN1YmUgPSB7XG4gICAgbmFtZTogJ2VmZmVjdC1jdWJlJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGN1YmVFZmZlY3Q6IHtcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgICBzaGFkb3c6IHRydWUsXG4gICAgICAgIHNoYWRvd09mZnNldDogMjAsXG4gICAgICAgIHNoYWRvd1NjYWxlOiAwLjk0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGN1YmVFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEN1YmUuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBDdWJlLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2N1YmUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiY3ViZVwiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICByZXNpc3RhbmNlUmF0aW86IDAsXG4gICAgICAgICAgc3BhY2VCZXR3ZWVuOiAwLFxuICAgICAgICAgIGNlbnRlcmVkU2xpZGVzOiBmYWxzZSxcbiAgICAgICAgICB2aXJ0dWFsVHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnBhcmFtcywgb3ZlcndyaXRlUGFyYW1zKTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5vcmlnaW5hbFBhcmFtcywgb3ZlcndyaXRlUGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2N1YmUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY3ViZUVmZmVjdC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdjdWJlJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmN1YmVFZmZlY3Quc2V0VHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEZsaXAgPSB7XG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzbGlkZXMuZXEoaSk7XG4gICAgICAgIHZhciBwcm9ncmVzcyA9ICRzbGlkZUVsWzBdLnByb2dyZXNzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5mbGlwRWZmZWN0LmxpbWl0Um90YXRpb24pIHtcbiAgICAgICAgICBwcm9ncmVzcyA9IE1hdGgubWF4KE1hdGgubWluKCRzbGlkZUVsWzBdLnByb2dyZXNzLCAxKSwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvZmZzZXQgPSAkc2xpZGVFbFswXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICAgICAgdmFyIHJvdGF0ZSA9IC0xODAgKiBwcm9ncmVzcztcbiAgICAgICAgdmFyIHJvdGF0ZVkgPSByb3RhdGU7XG4gICAgICAgIHZhciByb3RhdGVYID0gMDtcbiAgICAgICAgdmFyIHR4ID0gLW9mZnNldDtcbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgaWYgKCFzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICB0eSA9IHR4O1xuICAgICAgICAgIHR4ID0gMDtcbiAgICAgICAgICByb3RhdGVYID0gLXJvdGF0ZVk7XG4gICAgICAgICAgcm90YXRlWSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAocnRsKSB7XG4gICAgICAgICAgcm90YXRlWSA9IC1yb3RhdGVZO1xuICAgICAgICB9XG5cbiAgICAgICAgJHNsaWRlRWxbMF0uc3R5bGUuekluZGV4ID0gLU1hdGguYWJzKE1hdGgucm91bmQocHJvZ3Jlc3MpKSArIHNsaWRlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZmxpcEVmZmVjdC5zbGlkZVNoYWRvd3MpIHtcbiAgICAgICAgICAvLyBTZXQgc2hhZG93c1xuICAgICAgICAgIHZhciBzaGFkb3dCZWZvcmUgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JykgOiAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AnKTtcbiAgICAgICAgICB2YXIgc2hhZG93QWZ0ZXIgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tJyk7XG4gICAgICAgICAgaWYgKHNoYWRvd0JlZm9yZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNoYWRvd0JlZm9yZSA9ICQoKFwiPGRpdiBjbGFzcz1cXFwic3dpcGVyLXNsaWRlLXNoYWRvdy1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnbGVmdCcgOiAndG9wJykgKyBcIlxcXCI+PC9kaXY+XCIpKTtcbiAgICAgICAgICAgICRzbGlkZUVsLmFwcGVuZChzaGFkb3dCZWZvcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hhZG93QWZ0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzaGFkb3dBZnRlciA9ICQoKFwiPGRpdiBjbGFzcz1cXFwic3dpcGVyLXNsaWRlLXNoYWRvdy1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAncmlnaHQnIDogJ2JvdHRvbScpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoc2hhZG93QWZ0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hhZG93QmVmb3JlLmxlbmd0aCkgeyBzaGFkb3dCZWZvcmVbMF0uc3R5bGUub3BhY2l0eSA9IE1hdGgubWF4KC1wcm9ncmVzcywgMCk7IH1cbiAgICAgICAgICBpZiAoc2hhZG93QWZ0ZXIubGVuZ3RoKSB7IHNoYWRvd0FmdGVyWzBdLnN0eWxlLm9wYWNpdHkgPSBNYXRoLm1heChwcm9ncmVzcywgMCk7IH1cbiAgICAgICAgfVxuICAgICAgICAkc2xpZGVFbFxuICAgICAgICAgIC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyB0eCArIFwicHgsIFwiICsgdHkgKyBcInB4LCAwcHgpIHJvdGF0ZVgoXCIgKyByb3RhdGVYICsgXCJkZWcpIHJvdGF0ZVkoXCIgKyByb3RhdGVZICsgXCJkZWcpXCIpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgc2xpZGVzXG4gICAgICAgIC50cmFuc2l0aW9uKGR1cmF0aW9uKVxuICAgICAgICAuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JylcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbFRyYW5zbGF0ZSAmJiBkdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICB2YXIgZXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHNsaWRlcy5lcShhY3RpdmVJbmRleCkudHJhbnNpdGlvbkVuZChmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgICAgaWYgKGV2ZW50VHJpZ2dlcmVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgLy8gaWYgKCEkKHRoaXMpLmhhc0NsYXNzKHN3aXBlci5wYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykpIHJldHVybjtcbiAgICAgICAgICBldmVudFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHZhciB0cmlnZ2VyRXZlbnRzID0gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJFdmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICR3cmFwcGVyRWwudHJpZ2dlcih0cmlnZ2VyRXZlbnRzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEVmZmVjdEZsaXAgPSB7XG4gICAgbmFtZTogJ2VmZmVjdC1mbGlwJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGZsaXBFZmZlY3Q6IHtcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgICBsaW1pdFJvdGF0aW9uOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGZsaXBFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEZsaXAuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBGbGlwLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2ZsaXAnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiZmxpcFwiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzcGFjZUJldHdlZW46IDAsXG4gICAgICAgICAgdmlydHVhbFRyYW5zbGF0ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIub3JpZ2luYWxQYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdmbGlwJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmZsaXBFZmZlY3Quc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnZmxpcCcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5mbGlwRWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBDb3ZlcmZsb3cgPSB7XG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzd2lwZXJXaWR0aCA9IHN3aXBlci53aWR0aDtcbiAgICAgIHZhciBzd2lwZXJIZWlnaHQgPSBzd2lwZXIuaGVpZ2h0O1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgdmFyIHNsaWRlc1NpemVzR3JpZCA9IHN3aXBlci5zbGlkZXNTaXplc0dyaWQ7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5jb3ZlcmZsb3dFZmZlY3Q7XG4gICAgICB2YXIgaXNIb3Jpem9udGFsID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHN3aXBlci50cmFuc2xhdGU7XG4gICAgICB2YXIgY2VudGVyID0gaXNIb3Jpem9udGFsID8gLXRyYW5zZm9ybSArIChzd2lwZXJXaWR0aCAvIDIpIDogLXRyYW5zZm9ybSArIChzd2lwZXJIZWlnaHQgLyAyKTtcbiAgICAgIHZhciByb3RhdGUgPSBpc0hvcml6b250YWwgPyBwYXJhbXMucm90YXRlIDogLXBhcmFtcy5yb3RhdGU7XG4gICAgICB2YXIgdHJhbnNsYXRlID0gcGFyYW1zLmRlcHRoO1xuICAgICAgLy8gRWFjaCBzbGlkZSBvZmZzZXQgZnJvbSBjZW50ZXJcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBzbGlkZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyICRzbGlkZUVsID0gc2xpZGVzLmVxKGkpO1xuICAgICAgICB2YXIgc2xpZGVTaXplID0gc2xpZGVzU2l6ZXNHcmlkW2ldO1xuICAgICAgICB2YXIgc2xpZGVPZmZzZXQgPSAkc2xpZGVFbFswXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICAgICAgdmFyIG9mZnNldE11bHRpcGxpZXIgPSAoKGNlbnRlciAtIHNsaWRlT2Zmc2V0IC0gKHNsaWRlU2l6ZSAvIDIpKSAvIHNsaWRlU2l6ZSkgKiBwYXJhbXMubW9kaWZpZXI7XG5cbiAgICAgICAgdmFyIHJvdGF0ZVkgPSBpc0hvcml6b250YWwgPyByb3RhdGUgKiBvZmZzZXRNdWx0aXBsaWVyIDogMDtcbiAgICAgICAgdmFyIHJvdGF0ZVggPSBpc0hvcml6b250YWwgPyAwIDogcm90YXRlICogb2Zmc2V0TXVsdGlwbGllcjtcbiAgICAgICAgLy8gdmFyIHJvdGF0ZVogPSAwXG4gICAgICAgIHZhciB0cmFuc2xhdGVaID0gLXRyYW5zbGF0ZSAqIE1hdGguYWJzKG9mZnNldE11bHRpcGxpZXIpO1xuXG4gICAgICAgIHZhciB0cmFuc2xhdGVZID0gaXNIb3Jpem9udGFsID8gMCA6IHBhcmFtcy5zdHJldGNoICogKG9mZnNldE11bHRpcGxpZXIpO1xuICAgICAgICB2YXIgdHJhbnNsYXRlWCA9IGlzSG9yaXpvbnRhbCA/IHBhcmFtcy5zdHJldGNoICogKG9mZnNldE11bHRpcGxpZXIpIDogMDtcblxuICAgICAgICAvLyBGaXggZm9yIHVsdHJhIHNtYWxsIHZhbHVlc1xuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWCkgPCAwLjAwMSkgeyB0cmFuc2xhdGVYID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWSkgPCAwLjAwMSkgeyB0cmFuc2xhdGVZID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWikgPCAwLjAwMSkgeyB0cmFuc2xhdGVaID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnMocm90YXRlWSkgPCAwLjAwMSkgeyByb3RhdGVZID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnMocm90YXRlWCkgPCAwLjAwMSkgeyByb3RhdGVYID0gMDsgfVxuXG4gICAgICAgIHZhciBzbGlkZVRyYW5zZm9ybSA9IFwidHJhbnNsYXRlM2QoXCIgKyB0cmFuc2xhdGVYICsgXCJweCxcIiArIHRyYW5zbGF0ZVkgKyBcInB4LFwiICsgdHJhbnNsYXRlWiArIFwicHgpICByb3RhdGVYKFwiICsgcm90YXRlWCArIFwiZGVnKSByb3RhdGVZKFwiICsgcm90YXRlWSArIFwiZGVnKVwiO1xuXG4gICAgICAgICRzbGlkZUVsLnRyYW5zZm9ybShzbGlkZVRyYW5zZm9ybSk7XG4gICAgICAgICRzbGlkZUVsWzBdLnN0eWxlLnpJbmRleCA9IC1NYXRoLmFicyhNYXRoLnJvdW5kKG9mZnNldE11bHRpcGxpZXIpKSArIDE7XG4gICAgICAgIGlmIChwYXJhbXMuc2xpZGVTaGFkb3dzKSB7XG4gICAgICAgICAgLy8gU2V0IHNoYWRvd3NcbiAgICAgICAgICB2YXIgJHNoYWRvd0JlZm9yZUVsID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wJyk7XG4gICAgICAgICAgdmFyICRzaGFkb3dBZnRlckVsID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQnKSA6ICRzbGlkZUVsLmZpbmQoJy5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbScpO1xuICAgICAgICAgIGlmICgkc2hhZG93QmVmb3JlRWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkc2hhZG93QmVmb3JlRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ2xlZnQnIDogJ3RvcCcpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoJHNoYWRvd0JlZm9yZUVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dBZnRlckVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJHNoYWRvd0FmdGVyRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ3JpZ2h0JyA6ICdib3R0b20nKSArIFwiXFxcIj48L2Rpdj5cIikpO1xuICAgICAgICAgICAgJHNsaWRlRWwuYXBwZW5kKCRzaGFkb3dBZnRlckVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dCZWZvcmVFbC5sZW5ndGgpIHsgJHNoYWRvd0JlZm9yZUVsWzBdLnN0eWxlLm9wYWNpdHkgPSBvZmZzZXRNdWx0aXBsaWVyID4gMCA/IG9mZnNldE11bHRpcGxpZXIgOiAwOyB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dBZnRlckVsLmxlbmd0aCkgeyAkc2hhZG93QWZ0ZXJFbFswXS5zdHlsZS5vcGFjaXR5ID0gKC1vZmZzZXRNdWx0aXBsaWVyKSA+IDAgPyAtb2Zmc2V0TXVsdGlwbGllciA6IDA7IH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29ycmVjdCBwZXJzcGVjdGl2ZSBmb3IgSUUxMFxuICAgICAgaWYgKFN1cHBvcnQucG9pbnRlckV2ZW50cyB8fCBTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykge1xuICAgICAgICB2YXIgd3MgPSAkd3JhcHBlckVsWzBdLnN0eWxlO1xuICAgICAgICB3cy5wZXJzcGVjdGl2ZU9yaWdpbiA9IGNlbnRlciArIFwicHggNTAlXCI7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5zbGlkZXNcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pXG4gICAgICAgIC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20sIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQnKVxuICAgICAgICAudHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgfSxcbiAgfTtcblxuICB2YXIgRWZmZWN0Q292ZXJmbG93ID0ge1xuICAgIG5hbWU6ICdlZmZlY3QtY292ZXJmbG93JyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGNvdmVyZmxvd0VmZmVjdDoge1xuICAgICAgICByb3RhdGU6IDUwLFxuICAgICAgICBzdHJldGNoOiAwLFxuICAgICAgICBkZXB0aDogMTAwLFxuICAgICAgICBtb2RpZmllcjogMSxcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGNvdmVyZmxvd0VmZmVjdDoge1xuICAgICAgICAgIHNldFRyYW5zbGF0ZTogQ292ZXJmbG93LnNldFRyYW5zbGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0VHJhbnNpdGlvbjogQ292ZXJmbG93LnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2NvdmVyZmxvdycpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgc3dpcGVyLmNsYXNzTmFtZXMucHVzaCgoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcImNvdmVyZmxvd1wiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG5cbiAgICAgICAgc3dpcGVyLnBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnY292ZXJmbG93JykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmNvdmVyZmxvd0VmZmVjdC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdjb3ZlcmZsb3cnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY292ZXJmbG93RWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBUaHVtYnMgPSB7XG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJlZiA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgdGh1bWJzUGFyYW1zID0gcmVmLnRodW1icztcbiAgICAgIHZhciBTd2lwZXJDbGFzcyA9IHN3aXBlci5jb25zdHJ1Y3RvcjtcbiAgICAgIGlmICh0aHVtYnNQYXJhbXMuc3dpcGVyIGluc3RhbmNlb2YgU3dpcGVyQ2xhc3MpIHtcbiAgICAgICAgc3dpcGVyLnRodW1icy5zd2lwZXIgPSB0aHVtYnNQYXJhbXMuc3dpcGVyO1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnRodW1icy5zd2lwZXIub3JpZ2luYWxQYXJhbXMsIHtcbiAgICAgICAgICB3YXRjaFNsaWRlc1Byb2dyZXNzOiB0cnVlLFxuICAgICAgICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci50aHVtYnMuc3dpcGVyLnBhcmFtcywge1xuICAgICAgICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgICAgc2xpZGVUb0NsaWNrZWRTbGlkZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChVdGlscy5pc09iamVjdCh0aHVtYnNQYXJhbXMuc3dpcGVyKSkge1xuICAgICAgICBzd2lwZXIudGh1bWJzLnN3aXBlciA9IG5ldyBTd2lwZXJDbGFzcyhVdGlscy5leHRlbmQoe30sIHRodW1ic1BhcmFtcy5zd2lwZXIsIHtcbiAgICAgICAgICB3YXRjaFNsaWRlc1Zpc2liaWxpdHk6IHRydWUsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzbGlkZVRvQ2xpY2tlZFNsaWRlOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgICAgICBzd2lwZXIudGh1bWJzLnN3aXBlckNyZWF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnRodW1icy5zd2lwZXIuJGVsLmFkZENsYXNzKHN3aXBlci5wYXJhbXMudGh1bWJzLnRodW1ic0NvbnRhaW5lckNsYXNzKTtcbiAgICAgIHN3aXBlci50aHVtYnMuc3dpcGVyLm9uKCd0YXAnLCBzd2lwZXIudGh1bWJzLm9uVGh1bWJDbGljayk7XG4gICAgfSxcbiAgICBvblRodW1iQ2xpY2s6IGZ1bmN0aW9uIG9uVGh1bWJDbGljaygpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHRodW1ic1N3aXBlciA9IHN3aXBlci50aHVtYnMuc3dpcGVyO1xuICAgICAgaWYgKCF0aHVtYnNTd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgY2xpY2tlZEluZGV4ID0gdGh1bWJzU3dpcGVyLmNsaWNrZWRJbmRleDtcbiAgICAgIHZhciBjbGlja2VkU2xpZGUgPSB0aHVtYnNTd2lwZXIuY2xpY2tlZFNsaWRlO1xuICAgICAgaWYgKGNsaWNrZWRTbGlkZSAmJiAkKGNsaWNrZWRTbGlkZSkuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy50aHVtYnMuc2xpZGVUaHVtYkFjdGl2ZUNsYXNzKSkgeyByZXR1cm47IH1cbiAgICAgIGlmICh0eXBlb2YgY2xpY2tlZEluZGV4ID09PSAndW5kZWZpbmVkJyB8fCBjbGlja2VkSW5kZXggPT09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc2xpZGVUb0luZGV4O1xuICAgICAgaWYgKHRodW1ic1N3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICBzbGlkZVRvSW5kZXggPSBwYXJzZUludCgkKHRodW1ic1N3aXBlci5jbGlja2VkU2xpZGUpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsaWRlVG9JbmRleCA9IGNsaWNrZWRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgICAgaWYgKHN3aXBlci5zbGlkZXMuZXEoY3VycmVudEluZGV4KS5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIuJHdyYXBwZXJFbFswXS5jbGllbnRMZWZ0O1xuICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldkluZGV4ID0gc3dpcGVyLnNsaWRlcy5lcShjdXJyZW50SW5kZXgpLnByZXZBbGwoKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHNsaWRlVG9JbmRleCArIFwiXFxcIl1cIikpLmVxKDApLmluZGV4KCk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBzd2lwZXIuc2xpZGVzLmVxKGN1cnJlbnRJbmRleCkubmV4dEFsbCgoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgc2xpZGVUb0luZGV4ICsgXCJcXFwiXVwiKSkuZXEoMCkuaW5kZXgoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcmV2SW5kZXggPT09ICd1bmRlZmluZWQnKSB7IHNsaWRlVG9JbmRleCA9IG5leHRJbmRleDsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbmV4dEluZGV4ID09PSAndW5kZWZpbmVkJykgeyBzbGlkZVRvSW5kZXggPSBwcmV2SW5kZXg7IH1cbiAgICAgICAgZWxzZSBpZiAobmV4dEluZGV4IC0gY3VycmVudEluZGV4IDwgY3VycmVudEluZGV4IC0gcHJldkluZGV4KSB7IHNsaWRlVG9JbmRleCA9IG5leHRJbmRleDsgfVxuICAgICAgICBlbHNlIHsgc2xpZGVUb0luZGV4ID0gcHJldkluZGV4OyB9XG4gICAgICB9XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoaW5pdGlhbCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgdGh1bWJzU3dpcGVyID0gc3dpcGVyLnRodW1icy5zd2lwZXI7XG4gICAgICBpZiAoIXRodW1ic1N3aXBlcikgeyByZXR1cm47IH1cblxuICAgICAgdmFyIHNsaWRlc1BlclZpZXcgPSB0aHVtYnNTd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJ1xuICAgICAgICA/IHRodW1ic1N3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpXG4gICAgICAgIDogdGh1bWJzU3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuXG4gICAgICBpZiAoc3dpcGVyLnJlYWxJbmRleCAhPT0gdGh1bWJzU3dpcGVyLnJlYWxJbmRleCkge1xuICAgICAgICB2YXIgY3VycmVudFRodW1ic0luZGV4ID0gdGh1bWJzU3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgICB2YXIgbmV3VGh1bWJzSW5kZXg7XG4gICAgICAgIGlmICh0aHVtYnNTd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnNsaWRlcy5lcShjdXJyZW50VGh1bWJzSW5kZXgpLmhhc0NsYXNzKHRodW1ic1N3aXBlci5wYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpIHtcbiAgICAgICAgICAgIHRodW1ic1N3aXBlci5sb29wRml4KCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRodW1ic1N3aXBlci5fY2xpZW50TGVmdCA9IHRodW1ic1N3aXBlci4kd3JhcHBlckVsWzBdLmNsaWVudExlZnQ7XG4gICAgICAgICAgICBjdXJyZW50VGh1bWJzSW5kZXggPSB0aHVtYnNTd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZpbmQgYWN0dWFsIHRodW1icyBpbmRleCB0byBzbGlkZSB0b1xuICAgICAgICAgIHZhciBwcmV2VGh1bWJzSW5kZXggPSB0aHVtYnNTd2lwZXIuc2xpZGVzLmVxKGN1cnJlbnRUaHVtYnNJbmRleCkucHJldkFsbCgoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHN3aXBlci5yZWFsSW5kZXgpICsgXCJcXFwiXVwiKSkuZXEoMCkuaW5kZXgoKTtcbiAgICAgICAgICB2YXIgbmV4dFRodW1ic0luZGV4ID0gdGh1bWJzU3dpcGVyLnNsaWRlcy5lcShjdXJyZW50VGh1bWJzSW5kZXgpLm5leHRBbGwoKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIChzd2lwZXIucmVhbEluZGV4KSArIFwiXFxcIl1cIikpLmVxKDApLmluZGV4KCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcmV2VGh1bWJzSW5kZXggPT09ICd1bmRlZmluZWQnKSB7IG5ld1RodW1ic0luZGV4ID0gbmV4dFRodW1ic0luZGV4OyB9XG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG5leHRUaHVtYnNJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHsgbmV3VGh1bWJzSW5kZXggPSBwcmV2VGh1bWJzSW5kZXg7IH1cbiAgICAgICAgICBlbHNlIGlmIChuZXh0VGh1bWJzSW5kZXggLSBjdXJyZW50VGh1bWJzSW5kZXggPT09IGN1cnJlbnRUaHVtYnNJbmRleCAtIHByZXZUaHVtYnNJbmRleCkgeyBuZXdUaHVtYnNJbmRleCA9IGN1cnJlbnRUaHVtYnNJbmRleDsgfVxuICAgICAgICAgIGVsc2UgaWYgKG5leHRUaHVtYnNJbmRleCAtIGN1cnJlbnRUaHVtYnNJbmRleCA8IGN1cnJlbnRUaHVtYnNJbmRleCAtIHByZXZUaHVtYnNJbmRleCkgeyBuZXdUaHVtYnNJbmRleCA9IG5leHRUaHVtYnNJbmRleDsgfVxuICAgICAgICAgIGVsc2UgeyBuZXdUaHVtYnNJbmRleCA9IHByZXZUaHVtYnNJbmRleDsgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gc3dpcGVyLnJlYWxJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzICYmIHRodW1ic1N3aXBlci52aXNpYmxlU2xpZGVzSW5kZXhlcy5pbmRleE9mKG5ld1RodW1ic0luZGV4KSA8IDApIHtcbiAgICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICAgICAgaWYgKG5ld1RodW1ic0luZGV4ID4gY3VycmVudFRodW1ic0luZGV4KSB7XG4gICAgICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gbmV3VGh1bWJzSW5kZXggLSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXdUaHVtYnNJbmRleCA9IG5ld1RodW1ic0luZGV4ICsgTWF0aC5mbG9vcihzbGlkZXNQZXJWaWV3IC8gMikgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobmV3VGh1bWJzSW5kZXggPiBjdXJyZW50VGh1bWJzSW5kZXgpIHtcbiAgICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gbmV3VGh1bWJzSW5kZXggLSBzbGlkZXNQZXJWaWV3ICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGh1bWJzU3dpcGVyLnNsaWRlVG8obmV3VGh1bWJzSW5kZXgsIGluaXRpYWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBY3RpdmF0ZSB0aHVtYnNcbiAgICAgIHZhciB0aHVtYnNUb0FjdGl2YXRlID0gMTtcbiAgICAgIHZhciB0aHVtYkFjdGl2ZUNsYXNzID0gc3dpcGVyLnBhcmFtcy50aHVtYnMuc2xpZGVUaHVtYkFjdGl2ZUNsYXNzO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3ID4gMSAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICB0aHVtYnNUb0FjdGl2YXRlID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgfVxuXG4gICAgICB0aHVtYnNTd2lwZXIuc2xpZGVzLnJlbW92ZUNsYXNzKHRodW1iQWN0aXZlQ2xhc3MpO1xuICAgICAgaWYgKHRodW1ic1N3aXBlci5wYXJhbXMubG9vcCB8fCB0aHVtYnNTd2lwZXIucGFyYW1zLnZpcnR1YWwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aHVtYnNUb0FjdGl2YXRlOyBpICs9IDEpIHtcbiAgICAgICAgICB0aHVtYnNTd2lwZXIuJHdyYXBwZXJFbC5jaGlsZHJlbigoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHN3aXBlci5yZWFsSW5kZXggKyBpKSArIFwiXFxcIl1cIikpLmFkZENsYXNzKHRodW1iQWN0aXZlQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aHVtYnNUb0FjdGl2YXRlOyBpJDEgKz0gMSkge1xuICAgICAgICAgIHRodW1ic1N3aXBlci5zbGlkZXMuZXEoc3dpcGVyLnJlYWxJbmRleCArIGkkMSkuYWRkQ2xhc3ModGh1bWJBY3RpdmVDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgVGh1bWJzJDEgPSB7XG4gICAgbmFtZTogJ3RodW1icycsXG4gICAgcGFyYW1zOiB7XG4gICAgICB0aHVtYnM6IHtcbiAgICAgICAgc3dpcGVyOiBudWxsLFxuICAgICAgICBzbGlkZVRodW1iQWN0aXZlQ2xhc3M6ICdzd2lwZXItc2xpZGUtdGh1bWItYWN0aXZlJyxcbiAgICAgICAgdGh1bWJzQ29udGFpbmVyQ2xhc3M6ICdzd2lwZXItY29udGFpbmVyLXRodW1icycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgdGh1bWJzOiB7XG4gICAgICAgICAgc3dpcGVyOiBudWxsLFxuICAgICAgICAgIGluaXQ6IFRodW1icy5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICB1cGRhdGU6IFRodW1icy51cGRhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uVGh1bWJDbGljazogVGh1bWJzLm9uVGh1bWJDbGljay5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgdmFyIHJlZiA9IHN3aXBlci5wYXJhbXM7XG4gICAgICAgIHZhciB0aHVtYnMgPSByZWYudGh1bWJzO1xuICAgICAgICBpZiAoIXRodW1icyB8fCAhdGh1bWJzLnN3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnRodW1icy5pbml0KCk7XG4gICAgICAgIHN3aXBlci50aHVtYnMudXBkYXRlKHRydWUpO1xuICAgICAgfSxcbiAgICAgIHNsaWRlQ2hhbmdlOiBmdW5jdGlvbiBzbGlkZUNoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnRodW1icy5zd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci50aHVtYnMudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci50aHVtYnMuc3dpcGVyKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIudGh1bWJzLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIudGh1bWJzLnN3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnRodW1icy51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBvYnNlcnZlclVwZGF0ZTogZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci50aHVtYnMuc3dpcGVyKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIudGh1bWJzLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHZhciB0aHVtYnNTd2lwZXIgPSBzd2lwZXIudGh1bWJzLnN3aXBlcjtcbiAgICAgICAgaWYgKCF0aHVtYnNTd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRodW1ic1N3aXBlci5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uKTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgdmFyIHRodW1ic1N3aXBlciA9IHN3aXBlci50aHVtYnMuc3dpcGVyO1xuICAgICAgICBpZiAoIXRodW1ic1N3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgaWYgKHN3aXBlci50aHVtYnMuc3dpcGVyQ3JlYXRlZCAmJiB0aHVtYnNTd2lwZXIpIHtcbiAgICAgICAgICB0aHVtYnNTd2lwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gU3dpcGVyIENsYXNzXG5cbiAgdmFyIGNvbXBvbmVudHMgPSBbXG4gICAgRGV2aWNlJDEsXG4gICAgU3VwcG9ydCQxLFxuICAgIEJyb3dzZXIkMSxcbiAgICBSZXNpemUsXG4gICAgT2JzZXJ2ZXIkMSxcbiAgICBWaXJ0dWFsJDEsXG4gICAgS2V5Ym9hcmQkMSxcbiAgICBNb3VzZXdoZWVsJDEsXG4gICAgTmF2aWdhdGlvbiQxLFxuICAgIFBhZ2luYXRpb24kMSxcbiAgICBTY3JvbGxiYXIkMSxcbiAgICBQYXJhbGxheCQxLFxuICAgIFpvb20kMSxcbiAgICBMYXp5JDEsXG4gICAgQ29udHJvbGxlciQxLFxuICAgIEExMXksXG4gICAgSGlzdG9yeSQxLFxuICAgIEhhc2hOYXZpZ2F0aW9uJDEsXG4gICAgQXV0b3BsYXkkMSxcbiAgICBFZmZlY3RGYWRlLFxuICAgIEVmZmVjdEN1YmUsXG4gICAgRWZmZWN0RmxpcCxcbiAgICBFZmZlY3RDb3ZlcmZsb3csXG4gICAgVGh1bWJzJDFcbiAgXTtcblxuICBpZiAodHlwZW9mIFN3aXBlci51c2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgU3dpcGVyLnVzZSA9IFN3aXBlci5DbGFzcy51c2U7XG4gICAgU3dpcGVyLmluc3RhbGxNb2R1bGUgPSBTd2lwZXIuQ2xhc3MuaW5zdGFsbE1vZHVsZTtcbiAgfVxuXG4gIFN3aXBlci51c2UoY29tcG9uZW50cyk7XG5cbiAgcmV0dXJuIFN3aXBlcjtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js\n");
/***/ }),
/***/ "./node_modules/_tsml@1.0.1@tsml/tsml.js":
/*!***********************************************!*\
!*** ./node_modules/_tsml@1.0.1@tsml/tsml.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("function clean (s) {\n return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nmodule.exports = function tsml (sa) {\n var s = ''\n , i = 0\n\n for (; i < arguments.length; i++)\n s += clean(sa[i]) + (arguments[i + 1] || '')\n\n return s\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3RzbWxAMS4wLjFAdHNtbC90c21sLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL190c21sQDEuMC4xQHRzbWwvdHNtbC5qcz8xZjkwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNsZWFuIChzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcblxccj9cXHMqL2csICcnKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHNtbCAoc2EpIHtcbiAgdmFyIHMgPSAnJ1xuICAgICwgaSA9IDBcblxuICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBzICs9IGNsZWFuKHNhW2ldKSArIChhcmd1bWVudHNbaSArIDFdIHx8ICcnKVxuXG4gIHJldHVybiBzXG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_tsml@1.0.1@tsml/tsml.js\n");
/***/ }),
/***/ "./node_modules/_ua-device@0.1.10@ua-device/index.js":
/*!***********************************************************!*\
!*** ./node_modules/_ua-device@0.1.10@ua-device/index.js ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__(/*! ./lib/ua-device.js */ \"./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL191YS1kZXZpY2VAMC4xLjEwQHVhLWRldmljZS9pbmRleC5qcz83MDkwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvdWEtZGV2aWNlLmpzJyk7Il0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/index.js\n");
/***/ }),
/***/ "./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js":
/*!*******************************************************************!*\
!*** ./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("var UA = __webpack_require__(/*! ./useragent-base */ \"./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js\");\nmodule.exports = function (ua) {\n var uaData = new UA(ua);\n var match;\n var tmpMatch;\n // handle mobile device\n if (uaData.device.type === 'mobile' || uaData.device.type === 'tablet') {\n\n // get manufacturer through the key words\n if (match = ua.match(/(ZTE|Samsung|Motorola|HTC|Coolpad|Huawei|Lenovo|LG|Sony Ericsson|Oppo|TCL|Vivo|Sony|Meizu|Nokia)/i)) {\n uaData.device.manufacturer = match[1];\n if (uaData.device.model && uaData.device.model.indexOf(match[1]) >= 0) {\n uaData.device.model = uaData.device.model.replace(match[1], '');\n }\n }\n // handle Apple\n // 苹果就这3种iPod iPad iPhone\n if (match = ua.match(/(iPod|iPad|iPhone)/i)) {\n uaData.device.manufacturer = 'Apple';\n uaData.device.model = match[1];\n }\n // handle Samsung\n // 特殊型号可能以xxx-开头 或者直接空格接型号 兼容build结尾或直接)结尾\n // Galaxy nexus才是三星 nexus是google手机\n // 三星手机类型:galaxy xxx|SM-xxx|GT-xxx|SCH-xxx|SGH-xxx|SPH-xxx|SHW-xxx 若这些均未匹配到,则启用在中关村在线爬取到的机型白名单进行判断\n else if (match = ua.match(/[-\\s](Galaxy[\\s-_]nexus|Galaxy[\\s-_]\\w*[\\s-_]\\w*|Galaxy[\\s-_]\\w*|SM-\\w*|GT-\\w*|s[cgp]h-\\w*|shw-\\w*|ATIV|i9070|omnia|s7568|A3000|A3009|A5000|A5009|A7000|A7009|A8000|C101|C1116|C1158|E400|E500F|E7000|E7009|G3139D|G3502|G3502i|G3508|G3508J|G3508i|G3509|G3509i|G3558|G3559|G3568V|G3586V|G3589W|G3606|G3608|G3609|G3812|G388F|G5108|G5108Q|G5109|G5306W|G5308W|G5309W|G550|G600|G7106|G7108|G7108V|G7109|G7200|G720NO|G7508Q|G7509|G8508S|G8509V|G9006V|G9006W|G9008V|G9008W|G9009D|G9009W|G9198|G9200|G9208|G9209|G9250|G9280|I535|I679|I739|I8190N|I8262|I879|I879E|I889|I9000|I9060|I9082|I9082C|I9082i|I9100|I9100G|I9108|I9128|I9128E|I9128i|I9152|I9152P|I9158|I9158P|I9158V|I9168|I9168i|I9190|I9192|I9195|I9195I|I9200|I9208|I9220|I9228|I9260|I9268|I9300|I9300i|I9305|I9308|I9308i|I939|I939D|I939i|I9500|I9502|I9505|I9507V|I9508|I9508V|I959|J100|J110|J5008|J7008|N7100|N7102|N7105|N7108|N7108D|N719|N750|N7505|N7506V|N7508V|N7509V|N900|N9002|N9005|N9006|N9008|N9008S|N9008V|N9009|N9100|N9106W|N9108V|N9109W|N9150|N916|N9200|P709|P709E|P729|S6358|S7278|S7278U|S7562C|S7562i|S7898i|b9388)[\\s\\)]/i)) {\n uaData.device.manufacturer = 'Samsung';\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z]+[0-9]+[A-Z]*, 例如 G9006 G9006V 其实应该是G9006 另外三星只保留3位\n uaData.device.model = match[1].replace(/Galaxy S VI/i, 'Galaxy S6')\n .replace(/Galaxy S V/i, 'Galaxy S5')\n .replace(/Galaxy S IV/i, 'Galaxy S4')\n .replace(/Galaxy s III/i, 'Galaxy S3')\n .replace(/Galaxy S II/i, 'Galaxy S2')\n .replace(/Galaxy S I/i, 'Galaxy S1')\n .replace(/([a-z]+[0-9]{3})[0-9]?[a-z]*/i, '$1');\n }\n // 针对三星已经匹配出的数据做处理\n else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'samsung' && uaData.device.model) {\n uaData.device.model = uaData.device.model.replace(/Galaxy S VI/i, 'Galaxy S6')\n .replace(/Galaxy S V/i, 'Galaxy S5')\n .replace(/Galaxy S IV/i, 'Galaxy S4')\n .replace(/Galaxy s III/i, 'Galaxy S3')\n .replace(/Galaxy S II/i, 'Galaxy S2')\n .replace(/Galaxy S I/i, 'Galaxy S1')\n .replace(/([a-z]+[0-9]{3})[0-9]?[a-z]*/i, '$1');\n }\n // handle Huawei\n // 兼容build结尾或直接)结尾\n // 华为机型特征:Huawei[\\s-_](\\w*[-_]?\\w*) 或者以 7D- ALE- CHE-等开头\n else if (match = ua.match(/(Huawei[\\s-_](\\w*[-_]?\\w*)|\\s(7D-\\w*|ALE-\\w*|ATH-\\w*|CHE-\\w*|CHM-\\w*|Che1-\\w*|Che2-\\w*|D2-\\w*|G616-\\w*|G620S-\\w*|G621-\\w*|G660-\\w*|G750-\\w*|GRA-\\w*|Hol-\\w*|MT2-\\w*|MT7-\\w*|PE-\\w*|PLK-\\w*|SC-\\w*|SCL-\\w*|H60-\\w*|H30-\\w*)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Huawei';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:xxx-[A-Z][0-9]+ 例如 H30-L01 H30-L00 H30-L20 都应该是 H30-L\n // h30-l h30-h h30-t 都是H30\n if (match = uaData.device.model.match(/(\\w*)[\\s-_]+[a-z0-9]+/i)) {\n uaData.device.model = match[1];\n }\n }\n // handle Xiaomi\n // 兼容build结尾或直接)结尾 以及特殊的HM处理方案(build/hm2013011)\n // xiaomi手机类型: mi m1 m2 m3 hm 开头\n // hongmi有特殊判断build/hm2015011\n else if (match = ua.match(/;\\s(mi|m1|m2|m3|m4|hm)(\\s*\\w*)[\\s\\)]/i)) {\n if (tmpMatch = ua.match(/(meitu|MediaPad)/i)) {\n // 美图手机名字冒充小米 比如 meitu m4 mizhi\n uaData.device.manufacturer = tmpMatch[1];\n uaData.device.model = '';\n }\n // 若匹配出的 match[2]没空格 会出现很多例如 mizi mizhi miha 但也会出现mi3 minote之类 特殊处理下\n else if (match[2].length > 0 && !((/\\s/).test(match[2]))) {\n if (tmpMatch = match[2].match(/(\\d)/i)) {\n uaData.device.model = match[1] + '-' + tmpMatch[1];\n }\n }\n else {\n uaData.device.manufacturer = 'Xiaomi';\n if (match[2] && match[2].length > 0) {\n match[2] = match[2].replace(/\\s/, '');\n uaData.device.model = (match[1].substr(match[1].length - 2) + '-' + match[2]).replace(/m(\\d)-/i, 'MI-$1');\n }\n else {\n uaData.device.model = (match[1].substr(match[1].length - 2)).replace(/m(\\d)/i, 'MI-$1');\n }\n\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:mi-3c,例如mi-4LTE mi-4 其实应该是 mi-4\n if (/(mi|hm)(-\\d)/i.test(uaData.device.model)) {\n // 看看是不是 MI-3S MI-4S....\n if (match = uaData.device.model.match(/(mi|hm)(-\\ds)/i)) {\n uaData.device.model = match[1] + match[2];\n }\n // 防止 MI-20150XX等滥竽充数成为MI-2\n else if (match = uaData.device.model.match(/(mi|hm)(-\\d{2})/i)) {\n uaData.device.model = match[1];\n }\n // 将mi-3c mi-3a mi-3w等合为mi-3\n else if (match = uaData.device.model.match(/(mi|hm)(-\\d)[A-Z]/i)) {\n uaData.device.model = match[1] + match[2];\n }\n }\n // 去除 mi-4g这样的东西\n if (match = uaData.device.model.match(/(mi|hm)(-\\dg)/i)) {\n uaData.device.model = match[1];\n }\n }\n }\n else if (/build\\/HM\\d{0,7}\\)/i.test(ua)) {\n uaData.device.manufacturer = 'Xiaomi';\n uaData.device.model = 'HM';\n }\n else if (match = ua.match(/redmi\\s?(\\d+)?/i)) {\n uaData.device.manufacturer = 'Xiaomi';\n uaData.device.model = 'HM-' + match[1];\n }\n else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'xiaomi' && uaData.device.model) {\n // 针对通过base库判断出数据时命名风格不同。特殊处理适配如下\n if (match = uaData.device.model.match(/mi-one/i)) {\n uaData.device.model = 'MI-1';\n }\n // mi 2\n else if (match = uaData.device.model.match(/mi-two/i)) {\n uaData.device.model = 'MI-2';\n }\n // 20150xxx2014501\n else if (match = uaData.device.model.match(/\\d{6}/i)) {\n uaData.device.model = '';\n }\n else if (match = uaData.device.model.match(/redmi/i)) {\n uaData.device.model = uaData.device.model.toUpperCase().replace(/redmi/i, 'HM');\n }\n // m1 m2 m3 写法不标准 另外判断是否是 m1-s\n else if (match = uaData.device.model.match(/(m\\d)[\\s-_](s?)/i)) {\n uaData.device.model = match[1].replace(/m/, 'MI-') + match[2];\n }\n // mi-2w mi-3w 等格式化为mi-2 mi-3\n else if (match = uaData.device.model.match(/(hm|mi)[\\s-_](\\d?)[a-rt-z]/i)) {\n if (tmpMatch = uaData.device.model.match(/(mi|hm)[\\s-_](note|pad)(\\d?s?)/i)) {\n uaData.device.model = tmpMatch[1] + '-' + tmpMatch[2] + tmpMatch[3];\n }\n else {\n uaData.device.model = match[2] ? match[1] + '-' + match[2] : match[1];\n }\n }\n // 处理hm\n else if (match = uaData.device.model.match(/hm/i)) {\n // 判断是不是 hm-201xxx充数\n if (match = uaData.device.model.match(/(hm)[\\s-_](\\d{2})/i)) {\n uaData.device.model = 'HM';\n }\n // 判断是不是 hm-2s hm-1s\n else if (match = uaData.device.model.match(/(hm)[\\s-_](\\ds)/i)) {\n uaData.device.model = 'HM-' + match[2];\n }\n else if (match = uaData.device.model.match(/(hm)[\\s-_](\\d)[a-z]/i)) {\n uaData.device.model = 'HM-' + match[2];\n }\n else {\n uaData.device.model = 'HM';\n }\n // 过滤类似 2g 3g等数据\n if (/hm-\\dg/.test(uaData.device.model)) {\n uaData.device.model = 'HM';\n }\n }\n }\n // handle Vivo\n // 兼容build结尾或直接)结尾\n // vivo机型特征: Vivo[\\s-_](\\w*) 或者以 E1 S11t S7t 等开头\n else if (match = ua.match(/(vivo[\\s-_](\\w*)|\\s(E1\\w?|E3\\w?|E5\\w?|V1\\w?|V2\\w?|S11\\w?|S12\\w?|S1\\w?|S3\\w?|S6\\w?|S7\\w?|S9\\w?|X1\\w?|X3\\w?|X520\\w?|X5\\w?|X5Max|X5Max+|X5Pro|X5SL|X710F|X710L|Xplay|Xshot|Xpaly3S|Y11\\w?|Y11i\\w?|Y11i\\w?|Y13\\w?|Y15\\w?|Y17\\w?|Y18\\w?|Y19\\w?|Y1\\w?|Y20\\w?|Y22\\w?|Y22i\\w?|Y23\\w?|Y27\\w?|Y28\\w?|Y29\\w?|Y33\\w?|Y37\\w?|Y3\\w?|Y613\\w?|Y622\\w?|Y627\\w?|Y913\\w?|Y923\\w?|Y927\\w?|Y928\\w?|Y929\\w?|Y937\\w?)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Vivo';\n uaData.device.model = match[1];\n // 首先剔除 viv- vivo- bbg- 等打头的内容\n uaData.device.model = uaData.device.model.replace(/(viv[\\s-_]|vivo[\\s-_]|bbg[\\s-_])/i, '');\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 X5F X5L X5M X5iL 都应该是 X5\n if (match = uaData.device.model.match(/([a-z]+[0-9]+)i?[a-z]?[\\s-_]?/i)) {\n uaData.device.model = match[1];\n }\n }\n // handle Oppo\n else if (match = ua.match(/(Oppo[\\s-_](\\w*)|\\s(1100|1105|1107|3000|3005|3007|6607|A100|A103|A105|A105K|A109|A109K|A11|A113|A115|A115K|A121|A125|A127|A129|A201|A203|A209|A31|A31c|A31t|A31u|A51kc|A520|A613|A615|A617|E21W|Find|Mirror|N5110|N5117|N5207|N5209|R2010|R2017|R6007|R7005|R7007|R7c|R7t|R8000|R8007|R801|R805|R807|R809T|R8107|R8109|R811|R811W|R813T|R815T|R815W|R817|R819T|R8200|R8205|R8207|R821T|R823T|R827T|R830|R830S|R831S|R831T|R833T|R850|Real|T703|U2S|U521|U525|U529|U539|U701|U701T|U705T|U705W|X9000|X9007|X903|X905|X9070|X9077|X909|Z101|R829T)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Oppo';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 A31c A31s 都应该是 A31\n // 对 Plus 做特殊处理\n if (match = uaData.device.model.match(/([a-z]+[0-9]+)-?(plus)/i)) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n else if (match = uaData.device.model.match(/(\\w*-?[a-z]+[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'oppo' && uaData.device.model) {\n // 针对base库的数据做数据格式化处理\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 A31c A31s 都应该是 A31\n // 对 Plus 做特殊处理\n if (match = uaData.device.model.match(/([a-z]+[0-9]+)-?(plus)/i)) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n else if (match = uaData.device.model.match(/(\\w*-?[a-z]+[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n // handle Lenovo\n // 兼容build结尾或直接)结尾 兼容Lenovo-xxx/xxx以及Leveno xxx build等\n else if (match = ua.match(/(Lenovo[\\s-_](\\w*[-_]?\\w*)|\\s(A3580|A3860|A5500|A5600|A5860|A7600|A806|A800|A808T|A808T-I|A936|A938t|A788t|K30-E|K30-T|K30-W|K50-T3s|K50-T5|K80M|K910|K910e|K920|S90-e|S90-t|S90-u|S968T|X2-CU|X2-TO|Z90-3|Z90-7)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Lenovo';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 A360t A360 都应该是 A360\n if (match = uaData.device.model.match(/([a-z]+[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n // handle coolpad\n else if (match = ua.match(/(Coolpad[\\s-_](\\w*)|\\s(7295C|7298A|7620L|8908|8085|8970L|9190L|Y80D)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Coolpad';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 8297-t01 8297-c01 8297w 都应该是 8297\n if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'coolpad' && uaData.device.model) {\n // base 库适配\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 8297-t01 8297-c01 8297w 都应该是 8297\n if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n // handle meizu\n else if (match = ua.match(/\\s(mx\\d*\\w*|mz-(\\w*))\\s(\\w*)\\s*\\w*\\s*build/i)) {\n uaData.device.manufacturer = 'Meizu';\n var tmpModel = match[2] ? match[2] : match[1];\n if (match[3]) {\n uaData.device.model = tmpModel + '-' + match[3];\n }\n else {\n uaData.device.model = tmpModel + '';\n }\n }\n else if (match = ua.match(/M463C|M35\\d/i)) {\n uaData.device.manufacturer = 'Meizu';\n uaData.device.model = match[1];\n }\n // handle htc\n else if (match = ua.match(/(Htc[-_\\s](\\w*)|\\s(601e|606w|608t|609d|610t|6160|619d|620G|626d|626s|626t|626w|709d|801e|802d|802t|802w|809D|816d|816e|816t|816v|816w|826d|826s|826t|826w|828w|901e|919d|A310e|A50AML|A510e|A620d|A620e|A620t|A810e|A9191|Aero|C620d|C620e|C620t|D316d|D516d|D516t|D516w|D820mt|D820mu|D820t|D820ts|D820u|D820us|E9pt|E9pw|E9sw|E9t|HD7S|M8Et|M8Sd|M8St|M8Sw|M8d|M8e|M8s|M8si|M8t|M8w|M9W|M9ew|Phablet|S510b|S510e|S610d|S710d|S710e|S720e|S720t|T327t|T328d|T328t|T328w|T329d|T329t|T329w|T528d|T528t|T528w|T8698|WF5w|X315e|X710e|X715e|X720d|X920e|Z560e|Z710e|Z710t|Z715e)[\\s\\)])/)) {\n uaData.device.manufacturer = 'Htc';\n uaData.device.model = match[1];\n }\n // handle Gionee\n else if (match = ua.match(/(Gionee[\\s-_](\\w*)|\\s(GN\\d+\\w*)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Gionee';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n }\n // handle LG\n else if (match = ua.match(/(LG[-_](\\w*)|\\s(D728|D729|D802|D855|D856|D857|D858|D859|E985T|F100L|F460|H778|H818|H819|P895|VW820)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Lg';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n }\n // handle tcl\n else if (match = ua.match(/(Tcl[\\s-_](\\w*)|\\s(H916T|P588L|P618L|P620M|P728M)[\\s\\)])/)) {\n uaData.device.manufacturer = 'Tcl';\n uaData.device.model = match[1];\n }\n // ZTE\n else if (match = ua.match(/(V9180|N918)/i)) {\n uaData.device.manufacturer = 'Zte';\n uaData.device.model = match[1];\n }\n else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'zte' && uaData.device.model) {\n // base 库适配\n // 解决移动联通等不同发行版导致的机型不同问题\n // 特征:[A-Z][0-9]+[A-Z] 例如 Q505T Q505u 都应该是 Q505\n if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n uaData.device.model = match[1];\n }\n }\n // UIMI\n else if (match = ua.match(/(UIMI\\w*|umi\\w*)[\\s-_](\\w*)\\s*\\w*\\s*build/i)) {\n uaData.device.manufacturer = 'Uimi';\n if (match[2]) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n else {\n uaData.device.model = match[1] + '';\n }\n }\n // eton\n else if (match = ua.match(/eton[\\s-_](\\w*)/i)) {\n uaData.device.manufacturer = 'Eton';\n uaData.device.model = match[1];\n }\n // Smartisan\n else if (match = ua.match(/(SM705|SM701|YQ601|YQ603)/i)) {\n uaData.device.manufacturer = 'Smartisan';\n uaData.device.model = ({\n SM705: 'T1',\n SM701: 'T1',\n YQ601: 'U1',\n YQ603: 'U1'\n })[match[1]] || match[1];\n }\n // handle Asus\n else if (match = ua.match(/(Asus[\\s-_](\\w*)|\\s(A500CG|A500KL|A501CG|A600CG|PF400CG|PF500KL|T001|X002|X003|ZC500TG|ZE550ML|ZE551ML)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Asus';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n }\n // handle nubia\n else if (match = ua.match(/(Nubia[-_\\s](\\w*)|(NX501|NX505J|NX506J|NX507J|NX503A|nx\\d+\\w*)[\\s\\)])/i)) {\n uaData.device.manufacturer = 'Nubia';\n if (match[2]) {\n uaData.device.model = match[2];\n }\n else if (match[3]) {\n uaData.device.model = match[3];\n }\n }\n // handle haier\n else if (match = ua.match(/(HT-\\w*)|Haier[\\s-_](\\w*-?\\w*)/i)) {\n uaData.device.manufacturer = 'Haier';\n if (match[1]) {\n uaData.device.model = match[1];\n }\n else if (match[2]) {\n uaData.device.model = match[2];\n }\n }\n // tianyu\n else if (match = ua.match(/K-Touch[\\s-_](tou\\s?ch\\s?(\\d)|\\w*)/i)) {\n uaData.device.manufacturer = 'K-Touch';\n if (match[2]) {\n uaData.device.model = 'Ktouch' + match[2];\n }\n else {\n uaData.device.model = match[1];\n }\n }\n\n // DOOV\n else if (match = ua.match(/Doov[\\s-_](\\w*)/i)) {\n uaData.device.manufacturer = 'Doov';\n uaData.device.model = match[1];\n }\n // coobee\n else if (/koobee/i.test(ua)) {\n uaData.device.manufacturer = 'koobee';\n }\n\n // sony\n else if (/C69/i.test(ua)) {\n uaData.device.manufacturer = 'Sony';\n }\n\n // haojixing\n else if (/N787|N818S/i.test(ua)) {\n uaData.device.manufacturer = 'Haojixing';\n }\n\n // haisense\n else if (match = ua.match(/(hs-|Hisense[\\s-_])(\\w*)/i)) {\n uaData.device.manufacturer = 'Hisense';\n uaData.device.model = match[2];\n }\n\n // format the style of manufacturer\n if (uaData.device.manufacturer) {\n uaData.device.manufacturer = uaData.device.manufacturer.substr(0, 1).toUpperCase() + uaData.device.manufacturer.substr(1).toLowerCase();\n }\n // format the style of model\n if (uaData.device.model) {\n uaData.device.model = uaData.device.model.toUpperCase().replace(/-+|_+|\\s+/g, ' ');\n uaData.device.model = uaData.device.model.match(/\\s*(\\w*\\s*\\w*)/)[1].replace(/\\s+/, '-');\n\n // 针对三星、华为做去重的特殊处理\n if (uaData.device.manufacturer === 'Samsung') {\n uaData.device.model = ({\n 'SCH-I95': 'GT-I950',\n 'SCH-I93': 'GT-I930',\n 'SCH-I86': 'GT-I855',\n 'SCH-N71': 'GT-N710',\n 'SCH-I73': 'GT-S789',\n 'SCH-P70': 'GT-I915'\n })[uaData.device.model] || uaData.device.model;\n }\n else if (uaData.device.manufacturer === 'Huawei') {\n uaData.device.model = ({\n CHE1: 'CHE',\n CHE2: 'CHE',\n G620S: 'G621',\n C8817D: 'G621'\n })[uaData.device.model] || uaData.device.model;\n }\n }\n\n // 针对xiaomi 的部分数据没有格式化成功,格式化1次\n if (uaData.device.manufacturer && uaData.device.manufacturer === 'Xiaomi') {\n if (match = uaData.device.model.match(/(hm|mi)-(note)/i)) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n else if (match = uaData.device.model.match(/(hm|mi)-(\\ds?)/i)) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n else if (match = uaData.device.model.match(/(hm|mi)-(\\d)[a-rt-z]/i)) {\n uaData.device.model = match[1] + '-' + match[2];\n }\n }\n }\n // handle browser\n // if (!uaData.browser.name) {\n // ua = ua.toLowerCase();\n if (uaData.device.type === 'desktop') {\n /*\n * 360 security Explorer\n */\n if (match = /360se(?:[ \\/]([\\w.]+))?/i.exec(ua)) {\n uaData.browser.name = '360 security Explorer';\n uaData.browser.version = {\n original: match[1]\n };\n }\n /**\n * the world\n */\n else if (match = /the world(?:[ \\/]([\\w.]+))?/i.exec(ua)) {\n uaData.browser.name = 'the world';\n uaData.browser.version = {\n original: match[1]\n };\n }\n /**\n * tencenttraveler\n */\n else if (match = /tencenttraveler ([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'tencenttraveler';\n uaData.browser.version = {\n original: match[1]\n };\n }\n /**\n * LBBROWSER\n */\n else if (match = /LBBROWSER/i.exec(ua)) {\n uaData.browser.name = 'LBBROWSER';\n }\n }\n else if (uaData.device.type === 'mobile' || uaData.device.type === 'tablet') {\n /**\n * BaiduHD\n */\n if (match = /BaiduHD\\s+([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'BaiduHD';\n uaData.browser.version = {\n original: match[1]\n };\n }\n /**\n * 360 Browser\n */\n else if (match = /360.s*aphone\\s*browser\\s*\\(version\\s*([\\w.]+)\\)/i.exec(ua)) {\n uaData.browser.name = '360 Browser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n /**\n * Baidu Browser\n */\n else if (match = /flyflow\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'Baidu Browser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * Baidu HD\n */\n else if (match = /baiduhd ([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'Baidu HD';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * baidubrowser\n */\n else if (match = /baidubrowser\\/([\\d\\.]+)\\s/i.exec(ua)) {\n uaData.browser.name = 'baidubrowser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * LieBaoFast\n */\n else if (match = /LieBaoFast\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'LieBao Fast';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * LieBao\n */\n else if (match = /LieBao\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'LieBao';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * SOUGOU\n */\n else if (match = /Sogou\\w+\\/([0-9\\.]+)/i.exec(ua)) {\n uaData.browser.name = 'SogouMobileBrowser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * 百度国际\n */\n else if (match = /bdbrowser\\w+\\/([0-9\\.]+)/i.exec(ua)) {\n uaData.browser.name = '百度国际';\n uaData.browser.version = {\n original: match[1]\n };\n }\n\n /**\n * Android Chrome Browser\n */\n else if (uaData.os.name === 'Android' && /safari/i.test(ua) && (match = /chrome\\/([0-9\\.]+)/i.exec(ua))) {\n if (tmpMatch = ua.match(/\\s+(\\w+Browser)\\/?([\\d\\.]*)/)) {\n uaData.browser.name = tmpMatch[1];\n if (tmpMatch[2]) {\n uaData.browser.version = {original: tmpMatch[2]};\n } else {\n uaData.browser.version = {original: match[1]};\n }\n } else {\n uaData.browser.name = 'Android Chrome';\n uaData.browser.version = {original: match[1]};\n }\n }\n\n /**\n * Android Google Browser\n */\n else if (uaData.os.name === 'Android' && /safari/i.test(ua) && (match = /version\\/([0-9\\.]+)/i.exec(ua))) {\n if (tmpMatch = ua.match(/\\s+(\\w+Browser)\\/?([\\d\\.]*)/)) {\n uaData.browser.name = tmpMatch[1];\n if (tmpMatch[2]) {\n uaData.browser.version = {original: tmpMatch[2]};\n } else {\n uaData.browser.version = {original: match[1]};\n }\n } else {\n uaData.browser.name = 'Android Browser';\n uaData.browser.version = {original: match[1]};\n }\n }\n\n /**\n * 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206' belongs to Safari\n */\n else if (/(ipad|iphone).* applewebkit\\/.* mobile/i.test(ua)) {\n uaData.browser.name = 'Safari';\n }\n }\n if (match = ua.match(/baiduboxapp\\/?([\\d\\.]*)/i)) {\n uaData.browser.name = '百度框';\n if (match[1]) {\n uaData.browser.version = {\n original: match[1]\n };\n }\n // uaData.browser.name = 'baidu box';\n }\n else if (/BaiduLightAppRuntime/i.test(ua)) {\n uaData.browser.name = '轻应用runtime';\n // uaData.browser.name = 'qing runtime';\n }\n else if (/Weibo/i.test(ua)) {\n uaData.browser.name = '微博';\n // uaData.browser.name = 'weibo';\n }\n else if (/MQQ/i.test(ua)) {\n uaData.browser.name = '手机QQ';\n // uaData.browser.name = 'mobile qq';\n }\n else if (/hao123/i.test(ua)) {\n uaData.browser.name = 'hao123';\n }\n // }\n if (match = /MicroMessenger\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = '微信';\n var tmpVersion = (match[1]).replace(/_/g, '.');\n tmpMatch = /(\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(tmpVersion);\n if(tmpMatch) {\n tmpVersion = tmpMatch[1];\n }\n uaData.browser.version = {\n original: tmpVersion\n };\n }\n if (match = /UCBrowser\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'UC Browser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n if (match = /OPR\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'Opera';\n uaData.browser.version = {\n original: match[1]\n };\n } else if (match = /OPiOS\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'Opera';\n uaData.browser.version = {\n original: match[1]\n };\n }\n // IE 11\n else if (/Trident\\/7/i.test(ua) && /rv:11/i.test(ua)) {\n uaData.browser.name = 'Internet Explorer';\n uaData.browser.version = {\n major: '11',\n original: '11'\n };\n }\n // Microsoft Edge\n else if (/Edge\\/12/i.test(ua) && /Windows Phone|Windows NT/i.test(ua)) {\n uaData.browser.name = 'Microsoft Edge';\n uaData.browser.version = {\n major: '12',\n original: '12'\n };\n }\n // miui browser\n else if (match = /miuibrowser\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.name = 'miui browser';\n uaData.browser.version = {\n original: match[1]\n };\n }\n // Safari\n if (!uaData.browser.name) {\n if (match = /Safari\\/([\\w.]+)/i.exec(ua) && /Version/i.test(ua)) {\n uaData.browser.name = 'Safari';\n }\n }\n if (uaData.browser.name && !uaData.browser.version) {\n if (match = /Version\\/([\\w.]+)/i.exec(ua)) {\n uaData.browser.version = {\n original: match[1]\n };\n }\n }\n\n // if (uaData.os.name === 'Windows' && uaData.os.version) {\n // // Windows 8.1\n // if (uaData.os.version.alias === 'NT 6.3') {\n // uaData.os.version.alias = '8.1';\n // }\n // }\n // handle os\n if (uaData.os.name === 'Windows' || /Windows/i.test(ua)) {\n uaData.os.name = 'Windows';\n if (/NT 6.3/i.test(ua)) {\n uaData.os.version = {\n alias: '8.1',\n original: '8.1'\n };\n }\n else if (/NT 6.4/i.test(ua) || /NT 10.0/i.test(ua)) {\n uaData.os.version = {\n alias: '10',\n original: '10'\n };\n }\n }\n else if (uaData.os.name === 'Mac OS X') {\n uaData.os.name = 'Mac OS X';\n if (match = /Mac OS X[\\s\\_\\-\\/](\\d+[\\.\\-\\_]\\d+[\\.\\-\\_]?\\d*)/i.exec(ua)) {\n uaData.os.version = {\n alias: match[1].replace(/_/g, '.'),\n original: match[1].replace(/_/g, '.')\n };\n }\n else {\n uaData.os.version = {\n alias: '',\n original: ''\n };\n }\n }\n else if (/Android/i.test(uaData.os.name)) {\n if (match = ua.match(/Android[\\s\\_\\-\\/i686]?[\\s\\_\\-\\/](\\d+[\\.\\-\\_]\\d+[\\.\\-\\_]?\\d*)/i)) {\n uaData.os.version = {\n alias: match[1],\n original: match[1]\n };\n }\n }\n return uaData;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91YS1kZXZpY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91YS1kZXZpY2UuanM/Zjk2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgVUEgPSByZXF1aXJlKCcuL3VzZXJhZ2VudC1iYXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1YSkge1xuICAgIHZhciB1YURhdGEgPSBuZXcgVUEodWEpO1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgdG1wTWF0Y2g7XG4gICAgLy8gaGFuZGxlIG1vYmlsZSBkZXZpY2VcbiAgICBpZiAodWFEYXRhLmRldmljZS50eXBlID09PSAnbW9iaWxlJyB8fCB1YURhdGEuZGV2aWNlLnR5cGUgPT09ICd0YWJsZXQnKSB7XG5cbiAgICAgICAgLy8gZ2V0IG1hbnVmYWN0dXJlciB0aHJvdWdoIHRoZSBrZXkgd29yZHNcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhaVEV8U2Ftc3VuZ3xNb3Rvcm9sYXxIVEN8Q29vbHBhZHxIdWF3ZWl8TGVub3ZvfExHfFNvbnkgRXJpY3Nzb258T3Bwb3xUQ0x8Vml2b3xTb255fE1laXp1fE5va2lhKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGlmICh1YURhdGEuZGV2aWNlLm1vZGVsICYmIHVhRGF0YS5kZXZpY2UubW9kZWwuaW5kZXhPZihtYXRjaFsxXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB1YURhdGEuZGV2aWNlLm1vZGVsLnJlcGxhY2UobWF0Y2hbMV0sICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgQXBwbGVcbiAgICAgICAgLy8g6Iu55p6c5bCx6L+ZM+enjWlQb2QgaVBhZCBpUGhvbmVcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhpUG9kfGlQYWR8aVBob25lKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQXBwbGUnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBTYW1zdW5nXG4gICAgICAgIC8vIOeJueauiuWei+WPt+WPr+iDveS7pXh4eC3lvIDlpLQg5oiW6ICF55u05o6l56m65qC85o6l5Z6L5Y+3IOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyBHYWxheHkgbmV4dXPmiY3mmK/kuInmmJ8gbmV4dXPmmK9nb29nbGXmiYvmnLpcbiAgICAgICAgLy8g5LiJ5pif5omL5py657G75Z6L77yaZ2FsYXh5IHh4eHxTTS14eHh8R1QteHh4fFNDSC14eHh8U0dILXh4eHxTUEgteHh4fFNIVy14eHggIOiLpei/meS6m+Wdh+acquWMuemFjeWIsO+8jOWImeWQr+eUqOWcqOS4reWFs+adkeWcqOe6v+eIrOWPluWIsOeahOacuuWei+eZveWQjeWNlei/m+ihjOWIpOaWrVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9bLVxcc10oR2FsYXh5W1xccy1fXW5leHVzfEdhbGF4eVtcXHMtX11cXHcqW1xccy1fXVxcdyp8R2FsYXh5W1xccy1fXVxcdyp8U00tXFx3KnxHVC1cXHcqfHNbY2dwXWgtXFx3KnxzaHctXFx3KnxBVElWfGk5MDcwfG9tbmlhfHM3NTY4fEEzMDAwfEEzMDA5fEE1MDAwfEE1MDA5fEE3MDAwfEE3MDA5fEE4MDAwfEMxMDF8QzExMTZ8QzExNTh8RTQwMHxFNTAwRnxFNzAwMHxFNzAwOXxHMzEzOUR8RzM1MDJ8RzM1MDJpfEczNTA4fEczNTA4SnxHMzUwOGl8RzM1MDl8RzM1MDlpfEczNTU4fEczNTU5fEczNTY4VnxHMzU4NlZ8RzM1ODlXfEczNjA2fEczNjA4fEczNjA5fEczODEyfEczODhGfEc1MTA4fEc1MTA4UXxHNTEwOXxHNTMwNld8RzUzMDhXfEc1MzA5V3xHNTUwfEc2MDB8RzcxMDZ8RzcxMDh8RzcxMDhWfEc3MTA5fEc3MjAwfEc3MjBOT3xHNzUwOFF8Rzc1MDl8Rzg1MDhTfEc4NTA5VnxHOTAwNlZ8RzkwMDZXfEc5MDA4VnxHOTAwOFd8RzkwMDlEfEc5MDA5V3xHOTE5OHxHOTIwMHxHOTIwOHxHOTIwOXxHOTI1MHxHOTI4MHxJNTM1fEk2Nzl8STczOXxJODE5ME58STgyNjJ8STg3OXxJODc5RXxJODg5fEk5MDAwfEk5MDYwfEk5MDgyfEk5MDgyQ3xJOTA4Mml8STkxMDB8STkxMDBHfEk5MTA4fEk5MTI4fEk5MTI4RXxJOTEyOGl8STkxNTJ8STkxNTJQfEk5MTU4fEk5MTU4UHxJOTE1OFZ8STkxNjh8STkxNjhpfEk5MTkwfEk5MTkyfEk5MTk1fEk5MTk1SXxJOTIwMHxJOTIwOHxJOTIyMHxJOTIyOHxJOTI2MHxJOTI2OHxJOTMwMHxJOTMwMGl8STkzMDV8STkzMDh8STkzMDhpfEk5Mzl8STkzOUR8STkzOWl8STk1MDB8STk1MDJ8STk1MDV8STk1MDdWfEk5NTA4fEk5NTA4VnxJOTU5fEoxMDB8SjExMHxKNTAwOHxKNzAwOHxONzEwMHxONzEwMnxONzEwNXxONzEwOHxONzEwOER8TjcxOXxONzUwfE43NTA1fE43NTA2VnxONzUwOFZ8Tjc1MDlWfE45MDB8TjkwMDJ8TjkwMDV8TjkwMDZ8TjkwMDh8TjkwMDhTfE45MDA4VnxOOTAwOXxOOTEwMHxOOTEwNld8TjkxMDhWfE45MTA5V3xOOTE1MHxOOTE2fE45MjAwfFA3MDl8UDcwOUV8UDcyOXxTNjM1OHxTNzI3OHxTNzI3OFV8Uzc1NjJDfFM3NTYyaXxTNzg5OGl8YjkzODgpW1xcc1xcKV0vaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1NhbXN1bmcnO1xuICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAvLyDnibnlvoHvvJpbQS1aXStbMC05XStbQS1aXSosIOS+i+WmgiBHOTAwNiBHOTAwNlYg5YW25a6e5bqU6K+l5pivRzkwMDYg5Y+m5aSW5LiJ5pif5Y+q5L+d55WZM+S9jVxuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdLnJlcGxhY2UoL0dhbGF4eSBTIFZJL2ksICdHYWxheHkgUzYnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBWL2ksICdHYWxheHkgUzUnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJVi9pLCAnR2FsYXh5IFM0JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IHMgSUlJL2ksICdHYWxheHkgUzMnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJSS9pLCAnR2FsYXh5IFMyJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IFMgSS9pLCAnR2FsYXh5IFMxJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFthLXpdK1swLTldezN9KVswLTldP1thLXpdKi9pLCAnJDEnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDpkojlr7nkuInmmJ/lt7Lnu4/ljLnphY3lh7rnmoTmlbDmja7lgZrlpITnkIZcbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3NhbXN1bmcnICYmIHVhRGF0YS5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB1YURhdGEuZGV2aWNlLm1vZGVsLnJlcGxhY2UoL0dhbGF4eSBTIFZJL2ksICdHYWxheHkgUzYnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBWL2ksICdHYWxheHkgUzUnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJVi9pLCAnR2FsYXh5IFM0JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IHMgSUlJL2ksICdHYWxheHkgUzMnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJSS9pLCAnR2FsYXh5IFMyJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IFMgSS9pLCAnR2FsYXh5IFMxJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFthLXpdK1swLTldezN9KVswLTldP1thLXpdKi9pLCAnJDEnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgSHVhd2VpXG4gICAgICAgIC8vIOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyDljY7kuLrmnLrlnovnibnlvoHvvJpIdWF3ZWlbXFxzLV9dKFxcdypbLV9dP1xcdyopICDmiJbogIXku6UgN0QtICBBTEUtICBDSEUt562J5byA5aS0XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhIdWF3ZWlbXFxzLV9dKFxcdypbLV9dP1xcdyopfFxccyg3RC1cXHcqfEFMRS1cXHcqfEFUSC1cXHcqfENIRS1cXHcqfENITS1cXHcqfENoZTEtXFx3KnxDaGUyLVxcdyp8RDItXFx3KnxHNjE2LVxcdyp8RzYyMFMtXFx3KnxHNjIxLVxcdyp8RzY2MC1cXHcqfEc3NTAtXFx3KnxHUkEtXFx3KnxIb2wtXFx3KnxNVDItXFx3KnxNVDctXFx3KnxQRS1cXHcqfFBMSy1cXHcqfFNDLVxcdyp8U0NMLVxcdyp8SDYwLVxcdyp8SDMwLVxcdyopW1xcc1xcKV0pL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIdWF3ZWknO1xuICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDop6PlhrPnp7vliqjogZTpgJrnrYnkuI3lkIzlj5HooYzniYjlr7zoh7TnmoTmnLrlnovkuI3lkIzpl67pophcbiAgICAgICAgICAgIC8vIOeJueW+ge+8mnh4eC1bQS1aXVswLTldKyDkvovlpoIgIEgzMC1MMDEgIEgzMC1MMDAgIEgzMC1MMjAgIOmDveW6lOivpeaYryBIMzAtTFxuICAgICAgICAgICAgLy8gaDMwLWwgIGgzMC1oICBoMzAtdCDpg73mmK9IMzBcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhcXHcqKVtcXHMtX10rW2EtejAtOV0rL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBYaWFvbWlcbiAgICAgICAgLy8g5YW85a65YnVpbGTnu5PlsL7miJbnm7TmjqUp57uT5bC+IOS7peWPiueJueauiueahEhN5aSE55CG5pa55qGIKGJ1aWxkL2htMjAxMzAxMSlcbiAgICAgICAgLy8geGlhb21p5omL5py657G75Z6LOiBtaSBtMSBtMiBtMyBobSDlvIDlpLRcbiAgICAgICAgLy8gaG9uZ21p5pyJ54m55q6K5Yik5patYnVpbGQvaG0yMDE1MDExXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLztcXHMobWl8bTF8bTJ8bTN8bTR8aG0pKFxccypcXHcqKVtcXHNcXCldL2kpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvKG1laXR1fE1lZGlhUGFkKS9pKSkge1xuICAgICAgICAgICAgICAgIC8vIOe+juWbvuaJi+acuuWQjeWtl+WGkuWFheWwj+exsyDmr5TlpoIgbWVpdHUgbTQgbWl6aGlcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHRtcE1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOiLpeWMuemFjeWHuueahCBtYXRjaFsyXeayoeepuuagvCDkvJrlh7rnjrDlvojlpJrkvovlpoIgbWl6aSBtaXpoaSBtaWhhIOS9huS5n+S8muWHuueOsG1pMyBtaW5vdGXkuYvnsbsg54m55q6K5aSE55CG5LiLXG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFsyXS5sZW5ndGggPiAwICYmICEoKC9cXHMvKS50ZXN0KG1hdGNoWzJdKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSBtYXRjaFsyXS5tYXRjaCgvKFxcZCkvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgJy0nICsgdG1wTWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnWGlhb21pJztcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0gJiYgbWF0Y2hbMl0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSA9IG1hdGNoWzJdLnJlcGxhY2UoL1xccy8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IChtYXRjaFsxXS5zdWJzdHIobWF0Y2hbMV0ubGVuZ3RoIC0gMikgKyAnLScgKyBtYXRjaFsyXSkucmVwbGFjZSgvbShcXGQpLS9pLCAnTUktJDEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAobWF0Y2hbMV0uc3Vic3RyKG1hdGNoWzFdLmxlbmd0aCAtIDIpKS5yZXBsYWNlKC9tKFxcZCkvaSwgJ01JLSQxJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAgICAgLy8g54m55b6B77yabWktM2Ms5L6L5aaCbWktNExURSBtaS00IOWFtuWunuW6lOivpeaYryBtaS00XG4gICAgICAgICAgICAgICAgaWYgKC8obWl8aG0pKC1cXGQpL2kudGVzdCh1YURhdGEuZGV2aWNlLm1vZGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDnnIvnnIvmmK/kuI3mmK8gTUktM1MgIE1JLTRTLi4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8obWl8aG0pKC1cXGRzKS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8g6Ziy5q2iIE1JLTIwMTUwWFjnrYnmu6Xnq73lhYXmlbDmiJDkuLpNSS0yXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKSgtXFxkezJ9KS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIOWwhm1pLTNjIG1pLTNhIG1pLTN3562J5ZCI5Li6bWktM1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhtaXxobSkoLVxcZClbQS1aXS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5Y676ZmkIG1pLTRn6L+Z5qC355qE5Lic6KW/XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKSgtXFxkZykvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvYnVpbGRcXC9ITVxcZHswLDd9XFwpL2kudGVzdCh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1hpYW9taSc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJ0hNJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9yZWRtaVxccz8oXFxkKyk/L2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdYaWFvbWknO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdITS0nICsgbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3hpYW9taScgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8g6ZKI5a+56YCa6L+HYmFzZeW6k+WIpOaWreWHuuaVsOaNruaXtuWRveWQjemjjuagvOS4jeWQjOOAgueJueauiuWkhOeQhumAgumFjeWmguS4i1xuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvbWktb25lL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdNSS0xJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG1pIDJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvbWktdHdvL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdNSS0yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIwMTUweHh4MjAxNDUwMVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC9cXGR7Nn0vaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goL3JlZG1pL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHVhRGF0YS5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9yZWRtaS9pLCAnSE0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG0xIG0yIG0zIOWGmeazleS4jeagh+WHhiDlj6blpJbliKTmlq3mmK/lkKbmmK8gbTEtc1xuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8obVxcZClbXFxzLV9dKHM/KS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXS5yZXBsYWNlKC9tLywgJ01JLScpICsgbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtaS0ydyAgbWktM3cg562J5qC85byP5YyW5Li6bWktMiAgbWktM1xuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpW1xccy1fXShcXGQ/KVthLXJ0LXpdL2kpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcE1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKVtcXHMtX10obm90ZXxwYWQpKFxcZD9zPykvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHRtcE1hdGNoWzFdICsgJy0nICsgdG1wTWF0Y2hbMl0gKyB0bXBNYXRjaFszXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXSA/IG1hdGNoWzFdICsgJy0nICsgbWF0Y2hbMl0gOiBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpITnkIZobVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC9obS9pKSkge1xuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+S4jeaYryBobS0yMDF4eHjlhYXmlbBcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG0pW1xccy1fXShcXGR7Mn0pL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/kuI3mmK8gaG0tMnMgaG0tMXNcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhobSlbXFxzLV9dKFxcZHMpL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0tJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhobSlbXFxzLV9dKFxcZClbYS16XS9pKSkge1xuICAgICAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJ0hNLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDov4fmu6TnsbvkvLwgMmcgM2fnrYnmlbDmja5cbiAgICAgICAgICAgICAgICBpZiAoL2htLVxcZGcvLnRlc3QodWFEYXRhLmRldmljZS5tb2RlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdITSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBWaXZvXG4gICAgICAgIC8vIOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyB2aXZv5py65Z6L54m55b6BOiBWaXZvW1xccy1fXShcXHcqKSAg5oiW6ICF5LulIEUxICBTMTF0ICBTN3Qg562J5byA5aS0XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyh2aXZvW1xccy1fXShcXHcqKXxcXHMoRTFcXHc/fEUzXFx3P3xFNVxcdz98VjFcXHc/fFYyXFx3P3xTMTFcXHc/fFMxMlxcdz98UzFcXHc/fFMzXFx3P3xTNlxcdz98UzdcXHc/fFM5XFx3P3xYMVxcdz98WDNcXHc/fFg1MjBcXHc/fFg1XFx3P3xYNU1heHxYNU1heCt8WDVQcm98WDVTTHxYNzEwRnxYNzEwTHxYcGxheXxYc2hvdHxYcGFseTNTfFkxMVxcdz98WTExaVxcdz98WTExaVxcdz98WTEzXFx3P3xZMTVcXHc/fFkxN1xcdz98WTE4XFx3P3xZMTlcXHc/fFkxXFx3P3xZMjBcXHc/fFkyMlxcdz98WTIyaVxcdz98WTIzXFx3P3xZMjdcXHc/fFkyOFxcdz98WTI5XFx3P3xZMzNcXHc/fFkzN1xcdz98WTNcXHc/fFk2MTNcXHc/fFk2MjJcXHc/fFk2MjdcXHc/fFk5MTNcXHc/fFk5MjNcXHc/fFk5MjdcXHc/fFk5MjhcXHc/fFk5MjlcXHc/fFk5MzdcXHc/KVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVml2byc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAvLyDpppblhYjliZTpmaQgdml2LSAgdml2by0gIGJiZy0g562J5omT5aS055qE5YaF5a65XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdWFEYXRhLmRldmljZS5tb2RlbC5yZXBsYWNlKC8odml2W1xccy1fXXx2aXZvW1xccy1fXXxiYmdbXFxzLV9dKS9pLCAnJyk7XG4gICAgICAgICAgICAvLyDop6PlhrPnp7vliqjogZTpgJrnrYnkuI3lkIzlj5HooYzniYjlr7zoh7TnmoTmnLrlnovkuI3lkIzpl67pophcbiAgICAgICAgICAgIC8vIOeJueW+ge+8mltBLVpdWzAtOV0rW0EtWl0g5L6L5aaCICBYNUYgWDVMIFg1TSBYNWlMIOmDveW6lOivpeaYryBYNVxuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFthLXpdK1swLTldKylpP1thLXpdP1tcXHMtX10/L2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBPcHBvXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhPcHBvW1xccy1fXShcXHcqKXxcXHMoMTEwMHwxMTA1fDExMDd8MzAwMHwzMDA1fDMwMDd8NjYwN3xBMTAwfEExMDN8QTEwNXxBMTA1S3xBMTA5fEExMDlLfEExMXxBMTEzfEExMTV8QTExNUt8QTEyMXxBMTI1fEExMjd8QTEyOXxBMjAxfEEyMDN8QTIwOXxBMzF8QTMxY3xBMzF0fEEzMXV8QTUxa2N8QTUyMHxBNjEzfEE2MTV8QTYxN3xFMjFXfEZpbmR8TWlycm9yfE41MTEwfE41MTE3fE41MjA3fE41MjA5fFIyMDEwfFIyMDE3fFI2MDA3fFI3MDA1fFI3MDA3fFI3Y3xSN3R8UjgwMDB8UjgwMDd8UjgwMXxSODA1fFI4MDd8UjgwOVR8UjgxMDd8UjgxMDl8UjgxMXxSODExV3xSODEzVHxSODE1VHxSODE1V3xSODE3fFI4MTlUfFI4MjAwfFI4MjA1fFI4MjA3fFI4MjFUfFI4MjNUfFI4MjdUfFI4MzB8UjgzMFN8UjgzMVN8UjgzMVR8UjgzM1R8Ujg1MHxSZWFsfFQ3MDN8VTJTfFU1MjF8VTUyNXxVNTI5fFU1Mzl8VTcwMXxVNzAxVHxVNzA1VHxVNzA1V3xYOTAwMHxYOTAwN3xYOTAzfFg5MDV8WDkwNzB8WDkwNzd8WDkwOXxaMTAxfFI4MjlUKVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnT3Bwbyc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIEEzMWMgQTMxcyDpg73lupTor6XmmK8gQTMxXG4gICAgICAgICAgICAvLyDlr7kgUGx1cyDlgZrnibnmrorlpITnkIZcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhbYS16XStbMC05XSspLT8ocGx1cykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFxcdyotP1thLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ29wcG8nICYmIHVhRGF0YS5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgIC8vIOmSiOWvuWJhc2XlupPnmoTmlbDmja7lgZrmlbDmja7moLzlvI/ljJblpITnkIZcbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIEEzMWMgQTMxcyDpg73lupTor6XmmK8gQTMxXG4gICAgICAgICAgICAvLyDlr7kgUGx1cyDlgZrnibnmrorlpITnkIZcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhbYS16XStbMC05XSspLT8ocGx1cykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFxcdyotP1thLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIExlbm92b1xuICAgICAgICAvLyDlhbzlrrlidWlsZOe7k+WwvuaIluebtOaOpSnnu5PlsL4g5YW85a65TGVub3ZvLXh4eC94eHjku6Xlj4pMZXZlbm8geHh4IGJ1aWxk562JXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhMZW5vdm9bXFxzLV9dKFxcdypbLV9dP1xcdyopfFxccyhBMzU4MHxBMzg2MHxBNTUwMHxBNTYwMHxBNTg2MHxBNzYwMHxBODA2fEE4MDB8QTgwOFR8QTgwOFQtSXxBOTM2fEE5Mzh0fEE3ODh0fEszMC1FfEszMC1UfEszMC1XfEs1MC1UM3N8SzUwLVQ1fEs4ME18SzkxMHxLOTEwZXxLOTIwfFM5MC1lfFM5MC10fFM5MC11fFM5NjhUfFgyLUNVfFgyLVRPfFo5MC0zfFo5MC03KVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTGVub3ZvJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAvLyDnibnlvoHvvJpbQS1aXVswLTldK1tBLVpdIOS+i+WmgiAgQTM2MHQgQTM2MCDpg73lupTor6XmmK8gQTM2MFxuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFthLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIGNvb2xwYWRcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKENvb2xwYWRbXFxzLV9dKFxcdyopfFxccyg3Mjk1Q3w3Mjk4QXw3NjIwTHw4OTA4fDgwODV8ODk3MEx8OTE5MEx8WTgwRClbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0Nvb2xwYWQnO1xuICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbM107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIDgyOTctdDAxIDgyOTctYzAxIDgyOTd3IOmDveW6lOivpeaYryA4Mjk3XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciAmJiB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlci50b0xvd2VyQ2FzZSgpID09PSAnY29vbHBhZCcgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8gYmFzZSDlupPpgILphY1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIDgyOTctdDAxIDgyOTctYzAxIDgyOTd3IOmDveW6lOivpeaYryA4Mjk3XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgbWVpenVcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvXFxzKG14XFxkKlxcdyp8bXotKFxcdyopKVxccyhcXHcqKVxccypcXHcqXFxzKmJ1aWxkL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdNZWl6dSc7XG4gICAgICAgICAgICB2YXIgdG1wTW9kZWwgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbWF0Y2hbMV07XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdG1wTW9kZWwgKyAnLScgKyBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB0bXBNb2RlbCArICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goL000NjNDfE0zNVxcZC9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTWVpenUnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBodGNcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKEh0Y1stX1xcc10oXFx3Kil8XFxzKDYwMWV8NjA2d3w2MDh0fDYwOWR8NjEwdHw2MTYwfDYxOWR8NjIwR3w2MjZkfDYyNnN8NjI2dHw2MjZ3fDcwOWR8ODAxZXw4MDJkfDgwMnR8ODAyd3w4MDlEfDgxNmR8ODE2ZXw4MTZ0fDgxNnZ8ODE2d3w4MjZkfDgyNnN8ODI2dHw4MjZ3fDgyOHd8OTAxZXw5MTlkfEEzMTBlfEE1MEFNTHxBNTEwZXxBNjIwZHxBNjIwZXxBNjIwdHxBODEwZXxBOTE5MXxBZXJvfEM2MjBkfEM2MjBlfEM2MjB0fEQzMTZkfEQ1MTZkfEQ1MTZ0fEQ1MTZ3fEQ4MjBtdHxEODIwbXV8RDgyMHR8RDgyMHRzfEQ4MjB1fEQ4MjB1c3xFOXB0fEU5cHd8RTlzd3xFOXR8SEQ3U3xNOEV0fE04U2R8TThTdHxNOFN3fE04ZHxNOGV8TThzfE04c2l8TTh0fE04d3xNOVd8TTlld3xQaGFibGV0fFM1MTBifFM1MTBlfFM2MTBkfFM3MTBkfFM3MTBlfFM3MjBlfFM3MjB0fFQzMjd0fFQzMjhkfFQzMjh0fFQzMjh3fFQzMjlkfFQzMjl0fFQzMjl3fFQ1MjhkfFQ1Mjh0fFQ1Mjh3fFQ4Njk4fFdGNXd8WDMxNWV8WDcxMGV8WDcxNWV8WDcyMGR8WDkyMGV8WjU2MGV8WjcxMGV8WjcxMHR8WjcxNWUpW1xcc1xcKV0pLykpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0h0Yyc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIEdpb25lZVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oR2lvbmVlW1xccy1fXShcXHcqKXxcXHMoR05cXGQrXFx3KilbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0dpb25lZSc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgTEdcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKExHWy1fXShcXHcqKXxcXHMoRDcyOHxENzI5fEQ4MDJ8RDg1NXxEODU2fEQ4NTd8RDg1OHxEODU5fEU5ODVUfEYxMDBMfEY0NjB8SDc3OHxIODE4fEg4MTl8UDg5NXxWVzgyMClbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0xnJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSB0Y2xcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKFRjbFtcXHMtX10oXFx3Kil8XFxzKEg5MTZUfFA1ODhMfFA2MThMfFA2MjBNfFA3MjhNKVtcXHNcXCldKS8pKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdUY2wnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpURVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oVjkxODB8TjkxOCkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1p0ZSc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3p0ZScgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8gYmFzZSDlupPpgILphY1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIFE1MDVUIFE1MDV1IOmDveW6lOivpeaYryBRNTA1XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVSU1JXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhVSU1JXFx3Knx1bWlcXHcqKVtcXHMtX10oXFx3KilcXHMqXFx3KlxccypidWlsZC9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVWltaSc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXSArICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV0b25cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvZXRvbltcXHMtX10oXFx3KikvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0V0b24nO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNtYXJ0aXNhblxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oU003MDV8U003MDF8WVE2MDF8WVE2MDMpL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTbWFydGlzYW4nO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICh7XG4gICAgICAgICAgICAgICAgU003MDU6ICdUMScsXG4gICAgICAgICAgICAgICAgU003MDE6ICdUMScsXG4gICAgICAgICAgICAgICAgWVE2MDE6ICdVMScsXG4gICAgICAgICAgICAgICAgWVE2MDM6ICdVMSdcbiAgICAgICAgICAgIH0pW21hdGNoWzFdXSB8fCBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgQXN1c1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oQXN1c1tcXHMtX10oXFx3Kil8XFxzKEE1MDBDR3xBNTAwS0x8QTUwMUNHfEE2MDBDR3xQRjQwMENHfFBGNTAwS0x8VDAwMXxYMDAyfFgwMDN8WkM1MDBUR3xaRTU1ME1MfFpFNTUxTUwpW1xcc1xcKV0pL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBc3VzJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBudWJpYVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oTnViaWFbLV9cXHNdKFxcdyopfChOWDUwMXxOWDUwNUp8Tlg1MDZKfE5YNTA3SnxOWDUwM0F8bnhcXGQrXFx3KilbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ051YmlhJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBoYWllclxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oSFQtXFx3Kil8SGFpZXJbXFxzLV9dKFxcdyotP1xcdyopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIYWllcic7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aWFueXVcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvSy1Ub3VjaFtcXHMtX10odG91XFxzP2NoXFxzPyhcXGQpfFxcdyopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdLLVRvdWNoJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnS3RvdWNoJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRE9PVlxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9Eb292W1xccy1fXShcXHcqKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnRG9vdic7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29vYmVlXG4gICAgICAgIGVsc2UgaWYgKC9rb29iZWUvaS50ZXN0KHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAna29vYmVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvbnlcbiAgICAgICAgZWxzZSBpZiAoL0M2OS9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhb2ppeGluZ1xuICAgICAgICBlbHNlIGlmICgvTjc4N3xOODE4Uy9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIYW9qaXhpbmcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFpc2Vuc2VcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKGhzLXxIaXNlbnNlW1xccy1fXSkoXFx3KikvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0hpc2Vuc2UnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9ybWF0IHRoZSBzdHlsZSBvZiBtYW51ZmFjdHVyZXJcbiAgICAgICAgaWYgKHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9ybWF0IHRoZSBzdHlsZSBvZiBtb2RlbFxuICAgICAgICBpZiAodWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHVhRGF0YS5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tK3xfK3xcXHMrL2csICcgJyk7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvXFxzKihcXHcqXFxzKlxcdyopLylbMV0ucmVwbGFjZSgvXFxzKy8sICctJyk7XG5cbiAgICAgICAgICAgIC8vIOmSiOWvueS4ieaYn+OAgeWNjuS4uuWBmuWOu+mHjeeahOeJueauiuWkhOeQhlxuICAgICAgICAgICAgaWYgKHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID09PSAnU2Ftc3VuZycpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gKHtcbiAgICAgICAgICAgICAgICAgICAgJ1NDSC1JOTUnOiAnR1QtSTk1MCcsXG4gICAgICAgICAgICAgICAgICAgICdTQ0gtSTkzJzogJ0dULUk5MzAnLFxuICAgICAgICAgICAgICAgICAgICAnU0NILUk4Nic6ICdHVC1JODU1JyxcbiAgICAgICAgICAgICAgICAgICAgJ1NDSC1ONzEnOiAnR1QtTjcxMCcsXG4gICAgICAgICAgICAgICAgICAgICdTQ0gtSTczJzogJ0dULVM3ODknLFxuICAgICAgICAgICAgICAgICAgICAnU0NILVA3MCc6ICdHVC1JOTE1J1xuICAgICAgICAgICAgICAgIH0pW3VhRGF0YS5kZXZpY2UubW9kZWxdIHx8IHVhRGF0YS5kZXZpY2UubW9kZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9PT0gJ0h1YXdlaScpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gKHtcbiAgICAgICAgICAgICAgICAgICAgQ0hFMTogJ0NIRScsXG4gICAgICAgICAgICAgICAgICAgIENIRTI6ICdDSEUnLFxuICAgICAgICAgICAgICAgICAgICBHNjIwUzogJ0c2MjEnLFxuICAgICAgICAgICAgICAgICAgICBDODgxN0Q6ICdHNjIxJ1xuICAgICAgICAgICAgICAgIH0pW3VhRGF0YS5kZXZpY2UubW9kZWxdIHx8IHVhRGF0YS5kZXZpY2UubW9kZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDpkojlr7l4aWFvbWkg55qE6YOo5YiG5pWw5o2u5rKh5pyJ5qC85byP5YyW5oiQ5Yqf77yM5qC85byP5YyWMeasoVxuICAgICAgICBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPT09ICdYaWFvbWknKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpLShub3RlKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXSArICctJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpLShcXGRzPykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKGhtfG1pKS0oXFxkKVthLXJ0LXpdL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgJy0nICsgbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaGFuZGxlIGJyb3dzZXJcbiAgICAvLyBpZiAoIXVhRGF0YS5icm93c2VyLm5hbWUpIHtcbiAgICAvLyB1YSA9IHVhLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHVhRGF0YS5kZXZpY2UudHlwZSA9PT0gJ2Rlc2t0b3AnKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIDM2MCBzZWN1cml0eSBFeHBsb3JlclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG1hdGNoID0gLzM2MHNlKD86WyBcXC9dKFtcXHcuXSspKT8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICczNjAgc2VjdXJpdHkgRXhwbG9yZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSB3b3JsZFxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvdGhlIHdvcmxkKD86WyBcXC9dKFtcXHcuXSspKT8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICd0aGUgd29ybGQnO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRlbmNlbnR0cmF2ZWxlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvdGVuY2VudHRyYXZlbGVyIChbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ3RlbmNlbnR0cmF2ZWxlcic7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTEJCUk9XU0VSXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9MQkJST1dTRVIvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdMQkJST1dTRVInO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHVhRGF0YS5kZXZpY2UudHlwZSA9PT0gJ21vYmlsZScgfHwgdWFEYXRhLmRldmljZS50eXBlID09PSAndGFibGV0Jykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQmFpZHVIRFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG1hdGNoID0gL0JhaWR1SERcXHMrKFtcXHcuXSspL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQmFpZHVIRCc7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogMzYwIEJyb3dzZXJcbiAgICAgICAgICovXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gLzM2MC5zKmFwaG9uZVxccypicm93c2VyXFxzKlxcKHZlcnNpb25cXHMqKFtcXHcuXSspXFwpL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnMzYwIEJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhaWR1IEJyb3dzZXJcbiAgICAgICAgICovXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gL2ZseWZsb3dcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdCYWlkdSBCcm93c2VyJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhaWR1IEhEXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9iYWlkdWhkIChbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ0JhaWR1IEhEJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGJhaWR1YnJvd3NlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvYmFpZHVicm93c2VyXFwvKFtcXGRcXC5dKylcXHMvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdiYWlkdWJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTGllQmFvRmFzdFxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvTGllQmFvRmFzdFxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ0xpZUJhbyBGYXN0JztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpZUJhb1xuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvTGllQmFvXFwvKFtcXHcuXSspL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnTGllQmFvJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNPVUdPVVxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvU29nb3VcXHcrXFwvKFswLTlcXC5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdTb2dvdU1vYmlsZUJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICog55m+5bqm5Zu96ZmFXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9iZGJyb3dzZXJcXHcrXFwvKFswLTlcXC5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICfnmb7luqblm73pmYUnO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5kcm9pZCBDaHJvbWUgQnJvd3NlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLm9zLm5hbWUgPT09ICdBbmRyb2lkJyAmJiAvc2FmYXJpL2kudGVzdCh1YSkgJiYgKG1hdGNoID0gL2Nocm9tZVxcLyhbMC05XFwuXSspL2kuZXhlYyh1YSkpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvXFxzKyhcXHcrQnJvd3NlcilcXC8/KFtcXGRcXC5dKikvKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtvcmlnaW5hbDogdG1wTWF0Y2hbMl19O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQW5kcm9pZCBDaHJvbWUnO1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmRyb2lkIEdvb2dsZSBCcm93c2VyXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmICh1YURhdGEub3MubmFtZSA9PT0gJ0FuZHJvaWQnICYmIC9zYWZhcmkvaS50ZXN0KHVhKSAmJiAobWF0Y2ggPSAvdmVyc2lvblxcLyhbMC05XFwuXSspL2kuZXhlYyh1YSkpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvXFxzKyhcXHcrQnJvd3NlcilcXC8/KFtcXGRcXC5dKikvKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtvcmlnaW5hbDogdG1wTWF0Y2hbMl19O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQW5kcm9pZCBCcm93c2VyJztcbiAgICAgICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge29yaWdpbmFsOiBtYXRjaFsxXX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgNV8xXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNTM0LjQ2IChLSFRNTCwgbGlrZSBHZWNrbykgTW9iaWxlLzlCMjA2JyBiZWxvbmdzIHRvIFNhZmFyaVxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAoLyhpcGFkfGlwaG9uZSkuKiBhcHBsZXdlYmtpdFxcLy4qIG1vYmlsZS9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoID0gdWEubWF0Y2goL2JhaWR1Ym94YXBwXFwvPyhbXFxkXFwuXSopL2kpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn55m+5bqm5qGGJztcbiAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ2JhaWR1IGJveCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKC9CYWlkdUxpZ2h0QXBwUnVudGltZS9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn6L275bqU55SocnVudGltZSc7XG4gICAgICAgIC8vIHVhRGF0YS5icm93c2VyLm5hbWUgPSAncWluZyBydW50aW1lJztcbiAgICB9XG4gICAgZWxzZSBpZiAoL1dlaWJvL2kudGVzdCh1YSkpIHtcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICflvq7ljZonO1xuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ3dlaWJvJztcbiAgICB9XG4gICAgZWxzZSBpZiAoL01RUS9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn5omL5py6UVEnO1xuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ21vYmlsZSBxcSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKC9oYW8xMjMvaS50ZXN0KHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ2hhbzEyMyc7XG4gICAgfVxuICAgIC8vIH1cbiAgICBpZiAobWF0Y2ggPSAvTWljcm9NZXNzZW5nZXJcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ+W+ruS/oSc7XG4gICAgICAgIHZhciB0bXBWZXJzaW9uID0gKG1hdGNoWzFdKS5yZXBsYWNlKC9fL2csICcuJyk7XG4gICAgICAgIHRtcE1hdGNoID0gLyhcXGQrXFwuXFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh0bXBWZXJzaW9uKTtcbiAgICAgICAgaWYodG1wTWF0Y2gpIHtcbiAgICAgICAgICAgIHRtcFZlcnNpb24gPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IHRtcFZlcnNpb25cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gL1VDQnJvd3NlclxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnVUMgQnJvd3Nlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gL09QUlxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnT3BlcmEnO1xuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChtYXRjaCA9IC9PUGlPU1xcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnT3BlcmEnO1xuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIElFIDExXG4gICAgZWxzZSBpZiAoL1RyaWRlbnRcXC83L2kudGVzdCh1YSkgJiYgL3J2OjExL2kudGVzdCh1YSkpIHtcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdJbnRlcm5ldCBFeHBsb3Jlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBtYWpvcjogJzExJyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiAnMTEnXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIE1pY3Jvc29mdCBFZGdlXG4gICAgZWxzZSBpZiAoL0VkZ2VcXC8xMi9pLnRlc3QodWEpICYmIC9XaW5kb3dzIFBob25lfFdpbmRvd3MgTlQvaS50ZXN0KHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ01pY3Jvc29mdCBFZGdlJztcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgIG1ham9yOiAnMTInLFxuICAgICAgICAgICAgb3JpZ2luYWw6ICcxMidcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gbWl1aSBicm93c2VyXG4gICAgZWxzZSBpZiAobWF0Y2ggPSAvbWl1aWJyb3dzZXJcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ21pdWkgYnJvd3Nlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gU2FmYXJpXG4gICAgaWYgKCF1YURhdGEuYnJvd3Nlci5uYW1lKSB7XG4gICAgICAgIGlmIChtYXRjaCA9IC9TYWZhcmlcXC8oW1xcdy5dKykvaS5leGVjKHVhKSAmJiAvVmVyc2lvbi9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVhRGF0YS5icm93c2VyLm5hbWUgJiYgIXVhRGF0YS5icm93c2VyLnZlcnNpb24pIHtcbiAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9ICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgKHVhRGF0YS5vcy5uYW1lID09PSAnV2luZG93cycgJiYgdWFEYXRhLm9zLnZlcnNpb24pIHtcbiAgICAvLyAgLy8gV2luZG93cyA4LjFcbiAgICAvLyAgaWYgKHVhRGF0YS5vcy52ZXJzaW9uLmFsaWFzID09PSAnTlQgNi4zJykge1xuICAgIC8vICAgICAgdWFEYXRhLm9zLnZlcnNpb24uYWxpYXMgPSAnOC4xJztcbiAgICAvLyAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGUgb3NcbiAgICBpZiAodWFEYXRhLm9zLm5hbWUgPT09ICdXaW5kb3dzJyB8fCAvV2luZG93cy9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5vcy5uYW1lID0gJ1dpbmRvd3MnO1xuICAgICAgICBpZiAoL05UIDYuMy9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJzguMScsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6ICc4LjEnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9OVCA2LjQvaS50ZXN0KHVhKSB8fCAvTlQgMTAuMC9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJzEwJyxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogJzEwJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh1YURhdGEub3MubmFtZSA9PT0gJ01hYyBPUyBYJykge1xuICAgICAgICB1YURhdGEub3MubmFtZSA9ICdNYWMgT1MgWCc7XG4gICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWFtcXHNcXF9cXC1cXC9dKFxcZCtbXFwuXFwtXFxfXVxcZCtbXFwuXFwtXFxfXT9cXGQqKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogbWF0Y2hbMV0ucmVwbGFjZSgvXy9nLCAnLicpLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJycsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9BbmRyb2lkL2kudGVzdCh1YURhdGEub3MubmFtZSkpIHtcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goL0FuZHJvaWRbXFxzXFxfXFwtXFwvaTY4Nl0/W1xcc1xcX1xcLVxcL10oXFxkK1tcXC5cXC1cXF9dXFxkK1tcXC5cXC1cXF9dP1xcZCopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1YURhdGE7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js\n");
/***/ }),
/***/ "./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js":
/*!************************************************************************!*\
!*** ./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = (function () {\n var STRINGS_SAMSUNG = 'Samsung',\n STRINGS_SHARP = 'Sharp',\n STRINGS_SONY_ERICSSON = 'Sony Ericsson',\n STRINGS_MOTOROLA = 'Motorola',\n STRINGS_LG = 'LG',\n STRINGS_HUAWEI = 'Huawei',\n STRINGS_HTC = 'HTC',\n STRINGS_COOLPAD = 'Coolpad',\n STRINGS_ASUS = 'Asus',\n STRINGS_ACER = 'Acer';\n var STRINGS_BASED = ' based device';\n\n var TOUCHWIZ_MODELS = {\n 'SAMSUNG': {\n 'GT-S3370C': [STRINGS_SAMSUNG, 'Corby 3G'],\n 'GT-S3650': [STRINGS_SAMSUNG, 'Corby'],\n 'GT-S3653': [STRINGS_SAMSUNG, 'Corby'],\n 'GT-S3850': [STRINGS_SAMSUNG, 'Corby II'],\n 'GT-S5230': [STRINGS_SAMSUNG, 'Star'],\n 'GT-S5230W': [STRINGS_SAMSUNG, 'Star'],\n 'GT-S5233': [STRINGS_SAMSUNG, 'Star'],\n 'GT-S5260': [STRINGS_SAMSUNG, 'Star II'],\n 'GT-S5560': [STRINGS_SAMSUNG, 'Marvel'],\n 'GT-S5620': [STRINGS_SAMSUNG, 'Monte'],\n 'GT-S7550': [STRINGS_SAMSUNG, 'Blue Earth'],\n 'GT-S8000': [STRINGS_SAMSUNG, 'Jet'],\n 'GT-S8003': [STRINGS_SAMSUNG, 'Jet'],\n 'SGH-F480': [STRINGS_SAMSUNG, 'Tocco'],\n 'SGH-T528g': [STRINGS_SAMSUNG, 'Straight Talk'],\n 'GT-B3410': [STRINGS_SAMSUNG, 'Star Qwerty'],\n 'GT-B5310': [STRINGS_SAMSUNG, 'Corby Pro'],\n 'GT-B7722': [STRINGS_SAMSUNG, 'Star Duos'],\n 'GT-C6712': [STRINGS_SAMSUNG, 'Star II Duos']\n }\n }\n\n var BADA_MODELS = {\n 'SAMSUNG': {\n 'GT- S5250': [STRINGS_SAMSUNG, 'Wave 525'],\n 'GT-S5250': [STRINGS_SAMSUNG, 'Wave 525'],\n 'GT-S5253': [STRINGS_SAMSUNG, 'Wave 525'],\n 'GT-S5330': [STRINGS_SAMSUNG, 'Wave 533'],\n 'GT-S5380': [STRINGS_SAMSUNG, 'Wave Y'],\n 'GT-S5380D': [STRINGS_SAMSUNG, 'Wave Y'],\n 'GT-S5380K': [STRINGS_SAMSUNG, 'Wave Y'],\n 'GT-S5750E': [STRINGS_SAMSUNG, 'Wave 575'],\n 'GT-S5753E': [STRINGS_SAMSUNG, 'Wave 575'],\n 'GT-S7230B': [STRINGS_SAMSUNG, 'Wave 723'],\n 'GT-S7230E': [STRINGS_SAMSUNG, 'Wave 723'],\n 'GT-S7233E': [STRINGS_SAMSUNG, 'Wave 723'],\n 'GT-S7250': [STRINGS_SAMSUNG, 'Wave M'],\n 'GT-S7250D': [STRINGS_SAMSUNG, 'Wave M'],\n 'GT-S8500': [STRINGS_SAMSUNG, 'Wave'],\n 'GT-S8500C': [STRINGS_SAMSUNG, 'Wave'],\n 'GT-S8500R': [STRINGS_SAMSUNG, 'Wave'],\n 'GT-S8500T': [STRINGS_SAMSUNG, 'Wave'],\n 'GT-S8530': [STRINGS_SAMSUNG, 'Wave II'],\n 'GT-S8600': [STRINGS_SAMSUNG, 'Wave 3'],\n 'SHW-M410': [STRINGS_SAMSUNG, 'Wave 3']\n }\n }\n\n var TIZEN_MODELS = {\n 'SAMSUNG': {\n 'GT-I9500': [STRINGS_SAMSUNG, 'GT-I9500']\n }\n }\n\n var BREW_MODELS = {\n 'Coolpad D508': [STRINGS_COOLPAD, 'D508'],\n 'Coolpad E600': [STRINGS_COOLPAD, 'E600'],\n 'SCH-F839': [STRINGS_SAMSUNG, 'SCH-F839']\n }\n\n var WINDOWS_MOBILE_MODELS = {\n 'DX900': [STRINGS_ACER, 'Tempo DX900'],\n 'F900': [STRINGS_ACER, 'Tempo F900'],\n 'Coolpad F800': [STRINGS_COOLPAD, 'F800'],\n 'garmin-asus-Nuvifone-M10': ['Garmin-Asus', 'Nuvifone M10'],\n 'HP iPAQ 510': ['HP', 'iPAQ 510'],\n 'HD mini T5555': [STRINGS_HTC, 'HD mini'],\n 'HTC HD mini': [STRINGS_HTC, 'HD mini'],\n 'HTC HD mini T5555': [STRINGS_HTC, 'HD mini'],\n 'HTC HD2': [STRINGS_HTC, 'HD2'],\n 'HTC HD2 T8585': [STRINGS_HTC, 'HD2'],\n 'HD2 T8585': [STRINGS_HTC, 'HD2'],\n 'T-Mobile LEO': [STRINGS_HTC, 'HD2'],\n 'dopodT5588': [STRINGS_HTC, 'Hengshan'],\n 'HTC Mega-T3333': [STRINGS_HTC, 'Mega'],\n 'HTC Snap S521': [STRINGS_HTC, 'Snap'],\n 'HTC Touch2 T3320': [STRINGS_HTC, 'Touch 2'],\n 'HTC Touch2 T3333': [STRINGS_HTC, 'Touch 2'],\n 'HTC Touch2 T3335': [STRINGS_HTC, 'Touch 2'],\n 'HTC P3700': [STRINGS_HTC, 'Touch Diamond'],\n 'HTC Touch Diamond2 T5353': [STRINGS_HTC, 'Touch Diamond 2'],\n 'HTC Touch HD T8282': [STRINGS_HTC, 'Touch HD'],\n 'HTC Touch HD T8283': [STRINGS_HTC, 'Touch HD'],\n 'HTC Touch HD2 T8585': [STRINGS_HTC, 'Touch HD2'],\n 'HTC Touch Pro2 T7373': [STRINGS_HTC, 'Touch Pro 2'],\n 'T7380': [STRINGS_HTC, 'Touch Pro 2'],\n 'HTC TyTN II': [STRINGS_HTC, 'TyTN II'],\n 'GT-B7300': [STRINGS_SAMSUNG, 'Omnia Lite'],\n 'GT-B7610': [STRINGS_SAMSUNG, 'Omnia Pro'],\n 'GT-i8000': [STRINGS_SAMSUNG, 'Omnia 2'],\n 'GT-I8000': [STRINGS_SAMSUNG, 'Omnia 2'],\n 'GT-I8000U': [STRINGS_SAMSUNG, 'Omnia 2'],\n 'M1i': [STRINGS_SONY_ERICSSON, 'M1i Aspen']\n }\n\n var WINDOWS_PHONE_MODELS = {\n 'Acer': {\n 'Allegro': [STRINGS_ACER, 'Allegro'],\n 'M310': [STRINGS_ACER, 'Allegro']\n },\n\n 'Asus': {\n 'Galaxy6': [STRINGS_ASUS, 'Galaxy 6']\n },\n\n 'DELL': {\n 'Venue Pro': ['Dell', 'Venue Pro']\n },\n\n 'FujitsuToshibaMobileCommun': {\n 'IS12T': ['Fujitsu Toshiba', 'IS12T']\n },\n\n 'HTC': {\n '7 Mozart': [STRINGS_HTC, '7 Mozart'],\n '7 Mozart T8698': [STRINGS_HTC, '7 Mozart'],\n 'T8697': [STRINGS_HTC, '7 Mozart'],\n 'T8698': [STRINGS_HTC, '7 Mozart'],\n 'PD67100': [STRINGS_HTC, '7 Mozart'],\n 'Mozart T8698': [STRINGS_HTC, '7 Mozart'],\n 'Mozart': [STRINGS_HTC, '7 Mozart'],\n 'USCCHTC-PC93100': [STRINGS_HTC, 'Arrive'],\n 'Gold': [STRINGS_HTC, 'Gold '],\n 'HD2': [STRINGS_HTC, 'HD2'],\n 'HD7': [STRINGS_HTC, 'HD7'],\n 'HD7 T9292': [STRINGS_HTC, 'HD7'],\n 'T9295': [STRINGS_HTC, 'HD7'],\n 'T9296': [STRINGS_HTC, 'HD7'],\n 'HD7 Infinity': [STRINGS_HTC, 'HD7'],\n 'T7575': [STRINGS_HTC, '7 Pro'],\n '7 Pro T7576': [STRINGS_HTC, '7 Pro'],\n 'mwp6985': [STRINGS_HTC, 'Trophy'],\n '7 Trophy T8686': [STRINGS_HTC, 'Trophy'],\n '7 Trophy': [STRINGS_HTC, 'Trophy'],\n 'PC40100': [STRINGS_HTC, 'Trophy'],\n 'Touch-IT Trophy': [STRINGS_HTC, 'Trophy'],\n 'Radar': [STRINGS_HTC, 'Radar'],\n 'Radar 4G': [STRINGS_HTC, 'Radar'],\n 'Radar C110e': [STRINGS_HTC, 'Radar'],\n 'Mazaa': [STRINGS_HTC, 'Mazaa'],\n 'Mondrian': [STRINGS_HTC, 'Mondrian'],\n 'Schubert': [STRINGS_HTC, 'Schubert'],\n '7 Schubert T9292': [STRINGS_HTC, 'Schubert'],\n 'Spark': [STRINGS_HTC, 'Spark'],\n 'T8788': [STRINGS_HTC, 'Surround'],\n 'TITAN X310e': [STRINGS_HTC, 'Titan'],\n 'X310e': [STRINGS_HTC, 'Titan'],\n 'PI39100': [STRINGS_HTC, 'Titan'],\n 'PI86100': [STRINGS_HTC, 'Titan II'],\n 'Ultimate': [STRINGS_HTC, 'Ultimate']\n },\n\n 'LG': {\n 'GW910': [STRINGS_LG, 'Optimus 7'],\n 'LG E-900': [STRINGS_LG, 'Optimus 7 E900'],\n 'LG-E900': [STRINGS_LG, 'Optimus 7 E900'],\n 'LG-E900h': [STRINGS_LG, 'Optimus 7 E900'],\n 'LG-C900': [STRINGS_LG, 'Optimus 7Q'],\n 'LG-C900B': [STRINGS_LG, 'Quantum'],\n 'LG-C900k': [STRINGS_LG, 'Quantum']\n },\n\n 'nokia': {\n 'SeaRay': ['Nokia', 'Lumia 800'],\n '800C': ['Nokia', 'Lumia 800']\n },\n\n 'NOKIA': {\n '710': ['Nokia', 'Lumia 710'],\n 'Nokia 710': ['Nokia', 'Lumia 710'],\n 'Lumia 710': ['Nokia', 'Lumia 710'],\n 'Lumia 719': ['Nokia', 'Lumia 719'],\n 'Lumia 800': ['Nokia', 'Lumia 800'],\n '800': ['Nokia', 'Lumia 800'],\n 'Lumia 900': ['Nokia', 'Lumia 900'],\n 'XXX': ['Nokia', 'prototype']\n },\n\n 'SAMSUNG': {\n 'GT-I8350': [STRINGS_SAMSUNG, 'Omnia W'],\n 'GT-I8350T': [STRINGS_SAMSUNG, 'Omnia W'],\n 'SGH-i677': [STRINGS_SAMSUNG, 'Focus Flash'],\n 'SGH-i707': [STRINGS_SAMSUNG, 'Taylor'],\n 'SGH-i917': [STRINGS_SAMSUNG, 'Omnia 7'],\n 'SGH-I917': [STRINGS_SAMSUNG, 'Omnia 7'],\n 'SGH-i917.': [STRINGS_SAMSUNG, 'Focus'],\n 'SGH-i917R': [STRINGS_SAMSUNG, 'Focus'],\n 'SGH-i937': [STRINGS_SAMSUNG, 'Focus S'],\n 'OMNIA7': [STRINGS_SAMSUNG, 'Omnia 7'],\n 'OMINA7': [STRINGS_SAMSUNG, 'Omnia 7'],\n 'Taylor': [STRINGS_SAMSUNG, 'Taylor']\n },\n\n 'TOSHIBA': {\n 'TSUNAGI': ['Toshiba', 'Tsunagi']\n }\n };\n\n var ANDROID_MODELS = {\n 'Android': [null, null],\n 'google sdk': [null, null],\n 'sdk': [null, null],\n 'generic': [null, null],\n 'generic x86': [null, null],\n 'amd brazos': ['AMD', 'Fusionbased device'],\n 'Amlogic M1 reference board': ['Amlogic', 'M1 reference board'],\n 'AML8726M': ['Amlogic', 'AML8726-Mbased device'],\n 'vexpress a9': ['ARM', 'Versatile Express development platform'],\n 'bcm7231': ['Broadcom', 'BCM7231based device', 'television'],\n 'bcm7425': ['Broadcom', 'BCM7425based device', 'television'],\n 'bcm7429': ['Broadcom', 'BCM7429based device', 'television'],\n 'imx50 rdp': ['Freescale', 'i.MX50based device'],\n 'imx51 bbg': ['Freescale', 'i.MX51based device'],\n 'imx53 loco': ['Freescale', 'i.MX53based device'],\n 'imx53 mp204f3': ['Freescale', 'i.MX53based device'],\n 'imx53 smd': ['Freescale', 'i.MX53based device'],\n 'imx53 yeagle': ['Freescale', 'i.MX53based device'],\n 'imx6q': ['Freescale', 'i.MX6Qbased device'],\n 'ODROID-A': ['Hardkernel', 'ODROID-A developer tablet', 'tablet'],\n 'mfld dv10': ['Intel', 'Medfieldbased device'],\n 'mfld dv20': ['Intel', 'Medfieldbased device'],\n 'mfld lw00': ['Intel', 'Medfieldbased device'],\n 'mfld pr2': ['Intel', 'Medfieldbased device'],\n 'mfld pr3': ['Intel', 'Medfieldbased device'],\n 'berlin bg2': ['Marvell', 'Armada 1000based device', 'television'],\n 'MStar Amber3': ['MStar', 'Amber3based device'],\n 'Konka Amber3': ['MStar', 'Amber3based device'],\n 'mt5396': ['Mediatek', 'MT5396based device', 'television'],\n 'bird75v2': ['Mediatek', 'MT6575based device'],\n 'eagle75v1 2': ['Mediatek', 'MT6575based device'],\n 'MBX DVBT reference board (c03ref)': ['MXB', 'DVBT reference board', 'television'],\n 'NS2816': ['Nufront', 'NuSmart 2816based device'],\n 'Ventana': ['nVidia', 'Tegra Ventana development kit'],\n 'Cardhu': ['nVidia', 'Tegra 3based device'],\n 'Panda': ['Pandaboard', 'Development Kit'],\n 'pandaboard': ['Pandaboard', 'Development Kit'],\n 'PandaBoard': ['Pandaboard', 'Development Kit'],\n 'MSM': ['Qualcomm', 'Snapdragonbased device'],\n 'msm7227 ffa': ['Qualcomm', 'Snapdragon S1based device'],\n 'msm7627 surf': ['Qualcomm', 'Snapdragon S1based device'],\n 'msm7627a': ['Qualcomm', 'Snapdragon S1based device'],\n 'msm7627a sku1': ['Qualcomm', 'Snapdragon S1based device'],\n 'msm7627a sku3': ['Qualcomm', 'Snapdragon S1based device'],\n 'msm7630 fusion': ['Qualcomm', 'Snapdragon S2based device'],\n 'msm7630 surf': ['Qualcomm', 'Snapdragon S2based device'],\n 'msm8660 cougar': ['Qualcomm', 'Snapdragon S3based device'],\n 'msm8660 surf': ['Qualcomm', 'Snapdragon S3based device'],\n 'msm8960': ['Qualcomm', 'Snapdragon S4based device'],\n 'rk2808sdk': ['Rockchip', 'RK2808based device'],\n 'RK2818': ['Rockchip', 'RK2818based device'],\n 'rk2818sdk': ['Rockchip', 'RK2818based device'],\n 'Android-for-Rockchip-2818': ['Rockchip', 'RK2818based device'],\n 'rk29sdk': ['Rockchip', 'RK29based device'],\n 'Rk29sdk': ['Rockchip', 'RK29based device'],\n 'rk30sdk': ['Rockchip', 'RK30based device'],\n 's3c6410': ['Samsung', 'S3C6410based device'],\n 'smdk6410': ['Samsung', 'S3C6410based device'],\n 'SMDKC110': ['Samsung', 'Exynos 3110based device'],\n 'SMDKV210': ['Samsung', 'Exynos 4210based device'],\n 'S5PV210': ['Samsung', 'Exynos 4210based device'],\n 'sec smdkc210': ['Samsung', 'Exynos 4210based device'],\n 'SMDK4x12': ['Samsung', 'Exynos 4212 or 4412based device'],\n 'smp86xx': ['Sigma', 'SMP86xxbased device', 'television'],\n 'sv8860': ['Skyviia', 'SV8860based device', 'television'],\n 'ste u8500': ['ST Ericsson', 'Novathor U8500based device'],\n 'Telechips M801 Evaluation Board': ['Telechips', 'M801based device', 'television'],\n 'Telechips TCC8900 Evaluation Board': ['Telechips', 'TCC8900based device', 'television'],\n 'TCC8920 STB EV': ['Telechips', 'TCC8920based device', 'television'],\n 'OMAP': ['Texas Instruments', 'OMAPbased device'],\n 'OMAP SS': ['Texas Instruments', 'OMAPbased device'],\n 'LogicPD Zoom2': ['Texas Instruments', 'OMAPbased device'],\n 'omap3evm': ['Texas Instruments', 'OMAP3based device'],\n 'Omap5sevm': ['Texas Instruments', 'OMAP5based device'],\n 'pnx8473 kiryung': ['Trident', 'PNX8473based device', 'television'],\n 'crespo': ['Google', 'Nexus S'],\n 'Crespo': ['Google', 'Nexus S'],\n 'Crespo4G': ['Google', 'Nexus S'],\n 'Passion': ['Google', 'Nexus One'],\n 'Bravo': ['HTC', 'Desire'],\n 'dream': ['HTC', 'Dream'],\n 'Vogue': ['HTC', 'Touch'],\n 'Vendor Optimus': ['LG', 'Optimus'],\n 'Stingray': ['Motorola', 'XOOM', 'tablet'],\n 'Wingray': ['Motorola', 'XOOM', 'tablet'],\n 'maguro': ['Samsung', 'Galaxy Nexus'],\n 'Maguro': ['Samsung', 'Galaxy Nexus'],\n 'Toro-VZW': ['Samsung', 'Galaxy Nexus'],\n 'blaze': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n 'Blaze': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n 'Blaze Tablet': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n 'BlueStacks': ['BlueStacks', 'App Player', 'desktop'],\n 'youwave custom': ['Youwave', 'Android on PC', 'desktop'],\n 'A100': ['Acer', 'Iconia Tab A100', 'tablet'],\n 'A101': ['Acer', 'Iconia Tab A101', 'tablet'],\n 'A200': ['Acer', 'Iconia Tab A200', 'tablet'],\n 'A500': ['Acer', 'Iconia Tab A500', 'tablet'],\n 'A501': ['Acer', 'Iconia Tab A501', 'tablet'],\n 'A510': ['Acer', 'Iconia Tab A510', 'tablet'],\n 'A511': ['Acer', 'Iconia Tab A511', 'tablet'],\n 'A700': ['Acer', 'Iconia Tab A700', 'tablet'],\n 'Acer A800': ['Acer', 'Iconia Tab A800', 'tablet'],\n 'E110': ['Acer', 'beTouch E110'],\n 'E120': ['Acer', 'beTouch E120'],\n 'E130': ['Acer', 'beTouch E130'],\n 'E140': ['Acer', 'beTouch E140'],\n 'E210': ['Acer', 'beTouch E210'],\n 'E310': ['Acer', 'Liquid mini'],\n 'E320': ['Acer', 'Liquid Express'],\n 'E330': ['Acer', 'Liquid Glow'],\n 'E400': ['Acer', 'beTouch E400'],\n 'G100W': ['Acer', 'G100W'],\n 'S100': ['Acer', 'Liquid'],\n 'S110': ['Acer', 'Stream'],\n 'S120': ['Acer', 'Liquid mt'],\n 'S300': ['Acer', 'Iconia Smart'],\n 'S500': ['Acer', 'CloudMobile'],\n 'TD600': ['Acer', 'beTouch TD600'],\n 'Liquid': ['Acer', 'Liquid'],\n 'Liquid E': ['Acer', 'Liquid E'],\n 'Liquid Mt': ['Acer', 'Liquid mt'],\n 'Liquid MT': ['Acer', 'Liquid mt'],\n 'Liquid Metal': ['Acer', 'Liquid mt'],\n 'Stream': ['Acer', 'Stream'],\n 'N700': ['aigo', 'N700', 'tablet'],\n 'M801': ['aigo', 'M801', 'tablet'],\n 'Novo7': ['Ainovo', 'Novo7', 'tablet'],\n 'Novo7 Aurora': ['Ainovo', 'Novo7 Aurora', 'tablet'],\n 'Novo7 Advanced': ['Ainovo', 'Novo7 Advanced', 'tablet'],\n 'Novo7 Advanced2': ['Ainovo', 'Novo7 Advanced 2', 'tablet'],\n 'Novo7 Basic': ['Ainovo', 'Novo7 Basic', 'tablet'],\n 'Novo7 ELF': ['Ainovo', 'Novo7 Elf', 'tablet'],\n 'Novo7 PALADIN': ['Ainovo', 'Novo7 Paladin', 'tablet'],\n 'Novo8 Advanced': ['Ainovo', 'Novo8 Advanced', 'tablet'],\n 'one touch 890': ['Alcatel', 'One Touch 890'],\n 'one touch 890D': ['Alcatel', 'One Touch 890'],\n 'one touch 891': ['Alcatel', 'One Touch 891'],\n 'ONE TOUCH 903': ['Alcatel', 'One Touch 903SHV-E170K'],\n 'one touch 906': ['Alcatel', 'One Touch 906'],\n 'one touch 908': ['Alcatel', 'One Touch 908'],\n 'one touch 908F': ['Alcatel', 'One Touch 908'],\n 'one touch 908S': ['Alcatel', 'One Touch 908'],\n 'one touch 910': ['Alcatel', 'One Touch 910'],\n 'one touch 918': ['Alcatel', 'One Touch 918'],\n 'one touch 918D': ['Alcatel', 'One Touch 918'],\n 'ONE TOUCH 918D': ['Alcatel', 'One Touch 918'],\n 'one touch 918M': ['Alcatel', 'One Touch 918'],\n 'one touch 918N': ['Alcatel', 'One Touch 918'],\n 'one touch 980': ['Alcatel', 'One Touch 980'],\n 'one touch 980A': ['Alcatel', 'One Touch 980'],\n 'one touch 981A': ['Alcatel', 'One Touch 981'],\n 'one touch 986': ['Alcatel', 'One Touch 986'],\n 'one touch 990': ['Alcatel', 'One Touch 990'],\n 'one touch 990A': ['Alcatel', 'One Touch 990'],\n 'one touch 991': ['Alcatel', 'One Touch 991'],\n 'one touch 991D': ['Alcatel', 'One Touch 991'],\n 'ONE TOUCH 993': ['Alcatel', 'One Touch 993'],\n 'one touch 995': ['Alcatel', 'One Touch 995'],\n 'Telenor OneTouch': ['Alcatel', 'One Touch 990'],\n 'OT 918': ['Alcatel', 'One Touch 918'],\n 'Venture': ['Alcatel', 'Venture'],\n 'Allwinner A10': ['AllWinner', 'A10', 'tablet'],\n '97FC': ['AllWinner', 'A10 97FC', 'tablet'],\n 'Kindle Fire': ['Amazon', 'Kindle Fire', 'tablet'],\n 'Amazon Kindle Fire': ['Amazon', 'Kindle Fire', 'tablet'],\n 'AMD120': ['AnyDATA', 'AnyTAB AMD120', 'tablet'],\n 'MW0811': ['AOC', 'Breeze MW0811', 'tablet'],\n 'MW0821 V2.0': ['AOC', 'Breeze MW0821', 'tablet'],\n 'MW0922': ['AOC', 'Breeze MW0922', 'tablet'],\n 'Apanda A60': ['Apanda', 'A60'],\n 'apanda-A60': ['Apanda', 'A60'],\n 'A80KSC': ['Archos', 'Arnova 8', 'tablet'],\n 'AN7CG2': ['Archos', 'Arnova 7', 'tablet'],\n 'A101B': ['Archos', 'Arnova 10', 'tablet'],\n 'AN10BG2DT': ['Archos', 'Arnova 10 B', 'tablet'],\n 'AN10G2': ['Archos', 'Arnova 10 G2', 'tablet'],\n 'A32': ['Archos', '32', 'media'],\n 'A35DE': ['Archos', '35 Smart Home Phone'],\n 'A43': ['Archos', '43', 'media'],\n 'Archos5': ['Archos', '5', 'media'],\n 'A70H': ['Archos', '7', 'tablet'],\n 'A70HB': ['Archos', '7', 'tablet'],\n 'A70BHT': ['Archos', '7', 'tablet'],\n 'A70CHT': ['Archos', '7C', 'tablet'],\n 'A70S': ['Archos', '70', 'tablet'],\n 'A7EB': ['Archos', '70B', 'tablet'],\n 'ARCHOS 70it2': ['Archos', '70 IT 2', 'tablet'],\n 'ARCHOS 80G9': ['Archos', '80 G9', 'tablet'],\n 'ARCHOS 101G9': ['Archos', '101 G9', 'tablet'],\n 'A101IT': ['Archos', '101 IT', 'tablet'],\n 'ASTRI': ['ASTRI', 'e-reader', 'ereader'],\n 'eeepc': ['Asus', 'Eee Pc'],\n 'asus laptop': ['Asus', 'Eee Pc'],\n 'ME171': ['Asus', 'Eee Pad MeMO', 'tablet'],\n 'Slider SL101': ['Asus', 'Eee Pad Slider', 'tablet'],\n 'EPAD': ['Asus', 'Eee Pad Transformer', 'tablet'],\n 'TF101': ['Asus', 'Eee Pad Transformer', 'tablet'],\n 'Transformer TF101': ['Asus', 'Eee Pad Transformer', 'tablet'],\n 'Transformer TF101G': ['Asus', 'Eee Pad Transformer', 'tablet'],\n 'TF201': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n 'Transformer Prime TF201': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n 'Transformer Prime': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n 'Transformer Pad TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n 'ASUS Transformer TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n 'ASUS Transformer Pad TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n 'ASUS Transformer Pad TF300TG': ['Asus', 'Transformer Pad 300', 'tablet'],\n 'ASUS Transformer Pad TF700T': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n 'ASUS Transformer Pad TF700K': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n 'ASUS Transformer TF700K': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n 'PadFone': ['Asus', 'Padfone', 'tablet'],\n 'OMS TTD': ['Asus', 'Eee Pc T10'],\n 'ASUS T20': ['Asus', 'Eee Pc T20'],\n 'ETBW11AA': ['Asus', 'Tough'],\n 'AUX V900': ['AUX', 'V900'],\n 'M910A': ['AUX', 'M910'],\n 'PICOpad-QGN': ['Axioo', 'Picopad QGN', 'tablet'],\n 'NOOK': ['Barnes & Noble', 'NOOK', 'ereader'],\n 'NookColor': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n 'NOOK BNRV200': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n 'NOOK BNRV300': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n 'NookTablet': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'Nook Tablet': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'NOOK BNTV250': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'NOOK BNTV250A': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'BNTV250': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'BNTV250A': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'NOOK Slate': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n 'BenWee 5100': ['BenWee', '5100'],\n 'CA907AAC0G': ['Besta', 'CA907AAC0G'],\n 'BM999': ['Bmorn', 'BM999', 'tablet'],\n 'V11': ['Bmorn', 'V11', 'tablet'],\n 'V99': ['Bmorn', 'V99', 'tablet'],\n 'bq DaVinci': ['bq', 'DaVinci', 'tablet'],\n 'CT704': ['Carrefour', 'CT704', 'tablet'],\n 'CT1002': ['Carrefour', 'CT1002', 'tablet'],\n 'Camangi-Mangrove7': ['Camangi', 'Mangrove 7', 'tablet'],\n 'WS171': ['Camangi', 'WebStation', 'tablet'],\n 'IS11CA': ['Casio', 'GzOne IS11CA'],\n 'C771': ['Casio', 'GzOne Commando'],\n 'CAT NOVA': ['Cat', 'NOVA', 'tablet'],\n 'ARMM3V': ['chinaleap', 'ARMM3V', 'tablet'],\n 'CIUS-7': ['Cisco', 'Cius', 'tablet'],\n 'CIUS-7-AT': ['Cisco', 'Cius', 'tablet'],\n 'CSL Spice MI300': ['CSL', 'Spice MI300'],\n 'CSL-MI410': ['CSL', 'Spice MI410'],\n 'MID1024': ['Coby', 'Kyros MID1024', 'tablet'],\n 'MID1125': ['Coby', 'Kyros MID1125', 'tablet'],\n 'MID1126': ['Coby', 'Kyros MID1126', 'tablet'],\n 'MID7010': ['Coby', 'Kyros MID7010', 'tablet'],\n 'MID7012': ['Coby', 'Kyros MID7012', 'tablet'],\n 'MID7015': ['Coby', 'Kyros MID7015', 'tablet'],\n 'MID7015A': ['Coby', 'Kyros MID7015', 'tablet'],\n 'MID7016': ['Coby', 'Kyros MID7016', 'tablet'],\n 'MID7020': ['Coby', 'Kyros MID7020', 'tablet'],\n 'MID7022': ['Coby', 'Kyros MID7022', 'tablet'],\n 'MID7024': ['Coby', 'Kyros MID7024', 'tablet'],\n 'MID7025': ['Coby', 'Kyros MID7025', 'tablet'],\n 'MID7127': ['Coby', 'Kyros MID7127', 'tablet'],\n 'MID8024': ['Coby', 'Kyros MID8024', 'tablet'],\n 'MID8125': ['Coby', 'Kyros MID8125', 'tablet'],\n 'MID8127': ['Coby', 'Kyros MID8127', 'tablet'],\n 'Z71': ['Commtiva', 'Z71'],\n 'V-T100': ['Commtiva', 'V-T100'],\n 'FIH-FB0': ['Commtiva', 'HD700'],\n 'Coolpad D510': ['Coolpad', 'D510'],\n 'Coolpad 8020': ['Coolpad', '8020'],\n 'D530': ['Coolpad', 'D530'],\n 'Coolpad D530': ['Coolpad', 'D530'],\n 'D539': ['Coolpad', 'D539'],\n 'Coolpad D539': ['Coolpad', 'D539'],\n 'E239': ['Coolpad', 'E239'],\n 'Coolpad E239': ['Coolpad', 'E239'],\n 'Coolpad N930': ['Coolpad', 'N930'],\n 'N930': ['Coolpad', 'N930'],\n 'Coolpad W706': ['Coolpad', 'W706'],\n 'Coolpad W706+': ['Coolpad', 'W706'],\n 'Coolpad W708': ['Coolpad', 'W708'],\n 'W711': ['Coolpad', 'W711'],\n 'Coolpad 5010': ['Coolpad', '5010'],\n 'Coolpad 5210': ['Coolpad', '5210'],\n 'Coolpad 5820': ['Coolpad', '5820'],\n '5832': ['Coolpad', '5832'],\n 'Coolpad 5832': ['Coolpad', '5832'],\n '5855': ['Coolpad', '5855'],\n 'Coolpad 5860': ['Coolpad', '5860'],\n 'Coolpad 5860+': ['Coolpad', '5860'],\n 'Coolpad 5860s': ['Coolpad', '5860'],\n '5860': ['Coolpad', '5860'],\n '5860A': ['Coolpad', '5860'],\n 'Coolpad 5870': ['Coolpad', '5870'],\n '5870': ['Coolpad', '5870'],\n 'Coolpad 7005': ['Coolpad', '7005'],\n '7260': ['Coolpad', '7260'],\n 'Coolpad 7019': ['Coolpad', '7019'],\n 'Coolpad 7260': ['Coolpad', '7260'],\n 'Coolpad 8013': ['Coolpad', '8013'],\n 'Coolpad 8809': ['Coolpad', '8809'],\n 'Coolpad 8810': ['Coolpad', '8810'],\n '8810': ['Coolpad', '8810'],\n '8150': ['Coolpad', '8150'],\n 'Coolpad 8150D': ['Coolpad', '8150'],\n\n 'Coolpad 8811': ['Coolpad', '8811'],\n 'Coolpad 9900': ['Coolpad', '9900'],\n 'Coolpad 8050': ['Coolpad', '8050'],\n 'ZiiO7': ['Creative', 'ZiiO 7', 'tablet'],\n 'ZiiLABS ZiiO7': ['Creative', 'ZiiO 7', 'tablet'],\n 'ZiiLABS ZiiO10 ': ['Creative', 'ZiiO 10', 'tablet'],\n 'CUBE K8GT A': ['Cube', 'K8GT A', 'tablet'],\n 'CUBE K8GT B': ['Cube', 'K8GT B', 'tablet'],\n 'K8GT C': ['Cube', 'K8GT C', 'tablet'],\n 'K8GT H': ['Cube', 'K8GT H', 'tablet'],\n 'CUBE K8GT H': ['Cube', 'K8GT H', 'tablet'],\n 'K8GT W': ['Cube', 'K8GT W', 'tablet'],\n 'CUBE U8GT': ['Cube', 'U8GT', 'tablet'],\n 'CUBE U9GT': ['Cube', 'U9GT', 'tablet'],\n 'CUBE U9GT 2': ['Cube', 'U9GT 2', 'tablet'],\n 'Cube U9GT2': ['Cube', 'U9GT 2', 'tablet'],\n 'U9GT': ['Cube', 'U9GT', 'tablet'],\n 'U9GT2 From moage.com': ['Cube', 'U9GT 2', 'tablet'],\n 'N90 From moage.com': ['Cube', 'U9GT 2', 'tablet'],\n 'U9GT S': ['Cube', 'U9GT S', 'tablet'],\n 'U9GT S A': ['Cube', 'U9GT SA', 'tablet'],\n 'U9GTS A': ['Cube', 'U9GT SA', 'tablet'],\n 'U10GT 2': ['Cube', 'U10GT 2', 'tablet'],\n 'U10GT S': ['Cube', 'U10GT S', 'tablet'],\n 'U30GT-H': ['Cube', 'U30GT H', 'tablet'],\n 'CUBE Q7PRO': ['Cube', 'Q7 Pro', 'tablet'],\n 'CUBE Q7PRO J': ['Cube', 'Q7 Pro', 'tablet'],\n 'Cydle M7 (v0005.04.03.12.ko)': ['Cydle', 'M7 MultiPAD', 'tablet'],\n 'Dell Aero': ['Dell', 'Aero'],\n 'Dell M01M': ['Dell', 'Mini 5', 'tablet'],\n 'Dell Streak': ['Dell', 'Streak', 'tablet'],\n '001DL': ['Dell', 'Streak', 'tablet'],\n '101DL': ['Dell', 'Streak Pro', 'tablet'],\n 'GS01': ['Dell', 'Streak Pro', 'tablet'],\n 'Dell Streak Pro': ['Dell', 'Streak Pro', 'tablet'],\n 'streak7': ['Dell', 'Streak 7', 'tablet'],\n 'Dell Streak 7': ['Dell', 'Streak 7', 'tablet'],\n 'Dell Streak 10 Pro': ['Dell', 'Streak 10 Pro', 'tablet'],\n 'Dell V04B': ['Dell', 'Streak V04B', 'tablet'],\n 'Dell Venue': ['Dell', 'Venue'],\n 'Dell XCD35': ['Dell', 'XCD35'],\n 'XCD35': ['Dell', 'XCD35'],\n 'iDx7': ['Digma', 'iDx7', 'tablet'],\n 'iDx10': ['Digma', 'iDx10', 'tablet'],\n 'iDx10 3G': ['Digma', 'iDx10', 'tablet'],\n 'DM009SH': ['Disney Mobile', 'DM009SH'],\n 'DM010SH': ['Disney Mobile', 'DM010SH'],\n 'DM012SH': ['Disney Mobile', 'DM012SH'],\n 'F-08D': ['Disney Mobile', 'F-08D'],\n 'P-05D': ['Disney Mobile', 'P-05D'],\n 'Tablet-P27': ['DracoTek', 'P27 Tablet', 'tablet'],\n 'edgejr': ['EnTourage', 'Pocket eDGe', 'tablet'],\n 'l97D': ['EPad', 'l97D', 'tablet'],\n 'M4301': ['Eston', 'MID M4301', 'media'],\n 'P10AN': ['Exper', 'Easypad P10AN', 'tablet'],\n 'FIH-F0X': ['FIH', 'F0X'],\n 'Fly IQ260': ['Fly', 'IQ260 BlackBird'],\n 'ISW11F': ['Fujitsu', 'Arrows Z'],\n 'ISW13F': ['Fujitsu', 'Arrows Z'],\n 'IS12F': ['Fujitsu', 'Arrows ES'],\n 'F-01D': ['Fujitsu', 'Arrows Tab LTE', 'tablet'],\n 'F-03D': ['Fujitsu', 'Arrows Kiss'],\n 'F-05D': ['Fujitsu', 'Arrows X LTE'],\n 'F-07D': ['Fujitsu', 'Arrows \\u00c3\\ufffd\\u00c2\\u00bc'],\n 'F-10D': ['Fujitsu', 'Arrows X F-10D'],\n 'F-12C': ['Fujitsu', 'Globetrotter'],\n 'f12arc': ['Fujitsu', 'F12arc'],\n 'M532': ['Fujitsu', 'Stylistic M532', 'tablet'],\n 'Garminfone': ['Garmin-Asus', 'Garminfone'],\n 'Garmin-Asus A10': ['Garmin-Asus', 'Nuvifone A10'],\n 'Garmin-Asus A50': ['Garmin-Asus', 'Nuvifone A50'],\n 'TPA60W': ['Gateway', 'TPA60W', 'tablet'],\n 'Geeksphone ZERO': ['Geeksphone', 'ZERO'],\n 'gemei G2': ['Gemei', 'G2', 'tablet'],\n 'Gemei G2': ['Gemei', 'G2', 'tablet'],\n 'gemei G3': ['Gemei', 'G3', 'tablet'],\n 'Gemei G9': ['Gemei', 'G9', 'tablet'],\n 'GSmart G1317D': ['Gigabyte', 'GSmart G1317D'],\n 'Gigabyte TB100': ['Gigabyte', 'TB100', 'tablet'],\n 'GN100': ['Gionee', 'GN100'],\n 'GN105': ['Gionee', 'GN105'],\n 'GN106': ['Gionee', 'GN106'],\n 'GN200': ['Gionee', 'GN200'],\n 'GN205': ['Gionee', 'GN205'],\n 'GN700W': ['Gionee', 'GN700W'],\n 'GN708W': ['Gionee', 'GN708W'],\n 'Google Ion': ['Google', 'Ion'],\n 'Nexus One': ['Google', 'Nexus One'],\n 'NexusOne': ['Google', 'Nexus One'],\n 'HTC Nexus One': ['Google', 'Nexus One'],\n 'Nexus S': ['Google', 'Nexus S'],\n 'Google Nexus S': ['Google', 'Nexus S'],\n 'Nexus S 4G': ['Google', 'Nexus S 4G'],\n 'Dooderbutt-4.0.3-v1': ['Google', 'Nexus S 4G'],\n 'Nexus 7': ['Google', 'Nexus 7', 'tablet'],\n 'Haier HW-W910': ['Haier', 'HW-W910'],\n 'SN10T1': ['HANNspree', 'HANNSpad SN10T1', 'tablet'],\n 'SN10T2': ['HANNspree', 'HANNSpad SN10T2', 'tablet'],\n 'HannsComb': ['HANNspree', 'HANNSpad', 'tablet'],\n 'X1': ['HCL', 'ME X1', 'tablet'],\n 'MID Serails': ['Herotab', 'C8', 'tablet'],\n 'MID Serials': ['Herotab', 'C8', 'tablet'],\n 'COSMO DUO': ['Hiscreen', 'Cosmo DUO', 'tablet'],\n 'HS-U8': ['Hisense', 'U8'],\n 'HS-T92': ['Hisense', 'T92'],\n 'HS-E860': ['Hisense', 'E860'],\n 'HS-E910': ['Hisense', 'E910'],\n 'HS-E926': ['Hisense', 'E926'],\n\n 'HS-EG900': ['Hisense', 'EG900'],\n 'HS-ET919': ['Hisense', 'ET919'],\n 'EG968B': ['Hisense', 'EG968B'],\n 'HKPHONE H8-3G': ['HKPhone', 'H8 3G'],\n 'HOSIN U2': ['Hosin', 'U2'],\n 'Touchpad': ['HP', 'TouchPad', 'tablet'],\n 'HP Touchpad': ['HP', 'TouchPad', 'tablet'],\n 'cm tenderloin': ['HP', 'TouchPad', 'tablet'],\n 'aokp tenderloin': ['HP', 'TouchPad', 'tablet'],\n 'HTC Amaze 4G': ['HTC', 'Amaze 4G'],\n 'HTC Ruby': ['HTC', 'Amaze 4G'],\n 'HTC Amaze 4G(Ruby)': ['HTC', 'Amaze 4G'],\n 'Amaze 4G': ['HTC', 'Amaze 4G'],\n 'HTC Aria': ['HTC', 'Aria'],\n 'HTC Aria A6380': ['HTC', 'Aria'],\n 'HTC Liberty A6380': ['HTC', 'Aria'],\n 'HTC Liberty': ['HTC', 'Aria'],\n 'HTC A6366': ['HTC', 'Aria'],\n 'HTC Bee': ['HTC', 'Bee'],\n 'HTC ChaCha': ['HTC', 'ChaCha'],\n 'HTC ChaCha A810e': ['HTC', 'ChaCha'],\n 'HTC ChaChaCha A810e': ['HTC', 'ChaCha'],\n 'HTC A810e': ['HTC', 'ChaCha'],\n 'HTC A9188': ['HTC', 'Tianxi'],\n 'HTC Bravo': ['HTC', 'Desire'],\n 'HTC Desire': ['HTC', 'Desire'],\n 'HTC Desire A8181': ['HTC', 'Desire'],\n 'HTC Desire A8183': ['HTC', 'Desire'],\n 'HTC Desire Beats A8181': ['HTC', 'Desire'],\n 'HTC Desire CDMA': ['HTC', 'Desire'],\n 'HTC Desire SMS': ['HTC', 'Desire'],\n 'HTC Desire S.M.S': ['HTC', 'Desire'],\n 'HTC Desire C': ['HTC', 'Desire C'],\n 'HTC DesireHD': ['HTC', 'Desire HD'],\n 'HTC DesireHD A9191': ['HTC', 'Desire HD'],\n 'HTC DesireHD A9192': ['HTC', 'Desire HD'],\n 'HTC Desire HD A9191': ['HTC', 'Desire HD'],\n 'HTC A9191': ['HTC', 'Desire HD'],\n 'HTC A9191 for AT&T': ['HTC', 'Desire HD'],\n 'HTC A9192': ['HTC', 'Desire HD'],\n 'HTC Desire HD': ['HTC', 'Desire HD'],\n 'HTC Desire HD with Beats Audio': ['HTC', 'Desire HD'],\n 'HTC Desire S': ['HTC', 'Desire S'],\n 'HTC DesireS': ['HTC', 'Desire S'],\n 'HTC DesiresS': ['HTC', 'Desire S'],\n 'HTC DesireS S510e': ['HTC', 'Desire S'],\n 'HTC DesireS S510b': ['HTC', 'Desire S'],\n 'HTC Desire S S510e': ['HTC', 'Desire S'],\n 'HTC S510e': ['HTC', 'Desire S'],\n 'HTC Desire Saga': ['HTC', 'Desire S'],\n 'HTC Desire V': ['HTC', 'Desire V'],\n 'HTC T328w': ['HTC', 'Desire V'],\n 'HTC Desire VC': ['HTC', 'Desire VC'],\n 'HTC T328d': ['HTC', 'Desire VC'],\n 'HTC T328t': ['HTC', 'Desire VT'],\n 'HTC Desire Z': ['HTC', 'Desire Z'],\n 'HTC DesireZ': ['HTC', 'Desire Z'],\n 'HTC DesireZ A7272': ['HTC', 'Desire Z'],\n 'HTC Desire Z A7272': ['HTC', 'Desire Z'],\n 'HTC Vision': ['HTC', 'Desire Z'],\n 'HTC A7275': ['HTC', 'Desire Z'],\n 'HTC Dream': ['HTC', 'Dream'],\n 'HTC S710d': ['HTC', 'Droid Incredible 2'],\n 'HTC Incredible 2': ['HTC', 'Droid Incredible 2'],\n 'HTC X515d': ['HTC', 'EVO 3D'],\n 'HTC X515m': ['HTC', 'EVO 3D'],\n 'HTC X515C': ['HTC', 'EVO 3D'],\n 'HTC Evo 3D': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D GSM': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D X515a': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D GSM X515m': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D X515m': ['HTC', 'EVO 3D'],\n 'HTC EVO 3D X515M': ['HTC', 'EVO 3D'],\n 'HTC EVO3D X515a': ['HTC', 'EVO 3D'],\n 'HTC EVO3D X515m': ['HTC', 'EVO 3D'],\n 'HTC Evo 3D X515m': ['HTC', 'EVO 3D'],\n 'HTC Evo 3D with Beats Audio X515m': ['HTC', 'EVO 3D'],\n 'HTC Evo 4G': ['HTC', 'EVO 4G'],\n 'HTC EVO 4G': ['HTC', 'EVO 4G'],\n 'HTC X515E': ['HTC', 'EVO 4G+'],\n 'HTC EVO 4G+ For Sprint': ['HTC', 'EVO 4G+'],\n 'HTC EVO 4G++ For Sprint': ['HTC', 'EVO 4G+'],\n 'HTC C715c': ['HTC', 'EVO Design 4G'],\n 'HTC Design 4G': ['HTC', 'EVO Design 4G'],\n 'HTC EVO design 4G': ['HTC', 'EVO Design 4G'],\n 'HTC EVO Design 4G': ['HTC', 'EVO Design 4G'],\n 'HTC Evo Shift': ['HTC', 'EVO Shift'],\n 'HTC EVO Shift 4G': ['HTC', 'EVO Shift'],\n 'HTC A310e': ['HTC', 'Explorer'],\n 'HTC Explorer': ['HTC', 'Explorer'],\n 'HTC Explorer A310b': ['HTC', 'Explorer'],\n 'HTC Explorer A310e': ['HTC', 'Explorer'],\n 'HTC P510e': ['HTC', 'Flyer', 'tablet'],\n 'HTC Flyer': ['HTC', 'Flyer', 'tablet'],\n 'HTC Flyer P510e': ['HTC', 'Flyer', 'tablet'],\n 'HTC Flyer P512': ['HTC', 'Flyer', 'tablet'],\n 'HTC Flyer P512 NA': ['HTC', 'Flyer', 'tablet'],\n 'HTC P515E': ['HTC', 'Flyer 4G', 'tablet'],\n 'HTC Gratia A6380': ['HTC', 'Gratia'],\n 'HTC HD': ['HTC', 'HD'],\n 'HTC HD2': ['HTC', 'HD2'],\n 'HTC HD2 T8585': ['HTC', 'HD2'],\n 'HTC HD2(Leo)': ['HTC', 'HD2'],\n 'HTC HD7': ['HTC', 'HD7'],\n 'HTC T9299+': ['HTC', 'HD7'],\n 'HTC HD7 for Sprint': ['HTC', 'HD7'],\n 'HTC HD7 4G T9299 For AT&T': ['HTC', 'HD7'],\n 'HTC HD7 4G T9299+ For AT&T': ['HTC', 'HD7'],\n 'HTC T9299+ For AT&T': ['HTC', 'HD7'],\n 'HTC HD7S T9399+': ['HTC', 'HD7s'],\n 'HTC HD7S T9899+': ['HTC', 'HD7s'],\n 'HTC T9899+ For AT&T': ['HTC', 'HD7s'],\n 'VitMod ExtraLite 1.6.5.fullodex for HTC HD7 Pro': ['HTC', 'HD7 Pro'],\n 'HTC Hero': ['HTC', 'Hero'],\n 'HTC HERO': ['HTC', 'Hero'],\n 'HTC Hero CDMA': ['HTC', 'Hero'],\n 'HTC HERO CDMA': ['HTC', 'Hero'],\n 'HTC HERO200': ['HTC', 'Hero 200'],\n 'HTC Hero S': ['HTC', 'Hero S'],\n 'HTC IMAGIO': ['HTC', 'Imagio'],\n 'HTC Incredible': ['HTC', 'Incredible'],\n 'HTC Incredible S710E': ['HTC', 'Incredible S'],\n 'HTC S710e': ['HTC', 'Incredible S'],\n 'HTC Incredible S': ['HTC', 'Incredible S'],\n 'HTC Incredible S S710e': ['HTC', 'Incredible S'],\n 'HTC Incredible S s710e': ['HTC', 'Incredible S'],\n 'HTC IncredibleS S710e': ['HTC', 'Incredible S'],\n 'HTC Incredible S with Beats Audio': ['HTC', 'Incredible S'],\n 'HTC Vivo': ['HTC', 'Incredible S'],\n 'HTC Innovation': ['HTC', 'Innovation'],\n 'HTC Inspire 4G': ['HTC', 'Inspire 4G'],\n 'HTC HD7 Inspire 4G For Vodafone': ['HTC', 'Inspire 4G'],\n 'HTC P715a': ['HTC', 'Jetstream', 'tablet'],\n 'HTC Legend': ['HTC', 'Legend'],\n 'HTC Magic': ['HTC', 'Magic'],\n 'HTC Sapphire': ['HTC', 'Magic'],\n 'HTC Lexikon': ['HTC', 'Merge'],\n 'HTC One S': ['HTC', 'One S'],\n 'HTC Z520e': ['HTC', 'One S'],\n 'HTC One V': ['HTC', 'One V'],\n 'HTC T320e': ['HTC', 'One V'],\n 'HTC One X': ['HTC', 'One X'],\n 'HTC S720e': ['HTC', 'One X'],\n 'HTC Endeavour-LS': ['HTC', 'One X'],\n 'HTC One XL': ['HTC', 'One XL'],\n 'HTC X710a': ['HTC', 'Raider 4G'],\n 'HTC Raider': ['HTC', 'Raider 4G'],\n 'HTC Raider X710e': ['HTC', 'Raider 4G'],\n 'HTC Raider X710s': ['HTC', 'Raider 4G'],\n 'HTC Raider 4G X710e': ['HTC', 'Raider 4G'],\n 'HTC PH39100': ['HTC', 'Raider 4G'],\n 'HTC Holiday': ['HTC', 'Raider 4G'],\n 'HTC Velocity 4G X710s': ['HTC', 'Raider 4G'],\n 'HTC Rezound': ['HTC', 'Rezound'],\n 'HTC Rhyme S510b': ['HTC', 'Rhyme'],\n 'HTC S510b': ['HTC', 'Rhyme'],\n 'HTC Bliss': ['HTC', 'Rhyme'],\n 'HTC Bliss S510b': ['HTC', 'Rhyme'],\n 'HTC Salsa C510e': ['HTC', 'Salsa'],\n 'HTC C510e': ['HTC', 'Salsa'],\n 'HTC Z710a': ['HTC', 'Sensation'],\n 'HTC Z710e': ['HTC', 'Sensation'],\n 'HTC Z710t': ['HTC', 'Sensation'],\n 'HTC Sensation': ['HTC', 'Sensation'],\n 'HTC Sensation Z710': ['HTC', 'Sensation'],\n 'HTC Sensation Z710a': ['HTC', 'Sensation'],\n 'HTC Sensation Z710e': ['HTC', 'Sensation'],\n 'HTC Sensation Z710E': ['HTC', 'Sensation'],\n 'HTC Sensation Z710e For AT&T': ['HTC', 'Sensation'],\n 'HTC Sensation Z710e with Beats Audio': ['HTC', 'Sensation'],\n 'HTC Sensation with Beats Audio Z710e': ['HTC', 'Sensation'],\n 'HTC Sensation with Beats Audio': ['HTC', 'Sensation'],\n 'HTC Sensation Taste': ['HTC', 'Sensation'],\n 'HTC Pyramid': ['HTC', 'Sensation'],\n 'HTC Pyramid Z710a': ['HTC', 'Sensation'],\n 'HTC Pyramid Z710e': ['HTC', 'Sensation'],\n 'HTC Sensation 4G': ['HTC', 'Sensation'],\n 'HTC Sensation 4G with Beats Audio': ['HTC', 'Sensation'],\n 'HTC Sensation G14': ['HTC', 'Sensation'],\n 'HTC Sensation G14 for AT&T': ['HTC', 'Sensation'],\n 'HTC G14 sensation': ['HTC', 'Sensation'],\n 'HTC Z715e': ['HTC', 'Sensation XE'],\n 'HTC Sensation Z715e': ['HTC', 'Sensation XE'],\n 'HTC SensationXE Beats': ['HTC', 'Sensation XE'],\n 'HTC SensationXE Beats Z715a': ['HTC', 'Sensation XE'],\n 'HTC SensationXE Beats Z715e': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE Z715e': ['HTC', 'Sensation XE'],\n 'HTC SensationXE Z715e': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE Beats': ['HTC', 'Sensation XE'],\n 'HTC SensationXE with Beats Audio': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE with Beats Audio': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE with Beats Audio Z715a': ['HTC', 'Sensation XE'],\n 'HTC Sensation Juredroid XE Beats Audio': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE with Beats Audio Z715e': ['HTC', 'Sensation XE'],\n 'HTC Sensation XE With Beats Audio Z715e': ['HTC', 'Sensation XE'],\n 'HTC Sensation 4G XE with Beats Audio': ['HTC', 'Sensation XE'],\n 'HTC Sensation with Beats Audio Z715e': ['HTC', 'Sensation XE'],\n 'HTC X315E': ['HTC', 'Sensation XL'],\n 'HTC SensationXL Beats X315b': ['HTC', 'Sensation XL'],\n 'HTC SensationXL Beats X315e': ['HTC', 'Sensation XL'],\n 'HTC Sensation XL with Beats Audio X315b': ['HTC', 'Sensation XL'],\n 'HTC Sensation XL with Beats Audio X315e': ['HTC', 'Sensation XL'],\n 'HTC Runnymede': ['HTC', 'Sensation XL'],\n 'HTC G21': ['HTC', 'Sensation XL'],\n 'HTC PH06130': ['HTC', 'Status'],\n 'HTC Status': ['HTC', 'Status'],\n 'HTC Tattoo': ['HTC', 'Tattoo'],\n 'HTC TATTOO A3288': ['HTC', 'Tattoo'],\n 'HTC click': ['HTC', 'Tattoo'],\n 'HTC X310e': ['HTC', 'Titan'],\n 'HTC T7373': ['HTC', 'Touch Pro II'],\n 'HTC ThunderBolt': ['HTC', 'ThunderBolt'],\n 'HTC Mecha': ['HTC', 'ThunderBolt'],\n 'HTC Velocity 4G': ['HTC', 'Velocity 4G'],\n 'HTC Wildfire': ['HTC', 'Wildfire'],\n 'HTC Wildfire A3333': ['HTC', 'Wildfire'],\n 'HTC A3366': ['HTC', 'Wildfire'],\n 'HTC A3380': ['HTC', 'Wildfire'],\n 'HTC WildfireS': ['HTC', 'Wildfire S'],\n 'HTC Wildfire S': ['HTC', 'Wildfire S'],\n 'Htc Wildfire s': ['HTC', 'Wildfire S'],\n 'HTC Wildfire S A510e': ['HTC', 'Wildfire S'],\n 'HTC Wildfire S A510b': ['HTC', 'Wildfire S'],\n 'HTC WildfireS A510e': ['HTC', 'Wildfire S'],\n 'HTC WildfireS A510b': ['HTC', 'Wildfire S'],\n 'htc wildfire s a510e': ['HTC', 'Wildfire S'],\n 'HTC Wildfire S A515c': ['HTC', 'Wildfire S'],\n 'HTC A510a': ['HTC', 'Wildfire S'],\n 'HTC A510e': ['HTC', 'Wildfire S'],\n 'HTC A510c': ['HTC', 'Wildfire S'],\n 'HTCX06HT': ['HTC', 'Desire'],\n 'HTC A6390': ['HTC', 'A6390'],\n 'HTC A8180': ['HTC', 'A8180'],\n 'HTC PG762': ['HTC', 'PG762'],\n 'HTC S715e': ['HTC', 'S715e'],\n 'HTC S720t': ['HTC', 'S720t'],\n 'HTC Z510d': ['HTC', 'Z510d'],\n 'HTC Z560e': ['HTC', 'Z560e'],\n 'HTC VLE U': ['HTC', 'One S'],\n 'HTC VLE#U': ['HTC', 'One S'],\n 'HTC VIE U': ['HTC', 'One S'],\n 'HTC EVA UL': ['HTC', 'One V'],\n 'HTC ENR U': ['HTC', 'One X'],\n 'ENR U': ['HTC', 'One X'],\n 'EndeavorU': ['HTC', 'One X'],\n 'Liberty': ['HTC', 'Aria'],\n 'Desire': ['HTC', 'Desire'],\n 'Desire A8181': ['HTC', 'Desire'],\n 'desire hd': ['HTC', 'Desire HD'],\n 'Desire HD': ['HTC', 'Desire HD'],\n 'Dedire HD': ['HTC', 'Desire HD'],\n 'Desire Hd (ace)': ['HTC', 'Desire HD'],\n 'Desire S': ['HTC', 'Desire S'],\n 'DesireS': ['HTC', 'Desire S'],\n 'Desire Saga': ['HTC', 'Desire S'],\n 'Desire Z': ['HTC', 'Desire Z'],\n 'Dream': ['HTC', 'Dream'],\n 'Droid Incredible': ['HTC', 'Droid Incredible'],\n 'EVO': ['HTC', 'EVO'],\n 'Evo HD2': ['HTC', 'EVO HD'],\n 'Evo 3D Beats X515m': ['HTC', 'EVO 3D'],\n 'Evo 3D GSM': ['HTC', 'EVO 3D'],\n 'EVO 3D X515m': ['HTC', 'EVO 3D'],\n 'EVO3D X515m': ['HTC', 'EVO 3D'],\n 'Evo 4G': ['HTC', 'EVO 4G'],\n 'EVO 4G': ['HTC', 'EVO 4G'],\n 'photon': ['HTC', 'HD mini'],\n 'GinDream\\/GinMagic': ['HTC', 'Dream'],\n 'HD2': ['HTC', 'HD2'],\n 'HD7 Pro': ['HTC', 'HD7 Pro'],\n 'Hero': ['HTC', 'Hero'],\n 'HERO CDMA': ['HTC', 'Hero'],\n 'HERO200': ['HTC', 'Hero 200'],\n 'Incredible': ['HTC', 'Droid Incredible'],\n 'Incredible 2': ['HTC', 'Droid Incredible 2'],\n 'Incredible S': ['HTC', 'Incredible S'],\n 'IncredibleS S710e': ['HTC', 'Incredible S'],\n 'IncredibleS': ['HTC', 'Incredible S'],\n 'Inspire HD': ['HTC', 'Inspire 4G'],\n 'Inspire 4G': ['HTC', 'Inspire 4G'],\n 'Legend': ['HTC', 'Legend'],\n 'NexusHD2': ['HTC', 'HD2'],\n 'Nexus HD2': ['HTC', 'HD2'],\n 'Docomo HT-03A': ['HTC', 'Magic'],\n 'MIUI.us Sensation 4G': ['HTC', 'Sensation 4G'],\n 'SiRF Dream': ['HTC', 'Dream'],\n 'Pyramid': ['HTC', 'Sensation'],\n 'Sensation': ['HTC', 'Sensation'],\n 'Sensation Z710e': ['HTC', 'Sensation'],\n 'Sensation 4G': ['HTC', 'Sensation'],\n 'Sensation 4g': ['HTC', 'Sensation'],\n 'TripNiCE Pyramid': ['HTC', 'Sensation'],\n 'SensationXE Beats Z715e': ['HTC', 'Sensation XE'],\n 'SensationXL Beats X315e': ['HTC', 'Sensation XL'],\n 'Click': ['HTC', 'Tattoo'],\n 'Wildfire': ['HTC', 'Wildfire'],\n 'Wildfire S': ['HTC', 'Wildfire S'],\n 'Wildfire S A510e': ['HTC', 'Wildfire S'],\n 'Sprint APX515CKT': ['HTC', 'EVO 3D'],\n 'Sprint APA9292KT': ['HTC', 'EVO 4G'],\n 'Sprint APA7373KT': ['HTC', 'EVO Shift 4G'],\n 'Sprint APC715CKT': ['HTC', 'EVO Design 4G'],\n 'A3380': ['HTC', 'Wildfire'],\n 'A6277': ['HTC', 'Hero'],\n 'a7272': ['HTC', 'Desire Z'],\n 'A7272+(HTC DesireZ)': ['HTC', 'Desire Z'],\n 'S31HT': ['HTC', 'Aria'],\n 'S710d': ['HTC', 'Droid Incredible 2'],\n 'S710D': ['HTC', 'Droid Incredible 2'],\n 'X06HT': ['HTC', 'Desire'],\n '001HT': ['HTC', 'Desire HD'],\n 'X325a': ['HTC', 'One X'],\n 'Z520m': ['HTC', 'One S'],\n 'Z710': ['HTC', 'Sensation'],\n 'Z710e': ['HTC', 'Sensation'],\n 'T9199h': ['HTC', 'T9199h'],\n 'HTC S610d': ['HTC', 'S610d'],\n 'ADR6200': ['HTC', 'Droid Eris'],\n 'ADR6300': ['HTC', 'Droid Incredible'],\n 'ADR6325VW': ['HTC', 'Merge'],\n 'ADR6330VW': ['HTC', 'Rhyme'],\n 'ADR6350': ['HTC', 'Droid Incredible 2'],\n 'ADR6400L': ['HTC', 'Thunderbolt 4G'],\n 'ADR6400L 4G': ['HTC', 'Thunderbolt 4G'],\n 'ADR6410LVW 4G': ['HTC', 'Fireball'],\n 'ADR6425LVW': ['HTC', 'Rezound'],\n 'ADR6425LVW 4G': ['HTC', 'Rezound'],\n 'Coquettish Red': ['HTC', 'Rezound'],\n 'PB99400': ['HTC', 'Droid Incredible'],\n 'pcdadr6350': ['HTC', 'Droid Incredible 2'],\n 'PC36100': ['HTC', 'EVO 4G'],\n 'PG06100': ['HTC', 'EVO Shift 4G'],\n 'PG41200': ['HTC', 'EVO View 4G', 'tablet'],\n 'PG86100': ['HTC', 'EVO 3D'],\n 'PG8610000': ['HTC', 'EVO 3D'],\n 'PH44100': ['HTC', 'EVO Design 4G'],\n 'PJ83100': ['HTC', 'One X'],\n 'ISW11HT': ['HTC', 'EVO 4G'],\n 'ISW12HT': ['HTC', 'EVO 3D'],\n 'ISW13HT': ['HTC', 'J'],\n 'USCCADR6275US Carrier ID 45': ['HTC', 'Desire'],\n 'USCCADR6285US': ['HTC', 'Hero S'],\n 'USCCADR6325US Carrier ID 45': ['HTC', 'Merge'],\n 'MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n 'Huawei MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n 'HUAWEI MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n 'Huawei S7-312u': ['Huawei', 'MediaPad', 'tablet'],\n 'MediaPad 10 FHD': ['Huawei', 'MediaPad', 'tablet'],\n 'Huawei C8500': ['Huawei', 'C8500'],\n 'Huawei C8500S': ['Huawei', 'C8500'],\n 'Huawei C8600': ['Huawei', 'C8600'],\n 'Huawei C8650': ['Huawei', 'C8650'],\n 'Huawei C8650+': ['Huawei', 'C8650'],\n 'Huawei C8800': ['Huawei', 'IDEOS X5'],\n 'Huawei C8810': ['Huawei', 'Ascend G300'],\n 'Huawei C8812': ['Huawei', 'Ascend C8812'],\n 'Huawei C8812E': ['Huawei', 'Ascend C8812'],\n 'Huawei C8825D': ['Huawei', 'Ascend C8825D'],\n 'Huawei C8860E': ['Huawei', 'Honor'],\n 'Huawei M835': ['Huawei', 'M835'],\n 'Huawei M860': ['Huawei', 'Ascend'],\n 'Huawei M921': ['Huawei', 'M921'],\n 'Huawei S8520': ['Huawei', 'S8520'],\n 'Huawei S8600': ['Huawei', 'S8600'],\n 'Huawei T8300': ['Huawei', 'T8300'],\n 'Huawei T8600': ['Huawei', 'T8600'],\n 'Huawei T8830': ['Huawei', 'T8830'],\n 'T8830': ['Huawei', 'T8830'],\n 'T8620': ['Huawei', 'T8620'],\n 'Huawei T8828': ['Huawei', 'T8828'],\n 'Huawei U8220': ['Huawei', 'U8220'],\n 'Huawei u8500': ['Huawei', 'IDEOS X2'],\n 'Huawei U8815': ['Huawei', 'Ascend G300'],\n 'Huawei U8825D': ['Huawei', 'Ascend G330D'],\n 'Huawei U8850': ['Huawei', 'Vision'],\n 'Huawei U8652': ['Huawei', 'Sonic'],\n 'Huawei U8800-51': ['Huawei', 'IDEOS X5'],\n 'Huawei U8818': ['Huawei', 'Ascend G300'],\n 'Huawei U9000': ['Huawei', 'Ascend X'],\n 'Huawei IDEOS U8500': ['Huawei', 'IDEOS X2'],\n 'Huawei IDEOS U8650': ['Huawei', 'Sonic'],\n 'Huawei IDEOS X3': ['Huawei', 'IDEOS X3'],\n 'Huawei Ideos X5': ['Huawei', 'IDEOS X5'],\n 'Huawei Ideos X5 1.12.9(ret4rt)': ['Huawei', 'IDEOS X5'],\n 'Huawei SONIC': ['Huawei', 'Sonic'],\n 'Huawei 8100-9': ['Huawei', 'U8100'],\n 'FUSIONideos': ['Huawei', 'IDEOS'],\n 'Gnappo Ideos': ['Huawei', 'IDEOS'],\n 'Ideos': ['Huawei', 'IDEOS'],\n 'IDEOS X5': ['Huawei', 'IDEOS X5'],\n 'Ideos S7': ['Huawei', 'IDEOS S7', 'tablet'],\n 'IDEOS S7': ['Huawei', 'IDEOS S7', 'tablet'],\n 'IDEOS S7 Slim': ['Huawei', 'IDEOS S7', 'tablet'],\n 'Huawei S7': ['Huawei', 'IDEOS S7', 'tablet'],\n 'SONIC': ['Huawei', 'Sonic'],\n 'Kyivstar Aqua': ['Huawei', 'Sonic'],\n 'Lucky Ultra Sonic U8650': ['Huawei', 'Sonic'],\n 'Turkcell T20': ['Huawei', 'Sonic'],\n 'MTC 950': ['Huawei', 'U8160'],\n 'MTC 955': ['Huawei', 'Sonic'],\n 'MTC Evo': ['Huawei', 'C8500'],\n 'MTC Android': ['Huawei', 'U8110'],\n 'S31HW': ['Huawei', 'Pocket WiFi S'],\n 'S41HW': ['Huawei', 'Pocket WiFi S II'],\n '007HW': ['Huawei', 'Vision'],\n 'UM840': ['Huawei', 'Evolution'],\n 'M860': ['Huawei', 'Ascend'],\n 'M865': ['Huawei', 'Ascend II'],\n 'M886': ['Huawei', 'Glory'],\n 'C8150': ['Huawei', 'IDEOS'],\n 'c8500': ['Huawei', 'C8500'],\n 'C8500': ['Huawei', 'C8500'],\n 'C8500S': ['Huawei', 'C8500'],\n 'C8600': ['Huawei', 'C8600'],\n 'c8650': ['Huawei', 'C8650'],\n 'C8650': ['Huawei', 'C8650'],\n 'c8800': ['Huawei', 'C8800'],\n 'C8800': ['Huawei', 'C8800'],\n 'c8810': ['Huawei', 'Ascend G300C'],\n 'C8812': ['Huawei', 'Ascend C8812'],\n 'S8600': ['Huawei', 'S8600'],\n 'U8100': ['Huawei', 'U8100'],\n 'U8110': ['Huawei', 'U8110'],\n 'u8120': ['Huawei', 'U8120'],\n 'U8120': ['Huawei', 'U8120'],\n 'U8180': ['Huawei', 'IDEOS X1'],\n 'U8220': ['Huawei', 'Pulse'],\n 'U8300': ['Huawei', 'U8300'],\n 'U8350': ['Huawei', 'Boulder'],\n 'U8150': ['Huawei', 'IDEOS'],\n 'U8160': ['Huawei', 'U8160'],\n 'U8500': ['Huawei', 'IDEOS X2'],\n 'U8500 HiQQ': ['Huawei', 'U8500 HiQQ Edition'],\n 'U8510': ['Huawei', 'IDEOS X3'],\n 'u8650': ['Huawei', 'Sonic'],\n 'U8650': ['Huawei', 'Sonic'],\n 'U8650-1': ['Huawei', 'Sonic'],\n 'U8660': ['Huawei', 'Sonic'],\n 'u8800': ['Huawei', 'IDEOS X5'],\n 'U8800': ['Huawei', 'IDEOS X5'],\n 'U8800+': ['Huawei', 'IDEOS X5'],\n 'U8800X': ['Huawei', 'IDEOS X5'],\n 'U8800pro': ['Huawei', 'IDEOS X5 Pro'],\n 'U8800PRO': ['Huawei', 'IDEOS X5 Pro'],\n 'U8800Pro': ['Huawei', 'IDEOS X5 Pro'],\n 'u8800pro': ['Huawei', 'IDEOS X5 Pro'],\n 'U8800 Pro': ['Huawei', 'IDEOS X5 Pro'],\n 'U8818': ['Huawei', 'Ascend G300'],\n 'U8850': ['Huawei', 'Vision'],\n 'u8860': ['Huawei', 'Honor'],\n 'U8860': ['Huawei', 'Honor'],\n 'U9000': ['Huawei', 'Ascend X'],\n 'U9200': ['Huawei', 'Ascend P1'],\n 'U9200-1': ['Huawei', 'Ascend P1'],\n 'U9500': ['Huawei', 'Ascend D1'],\n 'U9501L': ['Huawei', 'Ascend D LTE'],\n 'U9510': ['Huawei', 'Ascend D quad'],\n 'U9510E': ['Huawei', 'Ascend D quad'],\n 'Comet': ['Huawei', 'Comet'],\n 'GS02': ['Huawei', 'Honor'],\n 'GS03': ['Huawei', 'Ascend P1'],\n 'DroniX-0.5': ['Huawei', 'U8180'],\n 'MTS-SP101': ['Huawei', 'C8511'],\n 'TSP21': ['Huawei', 'U8110'],\n 'HYUNDAI H6': ['Hyundai', 'Storm H6'],\n 'iBall Slide i7011': ['iBall', 'Slide i7011'],\n 'NetTAB RUNE': ['IconBit', 'NetTab Rune', 'tablet'],\n 'D70W': ['Icoo', 'D70W', 'tablet'],\n 'D80': ['Icoo', 'D80', 'tablet'],\n 'INFOBAR A01': ['iida', 'INFOBAR A01'],\n 'M009F': ['Infotmic', 'M009F'],\n 'AZ210A': ['Intel', 'AZ210A'],\n 'AZ210B': ['Intel', 'AZ210B'],\n 'AZ510': ['Intel', 'AZ510'],\n 'greenridge': ['Intel', 'Green Ridge', 'tablet'],\n 'INQ Cloud Touch': ['INQ', 'Cloud Touch'],\n 'ILT-MX100': ['iRiver', 'Tab', 'tablet'],\n 'IVIO_DE38': ['Ivio', 'DE38'],\n 'JY-G2': ['Jiayu', 'G2'],\n 'JXD S601WIFI': ['JXD', 'S601 WIFI', 'media'],\n 'A2': ['KakaTech', 'A2'],\n 'D91': ['KK', 'D91', 'tablet'],\n 'K080': ['Kobo', 'K080', 'ereader'],\n 'A106': ['koobee', 'A160'],\n 'KPT A9': ['KPT', 'A9'],\n 'EV-S100': ['Kttech', 'Take EV-S100'],\n 'KM-S120': ['Kttech', 'Take 2 KM-S120'],\n 'KM-S200': ['TAKE', 'Janus KM-S200'],\n 'KM-S220': ['Kttech', 'Take Tachy KM-S220'],\n 'Kyobo mirasol eReader': ['Kyobo', 'eReader', 'ereader'],\n 'ISW11K': ['Kyocera', 'Digno'],\n 'JC-KSP8000': ['Kyocera', 'Echo'],\n 'KSP8000': ['Kyocera', 'Echo'],\n 'Zio': ['Kyocera', 'Zio'],\n 'C5155': ['Kyocera', 'C5155'],\n 'C5170': ['Kyocera', 'C5170'],\n 'M9300': ['Kyocera', 'M9300'],\n 'E800': ['K-Touch', 'E800'],\n 'W606': ['K-Touch', 'W606'],\n 'K-Touch T619': ['K-Touch', 'T619'],\n 'K-Touch W619': ['K-Touch', 'W619'],\n 'K-Touch W650': ['K-Touch', 'W650'],\n 'W700': ['K-Touch', 'W700'],\n 'W800': ['K-Touch', 'W800'],\n 'W806': ['K-Touch', 'W806'],\n 'W808': ['K-Touch', 'W808'],\n 'W810': ['K-Touch', 'W810'],\n 'X900': ['Lava', 'XOLO X900'],\n 'Lenovo A798t': ['Lenovo', 'A798t'],\n 'LENOVO-Lenovo-A288t': ['Lenovo', 'LePhone A288'],\n 'ThinkPad Tablet': ['Lenovo', 'ThinkPad Tablet', 'tablet'],\n 'K1': ['Lenovo', 'IdeaPad K1', 'tablet'],\n 'Ideapad S10-3T': ['Lenovo', 'IdeaPad S10-3T', 'tablet'],\n 'S2005A-H': ['Lenovo', 'S2005A'],\n 'IdeaTab S2007A-D': ['Lenovo', 'IdeaTab S2007A', 'tablet'],\n 'IdeaTabV2007A': ['Lenovo', 'IdeaTab V2007A', 'tablet'],\n 'IdeaTabV2007A-D-I': ['Lenovo', 'IdeaTab V2007A', 'tablet'],\n 'IdeaTabV2010A': ['Lenovo', 'IdeaTab V2010A', 'tablet'],\n 'IdeaTab A2107A-H': ['Lenovo', 'IdeaTab V2107A', 'tablet'],\n 'A1 07': ['Lenovo', 'LePad', 'tablet'],\n 'lepad 001b': ['Lenovo', 'LePad', 'tablet'],\n 'lepad 001n': ['Lenovo', 'LePad', 'tablet'],\n '3GC101': ['Lenovo', 'LePhone 3GC101'],\n 'Lenovo 3GC101': ['Lenovo', 'LePhone 3GC101'],\n '3GW100': ['Lenovo', 'LePhone 3GW100'],\n 'Lenovo 3GW100': ['Lenovo', 'LePhone 3GW100'],\n '3GW101': ['Lenovo', 'LePhone 3GW101'],\n 'Lenovo 3GW101': ['Lenovo', 'LePhone 3GW101'],\n 'Lephone 3GW101': ['Lenovo', 'LePhone 3GW101'],\n 'Lenovo A1-32AB0': ['Lenovo', 'LePhone A1-32AB0'],\n 'Lenovo S1-37AH0': ['Lenovo', 'LePhone S1-37AH0'],\n 'S1 37AHO': ['Lenovo', 'LePhone S1-37AH0'],\n 'Lenovo S2-38AH0': ['Lenovo', 'LePhone S2-38AH0'],\n 'Lenovo S2-38AT0': ['Lenovo', 'LePhone S2-38AT0'],\n 'Lenovo A288t': ['Lenovo', 'LePhone A288'],\n 'Lenovo A366t': ['Lenovo', 'LePhone A366'],\n 'Lenovo A390e': ['Lenovo', 'LePhone A390'],\n 'Lenovo A500': ['Lenovo', 'LePhone A500'],\n 'Lenovo A520': ['Lenovo', 'LePhone A520'],\n 'Lenovo A560e': ['Lenovo', 'A560'],\n 'Lenovo A668t': ['Lenovo', 'LePhone A668'],\n 'Lenovo A698t': ['Lenovo', 'LePhone A698'],\n 'Lenovo A750': ['Lenovo', 'LePhone A750'],\n 'Lenovo A780': ['Lenovo', 'LePhone A780'],\n 'Lenovo A789': ['Lenovo', 'LePhone A789'],\n 'Lenovo A790e': ['Lenovo', 'LePhone A790'],\n 'Lenovo P70': ['Lenovo', 'LePhone P70'],\n 'Lenovo P700': ['Lenovo', 'LePhone P700'],\n 'Lenovo S850e': ['Lenovo', 'S850'],\n 'Lenovo S880': ['Lenovo', 'S880'],\n 'Lenovo K860': ['Lenovo', 'K860'],\n 'A30t': ['Lenovo', 'A30t'],\n 'Lenovo A60': ['Lenovo', 'A60'],\n 'Lenovo A65': ['Lenovo', 'A65'],\n 'Lenovo A66t': ['Lenovo', 'A66t'],\n 'Lenovo A68e': ['Lenovo', 'A68e'],\n 'Lenovo K800': ['Lenovo', 'K800'],\n 'IDEA TV T100': ['Lenovo', 'IDEA TV', 'television'],\n 'IDEA TV K91': ['Lenovo', 'IDEA TV', 'television'],\n 'TC970': ['Le Pan', 'TC970', 'tablet'],\n 'LePanII': ['Le Pan', 'II', 'tablet'],\n 'LG-C555': ['LG', 'Optimus Chat'],\n 'LG-C555-parrot': ['LG', 'Optimus Chat'],\n 'LG-C660h': ['LG', 'Optimus Pro'],\n 'LG-C729': ['LG', 'DoublePlay'],\n 'LG-C800G': ['LG', 'Eclypse'],\n 'LG-CX670': ['LG', 'Optimus 3G'],\n 'LG-E400': ['LG', 'Optimus L3'],\n 'LG-E400f': ['LG', 'Optimus L3'],\n 'LG-E510': ['LG', 'Optimus Hub'],\n 'LG-E510f': ['LG', 'Optimus Hub'],\n 'LG-E510g': ['LG', 'Optimus Hub'],\n 'LG-E610': ['LG', 'Optimus L5'],\n 'LG-E612': ['LG', 'Optimus L5'],\n 'LG-E612g': ['LG', 'Optimus L5'],\n 'LG-E615F': ['LG', 'E615'],\n 'LG-E617G': ['LG', 'E617'],\n 'LG-E720': ['LG', 'Optimus Chic'],\n 'LG-E720b': ['LG', 'Optimus Chic'],\n 'LG-E730': ['LG', 'Optimus Sol'],\n 'LG-E970': ['LG', 'Shine'],\n 'LG-F100L': ['LG', 'Optimus Vu'],\n 'LG-F100S': ['LG', 'Optimus Vu'],\n 'LG-F120K': ['LG', 'Optimus LTE Tag'],\n 'LG-F120L': ['LG', 'Optimus LTE Tag'],\n 'LG-F120S': ['LG', 'Optimus LTE Tag'],\n 'LG-F160K': ['LG', 'Optimus LTE II'],\n 'LG-F160L': ['LG', 'Optimus LTE II'],\n 'LG-F160S': ['LG', 'Optimus LTE II'],\n 'LG-F180L': ['LG', 'F180L'],\n 'LG-GT540': ['LG', 'Optimus'],\n 'LG-GT540f': ['LG', 'Optimus'],\n 'LG-GT540 Swift': ['LG', 'Optimus'],\n 'LG-GW620': ['LG', 'GW620'],\n 'LG-KH5200': ['LG', 'Andro-1'],\n 'LG-KU3700': ['LG', 'Optimus One'],\n 'LG-KU5400': ['LG', 'PRADA 3.0'],\n 'LG-KU5900': ['LG', 'Optimus Black'],\n 'LG-L40G': ['LG', 'L40G'],\n 'LG-LG855': ['LG', 'Marquee'],\n 'LG-LS670': ['LG', 'Optimus S'],\n 'LG-LS696': ['LG', 'Optimus Elite'],\n 'LG-LS840': ['LG', 'Viper 4G'],\n 'LG-LS855': ['LG', 'Marquee'],\n 'LG-LS860': ['LG', '\\'Cayenne\\''],\n 'LG-LS970': ['LG', '\\'Eclipse\\''],\n 'LG-LU3000': ['LG', 'Optimus Mach'],\n 'LG-LU3100': ['LG', 'Optimus Chic'],\n 'LG-LU3700': ['LG', 'Optimus One'],\n 'LG-LU5400': ['LG', 'PRADA 3.0'],\n 'LG-LU6200': ['LG', 'Optimus Q2'],\n 'LG-lu6200': ['LG', 'Optimus Q2'],\n 'LG-LU6500': ['LG', 'Optimus Note'],\n 'LG-LU6800': ['LG', 'Optimus Big'],\n 'LG-LU8300': ['LG', 'Optimus Pad LTE'],\n 'LG-LW690': ['LG', 'Optimus C'],\n 'LG-LW770': ['LG', 'LW770'],\n 'LG-MS690': ['LG', 'Optimus M'],\n 'LG-MS770': ['LG', 'MS770'],\n 'LG-MS840': ['LG', 'Connect 4G'],\n 'LG-MS910': ['LG', 'Esteem'],\n 'LG-MS695': ['LG', 'Optimus M+'],\n 'LG P350': ['LG', 'Optimus Me'],\n 'LG-P350': ['LG', 'Optimus Me'],\n 'LG-P350f': ['LG', 'Optimus Me'],\n 'LG-P350g': ['LG', 'Optimus Me'],\n 'LG-P355': ['LG', 'P355'],\n 'LG-P500': ['LG', 'Optimus One'],\n 'LG-P500h': ['LG', 'Optimus One'],\n 'LG-P500h-parrot': ['LG', 'Optimus One'],\n 'LG-P503': ['LG', 'Optimus One'],\n 'LG-P504': ['LG', 'Optimus One'],\n 'LG-P505': ['LG', 'Phoenix'],\n 'LG-P505R': ['LG', 'Phoenix'],\n 'LG-P506': ['LG', 'Thrive'],\n 'LG-P509': ['LG', 'Optimus T'],\n 'LG-P690': ['LG', 'Optimus Net'],\n 'LG-P693': ['LG', 'P693'],\n 'LG-P698': ['LG', 'Optimus Net'],\n 'LG-P698f': ['LG', 'Optimus Net'],\n 'LG-P700': ['LG', 'Optimus L7'],\n 'LG-P705': ['LG', 'Optimus L7'],\n 'LG-P705f': ['LG', 'Optimus L7'],\n 'LG-P705g': ['LG', 'Optimus L7'],\n 'LG-P708g': ['LG', 'P708'],\n 'LG-P720': ['LG', 'Optimus Chic'],\n 'LG-P720h': ['LG', 'Optimus Chic'],\n 'LG-P725': ['LG', 'Optimus 3D Max'],\n 'LG-P760': ['LG', 'P760'],\n 'LG-P769': ['LG', 'P769'],\n 'LG-P860': ['LG', 'P860'],\n 'LG-P870': ['LG', 'P870'],\n 'LG-P870F': ['LG', 'P870'],\n 'LG-P880': ['LG', 'X3'],\n 'LG-P880g': ['LG', 'X3'],\n 'LG-P895': ['LG', 'P895'],\n 'LG-P920': ['LG', 'Optimus 3D'],\n 'LG-P920h': ['LG', 'Optimus 3D'],\n 'LG-P925': ['LG', 'Thrill'],\n 'LG-P925g': ['LG', 'Thrill'],\n 'LG-P930': ['LG', 'Nitro HD'],\n 'LG-P936': ['LG', 'Optimus LTE'],\n 'LG-P940': ['LG', 'PRADA 3.0'],\n 'LG-P970': ['LG', 'Optimus Black'],\n 'LG-P970h': ['LG', 'Optimus Black'],\n 'LG-P990': ['LG', 'Optimus 2X Speed'],\n 'LG-P990h': ['LG', 'Optimus 2X Speed'],\n 'LG-P990hN': ['LG', 'Optimus 2X Speed'],\n 'LG-P990H': ['LG', 'Optimus 2X Speed'],\n 'LG-P993': ['LG', 'Optimus 2X'],\n 'LG-SU540': ['LG', 'PRADA 3.0'],\n 'LG-SU640': ['LG', 'Optimus LTE'],\n 'LG-SU660': ['LG', 'Optimus 2X'],\n 'LG-SU760': ['LG', 'Optimus 3D'],\n 'LG-SU760-Kust': ['LG', 'Optimus 3D'],\n 'LG-SU870': ['LG', 'Optimus 3D Cube'],\n 'LG-SU880': ['LG', 'Optimus EX'],\n 'LG-US670': ['LG', 'Optimus U'],\n 'LG-US730': ['LG', 'US730'],\n 'LG-V900': ['LG', 'Optimus Pad', 'tablet'],\n 'LG-V905R': ['LG', 'Optimus G-Slate', 'tablet'],\n 'LG-V909': ['LG', 'Optimus G-Slate', 'tablet'],\n 'LG-VM670': ['LG', 'Optimus V'],\n 'LG-VM696': ['LG', 'Optimus Elite'],\n 'LG-VM701': ['LG', 'Optimus Slider'],\n 'LG-VS660': ['LG', 'Vortex'],\n 'LG-VS700': ['LG', 'Enlighten'],\n 'LG-VS740': ['LG', 'Ally'],\n 'LG-VS840': ['LG', 'Connect 4G'],\n 'LG-VS910': ['LG', 'Revolution'],\n 'lgp-970': ['LG', 'Optimus Black'],\n 'E900': ['LG', 'Optimus 7'],\n 'GT540': ['LG', 'Optimus GT540'],\n 'GW620': ['LG', 'GW620'],\n 'KU9500': ['LG', 'Optimus Z'],\n 'LGC660': ['LG', 'Optimus Pro'],\n 'LGL45C': ['LG', 'Optimus Net'],\n 'LGL55C': ['LG', 'Optimus Q'],\n 'LU2300': ['LG', 'Optimus Q'],\n 'LS670': ['LG', 'Optimus S'],\n 'P940': ['LG', 'PRADA 3.0'],\n 'P990': ['LG', 'Optimus 2X Speed'],\n 'USCC-US730': ['LG', 'US730'],\n 'USCC-US760': ['LG', 'Genesis'],\n 'VM670': ['LG', 'Optimus V'],\n 'VS840 4G': ['LG', 'Connect 4G'],\n 'VS900-4G': ['LG', 'VS900'],\n 'VS910 4G': ['LG', 'Revolution 4G'],\n 'VS920 4G': ['LG', 'Spectrum 4G'],\n 'VS930 4G': ['LG', 'VS930'],\n 'VS950 4G': ['LG', 'VS950'],\n 'L-01D': ['LG', 'Optimus LTE'],\n 'L-02D': ['LG', 'PRADA phone'],\n 'L-04C': ['LG', 'Optimus Chat'],\n 'L-05D': ['LG', 'Optimus it'],\n 'L-06C': ['LG', 'Optimus Pad', 'tablet'],\n 'L-06D': ['LG', 'Optimus Vu'],\n 'L-07C': ['LG', 'Optimus Bright'],\n 'LG-Eve': ['LG', 'Eve'],\n 'LG-Optimus One P500': ['LG', 'Optimus One'],\n 'LG-Optimus 2X': ['LG', 'Optimus 2X'],\n 'LG-GT540 Optimus': ['LG', 'Optimus'],\n 'LG-Optimus Black': ['LG', 'Optimus Black'],\n 'Ally': ['LG', 'Ally'],\n 'Optimus': ['LG', 'Optimus'],\n 'Optimus Me': ['LG', 'Optimus Me'],\n 'optimus me p350': ['LG', 'Optimus Me'],\n 'Optimus 2X': ['LG', 'Optimus 2X'],\n 'Optimus 2x': ['LG', 'Optimus 2X'],\n 'IS11LG': ['LG', 'Optimus X'],\n 'Vortex': ['LG', 'Vortex'],\n 'LDK-ICK v1.4': ['LG', 'Esteem'],\n 'T6': ['Malata', 'Zpad T6', 'tablet'],\n 'Malata SMBA1002': ['Malata', 'Tablet SMB-A1002', 'tablet'],\n 'STM712HCZ': ['Mediacom', 'SmartPad 712c', 'tablet'],\n 'STM803HC': ['Mediacom', 'SmartPad 810c', 'tablet'],\n 'Mediacom 810C': ['Mediacom', 'SmartPad 810c', 'tablet'],\n 'Smartpad810c': ['Mediacom', 'SmartPad 810c', 'tablet'],\n 'SmartPad810c': ['Mediacom', 'SmartPad 810c', 'tablet'],\n 'MP810C': ['Mediacom', 'SmartPad 810c', 'tablet'],\n 'MP907C': ['Mediacom', 'SmartPad 907c', 'tablet'],\n 'MTK6516': ['Mediatek', 'MTK6516'],\n 'LIFETAB S9512': ['Medion', 'Lifetab S9512', 'tablet'],\n 'LIFETAB P9514': ['Medion', 'Lifetab P9514', 'tablet'],\n 'MD LIFETAB P9516': ['Medion', 'Lifetab P9516', 'tablet'],\n 'MEDION LIFE P4310': ['Medion', 'Life P4310'],\n 'M8': ['Meizu', 'M8'],\n 'M9': ['Meizu', 'M9'],\n 'M040': ['Meizu', 'M040'],\n 'M9-unlocked': ['Meizu', 'M9'],\n 'meizu m9': ['Meizu', 'M9'],\n 'MEIZU M9': ['Meizu', 'M9'],\n 'MEIZU MX': ['Meizu', 'MX'],\n 'M030': ['Meizu', 'MX M030'],\n 'M031': ['Meizu', 'MX M031'],\n 'M032': ['Meizu', 'MX M032'],\n 'Slidepad': ['Memup', 'Slidepad', 'tablet'],\n 'A45': ['Micromax', 'A45 Punk'],\n 'Micromax A50': ['Micromax', 'A50 Ninja'],\n 'Micromax A60': ['Micromax', 'Andro A60'],\n 'Micromax A70': ['Micromax', 'Andro A70'],\n 'P300(Funbook)': ['Micromax', 'Funbook P300', 'tablet'],\n 'AT735': ['Moinstone', 'AT735', 'tablet'],\n 'A853': ['Motorola', 'Milestone'],\n 'A953': ['Motorola', 'Milestone 2'],\n 'A1680': ['Motorola', 'MOTO A1680'],\n 'ET1': ['Motorola', 'ET1 Enterprise Tablet', 'tablet'],\n 'MB200': ['Motorola', 'CLIQ'],\n 'MB300': ['Motorola', 'BACKFLIP'],\n 'MB501': ['Motorola', 'CLIQ XT'],\n 'MB502': ['Motorola', 'CHARM'],\n 'MB511': ['Motorola', 'FLIPOUT'],\n 'MB520': ['Motorola', 'BRAVO'],\n 'MB525': ['Motorola', 'DEFY'],\n 'MB525+': ['Motorola', 'DEFY'],\n 'MB525 for me': ['Motorola', 'DEFY'],\n 'MB526': ['Motorola', 'DEFY+'],\n 'MB611': ['Motorola', 'CLIQ 2'],\n 'MB612': ['Motorola', 'XPRT'],\n 'MB632': ['Motorola', 'PRO+'],\n 'MB855': ['Motorola', 'PHOTON 4G'],\n 'MB860': ['Motorola', 'ATRIX'],\n 'MB861': ['Motorola', 'ATRIX'],\n 'mb861': ['Motorola', 'ATRIX'],\n 'MB865': ['Motorola', 'ATRIX 2'],\n 'MB870': ['Motorola', 'Droid X2'],\n 'MB886': ['Motorola', 'DINARA'],\n 'ME501': ['Motorola', 'CLIQ XT'],\n 'ME511': ['Motorola', 'FLIPOUT'],\n 'me525': ['Motorola', 'MOTO ME525'],\n 'Me525': ['Motorola', 'MOTO ME525'],\n 'ME525': ['Motorola', 'MOTO ME525'],\n 'ME525+': ['Motorola', 'MOTO ME525'],\n 'ME600': ['Motorola', 'BACKFLIP'],\n 'ME632': ['Motorola', 'PRO+'],\n 'ME722': ['Motorola', 'Milestone 2'],\n 'ME811': ['Motorola', 'Droid X'],\n 'ME860': ['Motorola', 'ATRIX'],\n 'ME863': ['Motorola', 'Milestone 3'],\n 'ME865': ['Motorola', 'ATRIX 2'],\n 'MT620': ['Motorola', 'MOTO MT620'],\n 'MT620t': ['Motorola', 'MOTO MT620'],\n 'MT716': ['Motorola', 'MOTO MT716'],\n 'MT810': ['Motorola', 'MOTO MT810'],\n 'MT870': ['Motorola', 'MOTO MT870'],\n 'MT917': ['Motorola', 'MT917'],\n 'MZ505': ['Motorola', 'XOOM Family Edition', 'tablet'],\n 'MZ600': ['Motorola', 'XOOM 4G LTE', 'tablet'],\n 'MZ601': ['Motorola', 'XOOM 3G', 'tablet'],\n 'MZ602': ['Motorola', 'XOOM 4G LTE', 'tablet'],\n 'MZ603': ['Motorola', 'XOOM 3G', 'tablet'],\n 'MZ604': ['Motorola', 'XOOM WiFi', 'tablet'],\n 'MZ605': ['Motorola', 'XOOM 3G', 'tablet'],\n 'MZ606': ['Motorola', 'XOOM WiFi', 'tablet'],\n 'MZ607': ['Motorola', 'XOOM 2 WiFi Media Edition', 'tablet'],\n 'MZ609': ['Motorola', 'Droid XYBOARD 8.2', 'tablet'],\n 'MZ609 4G': ['Motorola', 'Droid XYBOARD 8.2', 'tablet'],\n 'MZ615': ['Motorola', 'XOOM 2 WiFi', 'tablet'],\n 'MZ617': ['Motorola', 'Droid XYBOARD 10.1', 'tablet'],\n 'MZ617 4G': ['Motorola', 'Droid XYBOARD 10.1', 'tablet'],\n 'WX435': ['Motorola', 'TRIUMPH WX435'],\n 'WX445': ['Motorola', 'CITRUS WX445'],\n 'XT300': ['Motorola', 'SPICE'],\n 'XT301': ['Motorola', 'MOTO XT301'],\n 'XT311': ['Motorola', 'FIRE'],\n 'XT316': ['Motorola', 'MOTO XT316'],\n 'XT319': ['Motorola', 'MOTO XT319'],\n 'XT390': ['Motorola', 'MOTO XT390'],\n 'XT320': ['Motorola', 'DEFY Mini'],\n 'XT321': ['Motorola', 'DEFY Mini'],\n 'XT500': ['Motorola', 'MOTO XT500'],\n 'xt-500': ['Motorola', 'MOTO XT500'],\n 'XT502': ['Motorola', 'QUENCH XT5'],\n 'XT530': ['Motorola', 'FIRE XT'],\n 'XT531': ['Motorola', 'FIRE XT'],\n 'XT532': ['Motorola', 'XT532'],\n 'XT535': ['Motorola', 'DEFY'],\n 'XT550': ['Motorola', 'XT550'],\n 'XT556': ['Motorola', 'XT556'],\n 'XT603': ['Motorola', 'ADMIRAL'],\n 'XT610': ['Motorola', 'Droid Pro'],\n 'XT615': ['Motorola', 'MOTO XT615'],\n 'XT626': ['Motorola', 'MOTO XT626'],\n 'XT681': ['Motorola', 'MOTO XT681'],\n 'XT682': ['Motorola', 'Droid 3'],\n 'XT685': ['Motorola', 'MOTO XT685'],\n 'XT687': ['Motorola', 'ATRIX TV'],\n 'XT701': ['Motorola', 'XT701'],\n 'XT702': ['Motorola', 'MOTO XT702'],\n 'XT711': ['Motorola', 'MOTO XT711'],\n 'XT720': ['Motorola', 'Milestone'],\n 'XT875': ['Motorola', 'Droid Bionic'],\n 'XT800': ['Motorola', 'MOTO XT800'],\n 'XT800+': ['Motorola', 'MOTO XT800'],\n 'XT800W': ['Motorola', 'MOTO Glam'],\n 'XT806': ['Motorola', 'MOTO XT806'],\n 'XT860': ['Motorola', 'Milestone 3'],\n 'XT862': ['Motorola', 'Droid 3'],\n 'XT882': ['Motorola', 'MOTO XT882'],\n 'XT883': ['Motorola', 'Milestone 3'],\n 'XT889': ['Motorola', 'XT889'],\n 'XT897': ['Motorola', 'Droid 4'],\n 'XT901': ['Motorola', 'RAZR'],\n 'XT910': ['Motorola', 'RAZR'],\n 'XT910K': ['Motorola', 'RAZR'],\n 'XT910S': ['Motorola', 'RAZR'],\n 'XT910 4G': ['Motorola', 'RAZR'],\n 'XT912': ['Motorola', 'Droid RAZR'],\n 'XT923': ['Motorola', 'Droid RAZR HD'],\n 'XT925': ['Motorola', 'Droid RAZR HD'],\n 'XT926': ['Motorola', 'Droid RAZR'],\n 'XT926 4G': ['Motorola', 'Droid RAZR'],\n 'XT928': ['Motorola', 'XT928'],\n 'Atrix 2': ['Motorola', 'ATRIX 2'],\n 'Atrix 4g': ['Motorola', 'ATRIX 4G'],\n 'Atrix 4G': ['Motorola', 'ATRIX 4G'],\n 'Atrix 4G ME860': ['Motorola', 'ATRIX 4G'],\n 'CLIQ': ['Motorola', 'CLIQ'],\n 'CLIQ XT': ['Motorola', 'CLIQ XT'],\n 'CLIQ2': ['Motorola', 'CLIQ 2'],\n 'Corvair': ['Motorola', 'Corvair', 'tablet'],\n 'DEFY': ['Motorola', 'DEFY'],\n 'Defy+': ['Motorola', 'DEFY+'],\n 'Defy Plus': ['Motorola', 'DEFY+'],\n 'Devour': ['Motorola', 'Devour'],\n 'Dext': ['Motorola', 'Dext'],\n 'Droid': ['Motorola', 'Droid'],\n 'DROID': ['Motorola', 'Droid'],\n 'DROID2': ['Motorola', 'Droid 2'],\n 'DROID2 GLOBAL': ['Motorola', 'Droid 2'],\n 'DROID2 Global': ['Motorola', 'Droid 2'],\n 'Droid2Global': ['Motorola', 'Droid 2'],\n 'DROID 2': ['Motorola', 'Droid 2'],\n 'DROID3': ['Motorola', 'Droid 3'],\n 'DROID4': ['Motorola', 'Droid 4'],\n 'DROID4 4G': ['Motorola', 'Droid 4'],\n 'DROID Pro': ['Motorola', 'Droid Pro'],\n 'DROID BIONIC': ['Motorola', 'Droid Bionic'],\n 'DROID BIONIC 4G': ['Motorola', 'Droid Bionic'],\n 'DROID BIONIC XT875 4G': ['Motorola', 'Droid Bionic'],\n 'DROIDRAZR': ['Motorola', 'Droid RAZR'],\n 'Droid Razr': ['Motorola', 'Droid RAZR'],\n 'DROID RAZR': ['Motorola', 'Droid RAZR'],\n 'DROID RAZR 4G': ['Motorola', 'Droid RAZR'],\n 'DROID SPYDER': ['Motorola', 'Droid RAZR'],\n 'DROID RAZR HD': ['Motorola', 'Droid RAZR HD'],\n 'DROID RAZR HD 4G': ['Motorola', 'Droid RAZR HD'],\n 'DroidX': ['Motorola', 'Droid X'],\n 'DROIDX': ['Motorola', 'Droid X'],\n 'droid x': ['Motorola', 'Droid X'],\n 'Droid X': ['Motorola', 'Droid X'],\n 'DROID X': ['Motorola', 'Droid X'],\n 'DROID X2': ['Motorola', 'Droid X2'],\n 'Electrify': ['Motorola', 'Electrify'],\n 'Milestone XT720': ['Motorola', 'Milestone'],\n 'Milestone Xt720': ['Motorola', 'Milestone'],\n 'Milestone': ['Motorola', 'Milestone'],\n 'A853 Milestone': ['Motorola', 'Milestone'],\n 'Milestone X': ['Motorola', 'Milestone X'],\n 'Milestone X2': ['Motorola', 'Milestone X2'],\n 'MotoroiX': ['Motorola', 'Droid X'],\n 'Moto Backflip': ['Motorola', 'BACKFLIP'],\n 'RAZR': ['Motorola', 'RAZR'],\n 'Triumph': ['Motorola', 'TRIUMPH'],\n 'Opus One': ['Motorola', 'i1'],\n 'Photon': ['Motorola', 'PHOTON'],\n 'Photon 4G': ['Motorola', 'PHOTON 4G'],\n 'XOOM': ['Motorola', 'XOOM', 'tablet'],\n 'Xoom': ['Motorola', 'XOOM', 'tablet'],\n 'XOOM 2': ['Motorola', 'XOOM 2', 'tablet'],\n 'XOOM 2 ME': ['Motorola', 'XOOM 2', 'tablet'],\n 'XOOM MZ606': ['Motorola', 'XOOM WiFi', 'tablet'],\n 'ISW11M': ['Motorola', 'PHOTON'],\n 'IS12M': ['Motorola', 'RAZR'],\n 'MOTWX435KT': ['Motorola', 'TRIUMPH'],\n 'X3-Ice MIUI XT720 Memorila Classics': ['Motorola', 'Milestone'],\n 'NABI-A': ['Nabi', 'Kids tablet', 'tablet'],\n 'Newpad': ['Newsmy', 'Newpad', 'tablet'],\n 'Newpad-K97': ['Newsmy', 'Newpad K97', 'tablet'],\n 'Newpad P9': ['Newsmy', 'Newpad P9', 'tablet'],\n 'M-PAD N8': ['Newsmy', 'M-pad N8', 'tablet'],\n 'LT-NA7': ['NEC', 'LT-NA7'],\n 'N-01D': ['NEC', 'MEDIAS PP N-01D'],\n 'N-04C': ['NEC', 'MEDIAS N-04C'],\n 'N-04D': ['NEC', 'MEDIAS LTE N-04D'],\n 'N-05D': ['NEC', 'MEDIAS ES N-05D'],\n 'N-06C': ['NEC', 'MEDIAS WP N-06C'],\n 'N-06D': ['NEC', 'MEDIAS Tab N-06D', 'tablet'],\n 'N-07D': ['NEC', 'MEDIAS X N-07D'],\n '101N': ['NEC', 'MEDIAS CH Softbank 101N'],\n 'IS11N': ['NEC', 'MEDIAS BR IS11N'],\n 'Nexian NX-A890': ['Nexian', 'Journey'],\n 'NX-A891': ['Nexian', 'Ultra Journey'],\n 'M726HC': ['Nextbook', 'Premium 7', 'ereader'],\n 'NXM726HN': ['Nextbook', 'Premium 7', 'ereader'],\n 'NXM803HD': ['Nextbook', 'Premium 8', 'ereader'],\n 'DATAM803HC': ['Nextbook', 'Premium 8', 'ereader'],\n 'NXM901': ['Nextbook', 'Next 3', 'ereader'],\n 'NGM Vanity Smart': ['NGM', 'Vanity Smart'],\n 'Nokia N9': ['Nokia', 'N9'],\n 'Nokia N900': ['Nokia', 'N900'],\n 'Lumia800': ['Nokia', 'Lumia 800'],\n 'Lumia 900': ['Nokia', 'Lumia 900'],\n 'Notion Ink ADAM': ['Notion Ink', 'ADAM', 'tablet'],\n 'P4D SIRIUS': ['Nvsbl', 'P4D SIRIUS', 'tablet'],\n 'P4D Sirius': ['Nvsbl', 'P4D SIRIUS', 'tablet'],\n 'EFM710A': ['Oblio', 'Mint 7x', 'tablet'],\n 'ODYS-Xpress': ['Odys', 'Xpress', 'tablet'],\n 'Olivetti Olipad 100': ['Olivetti', 'Olipad 100', 'tablet'],\n 'OP110': ['Olivetti', 'Olipad 110', 'tablet'],\n 'ONDA MID': ['Onda', 'MID', 'tablet'],\n 'VX580A': ['Onda', 'VX580A', 'tablet'],\n 'VX610A': ['Onda', 'VX610A', 'tablet'],\n 'TQ150': ['Onda', 'TQ150'],\n 'N2T': ['ONN', 'N2T', 'tablet'],\n 'Renesas': ['Opad', 'Renesas', 'tablet'],\n 'renesas emev': ['Opad', 'Renesas', 'tablet'],\n 'X903': ['Oppo', 'Find Me X903'],\n 'X905': ['Oppo', 'Find 3 X905'],\n 'R805': ['Oppo', 'R805'],\n 'R801': ['Oppo', 'R801'],\n 'R811': ['Oppo', 'R811'],\n 'X909': ['Oppo', 'X909'],\n 'OPPOR801': ['Oppo', 'R801'],\n 'OPPOX905': ['Oppo', 'Find 3 X905'],\n 'OPPOX907': ['Oppo', 'Find 3 X907'],\n 'X907': ['Oppo', 'Find 3 X907'],\n 'X9015': ['Oppo', 'Find X9015'],\n 'OPPOX9017': ['Oppo', 'Finder X9017'],\n 'OPPOU701': ['Oppo', 'OPPOU701'],\n 'OPPOR807': ['Oppo', 'Real R807'],\n 'OPPOR805': ['Oppo', 'Real R805'],\n 'R807': ['Oppo', 'Real R807'],\n 'OPPOT703': ['Oppo', 'T703'],\n 'P-01D': ['Panasonic', 'P-01D'],\n 'P-02D': ['Panasonic', 'Lumix Phone'],\n 'P-04D': ['Panasonic', 'Eluga'],\n 'P-07C': ['Panasonic', 'P-07C'],\n 'dL1': ['Panasonic', 'Eluga dL1'],\n '101P': ['Panasonic', 'Lumix Phone'],\n 'JT-H580VT': ['Panasonic', 'BizPad 7', 'tablet'],\n 'JT-H581VT': ['Panasonic', 'BizPad 10', 'tablet'],\n 'FZ-A1A': ['Panasonic', 'Toughpad', 'tablet'],\n 'pandigital9hr': ['Pandigital', '9HR', 'tablet'],\n 'pandigital9hr2': ['Pandigital', '9HR2', 'tablet'],\n 'pandigitalopc1': ['Pandigital', 'OPC1', 'tablet'],\n 'pandigitalopp1': ['Pandigital', 'OPP1', 'tablet'],\n 'pandigitalp1hr': ['Pandigital', 'p1hr', 'tablet'],\n 'IM-A600S': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n 'IM-A630K': ['Pantech', 'SKY Izar'],\n 'IM-A690L': ['Pantech', 'SKY'],\n 'IM-A690S': ['Pantech', 'SKY'],\n 'IM-A710K': ['Pantech', 'SKY Vega Xpress'],\n 'IM-A720L': ['Pantech', 'SKY Vega Xpress'],\n 'IM-A725L': ['Pantech', 'SKY Vega X+'],\n 'IM-A730s': ['Pantech', 'SKY Vega S'],\n 'IM-A730S': ['Pantech', 'SKY Vega S'],\n 'IM-A750K': ['Pantech', 'SKY Mirach A'],\n 'IM-A760S': ['Pantech', 'SKY Vega Racer'],\n 'IM-A770K': ['Pantech', 'SKY Vega Racer'],\n 'IM-A780L': ['Pantech', 'SKY Vega Racer'],\n 'IM-A800S': ['Pantech', 'SKY Vega LTE'],\n 'IM-A810K': ['Pantech', 'SKY Vega LTE M'],\n 'IM-A810S': ['Pantech', 'SKY Vega LTE M'],\n 'IM-A820L': ['Pantech', 'SKY Vega LTE EX'],\n 'IM-A830K': ['Pantech', 'SKY Vega Racer 2'],\n 'IM-A830L': ['Pantech', 'SKY Vega Racer 2'],\n 'IM-A830S': ['Pantech', 'SKY Vega Racer 2'],\n 'IM-A840S': ['Pantech', 'SKY Vega S5'],\n 'IM-A850K': ['Pantech', 'IM-A850K'],\n 'IM-T100K': ['Pantech', 'SKY Vega No. 5', 'tablet'],\n 'IS06': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n 'ADR8995': ['Pantech', 'Breakout'],\n 'ADR8995 4G': ['Pantech', 'Breakout'],\n 'ADR910L 4G': ['Pantech', 'ADR910L'],\n 'PantechP4100': ['Pantech', 'Element', 'tablet'],\n 'PantechP8000': ['Pantech', 'Crossover'],\n 'PantechP8010': ['Pantech', 'P8010'],\n 'PantechP9060': ['Pantech', 'Pocket'],\n 'PantechP9070': ['Pantech', 'Burst'],\n 'SKY IM-A600S': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n 'SKY IM-A630K': ['Pantech', 'SKY Izar'],\n 'SKY IM-A650S': ['Pantech', 'SKY Vega'],\n 'IS11PT': ['Pantech', 'Mirach IS11PT'],\n 'PAT712W': ['Perfeo', 'PAT712W', 'tablet'],\n 'X7G': ['Pearl', 'Touchlet X7G', 'tablet'],\n 'FWS810': ['PHICOMM', 'FWS810'],\n 'Philips PI5000': ['Philips', 'PI5000', 'tablet'],\n 'PI7000': ['Philips', 'PI7000', 'tablet'],\n 'Philips W626': ['Philips', 'W626'],\n 'Philips W632': ['Philips', 'W632'],\n 'MOMO': ['Ployer', 'MOMO', 'tablet'],\n 'MOMO15': ['Ployer', 'MOMO15', 'tablet'],\n 'PocketBook A7': ['PocketBook', 'A7', 'tablet'],\n 'PocketBook A10': ['PocketBook', 'A10', 'tablet'],\n 'Mobii 7': ['Point Of View', 'Mobii 7', 'tablet'],\n 'PMP3384BRU': ['Prestigio', 'Multipad 3384', 'tablet'],\n 'TB07FTA': ['Positivo', 'TB07FTA', 'tablet'],\n 'QW TB-1207': ['Qware', 'Pro3', 'tablet'],\n 'W6HD ICS': ['Ramos', 'W6HD', 'tablet'],\n 'w10': ['Ramos', 'W10', 'tablet'],\n 'W10': ['Ramos', 'W10', 'tablet'],\n 'w10 v2.0': ['Ramos', 'W10 v2.0', 'tablet'],\n 'W10 V2.0': ['Ramos', 'W10 v2.0', 'tablet'],\n 'T11AD': ['Ramos', 'T11AD', 'tablet'],\n 'T11AD.FE': ['Ramos', 'T11AD', 'tablet'],\n 'PlayBook': ['RIM', 'BlackBerry PlayBook', 'tablet'],\n 'RBK-490': ['Ritmix', 'RBK-490', 'tablet'],\n 'A8HD': ['Saayi', 'Dropad A8HD', 'tablet'],\n 'GT-S7568': ['Samsung', 'S7568'],\n 'Galaxy Nexus': ['Samsung', 'Galaxy Nexus'],\n 'GT-B5330': ['Samsung', 'GT-B5330'],\n 'GT-B5510': ['Samsung', 'Galaxy Y Pro'],\n 'GT-B5510B': ['Samsung', 'Galaxy Y Pro'],\n 'GT-B5510L': ['Samsung', 'Galaxy Y Pro'],\n 'GT-B5512': ['Samsung', 'Galaxy Y Pro Duos'],\n 'GT-B7510': ['Samsung', 'Galaxy Pro'],\n 'GT-B7510L': ['Samsung', 'Galaxy Pro'],\n 'GT-I5500': ['Samsung', 'Galaxy 5'],\n 'GT-I5500B': ['Samsung', 'Galaxy 5'],\n 'GT-I5500L': ['Samsung', 'Galaxy 5'],\n 'GT-I5500M': ['Samsung', 'Galaxy 5'],\n 'GT-I5500-MR3': ['Samsung', 'Galaxy 5'],\n 'GT-I5503': ['Samsung', 'Galaxy 5'],\n 'GT-I5508': ['Samsung', 'Galaxy 5'],\n 'GT-I5510': ['Samsung', 'Galaxy 551'],\n 'GT-I5510L': ['Samsung', 'Galaxy 551'],\n 'GT-I5510M': ['Samsung', 'Galaxy 551'],\n 'GT-I5510T': ['Samsung', 'Galaxy 551'],\n 'GT-I5700': ['Samsung', 'Galaxy Spica'],\n 'GT-I5700L': ['Samsung', 'Galaxy Spica'],\n 'GT-I5800': ['Samsung', 'Galaxy Apollo'],\n 'GT-I5800D': ['Samsung', 'Galaxy Apollo'],\n 'GT-I5800L': ['Samsung', 'Galaxy Apollo'],\n 'GT-I5801': ['Samsung', 'Galaxy Apollo'],\n 'GT-I6500U': ['Samsung', 'Saturn'],\n 'GT-I8000': ['Samsung', 'Omnia 2'],\n 'GT-I8150': ['Samsung', 'Galaxy W'],\n 'GT-I8150B': ['Samsung', 'Galaxy W'],\n 'GT-I8160': ['Samsung', 'Galaxy Ace 2'],\n 'GT-I8160L': ['Samsung', 'Galaxy Ace 2'],\n 'GT-I8160P': ['Samsung', 'Galaxy Ace 2'],\n 'GT-I8320': ['Samsung', 'H1'],\n 'GT-I8520': ['Samsung', 'Galaxy Beam'],\n 'GT-I8530': ['Samsung', 'Galaxy Beam'],\n 'GT-I8250': ['Samsung', 'Galaxy Beam'],\n 'GT-i9000': ['Samsung', 'Galaxy S'],\n 'GT-I9000': ['Samsung', 'Galaxy S'],\n 'GT-I9000B': ['Samsung', 'Galaxy S'],\n 'GT-I9000M': ['Samsung', 'Galaxy S Vibrant'],\n 'GT-I9000T': ['Samsung', 'Galaxy S'],\n 'GT-I9001': ['Samsung', 'Galaxy S Plus'],\n 'GT-I9003': ['Samsung', 'Galaxy SL'],\n 'GT-I9003L': ['Samsung', 'Galaxy SL'],\n 'GT-I9008': ['Samsung', 'Galaxy S'],\n 'GT-I9008L': ['Samsung', 'Galaxy S'],\n 'GT-I9010': ['Samsung', 'Galaxy S Giorgio Armani'],\n 'GT-I9018': ['Samsung', 'Galaxy GT-I9018'],\n 'GT-I9070': ['Samsung', 'Galaxy S Advance'],\n 'GT-I9070P': ['Samsung', 'Galaxy S Advance'],\n 'GT-I9082': ['Samsung', 'Galaxy Grand DUOS'],\n 'GT-I9088': ['Samsung', 'Galaxy S'],\n 'GT-i9100': ['Samsung', 'Galaxy S II'],\n 'GT-I9100': ['Samsung', 'Galaxy S II'],\n 'GT-I9100G': ['Samsung', 'Galaxy S II'],\n 'GT-I9100M': ['Samsung', 'Galaxy S II'],\n 'GT-I9100T': ['Samsung', 'Galaxy S II'],\n 'GT-I9100P': ['Samsung', 'Galaxy S II'],\n 'GT-I9103': ['Samsung', 'Galaxy R'],\n 'GT-I9108': ['Samsung', 'Galaxy S II'],\n 'GT-I9210': ['Samsung', 'Galaxy S II LTE'],\n 'GT-I9210T': ['Samsung', 'Galaxy S II LTE'],\n 'GT-I9220': ['Samsung', 'Galaxy Note'],\n 'GT-I9228': ['Samsung', 'Galaxy Note'],\n 'GT-I9250': ['Samsung', 'Galaxy Nexus'],\n 'GT-I9250 EUR XX': ['Samsung', 'Galaxy Nexus'],\n 'GT-I9260': ['Samsung', 'Galaxy Premier'],\n 'GT-I9300': ['Samsung', 'Galaxy S III'],\n 'GT-I9300T': ['Samsung', 'Galaxy S III'],\n 'GT-I9303T': ['Samsung', 'Galaxy S III'],\n 'GT-I9308': ['Samsung', 'Galaxy S III'],\n 'GT-I9500': ['Samsung', 'Galaxy GT-I9500'],\n 'GT-I9800': ['Samsung', 'Galaxy GT-I9800'],\n 'GT-N7000': ['Samsung', 'Galaxy Note'],\n 'GT-N7000B': ['Samsung', 'Galaxy Note'],\n 'GT-N7100': ['Samsung', 'Galaxy Note II'],\n 'GT-N7102': ['Samsung', 'Galaxy Note II'],\n 'GT-N8000': ['Samsung', 'Galaxy Note 10.1'],\n 'GT-N8010': ['Samsung', 'Galaxy Note 10.1'],\n 'GT-P1000': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1000L': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1000M': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1000N': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1000T': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1000 Tablet': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P1010': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GT-P3100': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n 'GT-P3100B': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n 'GT-P3110': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n 'GT-P3113': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n 'GT-P5100': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n 'GT-P5110': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n 'GT-P5113': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n 'GT-P6200': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n 'GT-P6200L': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n 'GT-P6201': ['Samsung', 'Galaxy Tab 7.0 Plus N', 'tablet'],\n 'GT-P6210': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n 'GT-P6211': ['Samsung', 'Galaxy Tab 7.0 Plus N', 'tablet'],\n 'GT-P6800': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n 'GT-P6810': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n 'GT-P7100': ['Samsung', 'Galaxy Tab 10.1V', 'tablet'],\n 'GT-P7300': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'GT-P7300B': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'GT-P7310': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'GT-P7320': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'GT-P7320T': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'GT-P7500': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'GT-P7500D': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'GT-P7500R': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'GT-P7500V': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'GT-P7501': ['Samsung', 'Galaxy Tab 10.1N', 'tablet'],\n 'GT-P7510': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'GT-P7511': ['Samsung', 'Galaxy Tab 10.1N', 'tablet'],\n 'GT-S5300': ['Samsung', 'Galaxy Pocket'],\n 'GT-S5360': ['Samsung', 'Galaxy Y'],\n 'GT-S5360B': ['Samsung', 'Galaxy Y'],\n 'GT-S5360L': ['Samsung', 'Galaxy Y'],\n 'GT-S5363': ['Samsung', 'Galaxy Y'],\n 'GT-S5367': ['Samsung', 'Galaxy Y TV'],\n 'GT-S5368': ['Samsung', 'GT-S5368'],\n 'GT-S5369': ['Samsung', 'Galaxy Y'],\n 'GT-S5570': ['Samsung', 'Galaxy Mini'],\n 'GT-S5570B': ['Samsung', 'Galaxy Mini'],\n 'GT-S5570I': ['Samsung', 'Galaxy Mini'],\n 'GT-S5570L': ['Samsung', 'Galaxy Mini'],\n 'GT-S5578': ['Samsung', 'Galaxy Mini'],\n 'GT-S5660': ['Samsung', 'Galaxy Gio'],\n 'GT-S5660M': ['Samsung', 'Galaxy Gio'],\n 'GT-S5660V': ['Samsung', 'Galaxy Gio'],\n 'GT-S5670': ['Samsung', 'Galaxy Fit'],\n 'GT-S5670B': ['Samsung', 'Galaxy Fit'],\n 'GT-S5670L': ['Samsung', 'Galaxy Fit'],\n 'GT-S5690': ['Samsung', 'Galaxy Xcover'],\n 'GT-S5690L': ['Samsung', 'Galaxy Xcover'],\n 'GT-S5820': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830B': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830C': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830D': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830D-parrot': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830i': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830L': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830M': ['Samsung', 'Galaxy Ace'],\n 'GT-S5830T': ['Samsung', 'Galaxy Ace'],\n 'GT-S5838': ['Samsung', 'Galaxy Ace'],\n 'GT-S5839i': ['Samsung', 'Galaxy Ace'],\n 'GT-S6102': ['Samsung', 'Galaxy Y Duos'],\n 'GT-S6102B': ['Samsung', 'Galaxy Y Duos'],\n 'GT-S6500': ['Samsung', 'Galaxy Mini 2'],\n 'GT-S6500D': ['Samsung', 'Galaxy Mini 2'],\n 'GT-S6702': ['Samsung', 'GT-S6702'],\n 'GT-S6802': ['Samsung', 'Galaxy Ace Duos'],\n 'GT-S7500': ['Samsung', 'Galaxy Ace Plus'],\n 'GT-S7500L': ['Samsung', 'Galaxy Ace Plus'],\n 'GT-S7500W': ['Samsung', 'Galaxy Ace Plus'],\n 'GT-T959': ['Samsung', 'Galaxy S Vibrant'],\n 'SCH-i509': ['Samsung', 'Galaxy Y'],\n 'SCH-i559': ['Samsung', 'Galaxy Pop'],\n 'SCH-i569': ['Samsung', 'Galaxy Gio'],\n 'SCH-i579': ['Samsung', 'Galaxy Ace'],\n 'SCH-i589': ['Samsung', 'Galaxy Ace Duos'],\n 'SCH-i705 4G': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n 'SCH-i809': ['Samsung', 'SCH-i809'],\n 'SCH-i889': ['Samsung', 'Galaxy Note'],\n 'SCH-i909': ['Samsung', 'Galaxy S'],\n 'SCH-i919': ['Samsung', 'SCH-i919'],\n 'SCH-i929': ['Samsung', 'SCH-i929'],\n 'SCH-I100': ['Samsung', 'Gem'],\n 'SCH-I110': ['Samsung', 'Illusion'],\n 'SCH-I400': ['Samsung', 'Continuum'],\n 'SCH-I405': ['Samsung', 'Stratosphere'],\n 'SCH-I405 4G': ['Samsung', 'Stratosphere'],\n 'SCH-I500': ['Samsung', 'Fascinate'],\n 'SCH-I510': ['Samsung', 'Stealth V'],\n 'SCH-I510 4G': ['Samsung', 'Droid Charge'],\n 'SCH-I515': ['Samsung', 'Galaxy Nexus'],\n 'SCH-I535': ['Samsung', 'Galaxy S III'],\n 'SCH-I535 4G': ['Samsung', 'Galaxy S III'],\n 'SCH-I619': ['Samsung', 'SCH-I619'],\n 'SCH-I699': ['Samsung', 'SCH-I699'],\n 'SCH-I779': ['Samsung', 'SCH-I779'],\n 'SCH-I800': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n 'SCH-I815': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n 'SCH-I815 4G': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n 'SCH-I905': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SCH-I905 4G': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SCH-I909': ['Samsung', 'Galaxy S'],\n 'SCH-I915': ['Samsung', 'SCH-I915'],\n 'SCH-I939': ['Samsung', 'Galaxy S III'],\n 'SCH-M828C': ['Samsung', 'Galaxy Precedent'],\n 'SCH-M828Carray(9096483449)': ['Samsung', 'Galaxy Precedent'],\n 'SCH-R530U': ['Samsung', 'Galaxy S III'],\n 'SCH-R680': ['Samsung', 'Repp'],\n 'SCH-R720': ['Samsung', 'Admire'],\n 'SCH-R730': ['Samsung', 'Transfix'],\n 'SCH-R760': ['Samsung', 'Galaxy S II'],\n 'SCH-R820': ['Samsung', 'SCH-R820'],\n 'SCH-R880': ['Samsung', 'Acclaim'],\n 'SCH-R910': ['Samsung', 'Galaxy Indulge 4G'],\n 'SCH-R915': ['Samsung', 'Galaxy Indulge'],\n 'SCH-R920': ['Samsung', 'Galaxy Attain 4G'],\n 'SCH-R930': ['Samsung', 'Galaxy S Aviator'],\n 'SCH-R940': ['Samsung', 'Galaxy S Lightray'],\n 'SCH-S720C': ['Samsung', 'Galaxy Proclaim'],\n 'SCH-S735C': ['Samsung', 'SCH-S735'],\n 'SCH-W899': ['Samsung', 'SCH-W899'],\n 'SCH-W999': ['Samsung', 'SCH-W999'],\n 'SGH-I547': ['Samsung', 'SGH-I547'],\n 'SGH-I717': ['Samsung', 'Galaxy Note'],\n 'SGH-I717D': ['Samsung', 'Galaxy Note'],\n 'SGH-I717M': ['Samsung', 'Galaxy Note'],\n 'SGH-I717R': ['Samsung', 'Galaxy Note'],\n 'SGH-I727': ['Samsung', 'Galaxy S II Skyrocket'],\n 'SGH-i727R': ['Samsung', 'Galaxy S II'],\n 'SGH-I727R': ['Samsung', 'Galaxy S II'],\n 'SGH-I747': ['Samsung', 'Galaxy S III'],\n 'SGH-I747M': ['Samsung', 'Galaxy S III'],\n 'SGH-I748': ['Samsung', 'Galaxy S III'],\n 'SGH-I757': ['Samsung', 'Galaxy S II Skyrocket HD'],\n 'SGH-I777': ['Samsung', 'Galaxy S II'],\n 'SGH-I9777': ['Samsung', 'Galaxy S II'],\n 'SGH-I896': ['Samsung', 'Captivate'],\n 'SGH-I897': ['Samsung', 'Captivate'],\n 'SGH-I927': ['Samsung', 'Captivate Glide'],\n 'SGH-I927R': ['Samsung', 'Captivate Glide'],\n 'SGH-I957': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SGH-I957D': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SGH-I957M': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SGH-I957R': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SGH-I987': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n 'SGH-I997': ['Samsung', 'Infuse 4G'],\n 'SGH-I997R': ['Samsung', 'Infuse 4G'],\n 'SGH-I9000': ['Samsung', 'Galaxy S'],\n 'SGH-S730G': ['Samsung', 'SGH-S730'],\n 'SGH-T499': ['Samsung', 'Dart'],\n 'SGH-T499V': ['Samsung', 'Galaxy Mini'],\n 'SGH-T499Y': ['Samsung', 'Galaxy Mini'],\n 'SGH-T589': ['Samsung', 'Gravity Smart'],\n 'SGH-T589R': ['Samsung', 'Gravity Smart'],\n 'SGH-T679': ['Samsung', 'Exhibit II 4G'],\n 'SGH-T679M': ['Samsung', 'Exhibit II 4G'],\n 'SGH-T759': ['Samsung', 'Exhibit 4G'],\n 'SGH-T769': ['Samsung', 'Galaxy S Blaze 4G'],\n 'SGH-T839': ['Samsung', 'T-Mobile Sidekick'],\n 'SGH-T849': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n 'SGH-T859': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SGH-T869': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n 'SGH-T879': ['Samsung', 'Galaxy Note'],\n 'SGH-T959': ['Samsung', 'Vibrant'],\n 'SGH-T959D': ['Samsung', 'Galaxy S Fascinate 3G+'],\n 'SGH-T959P': ['Samsung', 'Galaxy S Fascinate 4G'],\n 'SGH-T959V': ['Samsung', 'Galaxy S 4G'],\n 'SGH-T989': ['Samsung', 'Galaxy S II'],\n 'SGH-T989D': ['Samsung', 'Galaxy S II X'],\n 'SGH-T999': ['Samsung', 'Galaxy S Blaze 4G'],\n 'SGH-T999V': ['Samsung', 'Galaxy S Blaze 4G'],\n 'SHV-E120K': ['Samsung', 'Galaxy S II HD LTE'],\n 'SHV-E120L': ['Samsung', 'Galaxy S II HD LTE'],\n 'SHV-E120S': ['Samsung', 'Galaxy S II HD LTE'],\n 'SHV-E110S': ['Samsung', 'Galaxy S II LTE'],\n 'SHV-E140S': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SHV-E150S': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n 'SHV-E160K': ['Samsung', 'Galaxy Note'],\n 'SHV-E160L': ['Samsung', 'Galaxy Note LTE'],\n 'SHV-E160S': ['Samsung', 'Galaxy Note LTE'],\n 'SHV-E170K': ['Samsung', 'SHV-E170K'],\n 'SHV-E170L': ['Samsung', 'SHV-E170L'],\n 'SHV-E210K': ['Samsung', 'Galaxy S III'],\n 'SHV-E210L': ['Samsung', 'Galaxy S III'],\n 'SHV-E210S': ['Samsung', 'Galaxy S III'],\n 'SHW-M100S': ['Samsung', 'Galaxy A'],\n 'SHW-M110S': ['Samsung', 'Galaxy S'],\n 'SHW-M130L': ['Samsung', 'Galaxy U'],\n 'SHW-M130K': ['Samsung', 'Galaxy K'],\n 'SHW-M180K': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SHW-M180L': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SHW-M180S': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SHW-M180W': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SHW-M185S': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SHW-M190S': ['Samsung', 'Galaxy S Hoppin'],\n 'SHW-M220L': ['Samsung', 'Galaxy Neo'],\n 'SHW-M240S': ['Samsung', 'Galaxy Ace'],\n 'SHW-M250K': ['Samsung', 'Galaxy S II'],\n 'SHW-M250L': ['Samsung', 'Galaxy S II'],\n 'SHW-M250S': ['Samsung', 'Galaxy S II'],\n 'SHW-M300W': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SHW-M305W': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n 'SHW-M340S': ['Samsung', 'Galaxy M Style'],\n 'SHW-M380K': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SHW-M380S': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SHW-M380W': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n 'SHW-M440S': ['Samsung', 'Galaxy S III'],\n 'SMT-i9100': ['Samsung', 'SMT-I9100', 'tablet'],\n 'SPH-D600': ['Samsung', 'Conquer 4G'],\n 'SPH-D700': ['Samsung', 'Epic 4G'],\n 'SPH-D705': ['Samsung', 'Epic 4G 2'],\n 'SPH-D710': ['Samsung', 'Epic 4G Touch'],\n 'SPH-L700': ['Samsung', 'Galaxy Nexus'],\n 'SPH-L710': ['Samsung', 'Galaxy S III'],\n 'SPH-M820': ['Samsung', 'Galaxy Prevail'],\n 'SPH-M820-BST': ['Samsung', 'Galaxy Prevail'],\n 'SPH-M580': ['Samsung', 'Replenish'],\n 'SPH-M900': ['Samsung', 'Moment'],\n 'SPH-M910': ['Samsung', 'Intercept'],\n 'SPH-M920': ['Samsung', 'Transform'],\n 'SPH-M930': ['Samsung', 'Transform Ultra'],\n 'SPH-M930BST': ['Samsung', 'Transform Ultra'],\n 'SPH-P100': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'YP-GB1': ['Samsung', 'Galaxy Player', 'media'],\n 'YP-GB70': ['Samsung', 'Galaxy Player 70', 'media'],\n 'YP-GB70D': ['Samsung', 'Galaxy Player 70 Plus', 'media'],\n 'YP-GS1': ['Samsung', 'Galaxy S WiFi 3.6', 'media'],\n 'YP-G1': ['Samsung', 'Galaxy S WiFi 4.0', 'media'],\n 'YP-GI1': ['Samsung', 'Galaxy S WiFi 4.2', 'media'],\n 'YP-G50': ['Samsung', 'Galaxy Player', 'media'],\n 'YP-G70': ['Samsung', 'Galaxy S WiFi 5.0', 'media'],\n 'GT9100': ['Samsung', 'Galaxy S II'],\n 'I897': ['Samsung', 'Captivate'],\n 'I7500': ['Samsung', 'Galaxy'],\n 'I9000': ['Samsung', 'Galaxy S'],\n 'T959': ['Samsung', 'Galaxy S Vibrant'],\n 'Captivate-I897': ['Samsung', 'Captivate'],\n 'Galaxy': ['Samsung', 'Galaxy'],\n 'Galaxy Note': ['Samsung', 'Galaxy Note'],\n 'GalaxyS': ['Samsung', 'Galaxy S'],\n 'Galaxy S II': ['Samsung', 'Galaxy S II'],\n 'Galaxy X': ['Samsung', 'Galaxy X'],\n 'Galaxy Spica': ['Samsung', 'Galaxy Spica'],\n 'GALAXY Tab': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'GALAXY NEXUS': ['Samsung', 'Galaxy Nexus'],\n 'Vibrantmtd': ['Samsung', 'Vibrant'],\n 'SC-01C': ['Samsung', 'Galaxy Tab', 'tablet'],\n 'SC-01D': ['Samsung', 'Galaxy Tab 10.1 LTE', 'tablet'],\n 'SC-02B': ['Samsung', 'Galaxy S'],\n 'SC-02C': ['Samsung', 'Galaxy S II'],\n 'SC-02D': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n 'SC-03D': ['Samsung', 'Galaxy S II LTE'],\n 'SC-04D': ['Samsung', 'Galaxy Nexus'],\n 'SC-05D': ['Samsung', 'Galaxy Note LTE'],\n 'SC-06D': ['Samsung', 'Galaxy S III'],\n 'ISW11SC': ['Samsung', 'Galaxy S II WiMAX'],\n 'GT-S7562': ['Samsung', 'GT-S7562'],\n 'GT-S7562i': ['Samsung', 'GT-S7562i'],\n 'A01SH': ['Sharp', 'A01SH'],\n 'IS01': ['Sharp', 'IS01'],\n 'IS03': ['Sharp', 'IS03'],\n 'IS05': ['Sharp', 'IS05'],\n 'IS11SH': ['Sharp', 'Aquos IS11SH'],\n 'IS12SH': ['Sharp', 'Aquos IS12SH'],\n 'IS13SH': ['Sharp', 'Aquos IS13SH'],\n 'IS14SH': ['Sharp', 'Aquos IS14SH'],\n 'ISW16SH': ['Sharp', 'Aquos ISW16SH'],\n 'EB-W51GJ': ['Sharp', 'EB-W51GJ'],\n 'SBM003SH': ['Sharp', 'Galapagos'],\n 'SBM005SH': ['Sharp', 'Galapagos'],\n 'SBM006SH': ['Sharp', 'Aquos'],\n 'SBM007SH': ['Sharp', 'Aquos 007SH'],\n 'SBM009SH': ['Sharp', 'Aquos 009SH'],\n 'SBM102SH': ['Sharp', 'Aquos 102SH'],\n 'SBM103SH': ['Sharp', 'Aquos 103SH'],\n 'SBM104SH': ['Sharp', 'Aquos 104SH'],\n 'SBM107SH': ['Sharp', 'Aquos 107SH'],\n 'SBM107SHB': ['Sharp', 'Aquos 107SH'],\n 'SH-01D': ['Sharp', 'Aquos SH-01D'],\n 'SH-02D': ['Sharp', 'Aquos slider SH-02D'],\n 'SH-03C': ['Sharp', 'Lynx 3D'],\n 'SH-06D': ['Sharp', 'Aquos SH-06D'],\n 'SH-09D': ['Sharp', 'Aquos Zeta SH-09D'],\n 'SH-10B': ['Sharp', 'Lynx'],\n 'SH-12C': ['Sharp', 'Aquos'],\n 'SH-13C': ['Sharp', 'Aquos f SH-13C'],\n 'SH80F': ['Sharp', 'Aquos SH80F'],\n 'SH72x8U': ['Sharp', 'SH72x8U'],\n 'SH8118U': ['Sharp', 'SH8118U'],\n 'SH8128U': ['Sharp', 'SH8128U'],\n 'SH8158U': ['Sharp', 'SH8158U'],\n 'SH8188U': ['Sharp', 'SH8188U'],\n 'SH8268U': ['Sharp', 'SH8268U'],\n 'INFOBAR C01': ['Sharp', 'INFOBAR C01'],\n 'SPX-5': ['Simvalley', 'SPX-5'],\n 'SPX-5 3G': ['Simvalley', 'SPX-5 3G'],\n 'SmartQ G7': ['SmartQ', 'G7', 'tablet'],\n 'SmartQT7': ['SmartQ', 'T7', 'tablet'],\n 'SmartQT10': ['SmartQ', 'T10', 'tablet'],\n 'SmartQT15': ['SmartQ', 'T15', 'tablet'],\n 'SmartQT19': ['SmartQ', 'T19', 'tablet'],\n 'SmartQT20': ['SmartQ', 'T20', 'tablet'],\n 'OMS1 6': ['Sony Ericsson', 'A8i'],\n 'E10a': ['Sony Ericsson', 'Xperia X10 Mini'],\n 'E10i': ['Sony Ericsson', 'Xperia X10 Mini'],\n 'E10iv': ['Sony Ericsson', 'Xperia X10 Mini'],\n 'E15': ['Sony Ericsson', 'Xperia X8'],\n 'E15a': ['Sony Ericsson', 'Xperia X8'],\n 'E15i': ['Sony Ericsson', 'Xperia X8'],\n 'E15iv': ['Sony Ericsson', 'Xperia X8'],\n 'E15i-o': ['Sony Ericsson', 'Xperia X8'],\n 'E16i': ['Sony Ericsson', 'W8 Walkman'],\n 'LT11i': ['Sony Ericsson', 'Xperia Neo V'],\n 'LT15': ['Sony Ericsson', 'Xperia Arc'],\n 'LT15a': ['Sony Ericsson', 'Xperia Arc'],\n 'LT15i': ['Sony Ericsson', 'Xperia Arc'],\n 'LT15iv': ['Sony Ericsson', 'Xperia Arc'],\n 'LT15i-o': ['Sony Ericsson', 'Xperia Arc'],\n 'LT18a': ['Sony Ericsson', 'Xperia Arc S'],\n 'LT18i': ['Sony Ericsson', 'Xperia Arc S'],\n 'LT18iv': ['Sony Ericsson', 'Xperia Arc S'],\n 'LT18i-o': ['Sony Ericsson', 'Xperia Arc S'],\n 'LT22i': ['Sony', 'Xperia P'],\n 'LT26i': ['Sony', 'Xperia S'],\n 'LT26ii': ['Sony', 'Xperia S'],\n 'LT26i-o': ['Sony', 'Xperia S'],\n 'LT28at': ['Sony', 'Xperia Ion'],\n 'LT28h': ['Sony', 'Xperia Ion'],\n 'LT28i': ['Sony', 'Xperia Ion'],\n 'LT29i': ['Sony', 'Xperia GX'],\n 'SonyLT29i': ['Sony', 'Xperia GX'],\n 'SonyLT30a': ['Sony', 'Xperia Mint'],\n 'SonyLT30p': ['Sony', 'Xperia Mint'],\n 'MK16a': ['Sony Ericsson', 'Xperia Pro'],\n 'MK16i': ['Sony Ericsson', 'Xperia Pro'],\n 'MT11a': ['Sony Ericsson', 'Xperia Neo V'],\n 'MT11i': ['Sony Ericsson', 'Xperia Neo V'],\n 'MT11iv': ['Sony Ericsson', 'Xperia Neo V'],\n 'MT11i-o': ['Sony Ericsson', 'Xperia Neo V'],\n 'MT15a': ['Sony Ericsson', 'Xperia Neo'],\n 'MT15i': ['Sony Ericsson', 'Xperia Neo'],\n 'MT15iv': ['Sony Ericsson', 'Xperia Neo'],\n 'MT15i-o': ['Sony Ericsson', 'Xperia Neo'],\n 'MT25i': ['Sony', 'Xperia Neo L'],\n 'MT27i': ['Sony', 'Xperia Sola'],\n 'R800a': ['Sony Ericsson', 'Xperia Play'],\n 'R800i': ['Sony Ericsson', 'Xperia Play'],\n 'R800iv': ['Sony Ericsson', 'Xperia Play'],\n 'R800at': ['Sony Ericsson', 'Xperia Play'],\n 'R800x': ['Sony Ericsson', 'Xperia Play'],\n 'SK17a': ['Sony Ericsson', 'Xperia Mini Pro'],\n 'SK17i': ['Sony Ericsson', 'Xperia Mini Pro'],\n 'SK17iv': ['Sony Ericsson', 'Xperia Mini Pro'],\n 'SK17i-o': ['Sony Ericsson', 'Xperia Mini Pro'],\n 'ST15a': ['Sony Ericsson', 'Xperia Mini'],\n 'ST15i': ['Sony Ericsson', 'Xperia Mini'],\n 'ST17a': ['Sony Ericsson', 'Xperia Active'],\n 'ST17i': ['Sony Ericsson', 'Xperia Active'],\n 'ST18a': ['Sony Ericsson', 'Xperia Ray'],\n 'ST18i': ['Sony Ericsson', 'Xperia Ray'],\n 'ST18iv': ['Sony Ericsson', 'Xperia Ray'],\n 'ST18av': ['Sony Ericsson', 'Xperia Ray'],\n 'SonyST21': ['Sony', '\\'Tapioca\\''],\n 'SonyST21i': ['Sony', '\\'Tapioca\\''],\n 'SonyST21a2': ['Sony', '\\'Tapioca\\''],\n 'ST21': ['Sony', '\\'Tapioca\\''],\n 'ST21i': ['Sony', '\\'Tapioca\\''],\n 'SonyST23i': ['Sony', '\\'Tapioca DS\\''],\n 'ST25i': ['Sony', 'Xperia U'],\n 'ST27i': ['Sony', 'Xperia Go'],\n 'U20a': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n 'U20i': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n 'U20iv': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n 'WT13i': ['Sony Ericsson', 'Mix Walkman'],\n 'WT18i': ['Sony Ericsson', 'Walkman'],\n 'WT19a': ['Sony Ericsson', 'Live with Walkman'],\n 'WT19i': ['Sony Ericsson', 'Live with Walkman'],\n 'WT19iv': ['Sony Ericsson', 'Live with Walkman'],\n 'X8': ['Sony Ericsson', 'Xperia X8'],\n 'X10': ['Sony Ericsson', 'Xperia X10'],\n 'X10a': ['Sony Ericsson', 'Xperia X10'],\n 'X10i': ['Sony Ericsson', 'Xperia X10'],\n 'X10iv': ['Sony Ericsson', 'Xperia X10'],\n 'X10S': ['Sony Ericsson', 'Xperia X10'],\n 'X10mini': ['Sony Ericsson', 'Xperia X10 Mini'],\n 'X10 Mini': ['Sony Ericsson', 'Xperia X10 Mini'],\n 'X10 Mini Pro': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n 'Z1i': ['Sony Ericsson', 'Xperia Play'],\n 'S51SE': ['Sony Ericsson', 'Xperia Mini'],\n 'IS11S': ['Sony Ericsson', 'Xperia Acro'],\n 'IS12S': ['Sony Ericsson', 'Xperia Acro HD'],\n 'SO-01B': ['Sony Ericsson', 'Xperia X10'],\n 'SO-01C': ['Sony Ericsson', 'Xperia Arc'],\n 'SO-01D': ['Sony Ericsson', 'Xperia Play'],\n 'SO-02C': ['Sony Ericsson', 'Xperia Acro'],\n 'SO-02D': ['Sony Ericsson', 'Xperia NX'],\n 'SO-03C': ['Sony Ericsson', 'Xperia Ray'],\n 'SO-03D': ['Sony Ericsson', 'Xperia Acro HD'],\n 'SO-04D': ['Sony', 'Xperia GX'],\n 'SO-05D': ['Sony', 'Xperia SX'],\n 'XPERIA X8': ['Sony Ericsson', 'Xperia X8'],\n 'Xperia X8': ['Sony Ericsson', 'Xperia X8'],\n 'Xperia X10': ['Sony Ericsson', 'Xperia X10'],\n 'Xperia ray': ['Sony Ericsson', 'Xperia Ray'],\n 'Xperia Ray': ['Sony Ericsson', 'Xperia Ray'],\n 'Xperia Arc': ['Sony Ericsson', 'Xperia Arc'],\n 'Xperia Mini': ['Sony Ericsson', 'Xperia Mini'],\n 'Xperia neo': ['Sony Ericsson', 'Xperia Neo'],\n 'Xperia Neo': ['Sony Ericsson', 'Xperia Neo'],\n 'XPERIA NEO': ['Sony Ericsson', 'Xperia Neo'],\n 'Xperia NeoV': ['Sony Ericsson', 'Xperia Neo V'],\n 'Xperia Neo V': ['Sony Ericsson', 'Xperia Neo V'],\n 'Xperia Play': ['Sony Ericsson', 'Xperia Play'],\n 'Sony Ericsson Xperia X1': ['Sony Ericsson', 'Xperia X1'],\n 'SonyHayabusa': ['Sony', 'Xperia Ion'],\n 'Hayabusa': ['Sony', 'Xperia Ion'],\n 'nozomi': ['Sony', 'Xperia S'],\n 'Sony Tablet P': ['Sony', 'Tablet P', 'tablet'],\n 'Sony Tablet S': ['Sony', 'Tablet S', 'tablet'],\n 'NWZ-Z1000Series': ['Sony', 'Walkman Z', 'media'],\n 'NW-Z1000Series': ['Sony', 'Walkman Z', 'media'],\n 'Spice Mi280': ['Spice', 'Mi-280'],\n 'Spice Mi300': ['Spice', 'Mi-300'],\n 'Spice Mi-310': ['Spice', 'Mi-310'],\n 'Spice Mi-425': ['Spice', 'Mi-425'],\n 'SPICE Mi-720': ['Spice', 'Mi-720'],\n 'A7272+': ['Star', 'A7272+'],\n 'e1109 v73 gq1002 ctp': ['Star', 'X18i'],\n 'TS1004T': ['Surf 3Q', 'TS1004T', 'tablet'],\n 'SYTABEX7-2': ['Sylvania', 'SYTABEX7', 'tablet'],\n 'TCL A860': ['TCL', 'A860'],\n 'TCL A906': ['TCL', 'A906'],\n 'TCL A909': ['TCL', 'A909'],\n 'TCL A919': ['TCL', 'A919'],\n 'TCL A990': ['TCL', 'A990'],\n 'TCL A996': ['TCL', 'A996'],\n 'TCL A998': ['TCL', 'A998'],\n 'TCL GENESEE E708': ['TCL', 'Genesee E708'],\n 'A10t(5DM3)': ['Teclast', 'A10T', 'tablet'],\n 'P72': ['Teclast', 'P72', 'tablet'],\n 'P76TI': ['Teclast', 'P76Ti', 'tablet'],\n 'P81HD': ['Teclast', 'P81HD', 'tablet'],\n 'P85(R8A1)': ['Teclast', 'P85', 'tablet'],\n 'T720 SE': ['Teclast', 'T720', 'tablet'],\n 'T760 from moage.com': ['Teclast', 'T760', 'tablet'],\n 'tegav2': ['Tegatech', 'TEGA v2', 'tablet'],\n 'TM-7025': ['teXet', 'TM-7025', 'tablet'],\n 'MoFing': ['Thomson', 'MoFing', 'tablet'],\n 'Ultimate10': ['Tomtec', 'Ultimate10', 'tablet'],\n 'Thl V7': ['THL', 'V7'],\n 'ThL V7': ['THL', 'V7'],\n 'ThL V8': ['THL', 'V8'],\n 'ThL V9': ['THL', 'V9'],\n 'ThL V11': ['THL', 'V11'],\n 'TSB CLOUD COMPANION;TOSHIBA AC AND AZ': ['Toshiba', 'Dynabook AZ', 'desktop'],\n 'TOSHIBA AC AND AZ': ['Toshiba', 'Dynabook AZ', 'desktop'],\n 'TOSHIBA FOLIO AND A': ['Toshiba', 'Folio 100', 'tablet'],\n 'T-01C': ['Toshiba', 'Regza T-01C'],\n 'T-01D': ['Toshiba', 'Regza T-01D'],\n 'IS04': ['Toshiba', 'Regza IS04'],\n 'IS11T': ['Toshiba', 'Regza IS11T'],\n 'AT1S0': ['Toshiba', 'Regza AT1S0'],\n 'Tostab03': ['Toshiba', 'Regza AT100', 'tablet'],\n 'AT100': ['Toshiba', 'Regza AT100', 'tablet'],\n 'AT200': ['Toshiba', 'Regza AT200', 'tablet'],\n 'AT470': ['Toshiba', 'Regza AT470', 'tablet'],\n 'AT570': ['Toshiba', 'Regza AT570', 'tablet'],\n 'AT830': ['Toshiba', 'Regza AT830', 'tablet'],\n 'Folio 100': ['Toshiba', 'Folio 100', 'tablet'],\n 'folio100': ['Toshiba', 'Folio 100', 'tablet'],\n 'THRiVE': ['Toshiba', 'THRiVE', 'tablet'],\n 'Fantastic T3': ['TWM', 'Fantastic T3'],\n 'M70014': ['United Star Technology', 'M70014', 'tablet'],\n 'PS47': ['Velocity Micro', 'Cruz PS47', 'tablet'],\n 'T301': ['Velocity Micro', 'Cruz T301', 'tablet'],\n 'Vibo-A688': ['FIH', 'Vibo A688'],\n 'Videocon-V7500': ['Videocon', 'V7500'],\n 'GTablet': ['ViewSonic', 'gTablet', 'tablet'],\n 'GtabComb': ['ViewSonic', 'gTablet', 'tablet'],\n 'TeamDRH ICS for GTablet': ['ViewSonic', 'gTablet', 'tablet'],\n 'ViewPad7': ['ViewSonic', 'ViewPad 7', 'tablet'],\n 'ViewPad 10e': ['ViewSonic', 'ViewPad 10e', 'tablet'],\n 'VTAB1008': ['Vizio', 'VTAB1008', 'tablet'],\n 'VTAB3010': ['Vizio', 'VTAB3010', 'tablet'],\n 'VOTO W5300': ['VOTO', 'W5300'],\n 'xPAD-70': ['WayteQ', 'xPAD-70', 'tablet'],\n 'xTAB-70': ['WayteQ', 'xTAB-70', 'tablet'],\n 'WellcoM-A99': ['WellcoM', 'A99'],\n 'N12': ['Window', 'N12', 'tablet'],\n 'N12R': ['Window', 'N12R', 'tablet'],\n 'N50': ['Window', 'N50', 'tablet'],\n 'N50DT': ['Window', 'N50DT', 'tablet'],\n 'N50GT': ['Window', 'N50GT', 'tablet'],\n 'N50GT A': ['Window', 'N50GT-A', 'tablet'],\n 'N70': ['Window', 'N70', 'tablet'],\n 'N70 DUAL CORE': ['Window', 'N70 Dual Core', 'tablet'],\n 'N80': ['Window', 'N80', 'tablet'],\n 'N90': ['Window', 'N90', 'tablet'],\n 'N90 DUAL CORE2 V12': ['Window', 'N90 Dual Core', 'tablet'],\n 'N612': ['Wishway', 'N612'],\n 'AT-AS43D': ['Wolfgang', 'AT-AS43D'],\n 'M12': ['Wopad', 'M12', 'tablet'],\n 'WM8650': ['WonderMedia', 'WM8650', 'tablet'],\n 'MI-ONE': ['Xiaomi', 'MI-ONE'],\n 'MI-ONE C1': ['Xiaomi', 'MI-ONE C1'],\n 'MI-ONE Plus': ['Xiaomi', 'MI-ONE Plus'],\n 'MI 1S': ['Xiaomi', 'MI-ONE Plus'],\n 'MI 1SC': ['Xiaomi', 'MI-ONE 1SC'],\n 'mione plus': ['Xiaomi', 'MI-ONE Plus'],\n 'MI-TWO': ['Xiaomi', 'MI-TWO'],\n 'MI 2': ['Xiaomi', 'MI-TWO'],\n 'MI 2S': ['Xiaomi', 'MI-TWO Plus'],\n 'MI 2SC': ['Xiaomi', 'MI-TWO Plus'],\n 'Q07CL01': ['XVision', 'Q07', 'tablet'],\n 'N6': ['Yarvik', '210 Tablet', 'tablet'],\n 'EMR1879': ['Yidong', 'EMR1879', 'tablet'],\n 'yusun W702': ['Yusun', 'W702'],\n 'YX-YUSUN E80': ['Yusun', 'E80'],\n 'zt180': ['Zenithink', 'ZT-180', 'tablet'],\n 'Jaguar7': ['ZiiLabs', 'Jaguar 7', 'tablet'],\n 'Ziss Ranger HD': ['Ziss', 'Ranger HD'],\n 'ZTE Libra': ['ZTE', 'Libra'],\n 'ZTE-T T9': ['ZTE', 'Light Tab T9', 'tablet'],\n 'V9': ['ZTE', 'Light Tab V9', 'tablet'],\n 'V9e+': ['ZTE', 'Light Tab 2', 'tablet'],\n 'V9A': ['ZTE', 'Light Tab 2', 'tablet'],\n 'Light Tab 2W': ['ZTE', 'Light Tab 2', 'tablet'],\n 'Light Tab 2': ['ZTE', 'Light Tab 2', 'tablet'],\n 'V9C': ['ZTE', 'Light Tab 3', 'tablet'],\n 'V55': ['ZTE', 'Optik', 'tablet'],\n 'Acqua': ['ZTE', 'Acqua'],\n 'Blade': ['ZTE', 'Blade'],\n 'Blade-V880': ['ZTE', 'Blade'],\n 'ZTE-U V880': ['ZTE', 'Blade'],\n 'Blade-opda': ['ZTE', 'Blade'],\n 'ZTE-BLADE': ['ZTE', 'Blade'],\n 'ZTE Blade': ['ZTE', 'Blade'],\n 'ZTE V880': ['ZTE', 'Blade'],\n 'ZTE-U(V)880+': ['ZTE', 'Blade'],\n 'V880': ['ZTE', 'Blade'],\n 'a5': ['ZTE', 'Blade'],\n 'Blade2': ['ZTE', 'Blade 2'],\n 'Blade S': ['ZTE', 'Blade S'],\n 'X500': ['ZTE', 'Score'],\n 'ZTE-X500': ['ZTE', 'Score'],\n 'Skate': ['ZTE', 'Skate'],\n 'ZTE Skate': ['ZTE', 'Skate'],\n 'ZTE-Skate': ['ZTE', 'Skate'],\n 'ZTE-SKATE': ['ZTE', 'Skate'],\n 'ZTE-V960': ['ZTE', 'Skate'],\n 'ZTE-U V960': ['ZTE', 'Skate'],\n 'ZTE Racer': ['ZTE', 'Racer'],\n 'ZTE-RACER': ['ZTE', 'Racer'],\n 'MTC 916': ['ZTE', 'Racer'],\n 'Racer': ['ZTE', 'Racer'],\n 'RacerII': ['ZTE', 'Racer 2'],\n 'RACERII': ['ZTE', 'Racer 2'],\n 'ZTE Roamer': ['ZTE', 'Roamer'],\n 'N860': ['ZTE', 'Warp'],\n 'N880': ['ZTE', 'Blade'],\n 'ZTE-T U802': ['ZTE', 'T-U802'],\n 'ZTE-T U806': ['ZTE', 'T-U806'],\n 'ZTE-T U812': ['ZTE', 'T-U812'],\n 'ZTE-T U830': ['ZTE', 'T-U830'],\n 'ZTE-T U880': ['ZTE', 'T-U880'],\n 'ZTE T U880': ['ZTE', 'T-U880'],\n 'ZTE-TU880': ['ZTE', 'T-U880'],\n 'ZTE-TU900': ['ZTE', 'T-U900'],\n 'ZTE-T U960': ['ZTE', 'T-U960'],\n 'ZTE-TU960s': ['ZTE', 'T-U960'],\n 'ZTE-T U960s': ['ZTE', 'T-U960'],\n 'ZTE U N720': ['ZTE', 'U-N720'],\n 'ZTE-U V856': ['ZTE', 'U-V856'],\n 'ZTE-U V857': ['ZTE', 'U-V857'],\n 'ZTE-U V881': ['ZTE', 'U-V881'],\n 'ZTE-U X850': ['ZTE', 'U-X850'],\n 'ZTE-U X876': ['ZTE', 'U-X876'],\n 'ZTE-X876': ['ZTE', 'U-X876'],\n 'ZTE-C R750': ['ZTE', 'C-R750'],\n 'ZTE-C N600': ['ZTE', 'C-N600'],\n 'ZTE-C N600+': ['ZTE', 'C-N600'],\n 'ZTE-C N606': ['ZTE', 'C-N606'],\n 'ZTE-C N700': ['ZTE', 'C-N700'],\n 'ZTE-C N760': ['ZTE', 'C-N760'],\n 'ZTE-C N880': ['ZTE', 'C-N880'],\n 'ZTE-C N880S': ['ZTE', 'C-N880'],\n 'ZTE-C N880s': ['ZTE', 'C-N880'],\n 'ZTE-C X500': ['ZTE', 'C-X500'],\n 'ZTE-C X920': ['ZTE', 'C-X920'],\n 'ZXY-ZTE-C X920': ['ZTE', 'C-X920'],\n 'ZTE GV821': ['ZTE', 'G-V821'],\n 'ZTE N880E': ['ZTE', 'N880E'],\n 'ZTE-N880E': ['ZTE', 'N880E'],\n 'MIUI N880S': ['ZTE', 'N880S'],\n 'ZTE N882E': ['ZTE', 'N882E'],\n 'ZTE N855D': ['ZTE', 'N855D'],\n 'ZTE-N910': ['ZTE', 'N910'],\n 'E810': ['ZTE', 'E810'],\n 'u880': ['ZTE', 'U880'],\n 'ZTE U880E': ['ZTE', 'U880E'],\n 'U880': ['ZTE', 'U880'],\n 'ZTE U970': ['ZTE', 'U970'],\n 'ZTE V768': ['ZTE', 'V768'],\n 'ZTE-V856': ['ZTE', 'V856'],\n 'ZTE V877b': ['ZTE', 'V877'],\n 'ZTE V889D': ['ZTE', 'V889'],\n 'ZTE-Z990': ['ZTE', 'Z990'],\n 'ZTEU790': ['ZTE', 'U790'],\n '003Z': ['ZTE', 'Softbank 003Z'],\n '008Z': ['ZTE', 'Softbank 008Z'],\n '009Z': ['ZTE', 'Softbank Star7'],\n 'i-mobile i691': ['i-Mobile', 'i691'],\n 'i-mobile i695': ['i-Mobile', 'i695'],\n 'i-mobile i858': ['i-Mobile', 'i858'],\n 'i-mobile 3G 8500': ['i-Mobile', '3G 8500'],\n 'i-mobile I-Note': ['i-Mobile', 'i-Note', 'tablet'],\n 'Optimus Boston': ['Optimus', 'Boston'],\n 'Optimus San Francisco': ['Optimus', 'San Francisco'],\n 'Optimus Monte Carlo': ['Optimus', 'Monte Carlo'],\n 'Orange Boston': ['Orange', 'Boston'],\n 'Orange Monte Carlo': ['Orange', 'Monte Carlo'],\n 'San Francisco': ['Orange', 'San Francisco'],\n 'San Francisco for Orange': ['Orange', 'San Francisco'],\n 'Orange San Francisco': ['Orange', 'San Francisco'],\n 'MOVE': ['T-Mobile', 'MOVE'],\n 'T-Mobile G1': ['T-Mobile', 'G1'],\n 'T-Mobile G2': ['T-Mobile', 'G2'],\n 'T-Mobile G2 Touch': ['T-Mobile', 'G2'],\n 'LG-P999': ['T-Mobile', 'G2x'],\n 'LG-E739': ['T-Mobile', 'myTouch'],\n 'T-Mobile myTouch 3G': ['T-Mobile', 'myTouch 3G'],\n 'T-Mobile myTouch 3G Slide': ['T-Mobile', 'myTouch 3G Slide'],\n 'T-Mobile Espresso': ['T-Mobile', 'myTouch 3G Slide'],\n 'HTC myTouch 3G Slide': ['T-Mobile', 'myTouch 3G Slide'],\n 'T-Mobile myTouch 4G': ['T-Mobile', 'myTouch 4G'],\n 'HTC Glacier': ['T-Mobile', 'myTouch 4G'],\n 'HTC Panache': ['T-Mobile', 'myTouch 4G'],\n 'myTouch4G': ['T-Mobile', 'myTouch 4G'],\n 'My Touch 4G': ['T-Mobile', 'myTouch 4G'],\n 'HTC Mytouch 4G': ['T-Mobile', 'myTouch 4G'],\n 'HTC My Touch 4G': ['T-Mobile', 'myTouch 4G'],\n 'HTC mytouch4g': ['T-Mobile', 'myTouch 4G'],\n 'HTC myTouch 4G Slide': ['T-Mobile', 'myTouch 4G Slide'],\n 'myTouch 4G Slide': ['T-Mobile', 'myTouch 4G Slide'],\n 'T-Mobile myTouch Q': ['T-Mobile', 'myTouch Q'],\n 'LG-C800': ['T-Mobile', 'myTouch Q'],\n 'Pulse Mini': ['T-Mobile', 'Pulse Mini'],\n 'Vodafone 845': ['Vodafone', '845 Nova'],\n 'Vodafone 858': ['Vodafone', '858 Smart'],\n 'Vodafone 945': ['Vodafone', '945'],\n 'Vodafone Smart II': ['Vodafone', 'Smart II'],\n 'SmartTab10': ['Vodafone', 'SmartTab 10', 'tablet'],\n 'SCH-N719': ['Samsung', 'Galaxy Note II'],\n 'Coolpad 8190': ['Coolpad', '8190'],\n 'U705T': ['Oppo', 'Ulike2'],\n 'Coolpad 8020+': ['Coolpad', '8020'],\n 'Huawei Y310-5000': ['Huawei', 'Y310'],\n 'GT-S7572': ['Samsung', 'Galaxy Trend Duos II'],\n 'Lenovo A278t': ['Lenovo', 'A278t'],\n 'Lenovo A690': ['Lenovo', 'A690'],\n 'GT-I8262D': ['Samsung', 'LePhone I8262D'],\n 'Lenovo A278t': ['Lenovo', 'A278t'],\n 'MI 2C': ['Xiaomi', 'MI-TWO'],\n 'Coolpad 8070': ['Coolpad', '8070'],\n 'R813T': ['Oppo', 'R813T'],\n 'ZTE U930': ['ZTE', 'U930'],\n 'Lenovo A360': ['Lenovo', 'LePhone A360'],\n 'SCH-N719': ['Samsung', 'Galaxy Note II'],\n 'Coolpad 8010': ['Coolpad', '8010'],\n 'LENOVO-Lenovo-A288t': ['Lenovo', 'A288t'],\n 'U701T': ['Oppo', 'U701T'],\n 'ZTEU795': ['Coolpad', 'U795'],\n 'Haier-HT-I617': ['Haier', 'I617'],\n 'ZTEU880s': ['ZTE', 'T-U880'],\n 'GT-S6352': ['Samsung', 'GT-S6352'],\n 'GT-S7568': ['Samsung', 'GT-S7568'],\n 'K-Touch T619+': ['K-Touch', 'T619'],\n 'MI 2A': ['Xiaomi', 'MI-TWO A'],\n 'GT-N7108': ['Samsung', 'Galaxy Note II'],\n 'K-Touch T621': ['K-Touch', 'T621'],\n 'LENOVO-Lenovo-A298t': ['Lenovo', 'A298'],\n 'Coolpad 8150': ['Coolpad', '8150'],\n '5860S': ['Coolpad', '5860'],\n 'ZTEU807': ['ZTE', 'U807'],\n 'SCH-I739': ['Samsung', 'SCH-I739'],\n 'SCH-I829': ['Samsung', 'SCH-I829'],\n 'HS-E830': ['Hisense', 'E830'],\n 'HS-E920': ['Hisense', 'E920'],\n 'Lenovo S720': ['Lenovo', 'S720'],\n 'MI 2C': ['Xiaomi', 'MI-TWO'],\n 'OPPO R813T': ['Oppo', 'R813'],\n 'SCH-I879': ['Samsung', 'Galaxy Note'],\n 'GT-S6102E': ['Samsung', 'Galaxy Y Duos']\n }\n\n var BLACKBERRY_MODELS = {\n '9600': 'Bold',\n '9650': 'Bold',\n '9700': 'Bold',\n '9780': 'Bold',\n '9790': 'Bold',\n '9900': 'Bold',\n '9930': 'Bold',\n '8300': 'Curve',\n '8310': 'Curve',\n '8320': 'Curve',\n '8330': 'Curve',\n '8350i': 'Curve',\n '8520': 'Curve',\n '8530': 'Curve',\n '8900': 'Curve',\n '9220': 'Curve',\n '9300': 'Curve',\n '9330': 'Curve',\n '9350': 'Curve',\n '9360': 'Curve',\n '9370': 'Curve',\n '9380': 'Curve',\n '8100': 'Pearl',\n '8110': 'Pearl',\n '8120': 'Pearl',\n '8130': 'Pearl',\n '8220': 'Pearl',\n '8230': 'Pearl',\n '9100': 'Pearl',\n '9105': 'Pearl',\n '9530': 'Storm',\n '9550': 'Storm',\n '9670': 'Style',\n '9800': 'Torch',\n '9810': 'Torch',\n '9850': 'Torch',\n '9860': 'Torch',\n '9630': 'Tour',\n '9981': 'Porsche P'\n };\n\n\n var Version = function () {\n this.initialize.apply(this, Array.prototype.slice.call(arguments))\n };\n Version.prototype = {\n initialize: function (v) {\n this.original = v.value || null;\n this.alias = v.alias || null;\n \n }\n }\n\n var Detected = function () {\n this.initialize.apply(this, arguments)\n };\n Detected.prototype = {\n initialize: function (ua, options) {\n this.options = {\n useFeatures: options && options.useFeatures || false,\n detectCamouflage: options && options.detectCamouflage || true\n }\n\n this.browser = {\n 'stock': true,\n 'hidden': false,\n 'channel': ''\n };\n this.engine = {};\n this.os = {};\n this.device = {\n 'type': 'desktop',\n 'identified': false\n };\n\n this.camouflage = false;\n this.features = [];\n this.detect(ua);\n },\n\n detect: function (ua) {\n\n /****************************************************\n * Unix\n */\n\n if (ua.match('Unix')) {\n this.os.name = 'Unix';\n }\n\n /****************************************************\n * FreeBSD\n */\n\n if (ua.match('FreeBSD')) {\n this.os.name = 'FreeBSD';\n }\n\n /****************************************************\n * OpenBSD\n */\n\n if (ua.match('OpenBSD')) {\n this.os.name = 'OpenBSD';\n }\n\n /****************************************************\n * NetBSD\n */\n\n if (ua.match('NetBSD')) {\n this.os.name = 'NetBSD';\n }\n\n /****************************************************\n * SunOS\n */\n\n if (ua.match('SunOS')) {\n this.os.name = 'Solaris';\n }\n\n /****************************************************\n * Linux\n */\n\n if (ua.match('Linux')) {\n this.os.name = 'Linux';\n\n if (ua.match('CentOS')) {\n this.os.name = 'CentOS';\n if (match = /CentOS\\/[0-9\\.\\-]+el([0-9_]+)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1].replace(/_/g, '.')\n });\n }\n }\n\n if (ua.match('Debian')) {\n this.os.name = 'Debian';\n }\n\n if (ua.match('Fedora')) {\n this.os.name = 'Fedora';\n if (match = /Fedora\\/[0-9\\.\\-]+fc([0-9]+)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n if (ua.match('Gentoo')) {\n this.os.name = 'Gentoo';\n }\n\n if (ua.match('Kubuntu')) {\n this.os.name = 'Kubuntu';\n }\n\n if (ua.match('Mandriva Linux')) {\n this.os.name = 'Mandriva';\n if (match = /Mandriva Linux\\/[0-9\\.\\-]+mdv([0-9]+)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n if (ua.match('Mageia')) {\n this.os.name = 'Mageia';\n if (match = /Mageia\\/[0-9\\.\\-]+mga([0-9]+)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n if (ua.match('Red Hat')) {\n this.os.name = 'Red Hat';\n if (match = /Red Hat[^\\/]*\\/[0-9\\.\\-]+el([0-9_]+)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1].replace(/_/g, '.')\n });\n }\n }\n\n if (ua.match('Slackware')) {\n this.os.name = 'Slackware';\n }\n\n if (ua.match('SUSE')) {\n this.os.name = 'SUSE';\n }\n\n if (ua.match('Turbolinux')) {\n this.os.name = 'Turbolinux';\n }\n\n if (ua.match('Ubuntu')) {\n this.os.name = 'Ubuntu';\n if (match = /Ubuntu\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n }\n\n /****************************************************\n * iOS\n */\n\n if (ua.match('iPhone( Simulator)?;') || ua.match('iPad;') || ua.match('iPod;') || ua.match(/iPhone\\s*\\d*s?[cp]?;/i)) {\n this.os.name = 'iOS';\n this.os.version = new Version({\n value: '1.0'\n });\n\n if (match = /OS (.*) like Mac OS X/.exec(ua)) {\n this.os.version = new Version({\n value: match[1].replace(/_/g, '.')\n });\n }\n\n if (ua.match('iPhone Simulator;')) {\n this.device.type = 'emulator';\n } else if (ua.match('iPod;')) {\n this.device.type = 'media';\n this.device.manufacturer = 'Apple';\n this.device.model = 'iPod Touch';\n } else if (ua.match('iPhone;') || ua.match(/iPhone\\s*\\d*s?[cp]?;/i)) {\n this.device.type = 'mobile';\n this.device.manufacturer = 'Apple';\n this.device.model = 'iPhone';\n } else {\n this.device.type = 'tablet';\n this.device.manufacturer = 'Apple';\n this.device.model = 'iPad';\n }\n\n this.device.identified = true;\n }\n\n /****************************************************\n * MacOS X\n */\n\n else if (ua.match('Mac OS X')) {\n this.os.name = 'Mac OS X';\n\n if (match = /Mac OS X (10[0-9\\._]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1].replace(/_/g, '.')\n });\n }\n }\n\n /****************************************************\n * Windows\n */\n\n if (ua.match('Windows')) {\n this.os.name = 'Windows';\n\n if (match = /Windows NT ([0-9]\\.[0-9])/.exec(ua)) {\n this.os.version = parseVersion(match[1]);\n\n switch (match[1]) {\n case '6.2':\n this.os.version = new Version({\n value: match[1],\n alias: '8'\n });\n break;\n case '6.1':\n this.os.version = new Version({\n value: match[1],\n alias: '7'\n });\n break;\n case '6.0':\n this.os.version = new Version({\n value: match[1],\n alias: 'Vista'\n });\n break;\n case '5.2':\n this.os.version = new Version({\n value: match[1],\n alias: 'Server 2003'\n });\n break;\n case '5.1':\n this.os.version = new Version({\n value: match[1],\n alias: 'XP'\n });\n break;\n case '5.0':\n this.os.version = new Version({\n value: match[1],\n alias: '2000'\n });\n break;\n default:\n this.os.version = new Version({\n value: match[1],\n alias: 'NT ' + this.os.version\n });\n }\n }\n\n if (ua.match('Windows 95') || ua.match('Win95') || ua.match('Win 9x 4.00')) {\n this.os.version = new Version({\n value: '4.0',\n alias: '95'\n });\n }\n\n if (ua.match('Windows 98') || ua.match('Win98') || ua.match('Win 9x 4.10')) {\n this.os.version = new Version({\n value: '4.1',\n alias: '98'\n });\n }\n\n if (ua.match('Windows ME') || ua.match('WinME') || ua.match('Win 9x 4.90')) {\n this.os.version = new Version({\n value: '4.9',\n alias: 'ME'\n });\n }\n\n if (ua.match('Windows XP') || ua.match('WinXP')) {\n this.os.name = new Version({\n value: '5.1',\n alias: 'XP'\n });\n }\n\n if (ua.match('WP7')) {\n this.os.name = 'Windows Phone';\n this.os.version = new Version({\n value: '7.0',\n details: 2\n });\n this.device.type = 'mobile';\n this.browser.mode = 'desktop';\n }\n\n if (ua.match('Windows CE') || ua.match('WinCE') || ua.match('WindowsCE')) {\n if (ua.match(' IEMobile')) {\n this.os.name = 'Windows Mobile';\n\n if (ua.match(' IEMobile 8')) {\n this.os.version = new Version({\n value: '6.5',\n details: 2\n });\n }\n\n if (ua.match(' IEMobile 7')) {\n this.os.version = new Version({\n value: '6.1',\n details: 2\n });\n }\n\n if (ua.match(' IEMobile 6')) {\n this.os.version = new Version({\n value: '6.0',\n details: 2\n });\n }\n } else {\n this.os.name = 'Windows CE';\n\n if (match = /WindowsCEOS\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1],\n details: 2\n });\n }\n\n if (match = /Windows CE ([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1],\n details: 2\n });\n }\n }\n\n this.device.type = 'mobile';\n }\n\n if (ua.match('Windows Mobile')) {\n this.os.name = 'Windows Mobile';\n this.device.type = 'mobile';\n }\n\n if (match = /WindowsMobile\\/([0-9.]*)/.exec(ua)) {\n this.os.name = 'Windows Mobile';\n this.os.version = new Version({\n value: match[1],\n details: 2\n });\n this.device.type = 'mobile';\n }\n\n if (ua.match('Windows Phone [0-9]')) {\n this.os.name = 'Windows Mobile';\n this.os.version = new Version({\n value: ua.match(/Windows Phone ([0-9.]*)/)[1],\n details: 2\n });\n this.device.type = 'mobile';\n }\n\n if (ua.match('Windows Phone OS')) {\n this.os.name = 'Windows Phone';\n this.os.version = new Version({\n value: ua.match(/Windows Phone OS ([0-9.]*)/)[1],\n details: 2\n });\n\n if (this.os.version < 7) {\n this.os.name = 'Windows Mobile';\n }\n\n if (match = /IEMobile\\/[^;]+; ([^;]+); ([^;]+)[;|\\)]/.exec(ua)) {\n this.device.manufacturer = match[1];\n this.device.model = match[2];\n }\n\n this.device.type = 'mobile';\n\n var manufacturer = this.device.manufacturer;\n var model = cleanupModel(this.device.model);\n\n if (typeof WINDOWS_PHONE_MODELS[manufacturer] !== 'undefined' && typeof WINDOWS_PHONE_MODELS[manufacturer][model] !== 'undefined') {\n this.device.manufacturer = WINDOWS_PHONE_MODELS[manufacturer][model][0];\n this.device.model = WINDOWS_PHONE_MODELS[manufacturer][model][1];\n this.device.identified = true;\n }\n\n if (manufacturer === 'Microsoft' && model === 'XDeviceEmulator') {\n this.device.manufacturer = null;\n this.device.model = null;\n this.device.type = 'emulator';\n this.device.identified = true;\n }\n }\n }\n\n /****************************************************\n * Android\n */\n if (ua.match('Android')) {\n this.os.name = 'Android';\n this.os.version = null;\n\n if (match = /Android(?: )?(?:AllPhone_|CyanogenMod_)?(?:\\/)?v?([0-9.]+)/.exec(ua.replace('-update', '.'))) {\n this.os.version = new Version({\n value: match[1],\n details: 3\n })\n }\n\n if (ua.match('Android Eclair')) {\n this.os.version = new Version({\n value: '2.0',\n details: 3\n });\n }\n\n this.device.type = 'mobile';\n if (this.os.version >= 3) this.device.type = 'tablet';\n if (this.os.version >= 4 && ua.match('Mobile')) this.device.type = 'mobile';\n\n if (match = /Eclair; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?) Build\\/([^\\/]*)\\//.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /; ([^;]*[^;\\s])\\s+Build/.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; ([^;]*[^;\\s]);\\s+Build/.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /\\(([^;]+);U;Android\\/[^;]+;[0-9]+\\*[0-9]+;CTC\\/2.0\\)/.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /;\\s?([^;]+);\\s?[0-9]+\\*[0-9]+;\\s?CTC\\/2.0/.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /zh-cn;\\s*(.*?)(\\/|build)/i.exec(ua)) {\n this.device.model = match[1];\n } else if (match = /Android [^;]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?([^)]+)\\)/.exec(ua)) {\n if (!ua.match(/[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?/)) {\n this.device.model = match[1];\n }\n } else if (match = /^(.+?)\\/\\S+/i.exec(ua)) {\n this.device.model = match[1];\n }\n\n\n /* Sometimes we get a model name that starts with Android, in that case it is a mismatch and we should ignore it */\n if (this.device.model && this.device.model.substring(0, 7) === 'Android') {\n this.device.model = null;\n }\n\n if (this.device.model) {\n var model = cleanupModel(this.device.model);\n\n if (typeof ANDROID_MODELS[model] !== 'undefined') {\n this.device.manufacturer = ANDROID_MODELS[model][0];\n this.device.model = ANDROID_MODELS[model][1];\n if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n this.device.identified = true;\n }\n\n if (model === 'Emulator' || model === 'x86 Emulator' || model === 'x86 VirtualBox' || model === 'vm') {\n this.device.manufacturer = null;\n this.device.model = null;\n this.device.type = 'emulator';\n this.device.identified = true;\n }\n }\n\n if (ua.match('HP eStation')) {\n this.device.manufacturer = 'HP';\n this.device.model = 'eStation';\n this.device.type = 'tablet';\n this.device.identified = true;\n }\n if (ua.match('Pre\\/1.0')) {\n this.device.manufacturer = 'Palm';\n this.device.model = 'Pre';\n this.device.identified = true;\n }\n if (ua.match('Pre\\/1.1')) {\n this.device.manufacturer = 'Palm';\n this.device.model = 'Pre Plus';\n this.device.identified = true;\n }\n if (ua.match('Pre\\/1.2')) {\n this.device.manufacturer = 'Palm';\n this.device.model = 'Pre 2';\n this.device.identified = true;\n }\n if (ua.match('Pre\\/3.0')) {\n this.device.manufacturer = 'HP';\n this.device.model = 'Pre 3';\n this.device.identified = true;\n }\n if (ua.match('Pixi\\/1.0')) {\n this.device.manufacturer = 'Palm';\n this.device.model = 'Pixi';\n this.device.identified = true;\n }\n if (ua.match('Pixi\\/1.1')) {\n this.device.manufacturer = 'Palm';\n this.device.model = 'Pixi Plus';\n this.device.identified = true;\n }\n if (ua.match('P160UN?A?\\/1.0')) {\n this.device.manufacturer = 'HP';\n this.device.model = 'Veer';\n this.device.identified = true;\n }\n }\n\n /****************************************************\n * Google TV\n */\n\n if (ua.match('GoogleTV')) {\n this.os.name = 'Google TV';\n\n if (ua.match('Chrome/5.')) {\n this.os.version = new Version({\n value: '1'\n });\n }\n\n if (ua.match('Chrome/11.')) {\n this.os.version = new Version({\n value: '2'\n });\n }\n\n this.device.type = 'television';\n }\n\n /****************************************************\n * WoPhone\n */\n\n if (ua.match('WoPhone')) {\n this.os.name = 'WoPhone';\n\n if (match = /WoPhone\\/([0-9\\.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * BlackBerry\n */\n\n if (ua.match('BlackBerry')) {\n this.os.name = 'BlackBerry OS';\n\n if (!ua.match('Opera')) {\n if (match = /BlackBerry([0-9]*)\\/([0-9.]*)/.exec(ua)) {\n this.device.model = match[1];\n this.os.version = new Version({\n value: match[2],\n details: 2\n });\n }\n\n if (match = /; BlackBerry ([0-9]*);/.exec(ua)) {\n this.device.model = match[1];\n }\n\n if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1],\n details: 2\n });\n }\n\n if (this.os.version >= 10) {\n this.os.name = 'BlackBerry';\n }\n\n if (typeof this.device.model !== 'undefined') {\n if (typeof BLACKBERRY_MODELS[this.device.model] !== 'undefined') {\n this.device.model = 'BlackBerry ' + BLACKBERRY_MODELS[this.device.model] + ' ' + this.device.model;\n } else {\n this.device.model = 'BlackBerry ' + this.device.model;\n }\n } else {\n this.device.model = 'BlackBerry';\n }\n } else {\n this.device.model = 'BlackBerry';\n }\n\n this.device.manufacturer = 'RIM';\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n /****************************************************\n * BlackBerry PlayBook\n */\n\n if (ua.match('RIM Tablet OS')) {\n this.os.name = 'BlackBerry Tablet OS';\n this.os.version = new Version({\n value: ua.match(/RIM Tablet OS ([0-9.]*)/)[1],\n details: 2\n });\n\n this.device.manufacturer = 'RIM';\n this.device.model = 'BlackBerry PlayBook';\n this.device.type = 'tablet';\n this.device.identified = true;\n } else if (ua.match('PlayBook')) {\n if (match = /Version\\/(10[0-9.]*)/.exec(ua)) {\n this.os.name = 'BlackBerry';\n this.os.version = new Version({\n value: match[1],\n details: 2\n });\n\n this.device.manufacturer = 'RIM';\n this.device.model = 'BlackBerry PlayBook';\n this.device.type = 'tablet';\n this.device.identified = true;\n }\n }\n\n\n /****************************************************\n * WebOS\n */\n\n if (ua.match('(?:web|hpw)OS')) {\n this.os.name = 'webOS';\n this.os.version = new Version({\n value: ua.match(/(?:web|hpw)OS\\/([0-9.]*)/)[1]\n });\n\n if (ua.match('tablet')) this.device.type = 'tablet';\n else this.device.type = 'mobile';\n\n this.device.manufacturer = ua.match('hpwOS') ? 'HP' : 'Palm';\n if (ua.match('Pre\\/1.0')) this.device.model = 'Pre';\n if (ua.match('Pre\\/1.1')) this.device.model = 'Pre Plus';\n if (ua.match('Pre\\/1.2')) this.device.model = 'Pre2';\n if (ua.match('Pre\\/3.0')) this.device.model = 'Pre3';\n if (ua.match('Pixi\\/1.0')) this.device.model = 'Pixi';\n if (ua.match('Pixi\\/1.1')) this.device.model = 'Pixi Plus';\n if (ua.match('P160UN?A?\\/1.0')) this.device.model = 'Veer';\n if (ua.match('TouchPad\\/1.0')) this.device.model = 'TouchPad';\n\n if (ua.match('Emulator\\/') || ua.match('Desktop\\/')) {\n this.device.type = 'emulator';\n this.device.manufacturer = null;\n this.device.model = null;\n }\n\n this.device.identified = true;\n }\n\n /****************************************************\n * S60\n */\n\n if (ua.match('Symbian') || ua.match('Series[ ]?60') || ua.match('S60')) {\n this.os.name = 'Series60';\n\n if (ua.match('SymbianOS/9.1') && !ua.match('Series60')) {\n this.os.version = new Version({\n value: '3.0'\n });\n }\n\n if (match = /Series60\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n if (match = /Nokia([^\\/;]+)[\\/|;]/.exec(ua)) {\n if (match[1] !== 'Browser') {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.identified = true;\n }\n }\n\n if (match = /Vertu([^\\/;]+)[\\/|;]/.exec(ua)) {\n this.device.manufacturer = 'Vertu';\n this.device.model = match[1];\n this.device.identified = true;\n }\n\n if (match = /Symbian; U; ([^;]+); [a-z][a-z]\\-[a-z][a-z]/i.exec(ua)) {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.identified = true;\n }\n\n if (match = /Samsung\\/([^;]*);/.exec(ua)) {\n this.device.manufacturer = STRINGS_SAMSUNG;\n this.device.model = match[1];\n this.device.identified = true;\n }\n\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * S40\n */\n\n if (ua.match('Series40')) {\n this.os.name = 'Series40';\n\n if (match = /Nokia([^\\/]+)\\//.exec(ua)) {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.identified = true;\n }\n\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * MeeGo\n */\n\n if (ua.match('MeeGo')) {\n this.os.name = 'MeeGo';\n this.device.type = 'mobile';\n\n if (match = /Nokia([^\\)]+)\\)/.exec(ua)) {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.identified = true;\n }\n }\n\n /****************************************************\n * Maemo\n */\n\n if (ua.match('Maemo')) {\n this.os.name = 'Maemo';\n this.device.type = 'mobile';\n\n if (match = /(N[0-9]+)/.exec(ua)) {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.identified = true;\n }\n }\n\n /****************************************************\n * Tizen\n */\n\n if (ua.match('Tizen')) {\n this.os.name = 'Tizen';\n\n if (match = /Tizen[\\/ ]([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.type = 'mobile';\n\n if (match = /\\(([^;]+); ([^\\/]+)\\//.exec(ua)) {\n if (match[1] !== 'Linux') {\n this.device.manufacturer = match[1];\n this.device.model = match[2];\n\n if (typeof TIZEN_MODELS[this.device.manufacturer] !== 'undefined' && typeof TIZEN_MODELS[this.device.manufacturer][this.device.model] !== 'undefined') {\n var manufacturer = this.device.manufacturer;\n var model = cleanupModel(this.device.model);\n\n this.device.manufacturer = TIZEN_MODELS[manufacturer][model][0];\n this.device.model = TIZEN_MODELS[manufacturer][model][1];\n this.device.identified = true;\n }\n }\n }\n }\n\n /****************************************************\n * Bada\n */\n\n if (ua.match('[b|B]ada')) {\n this.os.name = 'Bada';\n\n if (match = /[b|B]ada\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.type = 'mobile';\n\n if (match = /\\(([^;]+); ([^\\/]+)\\//.exec(ua)) {\n this.device.manufacturer = match[1];\n this.device.model = cleanupModel(match[2]);\n }\n\n if (typeof BADA_MODELS[this.device.manufacturer] !== 'undefined' && typeof BADA_MODELS[this.device.manufacturer][this.device.model] !== 'undefined') {\n var manufacturer = this.device.manufacturer;\n var model = cleanupModel(this.device.model);\n\n this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n this.device.model = BADA_MODELS[manufacturer][model][1];\n this.device.identified = true;\n }\n }\n\n /****************************************************\n * Brew\n */\n\n if (ua.match(/BREW/i) || ua.match('BMP; U')) {\n this.os.name = 'Brew';\n this.device.type = 'mobile';\n\n if (match = /BREW; U; ([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n } else if (match = /;BREW\\/([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n\n if (match = /\\(([^;]+);U;REX\\/[^;]+;BREW\\/[^;]+;(?:.*;)?[0-9]+\\*[0-9]+;CTC\\/2.0\\)/.exec(ua)) {\n this.device.model = match[1];\n }\n\n if (this.device.model) {\n var model = cleanupModel(this.device.model);\n\n if (typeof BREW_MODELS[model] !== 'undefined') {\n this.device.manufacturer = BREW_MODELS[model][0];\n this.device.model = BREW_MODELS[model][1];\n this.device.identified = true;\n }\n }\n }\n\n /****************************************************\n * MTK\n */\n\n if (ua.match(/\\(MTK;/)) {\n this.os.name = 'MTK';\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * CrOS\n */\n\n if (ua.match('CrOS')) {\n this.os.name = 'Chrome OS';\n this.device.type = 'desktop';\n }\n\n /****************************************************\n * Joli OS\n */\n\n if (ua.match('Joli OS')) {\n this.os.name = 'Joli OS';\n this.device.type = 'desktop';\n\n if (match = /Joli OS\\/([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Haiku\n */\n\n if (ua.match('Haiku')) {\n this.os.name = 'Haiku';\n this.device.type = 'desktop';\n }\n\n /****************************************************\n * QNX\n */\n\n if (ua.match('QNX')) {\n this.os.name = 'QNX';\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * OS/2 Warp\n */\n\n if (ua.match('OS\\/2; Warp')) {\n this.os.name = 'OS/2 Warp';\n this.device.type = 'desktop';\n\n if (match = /OS\\/2; Warp ([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Grid OS\n */\n\n if (ua.match('Grid OS')) {\n this.os.name = 'Grid OS';\n this.device.type = 'tablet';\n\n if (match = /Grid OS ([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * AmigaOS\n */\n\n if (ua.match(/AmigaOS/i)) {\n this.os.name = 'AmigaOS';\n this.device.type = 'desktop';\n\n if (match = /AmigaOS ([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n }\n\n /****************************************************\n * MorphOS\n */\n\n if (ua.match(/MorphOS/i)) {\n this.os.name = 'MorphOS';\n this.device.type = 'desktop';\n\n if (match = /MorphOS ([0-9.]*)/i.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n }\n\n /****************************************************\n * Kindle\n */\n\n if (ua.match('Kindle') && !ua.match('Fire')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Amazon';\n this.device.model = 'Kindle';\n this.device.type = 'ereader';\n\n if (ua.match('Kindle\\/2.0')) this.device.model = 'Kindle 2';\n if (ua.match('Kindle\\/3.0')) this.device.model = 'Kindle 3 or later';\n\n this.device.identified = true;\n }\n\n /****************************************************\n * NOOK\n */\n\n if (ua.match('nook browser')) {\n this.os.name = 'Android';\n\n this.device.manufacturer = 'Barnes & Noble';\n this.device.model = 'NOOK';\n this.device.type = 'ereader';\n this.device.identified = true;\n }\n\n /****************************************************\n * Bookeen\n */\n\n if (ua.match('bookeen\\/cybook')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Bookeen';\n this.device.model = 'Cybook';\n this.device.type = 'ereader';\n\n if (ua.match('Orizon')) {\n this.device.model = 'Cybook Orizon';\n }\n\n this.device.identified = true;\n }\n\n /****************************************************\n * Sony Reader\n */\n\n if (ua.match('EBRD1101')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Sony';\n this.device.model = 'Reader';\n this.device.type = 'ereader';\n this.device.identified = true;\n }\n\n /****************************************************\n * iRiver\n */\n\n if (ua.match('Iriver ;')) {\n this.os.name = '';\n\n this.device.manufacturer = 'iRiver';\n this.device.model = 'Story';\n this.device.type = 'ereader';\n\n if (ua.match('EB07')) {\n this.device.model = 'Story HD EB07';\n }\n\n this.device.identified = true;\n }\n\n /****************************************************\n * Nintendo\n *\n * Opera/9.30 (Nintendo Wii; U; ; 3642; en)\n * Opera/9.30 (Nintendo Wii; U; ; 2047-7; en)\n * Opera/9.50 (Nintendo DSi; Opera/507; U; en-US)\n * Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7455.US\n * Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7455.EU\n */\n\n if (ua.match('Nintendo Wii')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Nintendo';\n this.device.model = 'Wii';\n this.device.type = 'gaming';\n this.device.identified = true;\n }\n\n if (ua.match('Nintendo DSi')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Nintendo';\n this.device.model = 'DSi';\n this.device.type = 'gaming';\n this.device.identified = true;\n }\n\n if (ua.match('Nintendo 3DS')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Nintendo';\n this.device.model = '3DS';\n this.device.type = 'gaming';\n\n if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.identified = true;\n }\n\n\n if (ua.match('PlayStation Portable')) {\n this.os.name = '';\n\n this.device.manufacturer = 'Sony';\n this.device.model = 'Playstation Portable';\n this.device.type = 'gaming';\n this.device.identified = true;\n }\n\n if (ua.match('PlayStation Vita')) {\n this.os.name = '';\n\n if (match = /PlayStation Vita ([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.manufacturer = 'Sony';\n this.device.model = 'PlayStation Vita';\n this.device.type = 'gaming';\n this.device.identified = true;\n }\n\n if (ua.match(/PlayStation 3/i)) {\n this.os.name = '';\n\n if (match = /PLAYSTATION 3;? ([0-9.]*)/.exec(ua)) {\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n this.device.manufacturer = 'Sony';\n this.device.model = 'Playstation 3';\n this.device.type = 'gaming';\n this.device.identified = true;\n }\n\n /****************************************************\n * Panasonic Smart Viera\n *\n * Mozilla/5.0 (FreeBSD; U; Viera; ja-JP) AppleWebKit/535.1 (KHTML, like Gecko) Viera/1.2.4 Chrome/14.0.835.202 Safari/535.1\n */\n\n if (ua.match('Viera')) {\n this.os.name = '';\n this.device.manufacturer = 'Panasonic';\n this.device.model = 'Smart Viera';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n\n /****************************************************\n * Sharp AQUOS TV\n *\n * Mozilla/5.0 (DTV) AppleWebKit/531.2 (KHTML, like Gecko) AQUOSBrowser/1.0 (US00DTV;V;0001;0001)\n * Mozilla/5.0 (DTV) AppleWebKit/531.2+ (KHTML, like Gecko) Espial/6.0.4 AQUOSBrowser/1.0 (CH00DTV;V;0001;0001)\n * Opera/9.80 (Linux armv6l; U; en) Presto/2.8.115 Version/11.10 AQUOS-AS/1.0 LC-40LE835X\n */\n\n if (ua.match('AQUOSBrowser') || ua.match('AQUOS-AS')) {\n this.os.name = '';\n this.device.manufacturer = STRINGS_SHARP;\n this.device.model = 'Aquos TV';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n\n /****************************************************\n * Samsung Smart TV\n *\n * Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV; Maple2012) AppleWebKit/534.7 (KHTML, like Gecko) SmartTV Safari/534.7\n * Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+\n */\n\n if (ua.match('SMART-TV')) {\n this.os.name = '';\n this.device.manufacturer = STRINGS_SAMSUNG;\n this.device.model = 'Smart TV';\n this.device.type = 'television';\n this.device.identified = true;\n\n if (match = /Maple([0-9]*)/.exec(ua)) {\n this.device.model += ' ' + match[1];\n }\n }\n\n /****************************************************\n * Sony Internet TV\n *\n * Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) KDL-46EX640; CC/USA; en) Presto/2.8.115 Version/11.10\n * Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) KDL-40EX640; CC/USA; en) Presto/2.10.250 Version/11.60\n * Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) N/A; CC/USA; en) Presto/2.8.115 Version/11.10\n * Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) ; CC/JPN; en) Presto/2.9.167 Version/11.50\n * Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) AZ2CVT2; CC/CAN; en) Presto/2.7.61 Version/11.00\n * Opera/9.80 (Linux armv6l; Opera TV Store/4207; U; (SonyBDP/BDV11); en) Presto/2.9.167 Version/11.50\n * Opera/9.80 (Linux armv6l ; U; (SonyBDP/BDV11); en) Presto/2.6.33 Version/10.60\n * Opera/9.80 (Linux armv6l; U; (SonyBDP/BDV11); en) Presto/2.8.115 Version/11.10\n */\n\n if (ua.match('SonyDTV|SonyBDP|SonyCEBrowser')) {\n this.os.name = '';\n this.device.manufacturer = 'Sony';\n this.device.model = 'Internet TV';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * Philips Net TV\n *\n * Opera/9.70 (Linux armv6l ; U; CE-HTML/1.0 NETTV/2.0.2; en) Presto/2.2.1\n * Opera/9.80 (Linux armv6l ; U; CE-HTML/1.0 NETTV/3.0.1;; en) Presto/2.6.33 Version/10.60\n * Opera/9.80 (Linux mips; U; CE-HTML/1.0 NETTV/3.0.1; PHILIPS-AVM-2012; en) Presto/2.9.167 Version/11.50\n * Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70\n * Opera/9.80 (Linux i686; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.9.167 Version/11.50\n */\n\n if (ua.match('NETTV\\/')) {\n this.os.name = '';\n this.device.manufacturer = 'Philips';\n this.device.model = 'Net TV';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * LG NetCast TV\n *\n * Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ LG Browser/5.00.00(+mouse+3D+SCREEN+TUNER; LGE; GLOBAL-PLAT4; 03.09.22; 0x00000001;); LG NetCast.TV-2012\n * Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ LG Browser/5.00.00(+SCREEN+TUNER; LGE; GLOBAL-PLAT4; 01.00.00; 0x00000001;); LG NetCast.TV-2012\n * Mozilla/5.0 (DirectFB; U; Linux armv6l; en) AppleWebKit/531.2 (KHTML, like Gecko) Safari/531.2 LG Browser/4.1.4( BDP; LGE; Media/BD660; 6970; abc;); LG NetCast.Media-2011\n * Mozilla/5.0 (DirectFB; U; Linux 7631; en) AppleWebKit/531.2 (KHTML, like Gecko) Safari/531.2 LG Browser/4.1.4( NO_NUM; LGE; Media/SP520; ST.3.97.409.F; 0x00000001;); LG NetCast.Media-2011\n * Mozilla/5.0 (DirectFB; U; Linux 7630; en) AppleWebKit/531.2 (KHTML, like Gecko) Safari/531.2 LG Browser/4.1.4( 3D BDP NO_NUM; LGE; Media/ST600; LG NetCast.Media-2011\n * (LGSmartTV/1.0) AppleWebKit/534.23 OBIGO-T10/2.0\n */\n\n if (match = /LG NetCast\\.(?:TV|Media)-([0-9]*)/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = STRINGS_LG;\n this.device.model = 'NetCast TV ' + match[1];\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n if (match = /LGSmartTV/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = STRINGS_LG;\n this.device.model = 'Smart TV';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * Toshiba Smart TV\n *\n * Mozilla/5.0 (Linux mipsel; U; HbbTV/1.1.1 (; TOSHIBA; DTV_RL953; 56.7.66.7; t12; ) ; ToshibaTP/1.3.0 (+VIDEO_MP4+VIDEO_X_MS_ASF+AUDIO_MPEG+AUDIO_MP4+DRM+NATIVELAUNCH) ; en) AppleWebKit/534.1 (KHTML, like Gecko)\n * Mozilla/5.0 (DTV; TSBNetTV/T32013713.0203.7DD; TVwithVideoPlayer; like Gecko) NetFront/4.1 DTVNetBrowser/2.2 (000039;T32013713;0203;7DD) InettvBrowser/2.2 (000039;T32013713;0203;7DD)\n * Mozilla/5.0 (Linux mipsel; U; HbbTV/1.1.1 (; TOSHIBA; 40PX200; 0.7.3.0.; t12; ) ; Toshiba_TP/1.3.0 (+VIDEO_MP4+AUDIO_MPEG+AUDIO_MP4+VIDEO_X_MS_ASF+OFFLINEAPP) ; en) AppleWebKit/534.1 (KHTML, like Gec\n */\n\n if (ua.match('Toshiba_?TP\\/') || ua.match('TSBNetTV\\/')) {\n this.os.name = '';\n this.device.manufacturer = 'Toshiba';\n this.device.model = 'Smart TV';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * MachBlue XT\n */\n\n if (match = /mbxtWebKit\\/([0-9.]*)/.exec(ua)) {\n this.os.name = '';\n this.browser.name = 'MachBlue XT'\n this.browser.version = new Version({\n value: match[1],\n details: 2\n });\n this.device.type = 'television';\n }\n\n /****************************************************\n * ADB\n */\n\n if (match = /\\(ADB; ([^\\)]+)\\)/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = 'ADB';\n this.device.model = (match[1] !== 'Unknown' ? match[1].replace('ADB', '') + ' ' : '') + 'IPTV receiver';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * MStar\n */\n\n if (ua.match(/Mstar;OWB/)) {\n this.os.name = '';\n this.device.manufacturer = 'MStar';\n this.device.model = 'PVR';\n this.device.type = 'television';\n this.device.identified = true;\n\n this.browser.name = 'Origyn Web Browser';\n }\n\n /****************************************************\n * TechniSat\n */\n\n if (match = /\\TechniSat ([^;]+);/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = 'TechniSat';\n this.device.model = match[1];\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * Technicolor\n */\n\n if (match = /\\Technicolor_([^;]+);/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = 'Technicolor';\n this.device.model = match[1];\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * Winbox Evo2\n */\n\n if (match = /Winbox Evo2/.exec(ua)) {\n this.os.name = '';\n this.device.manufacturer = 'Winbox';\n this.device.model = 'Evo2';\n this.device.type = 'television';\n this.device.identified = true;\n }\n\n /****************************************************\n * Roku\n */\n\n if (match = /^Roku\\/DVP-([0-9]+)/.exec(ua)) {\n this.device.manufacturer = 'Roku';\n this.device.type = 'television';\n\n switch (match[1]) {\n case '2000':\n this.device.model = 'HD';\n break;\n case '2050':\n this.device.model = 'XD';\n break;\n case '2100':\n this.device.model = 'XDS';\n break;\n case '2400':\n this.device.model = 'LT';\n break;\n case '3000':\n this.device.model = '2 HD';\n break;\n case '3050':\n this.device.model = '2 XD';\n break;\n case '3100':\n this.device.model = '2 XS';\n break;\n }\n\n this.device.identified = true;\n }\n\n if (match = /HbbTV\\/1.1.1 \\([^;]*;\\s*([^;]*)\\s*;\\s*([^;]*)\\s*;/.exec(ua)) {\n var vendorName = match[1].trim();\n var modelName = match[2].trim();\n\n if (!this.device.manufacturer && vendorName !== '' && vendorName !== 'vendorName') {\n switch (vendorName) {\n case 'LGE':\n this.device.manufacturer = 'LG';\n break;\n case 'TOSHIBA':\n this.device.manufacturer = 'Toshiba';\n break;\n case 'smart':\n this.device.manufacturer = 'Smart';\n break;\n case 'tv2n':\n this.device.manufacturer = 'TV2N';\n break;\n default:\n this.device.manufacturer = vendorName;\n }\n\n if (!this.device.model && modelName !== '' && modelName !== 'modelName') {\n switch (modelName) {\n case 'GLOBAL_PLAT3':\n this.device.model = 'NetCast TV';\n break;\n case 'SmartTV2012':\n this.device.model = 'Smart TV 2012';\n break;\n case 'videoweb':\n this.device.model = 'Videoweb';\n break;\n default:\n this.device.model = modelName;\n }\n\n if (vendorName === 'Humax') {\n this.device.model = this.device.model.toUpperCase();\n }\n\n this.device.identified = true;\n this.os.name = '';\n }\n }\n\n this.device.type = 'television';\n }\n\n /****************************************************\n * Detect type based on common identifiers\n */\n\n if (ua.match('InettvBrowser')) {\n this.device.type = 'television';\n }\n\n if (ua.match('MIDP')) {\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * Try to detect any devices based on common\n * locations of model ids\n */\n\n if (!this.device.model && !this.device.manufacturer) {\n var candidates = [];\n\n if (!ua.match(/^(Mozilla|Opera)/)) if (match = /^(?:MQQBrowser\\/[0-9\\.]+\\/)?([^\\s]+)/.exec(ua)) {\n match[1] = match[1].replace(/_TD$/, '');\n match[1] = match[1].replace(/_CMCC$/, '');\n match[1] = match[1].replace(/[_ ]Mozilla$/, '');\n match[1] = match[1].replace(/ Linux$/, '');\n match[1] = match[1].replace(/ Opera$/, '');\n match[1] = match[1].replace(/\\/[0-9].*$/, '');\n\n candidates.push(match[1]);\n }\n\n if (match = /[0-9]+x[0-9]+; ([^;]+)/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /[0-9]+X[0-9]+ ([^;\\/\\(\\)]+)/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /Windows NT 5.1; ([^;]+); Windows Phone/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /\\) PPC; (?:[0-9]+x[0-9]+; )?([^;\\/\\(\\)]+)/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /\\(([^;]+); U; Windows Mobile/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /Vodafone\\/1.0\\/([^\\/]+)/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n if (match = /\\ ([^\\s]+)$/.exec(ua)) {\n candidates.push(match[1]);\n }\n\n for (var i = 0; i < candidates.length; i++) {\n\n if (!this.device.model && !this.device.manufacturer) {\n var model = cleanupModel(candidates[i]);\n var result = false;\n\n if (this.os.name === 'Android') {\n if (typeof ANDROID_MODELS[model] !== 'undefined') {\n this.device.manufacturer = ANDROID_MODELS[model][0];\n this.device.model = ANDROID_MODELS[model][1];\n if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n this.device.identified = true;\n\n result = true;\n }\n }\n\n if (!this.os.name || this.os.name === 'Windows' || this.os.name === 'Windows Mobile' || this.os.name === 'Windows CE') {\n if (typeof WINDOWS_MOBILE_MODELS[model] !== 'undefined') {\n this.device.manufacturer = WINDOWS_MOBILE_MODELS[model][0];\n this.device.model = WINDOWS_MOBILE_MODELS[model][1];\n this.device.type = 'mobile';\n this.device.identified = true;\n\n if (this.os.name !== 'Windows Mobile') {\n this.os.name = 'Windows Mobile';\n this.os.version = null;\n }\n\n result = true;\n }\n }\n }\n\n if (!result) {\n if (match = /^GIONEE-([^\\s]+)/.exec(candidates[i])) {\n this.device.manufacturer = 'Gionee';\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^HTC_?([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_HTC;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^HUAWEI-([^\\/]*)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_HUAWEI;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /(?:^|\\()LGE?(?:\\/|-|_|\\s)([^\\s]*)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_LG;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^MOT-([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_MOTOROLA;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^Motorola_([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_MOTOROLA;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^Nokia([^\\/]+)(?:\\/|$)/.exec(candidates[i])) {\n this.device.manufacturer = 'Nokia';\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n\n if (!this.os.name) {\n this.os.name = 'Series40';\n }\n }\n\n if (match = /^SonyEricsson([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_SONY_ERICSSON;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^SAMSUNG-([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n this.device.manufacturer = STRINGS_SAMSUNG;\n this.device.model = cleanupModel(match[1]);\n this.device.type = 'mobile';\n\n if (this.os.name === 'Bada') {\n var manufacturer = 'SAMSUNG';\n var model = cleanupModel(this.device.model);\n\n if (typeof BADA_MODELS[manufacturer] !== 'undefined' && typeof BADA_MODELS[manufacturer][model] !== 'undefined') {\n this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n this.device.model = BADA_MODELS[manufacturer][model][1];\n this.device.identified = true;\n }\n } else if (match = /Jasmine\\/([0-9.]*)/.exec(ua)) {\n var version = match[1];\n var manufacturer = 'SAMSUNG';\n var model = cleanupModel(this.device.model);\n\n if (typeof TOUCHWIZ_MODELS[manufacturer] !== 'undefined' && typeof TOUCHWIZ_MODELS[manufacturer][model] !== 'undefined') {\n this.device.manufacturer = TOUCHWIZ_MODELS[manufacturer][model][0];\n this.device.model = TOUCHWIZ_MODELS[manufacturer][model][1];\n this.device.identified = true;\n\n this.os.name = 'Touchwiz';\n this.os.version = new Version({\n value: '2.0'\n });\n }\n } else if (match = /Dolfin\\/([0-9.]*)/.exec(ua)) {\n var version = match[1];\n var manufacturer = 'SAMSUNG';\n var model = cleanupModel(this.device.model);\n\n if (typeof BADA_MODELS[manufacturer] !== 'undefined' && typeof BADA_MODELS[manufacturer][model] !== 'undefined') {\n this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n this.device.model = BADA_MODELS[manufacturer][model][1];\n this.device.identified = true;\n\n this.os.name = 'Bada';\n\n switch (version) {\n case '2.0':\n this.os.version = new Version({\n value: '1.0'\n });\n break;\n case '2.2':\n this.os.version = new Version({\n value: '1.2'\n });\n break;\n case '3.0':\n this.os.version = new Version({\n value: '2.0'\n });\n break;\n }\n }\n\n if (typeof TOUCHWIZ_MODELS[manufacturer] !== 'undefined' && typeof TOUCHWIZ_MODELS[manufacturer][model] !== 'undefined') {\n this.device.manufacturer = TOUCHWIZ_MODELS[manufacturer][model][0];\n this.device.model = TOUCHWIZ_MODELS[manufacturer][model][1];\n this.device.identified = true;\n\n this.os.name = 'Touchwiz';\n\n switch (version) {\n case '1.0':\n this.os.version = new Version({\n value: '1.0'\n });\n break;\n case '1.5':\n this.os.version = new Version({\n value: '2.0'\n });\n break;\n case '2.0':\n this.os.version = new Version({\n value: '3.0'\n });\n break;\n }\n }\n }\n }\n }\n }\n }\n\n\n if (match = /\\((?:LG[-|\\/])(.*) (?:Browser\\/)?AppleWebkit/.exec(ua)) {\n this.device.manufacturer = STRINGS_LG;\n this.device.model = match[1];\n this.device.type = 'mobile';\n this.device.identified = true;\n }\n\n if (match = /^Mozilla\\/5.0 \\((?:Nokia|NOKIA)(?:\\s?)([^\\)]+)\\)UC AppleWebkit\\(like Gecko\\) Safari\\/530$/.exec(ua)) {\n this.device.manufacturer = 'Nokia';\n this.device.model = match[1];\n this.device.type = 'mobile';\n this.device.identified = true;\n\n this.os.name = 'Series60';\n }\n\n\n\n /****************************************************\n * Safari\n */\n\n if (ua.match('Safari')) {\n if (this.os.name === 'iOS') {\n this.browser.stock = true;\n this.browser.hidden = true;\n this.browser.name = 'Safari';\n this.browser.version = null;\n }\n\n\n\n if (this.os.name === 'Mac OS X' || this.os.name === 'Windows') {\n this.browser.name = 'Safari';\n this.browser.stock = this.os.name === 'Mac OS X';\n\n if (match = /Version\\/([0-9\\.]+)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (ua.match(/AppleWebKit\\/[0-9\\.]+\\+/)) {\n this.browser.name = 'WebKit Nightly Build';\n this.browser.version = null;\n }\n }\n }\n\n /****************************************************\n * Internet Explorer\n */\n\n if (ua.match('MSIE')) {\n this.browser.name = 'Internet Explorer';\n\n if (ua.match('IEMobile') || ua.match('Windows CE') || ua.match('Windows Phone') || ua.match('WP7')) {\n this.browser.name = 'Mobile Internet Explorer';\n }\n\n if (match = /MSIE ([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Opera\n */\n\n if (ua.match(/Opera/i)) {\n this.browser.stock = false;\n this.browser.name = 'Opera';\n\n if (match = /Opera[\\/| ]([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n if (parseFloat(match[1]) >= 10) {\n this.browser.version = new Version({\n value: match[1]\n });\n } else {\n this.browser.version = null;\n }\n }\n\n if (this.browser.version && ua.match('Edition Labs')) {\n this.browser.version.type = 'alpha';\n this.browser.channel = 'Labs';\n }\n\n if (this.browser.version && ua.match('Edition Next')) {\n this.browser.version.type = 'alpha';\n this.browser.channel = 'Next';\n }\n\n if (ua.match('Opera Tablet')) {\n this.browser.name = 'Opera Mobile';\n this.device.type = 'tablet';\n }\n\n if (ua.match('Opera Mobi')) {\n this.browser.name = 'Opera Mobile';\n this.device.type = 'mobile';\n }\n\n if (match = /Opera Mini;/.exec(ua)) {\n this.browser.name = 'Opera Mini';\n this.browser.version = null;\n this.browser.mode = 'proxy';\n this.device.type = 'mobile';\n }\n\n if (match = /Opera Mini\\/(?:att\\/)?([0-9.]*)/.exec(ua)) {\n this.browser.name = 'Opera Mini';\n this.browser.version = new Version({\n value: match[1],\n details: -1\n });\n this.browser.mode = 'proxy';\n this.device.type = 'mobile';\n }\n\n if (this.browser.name === 'Opera' && this.device.type === 'mobile') {\n this.browser.name = 'Opera Mobile';\n\n if (ua.match(/BER/)) {\n this.browser.name = 'Opera Mini';\n this.browser.version = null;\n }\n }\n\n if (ua.match('InettvBrowser')) {\n this.device.type = 'television';\n }\n\n if (ua.match('Opera TV') || ua.match('Opera-TV')) {\n this.browser.name = 'Opera';\n this.device.type = 'television';\n }\n\n if (ua.match('Linux zbov')) {\n this.browser.name = 'Opera Mobile';\n this.browser.mode = 'desktop';\n\n this.device.type = 'mobile';\n\n this.os.name = null;\n this.os.version = null;\n }\n\n if (ua.match('Linux zvav')) {\n this.browser.name = 'Opera Mini';\n this.browser.version = null;\n this.browser.mode = 'desktop';\n\n this.device.type = 'mobile';\n\n this.os.name = null;\n this.os.version = null;\n }\n }\n\n /****************************************************\n * Firefox\n */\n\n if (ua.match('Firefox')) {\n this.browser.stock = false;\n this.browser.name = 'Firefox';\n\n if (match = /Firefox\\/([0-9ab.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (this.browser.version.type === 'alpha') {\n this.browser.channel = 'Aurora';\n }\n\n if (this.browser.version.type === 'beta') {\n this.browser.channel = 'Beta';\n }\n\n if (ua.match('Fennec')) {\n this.device.type = 'mobile';\n }\n\n if (ua.match('Mobile; rv')) {\n this.device.type = 'mobile';\n }\n\n if (ua.match('Tablet; rv')) {\n this.device.type = 'tablet';\n }\n\n if (this.device.type === 'mobile' || this.device.type === 'tablet') {\n this.browser.name = 'Firefox Mobile';\n }\n }\n\n if (ua.match('Namoroka')) {\n this.browser.stock = false;\n this.browser.name = 'Firefox';\n\n if (match = /Namoroka\\/([0-9ab.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n this.browser.channel = 'Namoroka';\n }\n\n if (ua.match('Shiretoko')) {\n this.browser.stock = false;\n this.browser.name = 'Firefox';\n\n if (match = /Shiretoko\\/([0-9ab.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n this.browser.channel = 'Shiretoko';\n }\n\n if (ua.match('Minefield')) {\n this.browser.stock = false;\n this.browser.name = 'Firefox';\n\n if (match = /Minefield\\/([0-9ab.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n this.browser.channel = 'Minefield';\n }\n\n if (ua.match('Firebird')) {\n this.browser.stock = false;\n this.browser.name = 'Firebird';\n\n if (match = /Firebird\\/([0-9ab.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * SeaMonkey\n */\n\n if (ua.match('SeaMonkey')) {\n this.browser.stock = false;\n this.browser.name = 'SeaMonkey';\n\n if (match = /SeaMonkey\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Netscape\n */\n\n if (ua.match('Netscape')) {\n this.browser.stock = false;\n this.browser.name = 'Netscape';\n\n if (match = /Netscape[0-9]?\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Konqueror\n */\n\n if (ua.match('[k|K]onqueror/')) {\n this.browser.name = 'Konqueror';\n\n if (match = /[k|K]onqueror\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Chrome\n */\n\n if (match = /(?:Chrome|CrMo|CriOS)\\/([0-9.]*)/.exec(ua)) {\n this.browser.stock = false;\n this.browser.name = 'Chrome';\n this.browser.version = new Version({\n value: match[1]\n });\n\n if (this.os.name === 'Android') {\n switch (match[1].split('.', 3).join('.')) {\n case '16.0.912':\n this.browser.channel = 'Beta';\n break;\n case '18.0.1025':\n this.browser.version.details = 1;\n break;\n default:\n this.browser.channel = 'Nightly';\n break;\n }\n } else {\n switch (match[1].split('.', 3).join('.')) {\n case '0.2.149':\n case '0.3.154':\n case '0.4.154':\n case '1.0.154':\n case '2.0.172':\n case '3.0.195':\n case '4.0.249':\n case '4.1.249':\n case '5.0.375':\n case '6.0.472':\n case '7.0.517':\n case '8.0.552':\n case '9.0.597':\n case '10.0.648':\n case '11.0.696':\n case '12.0.742':\n case '13.0.782':\n case '14.0.835':\n case '15.0.874':\n case '16.0.912':\n case '17.0.963':\n case '18.0.1025':\n case '19.0.1084':\n case '20.0.1132':\n case '21.0.1180':\n if (this.browser.version.minor === 0) this.browser.version.details = 1;\n else this.browser.version.details = 2;\n\n break;\n default:\n this.browser.channel = 'Nightly';\n break;\n }\n }\n }\n\n /****************************************************\n * Chrome Frame\n */\n\n if (ua.match('chromeframe')) {\n this.browser.stock = false;\n this.browser.name = 'Chrome Frame';\n\n if (match = /chromeframe\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Chromium\n */\n\n if (ua.match('Chromium')) {\n this.browser.stock = false;\n this.browser.channel = '';\n this.browser.name = 'Chromium';\n\n if (match = /Chromium\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * BrowserNG\n */\n\n if (ua.match('BrowserNG')) {\n this.browser.name = 'Nokia Browser';\n\n if (match = /BrowserNG\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1],\n details: 3,\n builds: false\n });\n }\n }\n\n /****************************************************\n * Nokia Browser\n */\n\n if (ua.match('NokiaBrowser')) {\n this.browser.name = 'Nokia Browser';\n\n if (match = /NokiaBrowser\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1],\n details: 3\n });\n }\n }\n\n /****************************************************\n * MicroB\n */\n\n if (ua.match('Maemo[ |_]Browser')) {\n this.browser.name = 'MicroB';\n\n if (match = /Maemo[ |_]Browser[ |_]([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1],\n details: 3\n });\n }\n }\n\n\n /****************************************************\n * NetFront\n */\n\n if (ua.match('NetFront')) {\n this.browser.name = 'NetFront';\n this.device.type = 'mobile';\n\n if (match = /NetFront\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (ua.match('InettvBrowser')) {\n this.device.type = 'television';\n }\n }\n\n /****************************************************\n * Silk\n */\n\n if (ua.match('Silk')) {\n if (ua.match('Silk-Accelerated')) {\n this.browser.name = 'Silk';\n\n if (match = /Silk\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1],\n details: 2\n });\n }\n\n this.device.manufacturer = 'Amazon';\n this.device.model = 'Kindle Fire';\n this.device.type = 'tablet';\n this.device.identified = true;\n\n if (this.os.name !== 'Android') {\n this.os.name = 'Android';\n this.os.version = null;\n }\n }\n }\n\n /****************************************************\n * Dolfin\n */\n\n if (ua.match('Dolfin')) {\n this.browser.name = 'Dolfin';\n\n if (match = /Dolfin\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n\n /****************************************************\n * Iris\n */\n\n if (ua.match('Iris')) {\n this.browser.name = 'Iris';\n\n this.device.type = 'mobile';\n this.device.model = null;\n this.device.manufacturer = null;\n\n this.os.name = 'Windows Mobile';\n this.os.version = null;\n\n if (match = /Iris\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (match = / WM([0-9]) /.exec(ua)) {\n this.os.version = new Version({\n value: match[1] + '.0'\n });\n } else {\n this.browser.mode = 'desktop';\n }\n }\n\n /****************************************************\n * Jasmine\n */\n\n if (ua.match('Jasmine')) {\n this.browser.name = 'Jasmine';\n\n if (match = /Jasmine\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Boxee\n */\n\n if (ua.match('Boxee')) {\n this.browser.name = 'Boxee';\n this.device.type = 'television';\n\n if (match = /Boxee\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Espial\n */\n\n if (ua.match('Espial')) {\n this.browser.name = 'Espial';\n\n this.os.name = '';\n this.os.version = null;\n\n if (this.device.type !== 'television') {\n this.device.type = 'television';\n this.device.model = null;\n this.device.manufacturer = null;\n }\n\n if (match = /Espial\\/([0-9.]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * ANT Galio\n */\n if (match = /ANTGalio\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'ANT Galio';\n this.browser.version = new Version({\n value: match[1],\n details: 3\n });\n this.device.type = 'television';\n }\n\n /****************************************************\n * NetFront NX\n */\n if (match = /NX\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'NetFront NX';\n this.browser.version = new Version({\n value: match[1],\n details: 2\n });\n if (match = /DTV/i.exec(ua)) {\n this.device.type = 'television';\n } else if (match = /mobile/i.exec(ua)) {\n this.device.type = 'mobile';\n } else {\n this.device.type = 'desktop';\n }\n\n this.os.name = null;\n this.os.version = null;\n }\n\n /****************************************************\n * Obigo\n */\n\n if (ua.match(/Obigo/i)) {\n this.browser.name = 'Obigo';\n\n if (match = /Obigo\\/([0-9.]*)/i.exec(ua)) {\n this.browser.version = new Version({\n value: match[1]\n });\n }\n\n if (match = /Obigo\\/([A-Z])([0-9.]*)/i.exec(ua)) {\n this.browser.name = 'Obigo ' + match[1];\n this.browser.version = new Version({\n value: match[2]\n });\n }\n\n if (match = /Obigo-([A-Z])([0-9.]*)\\//i.exec(ua)) {\n this.browser.name = 'Obigo ' + match[1];\n this.browser.version = new Version({\n value: match[2]\n });\n }\n }\n\n /****************************************************\n * UC Web\n */\n\n if (ua.match('UCWEB')) {\n this.browser.stock = false;\n this.browser.name = 'UC Browser';\n\n if (match = /UCWEB([0-9]*[.][0-9]*)/.exec(ua)) {\n this.browser.version = new Version({\n value: match[1],\n details: 3\n });\n }\n\n if (this.os.name === 'Linux') {\n this.os.name = '';\n }\n\n this.device.type = 'mobile';\n\n if (match = /^IUC \\(U;\\s?iOS ([0-9\\.]+);/.exec(ua)) {\n this.os.name = 'iOS';\n this.os.version = new Version({\n value: match[1]\n });\n }\n\n if (match = /^JUC \\(Linux; U; ([0-9\\.]+)[^;]*; [^;]+; ([^;]*[^\\s])\\s*; [0-9]+\\*[0-9]+\\)/.exec(ua)) {\n var model = cleanupModel(match[2]);\n\n this.os.name = 'Android';\n this.os.version = new Version({\n value: match[1]\n });\n\n if (typeof ANDROID_MODELS[model] !== 'undefined') {\n this.device.manufacturer = ANDROID_MODELS[model][0];\n this.device.model = ANDROID_MODELS[model][1];\n if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n this.device.identified = true;\n }\n }\n }\n\n if (ua.match(/\\) UC /)) {\n this.browser.stock = false;\n this.browser.name = 'UC Browser';\n }\n\n if (match = /UCBrowser\\/([0-9.]*)/.exec(ua)) {\n this.browser.stock = false;\n this.browser.name = 'UC Browser';\n this.browser.version = new Version({\n value: match[1],\n details: 2\n });\n }\n\n /****************************************************\n * NineSky\n */\n\n if (match = /Ninesky(?:-android-mobile(?:-cn)?)?\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'NineSky';\n this.browser.version = new Version({\n value: match[1]\n });\n\n if (this.os.name !== 'Android') {\n this.os.name = 'Android';\n this.os.version = null;\n\n this.device.manufacturer = null;\n this.device.model = null;\n }\n }\n\n /****************************************************\n * Skyfire\n */\n\n if (match = /Skyfire\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'Skyfire';\n this.browser.version = new Version({\n value: match[1]\n });\n\n this.device.type = 'mobile';\n\n this.os.name = 'Android';\n this.os.version = null;\n }\n\n /****************************************************\n * Dolphin HD\n */\n\n if (match = /DolphinHDCN\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'Dolphin';\n this.browser.version = new Version({\n value: match[1]\n });\n\n this.device.type = 'mobile';\n\n if (this.os.name !== 'Android') {\n this.os.name = 'Android';\n this.os.version = null;\n }\n }\n\n if (match = /Dolphin\\/INT/.exec(ua)) {\n this.browser.name = 'Dolphin';\n this.device.type = 'mobile';\n }\n\n /****************************************************\n * QQ Browser\n */\n\n if (match = /(M?QQBrowser)\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'QQ Browser';\n\n var version = match[2];\n if (version.match(/^[0-9][0-9]$/)) version = version[0] + '.' + version[1];\n\n this.browser.version = new Version({\n value: version,\n details: 2\n });\n this.browser.channel = ''\n\n if (!this.os.name && match[1] === 'QQBrowser') {\n this.os.name = 'Windows';\n }\n }\n\n /****************************************************\n * iBrowser\n */\n\n if (match = /(iBrowser)\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'iBrowser';\n\n var version = match[2];\n if (version.match(/[0-9][0-9]/)) version = version[0] + '.' + version[1];\n\n this.browser.version = new Version({\n value: version,\n details: 2\n });\n this.browser.channel = ''\n }\n\n /****************************************************\n * Puffin\n */\n\n if (match = /Puffin\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'Puffin';\n this.browser.version = new Version({\n value: match[1],\n details: 2\n });\n\n this.device.type = 'mobile';\n\n if (this.os.name === 'Linux') {\n this.os.name = null;\n this.os.version = null;\n }\n }\n\n /****************************************************\n * 360 Extreme Explorer\n */\n\n if (ua.match('360EE')) {\n this.browser.stock = false;\n this.browser.name = '360 Extreme Explorer';\n this.browser.version = null;\n }\n\n /****************************************************\n * Midori\n */\n\n if (match = /Midori\\/([0-9.]*)/.exec(ua)) {\n this.browser.name = 'Midori';\n this.browser.version = new Version({\n value: match[1]\n });\n\n if (this.os.name !== 'Linux') {\n this.os.name = 'Linux';\n this.os.version = null;\n }\n\n this.device.manufacturer = null;\n this.device.model = null;\n this.device.type = 'desktop';\n }\n\n /****************************************************\n * Others\n */\n\n var browsers = [{\n name: 'AdobeAIR',\n regexp: /AdobeAIR\\/([0-9.]*)/\n }, {\n name: 'Awesomium',\n regexp: /Awesomium\\/([0-9.]*)/\n }, {\n name: 'Canvace',\n regexp: /Canvace Standalone\\/([0-9.]*)/\n }, {\n name: 'Ekioh',\n regexp: /Ekioh\\/([0-9.]*)/\n }, {\n name: 'JavaFX',\n regexp: /JavaFX\\/([0-9.]*)/\n }, {\n name: 'GFXe',\n regexp: /GFXe\\/([0-9.]*)/\n }, {\n name: 'LuaKit',\n regexp: /luakit/\n }, {\n name: 'Titanium',\n regexp: /Titanium\\/([0-9.]*)/\n }, {\n name: 'OpenWebKitSharp',\n regexp: /OpenWebKitSharp/\n }, {\n name: 'Prism',\n regexp: /Prism\\/([0-9.]*)/\n }, {\n name: 'Qt',\n regexp: /Qt\\/([0-9.]*)/\n }, {\n name: 'QtEmbedded',\n regexp: /QtEmbedded/\n }, {\n name: 'QtEmbedded',\n regexp: /QtEmbedded.*Qt\\/([0-9.]*)/\n }, {\n name: 'RhoSimulator',\n regexp: /RhoSimulator/\n }, {\n name: 'UWebKit',\n regexp: /UWebKit\\/([0-9.]*)/\n },\n\n {\n name: 'PhantomJS',\n regexp: /PhantomJS\\/([0-9.]*)/\n }, {\n name: 'Google Web Preview',\n regexp: /Google Web Preview/\n },\n\n {\n name: 'Google Earth',\n regexp: /Google Earth\\/([0-9.]*)/\n }, {\n name: 'EA Origin',\n regexp: /Origin\\/([0-9.]*)/\n }, {\n name: 'SecondLife',\n regexp: /SecondLife\\/([0-9.]*)/\n }, {\n name: 'Valve Steam',\n regexp: /Valve Steam/\n },\n\n {\n name: 'Songbird',\n regexp: /Songbird\\/([0-9.]*)/\n }, {\n name: 'Thunderbird',\n regexp: /Thunderbird\\/([0-9.]*)/\n },\n\n {\n name: 'Abrowser',\n regexp: /Abrowser\\/([0-9.]*)/\n }, {\n name: 'arora',\n regexp: /[Aa]rora\\/([0-9.]*)/\n }, {\n name: 'Baidu Browser',\n regexp: /M?BaiduBrowser\\/([0-9.]*)/i\n }, {\n name: 'Camino',\n regexp: /Camino\\/([0-9.]*)/\n }, {\n name: 'Canure',\n regexp: /Canure\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'CometBird',\n regexp: /CometBird\\/([0-9.]*)/\n }, {\n name: 'Comodo Dragon',\n regexp: /Comodo_Dragon\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'Conkeror',\n regexp: /[Cc]onkeror\\/([0-9.]*)/\n }, {\n name: 'CoolNovo',\n regexp: /(?:CoolNovo|CoolNovoChromePlus)\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'ChromePlus',\n regexp: /ChromePlus(?:\\/([0-9.]*))?$/,\n details: 3\n }, {\n name: 'Daedalus',\n regexp: /Daedalus ([0-9.]*)/,\n details: 2\n }, {\n name: 'Demobrowser',\n regexp: /demobrowser\\/([0-9.]*)/\n }, {\n name: 'Dooble',\n regexp: /Dooble(?:\\/([0-9.]*))?/\n }, {\n name: 'DWB',\n regexp: /dwb(?:-hg)?(?:\\/([0-9.]*))?/\n }, {\n name: 'Epiphany',\n regexp: /Epiphany\\/([0-9.]*)/\n }, {\n name: 'FireWeb',\n regexp: /FireWeb\\/([0-9.]*)/\n }, {\n name: 'Flock',\n regexp: /Flock\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Galeon',\n regexp: /Galeon\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Helium',\n regexp: /HeliumMobileBrowser\\/([0-9.]*)/\n }, {\n name: 'iCab',\n regexp: /iCab\\/([0-9.]*)/\n }, {\n name: 'Iceape',\n regexp: /Iceape\\/([0-9.]*)/\n }, {\n name: 'IceCat',\n regexp: /IceCat ([0-9.]*)/\n }, {\n name: 'Iceweasel',\n regexp: /Iceweasel\\/([0-9.]*)/\n }, {\n name: 'InternetSurfboard',\n regexp: /InternetSurfboard\\/([0-9.]*)/\n }, {\n name: 'Iron',\n regexp: /Iron\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'Isis',\n regexp: /BrowserServer/\n }, {\n name: 'Jumanji',\n regexp: /jumanji/\n }, {\n name: 'Kazehakase',\n regexp: /Kazehakase\\/([0-9.]*)/\n }, {\n name: 'KChrome',\n regexp: /KChrome\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'K-Meleon',\n regexp: /K-Meleon\\/([0-9.]*)/\n }, {\n name: 'Leechcraft',\n regexp: /Leechcraft(?:\\/([0-9.]*))?/,\n details: 2\n }, {\n name: 'Lightning',\n regexp: /Lightning\\/([0-9.]*)/\n }, {\n name: 'Lunascape',\n regexp: /Lunascape[\\/| ]([0-9.]*)/,\n details: 3\n }, {\n name: 'iLunascape',\n regexp: /iLunascape\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Maxthon',\n regexp: /Maxthon[\\/ ]([0-9.]*)/,\n details: 3\n }, {\n name: 'MiniBrowser',\n regexp: /MiniBr?owserM\\/([0-9.]*)/\n }, {\n name: 'MiniBrowser',\n regexp: /MiniBrowserMobile\\/([0-9.]*)/\n }, {\n name: 'MixShark',\n regexp: /MixShark\\/([0-9.]*)/\n }, {\n name: 'Motorola WebKit',\n regexp: /MotorolaWebKit\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'NetFront LifeBrowser',\n regexp: /NetFrontLifeBrowser\\/([0-9.]*)/\n }, {\n name: 'Netscape Navigator',\n regexp: /Navigator\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Odyssey',\n regexp: /OWB\\/([0-9.]*)/\n }, {\n name: 'OmniWeb',\n regexp: /OmniWeb/\n }, {\n name: 'Orca',\n regexp: /Orca\\/([0-9.]*)/\n }, {\n name: 'Origyn',\n regexp: /Origyn Web Browser/\n }, {\n name: 'Palemoon',\n regexp: /Pale[mM]oon\\/([0-9.]*)/\n }, {\n name: 'Phantom',\n regexp: /Phantom\\/V([0-9.]*)/\n }, {\n name: 'Polaris',\n regexp: /Polaris\\/v?([0-9.]*)/i,\n details: 2\n }, {\n name: 'QtCreator',\n regexp: /QtCreator\\/([0-9.]*)/\n }, {\n name: 'QtQmlViewer',\n regexp: /QtQmlViewer/\n }, {\n name: 'QtTestBrowser',\n regexp: /QtTestBrowser\\/([0-9.]*)/\n }, {\n name: 'QtWeb',\n regexp: /QtWeb Internet Browser\\/([0-9.]*)/\n }, {\n name: 'QupZilla',\n regexp: /QupZilla\\/([0-9.]*)/\n }, {\n name: 'Roccat',\n regexp: /Roccat\\/([0-9]\\.[0-9.]*)/\n }, {\n name: 'Raven for Mac',\n regexp: /Raven for Mac\\/([0-9.]*)/\n }, {\n name: 'rekonq',\n regexp: /rekonq/\n }, {\n name: 'RockMelt',\n regexp: /RockMelt\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'Sleipnir',\n regexp: /Sleipnir\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'SMBrowser',\n regexp: /SMBrowser/\n }, {\n name: 'Sogou Explorer',\n regexp: /SE 2.X MetaSr/\n }, {\n name: 'Snowshoe',\n regexp: /Snowshoe\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'Sputnik',\n regexp: /Sputnik\\/([0-9.]*)/i,\n details: 3\n }, {\n name: 'Stainless',\n regexp: /Stainless\\/([0-9.]*)/\n }, {\n name: 'SunChrome',\n regexp: /SunChrome\\/([0-9.]*)/\n }, {\n name: 'Surf',\n regexp: /Surf\\/([0-9.]*)/\n }, {\n name: 'TaoBrowser',\n regexp: /TaoBrowser\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'TaomeeBrowser',\n regexp: /TaomeeBrowser\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'TazWeb',\n regexp: /TazWeb/\n }, {\n name: 'Viera',\n regexp: /Viera\\/([0-9.]*)/\n }, {\n name: 'Villanova',\n regexp: /Villanova\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Wavelink Velocity',\n regexp: /Wavelink Velocity Browser\\/([0-9.]*)/,\n details: 2\n }, {\n name: 'WebPositive',\n regexp: /WebPositive/\n }, {\n name: 'WebRender',\n regexp: /WebRender/\n }, {\n name: 'Wyzo',\n regexp: /Wyzo\\/([0-9.]*)/,\n details: 3\n }, {\n name: 'Zetakey',\n regexp: /Zetakey Webkit\\/([0-9.]*)/\n }, {\n name: 'Zetakey',\n regexp: /Zetakey\\/([0-9.]*)/\n }]\n\n for (var b = 0; b < browsers.length; b++) {\n if (match = browsers[b].regexp.exec(ua)) {\n this.browser.name = browsers[b].name;\n this.browser.channel = '';\n this.browser.stock = false;\n\n if (match[1]) {\n this.browser.version = new Version({\n value: match[1],\n details: browsers[b].details || null\n });\n } else {\n this.browser.version = null;\n }\n }\n }\n\n\n\n /****************************************************\n * WebKit\n */\n\n if (match = /WebKit\\/([0-9.]*)/i.exec(ua)) {\n this.engine.name = 'Webkit';\n this.engine.version = new Version({\n value: match[1]\n });\n }\n\n if (match = /Browser\\/AppleWebKit([0-9.]*)/i.exec(ua)) {\n this.engine.name = 'Webkit';\n this.engine.version = new Version({\n value: match[1]\n });\n }\n\n /****************************************************\n * KHTML\n */\n\n if (match = /KHTML\\/([0-9.]*)/.exec(ua)) {\n this.engine.name = 'KHTML';\n this.engine.version = new Version({\n value: match[1]\n });\n }\n\n /****************************************************\n * Gecko\n */\n\n if (/Gecko/.exec(ua) && !/like Gecko/i.exec(ua)) {\n this.engine.name = 'Gecko';\n\n if (match = /; rv:([^\\)]+)\\)/.exec(ua)) {\n this.engine.version = new Version({\n value: match[1]\n });\n }\n }\n\n /****************************************************\n * Presto\n */\n\n if (match = /Presto\\/([0-9.]*)/.exec(ua)) {\n this.engine.name = 'Presto';\n this.engine.version = new Version({\n value: match[1]\n });\n }\n\n /****************************************************\n * Trident\n */\n\n if (match = /Trident\\/([0-9.]*)/.exec(ua)) {\n this.engine.name = 'Trident';\n this.engine.version = new Version({\n value: match[1]\n });\n\n if (this.browser.name === 'Internet Explorer') {\n if (parseVersion(this.engine.version) === 6 && parseFloat(this.browser.version) < 10) {\n this.browser.version = new Version({\n value: '10.0'\n });\n this.browser.mode = 'compat';\n }\n\n if (parseVersion(this.engine.version) === 5 && parseFloat(this.browser.version) < 9) {\n this.browser.version = new Version({\n value: '9.0'\n });\n this.browser.mode = 'compat';\n }\n\n if (parseVersion(this.engine.version) === 4 && parseFloat(this.browser.version) < 8) {\n this.browser.version = new Version({\n value: '8.0'\n });\n this.browser.mode = 'compat';\n }\n }\n\n if (this.os.name === 'Windows Phone') {\n if (parseVersion(this.engine.version) === 5 && parseFloat(this.os.version) < 7.5) {\n this.os.version = new Version({\n value: '7.5'\n });\n }\n }\n }\n\n\n /****************************************************\n * Corrections\n */\n\n if (this.os.name === 'Android' && this.browser.stock) {\n this.browser.hidden = true;\n }\n\n if (this.os.name === 'iOS' && this.browser.name === 'Opera Mini') {\n this.os.version = null;\n }\n\n if (this.browser.name === 'Midori' && this.engine.name !== 'Webkit') {\n this.engine.name = 'Webkit';\n this.engine.version = null;\n }\n\n if (this.device.type === 'television' && this.browser.name === 'Opera') {\n this.browser.name = 'Opera Devices';\n switch (true) {\n case this.engine.version.is('2.10'):\n this.browser.version = new Version({\n value: 3.2\n });\n break;\n case this.engine.version.is('2.9'):\n this.browser.version = new Version({\n value: 3.1\n });\n break;\n case this.engine.version.is('2.8'):\n this.browser.version = new Version({\n value: 3.0\n });\n break;\n case this.engine.version.is('2.7'):\n this.browser.version = new Version({\n value: 2.9\n });\n break;\n case this.engine.version.is('2.6'):\n this.browser.version = new Version({\n value: 2.8\n });\n break;\n case this.engine.version.is('2.4'):\n this.browser.version = new Version({\n value: 10.3\n });\n break;\n case this.engine.version.is('2.3'):\n this.browser.version = new Version({\n value: 10\n });\n break;\n case this.engine.version.is('2.2'):\n this.browser.version = new Version({\n value: 9.7\n });\n break;\n case this.engine.version.is('2.1'):\n this.browser.version = new Version({\n value: 9.6\n });\n break;\n default:\n this.browser.version = null;\n }\n\n this.os.name = null;\n this.os.version = null;\n }\n\n\n /****************************************************\n * Camouflage\n */\n\n if (this.options.detectCamouflage) {\n\n if (match = /Mac OS X 10_6_3; ([^;]+); [a-z]{2}-(?:[a-z]{2})?\\)/.exec(ua)) {\n this.browser.name = '';\n this.browser.version = null;\n this.browser.mode = 'desktop';\n\n this.os.name = 'Android';\n this.os.version = null;\n\n this.engine.name = 'Webkit';\n this.engine.version = null;\n\n this.device.model = match[1];\n this.device.type = 'mobile';\n\n var model = cleanupModel(this.device.model);\n if (typeof ANDROID_MODELS[model] !== 'undefined') {\n this.device.manufacturer = ANDROID_MODELS[model][0];\n this.device.model = ANDROID_MODELS[model][1];\n if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n this.device.identified = true;\n }\n\n this.features.push('foundDevice');\n }\n\n if (match = /Linux Ventana; [a-z]{2}-[a-z]{2}; (.+) Build/.exec(ua)) {\n this.browser.name = '';\n this.browser.version = null;\n this.browser.mode = 'desktop';\n\n this.os.name = 'Android';\n this.os.version = null;\n\n this.engine.name = 'Webkit';\n this.engine.version = null;\n\n this.device.model = match[1];\n this.device.type = 'mobile';\n\n var model = cleanupModel(this.device.model);\n if (typeof ANDROID_MODELS[model] !== 'undefined') {\n this.device.manufacturer = ANDROID_MODELS[model][0];\n this.device.model = ANDROID_MODELS[model][1];\n if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n this.device.identified = true;\n }\n\n this.features.push('foundDevice');\n }\n\n if (this.browser.name === 'Safari') {\n if (this.os.name !== 'iOS' && /AppleWebKit\\/([0-9]+.[0-9]+)/i.exec(ua)[1] !== /Safari\\/([0-9]+.[0-9]+)/i.exec(ua)[1]) {\n this.features.push('safariMismatch');\n this.camouflage = true;\n }\n\n if (this.os.name === 'iOS' && !ua.match(/^Mozilla/)) {\n this.features.push('noMozillaPrefix');\n this.camouflage = true;\n }\n\n if (!/Version\\/[0-9\\.]+/.exec(ua)) {\n this.features.push('noVersion');\n this.camouflage = true;\n }\n }\n\n if (this.browser.name === 'Chrome') {\n if (!/(?:Chrome|CrMo|CriOS)\\/([0-9]{1,2}\\.[0-9]\\.[0-9]{3,4}\\.[0-9]+)/.exec(ua)) {\n this.features.push('wrongVersion');\n this.camouflage = true;\n }\n }\n\n\n if (this.options.useFeatures) {\n /* If it claims not to be Trident, but it is probably Trident running camouflage mode */\n if (window.ActiveXObject) {\n this.features.push('trident');\n\n if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Trident') {\n this.camouflage = typeof this.browser.name === 'undefined' || this.browser.name !== 'Maxthon';\n }\n }\n\n /* If it claims not to be Opera, but it is probably Opera running camouflage mode */\n if (window.opera) {\n this.features.push('presto');\n\n if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Presto') {\n this.camouflage = true;\n }\n\n if (this.browser.name === 'Internet Explorer') {\n this.camouflage = true;\n }\n }\n\n /* If it claims not to be Gecko, but it is probably Gecko running camouflage mode */\n if ('getBoxObjectFor' in document || 'mozInnerScreenX' in window) {\n this.features.push('gecko');\n\n if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Gecko') {\n this.camouflage = true;\n }\n\n if (this.browser.name === 'Internet Explorer') {\n this.camouflage = true;\n }\n }\n\n /* If it claims not to be Webkit, but it is probably Webkit running camouflage mode */\n if ('WebKitCSSMatrix' in window || 'WebKitPoint' in window || 'webkitStorageInfo' in window || 'webkitURL' in window) {\n this.features.push('webkit');\n\n if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Webkit') {\n this.camouflage = true;\n }\n\n if (this.browser.name === 'Internet Explorer') {\n this.camouflage = true;\n }\n }\n\n\n\n /* If it claims to be Safari and uses V8, it is probably an Android device running camouflage mode */\n if (this.engine.name === 'Webkit' && ({}.toString).toString().indexOf('\\n') === -1) {\n this.features.push('v8');\n\n if (this.browser !== null && this.browser.name === 'Safari') {\n this.camouflage = true;\n }\n }\n\n\n\n /* If we have an iPad that is not 768 x 1024, we have an imposter */\n if (this.device.model === 'iPad') {\n if ((screen.width !== 0 && screen.height !== 0) && (screen.width !== 768 && screen.height !== 1024) && (screen.width !== 1024 && screen.height !== 768)) {\n this.features.push('sizeMismatch');\n this.camouflage = true;\n }\n }\n\n /* If we have an iPhone or iPod that is not 320 x 480, we have an imposter */\n if (this.device.model === 'iPhone' || this.device.model === 'iPod') {\n if ((screen.width !== 0 && screen.height !== 0) && (screen.width !== 320 && screen.height !== 480) && (screen.width !== 480 && screen.height !== 320)) {\n this.features.push('sizeMismatch');\n this.camouflage = true;\n }\n }\n\n\n if (this.os.name === 'iOS' && this.os.version) {\n\n if (this.os.version.isOlder('4.0') && 'sandbox' in document.createElement('iframe')) {\n this.features.push('foundSandbox');\n this.camouflage = true;\n }\n\n if (this.os.version.isOlder('4.2') && 'WebSocket' in window) {\n this.features.push('foundSockets');\n this.camouflage = true;\n }\n\n if (this.os.version.isOlder('5.0') && !! window.Worker) {\n this.features.push('foundWorker');\n this.camouflage = true;\n }\n\n if (this.os.version.isNewer('2.1') && !window.applicationCache) {\n this.features.push('noAppCache');\n this.camouflage = true;\n }\n }\n\n if (this.os.name !== 'iOS' && this.browser.name === 'Safari' && this.browser.version) {\n\n if (this.browser.version.isOlder('4.0') && !! window.applicationCache) {\n this.features.push('foundAppCache');\n this.camouflage = true;\n }\n\n if (this.browser.version.isOlder('4.1') && !! (window.history && history.pushState)) {\n this.features.push('foundHistory');\n this.camouflage = true;\n }\n\n if (this.browser.version.isOlder('5.1') && !! document.documentElement.webkitRequestFullScreen) {\n this.features.push('foundFullscreen');\n this.camouflage = true;\n }\n\n if (this.browser.version.isOlder('5.2') && 'FileReader' in window) {\n this.features.push('foundFileReader');\n this.camouflage = true;\n }\n }\n }\n }\n }\n };\n\n function cleanupModel(s) {\n s = typeof s === 'undefined' ? '' : s;\n\n s = s.replace(/_TD$/, '');\n s = s.replace(/_CMCC$/, '');\n\n s = s.replace(/_/g, ' ');\n s = s.replace(/^\\s+|\\s+$/g, '');\n s = s.replace(/\\/[^/]+$/, '');\n s = s.replace(/\\/[^/]+ Android\\/.*/, '');\n\n s = s.replace(/^tita on /, '');\n s = s.replace(/^Android on /, '');\n s = s.replace(/^Android for /, '');\n s = s.replace(/^ICS AOSP on /, '');\n s = s.replace(/^Full AOSP on /, '');\n s = s.replace(/^Full Android on /, '');\n s = s.replace(/^Full Cappuccino on /, '');\n s = s.replace(/^Full MIPS Android on /, '');\n s = s.replace(/^Full Android/, '');\n\n s = s.replace(/^Acer ?/i, '');\n s = s.replace(/^Iconia /, '');\n s = s.replace(/^Ainol /, '');\n s = s.replace(/^Coolpad ?/i, 'Coolpad ');\n s = s.replace(/^ALCATEL /, '');\n s = s.replace(/^Alcatel OT-(.*)/, 'one touch $1');\n s = s.replace(/^YL-/, '');\n s = s.replace(/^Novo7 ?/i, 'Novo7 ');\n s = s.replace(/^GIONEE /, '');\n s = s.replace(/^HW-/, '');\n s = s.replace(/^Huawei[ -]/i, 'Huawei ');\n s = s.replace(/^SAMSUNG[ -]/i, '');\n s = s.replace(/^SonyEricsson/, '');\n s = s.replace(/^Lenovo Lenovo/, 'Lenovo');\n s = s.replace(/^LNV-Lenovo/, 'Lenovo');\n s = s.replace(/^Lenovo-/, 'Lenovo ');\n s = s.replace(/^(LG)[ _\\/]/, '$1-');\n s = s.replace(/^(HTC.*)\\s(?:v|V)?[0-9.]+$/, '$1');\n s = s.replace(/^(HTC)[-\\/]/, '$1 ');\n s = s.replace(/^(HTC)([A-Z][0-9][0-9][0-9])/, '$1 $2');\n s = s.replace(/^(Motorola[\\s|-])/, '')\n s = s.replace(/^(Moto|MOT-)/, '')\n\n s = s.replace(/-?(orange(-ls)?|vodafone|bouygues)$/i, '');\n s = s.replace(/http:\\/\\/.+$/i, '');\n\n s = s.replace(/^\\s+|\\s+$/g, '');\n\n return s;\n }\n\n function parseVersion(version) {\n version = version.toString();\n var components = version.split('.');\n var major = components.shift();\n return parseFloat(major + '.' + components.join(''));\n }\n\n return Detected;\n\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91c2VyYWdlbnQtYmFzZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdWEtZGV2aWNlQDAuMS4xMEB1YS1kZXZpY2UvbGliL3VzZXJhZ2VudC1iYXNlLmpzPzA1ZDkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBTVFJJTkdTX1NBTVNVTkcgPSAnU2Ftc3VuZycsXG4gICAgICAgIFNUUklOR1NfU0hBUlAgPSAnU2hhcnAnLFxuICAgICAgICBTVFJJTkdTX1NPTllfRVJJQ1NTT04gPSAnU29ueSBFcmljc3NvbicsXG4gICAgICAgIFNUUklOR1NfTU9UT1JPTEEgPSAnTW90b3JvbGEnLFxuICAgICAgICBTVFJJTkdTX0xHID0gJ0xHJyxcbiAgICAgICAgU1RSSU5HU19IVUFXRUkgPSAnSHVhd2VpJyxcbiAgICAgICAgU1RSSU5HU19IVEMgPSAnSFRDJyxcbiAgICAgICAgU1RSSU5HU19DT09MUEFEID0gJ0Nvb2xwYWQnLFxuICAgICAgICBTVFJJTkdTX0FTVVMgPSAnQXN1cycsXG4gICAgICAgIFNUUklOR1NfQUNFUiA9ICdBY2VyJztcbiAgICB2YXIgU1RSSU5HU19CQVNFRCA9ICcgYmFzZWQgZGV2aWNlJztcblxuICAgIHZhciBUT1VDSFdJWl9NT0RFTFMgPSB7XG4gICAgICAgICdTQU1TVU5HJzoge1xuICAgICAgICAgICAgJ0dULVMzMzcwQyc6IFtTVFJJTkdTX1NBTVNVTkcsICdDb3JieSAzRyddLFxuICAgICAgICAgICAgJ0dULVMzNjUwJzogW1NUUklOR1NfU0FNU1VORywgJ0NvcmJ5J10sXG4gICAgICAgICAgICAnR1QtUzM2NTMnOiBbU1RSSU5HU19TQU1TVU5HLCAnQ29yYnknXSxcbiAgICAgICAgICAgICdHVC1TMzg1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdDb3JieSBJSSddLFxuICAgICAgICAgICAgJ0dULVM1MjMwJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXInXSxcbiAgICAgICAgICAgICdHVC1TNTIzMFcnOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciddLFxuICAgICAgICAgICAgJ0dULVM1MjMzJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXInXSxcbiAgICAgICAgICAgICdHVC1TNTI2MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdTdGFyIElJJ10sXG4gICAgICAgICAgICAnR1QtUzU1NjAnOiBbU1RSSU5HU19TQU1TVU5HLCAnTWFydmVsJ10sXG4gICAgICAgICAgICAnR1QtUzU2MjAnOiBbU1RSSU5HU19TQU1TVU5HLCAnTW9udGUnXSxcbiAgICAgICAgICAgICdHVC1TNzU1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdCbHVlIEVhcnRoJ10sXG4gICAgICAgICAgICAnR1QtUzgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnSmV0J10sXG4gICAgICAgICAgICAnR1QtUzgwMDMnOiBbU1RSSU5HU19TQU1TVU5HLCAnSmV0J10sXG4gICAgICAgICAgICAnU0dILUY0ODAnOiBbU1RSSU5HU19TQU1TVU5HLCAnVG9jY28nXSxcbiAgICAgICAgICAgICdTR0gtVDUyOGcnOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RyYWlnaHQgVGFsayddLFxuICAgICAgICAgICAgJ0dULUIzNDEwJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXIgUXdlcnR5J10sXG4gICAgICAgICAgICAnR1QtQjUzMTAnOiBbU1RSSU5HU19TQU1TVU5HLCAnQ29yYnkgUHJvJ10sXG4gICAgICAgICAgICAnR1QtQjc3MjInOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciBEdW9zJ10sXG4gICAgICAgICAgICAnR1QtQzY3MTInOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciBJSSBEdW9zJ11cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBCQURBX01PREVMUyA9IHtcbiAgICAgICAgJ1NBTVNVTkcnOiB7XG4gICAgICAgICAgICAnR1QtIFM1MjUwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgNTI1J10sXG4gICAgICAgICAgICAnR1QtUzUyNTAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1MjUnXSxcbiAgICAgICAgICAgICdHVC1TNTI1Myc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDUyNSddLFxuICAgICAgICAgICAgJ0dULVM1MzMwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgNTMzJ10sXG4gICAgICAgICAgICAnR1QtUzUzODAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSBZJ10sXG4gICAgICAgICAgICAnR1QtUzUzODBEJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgWSddLFxuICAgICAgICAgICAgJ0dULVM1MzgwSyc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIFknXSxcbiAgICAgICAgICAgICdHVC1TNTc1MEUnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1NzUnXSxcbiAgICAgICAgICAgICdHVC1TNTc1M0UnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1NzUnXSxcbiAgICAgICAgICAgICdHVC1TNzIzMEInOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzIzMEUnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzIzM0UnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzI1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIE0nXSxcbiAgICAgICAgICAgICdHVC1TNzI1MEQnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSBNJ10sXG4gICAgICAgICAgICAnR1QtUzg1MDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSddLFxuICAgICAgICAgICAgJ0dULVM4NTAwQyc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlJ10sXG4gICAgICAgICAgICAnR1QtUzg1MDBSJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUnXSxcbiAgICAgICAgICAgICdHVC1TODUwMFQnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSddLFxuICAgICAgICAgICAgJ0dULVM4NTMwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgSUknXSxcbiAgICAgICAgICAgICdHVC1TODYwMCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDMnXSxcbiAgICAgICAgICAgICdTSFctTTQxMCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDMnXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFRJWkVOX01PREVMUyA9IHtcbiAgICAgICAgJ1NBTVNVTkcnOiB7XG4gICAgICAgICAgICAnR1QtSTk1MDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnR1QtSTk1MDAnXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIEJSRVdfTU9ERUxTID0ge1xuICAgICAgICAnQ29vbHBhZCBENTA4JzogW1NUUklOR1NfQ09PTFBBRCwgJ0Q1MDgnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRTYwMCc6IFtTVFJJTkdTX0NPT0xQQUQsICdFNjAwJ10sXG4gICAgICAgICdTQ0gtRjgzOSc6IFtTVFJJTkdTX1NBTVNVTkcsICdTQ0gtRjgzOSddXG4gICAgfVxuXG4gICAgdmFyIFdJTkRPV1NfTU9CSUxFX01PREVMUyA9IHtcbiAgICAgICAgJ0RYOTAwJzogW1NUUklOR1NfQUNFUiwgJ1RlbXBvIERYOTAwJ10sXG4gICAgICAgICdGOTAwJzogW1NUUklOR1NfQUNFUiwgJ1RlbXBvIEY5MDAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRjgwMCc6IFtTVFJJTkdTX0NPT0xQQUQsICdGODAwJ10sXG4gICAgICAgICdnYXJtaW4tYXN1cy1OdXZpZm9uZS1NMTAnOiBbJ0dhcm1pbi1Bc3VzJywgJ051dmlmb25lIE0xMCddLFxuICAgICAgICAnSFAgaVBBUSA1MTAnOiBbJ0hQJywgJ2lQQVEgNTEwJ10sXG4gICAgICAgICdIRCBtaW5pIFQ1NTU1JzogW1NUUklOR1NfSFRDLCAnSEQgbWluaSddLFxuICAgICAgICAnSFRDIEhEIG1pbmknOiBbU1RSSU5HU19IVEMsICdIRCBtaW5pJ10sXG4gICAgICAgICdIVEMgSEQgbWluaSBUNTU1NSc6IFtTVFJJTkdTX0hUQywgJ0hEIG1pbmknXSxcbiAgICAgICAgJ0hUQyBIRDInOiBbU1RSSU5HU19IVEMsICdIRDInXSxcbiAgICAgICAgJ0hUQyBIRDIgVDg1ODUnOiBbU1RSSU5HU19IVEMsICdIRDInXSxcbiAgICAgICAgJ0hEMiBUODU4NSc6IFtTVFJJTkdTX0hUQywgJ0hEMiddLFxuICAgICAgICAnVC1Nb2JpbGUgTEVPJzogW1NUUklOR1NfSFRDLCAnSEQyJ10sXG4gICAgICAgICdkb3BvZFQ1NTg4JzogW1NUUklOR1NfSFRDLCAnSGVuZ3NoYW4nXSxcbiAgICAgICAgJ0hUQyBNZWdhLVQzMzMzJzogW1NUUklOR1NfSFRDLCAnTWVnYSddLFxuICAgICAgICAnSFRDIFNuYXAgUzUyMSc6IFtTVFJJTkdTX0hUQywgJ1NuYXAnXSxcbiAgICAgICAgJ0hUQyBUb3VjaDIgVDMzMjAnOiBbU1RSSU5HU19IVEMsICdUb3VjaCAyJ10sXG4gICAgICAgICdIVEMgVG91Y2gyIFQzMzMzJzogW1NUUklOR1NfSFRDLCAnVG91Y2ggMiddLFxuICAgICAgICAnSFRDIFRvdWNoMiBUMzMzNSc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIDInXSxcbiAgICAgICAgJ0hUQyBQMzcwMCc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIERpYW1vbmQnXSxcbiAgICAgICAgJ0hUQyBUb3VjaCBEaWFtb25kMiBUNTM1Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIERpYW1vbmQgMiddLFxuICAgICAgICAnSFRDIFRvdWNoIEhEIFQ4MjgyJzogW1NUUklOR1NfSFRDLCAnVG91Y2ggSEQnXSxcbiAgICAgICAgJ0hUQyBUb3VjaCBIRCBUODI4Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIEhEJ10sXG4gICAgICAgICdIVEMgVG91Y2ggSEQyIFQ4NTg1JzogW1NUUklOR1NfSFRDLCAnVG91Y2ggSEQyJ10sXG4gICAgICAgICdIVEMgVG91Y2ggUHJvMiBUNzM3Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIFBybyAyJ10sXG4gICAgICAgICdUNzM4MCc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIFBybyAyJ10sXG4gICAgICAgICdIVEMgVHlUTiBJSSc6IFtTVFJJTkdTX0hUQywgJ1R5VE4gSUknXSxcbiAgICAgICAgJ0dULUI3MzAwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIExpdGUnXSxcbiAgICAgICAgJ0dULUI3NjEwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIFBybyddLFxuICAgICAgICAnR1QtaTgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgMiddLFxuICAgICAgICAnR1QtSTgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgMiddLFxuICAgICAgICAnR1QtSTgwMDBVJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDInXSxcbiAgICAgICAgJ00xaSc6IFtTVFJJTkdTX1NPTllfRVJJQ1NTT04sICdNMWkgQXNwZW4nXVxuICAgIH1cblxuICAgIHZhciBXSU5ET1dTX1BIT05FX01PREVMUyA9IHtcbiAgICAgICAgJ0FjZXInOiB7XG4gICAgICAgICAgICAnQWxsZWdybyc6IFtTVFJJTkdTX0FDRVIsICdBbGxlZ3JvJ10sXG4gICAgICAgICAgICAnTTMxMCc6IFtTVFJJTkdTX0FDRVIsICdBbGxlZ3JvJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnQXN1cyc6IHtcbiAgICAgICAgICAgICdHYWxheHk2JzogW1NUUklOR1NfQVNVUywgJ0dhbGF4eSA2J11cbiAgICAgICAgfSxcblxuICAgICAgICAnREVMTCc6IHtcbiAgICAgICAgICAgICdWZW51ZSBQcm8nOiBbJ0RlbGwnLCAnVmVudWUgUHJvJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnRnVqaXRzdVRvc2hpYmFNb2JpbGVDb21tdW4nOiB7XG4gICAgICAgICAgICAnSVMxMlQnOiBbJ0Z1aml0c3UgVG9zaGliYScsICdJUzEyVCddXG4gICAgICAgIH0sXG5cbiAgICAgICAgJ0hUQyc6IHtcbiAgICAgICAgICAgICc3IE1vemFydCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnNyBNb3phcnQgVDg2OTgnOiBbU1RSSU5HU19IVEMsICc3IE1vemFydCddLFxuICAgICAgICAgICAgJ1Q4Njk3JzogW1NUUklOR1NfSFRDLCAnNyBNb3phcnQnXSxcbiAgICAgICAgICAgICdUODY5OCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnUEQ2NzEwMCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnTW96YXJ0IFQ4Njk4JzogW1NUUklOR1NfSFRDLCAnNyBNb3phcnQnXSxcbiAgICAgICAgICAgICdNb3phcnQnOiBbU1RSSU5HU19IVEMsICc3IE1vemFydCddLFxuICAgICAgICAgICAgJ1VTQ0NIVEMtUEM5MzEwMCc6IFtTVFJJTkdTX0hUQywgJ0Fycml2ZSddLFxuICAgICAgICAgICAgJ0dvbGQnOiBbU1RSSU5HU19IVEMsICdHb2xkICddLFxuICAgICAgICAgICAgJ0hEMic6IFtTVFJJTkdTX0hUQywgJ0hEMiddLFxuICAgICAgICAgICAgJ0hENyc6IFtTVFJJTkdTX0hUQywgJ0hENyddLFxuICAgICAgICAgICAgJ0hENyBUOTI5Mic6IFtTVFJJTkdTX0hUQywgJ0hENyddLFxuICAgICAgICAgICAgJ1Q5Mjk1JzogW1NUUklOR1NfSFRDLCAnSEQ3J10sXG4gICAgICAgICAgICAnVDkyOTYnOiBbU1RSSU5HU19IVEMsICdIRDcnXSxcbiAgICAgICAgICAgICdIRDcgSW5maW5pdHknOiBbU1RSSU5HU19IVEMsICdIRDcnXSxcbiAgICAgICAgICAgICdUNzU3NSc6IFtTVFJJTkdTX0hUQywgJzcgUHJvJ10sXG4gICAgICAgICAgICAnNyBQcm8gVDc1NzYnOiBbU1RSSU5HU19IVEMsICc3IFBybyddLFxuICAgICAgICAgICAgJ213cDY5ODUnOiBbU1RSSU5HU19IVEMsICdUcm9waHknXSxcbiAgICAgICAgICAgICc3IFRyb3BoeSBUODY4Nic6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJzcgVHJvcGh5JzogW1NUUklOR1NfSFRDLCAnVHJvcGh5J10sXG4gICAgICAgICAgICAnUEM0MDEwMCc6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJ1RvdWNoLUlUIFRyb3BoeSc6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJ1JhZGFyJzogW1NUUklOR1NfSFRDLCAnUmFkYXInXSxcbiAgICAgICAgICAgICdSYWRhciA0Ryc6IFtTVFJJTkdTX0hUQywgJ1JhZGFyJ10sXG4gICAgICAgICAgICAnUmFkYXIgQzExMGUnOiBbU1RSSU5HU19IVEMsICdSYWRhciddLFxuICAgICAgICAgICAgJ01hemFhJzogW1NUUklOR1NfSFRDLCAnTWF6YWEnXSxcbiAgICAgICAgICAgICdNb25kcmlhbic6IFtTVFJJTkdTX0hUQywgJ01vbmRyaWFuJ10sXG4gICAgICAgICAgICAnU2NodWJlcnQnOiBbU1RSSU5HU19IVEMsICdTY2h1YmVydCddLFxuICAgICAgICAgICAgJzcgU2NodWJlcnQgVDkyOTInOiBbU1RSSU5HU19IVEMsICdTY2h1YmVydCddLFxuICAgICAgICAgICAgJ1NwYXJrJzogW1NUUklOR1NfSFRDLCAnU3BhcmsnXSxcbiAgICAgICAgICAgICdUODc4OCc6IFtTVFJJTkdTX0hUQywgJ1N1cnJvdW5kJ10sXG4gICAgICAgICAgICAnVElUQU4gWDMxMGUnOiBbU1RSSU5HU19IVEMsICdUaXRhbiddLFxuICAgICAgICAgICAgJ1gzMTBlJzogW1NUUklOR1NfSFRDLCAnVGl0YW4nXSxcbiAgICAgICAgICAgICdQSTM5MTAwJzogW1NUUklOR1NfSFRDLCAnVGl0YW4nXSxcbiAgICAgICAgICAgICdQSTg2MTAwJzogW1NUUklOR1NfSFRDLCAnVGl0YW4gSUknXSxcbiAgICAgICAgICAgICdVbHRpbWF0ZSc6IFtTVFJJTkdTX0hUQywgJ1VsdGltYXRlJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnTEcnOiB7XG4gICAgICAgICAgICAnR1c5MTAnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyddLFxuICAgICAgICAgICAgJ0xHIEUtOTAwJzogW1NUUklOR1NfTEcsICdPcHRpbXVzIDcgRTkwMCddLFxuICAgICAgICAgICAgJ0xHLUU5MDAnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyBFOTAwJ10sXG4gICAgICAgICAgICAnTEctRTkwMGgnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyBFOTAwJ10sXG4gICAgICAgICAgICAnTEctQzkwMCc6IFtTVFJJTkdTX0xHLCAnT3B0aW11cyA3USddLFxuICAgICAgICAgICAgJ0xHLUM5MDBCJzogW1NUUklOR1NfTEcsICdRdWFudHVtJ10sXG4gICAgICAgICAgICAnTEctQzkwMGsnOiBbU1RSSU5HU19MRywgJ1F1YW50dW0nXVxuICAgICAgICB9LFxuXG4gICAgICAgICdub2tpYSc6IHtcbiAgICAgICAgICAgICdTZWFSYXknOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddLFxuICAgICAgICAgICAgJzgwMEMnOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddXG4gICAgICAgIH0sXG5cbiAgICAgICAgJ05PS0lBJzoge1xuICAgICAgICAgICAgJzcxMCc6IFsnTm9raWEnLCAnTHVtaWEgNzEwJ10sXG4gICAgICAgICAgICAnTm9raWEgNzEwJzogWydOb2tpYScsICdMdW1pYSA3MTAnXSxcbiAgICAgICAgICAgICdMdW1pYSA3MTAnOiBbJ05va2lhJywgJ0x1bWlhIDcxMCddLFxuICAgICAgICAgICAgJ0x1bWlhIDcxOSc6IFsnTm9raWEnLCAnTHVtaWEgNzE5J10sXG4gICAgICAgICAgICAnTHVtaWEgODAwJzogWydOb2tpYScsICdMdW1pYSA4MDAnXSxcbiAgICAgICAgICAgICc4MDAnOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddLFxuICAgICAgICAgICAgJ0x1bWlhIDkwMCc6IFsnTm9raWEnLCAnTHVtaWEgOTAwJ10sXG4gICAgICAgICAgICAnWFhYJzogWydOb2tpYScsICdwcm90b3R5cGUnXVxuICAgICAgICB9LFxuXG4gICAgICAgICdTQU1TVU5HJzoge1xuICAgICAgICAgICAgJ0dULUk4MzUwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIFcnXSxcbiAgICAgICAgICAgICdHVC1JODM1MFQnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgVyddLFxuICAgICAgICAgICAgJ1NHSC1pNjc3JzogW1NUUklOR1NfU0FNU1VORywgJ0ZvY3VzIEZsYXNoJ10sXG4gICAgICAgICAgICAnU0dILWk3MDcnOiBbU1RSSU5HU19TQU1TVU5HLCAnVGF5bG9yJ10sXG4gICAgICAgICAgICAnU0dILWk5MTcnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgNyddLFxuICAgICAgICAgICAgJ1NHSC1JOTE3JzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDcnXSxcbiAgICAgICAgICAgICdTR0gtaTkxNy4nOiBbU1RSSU5HU19TQU1TVU5HLCAnRm9jdXMnXSxcbiAgICAgICAgICAgICdTR0gtaTkxN1InOiBbU1RSSU5HU19TQU1TVU5HLCAnRm9jdXMnXSxcbiAgICAgICAgICAgICdTR0gtaTkzNyc6IFtTVFJJTkdTX1NBTVNVTkcsICdGb2N1cyBTJ10sXG4gICAgICAgICAgICAnT01OSUE3JzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDcnXSxcbiAgICAgICAgICAgICdPTUlOQTcnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgNyddLFxuICAgICAgICAgICAgJ1RheWxvcic6IFtTVFJJTkdTX1NBTVNVTkcsICdUYXlsb3InXVxuICAgICAgICB9LFxuXG4gICAgICAgICdUT1NISUJBJzoge1xuICAgICAgICAgICAgJ1RTVU5BR0knOiBbJ1Rvc2hpYmEnLCAnVHN1bmFnaSddXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIEFORFJPSURfTU9ERUxTID0ge1xuICAgICAgICAnQW5kcm9pZCc6IFtudWxsLCBudWxsXSxcbiAgICAgICAgJ2dvb2dsZSBzZGsnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdzZGsnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdnZW5lcmljJzogW251bGwsIG51bGxdLFxuICAgICAgICAnZ2VuZXJpYyB4ODYnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdhbWQgYnJhem9zJzogWydBTUQnLCAnRnVzaW9uYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdBbWxvZ2ljIE0xIHJlZmVyZW5jZSBib2FyZCc6IFsnQW1sb2dpYycsICdNMSByZWZlcmVuY2UgYm9hcmQnXSxcbiAgICAgICAgJ0FNTDg3MjZNJzogWydBbWxvZ2ljJywgJ0FNTDg3MjYtTWJhc2VkIGRldmljZSddLFxuICAgICAgICAndmV4cHJlc3MgYTknOiBbJ0FSTScsICdWZXJzYXRpbGUgRXhwcmVzcyBkZXZlbG9wbWVudCBwbGF0Zm9ybSddLFxuICAgICAgICAnYmNtNzIzMSc6IFsnQnJvYWRjb20nLCAnQkNNNzIzMWJhc2VkIGRldmljZScsICd0ZWxldmlzaW9uJ10sXG4gICAgICAgICdiY203NDI1JzogWydCcm9hZGNvbScsICdCQ003NDI1YmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ2JjbTc0MjknOiBbJ0Jyb2FkY29tJywgJ0JDTTc0MjliYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnaW14NTAgcmRwJzogWydGcmVlc2NhbGUnLCAnaS5NWDUwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdpbXg1MSBiYmcnOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTFiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIGxvY28nOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIG1wMjA0ZjMnOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIHNtZCc6IFsnRnJlZXNjYWxlJywgJ2kuTVg1M2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnaW14NTMgeWVhZ2xlJzogWydGcmVlc2NhbGUnLCAnaS5NWDUzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdpbXg2cSc6IFsnRnJlZXNjYWxlJywgJ2kuTVg2UWJhc2VkIGRldmljZSddLFxuICAgICAgICAnT0RST0lELUEnOiBbJ0hhcmRrZXJuZWwnLCAnT0RST0lELUEgZGV2ZWxvcGVyIHRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ21mbGQgZHYxMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgZHYyMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgbHcwMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgcHIyJzogWydJbnRlbCcsICdNZWRmaWVsZGJhc2VkIGRldmljZSddLFxuICAgICAgICAnbWZsZCBwcjMnOiBbJ0ludGVsJywgJ01lZGZpZWxkYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdiZXJsaW4gYmcyJzogWydNYXJ2ZWxsJywgJ0FybWFkYSAxMDAwYmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ01TdGFyIEFtYmVyMyc6IFsnTVN0YXInLCAnQW1iZXIzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdLb25rYSBBbWJlcjMnOiBbJ01TdGFyJywgJ0FtYmVyM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnbXQ1Mzk2JzogWydNZWRpYXRlaycsICdNVDUzOTZiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnYmlyZDc1djInOiBbJ01lZGlhdGVrJywgJ01UNjU3NWJhc2VkIGRldmljZSddLFxuICAgICAgICAnZWFnbGU3NXYxIDInOiBbJ01lZGlhdGVrJywgJ01UNjU3NWJhc2VkIGRldmljZSddLFxuICAgICAgICAnTUJYIERWQlQgcmVmZXJlbmNlIGJvYXJkIChjMDNyZWYpJzogWydNWEInLCAnRFZCVCByZWZlcmVuY2UgYm9hcmQnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnTlMyODE2JzogWydOdWZyb250JywgJ051U21hcnQgMjgxNmJhc2VkIGRldmljZSddLFxuICAgICAgICAnVmVudGFuYSc6IFsnblZpZGlhJywgJ1RlZ3JhIFZlbnRhbmEgZGV2ZWxvcG1lbnQga2l0J10sXG4gICAgICAgICdDYXJkaHUnOiBbJ25WaWRpYScsICdUZWdyYSAzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdQYW5kYSc6IFsnUGFuZGFib2FyZCcsICdEZXZlbG9wbWVudCBLaXQnXSxcbiAgICAgICAgJ3BhbmRhYm9hcmQnOiBbJ1BhbmRhYm9hcmQnLCAnRGV2ZWxvcG1lbnQgS2l0J10sXG4gICAgICAgICdQYW5kYUJvYXJkJzogWydQYW5kYWJvYXJkJywgJ0RldmVsb3BtZW50IEtpdCddLFxuICAgICAgICAnTVNNJzogWydRdWFsY29tbScsICdTbmFwZHJhZ29uYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdtc203MjI3IGZmYSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyNyBzdXJmJzogWydRdWFsY29tbScsICdTbmFwZHJhZ29uIFMxYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdtc203NjI3YSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyN2Egc2t1MSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyN2Egc2t1Myc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYzMCBmdXNpb24nOiBbJ1F1YWxjb21tJywgJ1NuYXBkcmFnb24gUzJiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21zbTc2MzAgc3VyZic6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMmJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtODY2MCBjb3VnYXInOiBbJ1F1YWxjb21tJywgJ1NuYXBkcmFnb24gUzNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21zbTg2NjAgc3VyZic6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtODk2MCc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTNGJhc2VkIGRldmljZSddLFxuICAgICAgICAncmsyODA4c2RrJzogWydSb2NrY2hpcCcsICdSSzI4MDhiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ1JLMjgxOCc6IFsnUm9ja2NoaXAnLCAnUksyODE4YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazI4MThzZGsnOiBbJ1JvY2tjaGlwJywgJ1JLMjgxOGJhc2VkIGRldmljZSddLFxuICAgICAgICAnQW5kcm9pZC1mb3ItUm9ja2NoaXAtMjgxOCc6IFsnUm9ja2NoaXAnLCAnUksyODE4YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazI5c2RrJzogWydSb2NrY2hpcCcsICdSSzI5YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdSazI5c2RrJzogWydSb2NrY2hpcCcsICdSSzI5YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazMwc2RrJzogWydSb2NrY2hpcCcsICdSSzMwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdzM2M2NDEwJzogWydTYW1zdW5nJywgJ1MzQzY0MTBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ3NtZGs2NDEwJzogWydTYW1zdW5nJywgJ1MzQzY0MTBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ1NNREtDMTEwJzogWydTYW1zdW5nJywgJ0V4eW5vcyAzMTEwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdTTURLVjIxMCc6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnUzVQVjIxMCc6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnc2VjIHNtZGtjMjEwJzogWydTYW1zdW5nJywgJ0V4eW5vcyA0MjEwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdTTURLNHgxMic6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMiBvciA0NDEyYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdzbXA4Nnh4JzogWydTaWdtYScsICdTTVA4Nnh4YmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ3N2ODg2MCc6IFsnU2t5dmlpYScsICdTVjg4NjBiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnc3RlIHU4NTAwJzogWydTVCBFcmljc3NvbicsICdOb3ZhdGhvciBVODUwMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnVGVsZWNoaXBzIE04MDEgRXZhbHVhdGlvbiBCb2FyZCc6IFsnVGVsZWNoaXBzJywgJ004MDFiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVGVsZWNoaXBzIFRDQzg5MDAgRXZhbHVhdGlvbiBCb2FyZCc6IFsnVGVsZWNoaXBzJywgJ1RDQzg5MDBiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVENDODkyMCBTVEIgRVYnOiBbJ1RlbGVjaGlwcycsICdUQ0M4OTIwYmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ09NQVAnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ09NQVAgU1MnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ0xvZ2ljUEQgWm9vbTInOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ29tYXAzZXZtJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdPTUFQM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnT21hcDVzZXZtJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdPTUFQNWJhc2VkIGRldmljZSddLFxuICAgICAgICAncG54ODQ3MyBraXJ5dW5nJzogWydUcmlkZW50JywgJ1BOWDg0NzNiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnY3Jlc3BvJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnQ3Jlc3BvJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnQ3Jlc3BvNEcnOiBbJ0dvb2dsZScsICdOZXh1cyBTJ10sXG4gICAgICAgICdQYXNzaW9uJzogWydHb29nbGUnLCAnTmV4dXMgT25lJ10sXG4gICAgICAgICdCcmF2byc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnZHJlYW0nOiBbJ0hUQycsICdEcmVhbSddLFxuICAgICAgICAnVm9ndWUnOiBbJ0hUQycsICdUb3VjaCddLFxuICAgICAgICAnVmVuZG9yIE9wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ1N0aW5ncmF5JzogWydNb3Rvcm9sYScsICdYT09NJywgJ3RhYmxldCddLFxuICAgICAgICAnV2luZ3JheSc6IFsnTW90b3JvbGEnLCAnWE9PTScsICd0YWJsZXQnXSxcbiAgICAgICAgJ21hZ3Vybyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ01hZ3Vybyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1Rvcm8tVlpXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOZXh1cyddLFxuICAgICAgICAnYmxhemUnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ0JsYXplIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0JsYXplJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdCbGF6ZSBUYWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdCbGF6ZSBUYWJsZXQnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ0JsYXplIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0JsdWVTdGFja3MnOiBbJ0JsdWVTdGFja3MnLCAnQXBwIFBsYXllcicsICdkZXNrdG9wJ10sXG4gICAgICAgICd5b3V3YXZlIGN1c3RvbSc6IFsnWW91d2F2ZScsICdBbmRyb2lkIG9uIFBDJywgJ2Rlc2t0b3AnXSxcbiAgICAgICAgJ0ExMDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQTEwMSc6IFsnQWNlcicsICdJY29uaWEgVGFiIEExMDEnLCAndGFibGV0J10sXG4gICAgICAgICdBMjAwJzogWydBY2VyJywgJ0ljb25pYSBUYWIgQTIwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E1MDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBNTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQTUwMSc6IFsnQWNlcicsICdJY29uaWEgVGFiIEE1MDEnLCAndGFibGV0J10sXG4gICAgICAgICdBNTEwJzogWydBY2VyJywgJ0ljb25pYSBUYWIgQTUxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E1MTEnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBNTExJywgJ3RhYmxldCddLFxuICAgICAgICAnQTcwMCc6IFsnQWNlcicsICdJY29uaWEgVGFiIEE3MDAnLCAndGFibGV0J10sXG4gICAgICAgICdBY2VyIEE4MDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBODAwJywgJ3RhYmxldCddLFxuICAgICAgICAnRTExMCc6IFsnQWNlcicsICdiZVRvdWNoIEUxMTAnXSxcbiAgICAgICAgJ0UxMjAnOiBbJ0FjZXInLCAnYmVUb3VjaCBFMTIwJ10sXG4gICAgICAgICdFMTMwJzogWydBY2VyJywgJ2JlVG91Y2ggRTEzMCddLFxuICAgICAgICAnRTE0MCc6IFsnQWNlcicsICdiZVRvdWNoIEUxNDAnXSxcbiAgICAgICAgJ0UyMTAnOiBbJ0FjZXInLCAnYmVUb3VjaCBFMjEwJ10sXG4gICAgICAgICdFMzEwJzogWydBY2VyJywgJ0xpcXVpZCBtaW5pJ10sXG4gICAgICAgICdFMzIwJzogWydBY2VyJywgJ0xpcXVpZCBFeHByZXNzJ10sXG4gICAgICAgICdFMzMwJzogWydBY2VyJywgJ0xpcXVpZCBHbG93J10sXG4gICAgICAgICdFNDAwJzogWydBY2VyJywgJ2JlVG91Y2ggRTQwMCddLFxuICAgICAgICAnRzEwMFcnOiBbJ0FjZXInLCAnRzEwMFcnXSxcbiAgICAgICAgJ1MxMDAnOiBbJ0FjZXInLCAnTGlxdWlkJ10sXG4gICAgICAgICdTMTEwJzogWydBY2VyJywgJ1N0cmVhbSddLFxuICAgICAgICAnUzEyMCc6IFsnQWNlcicsICdMaXF1aWQgbXQnXSxcbiAgICAgICAgJ1MzMDAnOiBbJ0FjZXInLCAnSWNvbmlhIFNtYXJ0J10sXG4gICAgICAgICdTNTAwJzogWydBY2VyJywgJ0Nsb3VkTW9iaWxlJ10sXG4gICAgICAgICdURDYwMCc6IFsnQWNlcicsICdiZVRvdWNoIFRENjAwJ10sXG4gICAgICAgICdMaXF1aWQnOiBbJ0FjZXInLCAnTGlxdWlkJ10sXG4gICAgICAgICdMaXF1aWQgRSc6IFsnQWNlcicsICdMaXF1aWQgRSddLFxuICAgICAgICAnTGlxdWlkIE10JzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnTGlxdWlkIE1UJzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnTGlxdWlkIE1ldGFsJzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnU3RyZWFtJzogWydBY2VyJywgJ1N0cmVhbSddLFxuICAgICAgICAnTjcwMCc6IFsnYWlnbycsICdONzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnTTgwMSc6IFsnYWlnbycsICdNODAxJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzcnOiBbJ0Fpbm92bycsICdOb3ZvNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEF1cm9yYSc6IFsnQWlub3ZvJywgJ05vdm83IEF1cm9yYScsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEFkdmFuY2VkJzogWydBaW5vdm8nLCAnTm92bzcgQWR2YW5jZWQnLCAndGFibGV0J10sXG4gICAgICAgICdOb3ZvNyBBZHZhbmNlZDInOiBbJ0Fpbm92bycsICdOb3ZvNyBBZHZhbmNlZCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzcgQmFzaWMnOiBbJ0Fpbm92bycsICdOb3ZvNyBCYXNpYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEVMRic6IFsnQWlub3ZvJywgJ05vdm83IEVsZicsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IFBBTEFESU4nOiBbJ0Fpbm92bycsICdOb3ZvNyBQYWxhZGluJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzggQWR2YW5jZWQnOiBbJ0Fpbm92bycsICdOb3ZvOCBBZHZhbmNlZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA4OTAnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDg5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDg5MEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDg5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDg5MSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggODkxJ10sXG4gICAgICAgICdPTkUgVE9VQ0ggOTAzJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5MDNTSFYtRTE3MEsnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5MDYnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkwNiddLFxuICAgICAgICAnb25lIHRvdWNoIDkwOCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTA4Ric6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTA4Uyc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTEwJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5MTAnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5MTgnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnT05FIFRPVUNIIDkxOEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOE0nOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOE4nOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDk4MCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgwJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTgwQSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgwJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTgxQSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgxJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTg2JzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5ODYnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5OTAnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDk5MEEnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDk5MSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkxJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTkxRCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkxJ10sXG4gICAgICAgICdPTkUgVE9VQ0ggOTkzJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5OTMnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5OTUnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5NSddLFxuICAgICAgICAnVGVsZW5vciBPbmVUb3VjaCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkwJ10sXG4gICAgICAgICdPVCA5MTgnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnVmVudHVyZSc6IFsnQWxjYXRlbCcsICdWZW50dXJlJ10sXG4gICAgICAgICdBbGx3aW5uZXIgQTEwJzogWydBbGxXaW5uZXInLCAnQTEwJywgJ3RhYmxldCddLFxuICAgICAgICAnOTdGQyc6IFsnQWxsV2lubmVyJywgJ0ExMCA5N0ZDJywgJ3RhYmxldCddLFxuICAgICAgICAnS2luZGxlIEZpcmUnOiBbJ0FtYXpvbicsICdLaW5kbGUgRmlyZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FtYXpvbiBLaW5kbGUgRmlyZSc6IFsnQW1hem9uJywgJ0tpbmRsZSBGaXJlJywgJ3RhYmxldCddLFxuICAgICAgICAnQU1EMTIwJzogWydBbnlEQVRBJywgJ0FueVRBQiBBTUQxMjAnLCAndGFibGV0J10sXG4gICAgICAgICdNVzA4MTEnOiBbJ0FPQycsICdCcmVlemUgTVcwODExJywgJ3RhYmxldCddLFxuICAgICAgICAnTVcwODIxIFYyLjAnOiBbJ0FPQycsICdCcmVlemUgTVcwODIxJywgJ3RhYmxldCddLFxuICAgICAgICAnTVcwOTIyJzogWydBT0MnLCAnQnJlZXplIE1XMDkyMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FwYW5kYSBBNjAnOiBbJ0FwYW5kYScsICdBNjAnXSxcbiAgICAgICAgJ2FwYW5kYS1BNjAnOiBbJ0FwYW5kYScsICdBNjAnXSxcbiAgICAgICAgJ0E4MEtTQyc6IFsnQXJjaG9zJywgJ0Fybm92YSA4JywgJ3RhYmxldCddLFxuICAgICAgICAnQU43Q0cyJzogWydBcmNob3MnLCAnQXJub3ZhIDcnLCAndGFibGV0J10sXG4gICAgICAgICdBMTAxQic6IFsnQXJjaG9zJywgJ0Fybm92YSAxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FOMTBCRzJEVCc6IFsnQXJjaG9zJywgJ0Fybm92YSAxMCBCJywgJ3RhYmxldCddLFxuICAgICAgICAnQU4xMEcyJzogWydBcmNob3MnLCAnQXJub3ZhIDEwIEcyJywgJ3RhYmxldCddLFxuICAgICAgICAnQTMyJzogWydBcmNob3MnLCAnMzInLCAnbWVkaWEnXSxcbiAgICAgICAgJ0EzNURFJzogWydBcmNob3MnLCAnMzUgU21hcnQgSG9tZSBQaG9uZSddLFxuICAgICAgICAnQTQzJzogWydBcmNob3MnLCAnNDMnLCAnbWVkaWEnXSxcbiAgICAgICAgJ0FyY2hvczUnOiBbJ0FyY2hvcycsICc1JywgJ21lZGlhJ10sXG4gICAgICAgICdBNzBIJzogWydBcmNob3MnLCAnNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MEhCJzogWydBcmNob3MnLCAnNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MEJIVCc6IFsnQXJjaG9zJywgJzcnLCAndGFibGV0J10sXG4gICAgICAgICdBNzBDSFQnOiBbJ0FyY2hvcycsICc3QycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MFMnOiBbJ0FyY2hvcycsICc3MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3RUInOiBbJ0FyY2hvcycsICc3MEInLCAndGFibGV0J10sXG4gICAgICAgICdBUkNIT1MgNzBpdDInOiBbJ0FyY2hvcycsICc3MCBJVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQVJDSE9TIDgwRzknOiBbJ0FyY2hvcycsICc4MCBHOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FSQ0hPUyAxMDFHOSc6IFsnQXJjaG9zJywgJzEwMSBHOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ExMDFJVCc6IFsnQXJjaG9zJywgJzEwMSBJVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVFJJJzogWydBU1RSSScsICdlLXJlYWRlcicsICdlcmVhZGVyJ10sXG4gICAgICAgICdlZWVwYyc6IFsnQXN1cycsICdFZWUgUGMnXSxcbiAgICAgICAgJ2FzdXMgbGFwdG9wJzogWydBc3VzJywgJ0VlZSBQYyddLFxuICAgICAgICAnTUUxNzEnOiBbJ0FzdXMnLCAnRWVlIFBhZCBNZU1PJywgJ3RhYmxldCddLFxuICAgICAgICAnU2xpZGVyIFNMMTAxJzogWydBc3VzJywgJ0VlZSBQYWQgU2xpZGVyJywgJ3RhYmxldCddLFxuICAgICAgICAnRVBBRCc6IFsnQXN1cycsICdFZWUgUGFkIFRyYW5zZm9ybWVyJywgJ3RhYmxldCddLFxuICAgICAgICAnVEYxMDEnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RyYW5zZm9ybWVyIFRGMTAxJzogWydBc3VzJywgJ0VlZSBQYWQgVHJhbnNmb3JtZXInLCAndGFibGV0J10sXG4gICAgICAgICdUcmFuc2Zvcm1lciBURjEwMUcnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RGMjAxJzogWydBc3VzJywgJ0VlZSBQYWQgVHJhbnNmb3JtZXIgUHJpbWUnLCAndGFibGV0J10sXG4gICAgICAgICdUcmFuc2Zvcm1lciBQcmltZSBURjIwMSc6IFsnQXN1cycsICdFZWUgUGFkIFRyYW5zZm9ybWVyIFByaW1lJywgJ3RhYmxldCddLFxuICAgICAgICAnVHJhbnNmb3JtZXIgUHJpbWUnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lciBQcmltZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RyYW5zZm9ybWVyIFBhZCBURjMwMFQnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgVEYzMDBUJzogWydBc3VzJywgJ1RyYW5zZm9ybWVyIFBhZCAzMDAnLCAndGFibGV0J10sXG4gICAgICAgICdBU1VTIFRyYW5zZm9ybWVyIFBhZCBURjMwMFQnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgUGFkIFRGMzAwVEcnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgUGFkIFRGNzAwVCc6IFsnQXN1cycsICdUcmFuc2Zvcm1lciBQYWQgSW5maW5pdHkgNzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVNVUyBUcmFuc2Zvcm1lciBQYWQgVEY3MDBLJzogWydBc3VzJywgJ1RyYW5zZm9ybWVyIFBhZCBJbmZpbml0eSA3MDAnLCAndGFibGV0J10sXG4gICAgICAgICdBU1VTIFRyYW5zZm9ybWVyIFRGNzAwSyc6IFsnQXN1cycsICdUcmFuc2Zvcm1lciBQYWQgSW5maW5pdHkgNzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnUGFkRm9uZSc6IFsnQXN1cycsICdQYWRmb25lJywgJ3RhYmxldCddLFxuICAgICAgICAnT01TIFRURCc6IFsnQXN1cycsICdFZWUgUGMgVDEwJ10sXG4gICAgICAgICdBU1VTIFQyMCc6IFsnQXN1cycsICdFZWUgUGMgVDIwJ10sXG4gICAgICAgICdFVEJXMTFBQSc6IFsnQXN1cycsICdUb3VnaCddLFxuICAgICAgICAnQVVYIFY5MDAnOiBbJ0FVWCcsICdWOTAwJ10sXG4gICAgICAgICdNOTEwQSc6IFsnQVVYJywgJ005MTAnXSxcbiAgICAgICAgJ1BJQ09wYWQtUUdOJzogWydBeGlvbycsICdQaWNvcGFkIFFHTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ05PT0snOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0snLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9va0NvbG9yJzogWydCYXJuZXMgJiBOb2JsZScsICdOT09LIENvbG9yJywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgQk5SVjIwMCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBDb2xvcicsICdlcmVhZGVyJ10sXG4gICAgICAgICdOT09LIEJOUlYzMDAnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgQ29sb3InLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9va1RhYmxldCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9vayBUYWJsZXQnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgQk5UVjI1MCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnTk9PSyBCTlRWMjUwQSc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnQk5UVjI1MCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnQk5UVjI1MEEnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgU2xhdGUnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ0JlbldlZSA1MTAwJzogWydCZW5XZWUnLCAnNTEwMCddLFxuICAgICAgICAnQ0E5MDdBQUMwRyc6IFsnQmVzdGEnLCAnQ0E5MDdBQUMwRyddLFxuICAgICAgICAnQk05OTknOiBbJ0Jtb3JuJywgJ0JNOTk5JywgJ3RhYmxldCddLFxuICAgICAgICAnVjExJzogWydCbW9ybicsICdWMTEnLCAndGFibGV0J10sXG4gICAgICAgICdWOTknOiBbJ0Jtb3JuJywgJ1Y5OScsICd0YWJsZXQnXSxcbiAgICAgICAgJ2JxIERhVmluY2knOiBbJ2JxJywgJ0RhVmluY2knLCAndGFibGV0J10sXG4gICAgICAgICdDVDcwNCc6IFsnQ2FycmVmb3VyJywgJ0NUNzA0JywgJ3RhYmxldCddLFxuICAgICAgICAnQ1QxMDAyJzogWydDYXJyZWZvdXInLCAnQ1QxMDAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQ2FtYW5naS1NYW5ncm92ZTcnOiBbJ0NhbWFuZ2knLCAnTWFuZ3JvdmUgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1dTMTcxJzogWydDYW1hbmdpJywgJ1dlYlN0YXRpb24nLCAndGFibGV0J10sXG4gICAgICAgICdJUzExQ0EnOiBbJ0Nhc2lvJywgJ0d6T25lIElTMTFDQSddLFxuICAgICAgICAnQzc3MSc6IFsnQ2FzaW8nLCAnR3pPbmUgQ29tbWFuZG8nXSxcbiAgICAgICAgJ0NBVCBOT1ZBJzogWydDYXQnLCAnTk9WQScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FSTU0zVic6IFsnY2hpbmFsZWFwJywgJ0FSTU0zVicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NJVVMtNyc6IFsnQ2lzY28nLCAnQ2l1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NJVVMtNy1BVCc6IFsnQ2lzY28nLCAnQ2l1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NTTCBTcGljZSBNSTMwMCc6IFsnQ1NMJywgJ1NwaWNlIE1JMzAwJ10sXG4gICAgICAgICdDU0wtTUk0MTAnOiBbJ0NTTCcsICdTcGljZSBNSTQxMCddLFxuICAgICAgICAnTUlEMTAyNCc6IFsnQ29ieScsICdLeXJvcyBNSUQxMDI0JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEMTEyNSc6IFsnQ29ieScsICdLeXJvcyBNSUQxMTI1JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEMTEyNic6IFsnQ29ieScsICdLeXJvcyBNSUQxMTI2JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxMCc6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxMic6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxNSc6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDE1JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxNUEnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAxNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMTYnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAxNicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjAnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjInOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjQnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyNCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjUnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcxMjcnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzEyNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgwMjQnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODAyNCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgxMjUnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODEyNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgxMjcnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODEyNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1o3MSc6IFsnQ29tbXRpdmEnLCAnWjcxJ10sXG4gICAgICAgICdWLVQxMDAnOiBbJ0NvbW10aXZhJywgJ1YtVDEwMCddLFxuICAgICAgICAnRklILUZCMCc6IFsnQ29tbXRpdmEnLCAnSEQ3MDAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRDUxMCc6IFsnQ29vbHBhZCcsICdENTEwJ10sXG4gICAgICAgICdDb29scGFkIDgwMjAnOiBbJ0Nvb2xwYWQnLCAnODAyMCddLFxuICAgICAgICAnRDUzMCc6IFsnQ29vbHBhZCcsICdENTMwJ10sXG4gICAgICAgICdDb29scGFkIEQ1MzAnOiBbJ0Nvb2xwYWQnLCAnRDUzMCddLFxuICAgICAgICAnRDUzOSc6IFsnQ29vbHBhZCcsICdENTM5J10sXG4gICAgICAgICdDb29scGFkIEQ1MzknOiBbJ0Nvb2xwYWQnLCAnRDUzOSddLFxuICAgICAgICAnRTIzOSc6IFsnQ29vbHBhZCcsICdFMjM5J10sXG4gICAgICAgICdDb29scGFkIEUyMzknOiBbJ0Nvb2xwYWQnLCAnRTIzOSddLFxuICAgICAgICAnQ29vbHBhZCBOOTMwJzogWydDb29scGFkJywgJ045MzAnXSxcbiAgICAgICAgJ045MzAnOiBbJ0Nvb2xwYWQnLCAnTjkzMCddLFxuICAgICAgICAnQ29vbHBhZCBXNzA2JzogWydDb29scGFkJywgJ1c3MDYnXSxcbiAgICAgICAgJ0Nvb2xwYWQgVzcwNisnOiBbJ0Nvb2xwYWQnLCAnVzcwNiddLFxuICAgICAgICAnQ29vbHBhZCBXNzA4JzogWydDb29scGFkJywgJ1c3MDgnXSxcbiAgICAgICAgJ1c3MTEnOiBbJ0Nvb2xwYWQnLCAnVzcxMSddLFxuICAgICAgICAnQ29vbHBhZCA1MDEwJzogWydDb29scGFkJywgJzUwMTAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgNTIxMCc6IFsnQ29vbHBhZCcsICc1MjEwJ10sXG4gICAgICAgICdDb29scGFkIDU4MjAnOiBbJ0Nvb2xwYWQnLCAnNTgyMCddLFxuICAgICAgICAnNTgzMic6IFsnQ29vbHBhZCcsICc1ODMyJ10sXG4gICAgICAgICdDb29scGFkIDU4MzInOiBbJ0Nvb2xwYWQnLCAnNTgzMiddLFxuICAgICAgICAnNTg1NSc6IFsnQ29vbHBhZCcsICc1ODU1J10sXG4gICAgICAgICdDb29scGFkIDU4NjAnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnQ29vbHBhZCA1ODYwKyc6IFsnQ29vbHBhZCcsICc1ODYwJ10sXG4gICAgICAgICdDb29scGFkIDU4NjBzJzogWydDb29scGFkJywgJzU4NjAnXSxcbiAgICAgICAgJzU4NjAnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnNTg2MEEnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnQ29vbHBhZCA1ODcwJzogWydDb29scGFkJywgJzU4NzAnXSxcbiAgICAgICAgJzU4NzAnOiBbJ0Nvb2xwYWQnLCAnNTg3MCddLFxuICAgICAgICAnQ29vbHBhZCA3MDA1JzogWydDb29scGFkJywgJzcwMDUnXSxcbiAgICAgICAgJzcyNjAnOiBbJ0Nvb2xwYWQnLCAnNzI2MCddLFxuICAgICAgICAnQ29vbHBhZCA3MDE5JzogWydDb29scGFkJywgJzcwMTknXSxcbiAgICAgICAgJ0Nvb2xwYWQgNzI2MCc6IFsnQ29vbHBhZCcsICc3MjYwJ10sXG4gICAgICAgICdDb29scGFkIDgwMTMnOiBbJ0Nvb2xwYWQnLCAnODAxMyddLFxuICAgICAgICAnQ29vbHBhZCA4ODA5JzogWydDb29scGFkJywgJzg4MDknXSxcbiAgICAgICAgJ0Nvb2xwYWQgODgxMCc6IFsnQ29vbHBhZCcsICc4ODEwJ10sXG4gICAgICAgICc4ODEwJzogWydDb29scGFkJywgJzg4MTAnXSxcbiAgICAgICAgJzgxNTAnOiBbJ0Nvb2xwYWQnLCAnODE1MCddLFxuICAgICAgICAnQ29vbHBhZCA4MTUwRCc6IFsnQ29vbHBhZCcsICc4MTUwJ10sXG5cbiAgICAgICAgJ0Nvb2xwYWQgODgxMSc6IFsnQ29vbHBhZCcsICc4ODExJ10sXG4gICAgICAgICdDb29scGFkIDk5MDAnOiBbJ0Nvb2xwYWQnLCAnOTkwMCddLFxuICAgICAgICAnQ29vbHBhZCA4MDUwJzogWydDb29scGFkJywgJzgwNTAnXSxcbiAgICAgICAgJ1ppaU83JzogWydDcmVhdGl2ZScsICdaaWlPIDcnLCAndGFibGV0J10sXG4gICAgICAgICdaaWlMQUJTIFppaU83JzogWydDcmVhdGl2ZScsICdaaWlPIDcnLCAndGFibGV0J10sXG4gICAgICAgICdaaWlMQUJTIFppaU8xMCAnOiBbJ0NyZWF0aXZlJywgJ1ppaU8gMTAnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIEs4R1QgQSc6IFsnQ3ViZScsICdLOEdUIEEnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIEs4R1QgQic6IFsnQ3ViZScsICdLOEdUIEInLCAndGFibGV0J10sXG4gICAgICAgICdLOEdUIEMnOiBbJ0N1YmUnLCAnSzhHVCBDJywgJ3RhYmxldCddLFxuICAgICAgICAnSzhHVCBIJzogWydDdWJlJywgJ0s4R1QgSCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgSzhHVCBIJzogWydDdWJlJywgJ0s4R1QgSCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0s4R1QgVyc6IFsnQ3ViZScsICdLOEdUIFcnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIFU4R1QnOiBbJ0N1YmUnLCAnVThHVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgVTlHVCc6IFsnQ3ViZScsICdVOUdUJywgJ3RhYmxldCddLFxuICAgICAgICAnQ1VCRSBVOUdUIDInOiBbJ0N1YmUnLCAnVTlHVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQ3ViZSBVOUdUMic6IFsnQ3ViZScsICdVOUdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUJzogWydDdWJlJywgJ1U5R1QnLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUMiBGcm9tIG1vYWdlLmNvbSc6IFsnQ3ViZScsICdVOUdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdOOTAgRnJvbSBtb2FnZS5jb20nOiBbJ0N1YmUnLCAnVTlHVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnVTlHVCBTJzogWydDdWJlJywgJ1U5R1QgUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1U5R1QgUyBBJzogWydDdWJlJywgJ1U5R1QgU0EnLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUUyBBJzogWydDdWJlJywgJ1U5R1QgU0EnLCAndGFibGV0J10sXG4gICAgICAgICdVMTBHVCAyJzogWydDdWJlJywgJ1UxMEdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdVMTBHVCBTJzogWydDdWJlJywgJ1UxMEdUIFMnLCAndGFibGV0J10sXG4gICAgICAgICdVMzBHVC1IJzogWydDdWJlJywgJ1UzMEdUIEgnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIFE3UFJPJzogWydDdWJlJywgJ1E3IFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgUTdQUk8gSic6IFsnQ3ViZScsICdRNyBQcm8nLCAndGFibGV0J10sXG4gICAgICAgICdDeWRsZSBNNyAodjAwMDUuMDQuMDMuMTIua28pJzogWydDeWRsZScsICdNNyBNdWx0aVBBRCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgQWVybyc6IFsnRGVsbCcsICdBZXJvJ10sXG4gICAgICAgICdEZWxsIE0wMU0nOiBbJ0RlbGwnLCAnTWluaSA1JywgJ3RhYmxldCddLFxuICAgICAgICAnRGVsbCBTdHJlYWsnOiBbJ0RlbGwnLCAnU3RyZWFrJywgJ3RhYmxldCddLFxuICAgICAgICAnMDAxREwnOiBbJ0RlbGwnLCAnU3RyZWFrJywgJ3RhYmxldCddLFxuICAgICAgICAnMTAxREwnOiBbJ0RlbGwnLCAnU3RyZWFrIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dTMDEnOiBbJ0RlbGwnLCAnU3RyZWFrIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgU3RyZWFrIFBybyc6IFsnRGVsbCcsICdTdHJlYWsgUHJvJywgJ3RhYmxldCddLFxuICAgICAgICAnc3RyZWFrNyc6IFsnRGVsbCcsICdTdHJlYWsgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgU3RyZWFrIDcnOiBbJ0RlbGwnLCAnU3RyZWFrIDcnLCAndGFibGV0J10sXG4gICAgICAgICdEZWxsIFN0cmVhayAxMCBQcm8nOiBbJ0RlbGwnLCAnU3RyZWFrIDEwIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgVjA0Qic6IFsnRGVsbCcsICdTdHJlYWsgVjA0QicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgVmVudWUnOiBbJ0RlbGwnLCAnVmVudWUnXSxcbiAgICAgICAgJ0RlbGwgWENEMzUnOiBbJ0RlbGwnLCAnWENEMzUnXSxcbiAgICAgICAgJ1hDRDM1JzogWydEZWxsJywgJ1hDRDM1J10sXG4gICAgICAgICdpRHg3JzogWydEaWdtYScsICdpRHg3JywgJ3RhYmxldCddLFxuICAgICAgICAnaUR4MTAnOiBbJ0RpZ21hJywgJ2lEeDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnaUR4MTAgM0cnOiBbJ0RpZ21hJywgJ2lEeDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnRE0wMDlTSCc6IFsnRGlzbmV5IE1vYmlsZScsICdETTAwOVNIJ10sXG4gICAgICAgICdETTAxMFNIJzogWydEaXNuZXkgTW9iaWxlJywgJ0RNMDEwU0gnXSxcbiAgICAgICAgJ0RNMDEyU0gnOiBbJ0Rpc25leSBNb2JpbGUnLCAnRE0wMTJTSCddLFxuICAgICAgICAnRi0wOEQnOiBbJ0Rpc25leSBNb2JpbGUnLCAnRi0wOEQnXSxcbiAgICAgICAgJ1AtMDVEJzogWydEaXNuZXkgTW9iaWxlJywgJ1AtMDVEJ10sXG4gICAgICAgICdUYWJsZXQtUDI3JzogWydEcmFjb1RlaycsICdQMjcgVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnZWRnZWpyJzogWydFblRvdXJhZ2UnLCAnUG9ja2V0IGVER2UnLCAndGFibGV0J10sXG4gICAgICAgICdsOTdEJzogWydFUGFkJywgJ2w5N0QnLCAndGFibGV0J10sXG4gICAgICAgICdNNDMwMSc6IFsnRXN0b24nLCAnTUlEIE00MzAxJywgJ21lZGlhJ10sXG4gICAgICAgICdQMTBBTic6IFsnRXhwZXInLCAnRWFzeXBhZCBQMTBBTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ZJSC1GMFgnOiBbJ0ZJSCcsICdGMFgnXSxcbiAgICAgICAgJ0ZseSBJUTI2MCc6IFsnRmx5JywgJ0lRMjYwIEJsYWNrQmlyZCddLFxuICAgICAgICAnSVNXMTFGJzogWydGdWppdHN1JywgJ0Fycm93cyBaJ10sXG4gICAgICAgICdJU1cxM0YnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFonXSxcbiAgICAgICAgJ0lTMTJGJzogWydGdWppdHN1JywgJ0Fycm93cyBFUyddLFxuICAgICAgICAnRi0wMUQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFRhYiBMVEUnLCAndGFibGV0J10sXG4gICAgICAgICdGLTAzRCc6IFsnRnVqaXRzdScsICdBcnJvd3MgS2lzcyddLFxuICAgICAgICAnRi0wNUQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFggTFRFJ10sXG4gICAgICAgICdGLTA3RCc6IFsnRnVqaXRzdScsICdBcnJvd3MgXFx1MDBjM1xcdWZmZmRcXHUwMGMyXFx1MDBiYyddLFxuICAgICAgICAnRi0xMEQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFggRi0xMEQnXSxcbiAgICAgICAgJ0YtMTJDJzogWydGdWppdHN1JywgJ0dsb2JldHJvdHRlciddLFxuICAgICAgICAnZjEyYXJjJzogWydGdWppdHN1JywgJ0YxMmFyYyddLFxuICAgICAgICAnTTUzMic6IFsnRnVqaXRzdScsICdTdHlsaXN0aWMgTTUzMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dhcm1pbmZvbmUnOiBbJ0dhcm1pbi1Bc3VzJywgJ0dhcm1pbmZvbmUnXSxcbiAgICAgICAgJ0dhcm1pbi1Bc3VzIEExMCc6IFsnR2FybWluLUFzdXMnLCAnTnV2aWZvbmUgQTEwJ10sXG4gICAgICAgICdHYXJtaW4tQXN1cyBBNTAnOiBbJ0dhcm1pbi1Bc3VzJywgJ051dmlmb25lIEE1MCddLFxuICAgICAgICAnVFBBNjBXJzogWydHYXRld2F5JywgJ1RQQTYwVycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dlZWtzcGhvbmUgWkVSTyc6IFsnR2Vla3NwaG9uZScsICdaRVJPJ10sXG4gICAgICAgICdnZW1laSBHMic6IFsnR2VtZWknLCAnRzInLCAndGFibGV0J10sXG4gICAgICAgICdHZW1laSBHMic6IFsnR2VtZWknLCAnRzInLCAndGFibGV0J10sXG4gICAgICAgICdnZW1laSBHMyc6IFsnR2VtZWknLCAnRzMnLCAndGFibGV0J10sXG4gICAgICAgICdHZW1laSBHOSc6IFsnR2VtZWknLCAnRzknLCAndGFibGV0J10sXG4gICAgICAgICdHU21hcnQgRzEzMTdEJzogWydHaWdhYnl0ZScsICdHU21hcnQgRzEzMTdEJ10sXG4gICAgICAgICdHaWdhYnl0ZSBUQjEwMCc6IFsnR2lnYWJ5dGUnLCAnVEIxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdHTjEwMCc6IFsnR2lvbmVlJywgJ0dOMTAwJ10sXG4gICAgICAgICdHTjEwNSc6IFsnR2lvbmVlJywgJ0dOMTA1J10sXG4gICAgICAgICdHTjEwNic6IFsnR2lvbmVlJywgJ0dOMTA2J10sXG4gICAgICAgICdHTjIwMCc6IFsnR2lvbmVlJywgJ0dOMjAwJ10sXG4gICAgICAgICdHTjIwNSc6IFsnR2lvbmVlJywgJ0dOMjA1J10sXG4gICAgICAgICdHTjcwMFcnOiBbJ0dpb25lZScsICdHTjcwMFcnXSxcbiAgICAgICAgJ0dONzA4Vyc6IFsnR2lvbmVlJywgJ0dONzA4VyddLFxuICAgICAgICAnR29vZ2xlIElvbic6IFsnR29vZ2xlJywgJ0lvbiddLFxuICAgICAgICAnTmV4dXMgT25lJzogWydHb29nbGUnLCAnTmV4dXMgT25lJ10sXG4gICAgICAgICdOZXh1c09uZSc6IFsnR29vZ2xlJywgJ05leHVzIE9uZSddLFxuICAgICAgICAnSFRDIE5leHVzIE9uZSc6IFsnR29vZ2xlJywgJ05leHVzIE9uZSddLFxuICAgICAgICAnTmV4dXMgUyc6IFsnR29vZ2xlJywgJ05leHVzIFMnXSxcbiAgICAgICAgJ0dvb2dsZSBOZXh1cyBTJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnTmV4dXMgUyA0Ryc6IFsnR29vZ2xlJywgJ05leHVzIFMgNEcnXSxcbiAgICAgICAgJ0Rvb2RlcmJ1dHQtNC4wLjMtdjEnOiBbJ0dvb2dsZScsICdOZXh1cyBTIDRHJ10sXG4gICAgICAgICdOZXh1cyA3JzogWydHb29nbGUnLCAnTmV4dXMgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hhaWVyIEhXLVc5MTAnOiBbJ0hhaWVyJywgJ0hXLVc5MTAnXSxcbiAgICAgICAgJ1NOMTBUMSc6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkIFNOMTBUMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NOMTBUMic6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkIFNOMTBUMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hhbm5zQ29tYic6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnWDEnOiBbJ0hDTCcsICdNRSBYMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRCBTZXJhaWxzJzogWydIZXJvdGFiJywgJ0M4JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEIFNlcmlhbHMnOiBbJ0hlcm90YWInLCAnQzgnLCAndGFibGV0J10sXG4gICAgICAgICdDT1NNTyBEVU8nOiBbJ0hpc2NyZWVuJywgJ0Nvc21vIERVTycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hTLVU4JzogWydIaXNlbnNlJywgJ1U4J10sXG4gICAgICAgICdIUy1UOTInOiBbJ0hpc2Vuc2UnLCAnVDkyJ10sXG4gICAgICAgICdIUy1FODYwJzogWydIaXNlbnNlJywgJ0U4NjAnXSxcbiAgICAgICAgJ0hTLUU5MTAnOiBbJ0hpc2Vuc2UnLCAnRTkxMCddLFxuICAgICAgICAnSFMtRTkyNic6IFsnSGlzZW5zZScsICdFOTI2J10sXG5cbiAgICAgICAgJ0hTLUVHOTAwJzogWydIaXNlbnNlJywgJ0VHOTAwJ10sXG4gICAgICAgICdIUy1FVDkxOSc6IFsnSGlzZW5zZScsICdFVDkxOSddLFxuICAgICAgICAnRUc5NjhCJzogWydIaXNlbnNlJywgJ0VHOTY4QiddLFxuICAgICAgICAnSEtQSE9ORSBIOC0zRyc6IFsnSEtQaG9uZScsICdIOCAzRyddLFxuICAgICAgICAnSE9TSU4gVTInOiBbJ0hvc2luJywgJ1UyJ10sXG4gICAgICAgICdUb3VjaHBhZCc6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIUCBUb3VjaHBhZCc6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdjbSB0ZW5kZXJsb2luJzogWydIUCcsICdUb3VjaFBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ2Fva3AgdGVuZGVybG9pbic6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgQW1hemUgNEcnOiBbJ0hUQycsICdBbWF6ZSA0RyddLFxuICAgICAgICAnSFRDIFJ1YnknOiBbJ0hUQycsICdBbWF6ZSA0RyddLFxuICAgICAgICAnSFRDIEFtYXplIDRHKFJ1YnkpJzogWydIVEMnLCAnQW1hemUgNEcnXSxcbiAgICAgICAgJ0FtYXplIDRHJzogWydIVEMnLCAnQW1hemUgNEcnXSxcbiAgICAgICAgJ0hUQyBBcmlhJzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEFyaWEgQTYzODAnOiBbJ0hUQycsICdBcmlhJ10sXG4gICAgICAgICdIVEMgTGliZXJ0eSBBNjM4MCc6IFsnSFRDJywgJ0FyaWEnXSxcbiAgICAgICAgJ0hUQyBMaWJlcnR5JzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEE2MzY2JzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEJlZSc6IFsnSFRDJywgJ0JlZSddLFxuICAgICAgICAnSFRDIENoYUNoYSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIENoYUNoYSBBODEwZSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIENoYUNoYUNoYSBBODEwZSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIEE4MTBlJzogWydIVEMnLCAnQ2hhQ2hhJ10sXG4gICAgICAgICdIVEMgQTkxODgnOiBbJ0hUQycsICdUaWFueGknXSxcbiAgICAgICAgJ0hUQyBCcmF2byc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBBODE4Myc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBCZWF0cyBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBDRE1BJzogWydIVEMnLCAnRGVzaXJlJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFNNUyc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBTLk0uUyc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBDJzogWydIVEMnLCAnRGVzaXJlIEMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVIRCc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIERlc2lyZUhEIEE5MTkxJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdIVEMgRGVzaXJlSEQgQTkxOTInOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQgQTkxOTEnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBBOTE5MSc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIEE5MTkxIGZvciBBVCZUJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdIVEMgQTkxOTInOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIERlc2lyZSBTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVzUyc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlUyBTNTEwZSc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlUyBTNTEwYic6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFMgUzUxMGUnOiBbJ0hUQycsICdEZXNpcmUgUyddLFxuICAgICAgICAnSFRDIFM1MTBlJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgU2FnYSc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFYnOiBbJ0hUQycsICdEZXNpcmUgViddLFxuICAgICAgICAnSFRDIFQzMjh3JzogWydIVEMnLCAnRGVzaXJlIFYnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgVkMnOiBbJ0hUQycsICdEZXNpcmUgVkMnXSxcbiAgICAgICAgJ0hUQyBUMzI4ZCc6IFsnSFRDJywgJ0Rlc2lyZSBWQyddLFxuICAgICAgICAnSFRDIFQzMjh0JzogWydIVEMnLCAnRGVzaXJlIFZUJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFonOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZVonOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZVogQTcyNzInOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZSBaIEE3MjcyJzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0hUQyBWaXNpb24nOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIEE3Mjc1JzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0hUQyBEcmVhbSc6IFsnSFRDJywgJ0RyZWFtJ10sXG4gICAgICAgICdIVEMgUzcxMGQnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0hUQyBJbmNyZWRpYmxlIDInOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0hUQyBYNTE1ZCc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIFg1MTVtJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgWDUxNUMnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0QnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFVk8gM0QnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFVk8gM0QgR1NNJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPIDNEIFg1MTVhJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPIDNEIEdTTSBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTyAzRCBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTyAzRCBYNTE1TSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTzNEIFg1MTVhJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPM0QgWDUxNW0nOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0QgWDUxNW0nOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0Qgd2l0aCBCZWF0cyBBdWRpbyBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEV2byA0Ryc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnSFRDIEVWTyA0Ryc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnSFRDIFg1MTVFJzogWydIVEMnLCAnRVZPIDRHKyddLFxuICAgICAgICAnSFRDIEVWTyA0RysgRm9yIFNwcmludCc6IFsnSFRDJywgJ0VWTyA0RysnXSxcbiAgICAgICAgJ0hUQyBFVk8gNEcrKyBGb3IgU3ByaW50JzogWydIVEMnLCAnRVZPIDRHKyddLFxuICAgICAgICAnSFRDIEM3MTVjJzogWydIVEMnLCAnRVZPIERlc2lnbiA0RyddLFxuICAgICAgICAnSFRDIERlc2lnbiA0Ryc6IFsnSFRDJywgJ0VWTyBEZXNpZ24gNEcnXSxcbiAgICAgICAgJ0hUQyBFVk8gZGVzaWduIDRHJzogWydIVEMnLCAnRVZPIERlc2lnbiA0RyddLFxuICAgICAgICAnSFRDIEVWTyBEZXNpZ24gNEcnOiBbJ0hUQycsICdFVk8gRGVzaWduIDRHJ10sXG4gICAgICAgICdIVEMgRXZvIFNoaWZ0JzogWydIVEMnLCAnRVZPIFNoaWZ0J10sXG4gICAgICAgICdIVEMgRVZPIFNoaWZ0IDRHJzogWydIVEMnLCAnRVZPIFNoaWZ0J10sXG4gICAgICAgICdIVEMgQTMxMGUnOiBbJ0hUQycsICdFeHBsb3JlciddLFxuICAgICAgICAnSFRDIEV4cGxvcmVyJzogWydIVEMnLCAnRXhwbG9yZXInXSxcbiAgICAgICAgJ0hUQyBFeHBsb3JlciBBMzEwYic6IFsnSFRDJywgJ0V4cGxvcmVyJ10sXG4gICAgICAgICdIVEMgRXhwbG9yZXIgQTMxMGUnOiBbJ0hUQycsICdFeHBsb3JlciddLFxuICAgICAgICAnSFRDIFA1MTBlJzogWydIVEMnLCAnRmx5ZXInLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgRmx5ZXInOiBbJ0hUQycsICdGbHllcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBGbHllciBQNTEwZSc6IFsnSFRDJywgJ0ZseWVyJywgJ3RhYmxldCddLFxuICAgICAgICAnSFRDIEZseWVyIFA1MTInOiBbJ0hUQycsICdGbHllcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBGbHllciBQNTEyIE5BJzogWydIVEMnLCAnRmx5ZXInLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgUDUxNUUnOiBbJ0hUQycsICdGbHllciA0RycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBHcmF0aWEgQTYzODAnOiBbJ0hUQycsICdHcmF0aWEnXSxcbiAgICAgICAgJ0hUQyBIRCc6IFsnSFRDJywgJ0hEJ10sXG4gICAgICAgICdIVEMgSEQyJzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIVEMgSEQyIFQ4NTg1JzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIVEMgSEQyKExlbyknOiBbJ0hUQycsICdIRDInXSxcbiAgICAgICAgJ0hUQyBIRDcnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBUOTI5OSsnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBIRDcgZm9yIFNwcmludCc6IFsnSFRDJywgJ0hENyddLFxuICAgICAgICAnSFRDIEhENyA0RyBUOTI5OSBGb3IgQVQmVCc6IFsnSFRDJywgJ0hENyddLFxuICAgICAgICAnSFRDIEhENyA0RyBUOTI5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBUOTI5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBIRDdTIFQ5Mzk5Kyc6IFsnSFRDJywgJ0hEN3MnXSxcbiAgICAgICAgJ0hUQyBIRDdTIFQ5ODk5Kyc6IFsnSFRDJywgJ0hEN3MnXSxcbiAgICAgICAgJ0hUQyBUOTg5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDdzJ10sXG4gICAgICAgICdWaXRNb2QgRXh0cmFMaXRlIDEuNi41LmZ1bGxvZGV4IGZvciBIVEMgSEQ3IFBybyc6IFsnSFRDJywgJ0hENyBQcm8nXSxcbiAgICAgICAgJ0hUQyBIZXJvJzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnSFRDIEhFUk8nOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIVEMgSGVybyBDRE1BJzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnSFRDIEhFUk8gQ0RNQSc6IFsnSFRDJywgJ0hlcm8nXSxcbiAgICAgICAgJ0hUQyBIRVJPMjAwJzogWydIVEMnLCAnSGVybyAyMDAnXSxcbiAgICAgICAgJ0hUQyBIZXJvIFMnOiBbJ0hUQycsICdIZXJvIFMnXSxcbiAgICAgICAgJ0hUQyBJTUFHSU8nOiBbJ0hUQycsICdJbWFnaW8nXSxcbiAgICAgICAgJ0hUQyBJbmNyZWRpYmxlJzogWydIVEMnLCAnSW5jcmVkaWJsZSddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUzcxMEUnOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0hUQyBTNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyBTNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyBzNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGVTIFM3MTBlJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdIVEMgSW5jcmVkaWJsZSBTIHdpdGggQmVhdHMgQXVkaW8nOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0hUQyBWaXZvJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdIVEMgSW5ub3ZhdGlvbic6IFsnSFRDJywgJ0lubm92YXRpb24nXSxcbiAgICAgICAgJ0hUQyBJbnNwaXJlIDRHJzogWydIVEMnLCAnSW5zcGlyZSA0RyddLFxuICAgICAgICAnSFRDIEhENyBJbnNwaXJlIDRHIEZvciBWb2RhZm9uZSc6IFsnSFRDJywgJ0luc3BpcmUgNEcnXSxcbiAgICAgICAgJ0hUQyBQNzE1YSc6IFsnSFRDJywgJ0pldHN0cmVhbScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBMZWdlbmQnOiBbJ0hUQycsICdMZWdlbmQnXSxcbiAgICAgICAgJ0hUQyBNYWdpYyc6IFsnSFRDJywgJ01hZ2ljJ10sXG4gICAgICAgICdIVEMgU2FwcGhpcmUnOiBbJ0hUQycsICdNYWdpYyddLFxuICAgICAgICAnSFRDIExleGlrb24nOiBbJ0hUQycsICdNZXJnZSddLFxuICAgICAgICAnSFRDIE9uZSBTJzogWydIVEMnLCAnT25lIFMnXSxcbiAgICAgICAgJ0hUQyBaNTIwZSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdIVEMgT25lIFYnOiBbJ0hUQycsICdPbmUgViddLFxuICAgICAgICAnSFRDIFQzMjBlJzogWydIVEMnLCAnT25lIFYnXSxcbiAgICAgICAgJ0hUQyBPbmUgWCc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdIVEMgUzcyMGUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnSFRDIEVuZGVhdm91ci1MUyc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdIVEMgT25lIFhMJzogWydIVEMnLCAnT25lIFhMJ10sXG4gICAgICAgICdIVEMgWDcxMGEnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXInOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgWDcxMGUnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgWDcxMHMnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgNEcgWDcxMGUnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBQSDM5MTAwJzogWydIVEMnLCAnUmFpZGVyIDRHJ10sXG4gICAgICAgICdIVEMgSG9saWRheSc6IFsnSFRDJywgJ1JhaWRlciA0RyddLFxuICAgICAgICAnSFRDIFZlbG9jaXR5IDRHIFg3MTBzJzogWydIVEMnLCAnUmFpZGVyIDRHJ10sXG4gICAgICAgICdIVEMgUmV6b3VuZCc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ0hUQyBSaHltZSBTNTEwYic6IFsnSFRDJywgJ1JoeW1lJ10sXG4gICAgICAgICdIVEMgUzUxMGInOiBbJ0hUQycsICdSaHltZSddLFxuICAgICAgICAnSFRDIEJsaXNzJzogWydIVEMnLCAnUmh5bWUnXSxcbiAgICAgICAgJ0hUQyBCbGlzcyBTNTEwYic6IFsnSFRDJywgJ1JoeW1lJ10sXG4gICAgICAgICdIVEMgU2Fsc2EgQzUxMGUnOiBbJ0hUQycsICdTYWxzYSddLFxuICAgICAgICAnSFRDIEM1MTBlJzogWydIVEMnLCAnU2Fsc2EnXSxcbiAgICAgICAgJ0hUQyBaNzEwYSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFo3MTBlJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgWjcxMHQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24nOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWjcxMCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwYSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwRSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSBGb3IgQVQmVCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSB3aXRoIEJlYXRzIEF1ZGlvJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIHdpdGggQmVhdHMgQXVkaW8gWjcxMGUnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBUYXN0ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFB5cmFtaWQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBQeXJhbWlkIFo3MTBhJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgUHlyYW1pZCBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiA0Ryc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiA0RyB3aXRoIEJlYXRzIEF1ZGlvJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIEcxNCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBHMTQgZm9yIEFUJlQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBHMTQgc2Vuc2F0aW9uJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YRSBCZWF0cyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhFIEJlYXRzIFo3MTVhJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uWEUgQmVhdHMgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YRSBaNzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSBCZWF0cyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhFIHdpdGggQmVhdHMgQXVkaW8nOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVhJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIEp1cmVkcm9pZCBYRSBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIFhFIFdpdGggQmVhdHMgQXVkaW8gWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gNEcgWEUgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgWDMxNUUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEwnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YTCBCZWF0cyBYMzE1Yic6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhMIEJlYXRzIFgzMTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhMJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIFhMIHdpdGggQmVhdHMgQXVkaW8gWDMxNWInOiBbJ0hUQycsICdTZW5zYXRpb24gWEwnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEwgd2l0aCBCZWF0cyBBdWRpbyBYMzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFJ1bm55bWVkZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIEcyMSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFBIMDYxMzAnOiBbJ0hUQycsICdTdGF0dXMnXSxcbiAgICAgICAgJ0hUQyBTdGF0dXMnOiBbJ0hUQycsICdTdGF0dXMnXSxcbiAgICAgICAgJ0hUQyBUYXR0b28nOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ0hUQyBUQVRUT08gQTMyODgnOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ0hUQyBjbGljayc6IFsnSFRDJywgJ1RhdHRvbyddLFxuICAgICAgICAnSFRDIFgzMTBlJzogWydIVEMnLCAnVGl0YW4nXSxcbiAgICAgICAgJ0hUQyBUNzM3Myc6IFsnSFRDJywgJ1RvdWNoIFBybyBJSSddLFxuICAgICAgICAnSFRDIFRodW5kZXJCb2x0JzogWydIVEMnLCAnVGh1bmRlckJvbHQnXSxcbiAgICAgICAgJ0hUQyBNZWNoYSc6IFsnSFRDJywgJ1RodW5kZXJCb2x0J10sXG4gICAgICAgICdIVEMgVmVsb2NpdHkgNEcnOiBbJ0hUQycsICdWZWxvY2l0eSA0RyddLFxuICAgICAgICAnSFRDIFdpbGRmaXJlJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZSBBMzMzMyc6IFsnSFRDJywgJ1dpbGRmaXJlJ10sXG4gICAgICAgICdIVEMgQTMzNjYnOiBbJ0hUQycsICdXaWxkZmlyZSddLFxuICAgICAgICAnSFRDIEEzMzgwJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZVMnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0h0YyBXaWxkZmlyZSBzJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnSFRDIFdpbGRmaXJlIFMgQTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyBBNTEwYic6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZVMgQTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmVTIEE1MTBiJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnaHRjIHdpbGRmaXJlIHMgYTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyBBNTE1Yyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwYSc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwZSc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwYyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQ1gwNkhUJzogWydIVEMnLCAnRGVzaXJlJ10sXG4gICAgICAgICdIVEMgQTYzOTAnOiBbJ0hUQycsICdBNjM5MCddLFxuICAgICAgICAnSFRDIEE4MTgwJzogWydIVEMnLCAnQTgxODAnXSxcbiAgICAgICAgJ0hUQyBQRzc2Mic6IFsnSFRDJywgJ1BHNzYyJ10sXG4gICAgICAgICdIVEMgUzcxNWUnOiBbJ0hUQycsICdTNzE1ZSddLFxuICAgICAgICAnSFRDIFM3MjB0JzogWydIVEMnLCAnUzcyMHQnXSxcbiAgICAgICAgJ0hUQyBaNTEwZCc6IFsnSFRDJywgJ1o1MTBkJ10sXG4gICAgICAgICdIVEMgWjU2MGUnOiBbJ0hUQycsICdaNTYwZSddLFxuICAgICAgICAnSFRDIFZMRSBVJzogWydIVEMnLCAnT25lIFMnXSxcbiAgICAgICAgJ0hUQyBWTEUjVSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdIVEMgVklFIFUnOiBbJ0hUQycsICdPbmUgUyddLFxuICAgICAgICAnSFRDIEVWQSBVTCc6IFsnSFRDJywgJ09uZSBWJ10sXG4gICAgICAgICdIVEMgRU5SIFUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnRU5SIFUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnRW5kZWF2b3JVJzogWydIVEMnLCAnT25lIFgnXSxcbiAgICAgICAgJ0xpYmVydHknOiBbJ0hUQycsICdBcmlhJ10sXG4gICAgICAgICdEZXNpcmUnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJ0Rlc2lyZSBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnZGVzaXJlIGhkJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdEZXNpcmUgSEQnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0RlZGlyZSBIRCc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnRGVzaXJlIEhkIChhY2UpJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdEZXNpcmUgUyc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdEZXNpcmVTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0Rlc2lyZSBTYWdhJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0Rlc2lyZSBaJzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0RyZWFtJzogWydIVEMnLCAnRHJlYW0nXSxcbiAgICAgICAgJ0Ryb2lkIEluY3JlZGlibGUnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdFVk8nOiBbJ0hUQycsICdFVk8nXSxcbiAgICAgICAgJ0V2byBIRDInOiBbJ0hUQycsICdFVk8gSEQnXSxcbiAgICAgICAgJ0V2byAzRCBCZWF0cyBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRXZvIDNEIEdTTSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRVZPIDNEIFg1MTVtJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdFVk8zRCBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRXZvIDRHJzogWydIVEMnLCAnRVZPIDRHJ10sXG4gICAgICAgICdFVk8gNEcnOiBbJ0hUQycsICdFVk8gNEcnXSxcbiAgICAgICAgJ3Bob3Rvbic6IFsnSFRDJywgJ0hEIG1pbmknXSxcbiAgICAgICAgJ0dpbkRyZWFtXFwvR2luTWFnaWMnOiBbJ0hUQycsICdEcmVhbSddLFxuICAgICAgICAnSEQyJzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIRDcgIFBybyc6IFsnSFRDJywgJ0hENyBQcm8nXSxcbiAgICAgICAgJ0hlcm8nOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIRVJPIENETUEnOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIRVJPMjAwJzogWydIVEMnLCAnSGVybyAyMDAnXSxcbiAgICAgICAgJ0luY3JlZGlibGUnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdJbmNyZWRpYmxlIDInOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0luY3JlZGlibGUgUyc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSW5jcmVkaWJsZVMgUzcxMGUnOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0luY3JlZGlibGVTJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdJbnNwaXJlIEhEJzogWydIVEMnLCAnSW5zcGlyZSA0RyddLFxuICAgICAgICAnSW5zcGlyZSA0Ryc6IFsnSFRDJywgJ0luc3BpcmUgNEcnXSxcbiAgICAgICAgJ0xlZ2VuZCc6IFsnSFRDJywgJ0xlZ2VuZCddLFxuICAgICAgICAnTmV4dXNIRDInOiBbJ0hUQycsICdIRDInXSxcbiAgICAgICAgJ05leHVzIEhEMic6IFsnSFRDJywgJ0hEMiddLFxuICAgICAgICAnRG9jb21vIEhULTAzQSc6IFsnSFRDJywgJ01hZ2ljJ10sXG4gICAgICAgICdNSVVJLnVzIFNlbnNhdGlvbiA0Ryc6IFsnSFRDJywgJ1NlbnNhdGlvbiA0RyddLFxuICAgICAgICAnU2lSRiBEcmVhbSc6IFsnSFRDJywgJ0RyZWFtJ10sXG4gICAgICAgICdQeXJhbWlkJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdTZW5zYXRpb24nOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1NlbnNhdGlvbiBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnU2Vuc2F0aW9uIDRHJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdTZW5zYXRpb24gNGcnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1RyaXBOaUNFIFB5cmFtaWQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1NlbnNhdGlvblhFIEJlYXRzIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdTZW5zYXRpb25YTCBCZWF0cyBYMzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnQ2xpY2snOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ1dpbGRmaXJlJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ1dpbGRmaXJlIFMnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdXaWxkZmlyZSBTIEE1MTBlJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnU3ByaW50IEFQWDUxNUNLVCc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnU3ByaW50IEFQQTkyOTJLVCc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnU3ByaW50IEFQQTczNzNLVCc6IFsnSFRDJywgJ0VWTyBTaGlmdCA0RyddLFxuICAgICAgICAnU3ByaW50IEFQQzcxNUNLVCc6IFsnSFRDJywgJ0VWTyBEZXNpZ24gNEcnXSxcbiAgICAgICAgJ0EzMzgwJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0E2Mjc3JzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnYTcyNzInOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnQTcyNzIrKEhUQyBEZXNpcmVaKSc6IFsnSFRDJywgJ0Rlc2lyZSBaJ10sXG4gICAgICAgICdTMzFIVCc6IFsnSFRDJywgJ0FyaWEnXSxcbiAgICAgICAgJ1M3MTBkJzogWydIVEMnLCAnRHJvaWQgSW5jcmVkaWJsZSAyJ10sXG4gICAgICAgICdTNzEwRCc6IFsnSFRDJywgJ0Ryb2lkIEluY3JlZGlibGUgMiddLFxuICAgICAgICAnWDA2SFQnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJzAwMUhUJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdYMzI1YSc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdaNTIwbSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdaNzEwJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnVDkxOTloJzogWydIVEMnLCAnVDkxOTloJ10sXG4gICAgICAgICdIVEMgUzYxMGQnOiBbJ0hUQycsICdTNjEwZCddLFxuICAgICAgICAnQURSNjIwMCc6IFsnSFRDJywgJ0Ryb2lkIEVyaXMnXSxcbiAgICAgICAgJ0FEUjYzMDAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdBRFI2MzI1VlcnOiBbJ0hUQycsICdNZXJnZSddLFxuICAgICAgICAnQURSNjMzMFZXJzogWydIVEMnLCAnUmh5bWUnXSxcbiAgICAgICAgJ0FEUjYzNTAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0FEUjY0MDBMJzogWydIVEMnLCAnVGh1bmRlcmJvbHQgNEcnXSxcbiAgICAgICAgJ0FEUjY0MDBMIDRHJzogWydIVEMnLCAnVGh1bmRlcmJvbHQgNEcnXSxcbiAgICAgICAgJ0FEUjY0MTBMVlcgNEcnOiBbJ0hUQycsICdGaXJlYmFsbCddLFxuICAgICAgICAnQURSNjQyNUxWVyc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ0FEUjY0MjVMVlcgNEcnOiBbJ0hUQycsICdSZXpvdW5kJ10sXG4gICAgICAgICdDb3F1ZXR0aXNoIFJlZCc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ1BCOTk0MDAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdwY2RhZHI2MzUwJzogWydIVEMnLCAnRHJvaWQgSW5jcmVkaWJsZSAyJ10sXG4gICAgICAgICdQQzM2MTAwJzogWydIVEMnLCAnRVZPIDRHJ10sXG4gICAgICAgICdQRzA2MTAwJzogWydIVEMnLCAnRVZPIFNoaWZ0IDRHJ10sXG4gICAgICAgICdQRzQxMjAwJzogWydIVEMnLCAnRVZPIFZpZXcgNEcnLCAndGFibGV0J10sXG4gICAgICAgICdQRzg2MTAwJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdQRzg2MTAwMDAnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ1BINDQxMDAnOiBbJ0hUQycsICdFVk8gRGVzaWduIDRHJ10sXG4gICAgICAgICdQSjgzMTAwJzogWydIVEMnLCAnT25lIFgnXSxcbiAgICAgICAgJ0lTVzExSFQnOiBbJ0hUQycsICdFVk8gNEcnXSxcbiAgICAgICAgJ0lTVzEySFQnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0lTVzEzSFQnOiBbJ0hUQycsICdKJ10sXG4gICAgICAgICdVU0NDQURSNjI3NVVTIENhcnJpZXIgSUQgNDUnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJ1VTQ0NBRFI2Mjg1VVMnOiBbJ0hUQycsICdIZXJvIFMnXSxcbiAgICAgICAgJ1VTQ0NBRFI2MzI1VVMgQ2FycmllciBJRCA0NSc6IFsnSFRDJywgJ01lcmdlJ10sXG4gICAgICAgICdNZWRpYVBhZCc6IFsnSHVhd2VpJywgJ01lZGlhUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnSHVhd2VpIE1lZGlhUGFkJzogWydIdWF3ZWknLCAnTWVkaWFQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIVUFXRUkgTWVkaWFQYWQnOiBbJ0h1YXdlaScsICdNZWRpYVBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBTNy0zMTJ1JzogWydIdWF3ZWknLCAnTWVkaWFQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdNZWRpYVBhZCAxMCBGSEQnOiBbJ0h1YXdlaScsICdNZWRpYVBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBDODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg1MDBTJzogWydIdWF3ZWknLCAnQzg1MDAnXSxcbiAgICAgICAgJ0h1YXdlaSBDODYwMCc6IFsnSHVhd2VpJywgJ0M4NjAwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnSHVhd2VpIEM4NjUwKyc6IFsnSHVhd2VpJywgJ0M4NjUwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIEM4ODEwJzogWydIdWF3ZWknLCAnQXNjZW5kIEczMDAnXSxcbiAgICAgICAgJ0h1YXdlaSBDODgxMic6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgxMiddLFxuICAgICAgICAnSHVhd2VpIEM4ODEyRSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgxMiddLFxuICAgICAgICAnSHVhd2VpIEM4ODI1RCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgyNUQnXSxcbiAgICAgICAgJ0h1YXdlaSBDODg2MEUnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnSHVhd2VpIE04MzUnOiBbJ0h1YXdlaScsICdNODM1J10sXG4gICAgICAgICdIdWF3ZWkgTTg2MCc6IFsnSHVhd2VpJywgJ0FzY2VuZCddLFxuICAgICAgICAnSHVhd2VpIE05MjEnOiBbJ0h1YXdlaScsICdNOTIxJ10sXG4gICAgICAgICdIdWF3ZWkgUzg1MjAnOiBbJ0h1YXdlaScsICdTODUyMCddLFxuICAgICAgICAnSHVhd2VpIFM4NjAwJzogWydIdWF3ZWknLCAnUzg2MDAnXSxcbiAgICAgICAgJ0h1YXdlaSBUODMwMCc6IFsnSHVhd2VpJywgJ1Q4MzAwJ10sXG4gICAgICAgICdIdWF3ZWkgVDg2MDAnOiBbJ0h1YXdlaScsICdUODYwMCddLFxuICAgICAgICAnSHVhd2VpIFQ4ODMwJzogWydIdWF3ZWknLCAnVDg4MzAnXSxcbiAgICAgICAgJ1Q4ODMwJzogWydIdWF3ZWknLCAnVDg4MzAnXSxcbiAgICAgICAgJ1Q4NjIwJzogWydIdWF3ZWknLCAnVDg2MjAnXSxcbiAgICAgICAgJ0h1YXdlaSBUODgyOCc6IFsnSHVhd2VpJywgJ1Q4ODI4J10sXG4gICAgICAgICdIdWF3ZWkgVTgyMjAnOiBbJ0h1YXdlaScsICdVODIyMCddLFxuICAgICAgICAnSHVhd2VpIHU4NTAwJzogWydIdWF3ZWknLCAnSURFT1MgWDInXSxcbiAgICAgICAgJ0h1YXdlaSBVODgxNSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBHMzAwJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4MjVEJzogWydIdWF3ZWknLCAnQXNjZW5kIEczMzBEJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4NTAnOiBbJ0h1YXdlaScsICdWaXNpb24nXSxcbiAgICAgICAgJ0h1YXdlaSBVODY1Mic6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4MDAtNTEnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIFU4ODE4JzogWydIdWF3ZWknLCAnQXNjZW5kIEczMDAnXSxcbiAgICAgICAgJ0h1YXdlaSBVOTAwMCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBYJ10sXG4gICAgICAgICdIdWF3ZWkgSURFT1MgVTg1MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYMiddLFxuICAgICAgICAnSHVhd2VpIElERU9TIFU4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ0h1YXdlaSBJREVPUyBYMyc6IFsnSHVhd2VpJywgJ0lERU9TIFgzJ10sXG4gICAgICAgICdIdWF3ZWkgSWRlb3MgWDUnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIElkZW9zIFg1IDEuMTIuOShyZXQ0cnQpJzogWydIdWF3ZWknLCAnSURFT1MgWDUnXSxcbiAgICAgICAgJ0h1YXdlaSBTT05JQyc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdIdWF3ZWkgODEwMC05JzogWydIdWF3ZWknLCAnVTgxMDAnXSxcbiAgICAgICAgJ0ZVU0lPTmlkZW9zJzogWydIdWF3ZWknLCAnSURFT1MnXSxcbiAgICAgICAgJ0duYXBwbyBJZGVvcyc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdJZGVvcyc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdJREVPUyBYNSc6IFsnSHVhd2VpJywgJ0lERU9TIFg1J10sXG4gICAgICAgICdJZGVvcyBTNyc6IFsnSHVhd2VpJywgJ0lERU9TIFM3JywgJ3RhYmxldCddLFxuICAgICAgICAnSURFT1MgUzcnOiBbJ0h1YXdlaScsICdJREVPUyBTNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lERU9TIFM3IFNsaW0nOiBbJ0h1YXdlaScsICdJREVPUyBTNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBTNyc6IFsnSHVhd2VpJywgJ0lERU9TIFM3JywgJ3RhYmxldCddLFxuICAgICAgICAnU09OSUMnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnS3lpdnN0YXIgQXF1YSc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdMdWNreSBVbHRyYSBTb25pYyBVODY1MCc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdUdXJrY2VsbCBUMjAnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnTVRDIDk1MCc6IFsnSHVhd2VpJywgJ1U4MTYwJ10sXG4gICAgICAgICdNVEMgOTU1JzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ01UQyBFdm8nOiBbJ0h1YXdlaScsICdDODUwMCddLFxuICAgICAgICAnTVRDIEFuZHJvaWQnOiBbJ0h1YXdlaScsICdVODExMCddLFxuICAgICAgICAnUzMxSFcnOiBbJ0h1YXdlaScsICdQb2NrZXQgV2lGaSBTJ10sXG4gICAgICAgICdTNDFIVyc6IFsnSHVhd2VpJywgJ1BvY2tldCBXaUZpIFMgSUknXSxcbiAgICAgICAgJzAwN0hXJzogWydIdWF3ZWknLCAnVmlzaW9uJ10sXG4gICAgICAgICdVTTg0MCc6IFsnSHVhd2VpJywgJ0V2b2x1dGlvbiddLFxuICAgICAgICAnTTg2MCc6IFsnSHVhd2VpJywgJ0FzY2VuZCddLFxuICAgICAgICAnTTg2NSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBJSSddLFxuICAgICAgICAnTTg4Nic6IFsnSHVhd2VpJywgJ0dsb3J5J10sXG4gICAgICAgICdDODE1MCc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdjODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdDODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdDODUwMFMnOiBbJ0h1YXdlaScsICdDODUwMCddLFxuICAgICAgICAnQzg2MDAnOiBbJ0h1YXdlaScsICdDODYwMCddLFxuICAgICAgICAnYzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnQzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnYzg4MDAnOiBbJ0h1YXdlaScsICdDODgwMCddLFxuICAgICAgICAnQzg4MDAnOiBbJ0h1YXdlaScsICdDODgwMCddLFxuICAgICAgICAnYzg4MTAnOiBbJ0h1YXdlaScsICdBc2NlbmQgRzMwMEMnXSxcbiAgICAgICAgJ0M4ODEyJzogWydIdWF3ZWknLCAnQXNjZW5kIEM4ODEyJ10sXG4gICAgICAgICdTODYwMCc6IFsnSHVhd2VpJywgJ1M4NjAwJ10sXG4gICAgICAgICdVODEwMCc6IFsnSHVhd2VpJywgJ1U4MTAwJ10sXG4gICAgICAgICdVODExMCc6IFsnSHVhd2VpJywgJ1U4MTEwJ10sXG4gICAgICAgICd1ODEyMCc6IFsnSHVhd2VpJywgJ1U4MTIwJ10sXG4gICAgICAgICdVODEyMCc6IFsnSHVhd2VpJywgJ1U4MTIwJ10sXG4gICAgICAgICdVODE4MCc6IFsnSHVhd2VpJywgJ0lERU9TIFgxJ10sXG4gICAgICAgICdVODIyMCc6IFsnSHVhd2VpJywgJ1B1bHNlJ10sXG4gICAgICAgICdVODMwMCc6IFsnSHVhd2VpJywgJ1U4MzAwJ10sXG4gICAgICAgICdVODM1MCc6IFsnSHVhd2VpJywgJ0JvdWxkZXInXSxcbiAgICAgICAgJ1U4MTUwJzogWydIdWF3ZWknLCAnSURFT1MnXSxcbiAgICAgICAgJ1U4MTYwJzogWydIdWF3ZWknLCAnVTgxNjAnXSxcbiAgICAgICAgJ1U4NTAwJzogWydIdWF3ZWknLCAnSURFT1MgWDInXSxcbiAgICAgICAgJ1U4NTAwIEhpUVEnOiBbJ0h1YXdlaScsICdVODUwMCBIaVFRIEVkaXRpb24nXSxcbiAgICAgICAgJ1U4NTEwJzogWydIdWF3ZWknLCAnSURFT1MgWDMnXSxcbiAgICAgICAgJ3U4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ1U4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ1U4NjUwLTEnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnVTg2NjAnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAndTg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnVTg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnVTg4MDArJzogWydIdWF3ZWknLCAnSURFT1MgWDUnXSxcbiAgICAgICAgJ1U4ODAwWCc6IFsnSHVhd2VpJywgJ0lERU9TIFg1J10sXG4gICAgICAgICdVODgwMHBybyc6IFsnSHVhd2VpJywgJ0lERU9TIFg1IFBybyddLFxuICAgICAgICAnVTg4MDBQUk8nOiBbJ0h1YXdlaScsICdJREVPUyBYNSBQcm8nXSxcbiAgICAgICAgJ1U4ODAwUHJvJzogWydIdWF3ZWknLCAnSURFT1MgWDUgUHJvJ10sXG4gICAgICAgICd1ODgwMHBybyc6IFsnSHVhd2VpJywgJ0lERU9TIFg1IFBybyddLFxuICAgICAgICAnVTg4MDAgUHJvJzogWydIdWF3ZWknLCAnSURFT1MgWDUgUHJvJ10sXG4gICAgICAgICdVODgxOCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBHMzAwJ10sXG4gICAgICAgICdVODg1MCc6IFsnSHVhd2VpJywgJ1Zpc2lvbiddLFxuICAgICAgICAndTg4NjAnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnVTg4NjAnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnVTkwMDAnOiBbJ0h1YXdlaScsICdBc2NlbmQgWCddLFxuICAgICAgICAnVTkyMDAnOiBbJ0h1YXdlaScsICdBc2NlbmQgUDEnXSxcbiAgICAgICAgJ1U5MjAwLTEnOiBbJ0h1YXdlaScsICdBc2NlbmQgUDEnXSxcbiAgICAgICAgJ1U5NTAwJzogWydIdWF3ZWknLCAnQXNjZW5kIEQxJ10sXG4gICAgICAgICdVOTUwMUwnOiBbJ0h1YXdlaScsICdBc2NlbmQgRCBMVEUnXSxcbiAgICAgICAgJ1U5NTEwJzogWydIdWF3ZWknLCAnQXNjZW5kIEQgcXVhZCddLFxuICAgICAgICAnVTk1MTBFJzogWydIdWF3ZWknLCAnQXNjZW5kIEQgcXVhZCddLFxuICAgICAgICAnQ29tZXQnOiBbJ0h1YXdlaScsICdDb21ldCddLFxuICAgICAgICAnR1MwMic6IFsnSHVhd2VpJywgJ0hvbm9yJ10sXG4gICAgICAgICdHUzAzJzogWydIdWF3ZWknLCAnQXNjZW5kIFAxJ10sXG4gICAgICAgICdEcm9uaVgtMC41JzogWydIdWF3ZWknLCAnVTgxODAnXSxcbiAgICAgICAgJ01UUy1TUDEwMSc6IFsnSHVhd2VpJywgJ0M4NTExJ10sXG4gICAgICAgICdUU1AyMSc6IFsnSHVhd2VpJywgJ1U4MTEwJ10sXG4gICAgICAgICdIWVVOREFJIEg2JzogWydIeXVuZGFpJywgJ1N0b3JtIEg2J10sXG4gICAgICAgICdpQmFsbCBTbGlkZSBpNzAxMSc6IFsnaUJhbGwnLCAnU2xpZGUgaTcwMTEnXSxcbiAgICAgICAgJ05ldFRBQiBSVU5FJzogWydJY29uQml0JywgJ05ldFRhYiBSdW5lJywgJ3RhYmxldCddLFxuICAgICAgICAnRDcwVyc6IFsnSWNvbycsICdENzBXJywgJ3RhYmxldCddLFxuICAgICAgICAnRDgwJzogWydJY29vJywgJ0Q4MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lORk9CQVIgQTAxJzogWydpaWRhJywgJ0lORk9CQVIgQTAxJ10sXG4gICAgICAgICdNMDA5Ric6IFsnSW5mb3RtaWMnLCAnTTAwOUYnXSxcbiAgICAgICAgJ0FaMjEwQSc6IFsnSW50ZWwnLCAnQVoyMTBBJ10sXG4gICAgICAgICdBWjIxMEInOiBbJ0ludGVsJywgJ0FaMjEwQiddLFxuICAgICAgICAnQVo1MTAnOiBbJ0ludGVsJywgJ0FaNTEwJ10sXG4gICAgICAgICdncmVlbnJpZGdlJzogWydJbnRlbCcsICdHcmVlbiBSaWRnZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lOUSBDbG91ZCBUb3VjaCc6IFsnSU5RJywgJ0Nsb3VkIFRvdWNoJ10sXG4gICAgICAgICdJTFQtTVgxMDAnOiBbJ2lSaXZlcicsICdUYWInLCAndGFibGV0J10sXG4gICAgICAgICdJVklPX0RFMzgnOiBbJ0l2aW8nLCAnREUzOCddLFxuICAgICAgICAnSlktRzInOiBbJ0ppYXl1JywgJ0cyJ10sXG4gICAgICAgICdKWEQgUzYwMVdJRkknOiBbJ0pYRCcsICdTNjAxIFdJRkknLCAnbWVkaWEnXSxcbiAgICAgICAgJ0EyJzogWydLYWthVGVjaCcsICdBMiddLFxuICAgICAgICAnRDkxJzogWydLSycsICdEOTEnLCAndGFibGV0J10sXG4gICAgICAgICdLMDgwJzogWydLb2JvJywgJ0swODAnLCAnZXJlYWRlciddLFxuICAgICAgICAnQTEwNic6IFsna29vYmVlJywgJ0ExNjAnXSxcbiAgICAgICAgJ0tQVCBBOSc6IFsnS1BUJywgJ0E5J10sXG4gICAgICAgICdFVi1TMTAwJzogWydLdHRlY2gnLCAnVGFrZSBFVi1TMTAwJ10sXG4gICAgICAgICdLTS1TMTIwJzogWydLdHRlY2gnLCAnVGFrZSAyIEtNLVMxMjAnXSxcbiAgICAgICAgJ0tNLVMyMDAnOiBbJ1RBS0UnLCAnSmFudXMgS00tUzIwMCddLFxuICAgICAgICAnS00tUzIyMCc6IFsnS3R0ZWNoJywgJ1Rha2UgVGFjaHkgS00tUzIyMCddLFxuICAgICAgICAnS3lvYm8gbWlyYXNvbCBlUmVhZGVyJzogWydLeW9ibycsICdlUmVhZGVyJywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ0lTVzExSyc6IFsnS3lvY2VyYScsICdEaWdubyddLFxuICAgICAgICAnSkMtS1NQODAwMCc6IFsnS3lvY2VyYScsICdFY2hvJ10sXG4gICAgICAgICdLU1A4MDAwJzogWydLeW9jZXJhJywgJ0VjaG8nXSxcbiAgICAgICAgJ1ppbyc6IFsnS3lvY2VyYScsICdaaW8nXSxcbiAgICAgICAgJ0M1MTU1JzogWydLeW9jZXJhJywgJ0M1MTU1J10sXG4gICAgICAgICdDNTE3MCc6IFsnS3lvY2VyYScsICdDNTE3MCddLFxuICAgICAgICAnTTkzMDAnOiBbJ0t5b2NlcmEnLCAnTTkzMDAnXSxcbiAgICAgICAgJ0U4MDAnOiBbJ0stVG91Y2gnLCAnRTgwMCddLFxuICAgICAgICAnVzYwNic6IFsnSy1Ub3VjaCcsICdXNjA2J10sXG4gICAgICAgICdLLVRvdWNoIFQ2MTknOiBbJ0stVG91Y2gnLCAnVDYxOSddLFxuICAgICAgICAnSy1Ub3VjaCBXNjE5JzogWydLLVRvdWNoJywgJ1c2MTknXSxcbiAgICAgICAgJ0stVG91Y2ggVzY1MCc6IFsnSy1Ub3VjaCcsICdXNjUwJ10sXG4gICAgICAgICdXNzAwJzogWydLLVRvdWNoJywgJ1c3MDAnXSxcbiAgICAgICAgJ1c4MDAnOiBbJ0stVG91Y2gnLCAnVzgwMCddLFxuICAgICAgICAnVzgwNic6IFsnSy1Ub3VjaCcsICdXODA2J10sXG4gICAgICAgICdXODA4JzogWydLLVRvdWNoJywgJ1c4MDgnXSxcbiAgICAgICAgJ1c4MTAnOiBbJ0stVG91Y2gnLCAnVzgxMCddLFxuICAgICAgICAnWDkwMCc6IFsnTGF2YScsICdYT0xPIFg5MDAnXSxcbiAgICAgICAgJ0xlbm92byBBNzk4dCc6IFsnTGVub3ZvJywgJ0E3OTh0J10sXG4gICAgICAgICdMRU5PVk8tTGVub3ZvLUEyODh0JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMjg4J10sXG4gICAgICAgICdUaGlua1BhZCBUYWJsZXQnOiBbJ0xlbm92bycsICdUaGlua1BhZCBUYWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdLMSc6IFsnTGVub3ZvJywgJ0lkZWFQYWQgSzEnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhcGFkIFMxMC0zVCc6IFsnTGVub3ZvJywgJ0lkZWFQYWQgUzEwLTNUJywgJ3RhYmxldCddLFxuICAgICAgICAnUzIwMDVBLUgnOiBbJ0xlbm92bycsICdTMjAwNUEnXSxcbiAgICAgICAgJ0lkZWFUYWIgUzIwMDdBLUQnOiBbJ0xlbm92bycsICdJZGVhVGFiIFMyMDA3QScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lkZWFUYWJWMjAwN0EnOiBbJ0xlbm92bycsICdJZGVhVGFiIFYyMDA3QScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lkZWFUYWJWMjAwN0EtRC1JJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjAwN0EnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhVGFiVjIwMTBBJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjAxMEEnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhVGFiIEEyMTA3QS1IJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjEwN0EnLCAndGFibGV0J10sXG4gICAgICAgICdBMSAwNyc6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnbGVwYWQgMDAxYic6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnbGVwYWQgMDAxbic6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnM0dDMTAxJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR0MxMDEnXSxcbiAgICAgICAgJ0xlbm92byAzR0MxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHQzEwMSddLFxuICAgICAgICAnM0dXMTAwJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR1cxMDAnXSxcbiAgICAgICAgJ0xlbm92byAzR1cxMDAnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMCddLFxuICAgICAgICAnM0dXMTAxJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR1cxMDEnXSxcbiAgICAgICAgJ0xlbm92byAzR1cxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMSddLFxuICAgICAgICAnTGVwaG9uZSAzR1cxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMSddLFxuICAgICAgICAnTGVub3ZvIEExLTMyQUIwJzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMS0zMkFCMCddLFxuICAgICAgICAnTGVub3ZvIFMxLTM3QUgwJzogWydMZW5vdm8nLCAnTGVQaG9uZSBTMS0zN0FIMCddLFxuICAgICAgICAnUzEgMzdBSE8nOiBbJ0xlbm92bycsICdMZVBob25lIFMxLTM3QUgwJ10sXG4gICAgICAgICdMZW5vdm8gUzItMzhBSDAnOiBbJ0xlbm92bycsICdMZVBob25lIFMyLTM4QUgwJ10sXG4gICAgICAgICdMZW5vdm8gUzItMzhBVDAnOiBbJ0xlbm92bycsICdMZVBob25lIFMyLTM4QVQwJ10sXG4gICAgICAgICdMZW5vdm8gQTI4OHQnOiBbJ0xlbm92bycsICdMZVBob25lIEEyODgnXSxcbiAgICAgICAgJ0xlbm92byBBMzY2dCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTM2NiddLFxuICAgICAgICAnTGVub3ZvIEEzOTBlJzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMzkwJ10sXG4gICAgICAgICdMZW5vdm8gQTUwMCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTUwMCddLFxuICAgICAgICAnTGVub3ZvIEE1MjAnOiBbJ0xlbm92bycsICdMZVBob25lIEE1MjAnXSxcbiAgICAgICAgJ0xlbm92byBBNTYwZSc6IFsnTGVub3ZvJywgJ0E1NjAnXSxcbiAgICAgICAgJ0xlbm92byBBNjY4dCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTY2OCddLFxuICAgICAgICAnTGVub3ZvIEE2OTh0JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBNjk4J10sXG4gICAgICAgICdMZW5vdm8gQTc1MCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTc1MCddLFxuICAgICAgICAnTGVub3ZvIEE3ODAnOiBbJ0xlbm92bycsICdMZVBob25lIEE3ODAnXSxcbiAgICAgICAgJ0xlbm92byBBNzg5JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBNzg5J10sXG4gICAgICAgICdMZW5vdm8gQTc5MGUnOiBbJ0xlbm92bycsICdMZVBob25lIEE3OTAnXSxcbiAgICAgICAgJ0xlbm92byBQNzAnOiBbJ0xlbm92bycsICdMZVBob25lIFA3MCddLFxuICAgICAgICAnTGVub3ZvIFA3MDAnOiBbJ0xlbm92bycsICdMZVBob25lIFA3MDAnXSxcbiAgICAgICAgJ0xlbm92byBTODUwZSc6IFsnTGVub3ZvJywgJ1M4NTAnXSxcbiAgICAgICAgJ0xlbm92byBTODgwJzogWydMZW5vdm8nLCAnUzg4MCddLFxuICAgICAgICAnTGVub3ZvIEs4NjAnOiBbJ0xlbm92bycsICdLODYwJ10sXG4gICAgICAgICdBMzB0JzogWydMZW5vdm8nLCAnQTMwdCddLFxuICAgICAgICAnTGVub3ZvIEE2MCc6IFsnTGVub3ZvJywgJ0E2MCddLFxuICAgICAgICAnTGVub3ZvIEE2NSc6IFsnTGVub3ZvJywgJ0E2NSddLFxuICAgICAgICAnTGVub3ZvIEE2NnQnOiBbJ0xlbm92bycsICdBNjZ0J10sXG4gICAgICAgICdMZW5vdm8gQTY4ZSc6IFsnTGVub3ZvJywgJ0E2OGUnXSxcbiAgICAgICAgJ0xlbm92byBLODAwJzogWydMZW5vdm8nLCAnSzgwMCddLFxuICAgICAgICAnSURFQSBUViBUMTAwJzogWydMZW5vdm8nLCAnSURFQSBUVicsICd0ZWxldmlzaW9uJ10sXG4gICAgICAgICdJREVBIFRWIEs5MSc6IFsnTGVub3ZvJywgJ0lERUEgVFYnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVEM5NzAnOiBbJ0xlIFBhbicsICdUQzk3MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xlUGFuSUknOiBbJ0xlIFBhbicsICdJSScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xHLUM1NTUnOiBbJ0xHJywgJ09wdGltdXMgQ2hhdCddLFxuICAgICAgICAnTEctQzU1NS1wYXJyb3QnOiBbJ0xHJywgJ09wdGltdXMgQ2hhdCddLFxuICAgICAgICAnTEctQzY2MGgnOiBbJ0xHJywgJ09wdGltdXMgUHJvJ10sXG4gICAgICAgICdMRy1DNzI5JzogWydMRycsICdEb3VibGVQbGF5J10sXG4gICAgICAgICdMRy1DODAwRyc6IFsnTEcnLCAnRWNseXBzZSddLFxuICAgICAgICAnTEctQ1g2NzAnOiBbJ0xHJywgJ09wdGltdXMgM0cnXSxcbiAgICAgICAgJ0xHLUU0MDAnOiBbJ0xHJywgJ09wdGltdXMgTDMnXSxcbiAgICAgICAgJ0xHLUU0MDBmJzogWydMRycsICdPcHRpbXVzIEwzJ10sXG4gICAgICAgICdMRy1FNTEwJzogWydMRycsICdPcHRpbXVzIEh1YiddLFxuICAgICAgICAnTEctRTUxMGYnOiBbJ0xHJywgJ09wdGltdXMgSHViJ10sXG4gICAgICAgICdMRy1FNTEwZyc6IFsnTEcnLCAnT3B0aW11cyBIdWInXSxcbiAgICAgICAgJ0xHLUU2MTAnOiBbJ0xHJywgJ09wdGltdXMgTDUnXSxcbiAgICAgICAgJ0xHLUU2MTInOiBbJ0xHJywgJ09wdGltdXMgTDUnXSxcbiAgICAgICAgJ0xHLUU2MTJnJzogWydMRycsICdPcHRpbXVzIEw1J10sXG4gICAgICAgICdMRy1FNjE1Ric6IFsnTEcnLCAnRTYxNSddLFxuICAgICAgICAnTEctRTYxN0cnOiBbJ0xHJywgJ0U2MTcnXSxcbiAgICAgICAgJ0xHLUU3MjAnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctRTcyMGInOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctRTczMCc6IFsnTEcnLCAnT3B0aW11cyBTb2wnXSxcbiAgICAgICAgJ0xHLUU5NzAnOiBbJ0xHJywgJ1NoaW5lJ10sXG4gICAgICAgICdMRy1GMTAwTCc6IFsnTEcnLCAnT3B0aW11cyBWdSddLFxuICAgICAgICAnTEctRjEwMFMnOiBbJ0xHJywgJ09wdGltdXMgVnUnXSxcbiAgICAgICAgJ0xHLUYxMjBLJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxMjBMJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxMjBTJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxNjBLJzogWydMRycsICdPcHRpbXVzIExURSBJSSddLFxuICAgICAgICAnTEctRjE2MEwnOiBbJ0xHJywgJ09wdGltdXMgTFRFIElJJ10sXG4gICAgICAgICdMRy1GMTYwUyc6IFsnTEcnLCAnT3B0aW11cyBMVEUgSUknXSxcbiAgICAgICAgJ0xHLUYxODBMJzogWydMRycsICdGMTgwTCddLFxuICAgICAgICAnTEctR1Q1NDAnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLUdUNTQwZic6IFsnTEcnLCAnT3B0aW11cyddLFxuICAgICAgICAnTEctR1Q1NDAgU3dpZnQnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLUdXNjIwJzogWydMRycsICdHVzYyMCddLFxuICAgICAgICAnTEctS0g1MjAwJzogWydMRycsICdBbmRyby0xJ10sXG4gICAgICAgICdMRy1LVTM3MDAnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1LVTU0MDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctS1U1OTAwJzogWydMRycsICdPcHRpbXVzIEJsYWNrJ10sXG4gICAgICAgICdMRy1MNDBHJzogWydMRycsICdMNDBHJ10sXG4gICAgICAgICdMRy1MRzg1NSc6IFsnTEcnLCAnTWFycXVlZSddLFxuICAgICAgICAnTEctTFM2NzAnOiBbJ0xHJywgJ09wdGltdXMgUyddLFxuICAgICAgICAnTEctTFM2OTYnOiBbJ0xHJywgJ09wdGltdXMgRWxpdGUnXSxcbiAgICAgICAgJ0xHLUxTODQwJzogWydMRycsICdWaXBlciA0RyddLFxuICAgICAgICAnTEctTFM4NTUnOiBbJ0xHJywgJ01hcnF1ZWUnXSxcbiAgICAgICAgJ0xHLUxTODYwJzogWydMRycsICdcXCdDYXllbm5lXFwnJ10sXG4gICAgICAgICdMRy1MUzk3MCc6IFsnTEcnLCAnXFwnRWNsaXBzZVxcJyddLFxuICAgICAgICAnTEctTFUzMDAwJzogWydMRycsICdPcHRpbXVzIE1hY2gnXSxcbiAgICAgICAgJ0xHLUxVMzEwMCc6IFsnTEcnLCAnT3B0aW11cyBDaGljJ10sXG4gICAgICAgICdMRy1MVTM3MDAnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1MVTU0MDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctTFU2MjAwJzogWydMRycsICdPcHRpbXVzIFEyJ10sXG4gICAgICAgICdMRy1sdTYyMDAnOiBbJ0xHJywgJ09wdGltdXMgUTInXSxcbiAgICAgICAgJ0xHLUxVNjUwMCc6IFsnTEcnLCAnT3B0aW11cyBOb3RlJ10sXG4gICAgICAgICdMRy1MVTY4MDAnOiBbJ0xHJywgJ09wdGltdXMgQmlnJ10sXG4gICAgICAgICdMRy1MVTgzMDAnOiBbJ0xHJywgJ09wdGltdXMgUGFkIExURSddLFxuICAgICAgICAnTEctTFc2OTAnOiBbJ0xHJywgJ09wdGltdXMgQyddLFxuICAgICAgICAnTEctTFc3NzAnOiBbJ0xHJywgJ0xXNzcwJ10sXG4gICAgICAgICdMRy1NUzY5MCc6IFsnTEcnLCAnT3B0aW11cyBNJ10sXG4gICAgICAgICdMRy1NUzc3MCc6IFsnTEcnLCAnTVM3NzAnXSxcbiAgICAgICAgJ0xHLU1TODQwJzogWydMRycsICdDb25uZWN0IDRHJ10sXG4gICAgICAgICdMRy1NUzkxMCc6IFsnTEcnLCAnRXN0ZWVtJ10sXG4gICAgICAgICdMRy1NUzY5NSc6IFsnTEcnLCAnT3B0aW11cyBNKyddLFxuICAgICAgICAnTEcgUDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnTEctUDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnTEctUDM1MGYnOiBbJ0xHJywgJ09wdGltdXMgTWUnXSxcbiAgICAgICAgJ0xHLVAzNTBnJzogWydMRycsICdPcHRpbXVzIE1lJ10sXG4gICAgICAgICdMRy1QMzU1JzogWydMRycsICdQMzU1J10sXG4gICAgICAgICdMRy1QNTAwJzogWydMRycsICdPcHRpbXVzIE9uZSddLFxuICAgICAgICAnTEctUDUwMGgnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1QNTAwaC1wYXJyb3QnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1QNTAzJzogWydMRycsICdPcHRpbXVzIE9uZSddLFxuICAgICAgICAnTEctUDUwNCc6IFsnTEcnLCAnT3B0aW11cyBPbmUnXSxcbiAgICAgICAgJ0xHLVA1MDUnOiBbJ0xHJywgJ1Bob2VuaXgnXSxcbiAgICAgICAgJ0xHLVA1MDVSJzogWydMRycsICdQaG9lbml4J10sXG4gICAgICAgICdMRy1QNTA2JzogWydMRycsICdUaHJpdmUnXSxcbiAgICAgICAgJ0xHLVA1MDknOiBbJ0xHJywgJ09wdGltdXMgVCddLFxuICAgICAgICAnTEctUDY5MCc6IFsnTEcnLCAnT3B0aW11cyBOZXQnXSxcbiAgICAgICAgJ0xHLVA2OTMnOiBbJ0xHJywgJ1A2OTMnXSxcbiAgICAgICAgJ0xHLVA2OTgnOiBbJ0xHJywgJ09wdGltdXMgTmV0J10sXG4gICAgICAgICdMRy1QNjk4Zic6IFsnTEcnLCAnT3B0aW11cyBOZXQnXSxcbiAgICAgICAgJ0xHLVA3MDAnOiBbJ0xHJywgJ09wdGltdXMgTDcnXSxcbiAgICAgICAgJ0xHLVA3MDUnOiBbJ0xHJywgJ09wdGltdXMgTDcnXSxcbiAgICAgICAgJ0xHLVA3MDVmJzogWydMRycsICdPcHRpbXVzIEw3J10sXG4gICAgICAgICdMRy1QNzA1Zyc6IFsnTEcnLCAnT3B0aW11cyBMNyddLFxuICAgICAgICAnTEctUDcwOGcnOiBbJ0xHJywgJ1A3MDgnXSxcbiAgICAgICAgJ0xHLVA3MjAnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctUDcyMGgnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctUDcyNSc6IFsnTEcnLCAnT3B0aW11cyAzRCBNYXgnXSxcbiAgICAgICAgJ0xHLVA3NjAnOiBbJ0xHJywgJ1A3NjAnXSxcbiAgICAgICAgJ0xHLVA3NjknOiBbJ0xHJywgJ1A3NjknXSxcbiAgICAgICAgJ0xHLVA4NjAnOiBbJ0xHJywgJ1A4NjAnXSxcbiAgICAgICAgJ0xHLVA4NzAnOiBbJ0xHJywgJ1A4NzAnXSxcbiAgICAgICAgJ0xHLVA4NzBGJzogWydMRycsICdQODcwJ10sXG4gICAgICAgICdMRy1QODgwJzogWydMRycsICdYMyddLFxuICAgICAgICAnTEctUDg4MGcnOiBbJ0xHJywgJ1gzJ10sXG4gICAgICAgICdMRy1QODk1JzogWydMRycsICdQODk1J10sXG4gICAgICAgICdMRy1QOTIwJzogWydMRycsICdPcHRpbXVzIDNEJ10sXG4gICAgICAgICdMRy1QOTIwaCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctUDkyNSc6IFsnTEcnLCAnVGhyaWxsJ10sXG4gICAgICAgICdMRy1QOTI1Zyc6IFsnTEcnLCAnVGhyaWxsJ10sXG4gICAgICAgICdMRy1QOTMwJzogWydMRycsICdOaXRybyBIRCddLFxuICAgICAgICAnTEctUDkzNic6IFsnTEcnLCAnT3B0aW11cyBMVEUnXSxcbiAgICAgICAgJ0xHLVA5NDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctUDk3MCc6IFsnTEcnLCAnT3B0aW11cyBCbGFjayddLFxuICAgICAgICAnTEctUDk3MGgnOiBbJ0xHJywgJ09wdGltdXMgQmxhY2snXSxcbiAgICAgICAgJ0xHLVA5OTAnOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ0xHLVA5OTBoJzogWydMRycsICdPcHRpbXVzIDJYIFNwZWVkJ10sXG4gICAgICAgICdMRy1QOTkwaE4nOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ0xHLVA5OTBIJzogWydMRycsICdPcHRpbXVzIDJYIFNwZWVkJ10sXG4gICAgICAgICdMRy1QOTkzJzogWydMRycsICdPcHRpbXVzIDJYJ10sXG4gICAgICAgICdMRy1TVTU0MCc6IFsnTEcnLCAnUFJBREEgMy4wJ10sXG4gICAgICAgICdMRy1TVTY0MCc6IFsnTEcnLCAnT3B0aW11cyBMVEUnXSxcbiAgICAgICAgJ0xHLVNVNjYwJzogWydMRycsICdPcHRpbXVzIDJYJ10sXG4gICAgICAgICdMRy1TVTc2MCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctU1U3NjAtS3VzdCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctU1U4NzAnOiBbJ0xHJywgJ09wdGltdXMgM0QgQ3ViZSddLFxuICAgICAgICAnTEctU1U4ODAnOiBbJ0xHJywgJ09wdGltdXMgRVgnXSxcbiAgICAgICAgJ0xHLVVTNjcwJzogWydMRycsICdPcHRpbXVzIFUnXSxcbiAgICAgICAgJ0xHLVVTNzMwJzogWydMRycsICdVUzczMCddLFxuICAgICAgICAnTEctVjkwMCc6IFsnTEcnLCAnT3B0aW11cyBQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdMRy1WOTA1Uic6IFsnTEcnLCAnT3B0aW11cyBHLVNsYXRlJywgJ3RhYmxldCddLFxuICAgICAgICAnTEctVjkwOSc6IFsnTEcnLCAnT3B0aW11cyBHLVNsYXRlJywgJ3RhYmxldCddLFxuICAgICAgICAnTEctVk02NzAnOiBbJ0xHJywgJ09wdGltdXMgViddLFxuICAgICAgICAnTEctVk02OTYnOiBbJ0xHJywgJ09wdGltdXMgRWxpdGUnXSxcbiAgICAgICAgJ0xHLVZNNzAxJzogWydMRycsICdPcHRpbXVzIFNsaWRlciddLFxuICAgICAgICAnTEctVlM2NjAnOiBbJ0xHJywgJ1ZvcnRleCddLFxuICAgICAgICAnTEctVlM3MDAnOiBbJ0xHJywgJ0VubGlnaHRlbiddLFxuICAgICAgICAnTEctVlM3NDAnOiBbJ0xHJywgJ0FsbHknXSxcbiAgICAgICAgJ0xHLVZTODQwJzogWydMRycsICdDb25uZWN0IDRHJ10sXG4gICAgICAgICdMRy1WUzkxMCc6IFsnTEcnLCAnUmV2b2x1dGlvbiddLFxuICAgICAgICAnbGdwLTk3MCc6IFsnTEcnLCAnT3B0aW11cyBCbGFjayddLFxuICAgICAgICAnRTkwMCc6IFsnTEcnLCAnT3B0aW11cyA3J10sXG4gICAgICAgICdHVDU0MCc6IFsnTEcnLCAnT3B0aW11cyBHVDU0MCddLFxuICAgICAgICAnR1c2MjAnOiBbJ0xHJywgJ0dXNjIwJ10sXG4gICAgICAgICdLVTk1MDAnOiBbJ0xHJywgJ09wdGltdXMgWiddLFxuICAgICAgICAnTEdDNjYwJzogWydMRycsICdPcHRpbXVzIFBybyddLFxuICAgICAgICAnTEdMNDVDJzogWydMRycsICdPcHRpbXVzIE5ldCddLFxuICAgICAgICAnTEdMNTVDJzogWydMRycsICdPcHRpbXVzIFEnXSxcbiAgICAgICAgJ0xVMjMwMCc6IFsnTEcnLCAnT3B0aW11cyBRJ10sXG4gICAgICAgICdMUzY3MCc6IFsnTEcnLCAnT3B0aW11cyBTJ10sXG4gICAgICAgICdQOTQwJzogWydMRycsICdQUkFEQSAzLjAnXSxcbiAgICAgICAgJ1A5OTAnOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ1VTQ0MtVVM3MzAnOiBbJ0xHJywgJ1VTNzMwJ10sXG4gICAgICAgICdVU0NDLVVTNzYwJzogWydMRycsICdHZW5lc2lzJ10sXG4gICAgICAgICdWTTY3MCc6IFsnTEcnLCAnT3B0aW11cyBWJ10sXG4gICAgICAgICdWUzg0MCA0Ryc6IFsnTEcnLCAnQ29ubmVjdCA0RyddLFxuICAgICAgICAnVlM5MDAtNEcnOiBbJ0xHJywgJ1ZTOTAwJ10sXG4gICAgICAgICdWUzkxMCA0Ryc6IFsnTEcnLCAnUmV2b2x1dGlvbiA0RyddLFxuICAgICAgICAnVlM5MjAgNEcnOiBbJ0xHJywgJ1NwZWN0cnVtIDRHJ10sXG4gICAgICAgICdWUzkzMCA0Ryc6IFsnTEcnLCAnVlM5MzAnXSxcbiAgICAgICAgJ1ZTOTUwIDRHJzogWydMRycsICdWUzk1MCddLFxuICAgICAgICAnTC0wMUQnOiBbJ0xHJywgJ09wdGltdXMgTFRFJ10sXG4gICAgICAgICdMLTAyRCc6IFsnTEcnLCAnUFJBREEgcGhvbmUnXSxcbiAgICAgICAgJ0wtMDRDJzogWydMRycsICdPcHRpbXVzIENoYXQnXSxcbiAgICAgICAgJ0wtMDVEJzogWydMRycsICdPcHRpbXVzIGl0J10sXG4gICAgICAgICdMLTA2Qyc6IFsnTEcnLCAnT3B0aW11cyBQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdMLTA2RCc6IFsnTEcnLCAnT3B0aW11cyBWdSddLFxuICAgICAgICAnTC0wN0MnOiBbJ0xHJywgJ09wdGltdXMgQnJpZ2h0J10sXG4gICAgICAgICdMRy1FdmUnOiBbJ0xHJywgJ0V2ZSddLFxuICAgICAgICAnTEctT3B0aW11cyBPbmUgUDUwMCc6IFsnTEcnLCAnT3B0aW11cyBPbmUnXSxcbiAgICAgICAgJ0xHLU9wdGltdXMgMlgnOiBbJ0xHJywgJ09wdGltdXMgMlgnXSxcbiAgICAgICAgJ0xHLUdUNTQwIE9wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLU9wdGltdXMgQmxhY2snOiBbJ0xHJywgJ09wdGltdXMgQmxhY2snXSxcbiAgICAgICAgJ0FsbHknOiBbJ0xHJywgJ0FsbHknXSxcbiAgICAgICAgJ09wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ09wdGltdXMgTWUnOiBbJ0xHJywgJ09wdGltdXMgTWUnXSxcbiAgICAgICAgJ29wdGltdXMgbWUgcDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnT3B0aW11cyAyWCc6IFsnTEcnLCAnT3B0aW11cyAyWCddLFxuICAgICAgICAnT3B0aW11cyAyeCc6IFsnTEcnLCAnT3B0aW11cyAyWCddLFxuICAgICAgICAnSVMxMUxHJzogWydMRycsICdPcHRpbXVzIFgnXSxcbiAgICAgICAgJ1ZvcnRleCc6IFsnTEcnLCAnVm9ydGV4J10sXG4gICAgICAgICdMREstSUNLIHYxLjQnOiBbJ0xHJywgJ0VzdGVlbSddLFxuICAgICAgICAnVDYnOiBbJ01hbGF0YScsICdacGFkIFQ2JywgJ3RhYmxldCddLFxuICAgICAgICAnTWFsYXRhIFNNQkExMDAyJzogWydNYWxhdGEnLCAnVGFibGV0IFNNQi1BMTAwMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NUTTcxMkhDWic6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgNzEyYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NUTTgwM0hDJzogWydNZWRpYWNvbScsICdTbWFydFBhZCA4MTBjJywgJ3RhYmxldCddLFxuICAgICAgICAnTWVkaWFjb20gODEwQyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NtYXJ0cGFkODEwYyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NtYXJ0UGFkODEwYyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01QODEwQyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01QOTA3Qyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgOTA3YycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01USzY1MTYnOiBbJ01lZGlhdGVrJywgJ01USzY1MTYnXSxcbiAgICAgICAgJ0xJRkVUQUIgUzk1MTInOiBbJ01lZGlvbicsICdMaWZldGFiIFM5NTEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTElGRVRBQiBQOTUxNCc6IFsnTWVkaW9uJywgJ0xpZmV0YWIgUDk1MTQnLCAndGFibGV0J10sXG4gICAgICAgICdNRCBMSUZFVEFCIFA5NTE2JzogWydNZWRpb24nLCAnTGlmZXRhYiBQOTUxNicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01FRElPTiBMSUZFIFA0MzEwJzogWydNZWRpb24nLCAnTGlmZSBQNDMxMCddLFxuICAgICAgICAnTTgnOiBbJ01laXp1JywgJ004J10sXG4gICAgICAgICdNOSc6IFsnTWVpenUnLCAnTTknXSxcbiAgICAgICAgJ00wNDAnOiBbJ01laXp1JywgJ00wNDAnXSxcbiAgICAgICAgJ005LXVubG9ja2VkJzogWydNZWl6dScsICdNOSddLFxuICAgICAgICAnbWVpenUgbTknOiBbJ01laXp1JywgJ005J10sXG4gICAgICAgICdNRUlaVSBNOSc6IFsnTWVpenUnLCAnTTknXSxcbiAgICAgICAgJ01FSVpVIE1YJzogWydNZWl6dScsICdNWCddLFxuICAgICAgICAnTTAzMCc6IFsnTWVpenUnLCAnTVggTTAzMCddLFxuICAgICAgICAnTTAzMSc6IFsnTWVpenUnLCAnTVggTTAzMSddLFxuICAgICAgICAnTTAzMic6IFsnTWVpenUnLCAnTVggTTAzMiddLFxuICAgICAgICAnU2xpZGVwYWQnOiBbJ01lbXVwJywgJ1NsaWRlcGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnQTQ1JzogWydNaWNyb21heCcsICdBNDUgUHVuayddLFxuICAgICAgICAnTWljcm9tYXggQTUwJzogWydNaWNyb21heCcsICdBNTAgTmluamEnXSxcbiAgICAgICAgJ01pY3JvbWF4IEE2MCc6IFsnTWljcm9tYXgnLCAnQW5kcm8gQTYwJ10sXG4gICAgICAgICdNaWNyb21heCBBNzAnOiBbJ01pY3JvbWF4JywgJ0FuZHJvIEE3MCddLFxuICAgICAgICAnUDMwMChGdW5ib29rKSc6IFsnTWljcm9tYXgnLCAnRnVuYm9vayBQMzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQ3MzUnOiBbJ01vaW5zdG9uZScsICdBVDczNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E4NTMnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnQTk1Myc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDInXSxcbiAgICAgICAgJ0ExNjgwJzogWydNb3Rvcm9sYScsICdNT1RPIEExNjgwJ10sXG4gICAgICAgICdFVDEnOiBbJ01vdG9yb2xhJywgJ0VUMSBFbnRlcnByaXNlIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01CMjAwJzogWydNb3Rvcm9sYScsICdDTElRJ10sXG4gICAgICAgICdNQjMwMCc6IFsnTW90b3JvbGEnLCAnQkFDS0ZMSVAnXSxcbiAgICAgICAgJ01CNTAxJzogWydNb3Rvcm9sYScsICdDTElRIFhUJ10sXG4gICAgICAgICdNQjUwMic6IFsnTW90b3JvbGEnLCAnQ0hBUk0nXSxcbiAgICAgICAgJ01CNTExJzogWydNb3Rvcm9sYScsICdGTElQT1VUJ10sXG4gICAgICAgICdNQjUyMCc6IFsnTW90b3JvbGEnLCAnQlJBVk8nXSxcbiAgICAgICAgJ01CNTI1JzogWydNb3Rvcm9sYScsICdERUZZJ10sXG4gICAgICAgICdNQjUyNSsnOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ01CNTI1IGZvciBtZSc6IFsnTW90b3JvbGEnLCAnREVGWSddLFxuICAgICAgICAnTUI1MjYnOiBbJ01vdG9yb2xhJywgJ0RFRlkrJ10sXG4gICAgICAgICdNQjYxMSc6IFsnTW90b3JvbGEnLCAnQ0xJUSAyJ10sXG4gICAgICAgICdNQjYxMic6IFsnTW90b3JvbGEnLCAnWFBSVCddLFxuICAgICAgICAnTUI2MzInOiBbJ01vdG9yb2xhJywgJ1BSTysnXSxcbiAgICAgICAgJ01CODU1JzogWydNb3Rvcm9sYScsICdQSE9UT04gNEcnXSxcbiAgICAgICAgJ01CODYwJzogWydNb3Rvcm9sYScsICdBVFJJWCddLFxuICAgICAgICAnTUI4NjEnOiBbJ01vdG9yb2xhJywgJ0FUUklYJ10sXG4gICAgICAgICdtYjg2MSc6IFsnTW90b3JvbGEnLCAnQVRSSVgnXSxcbiAgICAgICAgJ01CODY1JzogWydNb3Rvcm9sYScsICdBVFJJWCAyJ10sXG4gICAgICAgICdNQjg3MCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWDInXSxcbiAgICAgICAgJ01CODg2JzogWydNb3Rvcm9sYScsICdESU5BUkEnXSxcbiAgICAgICAgJ01FNTAxJzogWydNb3Rvcm9sYScsICdDTElRIFhUJ10sXG4gICAgICAgICdNRTUxMSc6IFsnTW90b3JvbGEnLCAnRkxJUE9VVCddLFxuICAgICAgICAnbWU1MjUnOiBbJ01vdG9yb2xhJywgJ01PVE8gTUU1MjUnXSxcbiAgICAgICAgJ01lNTI1JzogWydNb3Rvcm9sYScsICdNT1RPIE1FNTI1J10sXG4gICAgICAgICdNRTUyNSc6IFsnTW90b3JvbGEnLCAnTU9UTyBNRTUyNSddLFxuICAgICAgICAnTUU1MjUrJzogWydNb3Rvcm9sYScsICdNT1RPIE1FNTI1J10sXG4gICAgICAgICdNRTYwMCc6IFsnTW90b3JvbGEnLCAnQkFDS0ZMSVAnXSxcbiAgICAgICAgJ01FNjMyJzogWydNb3Rvcm9sYScsICdQUk8rJ10sXG4gICAgICAgICdNRTcyMic6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDInXSxcbiAgICAgICAgJ01FODExJzogWydNb3Rvcm9sYScsICdEcm9pZCBYJ10sXG4gICAgICAgICdNRTg2MCc6IFsnTW90b3JvbGEnLCAnQVRSSVgnXSxcbiAgICAgICAgJ01FODYzJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUgMyddLFxuICAgICAgICAnTUU4NjUnOiBbJ01vdG9yb2xhJywgJ0FUUklYIDInXSxcbiAgICAgICAgJ01UNjIwJzogWydNb3Rvcm9sYScsICdNT1RPIE1UNjIwJ10sXG4gICAgICAgICdNVDYyMHQnOiBbJ01vdG9yb2xhJywgJ01PVE8gTVQ2MjAnXSxcbiAgICAgICAgJ01UNzE2JzogWydNb3Rvcm9sYScsICdNT1RPIE1UNzE2J10sXG4gICAgICAgICdNVDgxMCc6IFsnTW90b3JvbGEnLCAnTU9UTyBNVDgxMCddLFxuICAgICAgICAnTVQ4NzAnOiBbJ01vdG9yb2xhJywgJ01PVE8gTVQ4NzAnXSxcbiAgICAgICAgJ01UOTE3JzogWydNb3Rvcm9sYScsICdNVDkxNyddLFxuICAgICAgICAnTVo1MDUnOiBbJ01vdG9yb2xhJywgJ1hPT00gRmFtaWx5IEVkaXRpb24nLCAndGFibGV0J10sXG4gICAgICAgICdNWjYwMCc6IFsnTW90b3JvbGEnLCAnWE9PTSA0RyBMVEUnLCAndGFibGV0J10sXG4gICAgICAgICdNWjYwMSc6IFsnTW90b3JvbGEnLCAnWE9PTSAzRycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjAyJzogWydNb3Rvcm9sYScsICdYT09NIDRHIExURScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjAzJzogWydNb3Rvcm9sYScsICdYT09NIDNHJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDQnOiBbJ01vdG9yb2xhJywgJ1hPT00gV2lGaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjA1JzogWydNb3Rvcm9sYScsICdYT09NIDNHJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDYnOiBbJ01vdG9yb2xhJywgJ1hPT00gV2lGaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjA3JzogWydNb3Rvcm9sYScsICdYT09NIDIgV2lGaSBNZWRpYSBFZGl0aW9uJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDknOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgOC4yJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDkgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgOC4yJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MTUnOiBbJ01vdG9yb2xhJywgJ1hPT00gMiBXaUZpJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MTcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjE3IDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBYWUJPQVJEIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdXWDQzNSc6IFsnTW90b3JvbGEnLCAnVFJJVU1QSCBXWDQzNSddLFxuICAgICAgICAnV1g0NDUnOiBbJ01vdG9yb2xhJywgJ0NJVFJVUyBXWDQ0NSddLFxuICAgICAgICAnWFQzMDAnOiBbJ01vdG9yb2xhJywgJ1NQSUNFJ10sXG4gICAgICAgICdYVDMwMSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDMwMSddLFxuICAgICAgICAnWFQzMTEnOiBbJ01vdG9yb2xhJywgJ0ZJUkUnXSxcbiAgICAgICAgJ1hUMzE2JzogWydNb3Rvcm9sYScsICdNT1RPIFhUMzE2J10sXG4gICAgICAgICdYVDMxOSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDMxOSddLFxuICAgICAgICAnWFQzOTAnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQzOTAnXSxcbiAgICAgICAgJ1hUMzIwJzogWydNb3Rvcm9sYScsICdERUZZIE1pbmknXSxcbiAgICAgICAgJ1hUMzIxJzogWydNb3Rvcm9sYScsICdERUZZIE1pbmknXSxcbiAgICAgICAgJ1hUNTAwJzogWydNb3Rvcm9sYScsICdNT1RPIFhUNTAwJ10sXG4gICAgICAgICd4dC01MDAnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ1MDAnXSxcbiAgICAgICAgJ1hUNTAyJzogWydNb3Rvcm9sYScsICdRVUVOQ0ggWFQ1J10sXG4gICAgICAgICdYVDUzMCc6IFsnTW90b3JvbGEnLCAnRklSRSBYVCddLFxuICAgICAgICAnWFQ1MzEnOiBbJ01vdG9yb2xhJywgJ0ZJUkUgWFQnXSxcbiAgICAgICAgJ1hUNTMyJzogWydNb3Rvcm9sYScsICdYVDUzMiddLFxuICAgICAgICAnWFQ1MzUnOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ1hUNTUwJzogWydNb3Rvcm9sYScsICdYVDU1MCddLFxuICAgICAgICAnWFQ1NTYnOiBbJ01vdG9yb2xhJywgJ1hUNTU2J10sXG4gICAgICAgICdYVDYwMyc6IFsnTW90b3JvbGEnLCAnQURNSVJBTCddLFxuICAgICAgICAnWFQ2MTAnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFBybyddLFxuICAgICAgICAnWFQ2MTUnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ2MTUnXSxcbiAgICAgICAgJ1hUNjI2JzogWydNb3Rvcm9sYScsICdNT1RPIFhUNjI2J10sXG4gICAgICAgICdYVDY4MSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDY4MSddLFxuICAgICAgICAnWFQ2ODInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDMnXSxcbiAgICAgICAgJ1hUNjg1JzogWydNb3Rvcm9sYScsICdNT1RPIFhUNjg1J10sXG4gICAgICAgICdYVDY4Nyc6IFsnTW90b3JvbGEnLCAnQVRSSVggVFYnXSxcbiAgICAgICAgJ1hUNzAxJzogWydNb3Rvcm9sYScsICdYVDcwMSddLFxuICAgICAgICAnWFQ3MDInOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ3MDInXSxcbiAgICAgICAgJ1hUNzExJzogWydNb3Rvcm9sYScsICdNT1RPIFhUNzExJ10sXG4gICAgICAgICdYVDcyMCc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdYVDg3NSc6IFsnTW90b3JvbGEnLCAnRHJvaWQgQmlvbmljJ10sXG4gICAgICAgICdYVDgwMCc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDgwMCddLFxuICAgICAgICAnWFQ4MDArJzogWydNb3Rvcm9sYScsICdNT1RPIFhUODAwJ10sXG4gICAgICAgICdYVDgwMFcnOiBbJ01vdG9yb2xhJywgJ01PVE8gR2xhbSddLFxuICAgICAgICAnWFQ4MDYnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ4MDYnXSxcbiAgICAgICAgJ1hUODYwJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUgMyddLFxuICAgICAgICAnWFQ4NjInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDMnXSxcbiAgICAgICAgJ1hUODgyJzogWydNb3Rvcm9sYScsICdNT1RPIFhUODgyJ10sXG4gICAgICAgICdYVDg4Myc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDMnXSxcbiAgICAgICAgJ1hUODg5JzogWydNb3Rvcm9sYScsICdYVDg4OSddLFxuICAgICAgICAnWFQ4OTcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDQnXSxcbiAgICAgICAgJ1hUOTAxJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMCc6IFsnTW90b3JvbGEnLCAnUkFaUiddLFxuICAgICAgICAnWFQ5MTBLJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMFMnOiBbJ01vdG9yb2xhJywgJ1JBWlInXSxcbiAgICAgICAgJ1hUOTEwIDRHJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnWFQ5MjMnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFJBWlIgSEQnXSxcbiAgICAgICAgJ1hUOTI1JzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdYVDkyNic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnWFQ5MjYgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFJBWlInXSxcbiAgICAgICAgJ1hUOTI4JzogWydNb3Rvcm9sYScsICdYVDkyOCddLFxuICAgICAgICAnQXRyaXggMic6IFsnTW90b3JvbGEnLCAnQVRSSVggMiddLFxuICAgICAgICAnQXRyaXggNGcnOiBbJ01vdG9yb2xhJywgJ0FUUklYIDRHJ10sXG4gICAgICAgICdBdHJpeCA0Ryc6IFsnTW90b3JvbGEnLCAnQVRSSVggNEcnXSxcbiAgICAgICAgJ0F0cml4IDRHIE1FODYwJzogWydNb3Rvcm9sYScsICdBVFJJWCA0RyddLFxuICAgICAgICAnQ0xJUSc6IFsnTW90b3JvbGEnLCAnQ0xJUSddLFxuICAgICAgICAnQ0xJUSBYVCc6IFsnTW90b3JvbGEnLCAnQ0xJUSBYVCddLFxuICAgICAgICAnQ0xJUTInOiBbJ01vdG9yb2xhJywgJ0NMSVEgMiddLFxuICAgICAgICAnQ29ydmFpcic6IFsnTW90b3JvbGEnLCAnQ29ydmFpcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RFRlknOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ0RlZnkrJzogWydNb3Rvcm9sYScsICdERUZZKyddLFxuICAgICAgICAnRGVmeSBQbHVzJzogWydNb3Rvcm9sYScsICdERUZZKyddLFxuICAgICAgICAnRGV2b3VyJzogWydNb3Rvcm9sYScsICdEZXZvdXInXSxcbiAgICAgICAgJ0RleHQnOiBbJ01vdG9yb2xhJywgJ0RleHQnXSxcbiAgICAgICAgJ0Ryb2lkJzogWydNb3Rvcm9sYScsICdEcm9pZCddLFxuICAgICAgICAnRFJPSUQnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkJ10sXG4gICAgICAgICdEUk9JRDInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0RST0lEMiBHTE9CQUwnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0RST0lEMiBHbG9iYWwnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0Ryb2lkMkdsb2JhbCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgMiddLFxuICAgICAgICAnRFJPSUQgMic6IFsnTW90b3JvbGEnLCAnRHJvaWQgMiddLFxuICAgICAgICAnRFJPSUQzJzogWydNb3Rvcm9sYScsICdEcm9pZCAzJ10sXG4gICAgICAgICdEUk9JRDQnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDQnXSxcbiAgICAgICAgJ0RST0lENCA0Ryc6IFsnTW90b3JvbGEnLCAnRHJvaWQgNCddLFxuICAgICAgICAnRFJPSUQgUHJvJzogWydNb3Rvcm9sYScsICdEcm9pZCBQcm8nXSxcbiAgICAgICAgJ0RST0lEIEJJT05JQyc6IFsnTW90b3JvbGEnLCAnRHJvaWQgQmlvbmljJ10sXG4gICAgICAgICdEUk9JRCBCSU9OSUMgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIEJpb25pYyddLFxuICAgICAgICAnRFJPSUQgQklPTklDIFhUODc1IDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBCaW9uaWMnXSxcbiAgICAgICAgJ0RST0lEUkFaUic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRHJvaWQgUmF6cic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgUkFaUic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgUkFaUiA0Ryc6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgU1BZREVSJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSJ10sXG4gICAgICAgICdEUk9JRCBSQVpSIEhEJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdEUk9JRCBSQVpSIEhEIDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdEcm9pZFgnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgnXSxcbiAgICAgICAgJ0RST0lEWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnZHJvaWQgeCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRHJvaWQgWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRFJPSUQgWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRFJPSUQgWDInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgyJ10sXG4gICAgICAgICdFbGVjdHJpZnknOiBbJ01vdG9yb2xhJywgJ0VsZWN0cmlmeSddLFxuICAgICAgICAnTWlsZXN0b25lIFhUNzIwJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUnXSxcbiAgICAgICAgJ01pbGVzdG9uZSBYdDcyMCc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdNaWxlc3RvbmUnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnQTg1MyBNaWxlc3RvbmUnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnTWlsZXN0b25lIFgnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSBYJ10sXG4gICAgICAgICdNaWxlc3RvbmUgWDInOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSBYMiddLFxuICAgICAgICAnTW90b3JvaVgnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgnXSxcbiAgICAgICAgJ01vdG8gQmFja2ZsaXAnOiBbJ01vdG9yb2xhJywgJ0JBQ0tGTElQJ10sXG4gICAgICAgICdSQVpSJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdUcml1bXBoJzogWydNb3Rvcm9sYScsICdUUklVTVBIJ10sXG4gICAgICAgICdPcHVzIE9uZSc6IFsnTW90b3JvbGEnLCAnaTEnXSxcbiAgICAgICAgJ1Bob3Rvbic6IFsnTW90b3JvbGEnLCAnUEhPVE9OJ10sXG4gICAgICAgICdQaG90b24gNEcnOiBbJ01vdG9yb2xhJywgJ1BIT1RPTiA0RyddLFxuICAgICAgICAnWE9PTSc6IFsnTW90b3JvbGEnLCAnWE9PTScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1hvb20nOiBbJ01vdG9yb2xhJywgJ1hPT00nLCAndGFibGV0J10sXG4gICAgICAgICdYT09NIDInOiBbJ01vdG9yb2xhJywgJ1hPT00gMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1hPT00gMiBNRSc6IFsnTW90b3JvbGEnLCAnWE9PTSAyJywgJ3RhYmxldCddLFxuICAgICAgICAnWE9PTSBNWjYwNic6IFsnTW90b3JvbGEnLCAnWE9PTSBXaUZpJywgJ3RhYmxldCddLFxuICAgICAgICAnSVNXMTFNJzogWydNb3Rvcm9sYScsICdQSE9UT04nXSxcbiAgICAgICAgJ0lTMTJNJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdNT1RXWDQzNUtUJzogWydNb3Rvcm9sYScsICdUUklVTVBIJ10sXG4gICAgICAgICdYMy1JY2UgTUlVSSBYVDcyMCBNZW1vcmlsYSBDbGFzc2ljcyc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdOQUJJLUEnOiBbJ05hYmknLCAnS2lkcyB0YWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdOZXdwYWQnOiBbJ05ld3NteScsICdOZXdwYWQnLCAndGFibGV0J10sXG4gICAgICAgICdOZXdwYWQtSzk3JzogWydOZXdzbXknLCAnTmV3cGFkIEs5NycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05ld3BhZCBQOSc6IFsnTmV3c215JywgJ05ld3BhZCBQOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ00tUEFEIE44JzogWydOZXdzbXknLCAnTS1wYWQgTjgnLCAndGFibGV0J10sXG4gICAgICAgICdMVC1OQTcnOiBbJ05FQycsICdMVC1OQTcnXSxcbiAgICAgICAgJ04tMDFEJzogWydORUMnLCAnTUVESUFTIFBQIE4tMDFEJ10sXG4gICAgICAgICdOLTA0Qyc6IFsnTkVDJywgJ01FRElBUyBOLTA0QyddLFxuICAgICAgICAnTi0wNEQnOiBbJ05FQycsICdNRURJQVMgTFRFIE4tMDREJ10sXG4gICAgICAgICdOLTA1RCc6IFsnTkVDJywgJ01FRElBUyBFUyBOLTA1RCddLFxuICAgICAgICAnTi0wNkMnOiBbJ05FQycsICdNRURJQVMgV1AgTi0wNkMnXSxcbiAgICAgICAgJ04tMDZEJzogWydORUMnLCAnTUVESUFTIFRhYiBOLTA2RCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ04tMDdEJzogWydORUMnLCAnTUVESUFTIFggTi0wN0QnXSxcbiAgICAgICAgJzEwMU4nOiBbJ05FQycsICdNRURJQVMgQ0ggU29mdGJhbmsgMTAxTiddLFxuICAgICAgICAnSVMxMU4nOiBbJ05FQycsICdNRURJQVMgQlIgSVMxMU4nXSxcbiAgICAgICAgJ05leGlhbiBOWC1BODkwJzogWydOZXhpYW4nLCAnSm91cm5leSddLFxuICAgICAgICAnTlgtQTg5MSc6IFsnTmV4aWFuJywgJ1VsdHJhIEpvdXJuZXknXSxcbiAgICAgICAgJ003MjZIQyc6IFsnTmV4dGJvb2snLCAnUHJlbWl1bSA3JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05YTTcyNkhOJzogWydOZXh0Ym9vaycsICdQcmVtaXVtIDcnLCAnZXJlYWRlciddLFxuICAgICAgICAnTlhNODAzSEQnOiBbJ05leHRib29rJywgJ1ByZW1pdW0gOCcsICdlcmVhZGVyJ10sXG4gICAgICAgICdEQVRBTTgwM0hDJzogWydOZXh0Ym9vaycsICdQcmVtaXVtIDgnLCAnZXJlYWRlciddLFxuICAgICAgICAnTlhNOTAxJzogWydOZXh0Ym9vaycsICdOZXh0IDMnLCAnZXJlYWRlciddLFxuICAgICAgICAnTkdNIFZhbml0eSBTbWFydCc6IFsnTkdNJywgJ1Zhbml0eSBTbWFydCddLFxuICAgICAgICAnTm9raWEgTjknOiBbJ05va2lhJywgJ045J10sXG4gICAgICAgICdOb2tpYSBOOTAwJzogWydOb2tpYScsICdOOTAwJ10sXG4gICAgICAgICdMdW1pYTgwMCc6IFsnTm9raWEnLCAnTHVtaWEgODAwJ10sXG4gICAgICAgICdMdW1pYSA5MDAnOiBbJ05va2lhJywgJ0x1bWlhIDkwMCddLFxuICAgICAgICAnTm90aW9uIEluayBBREFNJzogWydOb3Rpb24gSW5rJywgJ0FEQU0nLCAndGFibGV0J10sXG4gICAgICAgICdQNEQgU0lSSVVTJzogWydOdnNibCcsICdQNEQgU0lSSVVTJywgJ3RhYmxldCddLFxuICAgICAgICAnUDREIFNpcml1cyc6IFsnTnZzYmwnLCAnUDREIFNJUklVUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0VGTTcxMEEnOiBbJ09ibGlvJywgJ01pbnQgN3gnLCAndGFibGV0J10sXG4gICAgICAgICdPRFlTLVhwcmVzcyc6IFsnT2R5cycsICdYcHJlc3MnLCAndGFibGV0J10sXG4gICAgICAgICdPbGl2ZXR0aSBPbGlwYWQgMTAwJzogWydPbGl2ZXR0aScsICdPbGlwYWQgMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnT1AxMTAnOiBbJ09saXZldHRpJywgJ09saXBhZCAxMTAnLCAndGFibGV0J10sXG4gICAgICAgICdPTkRBIE1JRCc6IFsnT25kYScsICdNSUQnLCAndGFibGV0J10sXG4gICAgICAgICdWWDU4MEEnOiBbJ09uZGEnLCAnVlg1ODBBJywgJ3RhYmxldCddLFxuICAgICAgICAnVlg2MTBBJzogWydPbmRhJywgJ1ZYNjEwQScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RRMTUwJzogWydPbmRhJywgJ1RRMTUwJ10sXG4gICAgICAgICdOMlQnOiBbJ09OTicsICdOMlQnLCAndGFibGV0J10sXG4gICAgICAgICdSZW5lc2FzJzogWydPcGFkJywgJ1JlbmVzYXMnLCAndGFibGV0J10sXG4gICAgICAgICdyZW5lc2FzIGVtZXYnOiBbJ09wYWQnLCAnUmVuZXNhcycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1g5MDMnOiBbJ09wcG8nLCAnRmluZCBNZSBYOTAzJ10sXG4gICAgICAgICdYOTA1JzogWydPcHBvJywgJ0ZpbmQgMyBYOTA1J10sXG4gICAgICAgICdSODA1JzogWydPcHBvJywgJ1I4MDUnXSxcbiAgICAgICAgJ1I4MDEnOiBbJ09wcG8nLCAnUjgwMSddLFxuICAgICAgICAnUjgxMSc6IFsnT3BwbycsICdSODExJ10sXG4gICAgICAgICdYOTA5JzogWydPcHBvJywgJ1g5MDknXSxcbiAgICAgICAgJ09QUE9SODAxJzogWydPcHBvJywgJ1I4MDEnXSxcbiAgICAgICAgJ09QUE9YOTA1JzogWydPcHBvJywgJ0ZpbmQgMyBYOTA1J10sXG4gICAgICAgICdPUFBPWDkwNyc6IFsnT3BwbycsICdGaW5kIDMgWDkwNyddLFxuICAgICAgICAnWDkwNyc6IFsnT3BwbycsICdGaW5kIDMgWDkwNyddLFxuICAgICAgICAnWDkwMTUnOiBbJ09wcG8nLCAnRmluZCBYOTAxNSddLFxuICAgICAgICAnT1BQT1g5MDE3JzogWydPcHBvJywgJ0ZpbmRlciBYOTAxNyddLFxuICAgICAgICAnT1BQT1U3MDEnOiBbJ09wcG8nLCAnT1BQT1U3MDEnXSxcbiAgICAgICAgJ09QUE9SODA3JzogWydPcHBvJywgJ1JlYWwgUjgwNyddLFxuICAgICAgICAnT1BQT1I4MDUnOiBbJ09wcG8nLCAnUmVhbCBSODA1J10sXG4gICAgICAgICdSODA3JzogWydPcHBvJywgJ1JlYWwgUjgwNyddLFxuICAgICAgICAnT1BQT1Q3MDMnOiBbJ09wcG8nLCAnVDcwMyddLFxuICAgICAgICAnUC0wMUQnOiBbJ1BhbmFzb25pYycsICdQLTAxRCddLFxuICAgICAgICAnUC0wMkQnOiBbJ1BhbmFzb25pYycsICdMdW1peCBQaG9uZSddLFxuICAgICAgICAnUC0wNEQnOiBbJ1BhbmFzb25pYycsICdFbHVnYSddLFxuICAgICAgICAnUC0wN0MnOiBbJ1BhbmFzb25pYycsICdQLTA3QyddLFxuICAgICAgICAnZEwxJzogWydQYW5hc29uaWMnLCAnRWx1Z2EgZEwxJ10sXG4gICAgICAgICcxMDFQJzogWydQYW5hc29uaWMnLCAnTHVtaXggUGhvbmUnXSxcbiAgICAgICAgJ0pULUg1ODBWVCc6IFsnUGFuYXNvbmljJywgJ0JpelBhZCA3JywgJ3RhYmxldCddLFxuICAgICAgICAnSlQtSDU4MVZUJzogWydQYW5hc29uaWMnLCAnQml6UGFkIDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnRlotQTFBJzogWydQYW5hc29uaWMnLCAnVG91Z2hwYWQnLCAndGFibGV0J10sXG4gICAgICAgICdwYW5kaWdpdGFsOWhyJzogWydQYW5kaWdpdGFsJywgJzlIUicsICd0YWJsZXQnXSxcbiAgICAgICAgJ3BhbmRpZ2l0YWw5aHIyJzogWydQYW5kaWdpdGFsJywgJzlIUjInLCAndGFibGV0J10sXG4gICAgICAgICdwYW5kaWdpdGFsb3BjMSc6IFsnUGFuZGlnaXRhbCcsICdPUEMxJywgJ3RhYmxldCddLFxuICAgICAgICAncGFuZGlnaXRhbG9wcDEnOiBbJ1BhbmRpZ2l0YWwnLCAnT1BQMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ3BhbmRpZ2l0YWxwMWhyJzogWydQYW5kaWdpdGFsJywgJ3AxaHInLCAndGFibGV0J10sXG4gICAgICAgICdJTS1BNjAwUyc6IFsnUGFudGVjaCcsICdTSVJJVVMgXFx1MDBjM1xcdWZmZmRcXHUwMGMyXFx1MDBiMSddLFxuICAgICAgICAnSU0tQTYzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIEl6YXInXSxcbiAgICAgICAgJ0lNLUE2OTBMJzogWydQYW50ZWNoJywgJ1NLWSddLFxuICAgICAgICAnSU0tQTY5MFMnOiBbJ1BhbnRlY2gnLCAnU0tZJ10sXG4gICAgICAgICdJTS1BNzEwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBYcHJlc3MnXSxcbiAgICAgICAgJ0lNLUE3MjBMJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFhwcmVzcyddLFxuICAgICAgICAnSU0tQTcyNUwnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgWCsnXSxcbiAgICAgICAgJ0lNLUE3MzBzJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFMnXSxcbiAgICAgICAgJ0lNLUE3MzBTJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFMnXSxcbiAgICAgICAgJ0lNLUE3NTBLJzogWydQYW50ZWNoJywgJ1NLWSBNaXJhY2ggQSddLFxuICAgICAgICAnSU0tQTc2MFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXInXSxcbiAgICAgICAgJ0lNLUE3NzBLJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFJhY2VyJ10sXG4gICAgICAgICdJTS1BNzgwTCc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBSYWNlciddLFxuICAgICAgICAnSU0tQTgwMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgTFRFJ10sXG4gICAgICAgICdJTS1BODEwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBMVEUgTSddLFxuICAgICAgICAnSU0tQTgxMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgTFRFIE0nXSxcbiAgICAgICAgJ0lNLUE4MjBMJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIExURSBFWCddLFxuICAgICAgICAnSU0tQTgzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTgzMEwnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTgzMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTg0MFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUzUnXSxcbiAgICAgICAgJ0lNLUE4NTBLJzogWydQYW50ZWNoJywgJ0lNLUE4NTBLJ10sXG4gICAgICAgICdJTS1UMTAwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBOby4gNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lTMDYnOiBbJ1BhbnRlY2gnLCAnU0lSSVVTIFxcdTAwYzNcXHVmZmZkXFx1MDBjMlxcdTAwYjEnXSxcbiAgICAgICAgJ0FEUjg5OTUnOiBbJ1BhbnRlY2gnLCAnQnJlYWtvdXQnXSxcbiAgICAgICAgJ0FEUjg5OTUgNEcnOiBbJ1BhbnRlY2gnLCAnQnJlYWtvdXQnXSxcbiAgICAgICAgJ0FEUjkxMEwgNEcnOiBbJ1BhbnRlY2gnLCAnQURSOTEwTCddLFxuICAgICAgICAnUGFudGVjaFA0MTAwJzogWydQYW50ZWNoJywgJ0VsZW1lbnQnLCAndGFibGV0J10sXG4gICAgICAgICdQYW50ZWNoUDgwMDAnOiBbJ1BhbnRlY2gnLCAnQ3Jvc3NvdmVyJ10sXG4gICAgICAgICdQYW50ZWNoUDgwMTAnOiBbJ1BhbnRlY2gnLCAnUDgwMTAnXSxcbiAgICAgICAgJ1BhbnRlY2hQOTA2MCc6IFsnUGFudGVjaCcsICdQb2NrZXQnXSxcbiAgICAgICAgJ1BhbnRlY2hQOTA3MCc6IFsnUGFudGVjaCcsICdCdXJzdCddLFxuICAgICAgICAnU0tZIElNLUE2MDBTJzogWydQYW50ZWNoJywgJ1NJUklVUyBcXHUwMGMzXFx1ZmZmZFxcdTAwYzJcXHUwMGIxJ10sXG4gICAgICAgICdTS1kgSU0tQTYzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIEl6YXInXSxcbiAgICAgICAgJ1NLWSBJTS1BNjUwUyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSddLFxuICAgICAgICAnSVMxMVBUJzogWydQYW50ZWNoJywgJ01pcmFjaCBJUzExUFQnXSxcbiAgICAgICAgJ1BBVDcxMlcnOiBbJ1BlcmZlbycsICdQQVQ3MTJXJywgJ3RhYmxldCddLFxuICAgICAgICAnWDdHJzogWydQZWFybCcsICdUb3VjaGxldCBYN0cnLCAndGFibGV0J10sXG4gICAgICAgICdGV1M4MTAnOiBbJ1BISUNPTU0nLCAnRldTODEwJ10sXG4gICAgICAgICdQaGlsaXBzIFBJNTAwMCc6IFsnUGhpbGlwcycsICdQSTUwMDAnLCAndGFibGV0J10sXG4gICAgICAgICdQSTcwMDAnOiBbJ1BoaWxpcHMnLCAnUEk3MDAwJywgJ3RhYmxldCddLFxuICAgICAgICAnUGhpbGlwcyBXNjI2JzogWydQaGlsaXBzJywgJ1c2MjYnXSxcbiAgICAgICAgJ1BoaWxpcHMgVzYzMic6IFsnUGhpbGlwcycsICdXNjMyJ10sXG4gICAgICAgICdNT01PJzogWydQbG95ZXInLCAnTU9NTycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01PTU8xNSc6IFsnUGxveWVyJywgJ01PTU8xNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1BvY2tldEJvb2sgQTcnOiBbJ1BvY2tldEJvb2snLCAnQTcnLCAndGFibGV0J10sXG4gICAgICAgICdQb2NrZXRCb29rIEExMCc6IFsnUG9ja2V0Qm9vaycsICdBMTAnLCAndGFibGV0J10sXG4gICAgICAgICdNb2JpaSA3JzogWydQb2ludCBPZiBWaWV3JywgJ01vYmlpIDcnLCAndGFibGV0J10sXG4gICAgICAgICdQTVAzMzg0QlJVJzogWydQcmVzdGlnaW8nLCAnTXVsdGlwYWQgMzM4NCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RCMDdGVEEnOiBbJ1Bvc2l0aXZvJywgJ1RCMDdGVEEnLCAndGFibGV0J10sXG4gICAgICAgICdRVyBUQi0xMjA3JzogWydRd2FyZScsICdQcm8zJywgJ3RhYmxldCddLFxuICAgICAgICAnVzZIRCBJQ1MnOiBbJ1JhbW9zJywgJ1c2SEQnLCAndGFibGV0J10sXG4gICAgICAgICd3MTAnOiBbJ1JhbW9zJywgJ1cxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1cxMCc6IFsnUmFtb3MnLCAnVzEwJywgJ3RhYmxldCddLFxuICAgICAgICAndzEwIHYyLjAnOiBbJ1JhbW9zJywgJ1cxMCB2Mi4wJywgJ3RhYmxldCddLFxuICAgICAgICAnVzEwIFYyLjAnOiBbJ1JhbW9zJywgJ1cxMCB2Mi4wJywgJ3RhYmxldCddLFxuICAgICAgICAnVDExQUQnOiBbJ1JhbW9zJywgJ1QxMUFEJywgJ3RhYmxldCddLFxuICAgICAgICAnVDExQUQuRkUnOiBbJ1JhbW9zJywgJ1QxMUFEJywgJ3RhYmxldCddLFxuICAgICAgICAnUGxheUJvb2snOiBbJ1JJTScsICdCbGFja0JlcnJ5IFBsYXlCb29rJywgJ3RhYmxldCddLFxuICAgICAgICAnUkJLLTQ5MCc6IFsnUml0bWl4JywgJ1JCSy00OTAnLCAndGFibGV0J10sXG4gICAgICAgICdBOEhEJzogWydTYWF5aScsICdEcm9wYWQgQThIRCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVM3NTY4JzogWydTYW1zdW5nJywgJ1M3NTY4J10sXG4gICAgICAgICdHYWxheHkgTmV4dXMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5leHVzJ10sXG4gICAgICAgICdHVC1CNTMzMCc6IFsnU2Ftc3VuZycsICdHVC1CNTMzMCddLFxuICAgICAgICAnR1QtQjU1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSBQcm8gRHVvcyddLFxuICAgICAgICAnR1QtQjc1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBybyddLFxuICAgICAgICAnR1QtQjc1MTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcm8nXSxcbiAgICAgICAgJ0dULUk1NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDUnXSxcbiAgICAgICAgJ0dULUk1NTAwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgNSddLFxuICAgICAgICAnR1QtSTU1MDBNJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwMC1NUjMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDUnXSxcbiAgICAgICAgJ0dULUk1NTAzJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwOCc6IFsnU2Ftc3VuZycsICdHYWxheHkgNSddLFxuICAgICAgICAnR1QtSTU1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDU1MSddLFxuICAgICAgICAnR1QtSTU1MTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1NTEnXSxcbiAgICAgICAgJ0dULUk1NTEwTSc6IFsnU2Ftc3VuZycsICdHYWxheHkgNTUxJ10sXG4gICAgICAgICdHVC1JNTUxMFQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDU1MSddLFxuICAgICAgICAnR1QtSTU3MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFNwaWNhJ10sXG4gICAgICAgICdHVC1JNTcwMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFNwaWNhJ10sXG4gICAgICAgICdHVC1JNTgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQXBvbGxvJ10sXG4gICAgICAgICdHVC1JNTgwMEQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFwb2xsbyddLFxuICAgICAgICAnR1QtSTU4MDBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBcG9sbG8nXSxcbiAgICAgICAgJ0dULUk1ODAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBcG9sbG8nXSxcbiAgICAgICAgJ0dULUk2NTAwVSc6IFsnU2Ftc3VuZycsICdTYXR1cm4nXSxcbiAgICAgICAgJ0dULUk4MDAwJzogWydTYW1zdW5nJywgJ09tbmlhIDInXSxcbiAgICAgICAgJ0dULUk4MTUwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBXJ10sXG4gICAgICAgICdHVC1JODE1MEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFcnXSxcbiAgICAgICAgJ0dULUk4MTYwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgxNjBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgxNjBQJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgzMjAnOiBbJ1NhbXN1bmcnLCAnSDEnXSxcbiAgICAgICAgJ0dULUk4NTIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBCZWFtJ10sXG4gICAgICAgICdHVC1JODUzMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQmVhbSddLFxuICAgICAgICAnR1QtSTgyNTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEJlYW0nXSxcbiAgICAgICAgJ0dULWk5MDAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnR1QtSTkwMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgVmlicmFudCddLFxuICAgICAgICAnR1QtSTkwMDBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBQbHVzJ10sXG4gICAgICAgICdHVC1JOTAwMyc6IFsnU2Ftc3VuZycsICdHYWxheHkgU0wnXSxcbiAgICAgICAgJ0dULUk5MDAzTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgU0wnXSxcbiAgICAgICAgJ0dULUk5MDA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwOEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ0dULUk5MDEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEdpb3JnaW8gQXJtYW5pJ10sXG4gICAgICAgICdHVC1JOTAxOCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR1QtSTkwMTgnXSxcbiAgICAgICAgJ0dULUk5MDcwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEFkdmFuY2UnXSxcbiAgICAgICAgJ0dULUk5MDcwUCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBBZHZhbmNlJ10sXG4gICAgICAgICdHVC1JOTA4Mic6IFsnU2Ftc3VuZycsICdHYWxheHkgR3JhbmQgRFVPUyddLFxuICAgICAgICAnR1QtSTkwODgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ0dULWk5MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR1QtSTkxMDBHJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ0dULUk5MTAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR1QtSTkxMDBQJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwMyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUiddLFxuICAgICAgICAnR1QtSTkxMDgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ0dULUk5MjEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJIExURSddLFxuICAgICAgICAnR1QtSTkyMTBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJIExURSddLFxuICAgICAgICAnR1QtSTkyMjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ0dULUk5MjI4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHVC1JOTI1MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ0dULUk5MjUwIEVVUiBYWCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ0dULUk5MjYwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcmVtaWVyJ10sXG4gICAgICAgICdHVC1JOTMwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzAzVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnR1QtSTk1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdULUk5NTAwJ10sXG4gICAgICAgICdHVC1JOTgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR1QtSTk4MDAnXSxcbiAgICAgICAgJ0dULU43MDAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHVC1ONzAwMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ0dULU43MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdHVC1ONzEwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBJSSddLFxuICAgICAgICAnR1QtTjgwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUgMTAuMSddLFxuICAgICAgICAnR1QtTjgwMTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUgMTAuMSddLFxuICAgICAgICAnR1QtUDEwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAxMDAwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDEwMDBNJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QMTAwME4nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAxMDAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDEwMDAgVGFibGV0JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QMTAxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDMxMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAyICg3LjApJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDMxMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAzMTEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAzMTEzJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA1MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoMTAuMSknLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNTExMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDIgKDEwLjEpJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDUxMTMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAyICgxMC4xKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjIwMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjAgUGx1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMgTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjIxMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuMCBQbHVzIE4nLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2ODEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy43JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDcxMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xVicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3MzAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgOC45JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDczMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgOC45JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDczMTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA4LjknLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzMyMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3MzIwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAwRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUwMFInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDc1MDBWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMU4nLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUxMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjFOJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUzUzMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBvY2tldCddLFxuICAgICAgICAnR1QtUzUzNjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFknXSxcbiAgICAgICAgJ0dULVM1MzYwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzUzNjBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBZJ10sXG4gICAgICAgICdHVC1TNTM2Myc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzUzNjcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgVFYnXSxcbiAgICAgICAgJ0dULVM1MzY4JzogWydTYW1zdW5nJywgJ0dULVM1MzY4J10sXG4gICAgICAgICdHVC1TNTM2OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzU1NzAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ0dULVM1NTcwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgTWluaSddLFxuICAgICAgICAnR1QtUzU1NzBJJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdHVC1TNTU3MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ0dULVM1NTc4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdHVC1TNTY2MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR2lvJ10sXG4gICAgICAgICdHVC1TNTY2ME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdpbyddLFxuICAgICAgICAnR1QtUzU2NjBWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBHaW8nXSxcbiAgICAgICAgJ0dULVM1NjcwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBGaXQnXSxcbiAgICAgICAgJ0dULVM1NjcwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgRml0J10sXG4gICAgICAgICdHVC1TNTY3MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEZpdCddLFxuICAgICAgICAnR1QtUzU2OTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFhjb3ZlciddLFxuICAgICAgICAnR1QtUzU2OTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBYY292ZXInXSxcbiAgICAgICAgJ0dULVM1ODIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNTgzMEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwRC1wYXJyb3QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBpJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNTgzME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODM4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODM5aSc6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNjEwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSBEdW9zJ10sXG4gICAgICAgICdHVC1TNjEwMkInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgRHVvcyddLFxuICAgICAgICAnR1QtUzY1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmkgMiddLFxuICAgICAgICAnR1QtUzY1MDBEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pIDInXSxcbiAgICAgICAgJ0dULVM2NzAyJzogWydTYW1zdW5nJywgJ0dULVM2NzAyJ10sXG4gICAgICAgICdHVC1TNjgwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlIER1b3MnXSxcbiAgICAgICAgJ0dULVM3NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtUzc1MDBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtUzc1MDBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtVDk1OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBWaWJyYW50J10sXG4gICAgICAgICdTQ0gtaTUwOSc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnU0NILWk1NTknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBvcCddLFxuICAgICAgICAnU0NILWk1NjknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdpbyddLFxuICAgICAgICAnU0NILWk1NzknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnU0NILWk1ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSBEdW9zJ10sXG4gICAgICAgICdTQ0gtaTcwNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDIgKDcuMCknLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtaTgwOSc6IFsnU2Ftc3VuZycsICdTQ0gtaTgwOSddLFxuICAgICAgICAnU0NILWk4ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NDSC1pOTA5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTQ0gtaTkxOSc6IFsnU2Ftc3VuZycsICdTQ0gtaTkxOSddLFxuICAgICAgICAnU0NILWk5MjknOiBbJ1NhbXN1bmcnLCAnU0NILWk5MjknXSxcbiAgICAgICAgJ1NDSC1JMTAwJzogWydTYW1zdW5nJywgJ0dlbSddLFxuICAgICAgICAnU0NILUkxMTAnOiBbJ1NhbXN1bmcnLCAnSWxsdXNpb24nXSxcbiAgICAgICAgJ1NDSC1JNDAwJzogWydTYW1zdW5nJywgJ0NvbnRpbnV1bSddLFxuICAgICAgICAnU0NILUk0MDUnOiBbJ1NhbXN1bmcnLCAnU3RyYXRvc3BoZXJlJ10sXG4gICAgICAgICdTQ0gtSTQwNSA0Ryc6IFsnU2Ftc3VuZycsICdTdHJhdG9zcGhlcmUnXSxcbiAgICAgICAgJ1NDSC1JNTAwJzogWydTYW1zdW5nJywgJ0Zhc2NpbmF0ZSddLFxuICAgICAgICAnU0NILUk1MTAnOiBbJ1NhbXN1bmcnLCAnU3RlYWx0aCBWJ10sXG4gICAgICAgICdTQ0gtSTUxMCA0Ryc6IFsnU2Ftc3VuZycsICdEcm9pZCBDaGFyZ2UnXSxcbiAgICAgICAgJ1NDSC1JNTE1JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOZXh1cyddLFxuICAgICAgICAnU0NILUk1MzUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUlJJ10sXG4gICAgICAgICdTQ0gtSTUzNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NDSC1JNjE5JzogWydTYW1zdW5nJywgJ1NDSC1JNjE5J10sXG4gICAgICAgICdTQ0gtSTY5OSc6IFsnU2Ftc3VuZycsICdTQ0gtSTY5OSddLFxuICAgICAgICAnU0NILUk3NzknOiBbJ1NhbXN1bmcnLCAnU0NILUk3NzknXSxcbiAgICAgICAgJ1NDSC1JODAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wJywgJ3RhYmxldCddLFxuICAgICAgICAnU0NILUk4MTUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjcnLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtSTgxNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA1JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA1IDRHJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTQ0gtSTkxNSc6IFsnU2Ftc3VuZycsICdTQ0gtSTkxNSddLFxuICAgICAgICAnU0NILUk5MzknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUlJJ10sXG4gICAgICAgICdTQ0gtTTgyOEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZWNlZGVudCddLFxuICAgICAgICAnU0NILU04MjhDYXJyYXkoOTA5NjQ4MzQ0OSknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZWNlZGVudCddLFxuICAgICAgICAnU0NILVI1MzBVJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU0NILVI2ODAnOiBbJ1NhbXN1bmcnLCAnUmVwcCddLFxuICAgICAgICAnU0NILVI3MjAnOiBbJ1NhbXN1bmcnLCAnQWRtaXJlJ10sXG4gICAgICAgICdTQ0gtUjczMCc6IFsnU2Ftc3VuZycsICdUcmFuc2ZpeCddLFxuICAgICAgICAnU0NILVI3NjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NDSC1SODIwJzogWydTYW1zdW5nJywgJ1NDSC1SODIwJ10sXG4gICAgICAgICdTQ0gtUjg4MCc6IFsnU2Ftc3VuZycsICdBY2NsYWltJ10sXG4gICAgICAgICdTQ0gtUjkxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgSW5kdWxnZSA0RyddLFxuICAgICAgICAnU0NILVI5MTUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEluZHVsZ2UnXSxcbiAgICAgICAgJ1NDSC1SOTIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBdHRhaW4gNEcnXSxcbiAgICAgICAgJ1NDSC1SOTMwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEF2aWF0b3InXSxcbiAgICAgICAgJ1NDSC1SOTQwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIExpZ2h0cmF5J10sXG4gICAgICAgICdTQ0gtUzcyMEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByb2NsYWltJ10sXG4gICAgICAgICdTQ0gtUzczNUMnOiBbJ1NhbXN1bmcnLCAnU0NILVM3MzUnXSxcbiAgICAgICAgJ1NDSC1XODk5JzogWydTYW1zdW5nJywgJ1NDSC1XODk5J10sXG4gICAgICAgICdTQ0gtVzk5OSc6IFsnU2Ftc3VuZycsICdTQ0gtVzk5OSddLFxuICAgICAgICAnU0dILUk1NDcnOiBbJ1NhbXN1bmcnLCAnU0dILUk1NDcnXSxcbiAgICAgICAgJ1NHSC1JNzE3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdTR0gtSTcxN0QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NHSC1JNzE3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnU0dILUk3MTdSJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdTR0gtSTcyNyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBTa3lyb2NrZXQnXSxcbiAgICAgICAgJ1NHSC1pNzI3Uic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0dILUk3MjdSJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTR0gtSTc0Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NHSC1JNzQ3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NHSC1JNzQ4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU0dILUk3NTcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgU2t5cm9ja2V0IEhEJ10sXG4gICAgICAgICdTR0gtSTc3Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0dILUk5Nzc3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTR0gtSTg5Nic6IFsnU2Ftc3VuZycsICdDYXB0aXZhdGUnXSxcbiAgICAgICAgJ1NHSC1JODk3JzogWydTYW1zdW5nJywgJ0NhcHRpdmF0ZSddLFxuICAgICAgICAnU0dILUk5MjcnOiBbJ1NhbXN1bmcnLCAnQ2FwdGl2YXRlIEdsaWRlJ10sXG4gICAgICAgICdTR0gtSTkyN1InOiBbJ1NhbXN1bmcnLCAnQ2FwdGl2YXRlIEdsaWRlJ10sXG4gICAgICAgICdTR0gtSTk1Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3Uic6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTg3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wJywgJ3RhYmxldCddLFxuICAgICAgICAnU0dILUk5OTcnOiBbJ1NhbXN1bmcnLCAnSW5mdXNlIDRHJ10sXG4gICAgICAgICdTR0gtSTk5N1InOiBbJ1NhbXN1bmcnLCAnSW5mdXNlIDRHJ10sXG4gICAgICAgICdTR0gtSTkwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ1NHSC1TNzMwRyc6IFsnU2Ftc3VuZycsICdTR0gtUzczMCddLFxuICAgICAgICAnU0dILVQ0OTknOiBbJ1NhbXN1bmcnLCAnRGFydCddLFxuICAgICAgICAnU0dILVQ0OTlWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdTR0gtVDQ5OVknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ1NHSC1UNTg5JzogWydTYW1zdW5nJywgJ0dyYXZpdHkgU21hcnQnXSxcbiAgICAgICAgJ1NHSC1UNTg5Uic6IFsnU2Ftc3VuZycsICdHcmF2aXR5IFNtYXJ0J10sXG4gICAgICAgICdTR0gtVDY3OSc6IFsnU2Ftc3VuZycsICdFeGhpYml0IElJIDRHJ10sXG4gICAgICAgICdTR0gtVDY3OU0nOiBbJ1NhbXN1bmcnLCAnRXhoaWJpdCBJSSA0RyddLFxuICAgICAgICAnU0dILVQ3NTknOiBbJ1NhbXN1bmcnLCAnRXhoaWJpdCA0RyddLFxuICAgICAgICAnU0dILVQ3NjknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgQmxhemUgNEcnXSxcbiAgICAgICAgJ1NHSC1UODM5JzogWydTYW1zdW5nJywgJ1QtTW9iaWxlIFNpZGVraWNrJ10sXG4gICAgICAgICdTR0gtVDg0OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1UODU5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1UODY5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdTR0gtVDg3OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnU0dILVQ5NTknOiBbJ1NhbXN1bmcnLCAnVmlicmFudCddLFxuICAgICAgICAnU0dILVQ5NTlEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEZhc2NpbmF0ZSAzRysnXSxcbiAgICAgICAgJ1NHSC1UOTU5UCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBGYXNjaW5hdGUgNEcnXSxcbiAgICAgICAgJ1NHSC1UOTU5Vic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyA0RyddLFxuICAgICAgICAnU0dILVQ5ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NHSC1UOTg5RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBYJ10sXG4gICAgICAgICdTR0gtVDk5OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBCbGF6ZSA0RyddLFxuICAgICAgICAnU0dILVQ5OTlWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEJsYXplIDRHJ10sXG4gICAgICAgICdTSFYtRTEyMEsnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTEyMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTEyMFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTExMFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgTFRFJ10sXG4gICAgICAgICdTSFYtRTE0MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA4LjknLCAndGFibGV0J10sXG4gICAgICAgICdTSFYtRTE1MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjcnLCAndGFibGV0J10sXG4gICAgICAgICdTSFYtRTE2MEsnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NIVi1FMTYwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NIVi1FMTYwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NIVi1FMTcwSyc6IFsnU2Ftc3VuZycsICdTSFYtRTE3MEsnXSxcbiAgICAgICAgJ1NIVi1FMTcwTCc6IFsnU2Ftc3VuZycsICdTSFYtRTE3MEwnXSxcbiAgICAgICAgJ1NIVi1FMjEwSyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVi1FMjEwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVi1FMjEwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVy1NMTAwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgQSddLFxuICAgICAgICAnU0hXLU0xMTBTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTSFctTTEzMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFUnXSxcbiAgICAgICAgJ1NIVy1NMTMwSyc6IFsnU2Ftc3VuZycsICdHYWxheHkgSyddLFxuICAgICAgICAnU0hXLU0xODBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTE4MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMTgwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnU0hXLU0xODBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTE4NVMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMTkwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBIb3BwaW4nXSxcbiAgICAgICAgJ1NIVy1NMjIwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmVvJ10sXG4gICAgICAgICdTSFctTTI0MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnU0hXLU0yNTBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTSFctTTI1MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NIVy1NMjUwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0hXLU0zMDBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzA1Vyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzQwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTSBTdHlsZSddLFxuICAgICAgICAnU0hXLU0zODBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzgwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTM4MFcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xJywgJ3RhYmxldCddLFxuICAgICAgICAnU0hXLU00NDBTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU01ULWk5MTAwJzogWydTYW1zdW5nJywgJ1NNVC1JOTEwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NQSC1ENjAwJzogWydTYW1zdW5nJywgJ0NvbnF1ZXIgNEcnXSxcbiAgICAgICAgJ1NQSC1ENzAwJzogWydTYW1zdW5nJywgJ0VwaWMgNEcnXSxcbiAgICAgICAgJ1NQSC1ENzA1JzogWydTYW1zdW5nJywgJ0VwaWMgNEcgMiddLFxuICAgICAgICAnU1BILUQ3MTAnOiBbJ1NhbXN1bmcnLCAnRXBpYyA0RyBUb3VjaCddLFxuICAgICAgICAnU1BILUw3MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5leHVzJ10sXG4gICAgICAgICdTUEgtTDcxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NQSC1NODIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcmV2YWlsJ10sXG4gICAgICAgICdTUEgtTTgyMC1CU1QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZXZhaWwnXSxcbiAgICAgICAgJ1NQSC1NNTgwJzogWydTYW1zdW5nJywgJ1JlcGxlbmlzaCddLFxuICAgICAgICAnU1BILU05MDAnOiBbJ1NhbXN1bmcnLCAnTW9tZW50J10sXG4gICAgICAgICdTUEgtTTkxMCc6IFsnU2Ftc3VuZycsICdJbnRlcmNlcHQnXSxcbiAgICAgICAgJ1NQSC1NOTIwJzogWydTYW1zdW5nJywgJ1RyYW5zZm9ybSddLFxuICAgICAgICAnU1BILU05MzAnOiBbJ1NhbXN1bmcnLCAnVHJhbnNmb3JtIFVsdHJhJ10sXG4gICAgICAgICdTUEgtTTkzMEJTVCc6IFsnU2Ftc3VuZycsICdUcmFuc2Zvcm0gVWx0cmEnXSxcbiAgICAgICAgJ1NQSC1QMTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdZUC1HQjEnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBsYXllcicsICdtZWRpYSddLFxuICAgICAgICAnWVAtR0I3MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUGxheWVyIDcwJywgJ21lZGlhJ10sXG4gICAgICAgICdZUC1HQjcwRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUGxheWVyIDcwIFBsdXMnLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUdTMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDMuNicsICdtZWRpYSddLFxuICAgICAgICAnWVAtRzEnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgV2lGaSA0LjAnLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUdJMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDQuMicsICdtZWRpYSddLFxuICAgICAgICAnWVAtRzUwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQbGF5ZXInLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUc3MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDUuMCcsICdtZWRpYSddLFxuICAgICAgICAnR1Q5MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdJODk3JzogWydTYW1zdW5nJywgJ0NhcHRpdmF0ZSddLFxuICAgICAgICAnSTc1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5J10sXG4gICAgICAgICdJOTAwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnVDk1OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBWaWJyYW50J10sXG4gICAgICAgICdDYXB0aXZhdGUtSTg5Nyc6IFsnU2Ftc3VuZycsICdDYXB0aXZhdGUnXSxcbiAgICAgICAgJ0dhbGF4eSc6IFsnU2Ftc3VuZycsICdHYWxheHknXSxcbiAgICAgICAgJ0dhbGF4eSBOb3RlJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHYWxheHlTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHYWxheHkgUyBJSSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR2FsYXh5IFgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFgnXSxcbiAgICAgICAgJ0dhbGF4eSBTcGljYSc6IFsnU2Ftc3VuZycsICdHYWxheHkgU3BpY2EnXSxcbiAgICAgICAgJ0dBTEFYWSBUYWInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dBTEFYWSBORVhVUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1ZpYnJhbnRtdGQnOiBbJ1NhbXN1bmcnLCAnVmlicmFudCddLFxuICAgICAgICAnU0MtMDFDJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTQy0wMUQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xIExURScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDLTAyQic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnU0MtMDJDJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTQy0wMkQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjAgUGx1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDLTAzRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBMVEUnXSxcbiAgICAgICAgJ1NDLTA0RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1NDLTA1RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NDLTA2RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0lTVzExU0MnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgV2lNQVgnXSxcbiAgICAgICAgJ0dULVM3NTYyJzogWydTYW1zdW5nJywgJ0dULVM3NTYyJ10sXG4gICAgICAgICdHVC1TNzU2MmknOiBbJ1NhbXN1bmcnLCAnR1QtUzc1NjJpJ10sXG4gICAgICAgICdBMDFTSCc6IFsnU2hhcnAnLCAnQTAxU0gnXSxcbiAgICAgICAgJ0lTMDEnOiBbJ1NoYXJwJywgJ0lTMDEnXSxcbiAgICAgICAgJ0lTMDMnOiBbJ1NoYXJwJywgJ0lTMDMnXSxcbiAgICAgICAgJ0lTMDUnOiBbJ1NoYXJwJywgJ0lTMDUnXSxcbiAgICAgICAgJ0lTMTFTSCc6IFsnU2hhcnAnLCAnQXF1b3MgSVMxMVNIJ10sXG4gICAgICAgICdJUzEyU0gnOiBbJ1NoYXJwJywgJ0FxdW9zIElTMTJTSCddLFxuICAgICAgICAnSVMxM1NIJzogWydTaGFycCcsICdBcXVvcyBJUzEzU0gnXSxcbiAgICAgICAgJ0lTMTRTSCc6IFsnU2hhcnAnLCAnQXF1b3MgSVMxNFNIJ10sXG4gICAgICAgICdJU1cxNlNIJzogWydTaGFycCcsICdBcXVvcyBJU1cxNlNIJ10sXG4gICAgICAgICdFQi1XNTFHSic6IFsnU2hhcnAnLCAnRUItVzUxR0onXSxcbiAgICAgICAgJ1NCTTAwM1NIJzogWydTaGFycCcsICdHYWxhcGFnb3MnXSxcbiAgICAgICAgJ1NCTTAwNVNIJzogWydTaGFycCcsICdHYWxhcGFnb3MnXSxcbiAgICAgICAgJ1NCTTAwNlNIJzogWydTaGFycCcsICdBcXVvcyddLFxuICAgICAgICAnU0JNMDA3U0gnOiBbJ1NoYXJwJywgJ0FxdW9zIDAwN1NIJ10sXG4gICAgICAgICdTQk0wMDlTSCc6IFsnU2hhcnAnLCAnQXF1b3MgMDA5U0gnXSxcbiAgICAgICAgJ1NCTTEwMlNIJzogWydTaGFycCcsICdBcXVvcyAxMDJTSCddLFxuICAgICAgICAnU0JNMTAzU0gnOiBbJ1NoYXJwJywgJ0FxdW9zIDEwM1NIJ10sXG4gICAgICAgICdTQk0xMDRTSCc6IFsnU2hhcnAnLCAnQXF1b3MgMTA0U0gnXSxcbiAgICAgICAgJ1NCTTEwN1NIJzogWydTaGFycCcsICdBcXVvcyAxMDdTSCddLFxuICAgICAgICAnU0JNMTA3U0hCJzogWydTaGFycCcsICdBcXVvcyAxMDdTSCddLFxuICAgICAgICAnU0gtMDFEJzogWydTaGFycCcsICdBcXVvcyBTSC0wMUQnXSxcbiAgICAgICAgJ1NILTAyRCc6IFsnU2hhcnAnLCAnQXF1b3Mgc2xpZGVyIFNILTAyRCddLFxuICAgICAgICAnU0gtMDNDJzogWydTaGFycCcsICdMeW54IDNEJ10sXG4gICAgICAgICdTSC0wNkQnOiBbJ1NoYXJwJywgJ0FxdW9zIFNILTA2RCddLFxuICAgICAgICAnU0gtMDlEJzogWydTaGFycCcsICdBcXVvcyBaZXRhIFNILTA5RCddLFxuICAgICAgICAnU0gtMTBCJzogWydTaGFycCcsICdMeW54J10sXG4gICAgICAgICdTSC0xMkMnOiBbJ1NoYXJwJywgJ0FxdW9zJ10sXG4gICAgICAgICdTSC0xM0MnOiBbJ1NoYXJwJywgJ0FxdW9zIGYgU0gtMTNDJ10sXG4gICAgICAgICdTSDgwRic6IFsnU2hhcnAnLCAnQXF1b3MgU0g4MEYnXSxcbiAgICAgICAgJ1NINzJ4OFUnOiBbJ1NoYXJwJywgJ1NINzJ4OFUnXSxcbiAgICAgICAgJ1NIODExOFUnOiBbJ1NoYXJwJywgJ1NIODExOFUnXSxcbiAgICAgICAgJ1NIODEyOFUnOiBbJ1NoYXJwJywgJ1NIODEyOFUnXSxcbiAgICAgICAgJ1NIODE1OFUnOiBbJ1NoYXJwJywgJ1NIODE1OFUnXSxcbiAgICAgICAgJ1NIODE4OFUnOiBbJ1NoYXJwJywgJ1NIODE4OFUnXSxcbiAgICAgICAgJ1NIODI2OFUnOiBbJ1NoYXJwJywgJ1NIODI2OFUnXSxcbiAgICAgICAgJ0lORk9CQVIgQzAxJzogWydTaGFycCcsICdJTkZPQkFSIEMwMSddLFxuICAgICAgICAnU1BYLTUnOiBbJ1NpbXZhbGxleScsICdTUFgtNSddLFxuICAgICAgICAnU1BYLTUgM0cnOiBbJ1NpbXZhbGxleScsICdTUFgtNSAzRyddLFxuICAgICAgICAnU21hcnRRIEc3JzogWydTbWFydFEnLCAnRzcnLCAndGFibGV0J10sXG4gICAgICAgICdTbWFydFFUNyc6IFsnU21hcnRRJywgJ1Q3JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDEwJzogWydTbWFydFEnLCAnVDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDE1JzogWydTbWFydFEnLCAnVDE1JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDE5JzogWydTbWFydFEnLCAnVDE5JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDIwJzogWydTbWFydFEnLCAnVDIwJywgJ3RhYmxldCddLFxuICAgICAgICAnT01TMSA2JzogWydTb255IEVyaWNzc29uJywgJ0E4aSddLFxuICAgICAgICAnRTEwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ0UxMGknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCBNaW5pJ10sXG4gICAgICAgICdFMTBpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ0UxNSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDgnXSxcbiAgICAgICAgJ0UxNWEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTVpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnRTE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTVpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTZpJzogWydTb255IEVyaWNzc29uJywgJ1c4IFdhbGttYW4nXSxcbiAgICAgICAgJ0xUMTFpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOZW8gViddLFxuICAgICAgICAnTFQxNSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIEFyYyddLFxuICAgICAgICAnTFQxNWktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE4YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjIFMnXSxcbiAgICAgICAgJ0xUMThpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBcmMgUyddLFxuICAgICAgICAnTFQxOGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBcmMgUyddLFxuICAgICAgICAnTFQxOGktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjIFMnXSxcbiAgICAgICAgJ0xUMjJpJzogWydTb255JywgJ1hwZXJpYSBQJ10sXG4gICAgICAgICdMVDI2aSc6IFsnU29ueScsICdYcGVyaWEgUyddLFxuICAgICAgICAnTFQyNmlpJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdMVDI2aS1vJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdMVDI4YXQnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOGgnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOGknOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOWknOiBbJ1NvbnknLCAnWHBlcmlhIEdYJ10sXG4gICAgICAgICdTb255TFQyOWknOiBbJ1NvbnknLCAnWHBlcmlhIEdYJ10sXG4gICAgICAgICdTb255TFQzMGEnOiBbJ1NvbnknLCAnWHBlcmlhIE1pbnQnXSxcbiAgICAgICAgJ1NvbnlMVDMwcCc6IFsnU29ueScsICdYcGVyaWEgTWludCddLFxuICAgICAgICAnTUsxNmEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBybyddLFxuICAgICAgICAnTUsxNmknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBybyddLFxuICAgICAgICAnTVQxMWEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdNVDExaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvIFYnXSxcbiAgICAgICAgJ01UMTFpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvIFYnXSxcbiAgICAgICAgJ01UMTFpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdNVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDE1aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyddLFxuICAgICAgICAnTVQxNWktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDI1aSc6IFsnU29ueScsICdYcGVyaWEgTmVvIEwnXSxcbiAgICAgICAgJ01UMjdpJzogWydTb255JywgJ1hwZXJpYSBTb2xhJ10sXG4gICAgICAgICdSODAwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUjgwMGknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBsYXknXSxcbiAgICAgICAgJ1I4MDBpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUjgwMGF0JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBQbGF5J10sXG4gICAgICAgICdSODAweCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnU0sxN2EnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmkgUHJvJ10sXG4gICAgICAgICdTSzE3aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSBQcm8nXSxcbiAgICAgICAgJ1NLMTdpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSBQcm8nXSxcbiAgICAgICAgJ1NLMTdpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmkgUHJvJ10sXG4gICAgICAgICdTVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSddLFxuICAgICAgICAnU1QxNWknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmknXSxcbiAgICAgICAgJ1NUMTdhJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3RpdmUnXSxcbiAgICAgICAgJ1NUMTdpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3RpdmUnXSxcbiAgICAgICAgJ1NUMThhJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NUMThpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NUMThpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUmF5J10sXG4gICAgICAgICdTVDE4YXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFJheSddLFxuICAgICAgICAnU29ueVNUMjEnOiBbJ1NvbnknLCAnXFwnVGFwaW9jYVxcJyddLFxuICAgICAgICAnU29ueVNUMjFpJzogWydTb255JywgJ1xcJ1RhcGlvY2FcXCcnXSxcbiAgICAgICAgJ1NvbnlTVDIxYTInOiBbJ1NvbnknLCAnXFwnVGFwaW9jYVxcJyddLFxuICAgICAgICAnU1QyMSc6IFsnU29ueScsICdcXCdUYXBpb2NhXFwnJ10sXG4gICAgICAgICdTVDIxaSc6IFsnU29ueScsICdcXCdUYXBpb2NhXFwnJ10sXG4gICAgICAgICdTb255U1QyM2knOiBbJ1NvbnknLCAnXFwnVGFwaW9jYSBEU1xcJyddLFxuICAgICAgICAnU1QyNWknOiBbJ1NvbnknLCAnWHBlcmlhIFUnXSxcbiAgICAgICAgJ1NUMjdpJzogWydTb255JywgJ1hwZXJpYSBHbyddLFxuICAgICAgICAnVTIwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmkgUHJvJ10sXG4gICAgICAgICdVMjBpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1UyMGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1dUMTNpJzogWydTb255IEVyaWNzc29uJywgJ01peCBXYWxrbWFuJ10sXG4gICAgICAgICdXVDE4aSc6IFsnU29ueSBFcmljc3NvbicsICdXYWxrbWFuJ10sXG4gICAgICAgICdXVDE5YSc6IFsnU29ueSBFcmljc3NvbicsICdMaXZlIHdpdGggV2Fsa21hbiddLFxuICAgICAgICAnV1QxOWknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnTGl2ZSB3aXRoIFdhbGttYW4nXSxcbiAgICAgICAgJ1dUMTlpdic6IFsnU29ueSBFcmljc3NvbicsICdMaXZlIHdpdGggV2Fsa21hbiddLFxuICAgICAgICAnWDgnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdYMTAnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCddLFxuICAgICAgICAnWDEwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwJ10sXG4gICAgICAgICdYMTBpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1gxMGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1gxMFMnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCddLFxuICAgICAgICAnWDEwbWluaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ1gxMCBNaW5pJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSddLFxuICAgICAgICAnWDEwIE1pbmkgUHJvJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1oxaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUzUxU0UnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmknXSxcbiAgICAgICAgJ0lTMTFTJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3JvJ10sXG4gICAgICAgICdJUzEyUyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyBIRCddLFxuICAgICAgICAnU08tMDFCJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1NPLTAxQyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdTTy0wMUQnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBsYXknXSxcbiAgICAgICAgJ1NPLTAyQyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyddLFxuICAgICAgICAnU08tMDJEJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOWCddLFxuICAgICAgICAnU08tMDNDJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NPLTAzRCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyBIRCddLFxuICAgICAgICAnU08tMDREJzogWydTb255JywgJ1hwZXJpYSBHWCddLFxuICAgICAgICAnU08tMDVEJzogWydTb255JywgJ1hwZXJpYSBTWCddLFxuICAgICAgICAnWFBFUklBIFg4JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnWHBlcmlhIFg4JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnWHBlcmlhIFgxMCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwJ10sXG4gICAgICAgICdYcGVyaWEgcmF5JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1hwZXJpYSBSYXknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFJheSddLFxuICAgICAgICAnWHBlcmlhIEFyYyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdYcGVyaWEgTWluaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSddLFxuICAgICAgICAnWHBlcmlhIG5lbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdYcGVyaWEgTmVvJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOZW8nXSxcbiAgICAgICAgJ1hQRVJJQSBORU8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyddLFxuICAgICAgICAnWHBlcmlhIE5lb1YnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdYcGVyaWEgTmVvIFYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdYcGVyaWEgUGxheSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnU29ueSBFcmljc3NvbiBYcGVyaWEgWDEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxJ10sXG4gICAgICAgICdTb255SGF5YWJ1c2EnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnSGF5YWJ1c2EnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnbm96b21pJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdTb255IFRhYmxldCBQJzogWydTb255JywgJ1RhYmxldCBQJywgJ3RhYmxldCddLFxuICAgICAgICAnU29ueSBUYWJsZXQgUyc6IFsnU29ueScsICdUYWJsZXQgUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05XWi1aMTAwMFNlcmllcyc6IFsnU29ueScsICdXYWxrbWFuIFonLCAnbWVkaWEnXSxcbiAgICAgICAgJ05XLVoxMDAwU2VyaWVzJzogWydTb255JywgJ1dhbGttYW4gWicsICdtZWRpYSddLFxuICAgICAgICAnU3BpY2UgTWkyODAnOiBbJ1NwaWNlJywgJ01pLTI4MCddLFxuICAgICAgICAnU3BpY2UgTWkzMDAnOiBbJ1NwaWNlJywgJ01pLTMwMCddLFxuICAgICAgICAnU3BpY2UgTWktMzEwJzogWydTcGljZScsICdNaS0zMTAnXSxcbiAgICAgICAgJ1NwaWNlIE1pLTQyNSc6IFsnU3BpY2UnLCAnTWktNDI1J10sXG4gICAgICAgICdTUElDRSBNaS03MjAnOiBbJ1NwaWNlJywgJ01pLTcyMCddLFxuICAgICAgICAnQTcyNzIrJzogWydTdGFyJywgJ0E3MjcyKyddLFxuICAgICAgICAnZTExMDkgdjczIGdxMTAwMiBjdHAnOiBbJ1N0YXInLCAnWDE4aSddLFxuICAgICAgICAnVFMxMDA0VCc6IFsnU3VyZiAzUScsICdUUzEwMDRUJywgJ3RhYmxldCddLFxuICAgICAgICAnU1lUQUJFWDctMic6IFsnU3lsdmFuaWEnLCAnU1lUQUJFWDcnLCAndGFibGV0J10sXG4gICAgICAgICdUQ0wgQTg2MCc6IFsnVENMJywgJ0E4NjAnXSxcbiAgICAgICAgJ1RDTCBBOTA2JzogWydUQ0wnLCAnQTkwNiddLFxuICAgICAgICAnVENMIEE5MDknOiBbJ1RDTCcsICdBOTA5J10sXG4gICAgICAgICdUQ0wgQTkxOSc6IFsnVENMJywgJ0E5MTknXSxcbiAgICAgICAgJ1RDTCBBOTkwJzogWydUQ0wnLCAnQTk5MCddLFxuICAgICAgICAnVENMIEE5OTYnOiBbJ1RDTCcsICdBOTk2J10sXG4gICAgICAgICdUQ0wgQTk5OCc6IFsnVENMJywgJ0E5OTgnXSxcbiAgICAgICAgJ1RDTCBHRU5FU0VFIEU3MDgnOiBbJ1RDTCcsICdHZW5lc2VlIEU3MDgnXSxcbiAgICAgICAgJ0ExMHQoNURNMyknOiBbJ1RlY2xhc3QnLCAnQTEwVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1A3Mic6IFsnVGVjbGFzdCcsICdQNzInLCAndGFibGV0J10sXG4gICAgICAgICdQNzZUSSc6IFsnVGVjbGFzdCcsICdQNzZUaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1A4MUhEJzogWydUZWNsYXN0JywgJ1A4MUhEJywgJ3RhYmxldCddLFxuICAgICAgICAnUDg1KFI4QTEpJzogWydUZWNsYXN0JywgJ1A4NScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Q3MjAgU0UnOiBbJ1RlY2xhc3QnLCAnVDcyMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Q3NjAgZnJvbSBtb2FnZS5jb20nOiBbJ1RlY2xhc3QnLCAnVDc2MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ3RlZ2F2Mic6IFsnVGVnYXRlY2gnLCAnVEVHQSB2MicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RNLTcwMjUnOiBbJ3RlWGV0JywgJ1RNLTcwMjUnLCAndGFibGV0J10sXG4gICAgICAgICdNb0ZpbmcnOiBbJ1Rob21zb24nLCAnTW9GaW5nJywgJ3RhYmxldCddLFxuICAgICAgICAnVWx0aW1hdGUxMCc6IFsnVG9tdGVjJywgJ1VsdGltYXRlMTAnLCAndGFibGV0J10sXG4gICAgICAgICdUaGwgVjcnOiBbJ1RITCcsICdWNyddLFxuICAgICAgICAnVGhMIFY3JzogWydUSEwnLCAnVjcnXSxcbiAgICAgICAgJ1RoTCBWOCc6IFsnVEhMJywgJ1Y4J10sXG4gICAgICAgICdUaEwgVjknOiBbJ1RITCcsICdWOSddLFxuICAgICAgICAnVGhMIFYxMSc6IFsnVEhMJywgJ1YxMSddLFxuICAgICAgICAnVFNCIENMT1VEIENPTVBBTklPTjtUT1NISUJBIEFDIEFORCBBWic6IFsnVG9zaGliYScsICdEeW5hYm9vayBBWicsICdkZXNrdG9wJ10sXG4gICAgICAgICdUT1NISUJBIEFDIEFORCBBWic6IFsnVG9zaGliYScsICdEeW5hYm9vayBBWicsICdkZXNrdG9wJ10sXG4gICAgICAgICdUT1NISUJBIEZPTElPIEFORCBBJzogWydUb3NoaWJhJywgJ0ZvbGlvIDEwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1QtMDFDJzogWydUb3NoaWJhJywgJ1JlZ3phIFQtMDFDJ10sXG4gICAgICAgICdULTAxRCc6IFsnVG9zaGliYScsICdSZWd6YSBULTAxRCddLFxuICAgICAgICAnSVMwNCc6IFsnVG9zaGliYScsICdSZWd6YSBJUzA0J10sXG4gICAgICAgICdJUzExVCc6IFsnVG9zaGliYScsICdSZWd6YSBJUzExVCddLFxuICAgICAgICAnQVQxUzAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQxUzAnXSxcbiAgICAgICAgJ1Rvc3RhYjAzJzogWydUb3NoaWJhJywgJ1JlZ3phIEFUMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQxMDAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdBVDIwMCc6IFsnVG9zaGliYScsICdSZWd6YSBBVDIwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FUNDcwJzogWydUb3NoaWJhJywgJ1JlZ3phIEFUNDcwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQ1NzAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQ1NzAnLCAndGFibGV0J10sXG4gICAgICAgICdBVDgzMCc6IFsnVG9zaGliYScsICdSZWd6YSBBVDgzMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ZvbGlvIDEwMCc6IFsnVG9zaGliYScsICdGb2xpbyAxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdmb2xpbzEwMCc6IFsnVG9zaGliYScsICdGb2xpbyAxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdUSFJpVkUnOiBbJ1Rvc2hpYmEnLCAnVEhSaVZFJywgJ3RhYmxldCddLFxuICAgICAgICAnRmFudGFzdGljIFQzJzogWydUV00nLCAnRmFudGFzdGljIFQzJ10sXG4gICAgICAgICdNNzAwMTQnOiBbJ1VuaXRlZCBTdGFyIFRlY2hub2xvZ3knLCAnTTcwMDE0JywgJ3RhYmxldCddLFxuICAgICAgICAnUFM0Nyc6IFsnVmVsb2NpdHkgTWljcm8nLCAnQ3J1eiBQUzQ3JywgJ3RhYmxldCddLFxuICAgICAgICAnVDMwMSc6IFsnVmVsb2NpdHkgTWljcm8nLCAnQ3J1eiBUMzAxJywgJ3RhYmxldCddLFxuICAgICAgICAnVmliby1BNjg4JzogWydGSUgnLCAnVmlibyBBNjg4J10sXG4gICAgICAgICdWaWRlb2Nvbi1WNzUwMCc6IFsnVmlkZW9jb24nLCAnVjc1MDAnXSxcbiAgICAgICAgJ0dUYWJsZXQnOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnR3RhYkNvbWInOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnVGVhbURSSCBJQ1MgZm9yIEdUYWJsZXQnOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnVmlld1BhZDcnOiBbJ1ZpZXdTb25pYycsICdWaWV3UGFkIDcnLCAndGFibGV0J10sXG4gICAgICAgICdWaWV3UGFkIDEwZSc6IFsnVmlld1NvbmljJywgJ1ZpZXdQYWQgMTBlJywgJ3RhYmxldCddLFxuICAgICAgICAnVlRBQjEwMDgnOiBbJ1ZpemlvJywgJ1ZUQUIxMDA4JywgJ3RhYmxldCddLFxuICAgICAgICAnVlRBQjMwMTAnOiBbJ1ZpemlvJywgJ1ZUQUIzMDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnVk9UTyBXNTMwMCc6IFsnVk9UTycsICdXNTMwMCddLFxuICAgICAgICAneFBBRC03MCc6IFsnV2F5dGVRJywgJ3hQQUQtNzAnLCAndGFibGV0J10sXG4gICAgICAgICd4VEFCLTcwJzogWydXYXl0ZVEnLCAneFRBQi03MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1dlbGxjb00tQTk5JzogWydXZWxsY29NJywgJ0E5OSddLFxuICAgICAgICAnTjEyJzogWydXaW5kb3cnLCAnTjEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTjEyUic6IFsnV2luZG93JywgJ04xMlInLCAndGFibGV0J10sXG4gICAgICAgICdONTAnOiBbJ1dpbmRvdycsICdONTAnLCAndGFibGV0J10sXG4gICAgICAgICdONTBEVCc6IFsnV2luZG93JywgJ041MERUJywgJ3RhYmxldCddLFxuICAgICAgICAnTjUwR1QnOiBbJ1dpbmRvdycsICdONTBHVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ041MEdUIEEnOiBbJ1dpbmRvdycsICdONTBHVC1BJywgJ3RhYmxldCddLFxuICAgICAgICAnTjcwJzogWydXaW5kb3cnLCAnTjcwJywgJ3RhYmxldCddLFxuICAgICAgICAnTjcwIERVQUwgQ09SRSc6IFsnV2luZG93JywgJ043MCBEdWFsIENvcmUnLCAndGFibGV0J10sXG4gICAgICAgICdOODAnOiBbJ1dpbmRvdycsICdOODAnLCAndGFibGV0J10sXG4gICAgICAgICdOOTAnOiBbJ1dpbmRvdycsICdOOTAnLCAndGFibGV0J10sXG4gICAgICAgICdOOTAgRFVBTCBDT1JFMiBWMTInOiBbJ1dpbmRvdycsICdOOTAgRHVhbCBDb3JlJywgJ3RhYmxldCddLFxuICAgICAgICAnTjYxMic6IFsnV2lzaHdheScsICdONjEyJ10sXG4gICAgICAgICdBVC1BUzQzRCc6IFsnV29sZmdhbmcnLCAnQVQtQVM0M0QnXSxcbiAgICAgICAgJ00xMic6IFsnV29wYWQnLCAnTTEyJywgJ3RhYmxldCddLFxuICAgICAgICAnV004NjUwJzogWydXb25kZXJNZWRpYScsICdXTTg2NTAnLCAndGFibGV0J10sXG4gICAgICAgICdNSS1PTkUnOiBbJ1hpYW9taScsICdNSS1PTkUnXSxcbiAgICAgICAgJ01JLU9ORSBDMSc6IFsnWGlhb21pJywgJ01JLU9ORSBDMSddLFxuICAgICAgICAnTUktT05FIFBsdXMnOiBbJ1hpYW9taScsICdNSS1PTkUgUGx1cyddLFxuICAgICAgICAnTUkgMVMnOiBbJ1hpYW9taScsICdNSS1PTkUgUGx1cyddLFxuICAgICAgICAnTUkgMVNDJzogWydYaWFvbWknLCAnTUktT05FIDFTQyddLFxuICAgICAgICAnbWlvbmUgcGx1cyc6IFsnWGlhb21pJywgJ01JLU9ORSBQbHVzJ10sXG4gICAgICAgICdNSS1UV08nOiBbJ1hpYW9taScsICdNSS1UV08nXSxcbiAgICAgICAgJ01JIDInOiBbJ1hpYW9taScsICdNSS1UV08nXSxcbiAgICAgICAgJ01JIDJTJzogWydYaWFvbWknLCAnTUktVFdPIFBsdXMnXSxcbiAgICAgICAgJ01JIDJTQyc6IFsnWGlhb21pJywgJ01JLVRXTyBQbHVzJ10sXG4gICAgICAgICdRMDdDTDAxJzogWydYVmlzaW9uJywgJ1EwNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ042JzogWydZYXJ2aWsnLCAnMjEwIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0VNUjE4NzknOiBbJ1lpZG9uZycsICdFTVIxODc5JywgJ3RhYmxldCddLFxuICAgICAgICAneXVzdW4gVzcwMic6IFsnWXVzdW4nLCAnVzcwMiddLFxuICAgICAgICAnWVgtWVVTVU4gRTgwJzogWydZdXN1bicsICdFODAnXSxcbiAgICAgICAgJ3p0MTgwJzogWydaZW5pdGhpbmsnLCAnWlQtMTgwJywgJ3RhYmxldCddLFxuICAgICAgICAnSmFndWFyNyc6IFsnWmlpTGFicycsICdKYWd1YXIgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1ppc3MgUmFuZ2VyIEhEJzogWydaaXNzJywgJ1JhbmdlciBIRCddLFxuICAgICAgICAnWlRFIExpYnJhJzogWydaVEUnLCAnTGlicmEnXSxcbiAgICAgICAgJ1pURS1UIFQ5JzogWydaVEUnLCAnTGlnaHQgVGFiIFQ5JywgJ3RhYmxldCddLFxuICAgICAgICAnVjknOiBbJ1pURScsICdMaWdodCBUYWIgVjknLCAndGFibGV0J10sXG4gICAgICAgICdWOWUrJzogWydaVEUnLCAnTGlnaHQgVGFiIDInLCAndGFibGV0J10sXG4gICAgICAgICdWOUEnOiBbJ1pURScsICdMaWdodCBUYWIgMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xpZ2h0IFRhYiAyVyc6IFsnWlRFJywgJ0xpZ2h0IFRhYiAyJywgJ3RhYmxldCddLFxuICAgICAgICAnTGlnaHQgVGFiIDInOiBbJ1pURScsICdMaWdodCBUYWIgMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Y5Qyc6IFsnWlRFJywgJ0xpZ2h0IFRhYiAzJywgJ3RhYmxldCddLFxuICAgICAgICAnVjU1JzogWydaVEUnLCAnT3B0aWsnLCAndGFibGV0J10sXG4gICAgICAgICdBY3F1YSc6IFsnWlRFJywgJ0FjcXVhJ10sXG4gICAgICAgICdCbGFkZSc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdCbGFkZS1WODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURS1VIFY4ODAnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnQmxhZGUtb3BkYSc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdaVEUtQkxBREUnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnWlRFIEJsYWRlJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURSBWODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURS1VKFYpODgwKyc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdWODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ2E1JzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ0JsYWRlMic6IFsnWlRFJywgJ0JsYWRlIDInXSxcbiAgICAgICAgJ0JsYWRlIFMnOiBbJ1pURScsICdCbGFkZSBTJ10sXG4gICAgICAgICdYNTAwJzogWydaVEUnLCAnU2NvcmUnXSxcbiAgICAgICAgJ1pURS1YNTAwJzogWydaVEUnLCAnU2NvcmUnXSxcbiAgICAgICAgJ1NrYXRlJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURSBTa2F0ZSc6IFsnWlRFJywgJ1NrYXRlJ10sXG4gICAgICAgICdaVEUtU2thdGUnOiBbJ1pURScsICdTa2F0ZSddLFxuICAgICAgICAnWlRFLVNLQVRFJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURS1WOTYwJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURS1VIFY5NjAnOiBbJ1pURScsICdTa2F0ZSddLFxuICAgICAgICAnWlRFIFJhY2VyJzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1pURS1SQUNFUic6IFsnWlRFJywgJ1JhY2VyJ10sXG4gICAgICAgICdNVEMgOTE2JzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1JhY2VyJzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1JhY2VySUknOiBbJ1pURScsICdSYWNlciAyJ10sXG4gICAgICAgICdSQUNFUklJJzogWydaVEUnLCAnUmFjZXIgMiddLFxuICAgICAgICAnWlRFIFJvYW1lcic6IFsnWlRFJywgJ1JvYW1lciddLFxuICAgICAgICAnTjg2MCc6IFsnWlRFJywgJ1dhcnAnXSxcbiAgICAgICAgJ044ODAnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnWlRFLVQgVTgwMic6IFsnWlRFJywgJ1QtVTgwMiddLFxuICAgICAgICAnWlRFLVQgVTgwNic6IFsnWlRFJywgJ1QtVTgwNiddLFxuICAgICAgICAnWlRFLVQgVTgxMic6IFsnWlRFJywgJ1QtVTgxMiddLFxuICAgICAgICAnWlRFLVQgVTgzMCc6IFsnWlRFJywgJ1QtVTgzMCddLFxuICAgICAgICAnWlRFLVQgVTg4MCc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnWlRFIFQgVTg4MCc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnWlRFLVRVODgwJzogWydaVEUnLCAnVC1VODgwJ10sXG4gICAgICAgICdaVEUtVFU5MDAnOiBbJ1pURScsICdULVU5MDAnXSxcbiAgICAgICAgJ1pURS1UIFU5NjAnOiBbJ1pURScsICdULVU5NjAnXSxcbiAgICAgICAgJ1pURS1UVTk2MHMnOiBbJ1pURScsICdULVU5NjAnXSxcbiAgICAgICAgJ1pURS1UIFU5NjBzJzogWydaVEUnLCAnVC1VOTYwJ10sXG4gICAgICAgICdaVEUgVSBONzIwJzogWydaVEUnLCAnVS1ONzIwJ10sXG4gICAgICAgICdaVEUtVSBWODU2JzogWydaVEUnLCAnVS1WODU2J10sXG4gICAgICAgICdaVEUtVSBWODU3JzogWydaVEUnLCAnVS1WODU3J10sXG4gICAgICAgICdaVEUtVSBWODgxJzogWydaVEUnLCAnVS1WODgxJ10sXG4gICAgICAgICdaVEUtVSBYODUwJzogWydaVEUnLCAnVS1YODUwJ10sXG4gICAgICAgICdaVEUtVSBYODc2JzogWydaVEUnLCAnVS1YODc2J10sXG4gICAgICAgICdaVEUtWDg3Nic6IFsnWlRFJywgJ1UtWDg3NiddLFxuICAgICAgICAnWlRFLUMgUjc1MCc6IFsnWlRFJywgJ0MtUjc1MCddLFxuICAgICAgICAnWlRFLUMgTjYwMCc6IFsnWlRFJywgJ0MtTjYwMCddLFxuICAgICAgICAnWlRFLUMgTjYwMCsnOiBbJ1pURScsICdDLU42MDAnXSxcbiAgICAgICAgJ1pURS1DIE42MDYnOiBbJ1pURScsICdDLU42MDYnXSxcbiAgICAgICAgJ1pURS1DIE43MDAnOiBbJ1pURScsICdDLU43MDAnXSxcbiAgICAgICAgJ1pURS1DIE43NjAnOiBbJ1pURScsICdDLU43NjAnXSxcbiAgICAgICAgJ1pURS1DIE44ODAnOiBbJ1pURScsICdDLU44ODAnXSxcbiAgICAgICAgJ1pURS1DIE44ODBTJzogWydaVEUnLCAnQy1OODgwJ10sXG4gICAgICAgICdaVEUtQyBOODgwcyc6IFsnWlRFJywgJ0MtTjg4MCddLFxuICAgICAgICAnWlRFLUMgWDUwMCc6IFsnWlRFJywgJ0MtWDUwMCddLFxuICAgICAgICAnWlRFLUMgWDkyMCc6IFsnWlRFJywgJ0MtWDkyMCddLFxuICAgICAgICAnWlhZLVpURS1DIFg5MjAnOiBbJ1pURScsICdDLVg5MjAnXSxcbiAgICAgICAgJ1pURSBHVjgyMSc6IFsnWlRFJywgJ0ctVjgyMSddLFxuICAgICAgICAnWlRFIE44ODBFJzogWydaVEUnLCAnTjg4MEUnXSxcbiAgICAgICAgJ1pURS1OODgwRSc6IFsnWlRFJywgJ044ODBFJ10sXG4gICAgICAgICdNSVVJIE44ODBTJzogWydaVEUnLCAnTjg4MFMnXSxcbiAgICAgICAgJ1pURSBOODgyRSc6IFsnWlRFJywgJ044ODJFJ10sXG4gICAgICAgICdaVEUgTjg1NUQnOiBbJ1pURScsICdOODU1RCddLFxuICAgICAgICAnWlRFLU45MTAnOiBbJ1pURScsICdOOTEwJ10sXG4gICAgICAgICdFODEwJzogWydaVEUnLCAnRTgxMCddLFxuICAgICAgICAndTg4MCc6IFsnWlRFJywgJ1U4ODAnXSxcbiAgICAgICAgJ1pURSBVODgwRSc6IFsnWlRFJywgJ1U4ODBFJ10sXG4gICAgICAgICdVODgwJzogWydaVEUnLCAnVTg4MCddLFxuICAgICAgICAnWlRFIFU5NzAnOiBbJ1pURScsICdVOTcwJ10sXG4gICAgICAgICdaVEUgVjc2OCc6IFsnWlRFJywgJ1Y3NjgnXSxcbiAgICAgICAgJ1pURS1WODU2JzogWydaVEUnLCAnVjg1NiddLFxuICAgICAgICAnWlRFIFY4NzdiJzogWydaVEUnLCAnVjg3NyddLFxuICAgICAgICAnWlRFIFY4ODlEJzogWydaVEUnLCAnVjg4OSddLFxuICAgICAgICAnWlRFLVo5OTAnOiBbJ1pURScsICdaOTkwJ10sXG4gICAgICAgICdaVEVVNzkwJzogWydaVEUnLCAnVTc5MCddLFxuICAgICAgICAnMDAzWic6IFsnWlRFJywgJ1NvZnRiYW5rIDAwM1onXSxcbiAgICAgICAgJzAwOFonOiBbJ1pURScsICdTb2Z0YmFuayAwMDhaJ10sXG4gICAgICAgICcwMDlaJzogWydaVEUnLCAnU29mdGJhbmsgU3RhcjcnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk2OTEnOiBbJ2ktTW9iaWxlJywgJ2k2OTEnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk2OTUnOiBbJ2ktTW9iaWxlJywgJ2k2OTUnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk4NTgnOiBbJ2ktTW9iaWxlJywgJ2k4NTgnXSxcbiAgICAgICAgJ2ktbW9iaWxlIDNHIDg1MDAnOiBbJ2ktTW9iaWxlJywgJzNHIDg1MDAnXSxcbiAgICAgICAgJ2ktbW9iaWxlIEktTm90ZSc6IFsnaS1Nb2JpbGUnLCAnaS1Ob3RlJywgJ3RhYmxldCddLFxuICAgICAgICAnT3B0aW11cyBCb3N0b24nOiBbJ09wdGltdXMnLCAnQm9zdG9uJ10sXG4gICAgICAgICdPcHRpbXVzIFNhbiBGcmFuY2lzY28nOiBbJ09wdGltdXMnLCAnU2FuIEZyYW5jaXNjbyddLFxuICAgICAgICAnT3B0aW11cyBNb250ZSBDYXJsbyc6IFsnT3B0aW11cycsICdNb250ZSBDYXJsbyddLFxuICAgICAgICAnT3JhbmdlIEJvc3Rvbic6IFsnT3JhbmdlJywgJ0Jvc3RvbiddLFxuICAgICAgICAnT3JhbmdlIE1vbnRlIENhcmxvJzogWydPcmFuZ2UnLCAnTW9udGUgQ2FybG8nXSxcbiAgICAgICAgJ1NhbiBGcmFuY2lzY28nOiBbJ09yYW5nZScsICdTYW4gRnJhbmNpc2NvJ10sXG4gICAgICAgICdTYW4gRnJhbmNpc2NvIGZvciBPcmFuZ2UnOiBbJ09yYW5nZScsICdTYW4gRnJhbmNpc2NvJ10sXG4gICAgICAgICdPcmFuZ2UgU2FuIEZyYW5jaXNjbyc6IFsnT3JhbmdlJywgJ1NhbiBGcmFuY2lzY28nXSxcbiAgICAgICAgJ01PVkUnOiBbJ1QtTW9iaWxlJywgJ01PVkUnXSxcbiAgICAgICAgJ1QtTW9iaWxlIEcxJzogWydULU1vYmlsZScsICdHMSddLFxuICAgICAgICAnVC1Nb2JpbGUgRzInOiBbJ1QtTW9iaWxlJywgJ0cyJ10sXG4gICAgICAgICdULU1vYmlsZSBHMiBUb3VjaCc6IFsnVC1Nb2JpbGUnLCAnRzInXSxcbiAgICAgICAgJ0xHLVA5OTknOiBbJ1QtTW9iaWxlJywgJ0cyeCddLFxuICAgICAgICAnTEctRTczOSc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCddLFxuICAgICAgICAnVC1Nb2JpbGUgbXlUb3VjaCAzRyc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCAzRyddLFxuICAgICAgICAnVC1Nb2JpbGUgbXlUb3VjaCAzRyBTbGlkZSc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCAzRyBTbGlkZSddLFxuICAgICAgICAnVC1Nb2JpbGUgRXNwcmVzc28nOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggM0cgU2xpZGUnXSxcbiAgICAgICAgJ0hUQyBteVRvdWNoIDNHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDNHIFNsaWRlJ10sXG4gICAgICAgICdULU1vYmlsZSBteVRvdWNoIDRHJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHJ10sXG4gICAgICAgICdIVEMgR2xhY2llcic6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCA0RyddLFxuICAgICAgICAnSFRDIFBhbmFjaGUnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ215VG91Y2g0Ryc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCA0RyddLFxuICAgICAgICAnTXkgVG91Y2ggNEcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBNeXRvdWNoIDRHJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHJ10sXG4gICAgICAgICdIVEMgTXkgVG91Y2ggNEcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBteXRvdWNoNGcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBteVRvdWNoIDRHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHIFNsaWRlJ10sXG4gICAgICAgICdteVRvdWNoIDRHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHIFNsaWRlJ10sXG4gICAgICAgICdULU1vYmlsZSBteVRvdWNoIFEnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggUSddLFxuICAgICAgICAnTEctQzgwMCc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCBRJ10sXG4gICAgICAgICdQdWxzZSBNaW5pJzogWydULU1vYmlsZScsICdQdWxzZSBNaW5pJ10sXG4gICAgICAgICdWb2RhZm9uZSA4NDUnOiBbJ1ZvZGFmb25lJywgJzg0NSBOb3ZhJ10sXG4gICAgICAgICdWb2RhZm9uZSA4NTgnOiBbJ1ZvZGFmb25lJywgJzg1OCBTbWFydCddLFxuICAgICAgICAnVm9kYWZvbmUgOTQ1JzogWydWb2RhZm9uZScsICc5NDUnXSxcbiAgICAgICAgJ1ZvZGFmb25lIFNtYXJ0IElJJzogWydWb2RhZm9uZScsICdTbWFydCBJSSddLFxuICAgICAgICAnU21hcnRUYWIxMCc6IFsnVm9kYWZvbmUnLCAnU21hcnRUYWIgMTAnLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtTjcxOSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBJSSddLFxuICAgICAgICAnQ29vbHBhZCA4MTkwJzogWydDb29scGFkJywgJzgxOTAnXSxcbiAgICAgICAgJ1U3MDVUJzogWydPcHBvJywgJ1VsaWtlMiddLFxuICAgICAgICAnQ29vbHBhZCA4MDIwKyc6IFsnQ29vbHBhZCcsICc4MDIwJ10sXG4gICAgICAgICdIdWF3ZWkgWTMxMC01MDAwJzogWydIdWF3ZWknLCAnWTMxMCddLFxuICAgICAgICAnR1QtUzc1NzInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRyZW5kIER1b3MgSUknXSxcbiAgICAgICAgJ0xlbm92byBBMjc4dCc6IFsnTGVub3ZvJywgJ0EyNzh0J10sXG4gICAgICAgICdMZW5vdm8gQTY5MCc6IFsnTGVub3ZvJywgJ0E2OTAnXSxcbiAgICAgICAgJ0dULUk4MjYyRCc6IFsnU2Ftc3VuZycsICdMZVBob25lIEk4MjYyRCddLFxuICAgICAgICAnTGVub3ZvIEEyNzh0JzogWydMZW5vdm8nLCAnQTI3OHQnXSxcbiAgICAgICAgJ01JIDJDJzogWydYaWFvbWknLCAnTUktVFdPJ10sXG4gICAgICAgICdDb29scGFkIDgwNzAnOiBbJ0Nvb2xwYWQnLCAnODA3MCddLFxuICAgICAgICAnUjgxM1QnOiBbJ09wcG8nLCAnUjgxM1QnXSxcbiAgICAgICAgJ1pURSBVOTMwJzogWydaVEUnLCAnVTkzMCddLFxuICAgICAgICAnTGVub3ZvIEEzNjAnOiBbJ0xlbm92bycsICdMZVBob25lIEEzNjAnXSxcbiAgICAgICAgJ1NDSC1ONzE5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdDb29scGFkIDgwMTAnOiBbJ0Nvb2xwYWQnLCAnODAxMCddLFxuICAgICAgICAnTEVOT1ZPLUxlbm92by1BMjg4dCc6IFsnTGVub3ZvJywgJ0EyODh0J10sXG4gICAgICAgICdVNzAxVCc6IFsnT3BwbycsICdVNzAxVCddLFxuICAgICAgICAnWlRFVTc5NSc6IFsnQ29vbHBhZCcsICdVNzk1J10sXG4gICAgICAgICdIYWllci1IVC1JNjE3JzogWydIYWllcicsICdJNjE3J10sXG4gICAgICAgICdaVEVVODgwcyc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnR1QtUzYzNTInOiBbJ1NhbXN1bmcnLCAnR1QtUzYzNTInXSxcbiAgICAgICAgJ0dULVM3NTY4JzogWydTYW1zdW5nJywgJ0dULVM3NTY4J10sXG4gICAgICAgICdLLVRvdWNoIFQ2MTkrJzogWydLLVRvdWNoJywgJ1Q2MTknXSxcbiAgICAgICAgJ01JIDJBJzogWydYaWFvbWknLCAnTUktVFdPIEEnXSxcbiAgICAgICAgJ0dULU43MTA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdLLVRvdWNoIFQ2MjEnOiBbJ0stVG91Y2gnLCAnVDYyMSddLFxuICAgICAgICAnTEVOT1ZPLUxlbm92by1BMjk4dCc6IFsnTGVub3ZvJywgJ0EyOTgnXSxcbiAgICAgICAgJ0Nvb2xwYWQgODE1MCc6IFsnQ29vbHBhZCcsICc4MTUwJ10sXG4gICAgICAgICc1ODYwUyc6IFsnQ29vbHBhZCcsICc1ODYwJ10sXG4gICAgICAgICdaVEVVODA3JzogWydaVEUnLCAnVTgwNyddLFxuICAgICAgICAnU0NILUk3MzknOiBbJ1NhbXN1bmcnLCAnU0NILUk3MzknXSxcbiAgICAgICAgJ1NDSC1JODI5JzogWydTYW1zdW5nJywgJ1NDSC1JODI5J10sXG4gICAgICAgICdIUy1FODMwJzogWydIaXNlbnNlJywgJ0U4MzAnXSxcbiAgICAgICAgJ0hTLUU5MjAnOiBbJ0hpc2Vuc2UnLCAnRTkyMCddLFxuICAgICAgICAnTGVub3ZvIFM3MjAnOiBbJ0xlbm92bycsICdTNzIwJ10sXG4gICAgICAgICdNSSAyQyc6IFsnWGlhb21pJywgJ01JLVRXTyddLFxuICAgICAgICAnT1BQTyBSODEzVCc6IFsnT3BwbycsICdSODEzJ10sXG4gICAgICAgICdTQ0gtSTg3OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnR1QtUzYxMDJFJzogWydTYW1zdW5nJywgJ0dhbGF4eSBZIER1b3MnXVxuICAgIH1cblxuICAgIHZhciBCTEFDS0JFUlJZX01PREVMUyA9IHtcbiAgICAgICAgJzk2MDAnOiAnQm9sZCcsXG4gICAgICAgICc5NjUwJzogJ0JvbGQnLFxuICAgICAgICAnOTcwMCc6ICdCb2xkJyxcbiAgICAgICAgJzk3ODAnOiAnQm9sZCcsXG4gICAgICAgICc5NzkwJzogJ0JvbGQnLFxuICAgICAgICAnOTkwMCc6ICdCb2xkJyxcbiAgICAgICAgJzk5MzAnOiAnQm9sZCcsXG4gICAgICAgICc4MzAwJzogJ0N1cnZlJyxcbiAgICAgICAgJzgzMTAnOiAnQ3VydmUnLFxuICAgICAgICAnODMyMCc6ICdDdXJ2ZScsXG4gICAgICAgICc4MzMwJzogJ0N1cnZlJyxcbiAgICAgICAgJzgzNTBpJzogJ0N1cnZlJyxcbiAgICAgICAgJzg1MjAnOiAnQ3VydmUnLFxuICAgICAgICAnODUzMCc6ICdDdXJ2ZScsXG4gICAgICAgICc4OTAwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkyMjAnOiAnQ3VydmUnLFxuICAgICAgICAnOTMwMCc6ICdDdXJ2ZScsXG4gICAgICAgICc5MzMwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkzNTAnOiAnQ3VydmUnLFxuICAgICAgICAnOTM2MCc6ICdDdXJ2ZScsXG4gICAgICAgICc5MzcwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkzODAnOiAnQ3VydmUnLFxuICAgICAgICAnODEwMCc6ICdQZWFybCcsXG4gICAgICAgICc4MTEwJzogJ1BlYXJsJyxcbiAgICAgICAgJzgxMjAnOiAnUGVhcmwnLFxuICAgICAgICAnODEzMCc6ICdQZWFybCcsXG4gICAgICAgICc4MjIwJzogJ1BlYXJsJyxcbiAgICAgICAgJzgyMzAnOiAnUGVhcmwnLFxuICAgICAgICAnOTEwMCc6ICdQZWFybCcsXG4gICAgICAgICc5MTA1JzogJ1BlYXJsJyxcbiAgICAgICAgJzk1MzAnOiAnU3Rvcm0nLFxuICAgICAgICAnOTU1MCc6ICdTdG9ybScsXG4gICAgICAgICc5NjcwJzogJ1N0eWxlJyxcbiAgICAgICAgJzk4MDAnOiAnVG9yY2gnLFxuICAgICAgICAnOTgxMCc6ICdUb3JjaCcsXG4gICAgICAgICc5ODUwJzogJ1RvcmNoJyxcbiAgICAgICAgJzk4NjAnOiAnVG9yY2gnLFxuICAgICAgICAnOTYzMCc6ICdUb3VyJyxcbiAgICAgICAgJzk5ODEnOiAnUG9yc2NoZSBQJ1xuICAgIH07XG5cblxuICAgIHZhciBWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICB9O1xuICAgIFZlcnNpb24ucHJvdG90eXBlID0ge1xuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IHYudmFsdWUgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWxpYXMgPSB2LmFsaWFzIHx8IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBEZXRlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9O1xuICAgIERldGVjdGVkLnByb3RvdHlwZSA9IHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHVhLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdXNlRmVhdHVyZXM6IG9wdGlvbnMgJiYgb3B0aW9ucy51c2VGZWF0dXJlcyB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXRlY3RDYW1vdWZsYWdlOiBvcHRpb25zICYmIG9wdGlvbnMuZGV0ZWN0Q2Ftb3VmbGFnZSB8fCB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYnJvd3NlciA9IHtcbiAgICAgICAgICAgICAgICAnc3RvY2snOiB0cnVlLFxuICAgICAgICAgICAgICAgICdoaWRkZW4nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAnY2hhbm5lbCc6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSB7fTtcbiAgICAgICAgICAgIHRoaXMub3MgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlID0ge1xuICAgICAgICAgICAgICAgICd0eXBlJzogJ2Rlc2t0b3AnLFxuICAgICAgICAgICAgICAgICdpZGVudGlmaWVkJzogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5kZXRlY3QodWEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRldGVjdDogZnVuY3Rpb24gKHVhKSB7XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFVuaXhcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1VuaXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdVbml4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRnJlZUJTRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRnJlZUJTRCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0ZyZWVCU0QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBPcGVuQlNEXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdPcGVuQlNEJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnT3BlbkJTRCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5ldEJTRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTmV0QlNEJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTmV0QlNEJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU3VuT1NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1N1bk9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU29sYXJpcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIExpbnV4XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0xpbnV4JztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQ2VudE9TJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0NlbnRPUyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9DZW50T1NcXC9bMC05XFwuXFwtXStlbChbMC05X10rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0ucmVwbGFjZSgvXy9nLCAnLicpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRGViaWFuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0RlYmlhbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdGZWRvcmEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnRmVkb3JhJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0ZlZG9yYVxcL1swLTlcXC5cXC1dK2ZjKFswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnR2VudG9vJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0dlbnRvbyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdLdWJ1bnR1JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0t1YnVudHUnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTWFuZHJpdmEgTGludXgnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWFuZHJpdmEnO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTWFuZHJpdmEgTGludXhcXC9bMC05XFwuXFwtXSttZHYoWzAtOV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNYWdlaWEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWFnZWlhJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01hZ2VpYVxcL1swLTlcXC5cXC1dK21nYShbMC05XSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1JlZCBIYXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnUmVkIEhhdCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9SZWQgSGF0W15cXC9dKlxcL1swLTlcXC5cXC1dK2VsKFswLTlfXSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTbGFja3dhcmUnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2xhY2t3YXJlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NVU0UnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU1VTRSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUdXJib2xpbnV4JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1R1cmJvbGludXgnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnVWJ1bnR1JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1VidW50dSc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9VYnVudHVcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgaU9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdpUGhvbmUoIFNpbXVsYXRvcik/OycpIHx8IHVhLm1hdGNoKCdpUGFkOycpIHx8IHVhLm1hdGNoKCdpUG9kOycpIHx8IHVhLm1hdGNoKC9pUGhvbmVcXHMqXFxkKnM/W2NwXT87L2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ2lPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9PUyAoLiopIGxpa2UgTWFjIE9TIFgvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdpUGhvbmUgU2ltdWxhdG9yOycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodWEubWF0Y2goJ2lQb2Q7JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtZWRpYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBcHBsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ2lQb2QgVG91Y2gnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodWEubWF0Y2goJ2lQaG9uZTsnKSB8fCB1YS5tYXRjaCgvaVBob25lXFxzKlxcZCpzP1tjcF0/Oy9pKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBcHBsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ2lQaG9uZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQXBwbGUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdpUGFkJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTWFjT1MgWFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGVsc2UgaWYgKHVhLm1hdGNoKCdNYWMgT1MgWCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01hYyBPUyBYJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWCAoMTBbMC05XFwuX10qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLnJlcGxhY2UoL18vZywgJy4nKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdpbmRvd3NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dpbmRvd3MnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9XaW5kb3dzIE5UIChbMC05XVxcLlswLTldKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gcGFyc2VWZXJzaW9uKG1hdGNoWzFdKTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJ1Zpc3RhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNS4yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6ICdTZXJ2ZXIgMjAwMydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzUuMSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnWFAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc1LjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzIwMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJ05UICcgKyB0aGlzLm9zLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyA5NScpIHx8IHVhLm1hdGNoKCdXaW45NScpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC4wMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnOTUnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyA5OCcpIHx8IHVhLm1hdGNoKCdXaW45OCcpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC4xMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnOTgnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBNRScpIHx8IHVhLm1hdGNoKCdXaW5NRScpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC45MCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC45JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnTUUnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBYUCcpIHx8IHVhLm1hdGNoKCdXaW5YUCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNS4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnWFAnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV1A3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgUGhvbmUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzcuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5tb2RlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBDRScpIHx8IHVhLm1hdGNoKCdXaW5DRScpIHx8IHVhLm1hdGNoKCdXaW5kb3dzQ0UnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBNb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA4JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi41JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgQ0UnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93c0NFT1NcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1dpbmRvd3MgQ0UgKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdXaW5kb3dzIE1vYmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93c01vYmlsZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBQaG9uZSBbMC05XScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1YS5tYXRjaCgvV2luZG93cyBQaG9uZSAoWzAtOS5dKikvKVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dpbmRvd3MgUGhvbmUgT1MnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBQaG9uZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1YS5tYXRjaCgvV2luZG93cyBQaG9uZSBPUyAoWzAtOS5dKikvKVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbiA8IDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSUVNb2JpbGVcXC9bXjtdKzsgKFteO10rKTsgKFteO10rKVs7fFxcKV0vLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hbnVmYWN0dXJlciA9IHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFdJTkRPV1NfUEhPTkVfTU9ERUxTW21hbnVmYWN0dXJlcl0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBXSU5ET1dTX1BIT05FX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFdJTkRPV1NfUEhPTkVfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBXSU5ET1dTX1BIT05FX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hbnVmYWN0dXJlciA9PT0gJ01pY3Jvc29mdCcgJiYgbW9kZWwgPT09ICdYRGV2aWNlRW11bGF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlbXVsYXRvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQW5kcm9pZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0FuZHJvaWQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdBbmRyb2lkJztcbiAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0FuZHJvaWQoPzogKT8oPzpBbGxQaG9uZV98Q3lhbm9nZW5Nb2RfKT8oPzpcXC8pP3Y/KFswLTkuXSspLy5leGVjKHVhLnJlcGxhY2UoJy11cGRhdGUnLCAnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdBbmRyb2lkIEVjbGFpcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24gPj0gMykgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24gPj0gNCAmJiB1YS5tYXRjaCgnTW9iaWxlJykpIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9FY2xhaXI7ICg/OlthLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/KSBCdWlsZFxcLyhbXlxcL10qKVxcLy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gLzsgKFteO10qW147XFxzXSlcXHMrQnVpbGQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC9bYS16QS1aXVthLXpBLVpdKD86Wy1fXVthLXpBLVpdW2EtekEtWl0pPzsgKFteO10qW147XFxzXSk7XFxzK0J1aWxkLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTtVO0FuZHJvaWRcXC9bXjtdKztbMC05XStcXCpbMC05XSs7Q1RDXFwvMi4wXFwpLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvO1xccz8oW147XSspO1xccz9bMC05XStcXCpbMC05XSs7XFxzP0NUQ1xcLzIuMC8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL3poLWNuO1xccyooLio/KShcXC98YnVpbGQpL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL0FuZHJvaWQgW147XSs7ICg/OlthLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/OyApPyhbXildKylcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdWEubWF0Y2goL1thLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/LykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL14oLis/KVxcL1xcUysvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgLyogU29tZXRpbWVzIHdlIGdldCBhIG1vZGVsIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBBbmRyb2lkLCBpbiB0aGF0IGNhc2UgaXQgaXMgYSBtaXNtYXRjaCBhbmQgd2Ugc2hvdWxkIGlnbm9yZSBpdCAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS5tb2RlbCAmJiB0aGlzLmRldmljZS5tb2RlbC5zdWJzdHJpbmcoMCwgNykgPT09ICdBbmRyb2lkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV2aWNlLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdICE9PSAndW5kZWZpbmVkJykgdGhpcy5kZXZpY2UudHlwZSA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsID09PSAnRW11bGF0b3InIHx8IG1vZGVsID09PSAneDg2IEVtdWxhdG9yJyB8fCBtb2RlbCA9PT0gJ3g4NiBWaXJ0dWFsQm94JyB8fCBtb2RlbCA9PT0gJ3ZtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0hQIGVTdGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0hQJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnZVN0YXRpb24nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ByZVxcLzEuMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdQYWxtJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1BhbG0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQcmUgUGx1cyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ByZVxcLzEuMicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdQYWxtJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlIDInO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQcmVcXC8zLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnSFAnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQcmUgMyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1BpeGlcXC8xLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGFsbSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1BpeGknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQaXhpXFwvMS4xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1BhbG0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQaXhpIFBsdXMnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQMTYwVU4/QT9cXC8xLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnSFAnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdWZWVyJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBHb29nbGUgVFZcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0dvb2dsZVRWJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnR29vZ2xlIFRWJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQ2hyb21lLzUuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcxJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0Nocm9tZS8xMS4nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzInXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdvUGhvbmVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dvUGhvbmUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXb1Bob25lJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Xb1Bob25lXFwvKFswLTlcXC5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJsYWNrQmVycnlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0JsYWNrQmVycnknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdCbGFja0JlcnJ5IE9TJztcblxuICAgICAgICAgICAgICAgIGlmICghdWEubWF0Y2goJ09wZXJhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0JsYWNrQmVycnkoWzAtOV0qKVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLzsgQmxhY2tCZXJyeSAoWzAtOV0qKTsvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbiA+PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRldmljZS5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQkxBQ0tCRVJSWV9NT0RFTFNbdGhpcy5kZXZpY2UubW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0JsYWNrQmVycnkgJyArIEJMQUNLQkVSUllfTU9ERUxTW3RoaXMuZGV2aWNlLm1vZGVsXSArICcgJyArIHRoaXMuZGV2aWNlLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5ICcgKyB0aGlzLmRldmljZS5tb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQmxhY2tCZXJyeSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1JJTSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBCbGFja0JlcnJ5IFBsYXlCb29rXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdSSU0gVGFibGV0IE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQmxhY2tCZXJyeSBUYWJsZXQgT1MnO1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVhLm1hdGNoKC9SSU0gVGFibGV0IE9TIChbMC05Ll0qKS8pWzFdLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUklNJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5IFBsYXlCb29rJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVhLm1hdGNoKCdQbGF5Qm9vaycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oMTBbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdSSU0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5IFBsYXlCb29rJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgV2ViT1NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJyg/OndlYnxocHcpT1MnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICd3ZWJPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdWEubWF0Y2goLyg/OndlYnxocHcpT1NcXC8oWzAtOS5dKikvKVsxXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCd0YWJsZXQnKSkgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gdWEubWF0Y2goJ2hwd09TJykgPyAnSFAnIDogJ1BhbG0nO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZSc7XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQcmVcXC8xLjEnKSkgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlIFBsdXMnO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4yJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZTInO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMy4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZTMnO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUGl4aVxcLzEuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdQaXhpJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1BpeGlcXC8xLjEnKSkgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGl4aSBQbHVzJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1AxNjBVTj9BP1xcLzEuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdWZWVyJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1RvdWNoUGFkXFwvMS4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1RvdWNoUGFkJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRW11bGF0b3JcXC8nKSB8fCB1YS5tYXRjaCgnRGVza3RvcFxcLycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFM2MFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU3ltYmlhbicpIHx8IHVhLm1hdGNoKCdTZXJpZXNbIF0/NjAnKSB8fCB1YS5tYXRjaCgnUzYwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2VyaWVzNjAnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTeW1iaWFuT1MvOS4xJykgJiYgIXVhLm1hdGNoKCdTZXJpZXM2MCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMy4wJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvU2VyaWVzNjBcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWEoW15cXC87XSspW1xcL3w7XS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQnJvd3NlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdOb2tpYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVmVydHUoW15cXC87XSspW1xcL3w7XS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1ZlcnR1JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1N5bWJpYW47IFU7IChbXjtdKyk7IFthLXpdW2Etel1cXC1bYS16XVthLXpdL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1NhbXN1bmdcXC8oW147XSopOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19TQU1TVU5HO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFM0MFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2VyaWVzNDAnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdTZXJpZXM0MCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWEoW15cXC9dKylcXC8vLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdOb2tpYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTWVlR29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01lZUdvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWVlR28nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Ob2tpYShbXlxcKV0rKVxcKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNYWVtb1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTWFlbW8nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdNYWVtbyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhOWzAtOV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBUaXplblxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnVGl6ZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdUaXplbic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVGl6ZW5bXFwvIF0oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgKFteXFwvXSspXFwvLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICdMaW51eCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUSVpFTl9NT0RFTFNbdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFRJWkVOX01PREVMU1t0aGlzLmRldmljZS5tYW51ZmFjdHVyZXJdW3RoaXMuZGV2aWNlLm1vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFudWZhY3R1cmVyID0gdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBUSVpFTl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBUSVpFTl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJhZGFcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1tifEJdYWRhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQmFkYSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvW2J8Ql1hZGFcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgKFteXFwvXSspXFwvLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQkFEQV9NT0RFTFNbdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEJBREFfTU9ERUxTW3RoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcl1bdGhpcy5kZXZpY2UubW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFudWZhY3R1cmVyID0gdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSBjbGVhbnVwTW9kZWwodGhpcy5kZXZpY2UubW9kZWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IEJBREFfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEJBREFfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJyZXdcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL0JSRVcvaSkgfHwgdWEubWF0Y2goJ0JNUDsgVScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JyZXcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9CUkVXOyBVOyAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC87QlJFV1xcLyhbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXCgoW147XSspO1U7UkVYXFwvW147XSs7QlJFV1xcL1teO10rOyg/Oi4qOyk/WzAtOV0rXFwqWzAtOV0rO0NUQ1xcLzIuMFxcKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJSRVdfTU9ERUxTW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IEJSRVdfTU9ERUxTW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQlJFV19NT0RFTFNbbW9kZWxdWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE1US1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvXFwoTVRLOy8pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01USyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDck9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdDck9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQ2hyb21lIE9TJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBKb2xpIE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdKb2xpIE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnSm9saSBPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdkZXNrdG9wJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Kb2xpIE9TXFwvKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSGFpa3VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0hhaWt1JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnSGFpa3UnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZGVza3RvcCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFFOWFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUU5YJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnUU5YJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE9TLzIgV2FycFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT1NcXC8yOyBXYXJwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnT1MvMiBXYXJwJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09TXFwvMjsgV2FycCAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBHcmlkIE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdHcmlkIE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnR3JpZCBPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0dyaWQgT1MgKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQW1pZ2FPU1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvQW1pZ2FPUy9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdBbWlnYU9TJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0FtaWdhT1MgKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNb3JwaE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9Nb3JwaE9TL2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01vcnBoT1MnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTW9ycGhPUyAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEtpbmRsZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnS2luZGxlJykgJiYgIXVhLm1hdGNoKCdGaXJlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBbWF6b24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0tpbmRsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlcmVhZGVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnS2luZGxlXFwvMi4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0tpbmRsZSAyJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0tpbmRsZVxcLzMuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdLaW5kbGUgMyBvciBsYXRlcic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTk9PS1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnbm9vayBicm93c2VyJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQW5kcm9pZCc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQmFybmVzICYgTm9ibGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ05PT0snO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZXJlYWRlcic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJvb2tlZW5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ2Jvb2tlZW5cXC9jeWJvb2snKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0Jvb2tlZW4nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0N5Ym9vayc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlcmVhZGVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT3Jpem9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQ3lib29rIE9yaXpvbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNvbnkgUmVhZGVyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdFQlJEMTEwMScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUmVhZGVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2VyZWFkZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBpUml2ZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0lyaXZlciA7JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdpUml2ZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1N0b3J5JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2VyZWFkZXInO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdFQjA3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnU3RvcnkgSEQgRUIwNyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5pbnRlbmRvXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjMwIChOaW50ZW5kbyBXaWk7IFU7IDsgMzY0MjsgZW4pXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuMzAgKE5pbnRlbmRvIFdpaTsgVTsgOyAyMDQ3LTc7IGVuKVxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjUwIChOaW50ZW5kbyBEU2k7IE9wZXJhLzUwNzsgVTsgZW4tVVMpXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChOaW50ZW5kbyAzRFM7IFU7IDsgZW4pIFZlcnNpb24vMS43NDU1LlVTXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChOaW50ZW5kbyAzRFM7IFU7IDsgZW4pIFZlcnNpb24vMS43NDU1LkVVXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyBXaWknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdXaWknO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyBEU2knKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdEU2knO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyAzRFMnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICczRFMnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9WZXJzaW9uXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQbGF5U3RhdGlvbiBQb3J0YWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGxheXN0YXRpb24gUG9ydGFibGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQbGF5U3RhdGlvbiBWaXRhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9QbGF5U3RhdGlvbiBWaXRhIChbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQbGF5U3RhdGlvbiBWaXRhJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2dhbWluZyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvUGxheVN0YXRpb24gMy9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1BMQVlTVEFUSU9OIDM7PyAoWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGxheXN0YXRpb24gMyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdnYW1pbmcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBQYW5hc29uaWMgU21hcnQgVmllcmFcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChGcmVlQlNEOyBVOyBWaWVyYTsgamEtSlApIEFwcGxlV2ViS2l0LzUzNS4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmllcmEvMS4yLjQgQ2hyb21lLzE0LjAuODM1LjIwMiBTYWZhcmkvNTM1LjFcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ZpZXJhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGFuYXNvbmljJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBWaWVyYSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTaGFycCBBUVVPUyBUVlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERUVikgQXBwbGVXZWJLaXQvNTMxLjIgIChLSFRNTCwgbGlrZSBHZWNrbykgQVFVT1NCcm93c2VyLzEuMCAoVVMwMERUVjtWOzAwMDE7MDAwMSlcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERUVikgQXBwbGVXZWJLaXQvNTMxLjIrIChLSFRNTCwgbGlrZSBHZWNrbykgRXNwaWFsLzYuMC40IEFRVU9TQnJvd3Nlci8xLjAgKENIMDBEVFY7VjswMDAxOzAwMDEpXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bDsgVTsgZW4pIFByZXN0by8yLjguMTE1IFZlcnNpb24vMTEuMTAgQVFVT1MtQVMvMS4wIExDLTQwTEU4MzVYXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdBUVVPU0Jyb3dzZXInKSB8fCB1YS5tYXRjaCgnQVFVT1MtQVMnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0hBUlA7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQXF1b3MgVFYnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU2Ftc3VuZyBTbWFydCBUVlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKFNtYXJ0SHViOyBTTUFSVC1UVjsgVTsgTGludXgvU21hcnRUVjsgTWFwbGUyMDEyKSBBcHBsZVdlYktpdC81MzQuNyAoS0hUTUwsIGxpa2UgR2Vja28pIFNtYXJ0VFYgU2FmYXJpLzUzNC43XG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChTbWFydEh1YjsgU01BUlQtVFY7IFU7IExpbnV4L1NtYXJ0VFYpIEFwcGxlV2ViS2l0LzUzMS4yKyAoS0hUTUwsIGxpa2UgR2Vja28pIFdlYkJyb3dzZXIvMS4wIFNtYXJ0VFYgU2FmYXJpLzUzMS4yK1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU01BUlQtVFYnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0FNU1VORztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBUVic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYXBsZShbMC05XSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCArPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNvbnkgSW50ZXJuZXQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY3bDsgVTsgSW5ldHR2QnJvd3Nlci8yLjIoMDAwMTRBO1NvbnlEVFYxMTU7MDAwMjswMTAwKSBLREwtNDZFWDY0MDsgQ0MvVVNBOyBlbikgUHJlc3RvLzIuOC4xMTUgVmVyc2lvbi8xMS4xMFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBhcm12N2w7IFU7IEluZXR0dkJyb3dzZXIvMi4yKDAwMDE0QTtTb255RFRWMTE1OzAwMDI7MDEwMCkgS0RMLTQwRVg2NDA7IENDL1VTQTsgZW4pIFByZXN0by8yLjEwLjI1MCBWZXJzaW9uLzExLjYwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY3bDsgVTsgSW5ldHR2QnJvd3Nlci8yLjIoMDAwMTRBO1NvbnlEVFYxMTU7MDAwMjswMTAwKSBOL0E7IENDL1VTQTsgZW4pIFByZXN0by8yLjguMTE1IFZlcnNpb24vMTEuMTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggbWlwczsgVTsgSW5ldHR2QnJvd3Nlci8yLjIgKDAwMDE0QTtTb255RFRWMTE1OzAwMDI7MDEwMCkgOyBDQy9KUE47IGVuKSBQcmVzdG8vMi45LjE2NyBWZXJzaW9uLzExLjUwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IG1pcHM7IFU7IEluZXR0dkJyb3dzZXIvMi4yICgwMDAxNEE7U29ueURUVjExNTswMDAyOzAxMDApIEFaMkNWVDI7IENDL0NBTjsgZW4pIFByZXN0by8yLjcuNjEgVmVyc2lvbi8xMS4wMFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBhcm12Nmw7IE9wZXJhIFRWIFN0b3JlLzQyMDc7IFU7IChTb255QkRQL0JEVjExKTsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggYXJtdjZsIDsgVTsgKFNvbnlCRFAvQkRWMTEpOyBlbikgUHJlc3RvLzIuNi4zMyBWZXJzaW9uLzEwLjYwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bDsgVTsgKFNvbnlCRFAvQkRWMTEpOyBlbikgUHJlc3RvLzIuOC4xMTUgVmVyc2lvbi8xMS4xMFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU29ueURUVnxTb255QkRQfFNvbnlDRUJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdJbnRlcm5ldCBUVic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgUGhpbGlwcyBOZXQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuNzAgKExpbnV4IGFybXY2bCA7IFU7IENFLUhUTUwvMS4wIE5FVFRWLzIuMC4yOyBlbikgUHJlc3RvLzIuMi4xXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bCA7IFU7IENFLUhUTUwvMS4wIE5FVFRWLzMuMC4xOzsgZW4pIFByZXN0by8yLjYuMzMgVmVyc2lvbi8xMC42MFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBtaXBzOyBVOyBDRS1IVE1MLzEuMCBORVRUVi8zLjAuMTsgUEhJTElQUy1BVk0tMjAxMjsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggbWlwcyA7IFU7IEhiYlRWLzEuMS4xICg7IFBoaWxpcHM7IDsgOyA7ICkgQ0UtSFRNTC8xLjAgTkVUVFYvMy4xLjA7IGVuKSBQcmVzdG8vMi42LjMzIFZlcnNpb24vMTAuNzBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggaTY4NjsgVTsgSGJiVFYvMS4xLjEgKDsgUGhpbGlwczsgOyA7IDsgKSBDRS1IVE1MLzEuMCBORVRUVi8zLjEuMDsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05FVFRWXFwvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGhpbGlwcyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnTmV0IFRWJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBMRyBOZXRDYXN0IFRWXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRGlyZWN0RkI7IExpbnV4IGFybXY3bCkgQXBwbGVXZWJLaXQvNTM0LjI2KyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNS4wIFNhZmFyaS81MzQuMjYrIExHIEJyb3dzZXIvNS4wMC4wMCgrbW91c2UrM0QrU0NSRUVOK1RVTkVSOyBMR0U7IEdMT0JBTC1QTEFUNDsgMDMuMDkuMjI7IDB4MDAwMDAwMDE7KTsgTEcgTmV0Q2FzdC5UVi0yMDEyXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChEaXJlY3RGQjsgTGludXggYXJtdjdsKSBBcHBsZVdlYktpdC81MzQuMjYrIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi81LjAgU2FmYXJpLzUzNC4yNisgTEcgQnJvd3Nlci81LjAwLjAwKCtTQ1JFRU4rVFVORVI7IExHRTsgR0xPQkFMLVBMQVQ0OyAwMS4wMC4wMDsgMHgwMDAwMDAwMTspOyBMRyBOZXRDYXN0LlRWLTIwMTJcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERpcmVjdEZCOyBVOyBMaW51eCBhcm12Nmw7IGVuKSBBcHBsZVdlYktpdC81MzEuMiAgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkvNTMxLjIgIExHIEJyb3dzZXIvNC4xLjQoIEJEUDsgTEdFOyBNZWRpYS9CRDY2MDsgNjk3MDsgYWJjOyk7IExHIE5ldENhc3QuTWVkaWEtMjAxMVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRGlyZWN0RkI7IFU7IExpbnV4IDc2MzE7IGVuKSBBcHBsZVdlYktpdC81MzEuMiAgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkvNTMxLjIgIExHIEJyb3dzZXIvNC4xLjQoIE5PX05VTTsgTEdFOyBNZWRpYS9TUDUyMDsgU1QuMy45Ny40MDkuRjsgMHgwMDAwMDAwMTspOyBMRyBOZXRDYXN0Lk1lZGlhLTIwMTFcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERpcmVjdEZCOyBVOyBMaW51eCA3NjMwOyBlbikgQXBwbGVXZWJLaXQvNTMxLjIgIChLSFRNTCwgbGlrZSBHZWNrbykgU2FmYXJpLzUzMS4yICBMRyBCcm93c2VyLzQuMS40KCAzRCBCRFAgTk9fTlVNOyBMR0U7IE1lZGlhL1NUNjAwOyBMRyBOZXRDYXN0Lk1lZGlhLTIwMTFcbiAgICAgICAgICAgICAqICAgICAgKExHU21hcnRUVi8xLjApIEFwcGxlV2ViS2l0LzUzNC4yMyBPQklHTy1UMTAvMi4wXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0xHIE5ldENhc3RcXC4oPzpUVnxNZWRpYSktKFswLTldKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19MRztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdOZXRDYXN0IFRWICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvTEdTbWFydFRWLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfTEc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnU21hcnQgVFYnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRvc2hpYmEgU21hcnQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChMaW51eCBtaXBzZWw7IFU7IEhiYlRWLzEuMS4xICg7IFRPU0hJQkE7IERUVl9STDk1MzsgNTYuNy42Ni43OyB0MTI7ICkgOyBUb3NoaWJhVFAvMS4zLjAgKCtWSURFT19NUDQrVklERU9fWF9NU19BU0YrQVVESU9fTVBFRytBVURJT19NUDQrRFJNK05BVElWRUxBVU5DSCkgOyBlbikgQXBwbGVXZWJLaXQvNTM0LjEgKEtIVE1MLCBsaWtlIEdlY2tvKVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRFRWOyBUU0JOZXRUVi9UMzIwMTM3MTMuMDIwMy43REQ7IFRWd2l0aFZpZGVvUGxheWVyOyBsaWtlIEdlY2tvKSBOZXRGcm9udC80LjEgRFRWTmV0QnJvd3Nlci8yLjIgKDAwMDAzOTtUMzIwMTM3MTM7MDIwMzs3REQpIEluZXR0dkJyb3dzZXIvMi4yICgwMDAwMzk7VDMyMDEzNzEzOzAyMDM7N0REKVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoTGludXggbWlwc2VsOyBVOyBIYmJUVi8xLjEuMSAoOyBUT1NISUJBOyA0MFBYMjAwOyAwLjcuMy4wLjsgdDEyOyApIDsgVG9zaGliYV9UUC8xLjMuMCAoK1ZJREVPX01QNCtBVURJT19NUEVHK0FVRElPX01QNCtWSURFT19YX01TX0FTRitPRkZMSU5FQVBQKSA7IGVuKSBBcHBsZVdlYktpdC81MzQuMSAoS0hUTUwsIGxpa2UgR2VjXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUb3NoaWJhXz9UUFxcLycpIHx8IHVhLm1hdGNoKCdUU0JOZXRUVlxcLycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Rvc2hpYmEnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1NtYXJ0IFRWJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNYWNoQmx1ZSBYVFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9tYnh0V2ViS2l0XFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ01hY2hCbHVlIFhUJ1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBBREJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoQURCOyAoW15cXCldKylcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0FEQic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAobWF0Y2hbMV0gIT09ICdVbmtub3duJyA/IG1hdGNoWzFdLnJlcGxhY2UoJ0FEQicsICcnKSArICcgJyA6ICcnKSArICdJUFRWIHJlY2VpdmVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNU3RhclxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvTXN0YXI7T1dCLykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTVN0YXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1BWUic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09yaWd5biBXZWIgQnJvd3Nlcic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRlY2huaVNhdFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXFRlY2huaVNhdCAoW147XSspOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVGVjaG5pU2F0JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRlY2huaWNvbG9yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1xcVGVjaG5pY29sb3JfKFteO10rKTsvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1RlY2huaWNvbG9yJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdpbmJveCBFdm8yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1dpbmJveCBFdm8yLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdXaW5ib3gnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0V2bzInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFJva3VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXlJva3VcXC9EVlAtKFswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Jva3UnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnSEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwNTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnWEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIxMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnWERTJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcyNDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0xUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICczMDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJzIgSEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzMwNTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnMiBYRCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMzEwMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICcyIFhTJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvSGJiVFZcXC8xLjEuMSBcXChbXjtdKjtcXHMqKFteO10qKVxccyo7XFxzKihbXjtdKilcXHMqOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVuZG9yTmFtZSA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB2YXIgbW9kZWxOYW1lID0gbWF0Y2hbMl0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdmVuZG9yTmFtZSAhPT0gJycgJiYgdmVuZG9yTmFtZSAhPT0gJ3ZlbmRvck5hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodmVuZG9yTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTEdFJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTEcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVE9TSElCQSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Rvc2hpYmEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc21hcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTbWFydCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0djJuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVFYyTic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHZlbmRvck5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGV2aWNlLm1vZGVsICYmIG1vZGVsTmFtZSAhPT0gJycgJiYgbW9kZWxOYW1lICE9PSAnbW9kZWxOYW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdHTE9CQUxfUExBVDMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdOZXRDYXN0IFRWJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU21hcnRUVjIwMTInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBUViAyMDEyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmlkZW93ZWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdWaWRlb3dlYic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbW9kZWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVuZG9yTmFtZSA9PT0gJ0h1bWF4Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gdGhpcy5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIERldGVjdCB0eXBlIGJhc2VkIG9uIGNvbW1vbiBpZGVudGlmaWVyc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSW5ldHR2QnJvd3NlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNSURQJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRyeSB0byBkZXRlY3QgYW55IGRldmljZXMgYmFzZWQgb24gY29tbW9uXG4gICAgICAgICAgICAgKiAgICAgIGxvY2F0aW9ucyBvZiBtb2RlbCBpZHNcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGV2aWNlLm1vZGVsICYmICF0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF1YS5tYXRjaCgvXihNb3ppbGxhfE9wZXJhKS8pKSBpZiAobWF0Y2ggPSAvXig/Ok1RUUJyb3dzZXJcXC9bMC05XFwuXStcXC8pPyhbXlxcc10rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC9fVEQkLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoL19DTUNDJC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC9bXyBdTW96aWxsYSQvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSgvIExpbnV4JC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC8gT3BlcmEkLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoL1xcL1swLTldLiokLywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1swLTldK3hbMC05XSs7IChbXjtdKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1swLTldK1hbMC05XSsgKFteO1xcL1xcKFxcKV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93cyBOVCA1LjE7IChbXjtdKyk7IFdpbmRvd3MgUGhvbmUvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1xcKSBQUEM7ICg/OlswLTldK3hbMC05XSs7ICk/KFteO1xcL1xcKFxcKV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgVTsgV2luZG93cyBNb2JpbGUvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZvZGFmb25lXFwvMS4wXFwvKFteXFwvXSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2gobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXCAoW15cXHNdKykkLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2gobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZXZpY2UubW9kZWwgJiYgIXRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKGNhbmRpZGF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF1bMl0gIT09ICd1bmRlZmluZWQnKSB0aGlzLmRldmljZS50eXBlID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zLm5hbWUgfHwgdGhpcy5vcy5uYW1lID09PSAnV2luZG93cycgfHwgdGhpcy5vcy5uYW1lID09PSAnV2luZG93cyBNb2JpbGUnIHx8IHRoaXMub3MubmFtZSA9PT0gJ1dpbmRvd3MgQ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBXSU5ET1dTX01PQklMRV9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBXSU5ET1dTX01PQklMRV9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IFdJTkRPV1NfTU9CSUxFX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSAhPT0gJ1dpbmRvd3MgTW9iaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkdJT05FRS0oW15cXHNdKykvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnR2lvbmVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkhUQ18/KFteXFwvX10rKSg/OlxcL3xffCQpLy5leGVjKGNhbmRpZGF0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19IVEM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15IVUFXRUktKFteXFwvXSopLy5leGVjKGNhbmRpZGF0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19IVUFXRUk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyg/Ol58XFwoKUxHRT8oPzpcXC98LXxffFxccykoW15cXHNdKikvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX0xHO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9eTU9ULShbXlxcL19dKykoPzpcXC98X3wkKS8uZXhlYyhjYW5kaWRhdGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfTU9UT1JPTEE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Nb3Rvcm9sYV8oW15cXC9fXSspKD86XFwvfF98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX01PVE9ST0xBO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9eTm9raWEoW15cXC9dKykoPzpcXC98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTm9raWEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2VyaWVzNDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Tb255RXJpY3Nzb24oW15cXC9fXSspKD86XFwvfF98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX1NPTllfRVJJQ1NTT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15TQU1TVU5HLShbXlxcL19dKykoPzpcXC98X3wkKS8uZXhlYyhjYW5kaWRhdGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0FNU1VORztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ0JhZGEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYW51ZmFjdHVyZXIgPSAnU0FNU1VORyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvSmFzbWluZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hbnVmYWN0dXJlciA9ICdTQU1TVU5HJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFRPVUNIV0laX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1RvdWNod2l6JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzIuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC9Eb2xmaW5cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYW51ZmFjdHVyZXIgPSAnU0FNU1VORyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JhZGEnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyLjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIuMic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMS4yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMy4wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcyLjAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IFRPVUNIV0laX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnVG91Y2h3aXonO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxLjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEuNSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMi4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMi4wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICczLjAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKD86TEdbLXxcXC9dKSguKikgKD86QnJvd3NlclxcLyk/QXBwbGVXZWJraXQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19MRztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Nb3ppbGxhXFwvNS4wIFxcKCg/Ok5va2lhfE5PS0lBKSg/Olxccz8pKFteXFwpXSspXFwpVUMgQXBwbGVXZWJraXRcXChsaWtlIEdlY2tvXFwpIFNhZmFyaVxcLzUzMCQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdTZXJpZXM2MCc7XG4gICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTYWZhcmlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NhZmFyaScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ2lPUycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ01hYyBPUyBYJyB8fCB0aGlzLm9zLm5hbWUgPT09ICdXaW5kb3dzJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdTYWZhcmknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSB0aGlzLm9zLm5hbWUgPT09ICdNYWMgT1MgWCc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oWzAtOVxcLl0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goL0FwcGxlV2ViS2l0XFwvWzAtOVxcLl0rXFwrLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1dlYktpdCBOaWdodGx5IEJ1aWxkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01TSUUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0ludGVybmV0IEV4cGxvcmVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSUVNb2JpbGUnKSB8fCB1YS5tYXRjaCgnV2luZG93cyBDRScpIHx8IHVhLm1hdGNoKCdXaW5kb3dzIFBob25lJykgfHwgdWEubWF0Y2goJ1dQNycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ01vYmlsZSBJbnRlcm5ldCBFeHBsb3Jlcic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01TSUUgKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9PcGVyYS9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9PcGVyYVtcXC98IF0oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9WZXJzaW9uXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtYXRjaFsxXSkgPj0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24gJiYgdWEubWF0Y2goJ0VkaXRpb24gTGFicycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPSAnYWxwaGEnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdMYWJzJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24gJiYgdWEubWF0Y2goJ0VkaXRpb24gTmV4dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPSAnYWxwaGEnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdOZXh0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ09wZXJhIFRhYmxldCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGFibGV0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ09wZXJhIE1vYmknKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNb2JpbGUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09wZXJhIE1pbmk7Ly5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNaW5pJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdwcm94eSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvT3BlcmEgTWluaVxcLyg/OmF0dFxcLyk/KFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNaW5pJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAtMVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAncHJveHknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnT3BlcmEnICYmIHRoaXMuZGV2aWNlLnR5cGUgPT09ICdtb2JpbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhIE1vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9CRVIvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTWluaSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0luZXR0dkJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT3BlcmEgVFYnKSB8fCB1YS5tYXRjaCgnT3BlcmEtVFYnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCB6Ym92JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCB6dmF2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTWluaSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBGaXJlZm94XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdGaXJlZm94JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9GaXJlZm94XFwvKFswLTlhYi5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi50eXBlID09PSAnYWxwaGEnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ0F1cm9yYSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPT09ICdiZXRhJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdCZXRhJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0Zlbm5lYycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ01vYmlsZTsgcnYnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUYWJsZXQ7IHJ2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlID09PSAnbW9iaWxlJyB8fCB0aGlzLmRldmljZS50eXBlID09PSAndGFibGV0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94IE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05hbW9yb2thJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9OYW1vcm9rYVxcLyhbMC05YWIuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdOYW1vcm9rYSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2hpcmV0b2tvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9TaGlyZXRva29cXC8oWzAtOWFiLl0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnU2hpcmV0b2tvJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNaW5lZmllbGQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0ZpcmVmb3gnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01pbmVmaWVsZFxcLyhbMC05YWIuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdNaW5lZmllbGQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0ZpcmViaXJkJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlYmlyZCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRmlyZWJpcmRcXC8oWzAtOWFiLl0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTZWFNb25rZXlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NlYU1vbmtleScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnU2VhTW9ua2V5JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9TZWFNb25rZXlcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmV0c2NhcGVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05ldHNjYXBlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOZXRzY2FwZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTmV0c2NhcGVbMC05XT9cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgS29ucXVlcm9yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdba3xLXW9ucXVlcm9yLycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnS29ucXVlcm9yJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9ba3xLXW9ucXVlcm9yXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENocm9tZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC8oPzpDaHJvbWV8Q3JNb3xDcmlPUylcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnQ2hyb21lJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtYXRjaFsxXS5zcGxpdCgnLicsIDMpLmpvaW4oJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMTYuMC45MTInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ0JldGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMTguMC4xMDI1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbi5kZXRhaWxzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnTmlnaHRseSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdLnNwbGl0KCcuJywgMykuam9pbignLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwLjIuMTQ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAuMy4xNTQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMC40LjE1NCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxLjAuMTU0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIuMC4xNzInOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMy4wLjE5NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc0LjAuMjQ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzQuMS4yNDknOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNS4wLjM3NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjAuNDcyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzcuMC41MTcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOC4wLjU1Mic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc5LjAuNTk3JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEwLjAuNjQ4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzExLjAuNjk2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEyLjAuNzQyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEzLjAuNzgyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE0LjAuODM1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE1LjAuODc0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE2LjAuOTEyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE3LjAuOTYzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE4LjAuMTAyNSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxOS4wLjEwODQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAuMC4xMTMyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIxLjAuMTE4MCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci52ZXJzaW9uLm1pbm9yID09PSAwKSB0aGlzLmJyb3dzZXIudmVyc2lvbi5kZXRhaWxzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuYnJvd3Nlci52ZXJzaW9uLmRldGFpbHMgPSAyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ05pZ2h0bHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDaHJvbWUgRnJhbWVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ2Nocm9tZWZyYW1lJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdDaHJvbWUgRnJhbWUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL2Nocm9tZWZyYW1lXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENocm9taXVtXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdDaHJvbWl1bScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdDaHJvbWl1bSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvQ2hyb21pdW1cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQnJvd3Nlck5HXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdCcm93c2VyTkcnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ05va2lhIEJyb3dzZXInO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0Jyb3dzZXJOR1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRzOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5va2lhIEJyb3dzZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05va2lhQnJvd3NlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTm9raWEgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWFCcm93c2VyXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNaWNyb0JcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01hZW1vWyB8X11Ccm93c2VyJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdNaWNyb0InO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01hZW1vWyB8X11Ccm93c2VyWyB8X10oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmV0RnJvbnRcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05ldEZyb250JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOZXRGcm9udCc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL05ldEZyb250XFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0luZXR0dkJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU2lsa1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2lsaycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTaWxrLUFjY2VsZXJhdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnU2lsayc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1NpbGtcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQW1hem9uJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnS2luZGxlIEZpcmUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgIT09ICdBbmRyb2lkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRG9sZmluXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdEb2xmaW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0RvbGZpbic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRG9sZmluXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSXJpc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSXJpcycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnSXJpcyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBNb2JpbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSXJpc1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyBXTShbMC05XSkgLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0gKyAnLjAnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5tb2RlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSmFzbWluZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSmFzbWluZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnSmFzbWluZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSmFzbWluZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBCb3hlZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQm94ZWUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0JveGVlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0JveGVlXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEVzcGlhbFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRXNwaWFsJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdFc3BpYWwnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlICE9PSAndGVsZXZpc2lvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Fc3BpYWxcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQU5UIEdhbGlvXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9BTlRHYWxpb1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdBTlQgR2FsaW8nO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBOZXRGcm9udCBOWFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvTlhcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTmV0RnJvbnQgTlgnO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRFRWL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL21vYmlsZS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgT2JpZ29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL09iaWdvL2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT2JpZ28nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvXFwvKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvXFwvKFtBLVpdKShbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09iaWdvICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMl1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvLShbQS1aXSkoWzAtOS5dKilcXC8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPYmlnbyAnICsgbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzJdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgVUMgV2ViXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdVQ1dFQicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnVUMgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVUNXRUIoWzAtOV0qWy5dWzAtOV0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgPT09ICdMaW51eCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15JVUMgXFwoVTtcXHM/aU9TIChbMC05XFwuXSspOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ2lPUyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkpVQyBcXChMaW51eDsgVTsgKFswLTlcXC5dKylbXjtdKjsgW147XSs7IChbXjtdKlteXFxzXSlcXHMqOyBbMC05XStcXCpbMC05XStcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsyXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdICE9PSAndW5kZWZpbmVkJykgdGhpcy5kZXZpY2UudHlwZSA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL1xcKSBVQyAvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1VDIEJyb3dzZXInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvVUNCcm93c2VyXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1VDIEJyb3dzZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmluZVNreVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9OaW5lc2t5KD86LWFuZHJvaWQtbW9iaWxlKD86LWNuKT8pP1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOaW5lU2t5JztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNreWZpcmVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvU2t5ZmlyZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdTa3lmaXJlJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQW5kcm9pZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRG9scGhpbiBIRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Eb2xwaGluSERDTlxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdEb2xwaGluJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0RvbHBoaW5cXC9JTlQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnRG9scGhpbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBRUSBCcm93c2VyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhNP1FRQnJvd3NlcilcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnUVEgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLm1hdGNoKC9eWzAtOV1bMC05XSQvKSkgdmVyc2lvbiA9IHZlcnNpb25bMF0gKyAnLicgKyB2ZXJzaW9uWzFdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJ1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zLm5hbWUgJiYgbWF0Y2hbMV0gPT09ICdRUUJyb3dzZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIGlCcm93c2VyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhpQnJvd3NlcilcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnaUJyb3dzZXInO1xuXG4gICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5tYXRjaCgvWzAtOV1bMC05XS8pKSB2ZXJzaW9uID0gdmVyc2lvblswXSArICcuJyArIHZlcnNpb25bMV07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFB1ZmZpblxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9QdWZmaW5cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnUHVmZmluJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnTGludXgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICAzNjAgRXh0cmVtZSBFeHBsb3JlclxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnMzYwRUUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJzM2MCBFeHRyZW1lIEV4cGxvcmVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE1pZG9yaVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NaWRvcmlcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTWlkb3JpJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnTGludXgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdMaW51eCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdkZXNrdG9wJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgT3RoZXJzXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgdmFyIGJyb3dzZXJzID0gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWRvYmVBSVInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Fkb2JlQUlSXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBd2Vzb21pdW0nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0F3ZXNvbWl1bVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2FudmFjZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ2FudmFjZSBTdGFuZGFsb25lXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdFa2lvaCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRWtpb2hcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0phdmFGWCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvSmF2YUZYXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdHRlhlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9HRlhlXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdMdWFLaXQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL2x1YWtpdC9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVGl0YW5pdW0nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1RpdGFuaXVtXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdPcGVuV2ViS2l0U2hhcnAnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09wZW5XZWJLaXRTaGFycC9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUHJpc20nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1ByaXNtXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0RW1iZWRkZWQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0RW1iZWRkZWQvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0RW1iZWRkZWQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0RW1iZWRkZWQuKlF0XFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSaG9TaW11bGF0b3InLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1Job1NpbXVsYXRvci9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVVdlYktpdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVVdlYktpdFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUGhhbnRvbUpTJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9QaGFudG9tSlNcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBXZWIgUHJldmlldycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvR29vZ2xlIFdlYiBQcmV2aWV3L1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdHb29nbGUgRWFydGgnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0dvb2dsZSBFYXJ0aFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRUEgT3JpZ2luJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9PcmlnaW5cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NlY29uZExpZmUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NlY29uZExpZmVcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1ZhbHZlIFN0ZWFtJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9WYWx2ZSBTdGVhbS9cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU29uZ2JpcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NvbmdiaXJkXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdUaHVuZGVyYmlyZCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGh1bmRlcmJpcmRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Ficm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9BYnJvd3NlclxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXJvcmEnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1tBYV1yb3JhXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdCYWlkdSBCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9NP0JhaWR1QnJvd3NlclxcLyhbMC05Ll0qKS9pXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NhbWlubycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ2FtaW5vXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDYW51cmUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0NhbnVyZVxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21ldEJpcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0NvbWV0QmlyZFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29tb2RvIERyYWdvbicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ29tb2RvX0RyYWdvblxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25rZXJvcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvW0NjXW9ua2Vyb3JcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Nvb2xOb3ZvJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC8oPzpDb29sTm92b3xDb29sTm92b0Nocm9tZVBsdXMpXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Nocm9tZVBsdXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Nocm9tZVBsdXMoPzpcXC8oWzAtOS5dKikpPyQvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRGFlZGFsdXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0RhZWRhbHVzIChbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdEZW1vYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvZGVtb2Jyb3dzZXJcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Rvb2JsZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRG9vYmxlKD86XFwvKFswLTkuXSopKT8vXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0RXQicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvZHdiKD86LWhnKT8oPzpcXC8oWzAtOS5dKikpPy9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRXBpcGhhbnknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0VwaXBoYW55XFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdGaXJlV2ViJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9GaXJlV2ViXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdGbG9jaycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRmxvY2tcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnR2FsZW9uJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9HYWxlb25cXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSGVsaXVtJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9IZWxpdW1Nb2JpbGVCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpQ2FiJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9pQ2FiXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJY2VhcGUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ljZWFwZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSWNlQ2F0JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9JY2VDYXQgKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJY2V3ZWFzZWwnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ljZXdlYXNlbFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW50ZXJuZXRTdXJmYm9hcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ludGVybmV0U3VyZmJvYXJkXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJcm9uJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9Jcm9uXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0lzaXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Jyb3dzZXJTZXJ2ZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0p1bWFuamknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL2p1bWFuamkvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0themVoYWthc2UnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0themVoYWthc2VcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0tDaHJvbWUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0tDaHJvbWVcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSy1NZWxlb24nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0stTWVsZW9uXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdMZWVjaGNyYWZ0JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9MZWVjaGNyYWZ0KD86XFwvKFswLTkuXSopKT8vLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTGlnaHRuaW5nJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9MaWdodG5pbmdcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0x1bmFzY2FwZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvTHVuYXNjYXBlW1xcL3wgXShbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpTHVuYXNjYXBlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9pTHVuYXNjYXBlXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ01heHRob24nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01heHRob25bXFwvIF0oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTWluaUJyb3dzZXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01pbmlCcj9vd3Nlck1cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ01pbmlCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9NaW5pQnJvd3Nlck1vYmlsZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTWl4U2hhcmsnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01peFNoYXJrXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdNb3Rvcm9sYSBXZWJLaXQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01vdG9yb2xhV2ViS2l0XFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ05ldEZyb250IExpZmVCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9OZXRGcm9udExpZmVCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdOZXRzY2FwZSBOYXZpZ2F0b3InLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL05hdmlnYXRvclxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdPZHlzc2V5JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9PV0JcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09tbmlXZWInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09tbmlXZWIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09yY2EnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09yY2FcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09yaWd5bicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvT3JpZ3luIFdlYiBCcm93c2VyL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQYWxlbW9vbicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUGFsZVttTV1vb25cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1BoYW50b20nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1BoYW50b21cXC9WKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQb2xhcmlzJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9Qb2xhcmlzXFwvdj8oWzAtOS5dKikvaSxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0Q3JlYXRvcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRDcmVhdG9yXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdFFtbFZpZXdlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRRbWxWaWV3ZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0VGVzdEJyb3dzZXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0VGVzdEJyb3dzZXJcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0V2ViJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9RdFdlYiBJbnRlcm5ldCBCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdXBaaWxsYScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXVwWmlsbGFcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JvY2NhdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUm9jY2F0XFwvKFswLTldXFwuWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JhdmVuIGZvciBNYWMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1JhdmVuIGZvciBNYWNcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3Jla29ucScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvcmVrb25xL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSb2NrTWVsdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUm9ja01lbHRcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2xlaXBuaXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NsZWlwbmlyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NNQnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU01Ccm93c2VyL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTb2dvdSBFeHBsb3JlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU0UgMi5YIE1ldGFTci9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU25vd3Nob2UnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1Nub3dzaG9lXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NwdXRuaWsnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NwdXRuaWtcXC8oWzAtOS5dKikvaSxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1N0YWlubGVzcycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU3RhaW5sZXNzXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTdW5DaHJvbWUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1N1bkNocm9tZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU3VyZicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU3VyZlxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVGFvQnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGFvQnJvd3NlclxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdUYW9tZWVCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9UYW9tZWVCcm93c2VyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1RheldlYicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGF6V2ViL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdWaWVyYScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVmllcmFcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1ZpbGxhbm92YScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVmlsbGFub3ZhXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dhdmVsaW5rIFZlbG9jaXR5JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XYXZlbGluayBWZWxvY2l0eSBCcm93c2VyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dlYlBvc2l0aXZlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XZWJQb3NpdGl2ZS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViUmVuZGVyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XZWJSZW5kZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1d5em8nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1d5em9cXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnWmV0YWtleScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvWmV0YWtleSBXZWJraXRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1pldGFrZXknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1pldGFrZXlcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9XVxuXG4gICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IGJyb3dzZXJzLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gYnJvd3NlcnNbYl0ucmVnZXhwLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gYnJvd3NlcnNbYl0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogYnJvd3NlcnNbYl0uZGV0YWlscyB8fCBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdlYktpdFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9XZWJLaXRcXC8oWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0Jyb3dzZXJcXC9BcHBsZVdlYktpdChbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUubmFtZSA9ICdXZWJraXQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBLSFRNTFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9LSFRNTFxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ0tIVE1MJztcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgR2Vja29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoL0dlY2tvLy5leGVjKHVhKSAmJiAhL2xpa2UgR2Vja28vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnR2Vja28nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLzsgcnY6KFteXFwpXSspXFwpLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgUHJlc3RvXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ByZXN0b1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1ByZXN0byc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRyaWRlbnRcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvVHJpZGVudFxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1RyaWRlbnQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZVZlcnNpb24odGhpcy5lbmdpbmUudmVyc2lvbikgPT09IDYgJiYgcGFyc2VGbG9hdCh0aGlzLmJyb3dzZXIudmVyc2lvbikgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcxMC4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlVmVyc2lvbih0aGlzLmVuZ2luZS52ZXJzaW9uKSA9PT0gNSAmJiBwYXJzZUZsb2F0KHRoaXMuYnJvd3Nlci52ZXJzaW9uKSA8IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnOS4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlVmVyc2lvbih0aGlzLmVuZ2luZS52ZXJzaW9uKSA9PT0gNCAmJiBwYXJzZUZsb2F0KHRoaXMuYnJvd3Nlci52ZXJzaW9uKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnOC4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ1dpbmRvd3MgUGhvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZVZlcnNpb24odGhpcy5lbmdpbmUudmVyc2lvbikgPT09IDUgJiYgcGFyc2VGbG9hdCh0aGlzLm9zLnZlcnNpb24pIDwgNy41KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICc3LjUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDb3JyZWN0aW9uc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgPT09ICdBbmRyb2lkJyAmJiB0aGlzLmJyb3dzZXIuc3RvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ2lPUycgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdPcGVyYSBNaW5pJykge1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIubmFtZSA9PT0gJ01pZG9yaScgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1dlYmtpdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1dlYmtpdCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlID09PSAndGVsZXZpc2lvbicgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdPcGVyYScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBEZXZpY2VzJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjEwJyk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMy4yXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuOScpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDMuMVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjgnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzLjBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5lbmdpbmUudmVyc2lvbi5pcygnMi43Jyk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMi45XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuNicpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDIuOFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjQnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMC4zXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuMycpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuMicpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDkuN1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjEnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiA5LjZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENhbW91ZmxhZ2VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRldGVjdENhbW91ZmxhZ2UpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWCAxMF82XzM7IChbXjtdKyk7IFthLXpdezJ9LSg/OlthLXpdezJ9KT9cXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXVsyXSAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMuZGV2aWNlLnR5cGUgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmREZXZpY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTGludXggVmVudGFuYTsgW2Etel17Mn0tW2Etel17Mn07ICguKykgQnVpbGQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXVsyXSAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMuZGV2aWNlLnR5cGUgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmREZXZpY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLm5hbWUgPT09ICdTYWZhcmknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgIT09ICdpT1MnICYmIC9BcHBsZVdlYktpdFxcLyhbMC05XSsuWzAtOV0rKS9pLmV4ZWModWEpWzFdICE9PSAvU2FmYXJpXFwvKFswLTldKy5bMC05XSspL2kuZXhlYyh1YSlbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnc2FmYXJpTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnaU9TJyAmJiAhdWEubWF0Y2goL15Nb3ppbGxhLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnbm9Nb3ppbGxhUHJlZml4Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvVmVyc2lvblxcL1swLTlcXC5dKy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnbm9WZXJzaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnQ2hyb21lJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIS8oPzpDaHJvbWV8Q3JNb3xDcmlPUylcXC8oWzAtOV17MSwyfVxcLlswLTldXFwuWzAtOV17Myw0fVxcLlswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3dyb25nVmVyc2lvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCBjbGFpbXMgbm90IHRvIGJlIFRyaWRlbnQsIGJ1dCBpdCBpcyBwcm9iYWJseSBUcmlkZW50IHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCd0cmlkZW50Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1RyaWRlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHlwZW9mIHRoaXMuYnJvd3Nlci5uYW1lID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmJyb3dzZXIubmFtZSAhPT0gJ01heHRob24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgaXQgY2xhaW1zIG5vdCB0byBiZSBPcGVyYSwgYnV0IGl0IGlzIHByb2JhYmx5IE9wZXJhIHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlcmEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgncHJlc3RvJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1ByZXN0bycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLm5hbWUgPT09ICdJbnRlcm5ldCBFeHBsb3JlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgaXQgY2xhaW1zIG5vdCB0byBiZSBHZWNrbywgYnV0IGl0IGlzIHByb2JhYmx5IEdlY2tvIHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICgnZ2V0Qm94T2JqZWN0Rm9yJyBpbiBkb2N1bWVudCB8fCAnbW96SW5uZXJTY3JlZW5YJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZ2Vja28nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVuZ2luZS5uYW1lICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVuZ2luZS5uYW1lICE9PSAnR2Vja28nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIGl0IGNsYWltcyBub3QgdG8gYmUgV2Via2l0LCBidXQgaXQgaXMgcHJvYmFibHkgV2Via2l0IHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICgnV2ViS2l0Q1NTTWF0cml4JyBpbiB3aW5kb3cgfHwgJ1dlYktpdFBvaW50JyBpbiB3aW5kb3cgfHwgJ3dlYmtpdFN0b3JhZ2VJbmZvJyBpbiB3aW5kb3cgfHwgJ3dlYmtpdFVSTCcgaW4gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3dlYmtpdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5naW5lLm5hbWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZW5naW5lLm5hbWUgIT09ICdXZWJraXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cblxuICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCBjbGFpbXMgdG8gYmUgU2FmYXJpIGFuZCB1c2VzIFY4LCBpdCBpcyBwcm9iYWJseSBhbiBBbmRyb2lkIGRldmljZSBydW5uaW5nIGNhbW91ZmxhZ2UgbW9kZSAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmdpbmUubmFtZSA9PT0gJ1dlYmtpdCcgJiYgKHt9LnRvU3RyaW5nKS50b1N0cmluZygpLmluZGV4T2YoJ1xcbicpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCd2OCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyICE9PSBudWxsICYmIHRoaXMuYnJvd3Nlci5uYW1lID09PSAnU2FmYXJpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpUGFkIHRoYXQgaXMgbm90IDc2OCB4IDEwMjQsIHdlIGhhdmUgYW4gaW1wb3N0ZXIgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV2aWNlLm1vZGVsID09PSAnaVBhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2NyZWVuLndpZHRoICE9PSAwICYmIHNjcmVlbi5oZWlnaHQgIT09IDApICYmIChzY3JlZW4ud2lkdGggIT09IDc2OCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSAxMDI0KSAmJiAoc2NyZWVuLndpZHRoICE9PSAxMDI0ICYmIHNjcmVlbi5oZWlnaHQgIT09IDc2OCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3NpemVNaXNtYXRjaCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGlQaG9uZSBvciBpUG9kIHRoYXQgaXMgbm90IDMyMCB4IDQ4MCwgd2UgaGF2ZSBhbiBpbXBvc3RlciAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXZpY2UubW9kZWwgPT09ICdpUGhvbmUnIHx8IHRoaXMuZGV2aWNlLm1vZGVsID09PSAnaVBvZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2NyZWVuLndpZHRoICE9PSAwICYmIHNjcmVlbi5oZWlnaHQgIT09IDApICYmIChzY3JlZW4ud2lkdGggIT09IDMyMCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSA0ODApICYmIChzY3JlZW4ud2lkdGggIT09IDQ4MCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSAzMjApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdzaXplTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnaU9TJyAmJiB0aGlzLm9zLnZlcnNpb24pIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbi5pc09sZGVyKCc0LjAnKSAmJiAnc2FuZGJveCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ2ZvdW5kU2FuZGJveCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24uaXNPbGRlcignNC4yJykgJiYgJ1dlYlNvY2tldCcgaW4gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZFNvY2tldHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy52ZXJzaW9uLmlzT2xkZXIoJzUuMCcpICYmICEhIHdpbmRvdy5Xb3JrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ2ZvdW5kV29ya2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbi5pc05ld2VyKCcyLjEnKSAmJiAhd2luZG93LmFwcGxpY2F0aW9uQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ25vQXBwQ2FjaGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSAhPT0gJ2lPUycgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdTYWZhcmknICYmIHRoaXMuYnJvd3Nlci52ZXJzaW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi5pc09sZGVyKCc0LjAnKSAmJiAhISB3aW5kb3cuYXBwbGljYXRpb25DYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmRBcHBDYWNoZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi5pc09sZGVyKCc0LjEnKSAmJiAhISAod2luZG93Lmhpc3RvcnkgJiYgaGlzdG9yeS5wdXNoU3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZEhpc3RvcnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24uaXNPbGRlcignNS4xJykgJiYgISEgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZEZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24uaXNPbGRlcignNS4yJykgJiYgJ0ZpbGVSZWFkZXInIGluIHdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmRGaWxlUmVhZGVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kZWwocykge1xuICAgICAgICBzID0gdHlwZW9mIHMgPT09ICd1bmRlZmluZWQnID8gJycgOiBzO1xuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL19URCQvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL19DTUNDJC8sICcnKTtcblxuICAgICAgICBzID0gcy5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXFwvW14vXSskLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9cXC9bXi9dKyBBbmRyb2lkXFwvLiovLCAnJyk7XG5cbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXnRpdGEgb24gLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQW5kcm9pZCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15BbmRyb2lkIGZvciAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15JQ1MgQU9TUCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIEFPU1Agb24gLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eRnVsbCBBbmRyb2lkIG9uIC8sICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkZ1bGwgQ2FwcHVjY2lubyBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIE1JUFMgQW5kcm9pZCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIEFuZHJvaWQvLCAnJyk7XG5cbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkFjZXIgPy9pLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15JY29uaWEgLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQWlub2wgLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQ29vbHBhZCA/L2ksICdDb29scGFkICcpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQUxDQVRFTCAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15BbGNhdGVsIE9ULSguKikvLCAnb25lIHRvdWNoICQxJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15ZTC0vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15Ob3ZvNyA/L2ksICdOb3ZvNyAnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkdJT05FRSAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15IVy0vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15IdWF3ZWlbIC1dL2ksICdIdWF3ZWkgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15TQU1TVU5HWyAtXS9pLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15Tb255RXJpY3Nzb24vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15MZW5vdm8gTGVub3ZvLywgJ0xlbm92bycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eTE5WLUxlbm92by8sICdMZW5vdm8nKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkxlbm92by0vLCAnTGVub3ZvICcpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eKExHKVsgX1xcL10vLCAnJDEtJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oSFRDLiopXFxzKD86dnxWKT9bMC05Ll0rJC8sICckMScpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eKEhUQylbLVxcL10vLCAnJDEgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oSFRDKShbQS1aXVswLTldWzAtOV1bMC05XSkvLCAnJDEgJDInKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXihNb3Rvcm9sYVtcXHN8LV0pLywgJycpXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oTW90b3xNT1QtKS8sICcnKVxuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoLy0/KG9yYW5nZSgtbHMpP3x2b2RhZm9uZXxib3V5Z3VlcykkL2ksICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvaHR0cDpcXC9cXC8uKyQvaSwgJycpO1xuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcblxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVZlcnNpb24odmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi50b1N0cmluZygpO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIG1ham9yID0gY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYWpvciArICcuJyArIGNvbXBvbmVudHMuam9pbignJykpO1xuICAgIH1cblxuICAgIHJldHVybiBEZXRlY3RlZDtcblxufSkoKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/cell/index.js":
/*!*********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/cell/index.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shared */ \"./node_modules/_vant@2.2.16@vant/es/cell/shared.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n/* harmony import */ var _utils_router__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/router */ \"./node_modules/_vant@2.2.16@vant/es/utils/router.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n\n\n\n\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"createNamespace\"])('cell'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\nfunction Cell(h, props, slots, ctx) {\n var icon = props.icon,\n size = props.size,\n title = props.title,\n label = props.label,\n value = props.value,\n isLink = props.isLink,\n arrowDirection = props.arrowDirection;\n var showTitle = slots.title || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(title);\n var showValue = slots.default || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(value);\n var showLabel = slots.label || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(label);\n var Label = showLabel && h(\"div\", {\n \"class\": [bem('label'), props.labelClass]\n }, [slots.label ? slots.label() : label]);\n var Title = showTitle && h(\"div\", {\n \"class\": [bem('title'), props.titleClass],\n \"style\": props.titleStyle\n }, [slots.title ? slots.title() : h(\"span\", [title]), Label]);\n var Value = showValue && h(\"div\", {\n \"class\": [bem('value', {\n alone: !slots.title && !title\n }), props.valueClass]\n }, [slots.default ? slots.default() : h(\"span\", [value])]);\n var LeftIcon = slots.icon ? slots.icon() : icon && h(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n \"class\": bem('left-icon'),\n \"attrs\": {\n \"name\": icon\n }\n });\n var rightIconSlot = slots['right-icon'];\n var RightIcon = rightIconSlot ? rightIconSlot() : isLink && h(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n \"class\": bem('right-icon'),\n \"attrs\": {\n \"name\": arrowDirection ? \"arrow-\" + arrowDirection : 'arrow'\n }\n });\n\n function onClick(event) {\n Object(_utils_functional__WEBPACK_IMPORTED_MODULE_4__[\"emit\"])(ctx, 'click', event);\n Object(_utils_router__WEBPACK_IMPORTED_MODULE_5__[\"functionalRoute\"])(ctx);\n }\n\n var clickable = isLink || props.clickable;\n var classes = {\n clickable: clickable,\n center: props.center,\n required: props.required,\n borderless: !props.border\n };\n\n if (size) {\n classes[size] = size;\n }\n\n return h(\"div\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1___default()([{\n \"class\": bem(classes),\n \"attrs\": {\n \"role\": clickable ? 'button' : null,\n \"tabindex\": clickable ? 0 : null\n },\n \"on\": {\n \"click\": onClick\n }\n }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_4__[\"inherit\"])(ctx)]), [LeftIcon, Title, Value, RightIcon, slots.extra && slots.extra()]);\n}\n\nCell.props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _shared__WEBPACK_IMPORTED_MODULE_3__[\"cellProps\"], {}, _utils_router__WEBPACK_IMPORTED_MODULE_5__[\"routeProps\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Cell));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jZWxsL2luZGV4LmpzP2QyZDkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX21lcmdlSlNYUHJvcHMgZnJvbSBcIkB2dWUvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNcIjtcbmltcG9ydCB7IGNyZWF0ZU5hbWVzcGFjZSwgaXNEZWYgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBjZWxsUHJvcHMgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBlbWl0LCBpbmhlcml0IH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25hbCc7XG5pbXBvcnQgeyByb3V0ZVByb3BzLCBmdW5jdGlvbmFsUm91dGUgfSBmcm9tICcuLi91dGlscy9yb3V0ZXInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vaWNvbic7IC8vIFR5cGVzXG5cbnZhciBfY3JlYXRlTmFtZXNwYWNlID0gY3JlYXRlTmFtZXNwYWNlKCdjZWxsJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5mdW5jdGlvbiBDZWxsKGgsIHByb3BzLCBzbG90cywgY3R4KSB7XG4gIHZhciBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgaXNMaW5rID0gcHJvcHMuaXNMaW5rLFxuICAgICAgYXJyb3dEaXJlY3Rpb24gPSBwcm9wcy5hcnJvd0RpcmVjdGlvbjtcbiAgdmFyIHNob3dUaXRsZSA9IHNsb3RzLnRpdGxlIHx8IGlzRGVmKHRpdGxlKTtcbiAgdmFyIHNob3dWYWx1ZSA9IHNsb3RzLmRlZmF1bHQgfHwgaXNEZWYodmFsdWUpO1xuICB2YXIgc2hvd0xhYmVsID0gc2xvdHMubGFiZWwgfHwgaXNEZWYobGFiZWwpO1xuICB2YXIgTGFiZWwgPSBzaG93TGFiZWwgJiYgaChcImRpdlwiLCB7XG4gICAgXCJjbGFzc1wiOiBbYmVtKCdsYWJlbCcpLCBwcm9wcy5sYWJlbENsYXNzXVxuICB9LCBbc2xvdHMubGFiZWwgPyBzbG90cy5sYWJlbCgpIDogbGFiZWxdKTtcbiAgdmFyIFRpdGxlID0gc2hvd1RpdGxlICYmIGgoXCJkaXZcIiwge1xuICAgIFwiY2xhc3NcIjogW2JlbSgndGl0bGUnKSwgcHJvcHMudGl0bGVDbGFzc10sXG4gICAgXCJzdHlsZVwiOiBwcm9wcy50aXRsZVN0eWxlXG4gIH0sIFtzbG90cy50aXRsZSA/IHNsb3RzLnRpdGxlKCkgOiBoKFwic3BhblwiLCBbdGl0bGVdKSwgTGFiZWxdKTtcbiAgdmFyIFZhbHVlID0gc2hvd1ZhbHVlICYmIGgoXCJkaXZcIiwge1xuICAgIFwiY2xhc3NcIjogW2JlbSgndmFsdWUnLCB7XG4gICAgICBhbG9uZTogIXNsb3RzLnRpdGxlICYmICF0aXRsZVxuICAgIH0pLCBwcm9wcy52YWx1ZUNsYXNzXVxuICB9LCBbc2xvdHMuZGVmYXVsdCA/IHNsb3RzLmRlZmF1bHQoKSA6IGgoXCJzcGFuXCIsIFt2YWx1ZV0pXSk7XG4gIHZhciBMZWZ0SWNvbiA9IHNsb3RzLmljb24gPyBzbG90cy5pY29uKCkgOiBpY29uICYmIGgoSWNvbiwge1xuICAgIFwiY2xhc3NcIjogYmVtKCdsZWZ0LWljb24nKSxcbiAgICBcImF0dHJzXCI6IHtcbiAgICAgIFwibmFtZVwiOiBpY29uXG4gICAgfVxuICB9KTtcbiAgdmFyIHJpZ2h0SWNvblNsb3QgPSBzbG90c1sncmlnaHQtaWNvbiddO1xuICB2YXIgUmlnaHRJY29uID0gcmlnaHRJY29uU2xvdCA/IHJpZ2h0SWNvblNsb3QoKSA6IGlzTGluayAmJiBoKEljb24sIHtcbiAgICBcImNsYXNzXCI6IGJlbSgncmlnaHQtaWNvbicpLFxuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJuYW1lXCI6IGFycm93RGlyZWN0aW9uID8gXCJhcnJvdy1cIiArIGFycm93RGlyZWN0aW9uIDogJ2Fycm93J1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgIGVtaXQoY3R4LCAnY2xpY2snLCBldmVudCk7XG4gICAgZnVuY3Rpb25hbFJvdXRlKGN0eCk7XG4gIH1cblxuICB2YXIgY2xpY2thYmxlID0gaXNMaW5rIHx8IHByb3BzLmNsaWNrYWJsZTtcbiAgdmFyIGNsYXNzZXMgPSB7XG4gICAgY2xpY2thYmxlOiBjbGlja2FibGUsXG4gICAgY2VudGVyOiBwcm9wcy5jZW50ZXIsXG4gICAgcmVxdWlyZWQ6IHByb3BzLnJlcXVpcmVkLFxuICAgIGJvcmRlcmxlc3M6ICFwcm9wcy5ib3JkZXJcbiAgfTtcblxuICBpZiAoc2l6ZSkge1xuICAgIGNsYXNzZXNbc2l6ZV0gPSBzaXplO1xuICB9XG5cbiAgcmV0dXJuIGgoXCJkaXZcIiwgX21lcmdlSlNYUHJvcHMoW3tcbiAgICBcImNsYXNzXCI6IGJlbShjbGFzc2VzKSxcbiAgICBcImF0dHJzXCI6IHtcbiAgICAgIFwicm9sZVwiOiBjbGlja2FibGUgPyAnYnV0dG9uJyA6IG51bGwsXG4gICAgICBcInRhYmluZGV4XCI6IGNsaWNrYWJsZSA/IDAgOiBudWxsXG4gICAgfSxcbiAgICBcIm9uXCI6IHtcbiAgICAgIFwiY2xpY2tcIjogb25DbGlja1xuICAgIH1cbiAgfSwgaW5oZXJpdChjdHgpXSksIFtMZWZ0SWNvbiwgVGl0bGUsIFZhbHVlLCBSaWdodEljb24sIHNsb3RzLmV4dHJhICYmIHNsb3RzLmV4dHJhKCldKTtcbn1cblxuQ2VsbC5wcm9wcyA9IF9leHRlbmRzKHt9LCBjZWxsUHJvcHMsIHt9LCByb3V0ZVByb3BzKTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudChDZWxsKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/cell/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/cell/shared.js":
/*!**********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/cell/shared.js ***!
\**********************************************************/
/*! exports provided: cellProps */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cellProps\", function() { return cellProps; });\nvar cellProps = {\n icon: String,\n size: String,\n center: Boolean,\n isLink: Boolean,\n required: Boolean,\n clickable: Boolean,\n titleStyle: null,\n titleClass: null,\n valueClass: null,\n labelClass: null,\n title: [Number, String],\n value: [Number, String],\n label: [Number, String],\n arrowDirection: String,\n border: {\n type: Boolean,\n default: true\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9zaGFyZWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9zaGFyZWQuanM/MGIxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIGNlbGxQcm9wcyA9IHtcbiAgaWNvbjogU3RyaW5nLFxuICBzaXplOiBTdHJpbmcsXG4gIGNlbnRlcjogQm9vbGVhbixcbiAgaXNMaW5rOiBCb29sZWFuLFxuICByZXF1aXJlZDogQm9vbGVhbixcbiAgY2xpY2thYmxlOiBCb29sZWFuLFxuICB0aXRsZVN0eWxlOiBudWxsLFxuICB0aXRsZUNsYXNzOiBudWxsLFxuICB2YWx1ZUNsYXNzOiBudWxsLFxuICBsYWJlbENsYXNzOiBudWxsLFxuICB0aXRsZTogW051bWJlciwgU3RyaW5nXSxcbiAgdmFsdWU6IFtOdW1iZXIsIFN0cmluZ10sXG4gIGxhYmVsOiBbTnVtYmVyLCBTdHJpbmddLFxuICBhcnJvd0RpcmVjdGlvbjogU3RyaW5nLFxuICBib3JkZXI6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGRlZmF1bHQ6IHRydWVcbiAgfVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/cell/shared.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css":
/*!*******************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"5ef806ae\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\", function() {\n var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3M/MGZkMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vaW5kZXguY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciBhZGQgPSByZXF1aXJlKFwiIS4uLy4uLy4uL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiNWVmODA2YWVcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vaW5kZXguY3NzXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js":
/*!******************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js ***!
\******************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/constant */ \"./node_modules/_vant@2.2.16@vant/es/utils/constant.js\");\n/* harmony import */ var _utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/dom/raf */ \"./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js\");\n/* harmony import */ var _cell__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../cell */ \"./node_modules/_vant@2.2.16@vant/es/cell/index.js\");\n/* harmony import */ var _cell_shared__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../cell/shared */ \"./node_modules/_vant@2.2.16@vant/es/cell/shared.js\");\n/* harmony import */ var _mixins_relation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/relation */ \"./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\");\n\n\n\n\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('collapse-item'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\nvar CELL_SLOTS = ['title', 'icon', 'right-icon'];\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n mixins: [Object(_mixins_relation__WEBPACK_IMPORTED_MODULE_6__[\"ChildrenMixin\"])('vanCollapse')],\n props: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _cell_shared__WEBPACK_IMPORTED_MODULE_5__[\"cellProps\"], {\n name: [Number, String],\n disabled: Boolean,\n isLink: {\n type: Boolean,\n default: true\n }\n }),\n data: function data() {\n return {\n show: null,\n inited: null\n };\n },\n computed: {\n currentName: function currentName() {\n return Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.name) ? this.name : this.index;\n },\n expanded: function expanded() {\n var _this = this;\n\n if (!this.parent) {\n return null;\n }\n\n var _this$parent = this.parent,\n value = _this$parent.value,\n accordion = _this$parent.accordion;\n\n if ( true && !accordion && !Array.isArray(value)) {\n console.error('[Vant] Collapse: type of prop \"value\" should be Array');\n return;\n }\n\n return accordion ? value === this.currentName : value.some(function (name) {\n return name === _this.currentName;\n });\n }\n },\n created: function created() {\n this.show = this.expanded;\n this.inited = this.expanded;\n },\n watch: {\n expanded: function expanded(_expanded, prev) {\n var _this2 = this;\n\n if (prev === null) {\n return;\n }\n\n if (_expanded) {\n this.show = true;\n this.inited = true;\n } // Use raf: flick when opened in safari\n // Use nextTick: closing animation failed when set `user-select: none`\n\n\n var nextTick = _expanded ? this.$nextTick : _utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__[\"raf\"];\n nextTick(function () {\n var _this2$$refs = _this2.$refs,\n content = _this2$$refs.content,\n wrapper = _this2$$refs.wrapper;\n\n if (!content || !wrapper) {\n return;\n }\n\n var offsetHeight = content.offsetHeight;\n\n if (offsetHeight) {\n var contentHeight = offsetHeight + \"px\";\n wrapper.style.height = _expanded ? 0 : contentHeight; // use double raf to ensure animation can start in mobile safari\n\n Object(_utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__[\"doubleRaf\"])(function () {\n wrapper.style.height = _expanded ? contentHeight : 0;\n });\n } else {\n _this2.onTransitionEnd();\n }\n });\n }\n },\n methods: {\n onClick: function onClick() {\n if (this.disabled) {\n return;\n }\n\n var parent = this.parent;\n var name = parent.accordion && this.currentName === parent.value ? '' : this.currentName;\n this.parent.switch(name, !this.expanded);\n },\n onTransitionEnd: function onTransitionEnd() {\n if (!this.expanded) {\n this.show = false;\n } else {\n this.$refs.wrapper.style.height = '';\n }\n }\n },\n render: function render() {\n var _this3 = this,\n _ref;\n\n var h = arguments[0];\n var disabled = this.disabled,\n expanded = this.expanded;\n var titleSlots = CELL_SLOTS.reduce(function (slots, name) {\n if (_this3.slots(name)) {\n slots[name] = function () {\n return _this3.slots(name);\n };\n }\n\n return slots;\n }, {});\n\n if (this.slots('value')) {\n titleSlots.default = function () {\n return _this3.slots('value');\n };\n }\n\n var Title = h(_cell__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n \"attrs\": {\n \"role\": \"button\",\n \"tabindex\": disabled ? -1 : 0,\n \"aria-expanded\": String(expanded)\n },\n \"class\": bem('title', {\n disabled: disabled,\n expanded: expanded\n }),\n \"on\": {\n \"click\": this.onClick\n },\n \"scopedSlots\": titleSlots,\n \"props\": Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, this.$props)\n });\n var Content = this.inited && h(\"div\", {\n \"directives\": [{\n name: \"show\",\n value: this.show\n }],\n \"ref\": \"wrapper\",\n \"class\": bem('wrapper'),\n \"on\": {\n \"transitionend\": this.onTransitionEnd\n }\n }, [h(\"div\", {\n \"ref\": \"content\",\n \"class\": bem('content')\n }, [this.slots()])]);\n return h(\"div\", {\n \"class\": [bem(), (_ref = {}, _ref[_utils_constant__WEBPACK_IMPORTED_MODULE_2__[\"BORDER_TOP\"]] = this.index, _ref)]\n }, [Title, Content]);\n }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jb2xsYXBzZS1pdGVtL2luZGV4LmpzPzNlODUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGlzRGVmIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQk9SREVSX1RPUCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50JztcbmltcG9ydCB7IHJhZiwgZG91YmxlUmFmIH0gZnJvbSAnLi4vdXRpbHMvZG9tL3JhZic7XG5pbXBvcnQgQ2VsbCBmcm9tICcuLi9jZWxsJztcbmltcG9ydCB7IGNlbGxQcm9wcyB9IGZyb20gJy4uL2NlbGwvc2hhcmVkJztcbmltcG9ydCB7IENoaWxkcmVuTWl4aW4gfSBmcm9tICcuLi9taXhpbnMvcmVsYXRpb24nO1xuXG52YXIgX2NyZWF0ZU5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnY29sbGFwc2UtaXRlbScpLFxuICAgIGNyZWF0ZUNvbXBvbmVudCA9IF9jcmVhdGVOYW1lc3BhY2VbMF0sXG4gICAgYmVtID0gX2NyZWF0ZU5hbWVzcGFjZVsxXTtcblxudmFyIENFTExfU0xPVFMgPSBbJ3RpdGxlJywgJ2ljb24nLCAncmlnaHQtaWNvbiddO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29tcG9uZW50KHtcbiAgbWl4aW5zOiBbQ2hpbGRyZW5NaXhpbigndmFuQ29sbGFwc2UnKV0sXG4gIHByb3BzOiBfZXh0ZW5kcyh7fSwgY2VsbFByb3BzLCB7XG4gICAgbmFtZTogW051bWJlciwgU3RyaW5nXSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBpc0xpbms6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9KSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogbnVsbCxcbiAgICAgIGluaXRlZDogbnVsbFxuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgY3VycmVudE5hbWU6IGZ1bmN0aW9uIGN1cnJlbnROYW1lKCkge1xuICAgICAgcmV0dXJuIGlzRGVmKHRoaXMubmFtZSkgPyB0aGlzLm5hbWUgOiB0aGlzLmluZGV4O1xuICAgIH0sXG4gICAgZXhwYW5kZWQ6IGZ1bmN0aW9uIGV4cGFuZGVkKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50LFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcGFyZW50LnZhbHVlLFxuICAgICAgICAgIGFjY29yZGlvbiA9IF90aGlzJHBhcmVudC5hY2NvcmRpb247XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFhY2NvcmRpb24gJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tWYW50XSBDb2xsYXBzZTogdHlwZSBvZiBwcm9wIFwidmFsdWVcIiBzaG91bGQgYmUgQXJyYXknKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjb3JkaW9uID8gdmFsdWUgPT09IHRoaXMuY3VycmVudE5hbWUgOiB2YWx1ZS5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBfdGhpcy5jdXJyZW50TmFtZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3cgPSB0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMuaW5pdGVkID0gdGhpcy5leHBhbmRlZDtcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBleHBhbmRlZDogZnVuY3Rpb24gZXhwYW5kZWQoX2V4cGFuZGVkLCBwcmV2KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2V4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gVXNlIHJhZjogZmxpY2sgd2hlbiBvcGVuZWQgaW4gc2FmYXJpXG4gICAgICAvLyBVc2UgbmV4dFRpY2s6IGNsb3NpbmcgYW5pbWF0aW9uIGZhaWxlZCB3aGVuIHNldCBgdXNlci1zZWxlY3Q6IG5vbmVgXG5cblxuICAgICAgdmFyIG5leHRUaWNrID0gX2V4cGFuZGVkID8gdGhpcy4kbmV4dFRpY2sgOiByYWY7XG4gICAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpczIkJHJlZnMgPSBfdGhpczIuJHJlZnMsXG4gICAgICAgICAgICBjb250ZW50ID0gX3RoaXMyJCRyZWZzLmNvbnRlbnQsXG4gICAgICAgICAgICB3cmFwcGVyID0gX3RoaXMyJCRyZWZzLndyYXBwZXI7XG5cbiAgICAgICAgaWYgKCFjb250ZW50IHx8ICF3cmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChvZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICB2YXIgY29udGVudEhlaWdodCA9IG9mZnNldEhlaWdodCArIFwicHhcIjtcbiAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IF9leHBhbmRlZCA/IDAgOiBjb250ZW50SGVpZ2h0OyAvLyB1c2UgZG91YmxlIHJhZiB0byBlbnN1cmUgYW5pbWF0aW9uIGNhbiBzdGFydCBpbiBtb2JpbGUgc2FmYXJpXG5cbiAgICAgICAgICBkb3VibGVSYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSBfZXhwYW5kZWQgPyBjb250ZW50SGVpZ2h0IDogMDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczIub25UcmFuc2l0aW9uRW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgIHZhciBuYW1lID0gcGFyZW50LmFjY29yZGlvbiAmJiB0aGlzLmN1cnJlbnROYW1lID09PSBwYXJlbnQudmFsdWUgPyAnJyA6IHRoaXMuY3VycmVudE5hbWU7XG4gICAgICB0aGlzLnBhcmVudC5zd2l0Y2gobmFtZSwgIXRoaXMuZXhwYW5kZWQpO1xuICAgIH0sXG4gICAgb25UcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICBpZiAoIXRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRyZWZzLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcyxcbiAgICAgICAgX3JlZjtcblxuICAgIHZhciBoID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBkaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQsXG4gICAgICAgIGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB2YXIgdGl0bGVTbG90cyA9IENFTExfU0xPVFMucmVkdWNlKGZ1bmN0aW9uIChzbG90cywgbmFtZSkge1xuICAgICAgaWYgKF90aGlzMy5zbG90cyhuYW1lKSkge1xuICAgICAgICBzbG90c1tuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLnNsb3RzKG5hbWUpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2xvdHM7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKHRoaXMuc2xvdHMoJ3ZhbHVlJykpIHtcbiAgICAgIHRpdGxlU2xvdHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5zbG90cygndmFsdWUnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIFRpdGxlID0gaChDZWxsLCB7XG4gICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwidGFiaW5kZXhcIjogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBTdHJpbmcoZXhwYW5kZWQpXG4gICAgICB9LFxuICAgICAgXCJjbGFzc1wiOiBiZW0oJ3RpdGxlJywge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICAgICAgfSksXG4gICAgICBcIm9uXCI6IHtcbiAgICAgICAgXCJjbGlja1wiOiB0aGlzLm9uQ2xpY2tcbiAgICAgIH0sXG4gICAgICBcInNjb3BlZFNsb3RzXCI6IHRpdGxlU2xvdHMsXG4gICAgICBcInByb3BzXCI6IF9leHRlbmRzKHt9LCB0aGlzLiRwcm9wcylcbiAgICB9KTtcbiAgICB2YXIgQ29udGVudCA9IHRoaXMuaW5pdGVkICYmIGgoXCJkaXZcIiwge1xuICAgICAgXCJkaXJlY3RpdmVzXCI6IFt7XG4gICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICB2YWx1ZTogdGhpcy5zaG93XG4gICAgICB9XSxcbiAgICAgIFwicmVmXCI6IFwid3JhcHBlclwiLFxuICAgICAgXCJjbGFzc1wiOiBiZW0oJ3dyYXBwZXInKSxcbiAgICAgIFwib25cIjoge1xuICAgICAgICBcInRyYW5zaXRpb25lbmRcIjogdGhpcy5vblRyYW5zaXRpb25FbmRcbiAgICAgIH1cbiAgICB9LCBbaChcImRpdlwiLCB7XG4gICAgICBcInJlZlwiOiBcImNvbnRlbnRcIixcbiAgICAgIFwiY2xhc3NcIjogYmVtKCdjb250ZW50JylcbiAgICB9LCBbdGhpcy5zbG90cygpXSldKTtcbiAgICByZXR1cm4gaChcImRpdlwiLCB7XG4gICAgICBcImNsYXNzXCI6IFtiZW0oKSwgKF9yZWYgPSB7fSwgX3JlZltCT1JERVJfVE9QXSA9IHRoaXMuaW5kZXgsIF9yZWYpXVxuICAgIH0sIFtUaXRsZSwgQ29udGVudF0pO1xuICB9XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js":
/*!************************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js ***!
\************************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../image/index.css */ \"./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_image_index_css__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../index.css */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_index_css__WEBPACK_IMPORTED_MODULE_2__);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9zdHlsZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jb2xsYXBzZS1pdGVtL3N0eWxlL2luZGV4LmpzPzYwNDkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi8uLi9zdHlsZS9iYXNlLmNzcyc7XG5pbXBvcnQgJy4uLy4uL2ltYWdlL2luZGV4LmNzcyc7XG5pbXBvcnQgJy4uL2luZGV4LmNzcyc7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/collapse/index.js":
/*!*************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/collapse/index.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _mixins_relation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/relation */ \"./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\");\n/* harmony import */ var _utils_constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/constant */ \"./node_modules/_vant@2.2.16@vant/es/utils/constant.js\");\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"createNamespace\"])('collapse'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n mixins: [Object(_mixins_relation__WEBPACK_IMPORTED_MODULE_1__[\"ParentMixin\"])('vanCollapse')],\n props: {\n accordion: Boolean,\n value: [String, Number, Array],\n border: {\n type: Boolean,\n default: true\n }\n },\n methods: {\n switch: function _switch(name, expanded) {\n if (!this.accordion) {\n name = expanded ? this.value.concat(name) : this.value.filter(function (activeName) {\n return activeName !== name;\n });\n }\n\n this.$emit('change', name);\n this.$emit('input', name);\n }\n },\n render: function render() {\n var _ref;\n\n var h = arguments[0];\n return h(\"div\", {\n \"class\": [bem(), (_ref = {}, _ref[_utils_constant__WEBPACK_IMPORTED_MODULE_2__[\"BORDER_TOP_BOTTOM\"]] = this.border, _ref)]\n }, [this.slots()]);\n }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UvaW5kZXguanM/YTI1YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBQYXJlbnRNaXhpbiB9IGZyb20gJy4uL21peGlucy9yZWxhdGlvbic7XG5pbXBvcnQgeyBCT1JERVJfVE9QX0JPVFRPTSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50JztcblxudmFyIF9jcmVhdGVOYW1lc3BhY2UgPSBjcmVhdGVOYW1lc3BhY2UoJ2NvbGxhcHNlJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoe1xuICBtaXhpbnM6IFtQYXJlbnRNaXhpbigndmFuQ29sbGFwc2UnKV0sXG4gIHByb3BzOiB7XG4gICAgYWNjb3JkaW9uOiBCb29sZWFuLFxuICAgIHZhbHVlOiBbU3RyaW5nLCBOdW1iZXIsIEFycmF5XSxcbiAgICBib3JkZXI6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgc3dpdGNoOiBmdW5jdGlvbiBfc3dpdGNoKG5hbWUsIGV4cGFuZGVkKSB7XG4gICAgICBpZiAoIXRoaXMuYWNjb3JkaW9uKSB7XG4gICAgICAgIG5hbWUgPSBleHBhbmRlZCA/IHRoaXMudmFsdWUuY29uY2F0KG5hbWUpIDogdGhpcy52YWx1ZS5maWx0ZXIoZnVuY3Rpb24gKGFjdGl2ZU5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZlTmFtZSAhPT0gbmFtZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIG5hbWUpO1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBuYW1lKTtcbiAgICB9XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG4gICAgcmV0dXJuIGgoXCJkaXZcIiwge1xuICAgICAgXCJjbGFzc1wiOiBbYmVtKCksIChfcmVmID0ge30sIF9yZWZbQk9SREVSX1RPUF9CT1RUT01dID0gdGhpcy5ib3JkZXIsIF9yZWYpXVxuICAgIH0sIFt0aGlzLnNsb3RzKCldKTtcbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js":
/*!*******************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js ***!
\*******************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2Uvc3R5bGUvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2Uvc3R5bGUvaW5kZXguanM/NThkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4uLy4uL3N0eWxlL2Jhc2UuY3NzJzsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/icon/index.js":
/*!*********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/icon/index.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n/* harmony import */ var _info__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../info */ \"./node_modules/_vant@2.2.16@vant/es/info/index.js\");\n/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../image */ \"./node_modules/_vant@2.2.16@vant/es/image/index.js\");\n\n\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('icon'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\nfunction isImage(name) {\n return name ? name.indexOf('/') !== -1 : false;\n}\n\nfunction Icon(h, props, slots, ctx) {\n var imageIcon = isImage(props.name);\n return h(props.tag, _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n \"class\": [props.classPrefix, imageIcon ? '' : props.classPrefix + \"-\" + props.name],\n \"style\": {\n color: props.color,\n fontSize: Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(props.size)\n }\n }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_2__[\"inherit\"])(ctx, true)]), [slots.default && slots.default(), imageIcon && h(_image__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n \"class\": bem('image'),\n \"attrs\": {\n \"fit\": \"contain\",\n \"src\": props.name,\n \"showLoading\": false\n }\n }), h(_info__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n \"attrs\": {\n \"dot\": props.dot,\n \"info\": props.info\n }\n })]);\n}\n\nIcon.props = {\n dot: Boolean,\n name: String,\n size: [Number, String],\n info: [Number, String],\n color: String,\n tag: {\n type: String,\n default: 'i'\n },\n classPrefix: {\n type: String,\n default: bem()\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Icon));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaWNvbi9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pY29uL2luZGV4LmpzP2EwYzgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9tZXJnZUpTWFByb3BzIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGFkZFVuaXQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBpbmhlcml0IH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25hbCc7XG5pbXBvcnQgSW5mbyBmcm9tICcuLi9pbmZvJztcbmltcG9ydCBJbWFnZSBmcm9tICcuLi9pbWFnZSc7IC8vIFR5cGVzXG5cbnZhciBfY3JlYXRlTmFtZXNwYWNlID0gY3JlYXRlTmFtZXNwYWNlKCdpY29uJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5mdW5jdGlvbiBpc0ltYWdlKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgPyBuYW1lLmluZGV4T2YoJy8nKSAhPT0gLTEgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gSWNvbihoLCBwcm9wcywgc2xvdHMsIGN0eCkge1xuICB2YXIgaW1hZ2VJY29uID0gaXNJbWFnZShwcm9wcy5uYW1lKTtcbiAgcmV0dXJuIGgocHJvcHMudGFnLCBfbWVyZ2VKU1hQcm9wcyhbe1xuICAgIFwiY2xhc3NcIjogW3Byb3BzLmNsYXNzUHJlZml4LCBpbWFnZUljb24gPyAnJyA6IHByb3BzLmNsYXNzUHJlZml4ICsgXCItXCIgKyBwcm9wcy5uYW1lXSxcbiAgICBcInN0eWxlXCI6IHtcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgIGZvbnRTaXplOiBhZGRVbml0KHByb3BzLnNpemUpXG4gICAgfVxuICB9LCBpbmhlcml0KGN0eCwgdHJ1ZSldKSwgW3Nsb3RzLmRlZmF1bHQgJiYgc2xvdHMuZGVmYXVsdCgpLCBpbWFnZUljb24gJiYgaChJbWFnZSwge1xuICAgIFwiY2xhc3NcIjogYmVtKCdpbWFnZScpLFxuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJmaXRcIjogXCJjb250YWluXCIsXG4gICAgICBcInNyY1wiOiBwcm9wcy5uYW1lLFxuICAgICAgXCJzaG93TG9hZGluZ1wiOiBmYWxzZVxuICAgIH1cbiAgfSksIGgoSW5mbywge1xuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJkb3RcIjogcHJvcHMuZG90LFxuICAgICAgXCJpbmZvXCI6IHByb3BzLmluZm9cbiAgICB9XG4gIH0pXSk7XG59XG5cbkljb24ucHJvcHMgPSB7XG4gIGRvdDogQm9vbGVhbixcbiAgbmFtZTogU3RyaW5nLFxuICBzaXplOiBbTnVtYmVyLCBTdHJpbmddLFxuICBpbmZvOiBbTnVtYmVyLCBTdHJpbmddLFxuICBjb2xvcjogU3RyaW5nLFxuICB0YWc6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogJ2knXG4gIH0sXG4gIGNsYXNzUHJlZml4OiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IGJlbSgpXG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoSWNvbik7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/icon/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/icon/style/index.js":
/*!***************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/icon/style/index.js ***!
\***************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../image/index.css */ \"./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_image_index_css__WEBPACK_IMPORTED_MODULE_1__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaWNvbi9zdHlsZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pY29uL3N0eWxlL2luZGV4LmpzPzk0MGIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi8uLi9zdHlsZS9iYXNlLmNzcyc7XG5pbXBvcnQgJy4uLy4uL2ltYWdlL2luZGV4LmNzcyc7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/icon/style/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/image/index.css":
/*!***********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/image/index.css ***!
\***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"9269565e\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\", function() {\n var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2ltYWdlL2luZGV4LmNzcz9jZmRhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI5MjY5NTY1ZVwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2luZGV4LmNzc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/image/index.css\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/image/index.js":
/*!**********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/image/index.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('image'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n props: {\n src: String,\n fit: String,\n alt: String,\n round: Boolean,\n width: [Number, String],\n height: [Number, String],\n radius: [Number, String],\n lazyLoad: Boolean,\n showError: {\n type: Boolean,\n default: true\n },\n showLoading: {\n type: Boolean,\n default: true\n }\n },\n data: function data() {\n return {\n loading: true,\n error: false\n };\n },\n watch: {\n src: function src() {\n this.loading = true;\n this.error = false;\n }\n },\n computed: {\n style: function style() {\n var style = {};\n\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.width)) {\n style.width = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.width);\n }\n\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.height)) {\n style.height = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.height);\n }\n\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.radius)) {\n style.overflow = 'hidden';\n style.borderRadius = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.radius);\n }\n\n return style;\n }\n },\n created: function created() {\n var $Lazyload = this.$Lazyload;\n\n if ($Lazyload) {\n $Lazyload.$on('loaded', this.onLazyLoaded);\n $Lazyload.$on('error', this.onLazyLoadError);\n }\n },\n beforeDestroy: function beforeDestroy() {\n var $Lazyload = this.$Lazyload;\n\n if ($Lazyload) {\n $Lazyload.$off('loaded', this.onLazyLoaded);\n $Lazyload.$off('error', this.onLazyLoadError);\n }\n },\n methods: {\n onLoad: function onLoad(event) {\n this.loading = false;\n this.$emit('load', event);\n },\n onLazyLoaded: function onLazyLoaded(_ref) {\n var el = _ref.el;\n\n if (el === this.$refs.image && this.loading) {\n this.onLoad();\n }\n },\n onLazyLoadError: function onLazyLoadError(_ref2) {\n var el = _ref2.el;\n\n if (el === this.$refs.image && !this.error) {\n this.onError();\n }\n },\n onError: function onError(event) {\n this.error = true;\n this.loading = false;\n this.$emit('error', event);\n },\n onClick: function onClick(event) {\n this.$emit('click', event);\n },\n genPlaceholder: function genPlaceholder() {\n var h = this.$createElement;\n\n if (this.loading && this.showLoading) {\n return h(\"div\", {\n \"class\": bem('loading')\n }, [this.slots('loading') || h(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n \"attrs\": {\n \"name\": \"photo-o\",\n \"size\": \"22\"\n }\n })]);\n }\n\n if (this.error && this.showError) {\n return h(\"div\", {\n \"class\": bem('error')\n }, [this.slots('error') || h(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n \"attrs\": {\n \"name\": \"warning-o\",\n \"size\": \"22\"\n }\n })]);\n }\n },\n genImage: function genImage() {\n var h = this.$createElement;\n var imgData = {\n class: bem('img'),\n attrs: {\n alt: this.alt\n },\n style: {\n objectFit: this.fit\n }\n };\n\n if (this.error) {\n return;\n }\n\n if (this.lazyLoad) {\n return h(\"img\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n \"ref\": \"image\",\n \"directives\": [{\n name: \"lazy\",\n value: this.src\n }]\n }, imgData]));\n }\n\n return h(\"img\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n \"attrs\": {\n \"src\": this.src\n },\n \"on\": {\n \"load\": this.onLoad,\n \"error\": this.onError\n }\n }, imgData]));\n }\n },\n render: function render() {\n var h = arguments[0];\n return h(\"div\", {\n \"class\": bem({\n round: this.round\n }),\n \"style\": this.style,\n \"on\": {\n \"click\": this.onClick\n }\n }, [this.genImage(), this.genPlaceholder()]);\n }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguanM/MDljMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX21lcmdlSlNYUHJvcHMyIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgX21lcmdlSlNYUHJvcHMgZnJvbSBcIkB2dWUvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNcIjtcbmltcG9ydCB7IGNyZWF0ZU5hbWVzcGFjZSwgaXNEZWYsIGFkZFVuaXQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi9pY29uJztcblxudmFyIF9jcmVhdGVOYW1lc3BhY2UgPSBjcmVhdGVOYW1lc3BhY2UoJ2ltYWdlJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIHNyYzogU3RyaW5nLFxuICAgIGZpdDogU3RyaW5nLFxuICAgIGFsdDogU3RyaW5nLFxuICAgIHJvdW5kOiBCb29sZWFuLFxuICAgIHdpZHRoOiBbTnVtYmVyLCBTdHJpbmddLFxuICAgIGhlaWdodDogW051bWJlciwgU3RyaW5nXSxcbiAgICByYWRpdXM6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgbGF6eUxvYWQ6IEJvb2xlYW4sXG4gICAgc2hvd0Vycm9yOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgc2hvd0xvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgZXJyb3I6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBzcmM6IGZ1bmN0aW9uIHNyYygpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZSgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgICBpZiAoaXNEZWYodGhpcy53aWR0aCkpIHtcbiAgICAgICAgc3R5bGUud2lkdGggPSBhZGRVbml0KHRoaXMud2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWYodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGFkZFVuaXQodGhpcy5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWYodGhpcy5yYWRpdXMpKSB7XG4gICAgICAgIHN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgIHN0eWxlLmJvcmRlclJhZGl1cyA9IGFkZFVuaXQodGhpcy5yYWRpdXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuICB9LFxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHZhciAkTGF6eWxvYWQgPSB0aGlzLiRMYXp5bG9hZDtcblxuICAgIGlmICgkTGF6eWxvYWQpIHtcbiAgICAgICRMYXp5bG9hZC4kb24oJ2xvYWRlZCcsIHRoaXMub25MYXp5TG9hZGVkKTtcbiAgICAgICRMYXp5bG9hZC4kb24oJ2Vycm9yJywgdGhpcy5vbkxhenlMb2FkRXJyb3IpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICB2YXIgJExhenlsb2FkID0gdGhpcy4kTGF6eWxvYWQ7XG5cbiAgICBpZiAoJExhenlsb2FkKSB7XG4gICAgICAkTGF6eWxvYWQuJG9mZignbG9hZGVkJywgdGhpcy5vbkxhenlMb2FkZWQpO1xuICAgICAgJExhenlsb2FkLiRvZmYoJ2Vycm9yJywgdGhpcy5vbkxhenlMb2FkRXJyb3IpO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIG9uTG9hZDogZnVuY3Rpb24gb25Mb2FkKGV2ZW50KSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2xvYWQnLCBldmVudCk7XG4gICAgfSxcbiAgICBvbkxhenlMb2FkZWQ6IGZ1bmN0aW9uIG9uTGF6eUxvYWRlZChfcmVmKSB7XG4gICAgICB2YXIgZWwgPSBfcmVmLmVsO1xuXG4gICAgICBpZiAoZWwgPT09IHRoaXMuJHJlZnMuaW1hZ2UgJiYgdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHRoaXMub25Mb2FkKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkxhenlMb2FkRXJyb3I6IGZ1bmN0aW9uIG9uTGF6eUxvYWRFcnJvcihfcmVmMikge1xuICAgICAgdmFyIGVsID0gX3JlZjIuZWw7XG5cbiAgICAgIGlmIChlbCA9PT0gdGhpcy4kcmVmcy5pbWFnZSAmJiAhdGhpcy5lcnJvcikge1xuICAgICAgICB0aGlzLm9uRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZXZlbnQpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcicsIGV2ZW50KTtcbiAgICB9LFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrJywgZXZlbnQpO1xuICAgIH0sXG4gICAgZ2VuUGxhY2Vob2xkZXI6IGZ1bmN0aW9uIGdlblBsYWNlaG9sZGVyKCkge1xuICAgICAgdmFyIGggPSB0aGlzLiRjcmVhdGVFbGVtZW50O1xuXG4gICAgICBpZiAodGhpcy5sb2FkaW5nICYmIHRoaXMuc2hvd0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIGgoXCJkaXZcIiwge1xuICAgICAgICAgIFwiY2xhc3NcIjogYmVtKCdsb2FkaW5nJylcbiAgICAgICAgfSwgW3RoaXMuc2xvdHMoJ2xvYWRpbmcnKSB8fCBoKEljb24sIHtcbiAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBob3RvLW9cIixcbiAgICAgICAgICAgIFwic2l6ZVwiOiBcIjIyXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0pXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVycm9yICYmIHRoaXMuc2hvd0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBoKFwiZGl2XCIsIHtcbiAgICAgICAgICBcImNsYXNzXCI6IGJlbSgnZXJyb3InKVxuICAgICAgICB9LCBbdGhpcy5zbG90cygnZXJyb3InKSB8fCBoKEljb24sIHtcbiAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIndhcm5pbmctb1wiLFxuICAgICAgICAgICAgXCJzaXplXCI6IFwiMjJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSldKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdlbkltYWdlOiBmdW5jdGlvbiBnZW5JbWFnZSgpIHtcbiAgICAgIHZhciBoID0gdGhpcy4kY3JlYXRlRWxlbWVudDtcbiAgICAgIHZhciBpbWdEYXRhID0ge1xuICAgICAgICBjbGFzczogYmVtKCdpbWcnKSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBhbHQ6IHRoaXMuYWx0XG4gICAgICAgIH0sXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgb2JqZWN0Rml0OiB0aGlzLmZpdFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XG4gICAgICAgIHJldHVybiBoKFwiaW1nXCIsIF9tZXJnZUpTWFByb3BzKFt7XG4gICAgICAgICAgXCJyZWZcIjogXCJpbWFnZVwiLFxuICAgICAgICAgIFwiZGlyZWN0aXZlc1wiOiBbe1xuICAgICAgICAgICAgbmFtZTogXCJsYXp5XCIsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5zcmNcbiAgICAgICAgICB9XVxuICAgICAgICB9LCBpbWdEYXRhXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaChcImltZ1wiLCBfbWVyZ2VKU1hQcm9wczIoW3tcbiAgICAgICAgXCJhdHRyc1wiOiB7XG4gICAgICAgICAgXCJzcmNcIjogdGhpcy5zcmNcbiAgICAgICAgfSxcbiAgICAgICAgXCJvblwiOiB7XG4gICAgICAgICAgXCJsb2FkXCI6IHRoaXMub25Mb2FkLFxuICAgICAgICAgIFwiZXJyb3JcIjogdGhpcy5vbkVycm9yXG4gICAgICAgIH1cbiAgICAgIH0sIGltZ0RhdGFdKSk7XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgaCA9IGFyZ3VtZW50c1swXTtcbiAgICByZXR1cm4gaChcImRpdlwiLCB7XG4gICAgICBcImNsYXNzXCI6IGJlbSh7XG4gICAgICAgIHJvdW5kOiB0aGlzLnJvdW5kXG4gICAgICB9KSxcbiAgICAgIFwic3R5bGVcIjogdGhpcy5zdHlsZSxcbiAgICAgIFwib25cIjoge1xuICAgICAgICBcImNsaWNrXCI6IHRoaXMub25DbGlja1xuICAgICAgfVxuICAgIH0sIFt0aGlzLmdlbkltYWdlKCksIHRoaXMuZ2VuUGxhY2Vob2xkZXIoKV0pO1xuICB9XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/image/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/info/index.js":
/*!*********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/info/index.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('info'),\n createComponent = _createNamespace[0],\n bem = _createNamespace[1];\n\nfunction Info(h, props, slots, ctx) {\n var dot = props.dot,\n info = props.info;\n var showInfo = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(info) && info !== '';\n\n if (!dot && !showInfo) {\n return;\n }\n\n return h(\"div\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n \"class\": bem({\n dot: dot\n })\n }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_2__[\"inherit\"])(ctx, true)]), [dot ? '' : props.info]);\n}\n\nInfo.props = {\n dot: Boolean,\n info: [Number, String]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Info));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW5mby9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pbmZvL2luZGV4LmpzPzdjNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9tZXJnZUpTWFByb3BzIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGlzRGVmIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgaW5oZXJpdCB9IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9uYWwnOyAvLyBUeXBlc1xuXG52YXIgX2NyZWF0ZU5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnaW5mbycpLFxuICAgIGNyZWF0ZUNvbXBvbmVudCA9IF9jcmVhdGVOYW1lc3BhY2VbMF0sXG4gICAgYmVtID0gX2NyZWF0ZU5hbWVzcGFjZVsxXTtcblxuZnVuY3Rpb24gSW5mbyhoLCBwcm9wcywgc2xvdHMsIGN0eCkge1xuICB2YXIgZG90ID0gcHJvcHMuZG90LFxuICAgICAgaW5mbyA9IHByb3BzLmluZm87XG4gIHZhciBzaG93SW5mbyA9IGlzRGVmKGluZm8pICYmIGluZm8gIT09ICcnO1xuXG4gIGlmICghZG90ICYmICFzaG93SW5mbykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBoKFwiZGl2XCIsIF9tZXJnZUpTWFByb3BzKFt7XG4gICAgXCJjbGFzc1wiOiBiZW0oe1xuICAgICAgZG90OiBkb3RcbiAgICB9KVxuICB9LCBpbmhlcml0KGN0eCwgdHJ1ZSldKSwgW2RvdCA/ICcnIDogcHJvcHMuaW5mb10pO1xufVxuXG5JbmZvLnByb3BzID0ge1xuICBkb3Q6IEJvb2xlYW4sXG4gIGluZm86IFtOdW1iZXIsIFN0cmluZ11cbn07XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoSW5mbyk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/info/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/locale/index.js":
/*!***********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/locale/index.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _utils_deep_assign__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/deep-assign */ \"./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js\");\n/* harmony import */ var _lang_zh_CN__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lang/zh-CN */ \"./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js\");\n\n\n\nvar proto = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype;\nvar defineReactive = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].util.defineReactive;\ndefineReactive(proto, '$vantLang', 'zh-CN');\ndefineReactive(proto, '$vantMessages', {\n 'zh-CN': _lang_zh_CN__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n messages: function messages() {\n return proto.$vantMessages[proto.$vantLang];\n },\n use: function use(lang, messages) {\n var _this$add;\n\n proto.$vantLang = lang;\n this.add((_this$add = {}, _this$add[lang] = messages, _this$add));\n },\n add: function add(messages) {\n if (messages === void 0) {\n messages = {};\n }\n\n Object(_utils_deep_assign__WEBPACK_IMPORTED_MODULE_1__[\"deepAssign\"])(proto.$vantMessages, messages);\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2xvY2FsZS9pbmRleC5qcz9mNTg1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJztcbmltcG9ydCB7IGRlZXBBc3NpZ24gfSBmcm9tICcuLi91dGlscy9kZWVwLWFzc2lnbic7XG5pbXBvcnQgZGVmYXVsdE1lc3NhZ2VzIGZyb20gJy4vbGFuZy96aC1DTic7XG52YXIgcHJvdG8gPSBWdWUucHJvdG90eXBlO1xudmFyIGRlZmluZVJlYWN0aXZlID0gVnVlLnV0aWwuZGVmaW5lUmVhY3RpdmU7XG5kZWZpbmVSZWFjdGl2ZShwcm90bywgJyR2YW50TGFuZycsICd6aC1DTicpO1xuZGVmaW5lUmVhY3RpdmUocHJvdG8sICckdmFudE1lc3NhZ2VzJywge1xuICAnemgtQ04nOiBkZWZhdWx0TWVzc2FnZXNcbn0pO1xuZXhwb3J0IGRlZmF1bHQge1xuICBtZXNzYWdlczogZnVuY3Rpb24gbWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHByb3RvLiR2YW50TWVzc2FnZXNbcHJvdG8uJHZhbnRMYW5nXTtcbiAgfSxcbiAgdXNlOiBmdW5jdGlvbiB1c2UobGFuZywgbWVzc2FnZXMpIHtcbiAgICB2YXIgX3RoaXMkYWRkO1xuXG4gICAgcHJvdG8uJHZhbnRMYW5nID0gbGFuZztcbiAgICB0aGlzLmFkZCgoX3RoaXMkYWRkID0ge30sIF90aGlzJGFkZFtsYW5nXSA9IG1lc3NhZ2VzLCBfdGhpcyRhZGQpKTtcbiAgfSxcbiAgYWRkOiBmdW5jdGlvbiBhZGQobWVzc2FnZXMpIHtcbiAgICBpZiAobWVzc2FnZXMgPT09IHZvaWQgMCkge1xuICAgICAgbWVzc2FnZXMgPSB7fTtcbiAgICB9XG5cbiAgICBkZWVwQXNzaWduKHByb3RvLiR2YW50TWVzc2FnZXMsIG1lc3NhZ2VzKTtcbiAgfVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/locale/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js":
/*!****************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: '姓名',\n tel: '电话',\n save: '保存',\n confirm: '确认',\n cancel: '取消',\n delete: '删除',\n complete: '完成',\n loading: '加载中...',\n telEmpty: '请填写电话',\n nameEmpty: '请填写姓名',\n confirmDelete: '确定要删除么',\n telInvalid: '请填写正确的电话',\n vanContactCard: {\n addText: '添加联系人'\n },\n vanContactList: {\n addText: '新建联系人'\n },\n vanPagination: {\n prev: '上一页',\n next: '下一页'\n },\n vanPullRefresh: {\n pulling: '下拉即可刷新...',\n loosing: '释放即可刷新...'\n },\n vanSubmitBar: {\n label: '合计:'\n },\n vanCoupon: {\n valid: '有效期',\n unlimited: '无使用门槛',\n discount: function discount(_discount) {\n return _discount + \"\\u6298\";\n },\n condition: function condition(_condition) {\n return \"\\u6EE1\" + _condition + \"\\u5143\\u53EF\\u7528\";\n }\n },\n vanCouponCell: {\n title: '优惠券',\n tips: '使用优惠',\n count: function count(_count) {\n return _count + \"\\u5F20\\u53EF\\u7528\";\n }\n },\n vanCouponList: {\n empty: '暂无优惠券',\n exchange: '兑换',\n close: '不使用优惠',\n enable: '可使用优惠券',\n disabled: '不可使用优惠券',\n placeholder: '请输入优惠码'\n },\n vanAddressEdit: {\n area: '地区',\n postal: '邮政编码',\n areaEmpty: '请选择地区',\n addressEmpty: '请填写详细地址',\n postalEmpty: '邮政编码格式不正确',\n defaultAddress: '设为默认收货地址',\n telPlaceholder: '收货人手机号',\n namePlaceholder: '收货人姓名',\n areaPlaceholder: '选择省 / 市 / 区'\n },\n vanAddressEditDetail: {\n label: '详细地址',\n placeholder: '街道门牌、楼层房间号等信息'\n },\n vanAddressList: {\n add: '新增地址'\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2xhbmcvemgtQ04uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2xhbmcvemgtQ04uanM/NzdkNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICflp5PlkI0nLFxuICB0ZWw6ICfnlLXor50nLFxuICBzYXZlOiAn5L+d5a2YJyxcbiAgY29uZmlybTogJ+ehruiupCcsXG4gIGNhbmNlbDogJ+WPlua2iCcsXG4gIGRlbGV0ZTogJ+WIoOmZpCcsXG4gIGNvbXBsZXRlOiAn5a6M5oiQJyxcbiAgbG9hZGluZzogJ+WKoOi9veS4rS4uLicsXG4gIHRlbEVtcHR5OiAn6K+35aGr5YaZ55S16K+dJyxcbiAgbmFtZUVtcHR5OiAn6K+35aGr5YaZ5aeT5ZCNJyxcbiAgY29uZmlybURlbGV0ZTogJ+ehruWumuimgeWIoOmZpOS5iCcsXG4gIHRlbEludmFsaWQ6ICfor7floavlhpnmraPnoa7nmoTnlLXor50nLFxuICB2YW5Db250YWN0Q2FyZDoge1xuICAgIGFkZFRleHQ6ICfmt7vliqDogZTns7vkuronXG4gIH0sXG4gIHZhbkNvbnRhY3RMaXN0OiB7XG4gICAgYWRkVGV4dDogJ+aWsOW7uuiBlOezu+S6uidcbiAgfSxcbiAgdmFuUGFnaW5hdGlvbjoge1xuICAgIHByZXY6ICfkuIrkuIDpobUnLFxuICAgIG5leHQ6ICfkuIvkuIDpobUnXG4gIH0sXG4gIHZhblB1bGxSZWZyZXNoOiB7XG4gICAgcHVsbGluZzogJ+S4i+aLieWNs+WPr+WIt+aWsC4uLicsXG4gICAgbG9vc2luZzogJ+mHiuaUvuWNs+WPr+WIt+aWsC4uLidcbiAgfSxcbiAgdmFuU3VibWl0QmFyOiB7XG4gICAgbGFiZWw6ICflkIjorqHvvJonXG4gIH0sXG4gIHZhbkNvdXBvbjoge1xuICAgIHZhbGlkOiAn5pyJ5pWI5pyfJyxcbiAgICB1bmxpbWl0ZWQ6ICfml6Dkvb/nlKjpl6jmp5snLFxuICAgIGRpc2NvdW50OiBmdW5jdGlvbiBkaXNjb3VudChfZGlzY291bnQpIHtcbiAgICAgIHJldHVybiBfZGlzY291bnQgKyBcIlxcdTYyOThcIjtcbiAgICB9LFxuICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gY29uZGl0aW9uKF9jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBcIlxcdTZFRTFcIiArIF9jb25kaXRpb24gKyBcIlxcdTUxNDNcXHU1M0VGXFx1NzUyOFwiO1xuICAgIH1cbiAgfSxcbiAgdmFuQ291cG9uQ2VsbDoge1xuICAgIHRpdGxlOiAn5LyY5oOg5Yi4JyxcbiAgICB0aXBzOiAn5L2/55So5LyY5oOgJyxcbiAgICBjb3VudDogZnVuY3Rpb24gY291bnQoX2NvdW50KSB7XG4gICAgICByZXR1cm4gX2NvdW50ICsgXCJcXHU1RjIwXFx1NTNFRlxcdTc1MjhcIjtcbiAgICB9XG4gIH0sXG4gIHZhbkNvdXBvbkxpc3Q6IHtcbiAgICBlbXB0eTogJ+aaguaXoOS8mOaDoOWIuCcsXG4gICAgZXhjaGFuZ2U6ICflhZHmjaInLFxuICAgIGNsb3NlOiAn5LiN5L2/55So5LyY5oOgJyxcbiAgICBlbmFibGU6ICflj6/kvb/nlKjkvJjmg6DliLgnLFxuICAgIGRpc2FibGVkOiAn5LiN5Y+v5L2/55So5LyY5oOg5Yi4JyxcbiAgICBwbGFjZWhvbGRlcjogJ+ivt+i+k+WFpeS8mOaDoOeggSdcbiAgfSxcbiAgdmFuQWRkcmVzc0VkaXQ6IHtcbiAgICBhcmVhOiAn5Zyw5Yy6JyxcbiAgICBwb3N0YWw6ICfpgq7mlL/nvJbnoIEnLFxuICAgIGFyZWFFbXB0eTogJ+ivt+mAieaLqeWcsOWMuicsXG4gICAgYWRkcmVzc0VtcHR5OiAn6K+35aGr5YaZ6K+m57uG5Zyw5Z2AJyxcbiAgICBwb3N0YWxFbXB0eTogJ+mCruaUv+e8lueggeagvOW8j+S4jeato+ehricsXG4gICAgZGVmYXVsdEFkZHJlc3M6ICforr7kuLrpu5jorqTmlLbotKflnLDlnYAnLFxuICAgIHRlbFBsYWNlaG9sZGVyOiAn5pS26LSn5Lq65omL5py65Y+3JyxcbiAgICBuYW1lUGxhY2Vob2xkZXI6ICfmlLbotKfkurrlp5PlkI0nLFxuICAgIGFyZWFQbGFjZWhvbGRlcjogJ+mAieaLqeecgSAvIOW4giAvIOWMuidcbiAgfSxcbiAgdmFuQWRkcmVzc0VkaXREZXRhaWw6IHtcbiAgICBsYWJlbDogJ+ivpue7huWcsOWdgCcsXG4gICAgcGxhY2Vob2xkZXI6ICfooZfpgZPpl6jniYzjgIHmpbzlsYLmiL/pl7Tlj7fnrYnkv6Hmga8nXG4gIH0sXG4gIHZhbkFkZHJlc3NMaXN0OiB7XG4gICAgYWRkOiAn5paw5aKe5Zyw5Z2AJ1xuICB9XG59OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/mixins/relation.js":
/*!**************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/mixins/relation.js ***!
\**************************************************************/
/*! exports provided: ChildrenMixin, ParentMixin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ChildrenMixin\", function() { return ChildrenMixin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ParentMixin\", function() { return ParentMixin; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n\n\nfunction flattenVNodes(vnodes) {\n var result = [];\n\n function traverse(vnodes) {\n vnodes.forEach(function (vnode) {\n result.push(vnode);\n\n if (vnode.children) {\n traverse(vnode.children);\n }\n });\n }\n\n traverse(vnodes);\n return result;\n}\n\nfunction ChildrenMixin(_parent, options) {\n var _inject, _computed;\n\n if (options === void 0) {\n options = {};\n }\n\n var indexKey = options.indexKey || 'index';\n return vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].extend({\n inject: (_inject = {}, _inject[_parent] = {\n default: null\n }, _inject),\n computed: (_computed = {\n parent: function parent() {\n if (this.disableBindRelation) {\n return null;\n }\n\n return this[_parent];\n }\n }, _computed[indexKey] = function () {\n this.bindRelation();\n return this.parent.children.indexOf(this);\n }, _computed),\n mounted: function mounted() {\n this.bindRelation();\n },\n beforeDestroy: function beforeDestroy() {\n var _this = this;\n\n if (this.parent) {\n this.parent.children = this.parent.children.filter(function (item) {\n return item !== _this;\n });\n }\n },\n methods: {\n bindRelation: function bindRelation() {\n if (!this.parent || this.parent.children.indexOf(this) !== -1) {\n return;\n }\n\n var children = [].concat(this.parent.children, [this]);\n var vnodes = flattenVNodes(this.parent.slots());\n children.sort(function (a, b) {\n return vnodes.indexOf(a.$vnode) - vnodes.indexOf(b.$vnode);\n });\n this.parent.children = children;\n }\n }\n });\n}\nfunction ParentMixin(parent) {\n return {\n provide: function provide() {\n var _ref;\n\n return _ref = {}, _ref[parent] = this, _ref;\n },\n data: function data() {\n return {\n children: []\n };\n }\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbWl4aW5zL3JlbGF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL21peGlucy9yZWxhdGlvbi5qcz9hNTVlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJztcblxuZnVuY3Rpb24gZmxhdHRlblZOb2Rlcyh2bm9kZXMpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZ1bmN0aW9uIHRyYXZlcnNlKHZub2Rlcykge1xuICAgIHZub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgcmVzdWx0LnB1c2godm5vZGUpO1xuXG4gICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgdHJhdmVyc2Uodm5vZGUuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhdmVyc2Uodm5vZGVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENoaWxkcmVuTWl4aW4oX3BhcmVudCwgb3B0aW9ucykge1xuICB2YXIgX2luamVjdCwgX2NvbXB1dGVkO1xuXG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgaW5kZXhLZXkgPSBvcHRpb25zLmluZGV4S2V5IHx8ICdpbmRleCc7XG4gIHJldHVybiBWdWUuZXh0ZW5kKHtcbiAgICBpbmplY3Q6IChfaW5qZWN0ID0ge30sIF9pbmplY3RbX3BhcmVudF0gPSB7XG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSwgX2luamVjdCksXG4gICAgY29tcHV0ZWQ6IChfY29tcHV0ZWQgPSB7XG4gICAgICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUJpbmRSZWxhdGlvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNbX3BhcmVudF07XG4gICAgICB9XG4gICAgfSwgX2NvbXB1dGVkW2luZGV4S2V5XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYmluZFJlbGF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICB9LCBfY29tcHV0ZWQpLFxuICAgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLmJpbmRSZWxhdGlvbigpO1xuICAgIH0sXG4gICAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5jaGlsZHJlbiA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtICE9PSBfdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBiaW5kUmVsYXRpb246IGZ1bmN0aW9uIGJpbmRSZWxhdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCB8fCB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpICE9PSAtMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdLmNvbmNhdCh0aGlzLnBhcmVudC5jaGlsZHJlbiwgW3RoaXNdKTtcbiAgICAgICAgdmFyIHZub2RlcyA9IGZsYXR0ZW5WTm9kZXModGhpcy5wYXJlbnQuc2xvdHMoKSk7XG4gICAgICAgIGNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICByZXR1cm4gdm5vZGVzLmluZGV4T2YoYS4kdm5vZGUpIC0gdm5vZGVzLmluZGV4T2YoYi4kdm5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFBhcmVudE1peGluKHBhcmVudCkge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltwYXJlbnRdID0gdGhpcywgX3JlZjtcbiAgICB9LFxuICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH07XG4gICAgfVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/mixins/slots.js":
/*!***********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/mixins/slots.js ***!
\***********************************************************/
/*! exports provided: SlotsMixin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SlotsMixin\", function() { return SlotsMixin; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/**\n * Use scopedSlots in Vue 2.6+\n * downgrade to slots in lower version\n */\n\nvar SlotsMixin = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].extend({\n methods: {\n slots: function slots(name, props) {\n if (name === void 0) {\n name = 'default';\n }\n\n var $slots = this.$slots,\n $scopedSlots = this.$scopedSlots;\n var scopedSlot = $scopedSlots[name];\n\n if (scopedSlot) {\n return scopedSlot(props);\n }\n\n return $slots[name];\n }\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbWl4aW5zL3Nsb3RzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL21peGlucy9zbG90cy5qcz9kMWZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIHNjb3BlZFNsb3RzIGluIFZ1ZSAyLjYrXG4gKiBkb3duZ3JhZGUgdG8gc2xvdHMgaW4gbG93ZXIgdmVyc2lvblxuICovXG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5leHBvcnQgdmFyIFNsb3RzTWl4aW4gPSBWdWUuZXh0ZW5kKHtcbiAgbWV0aG9kczoge1xuICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cyhuYW1lLCBwcm9wcykge1xuICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkge1xuICAgICAgICBuYW1lID0gJ2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICB2YXIgJHNsb3RzID0gdGhpcy4kc2xvdHMsXG4gICAgICAgICAgJHNjb3BlZFNsb3RzID0gdGhpcy4kc2NvcGVkU2xvdHM7XG4gICAgICB2YXIgc2NvcGVkU2xvdCA9ICRzY29wZWRTbG90c1tuYW1lXTtcblxuICAgICAgaWYgKHNjb3BlZFNsb3QpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlZFNsb3QocHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJHNsb3RzW25hbWVdO1xuICAgIH1cbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/mixins/slots.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/style/base.css":
/*!**********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/style/base.css ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"976633f2\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\", function() {\n var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3M/ZDYwNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vYmFzZS5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI5NzY2MzNmMlwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2Jhc2UuY3NzXCIsIGZ1bmN0aW9uKCkge1xuICAgICB2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2Jhc2UuY3NzXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/style/base.css\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/constant.js":
/*!*************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/constant.js ***!
\*************************************************************/
/*! exports provided: RED, BLUE, GREEN, WHITE, GRAY, GRAY_DARK, BORDER, BORDER_TOP, BORDER_LEFT, BORDER_RIGHT, BORDER_BOTTOM, BORDER_SURROUND, BORDER_TOP_BOTTOM, BORDER_UNSET_TOP_BOTTOM */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RED\", function() { return RED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BLUE\", function() { return BLUE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GREEN\", function() { return GREEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"WHITE\", function() { return WHITE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GRAY\", function() { return GRAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GRAY_DARK\", function() { return GRAY_DARK; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER\", function() { return BORDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_TOP\", function() { return BORDER_TOP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_LEFT\", function() { return BORDER_LEFT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_RIGHT\", function() { return BORDER_RIGHT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_BOTTOM\", function() { return BORDER_BOTTOM; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_SURROUND\", function() { return BORDER_SURROUND; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_TOP_BOTTOM\", function() { return BORDER_TOP_BOTTOM; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_UNSET_TOP_BOTTOM\", function() { return BORDER_UNSET_TOP_BOTTOM; });\n// color\nvar RED = '#ee0a24';\nvar BLUE = '#1989fa';\nvar GREEN = '#07c160';\nvar WHITE = '#fff';\nvar GRAY = '#c9c9c9';\nvar GRAY_DARK = '#969799'; // border\n\nvar BORDER = 'van-hairline';\nvar BORDER_TOP = BORDER + \"--top\";\nvar BORDER_LEFT = BORDER + \"--left\";\nvar BORDER_RIGHT = BORDER + \"--right\";\nvar BORDER_BOTTOM = BORDER + \"--bottom\";\nvar BORDER_SURROUND = BORDER + \"--surround\";\nvar BORDER_TOP_BOTTOM = BORDER + \"--top-bottom\";\nvar BORDER_UNSET_TOP_BOTTOM = BORDER + \"-unset--top-bottom\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY29uc3RhbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY29uc3RhbnQuanM/MjY0YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjb2xvclxuZXhwb3J0IHZhciBSRUQgPSAnI2VlMGEyNCc7XG5leHBvcnQgdmFyIEJMVUUgPSAnIzE5ODlmYSc7XG5leHBvcnQgdmFyIEdSRUVOID0gJyMwN2MxNjAnO1xuZXhwb3J0IHZhciBXSElURSA9ICcjZmZmJztcbmV4cG9ydCB2YXIgR1JBWSA9ICcjYzljOWM5JztcbmV4cG9ydCB2YXIgR1JBWV9EQVJLID0gJyM5Njk3OTknOyAvLyBib3JkZXJcblxuZXhwb3J0IHZhciBCT1JERVIgPSAndmFuLWhhaXJsaW5lJztcbmV4cG9ydCB2YXIgQk9SREVSX1RPUCA9IEJPUkRFUiArIFwiLS10b3BcIjtcbmV4cG9ydCB2YXIgQk9SREVSX0xFRlQgPSBCT1JERVIgKyBcIi0tbGVmdFwiO1xuZXhwb3J0IHZhciBCT1JERVJfUklHSFQgPSBCT1JERVIgKyBcIi0tcmlnaHRcIjtcbmV4cG9ydCB2YXIgQk9SREVSX0JPVFRPTSA9IEJPUkRFUiArIFwiLS1ib3R0b21cIjtcbmV4cG9ydCB2YXIgQk9SREVSX1NVUlJPVU5EID0gQk9SREVSICsgXCItLXN1cnJvdW5kXCI7XG5leHBvcnQgdmFyIEJPUkRFUl9UT1BfQk9UVE9NID0gQk9SREVSICsgXCItLXRvcC1ib3R0b21cIjtcbmV4cG9ydCB2YXIgQk9SREVSX1VOU0VUX1RPUF9CT1RUT00gPSBCT1JERVIgKyBcIi11bnNldC0tdG9wLWJvdHRvbVwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/constant.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js":
/*!***************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js ***!
\***************************************************************/
/*! exports provided: createBEM */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createBEM\", function() { return createBEM; });\n/**\n * bem helper\n * b() // 'button'\n * b('text') // 'button__text'\n * b({ disabled }) // 'button button--disabled'\n * b('text', { disabled }) // 'button__text button__text--disabled'\n * b(['disabled', 'primary']) // 'button button--disabled button--primary'\n */\nvar ELEMENT = '__';\nvar MODS = '--';\n\nfunction join(name, el, symbol) {\n return el ? name + symbol + el : name;\n}\n\nfunction prefix(name, mods) {\n if (typeof mods === 'string') {\n return join(name, mods, MODS);\n }\n\n if (Array.isArray(mods)) {\n return mods.map(function (item) {\n return prefix(name, item);\n });\n }\n\n var ret = {};\n\n if (mods) {\n Object.keys(mods).forEach(function (key) {\n ret[name + MODS + key] = mods[key];\n });\n }\n\n return ret;\n}\n\nfunction createBEM(name) {\n return function (el, mods) {\n if (el && typeof el !== 'string') {\n mods = el;\n el = '';\n }\n\n el = join(name, el, ELEMENT);\n return mods ? [el, prefix(el, mods)] : el;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2JlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9jcmVhdGUvYmVtLmpzPzUyOWUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBiZW0gaGVscGVyXG4gKiBiKCkgLy8gJ2J1dHRvbidcbiAqIGIoJ3RleHQnKSAvLyAnYnV0dG9uX190ZXh0J1xuICogYih7IGRpc2FibGVkIH0pIC8vICdidXR0b24gYnV0dG9uLS1kaXNhYmxlZCdcbiAqIGIoJ3RleHQnLCB7IGRpc2FibGVkIH0pIC8vICdidXR0b25fX3RleHQgYnV0dG9uX190ZXh0LS1kaXNhYmxlZCdcbiAqIGIoWydkaXNhYmxlZCcsICdwcmltYXJ5J10pIC8vICdidXR0b24gYnV0dG9uLS1kaXNhYmxlZCBidXR0b24tLXByaW1hcnknXG4gKi9cbnZhciBFTEVNRU5UID0gJ19fJztcbnZhciBNT0RTID0gJy0tJztcblxuZnVuY3Rpb24gam9pbihuYW1lLCBlbCwgc3ltYm9sKSB7XG4gIHJldHVybiBlbCA/IG5hbWUgKyBzeW1ib2wgKyBlbCA6IG5hbWU7XG59XG5cbmZ1bmN0aW9uIHByZWZpeChuYW1lLCBtb2RzKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gam9pbihuYW1lLCBtb2RzLCBNT0RTKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgcmV0dXJuIG1vZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gcHJlZml4KG5hbWUsIGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJldCA9IHt9O1xuXG4gIGlmIChtb2RzKSB7XG4gICAgT2JqZWN0LmtleXMobW9kcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXRbbmFtZSArIE1PRFMgKyBrZXldID0gbW9kc1trZXldO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJFTShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZWwsIG1vZHMpIHtcbiAgICBpZiAoZWwgJiYgdHlwZW9mIGVsICE9PSAnc3RyaW5nJykge1xuICAgICAgbW9kcyA9IGVsO1xuICAgICAgZWwgPSAnJztcbiAgICB9XG5cbiAgICBlbCA9IGpvaW4obmFtZSwgZWwsIEVMRU1FTlQpO1xuICAgIHJldHVybiBtb2RzID8gW2VsLCBwcmVmaXgoZWwsIG1vZHMpXSA6IGVsO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/component.js":
/*!*********************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/create/component.js ***!
\*********************************************************************/
/*! exports provided: unifySlots, createComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unifySlots\", function() { return unifySlots; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createComponent\", function() { return createComponent; });\n/* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../locale */ \"./node_modules/_vant@2.2.16@vant/es/locale/index.js\");\n/* harmony import */ var _format_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../format/string */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\");\n/* harmony import */ var _mixins_slots__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/slots */ \"./node_modules/_vant@2.2.16@vant/es/mixins/slots.js\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/**\n * Create a basic component with common options\n */\n\n\n\n\n\nfunction install(Vue) {\n var name = this.name;\n Vue.component(name, this);\n Vue.component(Object(_format_string__WEBPACK_IMPORTED_MODULE_1__[\"camelize\"])(\"-\" + name), this);\n} // unify slots & scopedSlots\n\n\nfunction unifySlots(context) {\n // use data.scopedSlots in lower Vue version\n var scopedSlots = context.scopedSlots || context.data.scopedSlots || {};\n var slots = context.slots();\n Object.keys(slots).forEach(function (key) {\n if (!scopedSlots[key]) {\n scopedSlots[key] = function () {\n return slots[key];\n };\n }\n });\n return scopedSlots;\n} // should be removed after Vue 3\n\nfunction transformFunctionComponent(pure) {\n return {\n functional: true,\n props: pure.props,\n model: pure.model,\n render: function render(h, context) {\n return pure(h, context.props, unifySlots(context), context);\n }\n };\n}\n\nfunction createComponent(name) {\n return function (sfc) {\n if (typeof sfc === 'function') {\n sfc = transformFunctionComponent(sfc);\n }\n\n if (!sfc.functional) {\n sfc.mixins = sfc.mixins || [];\n sfc.mixins.push(_mixins_slots__WEBPACK_IMPORTED_MODULE_2__[\"SlotsMixin\"]);\n }\n\n sfc.name = name;\n sfc.install = install;\n return sfc;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2NvbXBvbmVudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9jcmVhdGUvY29tcG9uZW50LmpzPzA1YTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGUgYSBiYXNpYyBjb21wb25lbnQgd2l0aCBjb21tb24gb3B0aW9uc1xuICovXG5pbXBvcnQgJy4uLy4uL2xvY2FsZSc7XG5pbXBvcnQgeyBjYW1lbGl6ZSB9IGZyb20gJy4uL2Zvcm1hdC9zdHJpbmcnO1xuaW1wb3J0IHsgU2xvdHNNaXhpbiB9IGZyb20gJy4uLy4uL21peGlucy9zbG90cyc7XG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5cbmZ1bmN0aW9uIGluc3RhbGwoVnVlKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICBWdWUuY29tcG9uZW50KG5hbWUsIHRoaXMpO1xuICBWdWUuY29tcG9uZW50KGNhbWVsaXplKFwiLVwiICsgbmFtZSksIHRoaXMpO1xufSAvLyB1bmlmeSBzbG90cyAmIHNjb3BlZFNsb3RzXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5U2xvdHMoY29udGV4dCkge1xuICAvLyB1c2UgZGF0YS5zY29wZWRTbG90cyBpbiBsb3dlciBWdWUgdmVyc2lvblxuICB2YXIgc2NvcGVkU2xvdHMgPSBjb250ZXh0LnNjb3BlZFNsb3RzIHx8IGNvbnRleHQuZGF0YS5zY29wZWRTbG90cyB8fCB7fTtcbiAgdmFyIHNsb3RzID0gY29udGV4dC5zbG90cygpO1xuICBPYmplY3Qua2V5cyhzbG90cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFzY29wZWRTbG90c1trZXldKSB7XG4gICAgICBzY29wZWRTbG90c1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2xvdHNba2V5XTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNjb3BlZFNsb3RzO1xufSAvLyBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBWdWUgM1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1GdW5jdGlvbkNvbXBvbmVudChwdXJlKSB7XG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgICBwcm9wczogcHVyZS5wcm9wcyxcbiAgICBtb2RlbDogcHVyZS5tb2RlbCxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcHVyZShoLCBjb250ZXh0LnByb3BzLCB1bmlmeVNsb3RzKGNvbnRleHQpLCBjb250ZXh0KTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHNmYykge1xuICAgIGlmICh0eXBlb2Ygc2ZjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZmMgPSB0cmFuc2Zvcm1GdW5jdGlvbkNvbXBvbmVudChzZmMpO1xuICAgIH1cblxuICAgIGlmICghc2ZjLmZ1bmN0aW9uYWwpIHtcbiAgICAgIHNmYy5taXhpbnMgPSBzZmMubWl4aW5zIHx8IFtdO1xuICAgICAgc2ZjLm1peGlucy5wdXNoKFNsb3RzTWl4aW4pO1xuICAgIH1cblxuICAgIHNmYy5uYW1lID0gbmFtZTtcbiAgICBzZmMuaW5zdGFsbCA9IGluc3RhbGw7XG4gICAgcmV0dXJuIHNmYztcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/component.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js":
/*!****************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js ***!
\****************************************************************/
/*! exports provided: createI18N */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createI18N\", function() { return createI18N; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _format_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../format/string */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\");\n/* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../locale */ \"./node_modules/_vant@2.2.16@vant/es/locale/index.js\");\n\n\n\nfunction createI18N(name) {\n var prefix = Object(_format_string__WEBPACK_IMPORTED_MODULE_1__[\"camelize\"])(name) + '.';\n return function (path) {\n var message = Object(___WEBPACK_IMPORTED_MODULE_0__[\"get\"])(_locale__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messages(), prefix + path) || Object(___WEBPACK_IMPORTED_MODULE_0__[\"get\"])(_locale__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messages(), path);\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return typeof message === 'function' ? message.apply(void 0, args) : message;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2kxOG4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2kxOG4uanM/MWFiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBjYW1lbGl6ZSB9IGZyb20gJy4uL2Zvcm1hdC9zdHJpbmcnO1xuaW1wb3J0IGxvY2FsZSBmcm9tICcuLi8uLi9sb2NhbGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUkxOE4obmFtZSkge1xuICB2YXIgcHJlZml4ID0gY2FtZWxpemUobmFtZSkgKyAnLic7XG4gIHJldHVybiBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBtZXNzYWdlID0gZ2V0KGxvY2FsZS5tZXNzYWdlcygpLCBwcmVmaXggKyBwYXRoKSB8fCBnZXQobG9jYWxlLm1lc3NhZ2VzKCksIHBhdGgpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZS5hcHBseSh2b2lkIDAsIGFyZ3MpIDogbWVzc2FnZTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/index.js":
/*!*****************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/create/index.js ***!
\*****************************************************************/
/*! exports provided: createNamespace */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return createNamespace; });\n/* harmony import */ var _bem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bem */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js\");\n/* harmony import */ var _component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./component */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/component.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./i18n */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js\");\n\n\n\nfunction createNamespace(name) {\n name = 'van-' + name;\n return [Object(_component__WEBPACK_IMPORTED_MODULE_1__[\"createComponent\"])(name), Object(_bem__WEBPACK_IMPORTED_MODULE_0__[\"createBEM\"])(name), Object(_i18n__WEBPACK_IMPORTED_MODULE_2__[\"createI18N\"])(name)];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL2NyZWF0ZS9pbmRleC5qcz8yODBmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUJFTSB9IGZyb20gJy4vYmVtJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUkxOE4gfSBmcm9tICcuL2kxOG4nO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5hbWVzcGFjZShuYW1lKSB7XG4gIG5hbWUgPSAndmFuLScgKyBuYW1lO1xuICByZXR1cm4gW2NyZWF0ZUNvbXBvbmVudChuYW1lKSwgY3JlYXRlQkVNKG5hbWUpLCBjcmVhdGVJMThOKG5hbWUpXTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js":
/*!****************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js ***!
\****************************************************************/
/*! exports provided: deepAssign */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepAssign\", function() { return deepAssign; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction assignKey(to, from, key) {\n var val = from[key];\n\n if (!Object(___WEBPACK_IMPORTED_MODULE_0__[\"isDef\"])(val)) {\n return;\n }\n\n if (!hasOwnProperty.call(to, key) || !Object(___WEBPACK_IMPORTED_MODULE_0__[\"isObj\"])(val) || typeof val === 'function') {\n to[key] = val;\n } else {\n // eslint-disable-next-line no-use-before-define\n to[key] = deepAssign(Object(to[key]), from[key]);\n }\n}\n\nfunction deepAssign(to, from) {\n Object.keys(from).forEach(function (key) {\n assignKey(to, from, key);\n });\n return to;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZGVlcC1hc3NpZ24uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZGVlcC1hc3NpZ24uanM/OTQxZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0RlZiwgaXNPYmogfSBmcm9tICcuJztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGFzc2lnbktleSh0bywgZnJvbSwga2V5KSB7XG4gIHZhciB2YWwgPSBmcm9tW2tleV07XG5cbiAgaWYgKCFpc0RlZih2YWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHRvLCBrZXkpIHx8ICFpc09iaih2YWwpIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0b1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHRvW2tleV0gPSBkZWVwQXNzaWduKE9iamVjdCh0b1trZXldKSwgZnJvbVtrZXldKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0bywgZnJvbSkge1xuICBPYmplY3Qua2V5cyhmcm9tKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBhc3NpZ25LZXkodG8sIGZyb20sIGtleSk7XG4gIH0pO1xuICByZXR1cm4gdG87XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js":
/*!************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js ***!
\************************************************************/
/*! exports provided: raf, doubleRaf, cancelRaf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"raf\", function() { return raf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"doubleRaf\", function() { return doubleRaf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cancelRaf\", function() { return cancelRaf; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/**\n * requestAnimationFrame polyfill\n */\n\nvar prev = Date.now();\n/* istanbul ignore next */\n\nfunction fallback(fn) {\n var curr = Date.now();\n var ms = Math.max(0, 16 - (curr - prev));\n var id = setTimeout(fn, ms);\n prev = curr + ms;\n return id;\n}\n/* istanbul ignore next */\n\n\nvar root = ___WEBPACK_IMPORTED_MODULE_0__[\"isServer\"] ? global : window;\n/* istanbul ignore next */\n\nvar iRaf = root.requestAnimationFrame || fallback;\n/* istanbul ignore next */\n\nvar iCancel = root.cancelAnimationFrame || root.clearTimeout;\nfunction raf(fn) {\n return iRaf.call(root, fn);\n} // double raf for animation\n\nfunction doubleRaf(fn) {\n raf(function () {\n raf(fn);\n });\n}\nfunction cancelRaf(id) {\n iCancel.call(root, id);\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZG9tL3JhZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9kb20vcmFmLmpzPzc2M2YiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGxcbiAqL1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tICcuLic7XG52YXIgcHJldiA9IERhdGUubm93KCk7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5mdW5jdGlvbiBmYWxsYmFjayhmbikge1xuICB2YXIgY3VyciA9IERhdGUubm93KCk7XG4gIHZhciBtcyA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnIgLSBwcmV2KSk7XG4gIHZhciBpZCA9IHNldFRpbWVvdXQoZm4sIG1zKTtcbiAgcHJldiA9IGN1cnIgKyBtcztcbiAgcmV0dXJuIGlkO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG52YXIgcm9vdCA9IGlzU2VydmVyID8gZ2xvYmFsIDogd2luZG93O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxudmFyIGlSYWYgPSByb290LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmYWxsYmFjaztcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbnZhciBpQ2FuY2VsID0gcm9vdC5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCByb290LmNsZWFyVGltZW91dDtcbmV4cG9ydCBmdW5jdGlvbiByYWYoZm4pIHtcbiAgcmV0dXJuIGlSYWYuY2FsbChyb290LCBmbik7XG59IC8vIGRvdWJsZSByYWYgZm9yIGFuaW1hdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gZG91YmxlUmFmKGZuKSB7XG4gIHJhZihmdW5jdGlvbiAoKSB7XG4gICAgcmFmKGZuKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUmFmKGlkKSB7XG4gIGlDYW5jZWwuY2FsbChyb290LCBpZCk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/format/string.js":
/*!******************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/format/string.js ***!
\******************************************************************/
/*! exports provided: camelize, padZero */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"camelize\", function() { return camelize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"padZero\", function() { return padZero; });\nvar camelizeRE = /-(\\w)/g;\nfunction camelize(str) {\n return str.replace(camelizeRE, function (_, c) {\n return c.toUpperCase();\n });\n}\nfunction padZero(num, targetLength) {\n if (targetLength === void 0) {\n targetLength = 2;\n }\n\n var str = num + '';\n\n while (str.length < targetLength) {\n str = '0' + str;\n }\n\n return str;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3N0cmluZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9mb3JtYXQvc3RyaW5nLmpzPzZlMWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XG5leHBvcnQgZnVuY3Rpb24gY2FtZWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykge1xuICAgIHJldHVybiBjLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhZFplcm8obnVtLCB0YXJnZXRMZW5ndGgpIHtcbiAgaWYgKHRhcmdldExlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgdGFyZ2V0TGVuZ3RoID0gMjtcbiAgfVxuXG4gIHZhciBzdHIgPSBudW0gKyAnJztcblxuICB3aGlsZSAoc3RyLmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgIHN0ciA9ICcwJyArIHN0cjtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js":
/*!****************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js ***!
\****************************************************************/
/*! exports provided: addUnit */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addUnit\", function() { return addUnit; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _validate_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validate/number */ \"./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js\");\n\n\nfunction addUnit(value) {\n if (!Object(___WEBPACK_IMPORTED_MODULE_0__[\"isDef\"])(value)) {\n return undefined;\n }\n\n value = String(value);\n return Object(_validate_number__WEBPACK_IMPORTED_MODULE_1__[\"isNumber\"])(value) ? value + \"px\" : value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3VuaXQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3VuaXQuanM/ZTgyMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0RlZiB9IGZyb20gJy4uJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vdmFsaWRhdGUvbnVtYmVyJztcbmV4cG9ydCBmdW5jdGlvbiBhZGRVbml0KHZhbHVlKSB7XG4gIGlmICghaXNEZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSA/IHZhbHVlICsgXCJweFwiIDogdmFsdWU7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/functional.js":
/*!***************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/functional.js ***!
\***************************************************************/
/*! exports provided: inherit, emit, mount */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"inherit\", function() { return inherit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"emit\", function() { return emit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mount\", function() { return mount; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n\n\nvar inheritKey = ['ref', 'style', 'class', 'attrs', 'nativeOn', 'directives', 'staticClass', 'staticStyle'];\nvar mapInheritKey = {\n nativeOn: 'on'\n}; // inherit partial context, map nativeOn to on\n\nfunction inherit(context, inheritListeners) {\n var result = inheritKey.reduce(function (obj, key) {\n if (context.data[key]) {\n obj[mapInheritKey[key] || key] = context.data[key];\n }\n\n return obj;\n }, {});\n\n if (inheritListeners) {\n result.on = result.on || {};\n\n Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(result.on, context.data.on);\n }\n\n return result;\n} // emit event\n\nfunction emit(context, eventName) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var listeners = context.listeners[eventName];\n\n if (listeners) {\n if (Array.isArray(listeners)) {\n listeners.forEach(function (listener) {\n listener.apply(void 0, args);\n });\n } else {\n listeners.apply(void 0, args);\n }\n }\n} // mount functional component\n\nfunction mount(Component, data) {\n var instance = new vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]({\n el: document.createElement('div'),\n props: Component.props,\n render: function render(h) {\n return h(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n props: this.$props\n }, data));\n }\n });\n document.body.appendChild(instance.$el);\n return instance;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZnVuY3Rpb25hbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9mdW5jdGlvbmFsLmpzPzEzY2YiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG52YXIgaW5oZXJpdEtleSA9IFsncmVmJywgJ3N0eWxlJywgJ2NsYXNzJywgJ2F0dHJzJywgJ25hdGl2ZU9uJywgJ2RpcmVjdGl2ZXMnLCAnc3RhdGljQ2xhc3MnLCAnc3RhdGljU3R5bGUnXTtcbnZhciBtYXBJbmhlcml0S2V5ID0ge1xuICBuYXRpdmVPbjogJ29uJ1xufTsgLy8gaW5oZXJpdCBwYXJ0aWFsIGNvbnRleHQsIG1hcCBuYXRpdmVPbiB0byBvblxuXG5leHBvcnQgZnVuY3Rpb24gaW5oZXJpdChjb250ZXh0LCBpbmhlcml0TGlzdGVuZXJzKSB7XG4gIHZhciByZXN1bHQgPSBpbmhlcml0S2V5LnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBpZiAoY29udGV4dC5kYXRhW2tleV0pIHtcbiAgICAgIG9ialttYXBJbmhlcml0S2V5W2tleV0gfHwga2V5XSA9IGNvbnRleHQuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcblxuICBpZiAoaW5oZXJpdExpc3RlbmVycykge1xuICAgIHJlc3VsdC5vbiA9IHJlc3VsdC5vbiB8fCB7fTtcblxuICAgIF9leHRlbmRzKHJlc3VsdC5vbiwgY29udGV4dC5kYXRhLm9uKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IC8vIGVtaXQgZXZlbnRcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXQoY29udGV4dCwgZXZlbnROYW1lKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBjb250ZXh0Lmxpc3RlbmVyc1tldmVudE5hbWVdO1xuXG4gIGlmIChsaXN0ZW5lcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lcnMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9XG4gIH1cbn0gLy8gbW91bnQgZnVuY3Rpb25hbCBjb21wb25lbnRcblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KENvbXBvbmVudCwgZGF0YSkge1xuICB2YXIgaW5zdGFuY2UgPSBuZXcgVnVlKHtcbiAgICBlbDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgcHJvcHM6IENvbXBvbmVudC5wcm9wcyxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgICByZXR1cm4gaChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgcHJvcHM6IHRoaXMuJHByb3BzXG4gICAgICB9LCBkYXRhKSk7XG4gICAgfVxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnN0YW5jZS4kZWwpO1xuICByZXR1cm4gaW5zdGFuY2U7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/functional.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/index.js":
/*!**********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/index.js ***!
\**********************************************************/
/*! exports provided: createNamespace, addUnit, isServer, noop, isDef, isObj, get */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isServer\", function() { return isServer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return noop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isDef\", function() { return isDef; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isObj\", function() { return isObj; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"get\", function() { return get; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _create__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./create */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return _create__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"]; });\n\n/* harmony import */ var _format_unit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./format/unit */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"addUnit\", function() { return _format_unit__WEBPACK_IMPORTED_MODULE_2__[\"addUnit\"]; });\n\n\n\n\nvar isServer = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype.$isServer;\nfunction noop() {}\nfunction isDef(value) {\n return value !== undefined && value !== null;\n}\nfunction isObj(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\nfunction get(object, path) {\n var keys = path.split('.');\n var result = object;\n keys.forEach(function (key) {\n result = isDef(result[key]) ? result[key] : '';\n });\n return result;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvaW5kZXguanM/YmI4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5leHBvcnQgeyBjcmVhdGVOYW1lc3BhY2UgfSBmcm9tICcuL2NyZWF0ZSc7XG5leHBvcnQgeyBhZGRVbml0IH0gZnJvbSAnLi9mb3JtYXQvdW5pdCc7XG5leHBvcnQgdmFyIGlzU2VydmVyID0gVnVlLnByb3RvdHlwZS4kaXNTZXJ2ZXI7XG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHt9XG5leHBvcnQgZnVuY3Rpb24gaXNEZWYodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmooeCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB4O1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiAodHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCkge1xuICB2YXIga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdDtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXN1bHQgPSBpc0RlZihyZXN1bHRba2V5XSkgPyByZXN1bHRba2V5XSA6ICcnO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/index.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/router.js":
/*!***********************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/router.js ***!
\***********************************************************/
/*! exports provided: route, functionalRoute, routeProps */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"route\", function() { return route; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"functionalRoute\", function() { return functionalRoute; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"routeProps\", function() { return routeProps; });\n/**\n * Vue Router support\n */\nfunction route(router, config) {\n var to = config.to,\n url = config.url,\n replace = config.replace;\n\n if (to && router) {\n var promise = router[replace ? 'replace' : 'push'](to);\n /* istanbul ignore else */\n\n if (promise && promise.catch) {\n promise.catch(function (err) {\n /* istanbul ignore if */\n if (err && err.name !== 'NavigationDuplicated') {\n throw err;\n }\n });\n }\n } else if (url) {\n replace ? location.replace(url) : location.href = url;\n }\n}\nfunction functionalRoute(context) {\n route(context.parent && context.parent.$router, context.props);\n}\nvar routeProps = {\n url: String,\n replace: Boolean,\n to: [String, Object]\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvcm91dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL3JvdXRlci5qcz9mMjc2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVnVlIFJvdXRlciBzdXBwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3V0ZShyb3V0ZXIsIGNvbmZpZykge1xuICB2YXIgdG8gPSBjb25maWcudG8sXG4gICAgICB1cmwgPSBjb25maWcudXJsLFxuICAgICAgcmVwbGFjZSA9IGNvbmZpZy5yZXBsYWNlO1xuXG4gIGlmICh0byAmJiByb3V0ZXIpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHJvdXRlcltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ3B1c2gnXSh0byk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuY2F0Y2gpIHtcbiAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSAhPT0gJ05hdmlnYXRpb25EdXBsaWNhdGVkJykge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVybCkge1xuICAgIHJlcGxhY2UgPyBsb2NhdGlvbi5yZXBsYWNlKHVybCkgOiBsb2NhdGlvbi5ocmVmID0gdXJsO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25hbFJvdXRlKGNvbnRleHQpIHtcbiAgcm91dGUoY29udGV4dC5wYXJlbnQgJiYgY29udGV4dC5wYXJlbnQuJHJvdXRlciwgY29udGV4dC5wcm9wcyk7XG59XG5leHBvcnQgdmFyIHJvdXRlUHJvcHMgPSB7XG4gIHVybDogU3RyaW5nLFxuICByZXBsYWNlOiBCb29sZWFuLFxuICB0bzogW1N0cmluZywgT2JqZWN0XVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/router.js\n");
/***/ }),
/***/ "./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js":
/*!********************************************************************!*\
!*** ./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js ***!
\********************************************************************/
/*! exports provided: isNumber, isNaN */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return isNumber; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\nfunction isNumber(value) {\n return /^\\d+(\\.\\d+)?$/.test(value);\n}\nfunction isNaN(value) {\n if (Number.isNaN) {\n return Number.isNaN(value);\n } // eslint-disable-next-line no-self-compare\n\n\n return value !== value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvdmFsaWRhdGUvbnVtYmVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL3ZhbGlkYXRlL251bWJlci5qcz9jYTg2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKTtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cblxuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js\n");
/***/ }),
/***/ "./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js":
/*!******************************************************************!*\
!*** ./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/**\n * @license\n * Video.js 6.12.1 <http://videojs.com/>\n * Copyright Brightcove, Inc. <https://www.brightcove.com/>\n * Available under Apache License Version 2.0\n * <https://github.com/videojs/video.js/blob/master/LICENSE>\n *\n * Includes vtt.js <https://github.com/mozilla/vtt.js>\n * Available under Apache License Version 2.0\n * <https://github.com/mozilla/vtt.js/blob/master/LICENSE>\n */\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar window = _interopDefault(__webpack_require__(/*! global/window */ \"./node_modules/_global@4.3.2@global/window.js\"));\nvar document = _interopDefault(__webpack_require__(/*! global/document */ \"./node_modules/_global@4.3.2@global/document.js\"));\nvar tsml = _interopDefault(__webpack_require__(/*! tsml */ \"./node_modules/_tsml@1.0.1@tsml/tsml.js\"));\nvar safeParseTuple = _interopDefault(__webpack_require__(/*! safe-json-parse/tuple */ \"./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js\"));\nvar xhr = _interopDefault(__webpack_require__(/*! xhr */ \"./node_modules/_xhr@2.4.0@xhr/index.js\"));\nvar vtt = _interopDefault(__webpack_require__(/*! videojs-vtt.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js\"));\n\nvar version = \"6.12.1\";\n\n/**\n * @file browser.js\n * @module browser\n */\nvar USER_AGENT = window.navigator && window.navigator.userAgent || '';\nvar webkitVersionMap = /AppleWebKit\\/([\\d.]+)/i.exec(USER_AGENT);\nvar appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nvar IS_IPAD = /iPad/i.test(USER_AGENT);\n\n// The Facebook app's UIWebView identifies as both an iPhone and iPad, so\n// to identify iPhones, we need to exclude iPads.\n// http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/\nvar IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD;\nvar IS_IPOD = /iPod/i.test(USER_AGENT);\nvar IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nvar IOS_VERSION = function () {\n var match = USER_AGENT.match(/OS (\\d+)_/i);\n\n if (match && match[1]) {\n return match[1];\n }\n return null;\n}();\n\nvar IS_ANDROID = /Android/i.test(USER_AGENT);\nvar ANDROID_VERSION = function () {\n // This matches Android Major.Minor.Patch versions\n // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i);\n\n if (!match) {\n return null;\n }\n\n var major = match[1] && parseFloat(match[1]);\n var minor = match[2] && parseFloat(match[2]);\n\n if (major && minor) {\n return parseFloat(match[1] + '.' + match[2]);\n } else if (major) {\n return major;\n }\n return null;\n}();\n\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nvar IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;\nvar IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nvar IS_FIREFOX = /Firefox/i.test(USER_AGENT);\nvar IS_EDGE = /Edge/i.test(USER_AGENT);\nvar IS_CHROME = !IS_EDGE && (/Chrome/i.test(USER_AGENT) || /CriOS/i.test(USER_AGENT));\nvar CHROME_VERSION = function () {\n var match = USER_AGENT.match(/(Chrome|CriOS)\\/(\\d+)/);\n\n if (match && match[2]) {\n return parseFloat(match[2]);\n }\n return null;\n}();\nvar IS_IE8 = /MSIE\\s8\\.0/.test(USER_AGENT);\nvar IE_VERSION = function () {\n var result = /MSIE\\s(\\d+)\\.\\d/.exec(USER_AGENT);\n var version = result && parseFloat(result[1]);\n\n if (!version && /Trident\\/7.0/i.test(USER_AGENT) && /rv:11.0/.test(USER_AGENT)) {\n // IE 11 has a different user agent string than other IE versions\n version = 11.0;\n }\n\n return version;\n}();\n\nvar IS_SAFARI = /Safari/i.test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE;\nvar IS_ANY_SAFARI = (IS_SAFARI || IS_IOS) && !IS_CHROME;\n\nvar TOUCH_ENABLED = isReal() && ('ontouchstart' in window || window.navigator.maxTouchPoints || window.DocumentTouch && window.document instanceof window.DocumentTouch);\n\nvar BACKGROUND_SIZE_SUPPORTED = isReal() && 'backgroundSize' in window.document.createElement('video').style;\n\nvar browser = (Object.freeze || Object)({\n\tIS_IPAD: IS_IPAD,\n\tIS_IPHONE: IS_IPHONE,\n\tIS_IPOD: IS_IPOD,\n\tIS_IOS: IS_IOS,\n\tIOS_VERSION: IOS_VERSION,\n\tIS_ANDROID: IS_ANDROID,\n\tANDROID_VERSION: ANDROID_VERSION,\n\tIS_OLD_ANDROID: IS_OLD_ANDROID,\n\tIS_NATIVE_ANDROID: IS_NATIVE_ANDROID,\n\tIS_FIREFOX: IS_FIREFOX,\n\tIS_EDGE: IS_EDGE,\n\tIS_CHROME: IS_CHROME,\n\tCHROME_VERSION: CHROME_VERSION,\n\tIS_IE8: IS_IE8,\n\tIE_VERSION: IE_VERSION,\n\tIS_SAFARI: IS_SAFARI,\n\tIS_ANY_SAFARI: IS_ANY_SAFARI,\n\tTOUCH_ENABLED: TOUCH_ENABLED,\n\tBACKGROUND_SIZE_SUPPORTED: BACKGROUND_SIZE_SUPPORTED\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\n\n\n\n\n\n\n\n\n\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar taggedTemplateLiteralLoose = function (strings, raw) {\n strings.raw = raw;\n return strings;\n};\n\n/**\n * @file obj.js\n * @module obj\n */\n\n/**\n * @callback obj:EachCallback\n *\n * @param {Mixed} value\n * The current key for the object that is being iterated over.\n *\n * @param {string} key\n * The current key-value for object that is being iterated over\n */\n\n/**\n * @callback obj:ReduceCallback\n *\n * @param {Mixed} accum\n * The value that is accumulating over the reduce loop.\n *\n * @param {Mixed} value\n * The current key for the object that is being iterated over.\n *\n * @param {string} key\n * The current key-value for object that is being iterated over\n *\n * @return {Mixed}\n * The new accumulated value.\n */\nvar toString = Object.prototype.toString;\n\n/**\n * Get the keys of an Object\n *\n * @param {Object}\n * The Object to get the keys from\n *\n * @return {string[]}\n * An array of the keys from the object. Returns an empty array if the\n * object passed in was invalid or had no keys.\n *\n * @private\n */\nvar keys = function keys(object) {\n return isObject(object) ? Object.keys(object) : [];\n};\n\n/**\n * Array-like iteration for objects.\n *\n * @param {Object} object\n * The object to iterate over\n *\n * @param {obj:EachCallback} fn\n * The callback function which is called for each key in the object.\n */\nfunction each(object, fn) {\n keys(object).forEach(function (key) {\n return fn(object[key], key);\n });\n}\n\n/**\n * Array-like reduce for objects.\n *\n * @param {Object} object\n * The Object that you want to reduce.\n *\n * @param {Function} fn\n * A callback function which is called for each key in the object. It\n * receives the accumulated value and the per-iteration value and key\n * as arguments.\n *\n * @param {Mixed} [initial = 0]\n * Starting value\n *\n * @return {Mixed}\n * The final accumulated value.\n */\nfunction reduce(object, fn) {\n var initial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n return keys(object).reduce(function (accum, key) {\n return fn(accum, object[key], key);\n }, initial);\n}\n\n/**\n * Object.assign-style object shallow merge/extend.\n *\n * @param {Object} target\n * @param {Object} ...sources\n * @return {Object}\n */\nfunction assign(target) {\n for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (Object.assign) {\n return Object.assign.apply(Object, [target].concat(sources));\n }\n\n sources.forEach(function (source) {\n if (!source) {\n return;\n }\n\n each(source, function (value, key) {\n target[key] = value;\n });\n });\n\n return target;\n}\n\n/**\n * Returns whether a value is an object of any kind - including DOM nodes,\n * arrays, regular expressions, etc. Not functions, though.\n *\n * This avoids the gotcha where using `typeof` on a `null` value\n * results in `'object'`.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nfunction isObject(value) {\n return !!value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object';\n}\n\n/**\n * Returns whether an object appears to be a \"plain\" object - that is, a\n * direct instance of `Object`.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nfunction isPlain(value) {\n return isObject(value) && toString.call(value) === '[object Object]' && value.constructor === Object;\n}\n\n/**\n * @file log.js\n * @module log\n */\nvar log = void 0;\n\n// This is the private tracking variable for logging level.\nvar level = 'info';\n\n// This is the private tracking variable for the logging history.\nvar history = [];\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @private\n * @param {string} type\n * The name of the console method to use.\n *\n * @param {Array} args\n * The arguments to be passed to the matching console method.\n *\n * @param {boolean} [stringify]\n * By default, only old IEs should get console argument stringification,\n * but this is exposed as a parameter to facilitate testing.\n */\nvar logByType = function logByType(type, args) {\n var stringify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : !!IE_VERSION && IE_VERSION < 11;\n\n var lvl = log.levels[level];\n var lvlRegExp = new RegExp('^(' + lvl + ')$');\n\n if (type !== 'log') {\n\n // Add the type to the front of the message when it's not \"log\".\n args.unshift(type.toUpperCase() + ':');\n }\n\n // Add a clone of the args at this point to history.\n if (history) {\n history.push([].concat(args));\n }\n\n // Add console prefix after adding to history.\n args.unshift('VIDEOJS:');\n\n // If there's no console then don't try to output messages, but they will\n // still be stored in history.\n if (!window.console) {\n return;\n }\n\n // Was setting these once outside of this function, but containing them\n // in the function makes it easier to test cases where console doesn't exist\n // when the module is executed.\n var fn = window.console[type];\n\n if (!fn && type === 'debug') {\n // Certain browsers don't have support for console.debug. For those, we\n // should default to the closest comparable log.\n fn = window.console.info || window.console.log;\n }\n\n // Bail out if there's no console or if this type is not allowed by the\n // current logging level.\n if (!fn || !lvl || !lvlRegExp.test(type)) {\n return;\n }\n\n // IEs previous to 11 log objects uselessly as \"[object Object]\"; so, JSONify\n // objects and arrays for those less-capable browsers.\n if (stringify) {\n args = args.map(function (a) {\n if (isObject(a) || Array.isArray(a)) {\n try {\n return JSON.stringify(a);\n } catch (x) {\n return String(a);\n }\n }\n\n // Cast to string before joining, so we get null and undefined explicitly\n // included in output (as we would in a modern console).\n return String(a);\n }).join(' ');\n }\n\n // Old IE versions do not allow .apply() for console methods (they are\n // reported as objects rather than functions).\n if (!fn.apply) {\n fn(args);\n } else {\n fn[Array.isArray(args) ? 'apply' : 'call'](window.console, args);\n }\n};\n\n/**\n * Logs plain debug messages. Similar to `console.log`.\n *\n * @class\n * @param {Mixed[]} args\n * One or more messages or objects that should be logged.\n */\nlog = function log() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n logByType('log', args);\n};\n\n/**\n * Enumeration of available logging levels, where the keys are the level names\n * and the values are `|`-separated strings containing logging methods allowed\n * in that logging level. These strings are used to create a regular expression\n * matching the function name being called.\n *\n * Levels provided by video.js are:\n *\n * - `off`: Matches no calls. Any value that can be cast to `false` will have\n * this effect. The most restrictive.\n * - `all`: Matches only Video.js-provided functions (`debug`, `log`,\n * `log.warn`, and `log.error`).\n * - `debug`: Matches `log.debug`, `log`, `log.warn`, and `log.error` calls.\n * - `info` (default): Matches `log`, `log.warn`, and `log.error` calls.\n * - `warn`: Matches `log.warn` and `log.error` calls.\n * - `error`: Matches only `log.error` calls.\n *\n * @type {Object}\n */\nlog.levels = {\n all: 'debug|log|warn|error',\n off: '',\n debug: 'debug|log|warn|error',\n info: 'log|warn|error',\n warn: 'warn|error',\n error: 'error',\n DEFAULT: level\n};\n\n/**\n * Get or set the current logging level. If a string matching a key from\n * {@link log.levels} is provided, acts as a setter. Regardless of argument,\n * returns the current logging level.\n *\n * @param {string} [lvl]\n * Pass to set a new logging level.\n *\n * @return {string}\n * The current logging level.\n */\nlog.level = function (lvl) {\n if (typeof lvl === 'string') {\n if (!log.levels.hasOwnProperty(lvl)) {\n throw new Error('\"' + lvl + '\" in not a valid log level');\n }\n level = lvl;\n }\n return level;\n};\n\n/**\n * Returns an array containing everything that has been logged to the history.\n *\n * This array is a shallow clone of the internal history record. However, its\n * contents are _not_ cloned; so, mutating objects inside this array will\n * mutate them in history.\n *\n * @return {Array}\n */\nlog.history = function () {\n return history ? [].concat(history) : [];\n};\n\n/**\n * Clears the internal history tracking, but does not prevent further history\n * tracking.\n */\nlog.history.clear = function () {\n if (history) {\n history.length = 0;\n }\n};\n\n/**\n * Disable history tracking if it is currently enabled.\n */\nlog.history.disable = function () {\n if (history !== null) {\n history.length = 0;\n history = null;\n }\n};\n\n/**\n * Enable history tracking if it is currently disabled.\n */\nlog.history.enable = function () {\n if (history === null) {\n history = [];\n }\n};\n\n/**\n * Logs error messages. Similar to `console.error`.\n *\n * @param {Mixed[]} args\n * One or more messages or objects that should be logged as an error\n */\nlog.error = function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return logByType('error', args);\n};\n\n/**\n * Logs warning messages. Similar to `console.warn`.\n *\n * @param {Mixed[]} args\n * One or more messages or objects that should be logged as a warning.\n */\nlog.warn = function () {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return logByType('warn', args);\n};\n\n/**\n * Logs debug messages. Similar to `console.debug`, but may also act as a comparable\n * log if `console.debug` is not available\n *\n * @param {Mixed[]} args\n * One or more messages or objects that should be logged as debug.\n */\nlog.debug = function () {\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return logByType('debug', args);\n};\n\nvar log$1 = log;\n\n/**\n * @file computed-style.js\n * @module computed-style\n */\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is needed because in Firefox, if the player is loaded in an iframe with\n * `display:none`, then `getComputedStyle` returns `null`, so, we do a null-check to\n * make sure that the player doesn't break in these cases.\n *\n * @param {Element} el\n * The element you want the computed style of\n *\n * @param {string} prop\n * The property name you want\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n *\n * @static\n * @const\n */\nfunction computedStyle(el, prop) {\n if (!el || !prop) {\n return '';\n }\n\n if (typeof window.getComputedStyle === 'function') {\n var cs = window.getComputedStyle(el);\n\n return cs ? cs[prop] : '';\n }\n\n return el.currentStyle[prop] || '';\n}\n\nvar _templateObject = taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\\n has been deprecated. Use the third argument instead.\\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\\n has been deprecated. Use the third argument instead.\\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);\n\n/**\n * @file dom.js\n * @module dom\n */\n/**\n * Detect if a value is a string with any non-whitespace characters.\n *\n * @param {string} str\n * The string to check\n *\n * @return {boolean}\n * - True if the string is non-blank\n * - False otherwise\n *\n */\nfunction isNonBlankString(str) {\n return typeof str === 'string' && /\\S/.test(str);\n}\n\n/**\n * Throws an error if the passed string has whitespace. This is used by\n * class methods to be relatively consistent with the classList API.\n *\n * @param {string} str\n * The string to check for whitespace.\n *\n * @throws {Error}\n * Throws an error if there is whitespace in the string.\n *\n */\nfunction throwIfWhitespace(str) {\n if (/\\s/.test(str)) {\n throw new Error('class has illegal whitespace characters');\n }\n}\n\n/**\n * Produce a regular expression for matching a className within an elements className.\n *\n * @param {string} className\n * The className to generate the RegExp for.\n *\n * @return {RegExp}\n * The RegExp that will check for a specific `className` in an elements\n * className.\n */\nfunction classRegExp(className) {\n return new RegExp('(^|\\\\s)' + className + '($|\\\\s)');\n}\n\n/**\n * Whether the current DOM interface appears to be real.\n *\n * @return {Boolean}\n */\nfunction isReal() {\n return (\n\n // Both document and window will never be undefined thanks to `global`.\n document === window.document &&\n\n // In IE < 9, DOM methods return \"object\" as their type, so all we can\n // confidently check is that it exists.\n typeof document.createElement !== 'undefined'\n );\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @param {Mixed} value\n * The thing to check\n *\n * @return {boolean}\n * - True if it is a DOM element\n * - False otherwise\n */\nfunction isEl(value) {\n return isObject(value) && value.nodeType === 1;\n}\n\n/**\n * Determines if the current DOM is embedded in an iframe.\n *\n * @return {boolean}\n *\n */\nfunction isInFrame() {\n\n // We need a try/catch here because Safari will throw errors when attempting\n // to get either `parent` or `self`\n try {\n return window.parent !== window.self;\n } catch (x) {\n return true;\n }\n}\n\n/**\n * Creates functions to query the DOM using a given method.\n *\n * @param {string} method\n * The method to create the query with.\n *\n * @return {Function}\n * The query method\n */\nfunction createQuerier(method) {\n return function (selector, context) {\n if (!isNonBlankString(selector)) {\n return document[method](null);\n }\n if (isNonBlankString(context)) {\n context = document.querySelector(context);\n }\n\n var ctx = isEl(context) ? context : document;\n\n return ctx[method] && ctx[method](selector);\n };\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param {string} [tagName='div']\n * Name of tag to be created.\n *\n * @param {Object} [properties={}]\n * Element properties to be applied.\n *\n * @param {Object} [attributes={}]\n * Element attributes to be applied.\n *\n * @param {String|Element|TextNode|Array|Function} [content]\n * Contents for the element (see: {@link dom:normalizeContent})\n *\n * @return {Element}\n * The element that was created.\n */\nfunction createEl() {\n var tagName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var content = arguments[3];\n\n var el = document.createElement(tagName);\n\n Object.getOwnPropertyNames(properties).forEach(function (propName) {\n var val = properties[propName];\n\n // See #2176\n // We originally were accepting both properties and attributes in the\n // same object, but that doesn't work so well.\n if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n log$1.warn(tsml(_templateObject, propName, val));\n el.setAttribute(propName, val);\n\n // Handle textContent since it's not supported everywhere and we have a\n // method for it.\n } else if (propName === 'textContent') {\n textContent(el, val);\n } else {\n el[propName] = val;\n }\n });\n\n Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n el.setAttribute(attrName, attributes[attrName]);\n });\n\n if (content) {\n appendContent(el, content);\n }\n\n return el;\n}\n\n/**\n * Injects text into an element, replacing any existing contents entirely.\n *\n * @param {Element} el\n * The element to add text content into\n *\n * @param {string} text\n * The text content to add.\n *\n * @return {Element}\n * The element with added text content.\n */\nfunction textContent(el, text) {\n if (typeof el.textContent === 'undefined') {\n el.innerText = text;\n } else {\n el.textContent = text;\n }\n return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param {Element} child\n * Element to insert\n *\n * @param {Element} parent\n * Element to insert child into\n */\nfunction prependTo(child, parent) {\n if (parent.firstChild) {\n parent.insertBefore(child, parent.firstChild);\n } else {\n parent.appendChild(child);\n }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element\n * Element to check\n *\n * @param {string} classToCheck\n * Class name to check for\n *\n * @return {boolean}\n * - True if the element had the class\n * - False otherwise.\n *\n * @throws {Error}\n * Throws an error if `classToCheck` has white space.\n */\nfunction hasClass(element, classToCheck) {\n throwIfWhitespace(classToCheck);\n if (element.classList) {\n return element.classList.contains(classToCheck);\n }\n return classRegExp(classToCheck).test(element.className);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element\n * Element to add class name to.\n *\n * @param {string} classToAdd\n * Class name to add.\n *\n * @return {Element}\n * The dom element with the added class name.\n */\nfunction addClass(element, classToAdd) {\n if (element.classList) {\n element.classList.add(classToAdd);\n\n // Don't need to `throwIfWhitespace` here because `hasElClass` will do it\n // in the case of classList not being supported.\n } else if (!hasClass(element, classToAdd)) {\n element.className = (element.className + ' ' + classToAdd).trim();\n }\n\n return element;\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element\n * Element to remove a class name from.\n *\n * @param {string} classToRemove\n * Class name to remove\n *\n * @return {Element}\n * The dom element with class name removed.\n */\nfunction removeClass(element, classToRemove) {\n if (element.classList) {\n element.classList.remove(classToRemove);\n } else {\n throwIfWhitespace(classToRemove);\n element.className = element.className.split(/\\s+/).filter(function (c) {\n return c !== classToRemove;\n }).join(' ');\n }\n\n return element;\n}\n\n/**\n * The callback definition for toggleElClass.\n *\n * @callback Dom~PredicateCallback\n * @param {Element} element\n * The DOM element of the Component.\n *\n * @param {string} classToToggle\n * The `className` that wants to be toggled\n *\n * @return {boolean|undefined}\n * - If true the `classToToggle` will get added to `element`.\n * - If false the `classToToggle` will get removed from `element`.\n * - If undefined this callback will be ignored\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @param {Element} element\n * The element to toggle a class name on.\n *\n * @param {string} classToToggle\n * The class that should be toggled\n *\n * @param {boolean|PredicateCallback} [predicate]\n * See the return value for {@link Dom~PredicateCallback}\n *\n * @return {Element}\n * The element with a class that has been toggled.\n */\nfunction toggleClass(element, classToToggle, predicate) {\n\n // This CANNOT use `classList` internally because IE does not support the\n // second parameter to the `classList.toggle()` method! Which is fine because\n // `classList` will be used by the add/remove functions.\n var has = hasClass(element, classToToggle);\n\n if (typeof predicate === 'function') {\n predicate = predicate(element, classToToggle);\n }\n\n if (typeof predicate !== 'boolean') {\n predicate = !has;\n }\n\n // If the necessary class operation matches the current state of the\n // element, no action is required.\n if (predicate === has) {\n return;\n }\n\n if (predicate) {\n addClass(element, classToToggle);\n } else {\n removeClass(element, classToToggle);\n }\n\n return element;\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param {Element} el\n * Element to add attributes to.\n *\n * @param {Object} [attributes]\n * Attributes to be applied.\n */\nfunction setAttributes(el, attributes) {\n Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n var attrValue = attributes[attrName];\n\n if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n el.removeAttribute(attrName);\n } else {\n el.setAttribute(attrName, attrValue === true ? '' : attrValue);\n }\n });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param {Element} tag\n * Element from which to get tag attributes.\n *\n * @return {Object}\n * All attributes of the element.\n */\nfunction getAttributes(tag) {\n var obj = {};\n\n // known boolean attributes\n // we can check for matching boolean properties, but older browsers\n // won't know about HTML5 boolean attributes that we still read from\n var knownBooleans = ',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ',';\n\n if (tag && tag.attributes && tag.attributes.length > 0) {\n var attrs = tag.attributes;\n\n for (var i = attrs.length - 1; i >= 0; i--) {\n var attrName = attrs[i].name;\n var attrVal = attrs[i].value;\n\n // check for known booleans\n // the matching element property will return a value for typeof\n if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {\n // the value of an included boolean attribute is typically an empty\n // string ('') which would equal false if we just check for a false value.\n // we also don't want support bad code like autoplay='false'\n attrVal = attrVal !== null ? true : false;\n }\n\n obj[attrName] = attrVal;\n }\n }\n\n return obj;\n}\n\n/**\n * Get the value of an element's attribute\n *\n * @param {Element} el\n * A DOM element\n *\n * @param {string} attribute\n * Attribute to get the value of\n *\n * @return {string}\n * value of the attribute\n */\nfunction getAttribute(el, attribute) {\n return el.getAttribute(attribute);\n}\n\n/**\n * Set the value of an element's attribute\n *\n * @param {Element} el\n * A DOM element\n *\n * @param {string} attribute\n * Attribute to set\n *\n * @param {string} value\n * Value to set the attribute to\n */\nfunction setAttribute(el, attribute, value) {\n el.setAttribute(attribute, value);\n}\n\n/**\n * Remove an element's attribute\n *\n * @param {Element} el\n * A DOM element\n *\n * @param {string} attribute\n * Attribute to remove\n */\nfunction removeAttribute(el, attribute) {\n el.removeAttribute(attribute);\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n */\nfunction blockTextSelection() {\n document.body.focus();\n document.onselectstart = function () {\n return false;\n };\n}\n\n/**\n * Turn off text selection blocking\n */\nfunction unblockTextSelection() {\n document.onselectstart = function () {\n return true;\n };\n}\n\n/**\n * Identical to the native `getBoundingClientRect` function, but ensures that\n * the method is supported at all (it is in all browsers we claim to support)\n * and that the element is in the DOM before continuing.\n *\n * This wrapper function also shims properties which are not provided by some\n * older browsers (namely, IE8).\n *\n * Additionally, some browsers do not support adding properties to a\n * `ClientRect`/`DOMRect` object; so, we shallow-copy it with the standard\n * properties (except `x` and `y` which are not widely supported). This helps\n * avoid implementations where keys are non-enumerable.\n *\n * @param {Element} el\n * Element whose `ClientRect` we want to calculate.\n *\n * @return {Object|undefined}\n * Always returns a plain\n */\nfunction getBoundingClientRect(el) {\n if (el && el.getBoundingClientRect && el.parentNode) {\n var rect = el.getBoundingClientRect();\n var result = {};\n\n ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k) {\n if (rect[k] !== undefined) {\n result[k] = rect[k];\n }\n });\n\n if (!result.height) {\n result.height = parseFloat(computedStyle(el, 'height'));\n }\n\n if (!result.width) {\n result.width = parseFloat(computedStyle(el, 'width'));\n }\n\n return result;\n }\n}\n\n/**\n * The postion of a DOM element on the page.\n *\n * @typedef {Object} module:dom~Position\n *\n * @property {number} left\n * Pixels to the left\n *\n * @property {number} top\n * Pixels on top\n */\n\n/**\n * Offset Left.\n * getBoundingClientRect technique from\n * John Resig\n *\n * @see http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el\n * Element from which to get offset\n *\n * @return {module:dom~Position}\n * The position of the element that was passed in.\n */\nfunction findPosition(el) {\n var box = void 0;\n\n if (el.getBoundingClientRect && el.parentNode) {\n box = el.getBoundingClientRect();\n }\n\n if (!box) {\n return {\n left: 0,\n top: 0\n };\n }\n\n var docEl = document.documentElement;\n var body = document.body;\n\n var clientLeft = docEl.clientLeft || body.clientLeft || 0;\n var scrollLeft = window.pageXOffset || body.scrollLeft;\n var left = box.left + scrollLeft - clientLeft;\n\n var clientTop = docEl.clientTop || body.clientTop || 0;\n var scrollTop = window.pageYOffset || body.scrollTop;\n var top = box.top + scrollTop - clientTop;\n\n // Android sometimes returns slightly off decimal values, so need to round\n return {\n left: Math.round(left),\n top: Math.round(top)\n };\n}\n\n/**\n * x and y coordinates for a dom element or mouse pointer\n *\n * @typedef {Object} Dom~Coordinates\n *\n * @property {number} x\n * x coordinate in pixels\n *\n * @property {number} y\n * y coordinate in pixels\n */\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el\n * Element on which to get the pointer position on\n *\n * @param {EventTarget~Event} event\n * Event object\n *\n * @return {Dom~Coordinates}\n * A Coordinates object corresponding to the mouse position.\n *\n */\nfunction getPointerPosition(el, event) {\n var position = {};\n var box = findPosition(el);\n var boxW = el.offsetWidth;\n var boxH = el.offsetHeight;\n\n var boxY = box.top;\n var boxX = box.left;\n var pageY = event.pageY;\n var pageX = event.pageX;\n\n if (event.changedTouches) {\n pageX = event.changedTouches[0].pageX;\n pageY = event.changedTouches[0].pageY;\n }\n\n position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));\n position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n return position;\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @param {Mixed} value\n * Check if this value is a text node.\n *\n * @return {boolean}\n * - True if it is a text node\n * - False otherwise\n */\nfunction isTextNode(value) {\n return isObject(value) && value.nodeType === 3;\n}\n\n/**\n * Empties the contents of an element.\n *\n * @param {Element} el\n * The element to empty children from\n *\n * @return {Element}\n * The element with no children\n */\nfunction emptyEl(el) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n return el;\n}\n\n/**\n * Normalizes content for eventual insertion into the DOM.\n *\n * This allows a wide range of content definition methods, but protects\n * from falling into the trap of simply writing to `innerHTML`, which is\n * an XSS concern.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * @param {String|Element|TextNode|Array|Function} content\n * - String: Normalized into a text node.\n * - Element/TextNode: Passed through.\n * - Array: A one-dimensional array of strings, elements, nodes, or functions\n * (which return single strings, elements, or nodes).\n * - Function: If the sole argument, is expected to produce a string, element,\n * node, or array as defined above.\n *\n * @return {Array}\n * All of the content that was passed in normalized.\n */\nfunction normalizeContent(content) {\n\n // First, invoke content if it is a function. If it produces an array,\n // that needs to happen before normalization.\n if (typeof content === 'function') {\n content = content();\n }\n\n // Next up, normalize to an array, so one or many items can be normalized,\n // filtered, and returned.\n return (Array.isArray(content) ? content : [content]).map(function (value) {\n\n // First, invoke value if it is a function to produce a new value,\n // which will be subsequently normalized to a Node of some kind.\n if (typeof value === 'function') {\n value = value();\n }\n\n if (isEl(value) || isTextNode(value)) {\n return value;\n }\n\n if (typeof value === 'string' && /\\S/.test(value)) {\n return document.createTextNode(value);\n }\n }).filter(function (value) {\n return value;\n });\n}\n\n/**\n * Normalizes and appends content to an element.\n *\n * @param {Element} el\n * Element to append normalized content to.\n *\n *\n * @param {String|Element|TextNode|Array|Function} content\n * See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n * The element with appended normalized content.\n */\nfunction appendContent(el, content) {\n normalizeContent(content).forEach(function (node) {\n return el.appendChild(node);\n });\n return el;\n}\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * @param {Element} el\n * Element to insert normalized content into.\n *\n * @param {String|Element|TextNode|Array|Function} content\n * See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n * The element with inserted normalized content.\n *\n */\nfunction insertContent(el, content) {\n return appendContent(emptyEl(el), content);\n}\n\n/**\n * Check if event was a single left click\n *\n * @param {EventTarget~Event} event\n * Event object\n *\n * @return {boolean}\n * - True if a left click\n * - False if not a left click\n */\nfunction isSingleLeftClick(event) {\n // Note: if you create something draggable, be sure to\n // call it on both `mousedown` and `mousemove` event,\n // otherwise `mousedown` should be enough for a button\n\n if (event.button === undefined && event.buttons === undefined) {\n // Why do we need `buttons` ?\n // Because, middle mouse sometimes have this:\n // e.button === 0 and e.buttons === 4\n // Furthermore, we want to prevent combination click, something like\n // HOLD middlemouse then left click, that would be\n // e.button === 0, e.buttons === 5\n // just `button` is not gonna work\n\n // Alright, then what this block does ?\n // this is for chrome `simulate mobile devices`\n // I want to support this as well\n\n return true;\n }\n\n if (event.button === 0 && event.buttons === undefined) {\n // Touch screen, sometimes on some specific device, `buttons`\n // doesn't have anything (safari on ios, blackberry...)\n\n return true;\n }\n\n if (IE_VERSION === 9) {\n // Ignore IE9\n\n return true;\n }\n\n if (event.button !== 0 || event.buttons !== 1) {\n // This is the reason we have those if else block above\n // if any special case we can catch and let it slide\n // we do it above, when get to here, this definitely\n // is-not-left-click\n\n return false;\n }\n\n return true;\n}\n\n/**\n * Finds a single DOM element matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n * A valid CSS selector, which will be passed to `querySelector`.\n *\n * @param {Element|String} [context=document]\n * A DOM element within which to query. Can also be a selector\n * string in which case the first matching element will be used\n * as context. If missing (or no element matches selector), falls\n * back to `document`.\n *\n * @return {Element|null}\n * The element that was found or null.\n */\nvar $ = createQuerier('querySelector');\n\n/**\n * Finds a all DOM elements matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n * A valid CSS selector, which will be passed to `querySelectorAll`.\n *\n * @param {Element|String} [context=document]\n * A DOM element within which to query. Can also be a selector\n * string in which case the first matching element will be used\n * as context. If missing (or no element matches selector), falls\n * back to `document`.\n *\n * @return {NodeList}\n * A element list of elements that were found. Will be empty if none were found.\n *\n */\nvar $$ = createQuerier('querySelectorAll');\n\n\n\nvar Dom = (Object.freeze || Object)({\n\tisReal: isReal,\n\tisEl: isEl,\n\tisInFrame: isInFrame,\n\tcreateEl: createEl,\n\ttextContent: textContent,\n\tprependTo: prependTo,\n\thasClass: hasClass,\n\taddClass: addClass,\n\tremoveClass: removeClass,\n\ttoggleClass: toggleClass,\n\tsetAttributes: setAttributes,\n\tgetAttributes: getAttributes,\n\tgetAttribute: getAttribute,\n\tsetAttribute: setAttribute,\n\tremoveAttribute: removeAttribute,\n\tblockTextSelection: blockTextSelection,\n\tunblockTextSelection: unblockTextSelection,\n\tgetBoundingClientRect: getBoundingClientRect,\n\tfindPosition: findPosition,\n\tgetPointerPosition: getPointerPosition,\n\tisTextNode: isTextNode,\n\temptyEl: emptyEl,\n\tnormalizeContent: normalizeContent,\n\tappendContent: appendContent,\n\tinsertContent: insertContent,\n\tisSingleLeftClick: isSingleLeftClick,\n\t$: $,\n\t$$: $$\n});\n\n/**\n * @file guid.js\n * @module guid\n */\n\n/**\n * Unique ID for an element or function\n * @type {Number}\n */\nvar _guid = 1;\n\n/**\n * Get a unique auto-incrementing ID by number that has not been returned before.\n *\n * @return {number}\n * A new unique ID.\n */\nfunction newGUID() {\n return _guid++;\n}\n\n/**\n * @file dom-data.js\n * @module dom-data\n */\n/**\n * Element Data Store.\n *\n * Allows for binding data to an element without putting it directly on the\n * element. Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nvar elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nvar elIdAttr = 'vdata' + new Date().getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param {Element} el\n * Element to store data for.\n *\n * @return {Object}\n * The cache object for that el that was passed in.\n */\nfunction getData(el) {\n var id = el[elIdAttr];\n\n if (!id) {\n id = el[elIdAttr] = newGUID();\n }\n\n if (!elData[id]) {\n elData[id] = {};\n }\n\n return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param {Element} el\n * Check if this element has cached data.\n *\n * @return {boolean}\n * - True if the DOM element has cached data.\n * - False otherwise.\n */\nfunction hasData(el) {\n var id = el[elIdAttr];\n\n if (!id) {\n return false;\n }\n\n return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param {Element} el\n * Remove cached data for this element.\n */\nfunction removeData(el) {\n var id = el[elIdAttr];\n\n if (!id) {\n return;\n }\n\n // Remove all stored data\n delete elData[id];\n\n // Remove the elIdAttr property from the DOM node\n try {\n delete el[elIdAttr];\n } catch (e) {\n if (el.removeAttribute) {\n el.removeAttribute(elIdAttr);\n } else {\n // IE doesn't appear to support removeAttribute on the document element\n el[elIdAttr] = null;\n }\n }\n}\n\n/**\n * @file events.js. An Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n *\n * @module events\n */\n\n/**\n * Clean up the listener cache and dispatchers\n *\n * @param {Element|Object} elem\n * Element to clean up\n *\n * @param {string} type\n * Type of event to clean up\n */\nfunction _cleanUpEvents(elem, type) {\n var data = getData(elem);\n\n // Remove the events of a particular type if there are none left\n if (data.handlers[type].length === 0) {\n delete data.handlers[type];\n // data.handlers[type] = null;\n // Setting to null was causing an error with data.handlers\n\n // Remove the meta-handler from the element\n if (elem.removeEventListener) {\n elem.removeEventListener(type, data.dispatcher, false);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + type, data.dispatcher);\n }\n }\n\n // Remove the events object if there are no types left\n if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n delete data.handlers;\n delete data.dispatcher;\n delete data.disabled;\n }\n\n // Finally remove the element data if there is no data left\n if (Object.getOwnPropertyNames(data).length === 0) {\n removeData(elem);\n }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param {Function} fn\n * The event method we want to use.\n *\n * @param {Element|Object} elem\n * Element or object to bind listeners to\n *\n * @param {string} type\n * Type of event to bind to.\n *\n * @param {EventTarget~EventListener} callback\n * Event listener.\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n types.forEach(function (type) {\n // Call the event method for each one of the types\n fn(elem, type, callback);\n });\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param {Object} event\n * Event object to fix.\n *\n * @return {Object}\n * Fixed event object.\n */\nfunction fixEvent(event) {\n\n function returnTrue() {\n return true;\n }\n\n function returnFalse() {\n return false;\n }\n\n // Test if fixing up is needed\n // Used to check if !event.stopPropagation instead of isPropagationStopped\n // But native events return true for stopPropagation, but don't have\n // other expected methods like isPropagationStopped. Seems to be a problem\n // with the Javascript Ninja code. So we're just overriding all events now.\n if (!event || !event.isPropagationStopped) {\n var old = event || window.event;\n\n event = {};\n // Clone the old object so that we can modify the values event = {};\n // IE8 Doesn't like when you mess with native event properties\n // Firefox returns false for event.hasOwnProperty('type') and other props\n // which makes copying more difficult.\n // TODO: Probably best to create a whitelist of event props\n for (var key in old) {\n // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n // and webkitMovementX/Y\n if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n // Chrome 32+ warns if you try to copy deprecated returnValue, but\n // we still want to if preventDefault isn't supported (IE8).\n if (!(key === 'returnValue' && old.preventDefault)) {\n event[key] = old[key];\n }\n }\n }\n\n // The event occurred on this element\n if (!event.target) {\n event.target = event.srcElement || document;\n }\n\n // Handle which other element the event is related to\n if (!event.relatedTarget) {\n event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n }\n\n // Stop the default browser action\n event.preventDefault = function () {\n if (old.preventDefault) {\n old.preventDefault();\n }\n event.returnValue = false;\n old.returnValue = false;\n event.defaultPrevented = true;\n };\n\n event.defaultPrevented = false;\n\n // Stop the event from bubbling\n event.stopPropagation = function () {\n if (old.stopPropagation) {\n old.stopPropagation();\n }\n event.cancelBubble = true;\n old.cancelBubble = true;\n event.isPropagationStopped = returnTrue;\n };\n\n event.isPropagationStopped = returnFalse;\n\n // Stop the event from bubbling and executing other handlers\n event.stopImmediatePropagation = function () {\n if (old.stopImmediatePropagation) {\n old.stopImmediatePropagation();\n }\n event.isImmediatePropagationStopped = returnTrue;\n event.stopPropagation();\n };\n\n event.isImmediatePropagationStopped = returnFalse;\n\n // Handle mouse position\n if (event.clientX !== null && event.clientX !== undefined) {\n var doc = document.documentElement;\n var body = document.body;\n\n event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n }\n\n // Handle key presses\n event.which = event.charCode || event.keyCode;\n\n // Fix button for mouse clicks:\n // 0 == left; 1 == middle; 2 == right\n if (event.button !== null && event.button !== undefined) {\n\n // The following is disabled because it does not pass videojs-standard\n // and... yikes.\n /* eslint-disable */\n event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;\n /* eslint-enable */\n }\n }\n\n // Returns fixed-up instance\n return event;\n}\n\n/**\n * Whether passive event listeners are supported\n */\nvar _supportsPassive = false;\n\n(function () {\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n _supportsPassive = true;\n }\n });\n\n window.addEventListener('test', null, opts);\n window.removeEventListener('test', null, opts);\n } catch (e) {\n // disregard\n }\n})();\n\n/**\n * Touch events Chrome expects to be passive\n */\nvar passiveEvents = ['touchstart', 'touchmove'];\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param {Element|Object} elem\n * Element or object to bind listeners to\n *\n * @param {string|string[]} type\n * Type of event to bind to.\n *\n * @param {EventTarget~EventListener} fn\n * Event listener.\n */\nfunction on(elem, type, fn) {\n if (Array.isArray(type)) {\n return _handleMultipleEvents(on, elem, type, fn);\n }\n\n var data = getData(elem);\n\n // We need a place to store all our handler data\n if (!data.handlers) {\n data.handlers = {};\n }\n\n if (!data.handlers[type]) {\n data.handlers[type] = [];\n }\n\n if (!fn.guid) {\n fn.guid = newGUID();\n }\n\n data.handlers[type].push(fn);\n\n if (!data.dispatcher) {\n data.disabled = false;\n\n data.dispatcher = function (event, hash) {\n\n if (data.disabled) {\n return;\n }\n\n event = fixEvent(event);\n\n var handlers = data.handlers[event.type];\n\n if (handlers) {\n // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n var handlersCopy = handlers.slice(0);\n\n for (var m = 0, n = handlersCopy.length; m < n; m++) {\n if (event.isImmediatePropagationStopped()) {\n break;\n } else {\n try {\n handlersCopy[m].call(elem, event, hash);\n } catch (e) {\n log$1.error(e);\n }\n }\n }\n }\n };\n }\n\n if (data.handlers[type].length === 1) {\n if (elem.addEventListener) {\n var options = false;\n\n if (_supportsPassive && passiveEvents.indexOf(type) > -1) {\n options = { passive: true };\n }\n elem.addEventListener(type, data.dispatcher, options);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + type, data.dispatcher);\n }\n }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param {Element|Object} elem\n * Object to remove listeners from.\n *\n * @param {string|string[]} [type]\n * Type of listener to remove. Don't include to remove all events from element.\n *\n * @param {EventTarget~EventListener} [fn]\n * Specific listener to remove. Don't include to remove listeners for an event\n * type.\n */\nfunction off(elem, type, fn) {\n // Don't want to add a cache object through getElData if not needed\n if (!hasData(elem)) {\n return;\n }\n\n var data = getData(elem);\n\n // If no events exist, nothing to unbind\n if (!data.handlers) {\n return;\n }\n\n if (Array.isArray(type)) {\n return _handleMultipleEvents(off, elem, type, fn);\n }\n\n // Utility function\n var removeType = function removeType(el, t) {\n data.handlers[t] = [];\n _cleanUpEvents(el, t);\n };\n\n // Are we removing all bound events?\n if (type === undefined) {\n for (var t in data.handlers) {\n if (Object.prototype.hasOwnProperty.call(data.handlers || {}, t)) {\n removeType(elem, t);\n }\n }\n return;\n }\n\n var handlers = data.handlers[type];\n\n // If no handlers exist, nothing to unbind\n if (!handlers) {\n return;\n }\n\n // If no listener was provided, remove all listeners for type\n if (!fn) {\n removeType(elem, type);\n return;\n }\n\n // We're only removing a single handler\n if (fn.guid) {\n for (var n = 0; n < handlers.length; n++) {\n if (handlers[n].guid === fn.guid) {\n handlers.splice(n--, 1);\n }\n }\n }\n\n _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param {Element|Object} elem\n * Element to trigger an event on\n *\n * @param {EventTarget~Event|string} event\n * A string (the type) or an event object with a type attribute\n *\n * @param {Object} [hash]\n * data hash to pass along with the event\n *\n * @return {boolean|undefined}\n * - Returns the opposite of `defaultPrevented` if default was prevented\n * - Otherwise returns undefined\n */\nfunction trigger(elem, event, hash) {\n // Fetches element data and a reference to the parent (for bubbling).\n // Don't want to add a data object to cache for every parent,\n // so checking hasElData first.\n var elemData = hasData(elem) ? getData(elem) : {};\n var parent = elem.parentNode || elem.ownerDocument;\n // type = event.type || event,\n // handler;\n\n // If an event name was passed as a string, creates an event out of it\n if (typeof event === 'string') {\n event = { type: event, target: elem };\n } else if (!event.target) {\n event.target = elem;\n }\n\n // Normalizes the event properties.\n event = fixEvent(event);\n\n // If the passed element has a dispatcher, executes the established handlers.\n if (elemData.dispatcher) {\n elemData.dispatcher.call(elem, event, hash);\n }\n\n // Unless explicitly stopped or the event does not bubble (e.g. media events)\n // recursively calls this function to bubble the event up the DOM.\n if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n trigger.call(null, parent, event, hash);\n\n // If at the top of the DOM, triggers the default action unless disabled.\n } else if (!parent && !event.defaultPrevented) {\n var targetData = getData(event.target);\n\n // Checks if the target has a default action for this event.\n if (event.target[event.type]) {\n // Temporarily disables event dispatching on the target as we have already executed the handler.\n targetData.disabled = true;\n // Executes the default action.\n if (typeof event.target[event.type] === 'function') {\n event.target[event.type]();\n }\n // Re-enables event dispatching.\n targetData.disabled = false;\n }\n }\n\n // Inform the triggerer if the default was prevented by returning false\n return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param {Element|Object} elem\n * Element or object to bind to.\n *\n * @param {string|string[]} type\n * Name/type of event\n *\n * @param {Event~EventListener} fn\n * Event Listener function\n */\nfunction one(elem, type, fn) {\n if (Array.isArray(type)) {\n return _handleMultipleEvents(one, elem, type, fn);\n }\n var func = function func() {\n off(elem, type, func);\n fn.apply(this, arguments);\n };\n\n // copy the guid to the new function so it can removed using the original function's ID\n func.guid = fn.guid = fn.guid || newGUID();\n on(elem, type, func);\n}\n\nvar Events = (Object.freeze || Object)({\n\tfixEvent: fixEvent,\n\ton: on,\n\toff: off,\n\ttrigger: trigger,\n\tone: one\n});\n\n/**\n * @file setup.js - Functions for setting up a player without\n * user interaction based on the data-setup `attribute` of the video tag.\n *\n * @module setup\n */\nvar _windowLoaded = false;\nvar videojs$2 = void 0;\n\n/**\n * Set up any tags that have a data-setup `attribute` when the player is started.\n */\nvar autoSetup = function autoSetup() {\n\n // Protect against breakage in non-browser environments and check global autoSetup option.\n if (!isReal() || videojs$2.options.autoSetup === false) {\n return;\n }\n\n // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n // var mediaEls = vids.concat(audios);\n\n // Because IE8 doesn't support calling slice on a node list, we need to loop\n // through each list of elements to build up a new, combined list of elements.\n var vids = document.getElementsByTagName('video');\n var audios = document.getElementsByTagName('audio');\n var divs = document.getElementsByTagName('video-js');\n var mediaEls = [];\n\n if (vids && vids.length > 0) {\n for (var i = 0, e = vids.length; i < e; i++) {\n mediaEls.push(vids[i]);\n }\n }\n\n if (audios && audios.length > 0) {\n for (var _i = 0, _e = audios.length; _i < _e; _i++) {\n mediaEls.push(audios[_i]);\n }\n }\n\n if (divs && divs.length > 0) {\n for (var _i2 = 0, _e2 = divs.length; _i2 < _e2; _i2++) {\n mediaEls.push(divs[_i2]);\n }\n }\n\n // Check if any media elements exist\n if (mediaEls && mediaEls.length > 0) {\n\n for (var _i3 = 0, _e3 = mediaEls.length; _i3 < _e3; _i3++) {\n var mediaEl = mediaEls[_i3];\n\n // Check if element exists, has getAttribute func.\n // IE seems to consider typeof el.getAttribute == 'object' instead of\n // 'function' like expected, at least when loading the player immediately.\n if (mediaEl && mediaEl.getAttribute) {\n\n // Make sure this player hasn't already been set up.\n if (mediaEl.player === undefined) {\n var options = mediaEl.getAttribute('data-setup');\n\n // Check if data-setup attr exists.\n // We only auto-setup if they've added the data-setup attr.\n if (options !== null) {\n // Create new video.js instance.\n videojs$2(mediaEl);\n }\n }\n\n // If getAttribute isn't defined, we need to wait for the DOM.\n } else {\n autoSetupTimeout(1);\n break;\n }\n }\n\n // No videos were found, so keep looping unless page is finished loading.\n } else if (!_windowLoaded) {\n autoSetupTimeout(1);\n }\n};\n\n/**\n * Wait until the page is loaded before running autoSetup. This will be called in\n * autoSetup if `hasLoaded` returns false.\n *\n * @param {number} wait\n * How long to wait in ms\n *\n * @param {module:videojs} [vjs]\n * The videojs library function\n */\nfunction autoSetupTimeout(wait, vjs) {\n if (vjs) {\n videojs$2 = vjs;\n }\n\n window.setTimeout(autoSetup, wait);\n}\n\nif (isReal() && document.readyState === 'complete') {\n _windowLoaded = true;\n} else {\n /**\n * Listen for the load event on window, and set _windowLoaded to true.\n *\n * @listens load\n */\n one(window, 'load', function () {\n _windowLoaded = true;\n });\n}\n\n/**\n * @file stylesheet.js\n * @module stylesheet\n */\n/**\n * Create a DOM syle element given a className for it.\n *\n * @param {string} className\n * The className to add to the created style element.\n *\n * @return {Element}\n * The element that was created.\n */\nvar createStyleElement = function createStyleElement(className) {\n var style = document.createElement('style');\n\n style.className = className;\n\n return style;\n};\n\n/**\n * Add text to a DOM element.\n *\n * @param {Element} el\n * The Element to add text content to.\n *\n * @param {string} content\n * The text to add to the element.\n */\nvar setTextContent = function setTextContent(el, content) {\n if (el.styleSheet) {\n el.styleSheet.cssText = content;\n } else {\n el.textContent = content;\n }\n};\n\n/**\n * @file fn.js\n * @module fn\n */\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events.\n *\n * @param {Mixed} context\n * The object to bind as scope.\n *\n * @param {Function} fn\n * The function to be bound to a scope.\n *\n * @param {number} [uid]\n * An optional unique ID for the function to be set\n *\n * @return {Function}\n * The new function that will be bound into the context given\n */\nvar bind = function bind(context, fn, uid) {\n // Make sure the function has a unique ID\n if (!fn.guid) {\n fn.guid = newGUID();\n }\n\n // Create the new function that changes the context\n var bound = function bound() {\n return fn.apply(context, arguments);\n };\n\n // Allow for the ability to individualize this function\n // Needed in the case where multiple objects might share the same prototype\n // IF both items add an event listener with the same function, then you try to remove just one\n // it will remove both because they both have the same guid.\n // when using this, you need to use the bind method when you remove the listener as well.\n // currently used in text tracks\n bound.guid = uid ? uid + '_' + fn.guid : fn.guid;\n\n return bound;\n};\n\n/**\n * Wraps the given function, `fn`, with a new function that only invokes `fn`\n * at most once per every `wait` milliseconds.\n *\n * @param {Function} fn\n * The function to be throttled.\n *\n * @param {Number} wait\n * The number of milliseconds by which to throttle.\n *\n * @return {Function}\n */\nvar throttle = function throttle(fn, wait) {\n var last = Date.now();\n\n var throttled = function throttled() {\n var now = Date.now();\n\n if (now - last >= wait) {\n fn.apply(undefined, arguments);\n last = now;\n }\n };\n\n return throttled;\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked.\n *\n * Inspired by lodash and underscore implementations.\n *\n * @param {Function} func\n * The function to wrap with debounce behavior.\n *\n * @param {number} wait\n * The number of milliseconds to wait after the last invocation.\n *\n * @param {boolean} [immediate]\n * Whether or not to invoke the function immediately upon creation.\n *\n * @param {Object} [context=window]\n * The \"context\" in which the debounced function should debounce. For\n * example, if this function should be tied to a Video.js player,\n * the player can be passed here. Alternatively, defaults to the\n * global `window` object.\n *\n * @return {Function}\n * A debounced function.\n */\nvar debounce = function debounce(func, wait, immediate) {\n var context = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : window;\n\n var timeout = void 0;\n\n /* eslint-disable consistent-this */\n return function () {\n var self = this;\n var args = arguments;\n\n var _later = function later() {\n timeout = null;\n _later = null;\n if (!immediate) {\n func.apply(self, args);\n }\n };\n\n if (!timeout && immediate) {\n func.apply(self, args);\n }\n\n context.clearTimeout(timeout);\n timeout = context.setTimeout(_later, wait);\n };\n /* eslint-enable consistent-this */\n};\n\n/**\n * @file src/js/event-target.js\n */\n/**\n * `EventTarget` is a class that can have the same API as the DOM `EventTarget`. It\n * adds shorthand functions that wrap around lengthy functions. For example:\n * the `on` function is a wrapper around `addEventListener`.\n *\n * @see [EventTarget Spec]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget}\n * @class EventTarget\n */\nvar EventTarget = function EventTarget() {};\n\n/**\n * A Custom DOM event.\n *\n * @typedef {Object} EventTarget~Event\n * @see [Properties]{@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent}\n */\n\n/**\n * All event listeners should follow the following format.\n *\n * @callback EventTarget~EventListener\n * @this {EventTarget}\n *\n * @param {EventTarget~Event} event\n * the event that triggered this function\n *\n * @param {Object} [hash]\n * hash of data sent during the event\n */\n\n/**\n * An object containing event names as keys and booleans as values.\n *\n * > NOTE: If an event name is set to a true value here {@link EventTarget#trigger}\n * will have extra functionality. See that function for more information.\n *\n * @property EventTarget.prototype.allowedEvents_\n * @private\n */\nEventTarget.prototype.allowedEvents_ = {};\n\n/**\n * Adds an `event listener` to an instance of an `EventTarget`. An `event listener` is a\n * function that will get called when an event with a certain name gets triggered.\n *\n * @param {string|string[]} type\n * An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n * The function to call with `EventTarget`s\n */\nEventTarget.prototype.on = function (type, fn) {\n // Remove the addEventListener alias before calling Events.on\n // so we don't get into an infinite type loop\n var ael = this.addEventListener;\n\n this.addEventListener = function () {};\n on(this, type, fn);\n this.addEventListener = ael;\n};\n\n/**\n * An alias of {@link EventTarget#on}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#on}\n */\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\n/**\n * Removes an `event listener` for a specific event from an instance of `EventTarget`.\n * This makes it so that the `event listener` will no longer get called when the\n * named event happens.\n *\n * @param {string|string[]} type\n * An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n * The function to remove.\n */\nEventTarget.prototype.off = function (type, fn) {\n off(this, type, fn);\n};\n\n/**\n * An alias of {@link EventTarget#off}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#off}\n */\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\n/**\n * This function will add an `event listener` that gets triggered only once. After the\n * first trigger it will get removed. This is like adding an `event listener`\n * with {@link EventTarget#on} that calls {@link EventTarget#off} on itself.\n *\n * @param {string|string[]} type\n * An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n * The function to be called once for each event name.\n */\nEventTarget.prototype.one = function (type, fn) {\n // Remove the addEventListener alialing Events.on\n // so we don't get into an infinite type loop\n var ael = this.addEventListener;\n\n this.addEventListener = function () {};\n one(this, type, fn);\n this.addEventListener = ael;\n};\n\n/**\n * This function causes an event to happen. This will then cause any `event listeners`\n * that are waiting for that event, to get called. If there are no `event listeners`\n * for an event then nothing will happen.\n *\n * If the name of the `Event` that is being triggered is in `EventTarget.allowedEvents_`.\n * Trigger will also call the `on` + `uppercaseEventName` function.\n *\n * Example:\n * 'click' is in `EventTarget.allowedEvents_`, so, trigger will attempt to call\n * `onClick` if it exists.\n *\n * @param {string|EventTarget~Event|Object} event\n * The name of the event, an `Event`, or an object with a key of type set to\n * an event name.\n */\nEventTarget.prototype.trigger = function (event) {\n var type = event.type || event;\n\n if (typeof event === 'string') {\n event = { type: type };\n }\n event = fixEvent(event);\n\n if (this.allowedEvents_[type] && this['on' + type]) {\n this['on' + type](event);\n }\n\n trigger(this, event);\n};\n\n/**\n * An alias of {@link EventTarget#trigger}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#trigger}\n */\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\n/**\n * @file mixins/evented.js\n * @module evented\n */\n/**\n * Returns whether or not an object has had the evented mixin applied.\n *\n * @param {Object} object\n * An object to test.\n *\n * @return {boolean}\n * Whether or not the object appears to be evented.\n */\nvar isEvented = function isEvented(object) {\n return object instanceof EventTarget || !!object.eventBusEl_ && ['on', 'one', 'off', 'trigger'].every(function (k) {\n return typeof object[k] === 'function';\n });\n};\n\n/**\n * Whether a value is a valid event type - non-empty string or array.\n *\n * @private\n * @param {string|Array} type\n * The type value to test.\n *\n * @return {boolean}\n * Whether or not the type is a valid event type.\n */\nvar isValidEventType = function isValidEventType(type) {\n return (\n // The regex here verifies that the `type` contains at least one non-\n // whitespace character.\n typeof type === 'string' && /\\S/.test(type) || Array.isArray(type) && !!type.length\n );\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n * If the target does not appear to be a valid event target.\n *\n * @param {Object} target\n * The object to test.\n */\nvar validateTarget = function validateTarget(target) {\n if (!target.nodeName && !isEvented(target)) {\n throw new Error('Invalid target; must be a DOM node or evented object.');\n }\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n * If the type does not appear to be a valid event type.\n *\n * @param {string|Array} type\n * The type to test.\n */\nvar validateEventType = function validateEventType(type) {\n if (!isValidEventType(type)) {\n throw new Error('Invalid event type; must be a non-empty string or array.');\n }\n};\n\n/**\n * Validates a value to determine if it is a valid listener. Throws if not.\n *\n * @private\n * @throws {Error}\n * If the listener is not a function.\n *\n * @param {Function} listener\n * The listener to test.\n */\nvar validateListener = function validateListener(listener) {\n if (typeof listener !== 'function') {\n throw new Error('Invalid listener; must be a function.');\n }\n};\n\n/**\n * Takes an array of arguments given to `on()` or `one()`, validates them, and\n * normalizes them into an object.\n *\n * @private\n * @param {Object} self\n * The evented object on which `on()` or `one()` was called. This\n * object will be bound as the `this` value for the listener.\n *\n * @param {Array} args\n * An array of arguments passed to `on()` or `one()`.\n *\n * @return {Object}\n * An object containing useful values for `on()` or `one()` calls.\n */\nvar normalizeListenArgs = function normalizeListenArgs(self, args) {\n\n // If the number of arguments is less than 3, the target is always the\n // evented object itself.\n var isTargetingSelf = args.length < 3 || args[0] === self || args[0] === self.eventBusEl_;\n var target = void 0;\n var type = void 0;\n var listener = void 0;\n\n if (isTargetingSelf) {\n target = self.eventBusEl_;\n\n // Deal with cases where we got 3 arguments, but we are still listening to\n // the evented object itself.\n if (args.length >= 3) {\n args.shift();\n }\n\n type = args[0];\n listener = args[1];\n } else {\n target = args[0];\n type = args[1];\n listener = args[2];\n }\n\n validateTarget(target);\n validateEventType(type);\n validateListener(listener);\n\n listener = bind(self, listener);\n\n return { isTargetingSelf: isTargetingSelf, target: target, type: type, listener: listener };\n};\n\n/**\n * Adds the listener to the event type(s) on the target, normalizing for\n * the type of target.\n *\n * @private\n * @param {Element|Object} target\n * A DOM node or evented object.\n *\n * @param {string} method\n * The event binding method to use (\"on\" or \"one\").\n *\n * @param {string|Array} type\n * One or more event type(s).\n *\n * @param {Function} listener\n * A listener function.\n */\nvar listen = function listen(target, method, type, listener) {\n validateTarget(target);\n\n if (target.nodeName) {\n Events[method](target, type, listener);\n } else {\n target[method](type, listener);\n }\n};\n\n/**\n * Contains methods that provide event capabilites to an object which is passed\n * to {@link module:evented|evented}.\n *\n * @mixin EventedMixin\n */\nvar EventedMixin = {\n\n /**\n * Add a listener to an event (or events) on this object or another evented\n * object.\n *\n * @param {string|Array|Element|Object} targetOrType\n * If this is a string or array, it represents the event type(s)\n * that will trigger the listener.\n *\n * Another evented object can be passed here instead, which will\n * cause the listener to listen for events on _that_ object.\n *\n * In either case, the listener's `this` value will be bound to\n * this object.\n *\n * @param {string|Array|Function} typeOrListener\n * If the first argument was a string or array, this should be the\n * listener function. Otherwise, this is a string or array of event\n * type(s).\n *\n * @param {Function} [listener]\n * If the first argument was another evented object, this will be\n * the listener function.\n */\n on: function on$$1() {\n var _this = this;\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var _normalizeListenArgs = normalizeListenArgs(this, args),\n isTargetingSelf = _normalizeListenArgs.isTargetingSelf,\n target = _normalizeListenArgs.target,\n type = _normalizeListenArgs.type,\n listener = _normalizeListenArgs.listener;\n\n listen(target, 'on', type, listener);\n\n // If this object is listening to another evented object.\n if (!isTargetingSelf) {\n\n // If this object is disposed, remove the listener.\n var removeListenerOnDispose = function removeListenerOnDispose() {\n return _this.off(target, type, listener);\n };\n\n // Use the same function ID as the listener so we can remove it later it\n // using the ID of the original listener.\n removeListenerOnDispose.guid = listener.guid;\n\n // Add a listener to the target's dispose event as well. This ensures\n // that if the target is disposed BEFORE this object, we remove the\n // removal listener that was just added. Otherwise, we create a memory leak.\n var removeRemoverOnTargetDispose = function removeRemoverOnTargetDispose() {\n return _this.off('dispose', removeListenerOnDispose);\n };\n\n // Use the same function ID as the listener so we can remove it later\n // it using the ID of the original listener.\n removeRemoverOnTargetDispose.guid = listener.guid;\n\n listen(this, 'on', 'dispose', removeListenerOnDispose);\n listen(target, 'on', 'dispose', removeRemoverOnTargetDispose);\n }\n },\n\n\n /**\n * Add a listener to an event (or events) on this object or another evented\n * object. The listener will only be called once and then removed.\n *\n * @param {string|Array|Element|Object} targetOrType\n * If this is a string or array, it represents the event type(s)\n * that will trigger the listener.\n *\n * Another evented object can be passed here instead, which will\n * cause the listener to listen for events on _that_ object.\n *\n * In either case, the listener's `this` value will be bound to\n * this object.\n *\n * @param {string|Array|Function} typeOrListener\n * If the first argument was a string or array, this should be the\n * listener function. Otherwise, this is a string or array of event\n * type(s).\n *\n * @param {Function} [listener]\n * If the first argument was another evented object, this will be\n * the listener function.\n */\n one: function one$$1() {\n var _this2 = this;\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var _normalizeListenArgs2 = normalizeListenArgs(this, args),\n isTargetingSelf = _normalizeListenArgs2.isTargetingSelf,\n target = _normalizeListenArgs2.target,\n type = _normalizeListenArgs2.type,\n listener = _normalizeListenArgs2.listener;\n\n // Targeting this evented object.\n\n\n if (isTargetingSelf) {\n listen(target, 'one', type, listener);\n\n // Targeting another evented object.\n } else {\n var wrapper = function wrapper() {\n for (var _len3 = arguments.length, largs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n largs[_key3] = arguments[_key3];\n }\n\n _this2.off(target, type, wrapper);\n listener.apply(null, largs);\n };\n\n // Use the same function ID as the listener so we can remove it later\n // it using the ID of the original listener.\n wrapper.guid = listener.guid;\n listen(target, 'one', type, wrapper);\n }\n },\n\n\n /**\n * Removes listener(s) from event(s) on an evented object.\n *\n * @param {string|Array|Element|Object} [targetOrType]\n * If this is a string or array, it represents the event type(s).\n *\n * Another evented object can be passed here instead, in which case\n * ALL 3 arguments are _required_.\n *\n * @param {string|Array|Function} [typeOrListener]\n * If the first argument was a string or array, this may be the\n * listener function. Otherwise, this is a string or array of event\n * type(s).\n *\n * @param {Function} [listener]\n * If the first argument was another evented object, this will be\n * the listener function; otherwise, _all_ listeners bound to the\n * event type(s) will be removed.\n */\n off: function off$$1(targetOrType, typeOrListener, listener) {\n\n // Targeting this evented object.\n if (!targetOrType || isValidEventType(targetOrType)) {\n off(this.eventBusEl_, targetOrType, typeOrListener);\n\n // Targeting another evented object.\n } else {\n var target = targetOrType;\n var type = typeOrListener;\n\n // Fail fast and in a meaningful way!\n validateTarget(target);\n validateEventType(type);\n validateListener(listener);\n\n // Ensure there's at least a guid, even if the function hasn't been used\n listener = bind(this, listener);\n\n // Remove the dispose listener on this evented object, which was given\n // the same guid as the event listener in on().\n this.off('dispose', listener);\n\n if (target.nodeName) {\n off(target, type, listener);\n off(target, 'dispose', listener);\n } else if (isEvented(target)) {\n target.off(type, listener);\n target.off('dispose', listener);\n }\n }\n },\n\n\n /**\n * Fire an event on this evented object, causing its listeners to be called.\n *\n * @param {string|Object} event\n * An event type or an object with a type property.\n *\n * @param {Object} [hash]\n * An additional object to pass along to listeners.\n *\n * @returns {boolean}\n * Whether or not the default behavior was prevented.\n */\n trigger: function trigger$$1(event, hash) {\n return trigger(this.eventBusEl_, event, hash);\n }\n};\n\n/**\n * Applies {@link module:evented~EventedMixin|EventedMixin} to a target object.\n *\n * @param {Object} target\n * The object to which to add event methods.\n *\n * @param {Object} [options={}]\n * Options for customizing the mixin behavior.\n *\n * @param {String} [options.eventBusKey]\n * By default, adds a `eventBusEl_` DOM element to the target object,\n * which is used as an event bus. If the target object already has a\n * DOM element that should be used, pass its key here.\n *\n * @return {Object}\n * The target object.\n */\nfunction evented(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var eventBusKey = options.eventBusKey;\n\n // Set or create the eventBusEl_.\n\n if (eventBusKey) {\n if (!target[eventBusKey].nodeName) {\n throw new Error('The eventBusKey \"' + eventBusKey + '\" does not refer to an element.');\n }\n target.eventBusEl_ = target[eventBusKey];\n } else {\n target.eventBusEl_ = createEl('span', { className: 'vjs-event-bus' });\n }\n\n assign(target, EventedMixin);\n\n // When any evented object is disposed, it removes all its listeners.\n target.on('dispose', function () {\n target.off();\n window.setTimeout(function () {\n target.eventBusEl_ = null;\n }, 0);\n });\n\n return target;\n}\n\n/**\n * @file mixins/stateful.js\n * @module stateful\n */\n/**\n * Contains methods that provide statefulness to an object which is passed\n * to {@link module:stateful}.\n *\n * @mixin StatefulMixin\n */\nvar StatefulMixin = {\n\n /**\n * A hash containing arbitrary keys and values representing the state of\n * the object.\n *\n * @type {Object}\n */\n state: {},\n\n /**\n * Set the state of an object by mutating its\n * {@link module:stateful~StatefulMixin.state|state} object in place.\n *\n * @fires module:stateful~StatefulMixin#statechanged\n * @param {Object|Function} stateUpdates\n * A new set of properties to shallow-merge into the plugin state.\n * Can be a plain object or a function returning a plain object.\n *\n * @returns {Object|undefined}\n * An object containing changes that occurred. If no changes\n * occurred, returns `undefined`.\n */\n setState: function setState(stateUpdates) {\n var _this = this;\n\n // Support providing the `stateUpdates` state as a function.\n if (typeof stateUpdates === 'function') {\n stateUpdates = stateUpdates();\n }\n\n var changes = void 0;\n\n each(stateUpdates, function (value, key) {\n\n // Record the change if the value is different from what's in the\n // current state.\n if (_this.state[key] !== value) {\n changes = changes || {};\n changes[key] = {\n from: _this.state[key],\n to: value\n };\n }\n\n _this.state[key] = value;\n });\n\n // Only trigger \"statechange\" if there were changes AND we have a trigger\n // function. This allows us to not require that the target object be an\n // evented object.\n if (changes && isEvented(this)) {\n\n /**\n * An event triggered on an object that is both\n * {@link module:stateful|stateful} and {@link module:evented|evented}\n * indicating that its state has changed.\n *\n * @event module:stateful~StatefulMixin#statechanged\n * @type {Object}\n * @property {Object} changes\n * A hash containing the properties that were changed and\n * the values they were changed `from` and `to`.\n */\n this.trigger({\n changes: changes,\n type: 'statechanged'\n });\n }\n\n return changes;\n }\n};\n\n/**\n * Applies {@link module:stateful~StatefulMixin|StatefulMixin} to a target\n * object.\n *\n * If the target object is {@link module:evented|evented} and has a\n * `handleStateChanged` method, that method will be automatically bound to the\n * `statechanged` event on itself.\n *\n * @param {Object} target\n * The object to be made stateful.\n *\n * @param {Object} [defaultState]\n * A default set of properties to populate the newly-stateful object's\n * `state` property.\n *\n * @returns {Object}\n * Returns the `target`.\n */\nfunction stateful(target, defaultState) {\n assign(target, StatefulMixin);\n\n // This happens after the mixing-in because we need to replace the `state`\n // added in that step.\n target.state = assign({}, target.state, defaultState);\n\n // Auto-bind the `handleStateChanged` method of the target object if it exists.\n if (typeof target.handleStateChanged === 'function' && isEvented(target)) {\n target.on('statechanged', target.handleStateChanged);\n }\n\n return target;\n}\n\n/**\n * @file to-title-case.js\n * @module to-title-case\n */\n\n/**\n * Uppercase the first letter of a string.\n *\n * @param {string} string\n * String to be uppercased\n *\n * @return {string}\n * The string with an uppercased first letter\n */\nfunction toTitleCase(string) {\n if (typeof string !== 'string') {\n return string;\n }\n\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Compares the TitleCase versions of the two strings for equality.\n *\n * @param {string} str1\n * The first string to compare\n *\n * @param {string} str2\n * The second string to compare\n *\n * @return {boolean}\n * Whether the TitleCase versions of the strings are equal\n */\nfunction titleCaseEquals(str1, str2) {\n return toTitleCase(str1) === toTitleCase(str2);\n}\n\n/**\n * @file merge-options.js\n * @module merge-options\n */\n/**\n * Deep-merge one or more options objects, recursively merging **only** plain\n * object properties.\n *\n * @param {Object[]} sources\n * One or more objects to merge into a new object.\n *\n * @returns {Object}\n * A new object that is the merged result of all sources.\n */\nfunction mergeOptions() {\n var result = {};\n\n for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {\n sources[_key] = arguments[_key];\n }\n\n sources.forEach(function (source) {\n if (!source) {\n return;\n }\n\n each(source, function (value, key) {\n if (!isPlain(value)) {\n result[key] = value;\n return;\n }\n\n if (!isPlain(result[key])) {\n result[key] = {};\n }\n\n result[key] = mergeOptions(result[key], value);\n });\n });\n\n return result;\n}\n\n/**\n * Player Component - Base class for all UI objects\n *\n * @file component.js\n */\n/**\n * Base class for all UI Components.\n * Components are UI objects which represent both a javascript object and an element\n * in the DOM. They can be children of other components, and can have\n * children themselves.\n *\n * Components can also use methods from {@link EventTarget}\n */\n\nvar Component = function () {\n\n /**\n * A callback that is called when a component is ready. Does not have any\n * paramters and any callback value will be ignored.\n *\n * @callback Component~ReadyCallback\n * @this Component\n */\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Object[]} [options.children]\n * An array of children objects to intialize this component with. Children objects have\n * a name property that will be used if more than one component of the same type needs to be\n * added.\n *\n * @param {Component~ReadyCallback} [ready]\n * Function that gets called when the `Component` is ready.\n */\n function Component(player, options, ready) {\n classCallCheck(this, Component);\n\n\n // The component might be the player itself and we can't pass `this` to super\n if (!player && this.play) {\n this.player_ = player = this; // eslint-disable-line\n } else {\n this.player_ = player;\n }\n\n // Make a copy of prototype.options_ to protect against overriding defaults\n this.options_ = mergeOptions({}, this.options_);\n\n // Updated options with supplied options\n options = this.options_ = mergeOptions(this.options_, options);\n\n // Get ID from options or options element if one is supplied\n this.id_ = options.id || options.el && options.el.id;\n\n // If there was no ID from the options, generate one\n if (!this.id_) {\n // Don't require the player ID function in the case of mock players\n var id = player && player.id && player.id() || 'no_player';\n\n this.id_ = id + '_component_' + newGUID();\n }\n\n this.name_ = options.name || null;\n\n // Create element if one wasn't provided in options\n if (options.el) {\n this.el_ = options.el;\n } else if (options.createEl !== false) {\n this.el_ = this.createEl();\n }\n\n // if evented is anything except false, we want to mixin in evented\n if (options.evented !== false) {\n // Make this an evented object and use `el_`, if available, as its event bus\n evented(this, { eventBusKey: this.el_ ? 'el_' : null });\n }\n stateful(this, this.constructor.defaultState);\n\n this.children_ = [];\n this.childIndex_ = {};\n this.childNameIndex_ = {};\n\n // Add any child components in options\n if (options.initChildren !== false) {\n this.initChildren();\n }\n\n this.ready(ready);\n // Don't want to trigger ready here or it will before init is actually\n // finished for all children that run this constructor\n\n if (options.reportTouchActivity !== false) {\n this.enableTouchActivity();\n }\n }\n\n /**\n * Dispose of the `Component` and all child components.\n *\n * @fires Component#dispose\n */\n\n\n Component.prototype.dispose = function dispose() {\n\n /**\n * Triggered when a `Component` is disposed.\n *\n * @event Component#dispose\n * @type {EventTarget~Event}\n *\n * @property {boolean} [bubbles=false]\n * set to false so that the close event does not\n * bubble up\n */\n this.trigger({ type: 'dispose', bubbles: false });\n\n // Dispose all children.\n if (this.children_) {\n for (var i = this.children_.length - 1; i >= 0; i--) {\n if (this.children_[i].dispose) {\n this.children_[i].dispose();\n }\n }\n }\n\n // Delete child references\n this.children_ = null;\n this.childIndex_ = null;\n this.childNameIndex_ = null;\n\n if (this.el_) {\n // Remove element from DOM\n if (this.el_.parentNode) {\n this.el_.parentNode.removeChild(this.el_);\n }\n\n removeData(this.el_);\n this.el_ = null;\n }\n\n // remove reference to the player after disposing of the element\n this.player_ = null;\n };\n\n /**\n * Return the {@link Player} that the `Component` has attached to.\n *\n * @return {Player}\n * The player that this `Component` has attached to.\n */\n\n\n Component.prototype.player = function player() {\n return this.player_;\n };\n\n /**\n * Deep merge of options objects with new options.\n * > Note: When both `obj` and `options` contain properties whose values are objects.\n * The two properties get merged using {@link module:mergeOptions}\n *\n * @param {Object} obj\n * The object that contains new options.\n *\n * @return {Object}\n * A new object of `this.options_` and `obj` merged together.\n *\n * @deprecated since version 5\n */\n\n\n Component.prototype.options = function options(obj) {\n log$1.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n if (!obj) {\n return this.options_;\n }\n\n this.options_ = mergeOptions(this.options_, obj);\n return this.options_;\n };\n\n /**\n * Get the `Component`s DOM element\n *\n * @return {Element}\n * The DOM element for this `Component`.\n */\n\n\n Component.prototype.el = function el() {\n return this.el_;\n };\n\n /**\n * Create the `Component`s DOM element.\n *\n * @param {string} [tagName]\n * Element's DOM node type. e.g. 'div'\n *\n * @param {Object} [properties]\n * An object of properties that should be set.\n *\n * @param {Object} [attributes]\n * An object of attributes that should be set.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n Component.prototype.createEl = function createEl$$1(tagName, properties, attributes) {\n return createEl(tagName, properties, attributes);\n };\n\n /**\n * Localize a string given the string in english.\n *\n * If tokens are provided, it'll try and run a simple token replacement on the provided string.\n * The tokens it looks for look like `{1}` with the index being 1-indexed into the tokens array.\n *\n * If a `defaultValue` is provided, it'll use that over `string`,\n * if a value isn't found in provided language files.\n * This is useful if you want to have a descriptive key for token replacement\n * but have a succinct localized string and not require `en.json` to be included.\n *\n * Currently, it is used for the progress bar timing.\n * ```js\n * {\n * \"progress bar timing: currentTime={1} duration={2}\": \"{1} of {2}\"\n * }\n * ```\n * It is then used like so:\n * ```js\n * this.localize('progress bar timing: currentTime={1} duration{2}',\n * [this.player_.currentTime(), this.player_.duration()],\n * '{1} of {2}');\n * ```\n *\n * Which outputs something like: `01:23 of 24:56`.\n *\n *\n * @param {string} string\n * The string to localize and the key to lookup in the language files.\n * @param {string[]} [tokens]\n * If the current item has token replacements, provide the tokens here.\n * @param {string} [defaultValue]\n * Defaults to `string`. Can be a default value to use for token replacement\n * if the lookup key is needed to be separate.\n *\n * @return {string}\n * The localized string or if no localization exists the english string.\n */\n\n\n Component.prototype.localize = function localize(string, tokens) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : string;\n\n var code = this.player_.language && this.player_.language();\n var languages = this.player_.languages && this.player_.languages();\n var language = languages && languages[code];\n var primaryCode = code && code.split('-')[0];\n var primaryLang = languages && languages[primaryCode];\n\n var localizedString = defaultValue;\n\n if (language && language[string]) {\n localizedString = language[string];\n } else if (primaryLang && primaryLang[string]) {\n localizedString = primaryLang[string];\n }\n\n if (tokens) {\n localizedString = localizedString.replace(/\\{(\\d+)\\}/g, function (match, index) {\n var value = tokens[index - 1];\n var ret = value;\n\n if (typeof value === 'undefined') {\n ret = match;\n }\n\n return ret;\n });\n }\n\n return localizedString;\n };\n\n /**\n * Return the `Component`s DOM element. This is where children get inserted.\n * This will usually be the the same as the element returned in {@link Component#el}.\n *\n * @return {Element}\n * The content element for this `Component`.\n */\n\n\n Component.prototype.contentEl = function contentEl() {\n return this.contentEl_ || this.el_;\n };\n\n /**\n * Get this `Component`s ID\n *\n * @return {string}\n * The id of this `Component`\n */\n\n\n Component.prototype.id = function id() {\n return this.id_;\n };\n\n /**\n * Get the `Component`s name. The name gets used to reference the `Component`\n * and is set during registration.\n *\n * @return {string}\n * The name of this `Component`.\n */\n\n\n Component.prototype.name = function name() {\n return this.name_;\n };\n\n /**\n * Get an array of all child components\n *\n * @return {Array}\n * The children\n */\n\n\n Component.prototype.children = function children() {\n return this.children_;\n };\n\n /**\n * Returns the child `Component` with the given `id`.\n *\n * @param {string} id\n * The id of the child `Component` to get.\n *\n * @return {Component|undefined}\n * The child `Component` with the given `id` or undefined.\n */\n\n\n Component.prototype.getChildById = function getChildById(id) {\n return this.childIndex_[id];\n };\n\n /**\n * Returns the child `Component` with the given `name`.\n *\n * @param {string} name\n * The name of the child `Component` to get.\n *\n * @return {Component|undefined}\n * The child `Component` with the given `name` or undefined.\n */\n\n\n Component.prototype.getChild = function getChild(name) {\n if (!name) {\n return;\n }\n\n name = toTitleCase(name);\n\n return this.childNameIndex_[name];\n };\n\n /**\n * Add a child `Component` inside the current `Component`.\n *\n *\n * @param {string|Component} child\n * The name or instance of a child to add.\n *\n * @param {Object} [options={}]\n * The key/value store of options that will get passed to children of\n * the child.\n *\n * @param {number} [index=this.children_.length]\n * The index to attempt to add a child into.\n *\n * @return {Component}\n * The `Component` that gets added as a child. When using a string the\n * `Component` will get created by this process.\n */\n\n\n Component.prototype.addChild = function addChild(child) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.children_.length;\n\n var component = void 0;\n var componentName = void 0;\n\n // If child is a string, create component with options\n if (typeof child === 'string') {\n componentName = toTitleCase(child);\n\n var componentClassName = options.componentClass || componentName;\n\n // Set name through options\n options.name = componentName;\n\n // Create a new object & element for this controls set\n // If there's no .player_, this is a player\n var ComponentClass = Component.getComponent(componentClassName);\n\n if (!ComponentClass) {\n throw new Error('Component ' + componentClassName + ' does not exist');\n }\n\n // data stored directly on the videojs object may be\n // misidentified as a component to retain\n // backwards-compatibility with 4.x. check to make sure the\n // component class can be instantiated.\n if (typeof ComponentClass !== 'function') {\n return null;\n }\n\n component = new ComponentClass(this.player_ || this, options);\n\n // child is a component instance\n } else {\n component = child;\n }\n\n this.children_.splice(index, 0, component);\n\n if (typeof component.id === 'function') {\n this.childIndex_[component.id()] = component;\n }\n\n // If a name wasn't used to create the component, check if we can use the\n // name function of the component\n componentName = componentName || component.name && toTitleCase(component.name());\n\n if (componentName) {\n this.childNameIndex_[componentName] = component;\n }\n\n // Add the UI object's element to the container div (box)\n // Having an element is not required\n if (typeof component.el === 'function' && component.el()) {\n var childNodes = this.contentEl().children;\n var refNode = childNodes[index] || null;\n\n this.contentEl().insertBefore(component.el(), refNode);\n }\n\n // Return so it can stored on parent object if desired.\n return component;\n };\n\n /**\n * Remove a child `Component` from this `Component`s list of children. Also removes\n * the child `Component`s element from this `Component`s element.\n *\n * @param {Component} component\n * The child `Component` to remove.\n */\n\n\n Component.prototype.removeChild = function removeChild(component) {\n if (typeof component === 'string') {\n component = this.getChild(component);\n }\n\n if (!component || !this.children_) {\n return;\n }\n\n var childFound = false;\n\n for (var i = this.children_.length - 1; i >= 0; i--) {\n if (this.children_[i] === component) {\n childFound = true;\n this.children_.splice(i, 1);\n break;\n }\n }\n\n if (!childFound) {\n return;\n }\n\n this.childIndex_[component.id()] = null;\n this.childNameIndex_[component.name()] = null;\n\n var compEl = component.el();\n\n if (compEl && compEl.parentNode === this.contentEl()) {\n this.contentEl().removeChild(component.el());\n }\n };\n\n /**\n * Add and initialize default child `Component`s based upon options.\n */\n\n\n Component.prototype.initChildren = function initChildren() {\n var _this = this;\n\n var children = this.options_.children;\n\n if (children) {\n // `this` is `parent`\n var parentOptions = this.options_;\n\n var handleAdd = function handleAdd(child) {\n var name = child.name;\n var opts = child.opts;\n\n // Allow options for children to be set at the parent options\n // e.g. videojs(id, { controlBar: false });\n // instead of videojs(id, { children: { controlBar: false });\n if (parentOptions[name] !== undefined) {\n opts = parentOptions[name];\n }\n\n // Allow for disabling default components\n // e.g. options['children']['posterImage'] = false\n if (opts === false) {\n return;\n }\n\n // Allow options to be passed as a simple boolean if no configuration\n // is necessary.\n if (opts === true) {\n opts = {};\n }\n\n // We also want to pass the original player options\n // to each component as well so they don't need to\n // reach back into the player for options later.\n opts.playerOptions = _this.options_.playerOptions;\n\n // Create and add the child component.\n // Add a direct reference to the child by name on the parent instance.\n // If two of the same component are used, different names should be supplied\n // for each\n var newChild = _this.addChild(name, opts);\n\n if (newChild) {\n _this[name] = newChild;\n }\n };\n\n // Allow for an array of children details to passed in the options\n var workingChildren = void 0;\n var Tech = Component.getComponent('Tech');\n\n if (Array.isArray(children)) {\n workingChildren = children;\n } else {\n workingChildren = Object.keys(children);\n }\n\n workingChildren\n // children that are in this.options_ but also in workingChildren would\n // give us extra children we do not want. So, we want to filter them out.\n .concat(Object.keys(this.options_).filter(function (child) {\n return !workingChildren.some(function (wchild) {\n if (typeof wchild === 'string') {\n return child === wchild;\n }\n return child === wchild.name;\n });\n })).map(function (child) {\n var name = void 0;\n var opts = void 0;\n\n if (typeof child === 'string') {\n name = child;\n opts = children[name] || _this.options_[name] || {};\n } else {\n name = child.name;\n opts = child;\n }\n\n return { name: name, opts: opts };\n }).filter(function (child) {\n // we have to make sure that child.name isn't in the techOrder since\n // techs are registerd as Components but can't aren't compatible\n // See https://github.com/videojs/video.js/issues/2772\n var c = Component.getComponent(child.opts.componentClass || toTitleCase(child.name));\n\n return c && !Tech.isTech(c);\n }).forEach(handleAdd);\n }\n };\n\n /**\n * Builds the default DOM class name. Should be overriden by sub-components.\n *\n * @return {string}\n * The DOM class name for this object.\n *\n * @abstract\n */\n\n\n Component.prototype.buildCSSClass = function buildCSSClass() {\n // Child classes can include a function that does:\n // return 'CLASS NAME' + this._super();\n return '';\n };\n\n /**\n * Bind a listener to the component's ready state.\n * Different from event listeners in that if the ready event has already happened\n * it will trigger the function immediately.\n *\n * @return {Component}\n * Returns itself; method can be chained.\n */\n\n\n Component.prototype.ready = function ready(fn) {\n var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!fn) {\n return;\n }\n\n if (!this.isReady_) {\n this.readyQueue_ = this.readyQueue_ || [];\n this.readyQueue_.push(fn);\n return;\n }\n\n if (sync) {\n fn.call(this);\n } else {\n // Call the function asynchronously by default for consistency\n this.setTimeout(fn, 1);\n }\n };\n\n /**\n * Trigger all the ready listeners for this `Component`.\n *\n * @fires Component#ready\n */\n\n\n Component.prototype.triggerReady = function triggerReady() {\n this.isReady_ = true;\n\n // Ensure ready is triggered asynchronously\n this.setTimeout(function () {\n var readyQueue = this.readyQueue_;\n\n // Reset Ready Queue\n this.readyQueue_ = [];\n\n if (readyQueue && readyQueue.length > 0) {\n readyQueue.forEach(function (fn) {\n fn.call(this);\n }, this);\n }\n\n // Allow for using event listeners also\n /**\n * Triggered when a `Component` is ready.\n *\n * @event Component#ready\n * @type {EventTarget~Event}\n */\n this.trigger('ready');\n }, 1);\n };\n\n /**\n * Find a single DOM element matching a `selector`. This can be within the `Component`s\n * `contentEl()` or another custom context.\n *\n * @param {string} selector\n * A valid CSS selector, which will be passed to `querySelector`.\n *\n * @param {Element|string} [context=this.contentEl()]\n * A DOM element within which to query. Can also be a selector string in\n * which case the first matching element will get used as context. If\n * missing `this.contentEl()` gets used. If `this.contentEl()` returns\n * nothing it falls back to `document`.\n *\n * @return {Element|null}\n * the dom element that was found, or null\n *\n * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n */\n\n\n Component.prototype.$ = function $$$1(selector, context) {\n return $(selector, context || this.contentEl());\n };\n\n /**\n * Finds all DOM element matching a `selector`. This can be within the `Component`s\n * `contentEl()` or another custom context.\n *\n * @param {string} selector\n * A valid CSS selector, which will be passed to `querySelectorAll`.\n *\n * @param {Element|string} [context=this.contentEl()]\n * A DOM element within which to query. Can also be a selector string in\n * which case the first matching element will get used as context. If\n * missing `this.contentEl()` gets used. If `this.contentEl()` returns\n * nothing it falls back to `document`.\n *\n * @return {NodeList}\n * a list of dom elements that were found\n *\n * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n */\n\n\n Component.prototype.$$ = function $$$$1(selector, context) {\n return $$(selector, context || this.contentEl());\n };\n\n /**\n * Check if a component's element has a CSS class name.\n *\n * @param {string} classToCheck\n * CSS class name to check.\n *\n * @return {boolean}\n * - True if the `Component` has the class.\n * - False if the `Component` does not have the class`\n */\n\n\n Component.prototype.hasClass = function hasClass$$1(classToCheck) {\n return hasClass(this.el_, classToCheck);\n };\n\n /**\n * Add a CSS class name to the `Component`s element.\n *\n * @param {string} classToAdd\n * CSS class name to add\n */\n\n\n Component.prototype.addClass = function addClass$$1(classToAdd) {\n addClass(this.el_, classToAdd);\n };\n\n /**\n * Remove a CSS class name from the `Component`s element.\n *\n * @param {string} classToRemove\n * CSS class name to remove\n */\n\n\n Component.prototype.removeClass = function removeClass$$1(classToRemove) {\n removeClass(this.el_, classToRemove);\n };\n\n /**\n * Add or remove a CSS class name from the component's element.\n * - `classToToggle` gets added when {@link Component#hasClass} would return false.\n * - `classToToggle` gets removed when {@link Component#hasClass} would return true.\n *\n * @param {string} classToToggle\n * The class to add or remove based on (@link Component#hasClass}\n *\n * @param {boolean|Dom~predicate} [predicate]\n * An {@link Dom~predicate} function or a boolean\n */\n\n\n Component.prototype.toggleClass = function toggleClass$$1(classToToggle, predicate) {\n toggleClass(this.el_, classToToggle, predicate);\n };\n\n /**\n * Show the `Component`s element if it is hidden by removing the\n * 'vjs-hidden' class name from it.\n */\n\n\n Component.prototype.show = function show() {\n this.removeClass('vjs-hidden');\n };\n\n /**\n * Hide the `Component`s element if it is currently showing by adding the\n * 'vjs-hidden` class name to it.\n */\n\n\n Component.prototype.hide = function hide() {\n this.addClass('vjs-hidden');\n };\n\n /**\n * Lock a `Component`s element in its visible state by adding the 'vjs-lock-showing'\n * class name to it. Used during fadeIn/fadeOut.\n *\n * @private\n */\n\n\n Component.prototype.lockShowing = function lockShowing() {\n this.addClass('vjs-lock-showing');\n };\n\n /**\n * Unlock a `Component`s element from its visible state by removing the 'vjs-lock-showing'\n * class name from it. Used during fadeIn/fadeOut.\n *\n * @private\n */\n\n\n Component.prototype.unlockShowing = function unlockShowing() {\n this.removeClass('vjs-lock-showing');\n };\n\n /**\n * Get the value of an attribute on the `Component`s element.\n *\n * @param {string} attribute\n * Name of the attribute to get the value from.\n *\n * @return {string|null}\n * - The value of the attribute that was asked for.\n * - Can be an empty string on some browsers if the attribute does not exist\n * or has no value\n * - Most browsers will return null if the attibute does not exist or has\n * no value.\n *\n * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute}\n */\n\n\n Component.prototype.getAttribute = function getAttribute$$1(attribute) {\n return getAttribute(this.el_, attribute);\n };\n\n /**\n * Set the value of an attribute on the `Component`'s element\n *\n * @param {string} attribute\n * Name of the attribute to set.\n *\n * @param {string} value\n * Value to set the attribute to.\n *\n * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute}\n */\n\n\n Component.prototype.setAttribute = function setAttribute$$1(attribute, value) {\n setAttribute(this.el_, attribute, value);\n };\n\n /**\n * Remove an attribute from the `Component`s element.\n *\n * @param {string} attribute\n * Name of the attribute to remove.\n *\n * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute}\n */\n\n\n Component.prototype.removeAttribute = function removeAttribute$$1(attribute) {\n removeAttribute(this.el_, attribute);\n };\n\n /**\n * Get or set the width of the component based upon the CSS styles.\n * See {@link Component#dimension} for more detailed information.\n *\n * @param {number|string} [num]\n * The width that you want to set postfixed with '%', 'px' or nothing.\n *\n * @param {boolean} [skipListeners]\n * Skip the componentresize event trigger\n *\n * @return {number|string}\n * The width when getting, zero if there is no width. Can be a string\n * postpixed with '%' or 'px'.\n */\n\n\n Component.prototype.width = function width(num, skipListeners) {\n return this.dimension('width', num, skipListeners);\n };\n\n /**\n * Get or set the height of the component based upon the CSS styles.\n * See {@link Component#dimension} for more detailed information.\n *\n * @param {number|string} [num]\n * The height that you want to set postfixed with '%', 'px' or nothing.\n *\n * @param {boolean} [skipListeners]\n * Skip the componentresize event trigger\n *\n * @return {number|string}\n * The width when getting, zero if there is no width. Can be a string\n * postpixed with '%' or 'px'.\n */\n\n\n Component.prototype.height = function height(num, skipListeners) {\n return this.dimension('height', num, skipListeners);\n };\n\n /**\n * Set both the width and height of the `Component` element at the same time.\n *\n * @param {number|string} width\n * Width to set the `Component`s element to.\n *\n * @param {number|string} height\n * Height to set the `Component`s element to.\n */\n\n\n Component.prototype.dimensions = function dimensions(width, height) {\n // Skip componentresize listeners on width for optimization\n this.width(width, true);\n this.height(height);\n };\n\n /**\n * Get or set width or height of the `Component` element. This is the shared code\n * for the {@link Component#width} and {@link Component#height}.\n *\n * Things to know:\n * - If the width or height in an number this will return the number postfixed with 'px'.\n * - If the width/height is a percent this will return the percent postfixed with '%'\n * - Hidden elements have a width of 0 with `window.getComputedStyle`. This function\n * defaults to the `Component`s `style.width` and falls back to `window.getComputedStyle`.\n * See [this]{@link http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/}\n * for more information\n * - If you want the computed style of the component, use {@link Component#currentWidth}\n * and {@link {Component#currentHeight}\n *\n * @fires Component#componentresize\n *\n * @param {string} widthOrHeight\n 8 'width' or 'height'\n *\n * @param {number|string} [num]\n 8 New dimension\n *\n * @param {boolean} [skipListeners]\n * Skip componentresize event trigger\n *\n * @return {number}\n * The dimension when getting or 0 if unset\n */\n\n\n Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {\n if (num !== undefined) {\n // Set to zero if null or literally NaN (NaN !== NaN)\n if (num === null || num !== num) {\n num = 0;\n }\n\n // Check if using css width/height (% or px) and adjust\n if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n this.el_.style[widthOrHeight] = num;\n } else if (num === 'auto') {\n this.el_.style[widthOrHeight] = '';\n } else {\n this.el_.style[widthOrHeight] = num + 'px';\n }\n\n // skipListeners allows us to avoid triggering the resize event when setting both width and height\n if (!skipListeners) {\n /**\n * Triggered when a component is resized.\n *\n * @event Component#componentresize\n * @type {EventTarget~Event}\n */\n this.trigger('componentresize');\n }\n\n return;\n }\n\n // Not setting a value, so getting it\n // Make sure element exists\n if (!this.el_) {\n return 0;\n }\n\n // Get dimension value from style\n var val = this.el_.style[widthOrHeight];\n var pxIndex = val.indexOf('px');\n\n if (pxIndex !== -1) {\n // Return the pixel value with no 'px'\n return parseInt(val.slice(0, pxIndex), 10);\n }\n\n // No px so using % or no style was set, so falling back to offsetWidth/height\n // If component has display:none, offset will return 0\n // TODO: handle display:none and no dimension style using px\n return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n };\n\n /**\n * Get the width or the height of the `Component` elements computed style. Uses\n * `window.getComputedStyle`.\n *\n * @param {string} widthOrHeight\n * A string containing 'width' or 'height'. Whichever one you want to get.\n *\n * @return {number}\n * The dimension that gets asked for or 0 if nothing was set\n * for that dimension.\n */\n\n\n Component.prototype.currentDimension = function currentDimension(widthOrHeight) {\n var computedWidthOrHeight = 0;\n\n if (widthOrHeight !== 'width' && widthOrHeight !== 'height') {\n throw new Error('currentDimension only accepts width or height value');\n }\n\n if (typeof window.getComputedStyle === 'function') {\n var computedStyle = window.getComputedStyle(this.el_);\n\n computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight];\n }\n\n // remove 'px' from variable and parse as integer\n computedWidthOrHeight = parseFloat(computedWidthOrHeight);\n\n // if the computed value is still 0, it's possible that the browser is lying\n // and we want to check the offset values.\n // This code also runs on IE8 and wherever getComputedStyle doesn't exist.\n if (computedWidthOrHeight === 0) {\n var rule = 'offset' + toTitleCase(widthOrHeight);\n\n computedWidthOrHeight = this.el_[rule];\n }\n\n return computedWidthOrHeight;\n };\n\n /**\n * An object that contains width and height values of the `Component`s\n * computed style. Uses `window.getComputedStyle`.\n *\n * @typedef {Object} Component~DimensionObject\n *\n * @property {number} width\n * The width of the `Component`s computed style.\n *\n * @property {number} height\n * The height of the `Component`s computed style.\n */\n\n /**\n * Get an object that contains width and height values of the `Component`s\n * computed style.\n *\n * @return {Component~DimensionObject}\n * The dimensions of the components element\n */\n\n\n Component.prototype.currentDimensions = function currentDimensions() {\n return {\n width: this.currentDimension('width'),\n height: this.currentDimension('height')\n };\n };\n\n /**\n * Get the width of the `Component`s computed style. Uses `window.getComputedStyle`.\n *\n * @return {number} width\n * The width of the `Component`s computed style.\n */\n\n\n Component.prototype.currentWidth = function currentWidth() {\n return this.currentDimension('width');\n };\n\n /**\n * Get the height of the `Component`s computed style. Uses `window.getComputedStyle`.\n *\n * @return {number} height\n * The height of the `Component`s computed style.\n */\n\n\n Component.prototype.currentHeight = function currentHeight() {\n return this.currentDimension('height');\n };\n\n /**\n * Set the focus to this component\n */\n\n\n Component.prototype.focus = function focus() {\n this.el_.focus();\n };\n\n /**\n * Remove the focus from this component\n */\n\n\n Component.prototype.blur = function blur() {\n this.el_.blur();\n };\n\n /**\n * Emit a 'tap' events when touch event support gets detected. This gets used to\n * support toggling the controls through a tap on the video. They get enabled\n * because every sub-component would have extra overhead otherwise.\n *\n * @private\n * @fires Component#tap\n * @listens Component#touchstart\n * @listens Component#touchmove\n * @listens Component#touchleave\n * @listens Component#touchcancel\n * @listens Component#touchend\n */\n\n\n Component.prototype.emitTapEvents = function emitTapEvents() {\n // Track the start time so we can determine how long the touch lasted\n var touchStart = 0;\n var firstTouch = null;\n\n // Maximum movement allowed during a touch event to still be considered a tap\n // Other popular libs use anywhere from 2 (hammer.js) to 15,\n // so 10 seems like a nice, round number.\n var tapMovementThreshold = 10;\n\n // The maximum length a touch can be while still being considered a tap\n var touchTimeThreshold = 200;\n\n var couldBeTap = void 0;\n\n this.on('touchstart', function (event) {\n // If more than one finger, don't consider treating this as a click\n if (event.touches.length === 1) {\n // Copy pageX/pageY from the object\n firstTouch = {\n pageX: event.touches[0].pageX,\n pageY: event.touches[0].pageY\n };\n // Record start time so we can detect a tap vs. \"touch and hold\"\n touchStart = new Date().getTime();\n // Reset couldBeTap tracking\n couldBeTap = true;\n }\n });\n\n this.on('touchmove', function (event) {\n // If more than one finger, don't consider treating this as a click\n if (event.touches.length > 1) {\n couldBeTap = false;\n } else if (firstTouch) {\n // Some devices will throw touchmoves for all but the slightest of taps.\n // So, if we moved only a small distance, this could still be a tap\n var xdiff = event.touches[0].pageX - firstTouch.pageX;\n var ydiff = event.touches[0].pageY - firstTouch.pageY;\n var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n\n if (touchDistance > tapMovementThreshold) {\n couldBeTap = false;\n }\n }\n });\n\n var noTap = function noTap() {\n couldBeTap = false;\n };\n\n // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n this.on('touchleave', noTap);\n this.on('touchcancel', noTap);\n\n // When the touch ends, measure how long it took and trigger the appropriate\n // event\n this.on('touchend', function (event) {\n firstTouch = null;\n // Proceed only if the touchmove/leave/cancel event didn't happen\n if (couldBeTap === true) {\n // Measure how long the touch lasted\n var touchTime = new Date().getTime() - touchStart;\n\n // Make sure the touch was less than the threshold to be considered a tap\n if (touchTime < touchTimeThreshold) {\n // Don't let browser turn this into a click\n event.preventDefault();\n /**\n * Triggered when a `Component` is tapped.\n *\n * @event Component#tap\n * @type {EventTarget~Event}\n */\n this.trigger('tap');\n // It may be good to copy the touchend event object and change the\n // type to tap, if the other event properties aren't exact after\n // Events.fixEvent runs (e.g. event.target)\n }\n }\n });\n };\n\n /**\n * This function reports user activity whenever touch events happen. This can get\n * turned off by any sub-components that wants touch events to act another way.\n *\n * Report user touch activity when touch events occur. User activity gets used to\n * determine when controls should show/hide. It is simple when it comes to mouse\n * events, because any mouse event should show the controls. So we capture mouse\n * events that bubble up to the player and report activity when that happens.\n * With touch events it isn't as easy as `touchstart` and `touchend` toggle player\n * controls. So touch events can't help us at the player level either.\n *\n * User activity gets checked asynchronously. So what could happen is a tap event\n * on the video turns the controls off. Then the `touchend` event bubbles up to\n * the player. Which, if it reported user activity, would turn the controls right\n * back on. We also don't want to completely block touch events from bubbling up.\n * Furthermore a `touchmove` event and anything other than a tap, should not turn\n * controls back on.\n *\n * @listens Component#touchstart\n * @listens Component#touchmove\n * @listens Component#touchend\n * @listens Component#touchcancel\n */\n\n\n Component.prototype.enableTouchActivity = function enableTouchActivity() {\n // Don't continue if the root player doesn't support reporting user activity\n if (!this.player() || !this.player().reportUserActivity) {\n return;\n }\n\n // listener for reporting that the user is active\n var report = bind(this.player(), this.player().reportUserActivity);\n\n var touchHolding = void 0;\n\n this.on('touchstart', function () {\n report();\n // For as long as the they are touching the device or have their mouse down,\n // we consider them active even if they're not moving their finger or mouse.\n // So we want to continue to update that they are active\n this.clearInterval(touchHolding);\n // report at the same interval as activityCheck\n touchHolding = this.setInterval(report, 250);\n });\n\n var touchEnd = function touchEnd(event) {\n report();\n // stop the interval that maintains activity if the touch is holding\n this.clearInterval(touchHolding);\n };\n\n this.on('touchmove', report);\n this.on('touchend', touchEnd);\n this.on('touchcancel', touchEnd);\n };\n\n /**\n * A callback that has no parameters and is bound into `Component`s context.\n *\n * @callback Component~GenericCallback\n * @this Component\n */\n\n /**\n * Creates a function that runs after an `x` millisecond timeout. This function is a\n * wrapper around `window.setTimeout`. There are a few reasons to use this one\n * instead though:\n * 1. It gets cleared via {@link Component#clearTimeout} when\n * {@link Component#dispose} gets called.\n * 2. The function callback will gets turned into a {@link Component~GenericCallback}\n *\n * > Note: You can't use `window.clearTimeout` on the id returned by this function. This\n * will cause its dispose listener not to get cleaned up! Please use\n * {@link Component#clearTimeout} or {@link Component#dispose} instead.\n *\n * @param {Component~GenericCallback} fn\n * The function that will be run after `timeout`.\n *\n * @param {number} timeout\n * Timeout in milliseconds to delay before executing the specified function.\n *\n * @return {number}\n * Returns a timeout ID that gets used to identify the timeout. It can also\n * get used in {@link Component#clearTimeout} to clear the timeout that\n * was set.\n *\n * @listens Component#dispose\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout}\n */\n\n\n Component.prototype.setTimeout = function setTimeout(fn, timeout) {\n var _this2 = this;\n\n // declare as variables so they are properly available in timeout function\n // eslint-disable-next-line\n var timeoutId, disposeFn;\n\n fn = bind(this, fn);\n\n timeoutId = window.setTimeout(function () {\n _this2.off('dispose', disposeFn);\n fn();\n }, timeout);\n\n disposeFn = function disposeFn() {\n return _this2.clearTimeout(timeoutId);\n };\n\n disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n this.on('dispose', disposeFn);\n\n return timeoutId;\n };\n\n /**\n * Clears a timeout that gets created via `window.setTimeout` or\n * {@link Component#setTimeout}. If you set a timeout via {@link Component#setTimeout}\n * use this function instead of `window.clearTimout`. If you don't your dispose\n * listener will not get cleaned up until {@link Component#dispose}!\n *\n * @param {number} timeoutId\n * The id of the timeout to clear. The return value of\n * {@link Component#setTimeout} or `window.setTimeout`.\n *\n * @return {number}\n * Returns the timeout id that was cleared.\n *\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout}\n */\n\n\n Component.prototype.clearTimeout = function clearTimeout(timeoutId) {\n window.clearTimeout(timeoutId);\n\n var disposeFn = function disposeFn() {};\n\n disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n this.off('dispose', disposeFn);\n\n return timeoutId;\n };\n\n /**\n * Creates a function that gets run every `x` milliseconds. This function is a wrapper\n * around `window.setInterval`. There are a few reasons to use this one instead though.\n * 1. It gets cleared via {@link Component#clearInterval} when\n * {@link Component#dispose} gets called.\n * 2. The function callback will be a {@link Component~GenericCallback}\n *\n * @param {Component~GenericCallback} fn\n * The function to run every `x` seconds.\n *\n * @param {number} interval\n * Execute the specified function every `x` milliseconds.\n *\n * @return {number}\n * Returns an id that can be used to identify the interval. It can also be be used in\n * {@link Component#clearInterval} to clear the interval.\n *\n * @listens Component#dispose\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval}\n */\n\n\n Component.prototype.setInterval = function setInterval(fn, interval) {\n var _this3 = this;\n\n fn = bind(this, fn);\n\n var intervalId = window.setInterval(fn, interval);\n\n var disposeFn = function disposeFn() {\n return _this3.clearInterval(intervalId);\n };\n\n disposeFn.guid = 'vjs-interval-' + intervalId;\n\n this.on('dispose', disposeFn);\n\n return intervalId;\n };\n\n /**\n * Clears an interval that gets created via `window.setInterval` or\n * {@link Component#setInterval}. If you set an inteval via {@link Component#setInterval}\n * use this function instead of `window.clearInterval`. If you don't your dispose\n * listener will not get cleaned up until {@link Component#dispose}!\n *\n * @param {number} intervalId\n * The id of the interval to clear. The return value of\n * {@link Component#setInterval} or `window.setInterval`.\n *\n * @return {number}\n * Returns the interval id that was cleared.\n *\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval}\n */\n\n\n Component.prototype.clearInterval = function clearInterval(intervalId) {\n window.clearInterval(intervalId);\n\n var disposeFn = function disposeFn() {};\n\n disposeFn.guid = 'vjs-interval-' + intervalId;\n\n this.off('dispose', disposeFn);\n\n return intervalId;\n };\n\n /**\n * Queues up a callback to be passed to requestAnimationFrame (rAF), but\n * with a few extra bonuses:\n *\n * - Supports browsers that do not support rAF by falling back to\n * {@link Component#setTimeout}.\n *\n * - The callback is turned into a {@link Component~GenericCallback} (i.e.\n * bound to the component).\n *\n * - Automatic cancellation of the rAF callback is handled if the component\n * is disposed before it is called.\n *\n * @param {Component~GenericCallback} fn\n * A function that will be bound to this component and executed just\n * before the browser's next repaint.\n *\n * @return {number}\n * Returns an rAF ID that gets used to identify the timeout. It can\n * also be used in {@link Component#cancelAnimationFrame} to cancel\n * the animation frame callback.\n *\n * @listens Component#dispose\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame}\n */\n\n\n Component.prototype.requestAnimationFrame = function requestAnimationFrame(fn) {\n var _this4 = this;\n\n // declare as variables so they are properly available in rAF function\n // eslint-disable-next-line\n var id, disposeFn;\n\n if (this.supportsRaf_) {\n fn = bind(this, fn);\n\n id = window.requestAnimationFrame(function () {\n _this4.off('dispose', disposeFn);\n fn();\n });\n\n disposeFn = function disposeFn() {\n return _this4.cancelAnimationFrame(id);\n };\n\n disposeFn.guid = 'vjs-raf-' + id;\n this.on('dispose', disposeFn);\n\n return id;\n }\n\n // Fall back to using a timer.\n return this.setTimeout(fn, 1000 / 60);\n };\n\n /**\n * Cancels a queued callback passed to {@link Component#requestAnimationFrame}\n * (rAF).\n *\n * If you queue an rAF callback via {@link Component#requestAnimationFrame},\n * use this function instead of `window.cancelAnimationFrame`. If you don't,\n * your dispose listener will not get cleaned up until {@link Component#dispose}!\n *\n * @param {number} id\n * The rAF ID to clear. The return value of {@link Component#requestAnimationFrame}.\n *\n * @return {number}\n * Returns the rAF ID that was cleared.\n *\n * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/cancelAnimationFrame}\n */\n\n\n Component.prototype.cancelAnimationFrame = function cancelAnimationFrame(id) {\n if (this.supportsRaf_) {\n window.cancelAnimationFrame(id);\n\n var disposeFn = function disposeFn() {};\n\n disposeFn.guid = 'vjs-raf-' + id;\n\n this.off('dispose', disposeFn);\n\n return id;\n }\n\n // Fall back to using a timer.\n return this.clearTimeout(id);\n };\n\n /**\n * Register a `Component` with `videojs` given the name and the component.\n *\n * > NOTE: {@link Tech}s should not be registered as a `Component`. {@link Tech}s\n * should be registered using {@link Tech.registerTech} or\n * {@link videojs:videojs.registerTech}.\n *\n * > NOTE: This function can also be seen on videojs as\n * {@link videojs:videojs.registerComponent}.\n *\n * @param {string} name\n * The name of the `Component` to register.\n *\n * @param {Component} ComponentToRegister\n * The `Component` class to register.\n *\n * @return {Component}\n * The `Component` that was registered.\n */\n\n\n Component.registerComponent = function registerComponent(name, ComponentToRegister) {\n if (typeof name !== 'string' || !name) {\n throw new Error('Illegal component name, \"' + name + '\"; must be a non-empty string.');\n }\n\n var Tech = Component.getComponent('Tech');\n\n // We need to make sure this check is only done if Tech has been registered.\n var isTech = Tech && Tech.isTech(ComponentToRegister);\n var isComp = Component === ComponentToRegister || Component.prototype.isPrototypeOf(ComponentToRegister.prototype);\n\n if (isTech || !isComp) {\n var reason = void 0;\n\n if (isTech) {\n reason = 'techs must be registered using Tech.registerTech()';\n } else {\n reason = 'must be a Component subclass';\n }\n\n throw new Error('Illegal component, \"' + name + '\"; ' + reason + '.');\n }\n\n name = toTitleCase(name);\n\n if (!Component.components_) {\n Component.components_ = {};\n }\n\n var Player = Component.getComponent('Player');\n\n if (name === 'Player' && Player && Player.players) {\n var players = Player.players;\n var playerNames = Object.keys(players);\n\n // If we have players that were disposed, then their name will still be\n // in Players.players. So, we must loop through and verify that the value\n // for each item is not null. This allows registration of the Player component\n // after all players have been disposed or before any were created.\n if (players && playerNames.length > 0 && playerNames.map(function (pname) {\n return players[pname];\n }).every(Boolean)) {\n throw new Error('Can not register Player component after player has been created.');\n }\n }\n\n Component.components_[name] = ComponentToRegister;\n\n return ComponentToRegister;\n };\n\n /**\n * Get a `Component` based on the name it was registered with.\n *\n * @param {string} name\n * The Name of the component to get.\n *\n * @return {Component}\n * The `Component` that got registered under the given name.\n *\n * @deprecated In `videojs` 6 this will not return `Component`s that were not\n * registered using {@link Component.registerComponent}. Currently we\n * check the global `videojs` object for a `Component` name and\n * return that if it exists.\n */\n\n\n Component.getComponent = function getComponent(name) {\n if (!name) {\n return;\n }\n\n name = toTitleCase(name);\n\n if (Component.components_ && Component.components_[name]) {\n return Component.components_[name];\n }\n };\n\n return Component;\n}();\n\n/**\n * Whether or not this component supports `requestAnimationFrame`.\n *\n * This is exposed primarily for testing purposes.\n *\n * @private\n * @type {Boolean}\n */\n\n\nComponent.prototype.supportsRaf_ = typeof window.requestAnimationFrame === 'function' && typeof window.cancelAnimationFrame === 'function';\n\nComponent.registerComponent('Component', Component);\n\n/**\n * @file time-ranges.js\n * @module time-ranges\n */\n\n/**\n * Returns the time for the specified index at the start or end\n * of a TimeRange object.\n *\n * @function time-ranges:indexFunction\n *\n * @param {number} [index=0]\n * The range number to return the time for.\n *\n * @return {number}\n * The time that offset at the specified index.\n *\n * @depricated index must be set to a value, in the future this will throw an error.\n */\n\n/**\n * An object that contains ranges of time for various reasons.\n *\n * @typedef {Object} TimeRange\n *\n * @property {number} length\n * The number of time ranges represented by this Object\n *\n * @property {time-ranges:indexFunction} start\n * Returns the time offset at which a specified time range begins.\n *\n * @property {time-ranges:indexFunction} end\n * Returns the time offset at which a specified time range ends.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges\n */\n\n/**\n * Check if any of the time ranges are over the maximum index.\n *\n * @param {string} fnName\n * The function name to use for logging\n *\n * @param {number} index\n * The index to check\n *\n * @param {number} maxIndex\n * The maximum possible index\n *\n * @throws {Error} if the timeRanges provided are over the maxIndex\n */\nfunction rangeCheck(fnName, index, maxIndex) {\n if (typeof index !== 'number' || index < 0 || index > maxIndex) {\n throw new Error('Failed to execute \\'' + fnName + '\\' on \\'TimeRanges\\': The index provided (' + index + ') is non-numeric or out of bounds (0-' + maxIndex + ').');\n }\n}\n\n/**\n * Get the time for the specified index at the start or end\n * of a TimeRange object.\n *\n * @param {string} fnName\n * The function name to use for logging\n *\n * @param {string} valueIndex\n * The proprety that should be used to get the time. should be 'start' or 'end'\n *\n * @param {Array} ranges\n * An array of time ranges\n *\n * @param {Array} [rangeIndex=0]\n * The index to start the search at\n *\n * @return {number}\n * The time that offset at the specified index.\n *\n *\n * @depricated rangeIndex must be set to a value, in the future this will throw an error.\n * @throws {Error} if rangeIndex is more than the length of ranges\n */\nfunction getRange(fnName, valueIndex, ranges, rangeIndex) {\n rangeCheck(fnName, rangeIndex, ranges.length - 1);\n return ranges[rangeIndex][valueIndex];\n}\n\n/**\n * Create a time range object given ranges of time.\n *\n * @param {Array} [ranges]\n * An array of time ranges.\n */\nfunction createTimeRangesObj(ranges) {\n if (ranges === undefined || ranges.length === 0) {\n return {\n length: 0,\n start: function start() {\n throw new Error('This TimeRanges object is empty');\n },\n end: function end() {\n throw new Error('This TimeRanges object is empty');\n }\n };\n }\n return {\n length: ranges.length,\n start: getRange.bind(null, 'start', 0, ranges),\n end: getRange.bind(null, 'end', 1, ranges)\n };\n}\n\n/**\n * Should create a fake `TimeRange` object which mimics an HTML5 time range instance.\n *\n * @param {number|Array} start\n * The start of a single range or an array of ranges\n *\n * @param {number} end\n * The end of a single range.\n *\n * @private\n */\nfunction createTimeRanges(start, end) {\n if (Array.isArray(start)) {\n return createTimeRangesObj(start);\n } else if (start === undefined || end === undefined) {\n return createTimeRangesObj();\n }\n return createTimeRangesObj([[start, end]]);\n}\n\n/**\n * @file buffer.js\n * @module buffer\n */\n/**\n * Compute the percentage of the media that has been buffered.\n *\n * @param {TimeRange} buffered\n * The current `TimeRange` object representing buffered time ranges\n *\n * @param {number} duration\n * Total duration of the media\n *\n * @return {number}\n * Percent buffered of the total duration in decimal form.\n */\nfunction bufferedPercent(buffered, duration) {\n var bufferedDuration = 0;\n var start = void 0;\n var end = void 0;\n\n if (!duration) {\n return 0;\n }\n\n if (!buffered || !buffered.length) {\n buffered = createTimeRanges(0, 0);\n }\n\n for (var i = 0; i < buffered.length; i++) {\n start = buffered.start(i);\n end = buffered.end(i);\n\n // buffered end can be bigger than duration by a very small fraction\n if (end > duration) {\n end = duration;\n }\n\n bufferedDuration += end - start;\n }\n\n return bufferedDuration / duration;\n}\n\n/**\n * @file fullscreen-api.js\n * @module fullscreen-api\n * @private\n */\n/**\n * Store the browser-specific methods for the fullscreen API.\n *\n * @type {Object}\n * @see [Specification]{@link https://fullscreen.spec.whatwg.org}\n * @see [Map Approach From Screenfull.js]{@link https://github.com/sindresorhus/screenfull.js}\n */\nvar FullscreenApi = {};\n\n// browser API methods\nvar apiMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],\n// WebKit\n['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Old WebKit (Safari 5.1)\n['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Mozilla\n['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],\n// Microsoft\n['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];\n\nvar specApi = apiMap[0];\nvar browserApi = void 0;\n\n// determine the supported set of functions\nfor (var i = 0; i < apiMap.length; i++) {\n // check for exitFullscreen function\n if (apiMap[i][1] in document) {\n browserApi = apiMap[i];\n break;\n }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n for (var _i = 0; _i < browserApi.length; _i++) {\n FullscreenApi[specApi[_i]] = browserApi[_i];\n }\n}\n\n/**\n * @file media-error.js\n */\n/**\n * A Custom `MediaError` class which mimics the standard HTML5 `MediaError` class.\n *\n * @param {number|string|Object|MediaError} value\n * This can be of multiple types:\n * - number: should be a standard error code\n * - string: an error message (the code will be 0)\n * - Object: arbitrary properties\n * - `MediaError` (native): used to populate a video.js `MediaError` object\n * - `MediaError` (video.js): will return itself if it's already a\n * video.js `MediaError` object.\n *\n * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}\n * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}\n *\n * @class MediaError\n */\nfunction MediaError(value) {\n\n // Allow redundant calls to this constructor to avoid having `instanceof`\n // checks peppered around the code.\n if (value instanceof MediaError) {\n return value;\n }\n\n if (typeof value === 'number') {\n this.code = value;\n } else if (typeof value === 'string') {\n // default code is zero, so this is a custom error\n this.message = value;\n } else if (isObject(value)) {\n\n // We assign the `code` property manually because native `MediaError` objects\n // do not expose it as an own/enumerable property of the object.\n if (typeof value.code === 'number') {\n this.code = value.code;\n }\n\n assign(this, value);\n }\n\n if (!this.message) {\n this.message = MediaError.defaultMessages[this.code] || '';\n }\n}\n\n/**\n * The error code that refers two one of the defined `MediaError` types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/**\n * An optional message that to show with the error. Message is not part of the HTML5\n * video spec but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/**\n * An optional status code that can be set by plugins to allow even more detail about\n * the error. For example a plugin might provide a specific HTTP status code and an\n * error message for that code. Then when the plugin gets that error this class will\n * know how to display an error message for it. This allows a custom message to show\n * up on the `Player` error overlay.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\n/**\n * Errors indexed by the W3C standard. The order **CANNOT CHANGE**! See the\n * specification listed under {@link MediaError} for more information.\n *\n * @enum {array}\n * @readonly\n * @property {string} 0 - MEDIA_ERR_CUSTOM\n * @property {string} 1 - MEDIA_ERR_CUSTOM\n * @property {string} 2 - MEDIA_ERR_ABORTED\n * @property {string} 3 - MEDIA_ERR_NETWORK\n * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED\n * @property {string} 5 - MEDIA_ERR_ENCRYPTED\n */\nMediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED'];\n\n/**\n * The default `MediaError` messages based on the {@link MediaError.errorTypes}.\n *\n * @type {Array}\n * @constant\n */\nMediaError.defaultMessages = {\n 1: 'You aborted the media playback',\n 2: 'A network error caused the media download to fail part-way.',\n 3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n 4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n 5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n MediaError[MediaError.errorTypes[errNum]] = errNum;\n // values should be accessible on both the class and instance\n MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\n/**\n * Returns whether an object is `Promise`-like (i.e. has a `then` method).\n *\n * @param {Object} value\n * An object that may or may not be `Promise`-like.\n *\n * @return {Boolean}\n * Whether or not the object is `Promise`-like.\n */\nfunction isPromise(value) {\n return value !== undefined && value !== null && typeof value.then === 'function';\n}\n\n/**\n * Silence a Promise-like object.\n *\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n *\n * @param {Object} value\n * An object that may or may not be `Promise`-like.\n */\nfunction silencePromise(value) {\n if (isPromise(value)) {\n value.then(null, function (e) {});\n }\n}\n\n/**\n * @file text-track-list-converter.js Utilities for capturing text track state and\n * re-creating tracks based on a capture.\n *\n * @module text-track-list-converter\n */\n\n/**\n * Examine a single {@link TextTrack} and return a JSON-compatible javascript object that\n * represents the {@link TextTrack}'s state.\n *\n * @param {TextTrack} track\n * The text track to query.\n *\n * @return {Object}\n * A serializable javascript representation of the TextTrack.\n * @private\n */\nvar trackToJson_ = function trackToJson_(track) {\n var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) {\n\n if (track[prop]) {\n acc[prop] = track[prop];\n }\n\n return acc;\n }, {\n cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {\n return {\n startTime: cue.startTime,\n endTime: cue.endTime,\n text: cue.text,\n id: cue.id\n };\n })\n });\n\n return ret;\n};\n\n/**\n * Examine a {@link Tech} and return a JSON-compatible javascript array that represents the\n * state of all {@link TextTrack}s currently configured. The return array is compatible with\n * {@link text-track-list-converter:jsonToTextTracks}.\n *\n * @param {Tech} tech\n * The tech object to query\n *\n * @return {Array}\n * A serializable javascript representation of the {@link Tech}s\n * {@link TextTrackList}.\n */\nvar textTracksToJson = function textTracksToJson(tech) {\n\n var trackEls = tech.$$('track');\n\n var trackObjs = Array.prototype.map.call(trackEls, function (t) {\n return t.track;\n });\n var tracks = Array.prototype.map.call(trackEls, function (trackEl) {\n var json = trackToJson_(trackEl.track);\n\n if (trackEl.src) {\n json.src = trackEl.src;\n }\n return json;\n });\n\n return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {\n return trackObjs.indexOf(track) === -1;\n }).map(trackToJson_));\n};\n\n/**\n * Create a set of remote {@link TextTrack}s on a {@link Tech} based on an array of javascript\n * object {@link TextTrack} representations.\n *\n * @param {Array} json\n * An array of `TextTrack` representation objects, like those that would be\n * produced by `textTracksToJson`.\n *\n * @param {Tech} tech\n * The `Tech` to create the `TextTrack`s on.\n */\nvar jsonToTextTracks = function jsonToTextTracks(json, tech) {\n json.forEach(function (track) {\n var addedTrack = tech.addRemoteTextTrack(track).track;\n\n if (!track.src && track.cues) {\n track.cues.forEach(function (cue) {\n return addedTrack.addCue(cue);\n });\n }\n });\n\n return tech.textTracks();\n};\n\nvar textTrackConverter = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };\n\n/**\n * @file modal-dialog.js\n */\nvar MODAL_CLASS_NAME = 'vjs-modal-dialog';\nvar ESC = 27;\n\n/**\n * The `ModalDialog` displays over the video and its controls, which blocks\n * interaction with the player until it is closed.\n *\n * Modal dialogs include a \"Close\" button and will close when that button\n * is activated - or when ESC is pressed anywhere.\n *\n * @extends Component\n */\n\nvar ModalDialog = function (_Component) {\n inherits(ModalDialog, _Component);\n\n /**\n * Create an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Mixed} [options.content=undefined]\n * Provide customized content for this modal.\n *\n * @param {string} [options.description]\n * A text description for the modal, primarily for accessibility.\n *\n * @param {boolean} [options.fillAlways=false]\n * Normally, modals are automatically filled only the first time\n * they open. This tells the modal to refresh its content\n * every time it opens.\n *\n * @param {string} [options.label]\n * A text label for the modal, primarily for accessibility.\n *\n * @param {boolean} [options.temporary=true]\n * If `true`, the modal can only be opened once; it will be\n * disposed as soon as it's closed.\n *\n * @param {boolean} [options.uncloseable=false]\n * If `true`, the user will not be able to close the modal\n * through the UI in the normal ways. Programmatic closing is\n * still possible.\n */\n function ModalDialog(player, options) {\n classCallCheck(this, ModalDialog);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false;\n\n _this.closeable(!_this.options_.uncloseable);\n _this.content(_this.options_.content);\n\n // Make sure the contentEl is defined AFTER any children are initialized\n // because we only want the contents of the modal in the contentEl\n // (not the UI elements like the close button).\n _this.contentEl_ = createEl('div', {\n className: MODAL_CLASS_NAME + '-content'\n }, {\n role: 'document'\n });\n\n _this.descEl_ = createEl('p', {\n className: MODAL_CLASS_NAME + '-description vjs-control-text',\n id: _this.el().getAttribute('aria-describedby')\n });\n\n textContent(_this.descEl_, _this.description());\n _this.el_.appendChild(_this.descEl_);\n _this.el_.appendChild(_this.contentEl_);\n return _this;\n }\n\n /**\n * Create the `ModalDialog`'s DOM element\n *\n * @return {Element}\n * The DOM element that gets created.\n */\n\n\n ModalDialog.prototype.createEl = function createEl$$1() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: this.buildCSSClass(),\n tabIndex: -1\n }, {\n 'aria-describedby': this.id() + '_description',\n 'aria-hidden': 'true',\n 'aria-label': this.label(),\n 'role': 'dialog'\n });\n };\n\n ModalDialog.prototype.dispose = function dispose() {\n this.contentEl_ = null;\n this.descEl_ = null;\n this.previouslyActiveEl_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n ModalDialog.prototype.buildCSSClass = function buildCSSClass() {\n return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Handles `keydown` events on the document, looking for ESC, which closes\n * the modal.\n *\n * @param {EventTarget~Event} e\n * The keypress that triggered this event.\n *\n * @listens keydown\n */\n\n\n ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) {\n if (e.which === ESC && this.closeable()) {\n this.close();\n }\n };\n\n /**\n * Returns the label string for this modal. Primarily used for accessibility.\n *\n * @return {string}\n * the localized or raw label of this modal.\n */\n\n\n ModalDialog.prototype.label = function label() {\n return this.localize(this.options_.label || 'Modal Window');\n };\n\n /**\n * Returns the description string for this modal. Primarily used for\n * accessibility.\n *\n * @return {string}\n * The localized or raw description of this modal.\n */\n\n\n ModalDialog.prototype.description = function description() {\n var desc = this.options_.description || this.localize('This is a modal window.');\n\n // Append a universal closeability message if the modal is closeable.\n if (this.closeable()) {\n desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');\n }\n\n return desc;\n };\n\n /**\n * Opens the modal.\n *\n * @fires ModalDialog#beforemodalopen\n * @fires ModalDialog#modalopen\n */\n\n\n ModalDialog.prototype.open = function open() {\n if (!this.opened_) {\n var player = this.player();\n\n /**\n * Fired just before a `ModalDialog` is opened.\n *\n * @event ModalDialog#beforemodalopen\n * @type {EventTarget~Event}\n */\n this.trigger('beforemodalopen');\n this.opened_ = true;\n\n // Fill content if the modal has never opened before and\n // never been filled.\n if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) {\n this.fill();\n }\n\n // If the player was playing, pause it and take note of its previously\n // playing state.\n this.wasPlaying_ = !player.paused();\n\n if (this.options_.pauseOnOpen && this.wasPlaying_) {\n player.pause();\n }\n\n if (this.closeable()) {\n this.on(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n }\n\n // Hide controls and note if they were enabled.\n this.hadControls_ = player.controls();\n player.controls(false);\n\n this.show();\n this.conditionalFocus_();\n this.el().setAttribute('aria-hidden', 'false');\n\n /**\n * Fired just after a `ModalDialog` is opened.\n *\n * @event ModalDialog#modalopen\n * @type {EventTarget~Event}\n */\n this.trigger('modalopen');\n this.hasBeenOpened_ = true;\n }\n };\n\n /**\n * If the `ModalDialog` is currently open or closed.\n *\n * @param {boolean} [value]\n * If given, it will open (`true`) or close (`false`) the modal.\n *\n * @return {boolean}\n * the current open state of the modaldialog\n */\n\n\n ModalDialog.prototype.opened = function opened(value) {\n if (typeof value === 'boolean') {\n this[value ? 'open' : 'close']();\n }\n return this.opened_;\n };\n\n /**\n * Closes the modal, does nothing if the `ModalDialog` is\n * not open.\n *\n * @fires ModalDialog#beforemodalclose\n * @fires ModalDialog#modalclose\n */\n\n\n ModalDialog.prototype.close = function close() {\n if (!this.opened_) {\n return;\n }\n var player = this.player();\n\n /**\n * Fired just before a `ModalDialog` is closed.\n *\n * @event ModalDialog#beforemodalclose\n * @type {EventTarget~Event}\n */\n this.trigger('beforemodalclose');\n this.opened_ = false;\n\n if (this.wasPlaying_ && this.options_.pauseOnOpen) {\n player.play();\n }\n\n if (this.closeable()) {\n this.off(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n }\n\n if (this.hadControls_) {\n player.controls(true);\n }\n\n this.hide();\n this.el().setAttribute('aria-hidden', 'true');\n\n /**\n * Fired just after a `ModalDialog` is closed.\n *\n * @event ModalDialog#modalclose\n * @type {EventTarget~Event}\n */\n this.trigger('modalclose');\n this.conditionalBlur_();\n\n if (this.options_.temporary) {\n this.dispose();\n }\n };\n\n /**\n * Check to see if the `ModalDialog` is closeable via the UI.\n *\n * @param {boolean} [value]\n * If given as a boolean, it will set the `closeable` option.\n *\n * @return {boolean}\n * Returns the final value of the closable option.\n */\n\n\n ModalDialog.prototype.closeable = function closeable(value) {\n if (typeof value === 'boolean') {\n var closeable = this.closeable_ = !!value;\n var close = this.getChild('closeButton');\n\n // If this is being made closeable and has no close button, add one.\n if (closeable && !close) {\n\n // The close button should be a child of the modal - not its\n // content element, so temporarily change the content element.\n var temp = this.contentEl_;\n\n this.contentEl_ = this.el_;\n close = this.addChild('closeButton', { controlText: 'Close Modal Dialog' });\n this.contentEl_ = temp;\n this.on(close, 'close', this.close);\n }\n\n // If this is being made uncloseable and has a close button, remove it.\n if (!closeable && close) {\n this.off(close, 'close', this.close);\n this.removeChild(close);\n close.dispose();\n }\n }\n return this.closeable_;\n };\n\n /**\n * Fill the modal's content element with the modal's \"content\" option.\n * The content element will be emptied before this change takes place.\n */\n\n\n ModalDialog.prototype.fill = function fill() {\n this.fillWith(this.content());\n };\n\n /**\n * Fill the modal's content element with arbitrary content.\n * The content element will be emptied before this change takes place.\n *\n * @fires ModalDialog#beforemodalfill\n * @fires ModalDialog#modalfill\n *\n * @param {Mixed} [content]\n * The same rules apply to this as apply to the `content` option.\n */\n\n\n ModalDialog.prototype.fillWith = function fillWith(content) {\n var contentEl = this.contentEl();\n var parentEl = contentEl.parentNode;\n var nextSiblingEl = contentEl.nextSibling;\n\n /**\n * Fired just before a `ModalDialog` is filled with content.\n *\n * @event ModalDialog#beforemodalfill\n * @type {EventTarget~Event}\n */\n this.trigger('beforemodalfill');\n this.hasBeenFilled_ = true;\n\n // Detach the content element from the DOM before performing\n // manipulation to avoid modifying the live DOM multiple times.\n parentEl.removeChild(contentEl);\n this.empty();\n insertContent(contentEl, content);\n /**\n * Fired just after a `ModalDialog` is filled with content.\n *\n * @event ModalDialog#modalfill\n * @type {EventTarget~Event}\n */\n this.trigger('modalfill');\n\n // Re-inject the re-filled content element.\n if (nextSiblingEl) {\n parentEl.insertBefore(contentEl, nextSiblingEl);\n } else {\n parentEl.appendChild(contentEl);\n }\n\n // make sure that the close button is last in the dialog DOM\n var closeButton = this.getChild('closeButton');\n\n if (closeButton) {\n parentEl.appendChild(closeButton.el_);\n }\n };\n\n /**\n * Empties the content element. This happens anytime the modal is filled.\n *\n * @fires ModalDialog#beforemodalempty\n * @fires ModalDialog#modalempty\n */\n\n\n ModalDialog.prototype.empty = function empty() {\n /**\n * Fired just before a `ModalDialog` is emptied.\n *\n * @event ModalDialog#beforemodalempty\n * @type {EventTarget~Event}\n */\n this.trigger('beforemodalempty');\n emptyEl(this.contentEl());\n\n /**\n * Fired just after a `ModalDialog` is emptied.\n *\n * @event ModalDialog#modalempty\n * @type {EventTarget~Event}\n */\n this.trigger('modalempty');\n };\n\n /**\n * Gets or sets the modal content, which gets normalized before being\n * rendered into the DOM.\n *\n * This does not update the DOM or fill the modal, but it is called during\n * that process.\n *\n * @param {Mixed} [value]\n * If defined, sets the internal content value to be used on the\n * next call(s) to `fill`. This value is normalized before being\n * inserted. To \"clear\" the internal content value, pass `null`.\n *\n * @return {Mixed}\n * The current content of the modal dialog\n */\n\n\n ModalDialog.prototype.content = function content(value) {\n if (typeof value !== 'undefined') {\n this.content_ = value;\n }\n return this.content_;\n };\n\n /**\n * conditionally focus the modal dialog if focus was previously on the player.\n *\n * @private\n */\n\n\n ModalDialog.prototype.conditionalFocus_ = function conditionalFocus_() {\n var activeEl = document.activeElement;\n var playerEl = this.player_.el_;\n\n this.previouslyActiveEl_ = null;\n\n if (playerEl.contains(activeEl) || playerEl === activeEl) {\n this.previouslyActiveEl_ = activeEl;\n\n this.focus();\n\n this.on(document, 'keydown', this.handleKeyDown);\n }\n };\n\n /**\n * conditionally blur the element and refocus the last focused element\n *\n * @private\n */\n\n\n ModalDialog.prototype.conditionalBlur_ = function conditionalBlur_() {\n if (this.previouslyActiveEl_) {\n this.previouslyActiveEl_.focus();\n this.previouslyActiveEl_ = null;\n }\n\n this.off(document, 'keydown', this.handleKeyDown);\n };\n\n /**\n * Keydown handler. Attached when modal is focused.\n *\n * @listens keydown\n */\n\n\n ModalDialog.prototype.handleKeyDown = function handleKeyDown(event) {\n // exit early if it isn't a tab key\n if (event.which !== 9) {\n return;\n }\n\n var focusableEls = this.focusableEls_();\n var activeEl = this.el_.querySelector(':focus');\n var focusIndex = void 0;\n\n for (var i = 0; i < focusableEls.length; i++) {\n if (activeEl === focusableEls[i]) {\n focusIndex = i;\n break;\n }\n }\n\n if (document.activeElement === this.el_) {\n focusIndex = 0;\n }\n\n if (event.shiftKey && focusIndex === 0) {\n focusableEls[focusableEls.length - 1].focus();\n event.preventDefault();\n } else if (!event.shiftKey && focusIndex === focusableEls.length - 1) {\n focusableEls[0].focus();\n event.preventDefault();\n }\n };\n\n /**\n * get all focusable elements\n *\n * @private\n */\n\n\n ModalDialog.prototype.focusableEls_ = function focusableEls_() {\n var allChildren = this.el_.querySelectorAll('*');\n\n return Array.prototype.filter.call(allChildren, function (child) {\n return (child instanceof window.HTMLAnchorElement || child instanceof window.HTMLAreaElement) && child.hasAttribute('href') || (child instanceof window.HTMLInputElement || child instanceof window.HTMLSelectElement || child instanceof window.HTMLTextAreaElement || child instanceof window.HTMLButtonElement) && !child.hasAttribute('disabled') || child instanceof window.HTMLIFrameElement || child instanceof window.HTMLObjectElement || child instanceof window.HTMLEmbedElement || child.hasAttribute('tabindex') && child.getAttribute('tabindex') !== -1 || child.hasAttribute('contenteditable');\n });\n };\n\n return ModalDialog;\n}(Component);\n\n/**\n * Default options for `ModalDialog` default options.\n *\n * @type {Object}\n * @private\n */\n\n\nModalDialog.prototype.options_ = {\n pauseOnOpen: true,\n temporary: true\n};\n\nComponent.registerComponent('ModalDialog', ModalDialog);\n\n/**\n * @file track-list.js\n */\n/**\n * Common functionaliy between {@link TextTrackList}, {@link AudioTrackList}, and\n * {@link VideoTrackList}\n *\n * @extends EventTarget\n */\n\nvar TrackList = function (_EventTarget) {\n inherits(TrackList, _EventTarget);\n\n /**\n * Create an instance of this class\n *\n * @param {Track[]} tracks\n * A list of tracks to initialize the list with.\n *\n * @param {Object} [list]\n * The child object with inheritance done manually for ie8.\n *\n * @abstract\n */\n function TrackList() {\n var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n var _ret;\n\n var list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n classCallCheck(this, TrackList);\n\n var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n if (!list) {\n list = _this; // eslint-disable-line\n if (IS_IE8) {\n list = document.createElement('custom');\n for (var prop in TrackList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = TrackList.prototype[prop];\n }\n }\n }\n }\n\n list.tracks_ = [];\n\n /**\n * @memberof TrackList\n * @member {number} length\n * The current number of `Track`s in the this Trackist.\n * @instance\n */\n Object.defineProperty(list, 'length', {\n get: function get$$1() {\n return this.tracks_.length;\n }\n });\n\n for (var i = 0; i < tracks.length; i++) {\n list.addTrack(tracks[i]);\n }\n\n // must return the object, as for ie8 it will not be this\n // but a reference to a document object\n return _ret = list, possibleConstructorReturn(_this, _ret);\n }\n\n /**\n * Add a {@link Track} to the `TrackList`\n *\n * @param {Track} track\n * The audio, video, or text track to add to the list.\n *\n * @fires TrackList#addtrack\n */\n\n\n TrackList.prototype.addTrack = function addTrack(track) {\n var index = this.tracks_.length;\n\n if (!('' + index in this)) {\n Object.defineProperty(this, index, {\n get: function get$$1() {\n return this.tracks_[index];\n }\n });\n }\n\n // Do not add duplicate tracks\n if (this.tracks_.indexOf(track) === -1) {\n this.tracks_.push(track);\n /**\n * Triggered when a track is added to a track list.\n *\n * @event TrackList#addtrack\n * @type {EventTarget~Event}\n * @property {Track} track\n * A reference to track that was added.\n */\n this.trigger({\n track: track,\n type: 'addtrack'\n });\n }\n };\n\n /**\n * Remove a {@link Track} from the `TrackList`\n *\n * @param {Track} rtrack\n * The audio, video, or text track to remove from the list.\n *\n * @fires TrackList#removetrack\n */\n\n\n TrackList.prototype.removeTrack = function removeTrack(rtrack) {\n var track = void 0;\n\n for (var i = 0, l = this.length; i < l; i++) {\n if (this[i] === rtrack) {\n track = this[i];\n if (track.off) {\n track.off();\n }\n\n this.tracks_.splice(i, 1);\n\n break;\n }\n }\n\n if (!track) {\n return;\n }\n\n /**\n * Triggered when a track is removed from track list.\n *\n * @event TrackList#removetrack\n * @type {EventTarget~Event}\n * @property {Track} track\n * A reference to track that was removed.\n */\n this.trigger({\n track: track,\n type: 'removetrack'\n });\n };\n\n /**\n * Get a Track from the TrackList by a tracks id\n *\n * @param {String} id - the id of the track to get\n * @method getTrackById\n * @return {Track}\n * @private\n */\n\n\n TrackList.prototype.getTrackById = function getTrackById(id) {\n var result = null;\n\n for (var i = 0, l = this.length; i < l; i++) {\n var track = this[i];\n\n if (track.id === id) {\n result = track;\n break;\n }\n }\n\n return result;\n };\n\n return TrackList;\n}(EventTarget);\n\n/**\n * Triggered when a different track is selected/enabled.\n *\n * @event TrackList#change\n * @type {EventTarget~Event}\n */\n\n/**\n * Events that can be called with on + eventName. See {@link EventHandler}.\n *\n * @property {Object} TrackList#allowedEvents_\n * @private\n */\n\n\nTrackList.prototype.allowedEvents_ = {\n change: 'change',\n addtrack: 'addtrack',\n removetrack: 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (var event in TrackList.prototype.allowedEvents_) {\n TrackList.prototype['on' + event] = null;\n}\n\n/**\n * @file audio-track-list.js\n */\n/**\n * Anywhere we call this function we diverge from the spec\n * as we only support one enabled audiotrack at a time\n *\n * @param {AudioTrackList} list\n * list to work on\n *\n * @param {AudioTrack} track\n * The track to skip\n *\n * @private\n */\nvar disableOthers = function disableOthers(list, track) {\n for (var i = 0; i < list.length; i++) {\n if (!Object.keys(list[i]).length || track.id === list[i].id) {\n continue;\n }\n // another audio track is enabled, disable it\n list[i].enabled = false;\n }\n};\n\n/**\n * The current list of {@link AudioTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}\n * @extends TrackList\n */\n\nvar AudioTrackList = function (_TrackList) {\n inherits(AudioTrackList, _TrackList);\n\n /**\n * Create an instance of this class.\n *\n * @param {AudioTrack[]} [tracks=[]]\n * A list of `AudioTrack` to instantiate the list with.\n */\n function AudioTrackList() {\n var _this, _ret;\n\n var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n classCallCheck(this, AudioTrackList);\n\n var list = void 0;\n\n // make sure only 1 track is enabled\n // sorted from last index to first index\n for (var i = tracks.length - 1; i >= 0; i--) {\n if (tracks[i].enabled) {\n disableOthers(tracks, tracks[i]);\n break;\n }\n }\n\n // IE8 forces us to implement inheritance ourselves\n // as it does not support Object.defineProperty properly\n if (IS_IE8) {\n list = document.createElement('custom');\n for (var prop in TrackList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = TrackList.prototype[prop];\n }\n }\n for (var _prop in AudioTrackList.prototype) {\n if (_prop !== 'constructor') {\n list[_prop] = AudioTrackList.prototype[_prop];\n }\n }\n }\n\n list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n list.changing_ = false;\n\n return _ret = list, possibleConstructorReturn(_this, _ret);\n }\n\n /**\n * Add an {@link AudioTrack} to the `AudioTrackList`.\n *\n * @param {AudioTrack} track\n * The AudioTrack to add to the list\n *\n * @fires TrackList#addtrack\n */\n\n\n AudioTrackList.prototype.addTrack = function addTrack(track) {\n var _this2 = this;\n\n if (track.enabled) {\n disableOthers(this, track);\n }\n\n _TrackList.prototype.addTrack.call(this, track);\n // native tracks don't have this\n if (!track.addEventListener) {\n return;\n }\n\n /**\n * @listens AudioTrack#enabledchange\n * @fires TrackList#change\n */\n track.addEventListener('enabledchange', function () {\n // when we are disabling other tracks (since we don't support\n // more than one track at a time) we will set changing_\n // to true so that we don't trigger additional change events\n if (_this2.changing_) {\n return;\n }\n _this2.changing_ = true;\n disableOthers(_this2, track);\n _this2.changing_ = false;\n _this2.trigger('change');\n });\n };\n\n return AudioTrackList;\n}(TrackList);\n\n/**\n * @file video-track-list.js\n */\n/**\n * Un-select all other {@link VideoTrack}s that are selected.\n *\n * @param {VideoTrackList} list\n * list to work on\n *\n * @param {VideoTrack} track\n * The track to skip\n *\n * @private\n */\nvar disableOthers$1 = function disableOthers(list, track) {\n for (var i = 0; i < list.length; i++) {\n if (!Object.keys(list[i]).length || track.id === list[i].id) {\n continue;\n }\n // another video track is enabled, disable it\n list[i].selected = false;\n }\n};\n\n/**\n * The current list of {@link VideoTrack} for a video.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist}\n * @extends TrackList\n */\n\nvar VideoTrackList = function (_TrackList) {\n inherits(VideoTrackList, _TrackList);\n\n /**\n * Create an instance of this class.\n *\n * @param {VideoTrack[]} [tracks=[]]\n * A list of `VideoTrack` to instantiate the list with.\n */\n function VideoTrackList() {\n var _this, _ret;\n\n var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n classCallCheck(this, VideoTrackList);\n\n var list = void 0;\n\n // make sure only 1 track is enabled\n // sorted from last index to first index\n for (var i = tracks.length - 1; i >= 0; i--) {\n if (tracks[i].selected) {\n disableOthers$1(tracks, tracks[i]);\n break;\n }\n }\n\n // IE8 forces us to implement inheritance ourselves\n // as it does not support Object.defineProperty properly\n if (IS_IE8) {\n list = document.createElement('custom');\n for (var prop in TrackList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = TrackList.prototype[prop];\n }\n }\n for (var _prop in VideoTrackList.prototype) {\n if (_prop !== 'constructor') {\n list[_prop] = VideoTrackList.prototype[_prop];\n }\n }\n }\n\n list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n list.changing_ = false;\n\n /**\n * @member {number} VideoTrackList#selectedIndex\n * The current index of the selected {@link VideoTrack`}.\n */\n Object.defineProperty(list, 'selectedIndex', {\n get: function get$$1() {\n for (var _i = 0; _i < this.length; _i++) {\n if (this[_i].selected) {\n return _i;\n }\n }\n return -1;\n },\n set: function set$$1() {}\n });\n\n return _ret = list, possibleConstructorReturn(_this, _ret);\n }\n\n /**\n * Add a {@link VideoTrack} to the `VideoTrackList`.\n *\n * @param {VideoTrack} track\n * The VideoTrack to add to the list\n *\n * @fires TrackList#addtrack\n */\n\n\n VideoTrackList.prototype.addTrack = function addTrack(track) {\n var _this2 = this;\n\n if (track.selected) {\n disableOthers$1(this, track);\n }\n\n _TrackList.prototype.addTrack.call(this, track);\n // native tracks don't have this\n if (!track.addEventListener) {\n return;\n }\n\n /**\n * @listens VideoTrack#selectedchange\n * @fires TrackList#change\n */\n track.addEventListener('selectedchange', function () {\n if (_this2.changing_) {\n return;\n }\n _this2.changing_ = true;\n disableOthers$1(_this2, track);\n _this2.changing_ = false;\n _this2.trigger('change');\n });\n };\n\n return VideoTrackList;\n}(TrackList);\n\n/**\n * @file text-track-list.js\n */\n/**\n * The current list of {@link TextTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist}\n * @extends TrackList\n */\n\nvar TextTrackList = function (_TrackList) {\n inherits(TextTrackList, _TrackList);\n\n /**\n * Create an instance of this class.\n *\n * @param {TextTrack[]} [tracks=[]]\n * A list of `TextTrack` to instantiate the list with.\n */\n function TextTrackList() {\n var _this, _ret;\n\n var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n classCallCheck(this, TextTrackList);\n\n var list = void 0;\n\n // IE8 forces us to implement inheritance ourselves\n // as it does not support Object.defineProperty properly\n if (IS_IE8) {\n list = document.createElement('custom');\n for (var prop in TrackList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = TrackList.prototype[prop];\n }\n }\n for (var _prop in TextTrackList.prototype) {\n if (_prop !== 'constructor') {\n list[_prop] = TextTrackList.prototype[_prop];\n }\n }\n }\n\n list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n return _ret = list, possibleConstructorReturn(_this, _ret);\n }\n\n /**\n * Add a {@link TextTrack} to the `TextTrackList`\n *\n * @param {TextTrack} track\n * The text track to add to the list.\n *\n * @fires TrackList#addtrack\n */\n\n\n TextTrackList.prototype.addTrack = function addTrack(track) {\n _TrackList.prototype.addTrack.call(this, track);\n\n /**\n * @listens TextTrack#modechange\n * @fires TrackList#change\n */\n track.addEventListener('modechange', bind(this, function () {\n this.trigger('change');\n }));\n\n var nonLanguageTextTrackKind = ['metadata', 'chapters'];\n\n if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) {\n track.addEventListener('modechange', bind(this, function () {\n this.trigger('selectedlanguagechange');\n }));\n }\n };\n\n return TextTrackList;\n}(TrackList);\n\n/**\n * @file html-track-element-list.js\n */\n\n/**\n * The current list of {@link HtmlTrackElement}s.\n */\n\nvar HtmlTrackElementList = function () {\n\n /**\n * Create an instance of this class.\n *\n * @param {HtmlTrackElement[]} [tracks=[]]\n * A list of `HtmlTrackElement` to instantiate the list with.\n */\n function HtmlTrackElementList() {\n var trackElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n classCallCheck(this, HtmlTrackElementList);\n\n var list = this; // eslint-disable-line\n\n if (IS_IE8) {\n list = document.createElement('custom');\n\n for (var prop in HtmlTrackElementList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = HtmlTrackElementList.prototype[prop];\n }\n }\n }\n\n list.trackElements_ = [];\n\n /**\n * @memberof HtmlTrackElementList\n * @member {number} length\n * The current number of `Track`s in the this Trackist.\n * @instance\n */\n Object.defineProperty(list, 'length', {\n get: function get$$1() {\n return this.trackElements_.length;\n }\n });\n\n for (var i = 0, length = trackElements.length; i < length; i++) {\n list.addTrackElement_(trackElements[i]);\n }\n\n if (IS_IE8) {\n return list;\n }\n }\n\n /**\n * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList`\n *\n * @param {HtmlTrackElement} trackElement\n * The track element to add to the list.\n *\n * @private\n */\n\n\n HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) {\n var index = this.trackElements_.length;\n\n if (!('' + index in this)) {\n Object.defineProperty(this, index, {\n get: function get$$1() {\n return this.trackElements_[index];\n }\n });\n }\n\n // Do not add duplicate elements\n if (this.trackElements_.indexOf(trackElement) === -1) {\n this.trackElements_.push(trackElement);\n }\n };\n\n /**\n * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an\n * {@link TextTrack}.\n *\n * @param {TextTrack} track\n * The track associated with a track element.\n *\n * @return {HtmlTrackElement|undefined}\n * The track element that was found or undefined.\n *\n * @private\n */\n\n\n HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) {\n var trackElement_ = void 0;\n\n for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n if (track === this.trackElements_[i].track) {\n trackElement_ = this.trackElements_[i];\n\n break;\n }\n }\n\n return trackElement_;\n };\n\n /**\n * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList`\n *\n * @param {HtmlTrackElement} trackElement\n * The track element to remove from the list.\n *\n * @private\n */\n\n\n HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) {\n for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n if (trackElement === this.trackElements_[i]) {\n this.trackElements_.splice(i, 1);\n\n break;\n }\n }\n };\n\n return HtmlTrackElementList;\n}();\n\n/**\n * @file text-track-cue-list.js\n */\n/**\n * @typedef {Object} TextTrackCueList~TextTrackCue\n *\n * @property {string} id\n * The unique id for this text track cue\n *\n * @property {number} startTime\n * The start time for this text track cue\n *\n * @property {number} endTime\n * The end time for this text track cue\n *\n * @property {boolean} pauseOnExit\n * Pause when the end time is reached if true.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcue}\n */\n\n/**\n * A List of TextTrackCues.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist}\n */\n\nvar TextTrackCueList = function () {\n\n /**\n * Create an instance of this class..\n *\n * @param {Array} cues\n * A list of cues to be initialized with\n */\n function TextTrackCueList(cues) {\n classCallCheck(this, TextTrackCueList);\n\n var list = this; // eslint-disable-line\n\n if (IS_IE8) {\n list = document.createElement('custom');\n\n for (var prop in TextTrackCueList.prototype) {\n if (prop !== 'constructor') {\n list[prop] = TextTrackCueList.prototype[prop];\n }\n }\n }\n\n TextTrackCueList.prototype.setCues_.call(list, cues);\n\n /**\n * @memberof TextTrackCueList\n * @member {number} length\n * The current number of `TextTrackCue`s in the TextTrackCueList.\n * @instance\n */\n Object.defineProperty(list, 'length', {\n get: function get$$1() {\n return this.length_;\n }\n });\n\n if (IS_IE8) {\n return list;\n }\n }\n\n /**\n * A setter for cues in this list. Creates getters\n * an an index for the cues.\n *\n * @param {Array} cues\n * An array of cues to set\n *\n * @private\n */\n\n\n TextTrackCueList.prototype.setCues_ = function setCues_(cues) {\n var oldLength = this.length || 0;\n var i = 0;\n var l = cues.length;\n\n this.cues_ = cues;\n this.length_ = cues.length;\n\n var defineProp = function defineProp(index) {\n if (!('' + index in this)) {\n Object.defineProperty(this, '' + index, {\n get: function get$$1() {\n return this.cues_[index];\n }\n });\n }\n };\n\n if (oldLength < l) {\n i = oldLength;\n\n for (; i < l; i++) {\n defineProp.call(this, i);\n }\n }\n };\n\n /**\n * Get a `TextTrackCue` that is currently in the `TextTrackCueList` by id.\n *\n * @param {string} id\n * The id of the cue that should be searched for.\n *\n * @return {TextTrackCueList~TextTrackCue|null}\n * A single cue or null if none was found.\n */\n\n\n TextTrackCueList.prototype.getCueById = function getCueById(id) {\n var result = null;\n\n for (var i = 0, l = this.length; i < l; i++) {\n var cue = this[i];\n\n if (cue.id === id) {\n result = cue;\n break;\n }\n }\n\n return result;\n };\n\n return TextTrackCueList;\n}();\n\n/**\n * @file track-kinds.js\n */\n\n/**\n * All possible `VideoTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind\n * @typedef VideoTrack~Kind\n * @enum\n */\nvar VideoTrackKind = {\n alternative: 'alternative',\n captions: 'captions',\n main: 'main',\n sign: 'sign',\n subtitles: 'subtitles',\n commentary: 'commentary'\n};\n\n/**\n * All possible `AudioTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind\n * @typedef AudioTrack~Kind\n * @enum\n */\nvar AudioTrackKind = {\n 'alternative': 'alternative',\n 'descriptions': 'descriptions',\n 'main': 'main',\n 'main-desc': 'main-desc',\n 'translation': 'translation',\n 'commentary': 'commentary'\n};\n\n/**\n * All possible `TextTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-texttrack-kind\n * @typedef TextTrack~Kind\n * @enum\n */\nvar TextTrackKind = {\n subtitles: 'subtitles',\n captions: 'captions',\n descriptions: 'descriptions',\n chapters: 'chapters',\n metadata: 'metadata'\n};\n\n/**\n * All possible `TextTrackMode`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n * @typedef TextTrack~Mode\n * @enum\n */\nvar TextTrackMode = {\n disabled: 'disabled',\n hidden: 'hidden',\n showing: 'showing'\n};\n\n/**\n * @file track.js\n */\n/**\n * A Track class that contains all of the common functionality for {@link AudioTrack},\n * {@link VideoTrack}, and {@link TextTrack}.\n *\n * > Note: This class should not be used directly\n *\n * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html}\n * @extends EventTarget\n * @abstract\n */\n\nvar Track = function (_EventTarget) {\n inherits(Track, _EventTarget);\n\n /**\n * Create an instance of this class.\n *\n * @param {Object} [options={}]\n * Object of option names and values\n *\n * @param {string} [options.kind='']\n * A valid kind for the track type you are creating.\n *\n * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n * A unique id for this AudioTrack.\n *\n * @param {string} [options.label='']\n * The menu label for this track.\n *\n * @param {string} [options.language='']\n * A valid two character language code.\n *\n * @abstract\n */\n function Track() {\n var _ret;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, Track);\n\n var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n var track = _this; // eslint-disable-line\n\n if (IS_IE8) {\n track = document.createElement('custom');\n for (var prop in Track.prototype) {\n if (prop !== 'constructor') {\n track[prop] = Track.prototype[prop];\n }\n }\n }\n\n var trackProps = {\n id: options.id || 'vjs_track_' + newGUID(),\n kind: options.kind || '',\n label: options.label || '',\n language: options.language || ''\n };\n\n /**\n * @memberof Track\n * @member {string} id\n * The id of this track. Cannot be changed after creation.\n * @instance\n *\n * @readonly\n */\n\n /**\n * @memberof Track\n * @member {string} kind\n * The kind of track that this is. Cannot be changed after creation.\n * @instance\n *\n * @readonly\n */\n\n /**\n * @memberof Track\n * @member {string} label\n * The label of this track. Cannot be changed after creation.\n * @instance\n *\n * @readonly\n */\n\n /**\n * @memberof Track\n * @member {string} language\n * The two letter language code for this track. Cannot be changed after\n * creation.\n * @instance\n *\n * @readonly\n */\n\n var _loop = function _loop(key) {\n Object.defineProperty(track, key, {\n get: function get$$1() {\n return trackProps[key];\n },\n set: function set$$1() {}\n });\n };\n\n for (var key in trackProps) {\n _loop(key);\n }\n\n return _ret = track, possibleConstructorReturn(_this, _ret);\n }\n\n return Track;\n}(EventTarget);\n\n/**\n * @file url.js\n * @module url\n */\n/**\n * @typedef {Object} url:URLObject\n *\n * @property {string} protocol\n * The protocol of the url that was parsed.\n *\n * @property {string} hostname\n * The hostname of the url that was parsed.\n *\n * @property {string} port\n * The port of the url that was parsed.\n *\n * @property {string} pathname\n * The pathname of the url that was parsed.\n *\n * @property {string} search\n * The search query of the url that was parsed.\n *\n * @property {string} hash\n * The hash of the url that was parsed.\n *\n * @property {string} host\n * The host of the url that was parsed.\n */\n\n/**\n * Resolve and parse the elements of a URL.\n *\n * @param {String} url\n * The url to parse\n *\n * @return {url:URLObject}\n * An object of url details\n */\nvar parseUrl = function parseUrl(url) {\n var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n // add the url to an anchor and let the browser parse the URL\n var a = document.createElement('a');\n\n a.href = url;\n\n // IE8 (and 9?) Fix\n // ie8 doesn't parse the URL correctly until the anchor is actually\n // added to the body, and an innerHTML is needed to trigger the parsing\n var addToBody = a.host === '' && a.protocol !== 'file:';\n var div = void 0;\n\n if (addToBody) {\n div = document.createElement('div');\n div.innerHTML = '<a href=\"' + url + '\"></a>';\n a = div.firstChild;\n // prevent the div from affecting layout\n div.setAttribute('style', 'display:none; position:absolute;');\n document.body.appendChild(div);\n }\n\n // Copy the specific URL properties to a new object\n // This is also needed for IE8 because the anchor loses its\n // properties when it's removed from the dom\n var details = {};\n\n for (var i = 0; i < props.length; i++) {\n details[props[i]] = a[props[i]];\n }\n\n // IE9 adds the port to the host property unlike everyone else. If\n // a port identifier is added for standard ports, strip it.\n if (details.protocol === 'http:') {\n details.host = details.host.replace(/:80$/, '');\n }\n\n if (details.protocol === 'https:') {\n details.host = details.host.replace(/:443$/, '');\n }\n\n if (!details.protocol) {\n details.protocol = window.location.protocol;\n }\n\n if (addToBody) {\n document.body.removeChild(div);\n }\n\n return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n *\n *\n * @param {string} url\n * URL to make absolute\n *\n * @return {string}\n * Absolute URL\n *\n * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n */\nvar getAbsoluteURL = function getAbsoluteURL(url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n var div = document.createElement('div');\n\n div.innerHTML = '<a href=\"' + url + '\">x</a>';\n url = div.firstChild.href;\n }\n\n return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string\n * if passed an invalid path.\n *\n * @param {string} path\n * The fileName path like '/path/to/file.mp4'\n *\n * @returns {string}\n * The extension in lower case or an empty string if no\n * extension could be found.\n */\nvar getFileExtension = function getFileExtension(path) {\n if (typeof path === 'string') {\n var splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n var pathParts = splitPathRe.exec(path);\n\n if (pathParts) {\n return pathParts.pop().toLowerCase();\n }\n }\n\n return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {string} url\n * The url to check.\n *\n * @return {boolean}\n * Whether it is a cross domain request or not.\n */\nvar isCrossOrigin = function isCrossOrigin(url) {\n var winLoc = window.location;\n var urlInfo = parseUrl(url);\n\n // IE8 protocol relative urls will return ':' for protocol\n var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n // Check if url is for another domain/origin\n // IE8 doesn't know location.origin, so we won't rely on it here\n var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;\n\n return crossOrigin;\n};\n\nvar Url = (Object.freeze || Object)({\n\tparseUrl: parseUrl,\n\tgetAbsoluteURL: getAbsoluteURL,\n\tgetFileExtension: getFileExtension,\n\tisCrossOrigin: isCrossOrigin\n});\n\n/**\n * @file text-track.js\n */\n/**\n * Takes a webvtt file contents and parses it into cues\n *\n * @param {string} srcContent\n * webVTT file contents\n *\n * @param {TextTrack} track\n * TextTrack to add cues to. Cues come from the srcContent.\n *\n * @private\n */\nvar parseCues = function parseCues(srcContent, track) {\n var parser = new window.WebVTT.Parser(window, window.vttjs, window.WebVTT.StringDecoder());\n var errors = [];\n\n parser.oncue = function (cue) {\n track.addCue(cue);\n };\n\n parser.onparsingerror = function (error) {\n errors.push(error);\n };\n\n parser.onflush = function () {\n track.trigger({\n type: 'loadeddata',\n target: track\n });\n };\n\n parser.parse(srcContent);\n if (errors.length > 0) {\n if (window.console && window.console.groupCollapsed) {\n window.console.groupCollapsed('Text Track parsing errors for ' + track.src);\n }\n errors.forEach(function (error) {\n return log$1.error(error);\n });\n if (window.console && window.console.groupEnd) {\n window.console.groupEnd();\n }\n }\n\n parser.flush();\n};\n\n/**\n * Load a `TextTrack` from a specifed url.\n *\n * @param {string} src\n * Url to load track from.\n *\n * @param {TextTrack} track\n * Track to add cues to. Comes from the content at the end of `url`.\n *\n * @private\n */\nvar loadTrack = function loadTrack(src, track) {\n var opts = {\n uri: src\n };\n var crossOrigin = isCrossOrigin(src);\n\n if (crossOrigin) {\n opts.cors = crossOrigin;\n }\n\n xhr(opts, bind(this, function (err, response, responseBody) {\n if (err) {\n return log$1.error(err, response);\n }\n\n track.loaded_ = true;\n\n // Make sure that vttjs has loaded, otherwise, wait till it finished loading\n // NOTE: this is only used for the alt/video.novtt.js build\n if (typeof window.WebVTT !== 'function') {\n if (track.tech_) {\n var loadHandler = function loadHandler() {\n return parseCues(responseBody, track);\n };\n\n track.tech_.on('vttjsloaded', loadHandler);\n track.tech_.on('vttjserror', function () {\n log$1.error('vttjs failed to load, stopping trying to process ' + track.src);\n track.tech_.off('vttjsloaded', loadHandler);\n });\n }\n } else {\n parseCues(responseBody, track);\n }\n }));\n};\n\n/**\n * A representation of a single `TextTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack}\n * @extends Track\n */\n\nvar TextTrack = function (_Track) {\n inherits(TextTrack, _Track);\n\n /**\n * Create an instance of this class.\n *\n * @param {Object} options={}\n * Object of option names and values\n *\n * @param {Tech} options.tech\n * A reference to the tech that owns this TextTrack.\n *\n * @param {TextTrack~Kind} [options.kind='subtitles']\n * A valid text track kind.\n *\n * @param {TextTrack~Mode} [options.mode='disabled']\n * A valid text track mode.\n *\n * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n * A unique id for this TextTrack.\n *\n * @param {string} [options.label='']\n * The menu label for this track.\n *\n * @param {string} [options.language='']\n * A valid two character language code.\n *\n * @param {string} [options.srclang='']\n * A valid two character language code. An alternative, but deprioritized\n * vesion of `options.language`\n *\n * @param {string} [options.src]\n * A url to TextTrack cues.\n *\n * @param {boolean} [options.default]\n * If this track should default to on or off.\n */\n function TextTrack() {\n var _this, _ret;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, TextTrack);\n\n if (!options.tech) {\n throw new Error('A tech was not provided.');\n }\n\n var settings = mergeOptions(options, {\n kind: TextTrackKind[options.kind] || 'subtitles',\n language: options.language || options.srclang || ''\n });\n var mode = TextTrackMode[settings.mode] || 'disabled';\n var default_ = settings['default'];\n\n if (settings.kind === 'metadata' || settings.kind === 'chapters') {\n mode = 'hidden';\n }\n // on IE8 this will be a document element\n // for every other browser this will be a normal object\n var tt = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n\n tt.tech_ = settings.tech;\n\n if (IS_IE8) {\n for (var prop in TextTrack.prototype) {\n if (prop !== 'constructor') {\n tt[prop] = TextTrack.prototype[prop];\n }\n }\n }\n\n tt.cues_ = [];\n tt.activeCues_ = [];\n\n var cues = new TextTrackCueList(tt.cues_);\n var activeCues = new TextTrackCueList(tt.activeCues_);\n var changed = false;\n var timeupdateHandler = bind(tt, function () {\n\n // Accessing this.activeCues for the side-effects of updating itself\n // due to it's nature as a getter function. Do not remove or cues will\n // stop updating!\n // Use the setter to prevent deletion from uglify (pure_getters rule)\n this.activeCues = this.activeCues;\n if (changed) {\n this.trigger('cuechange');\n changed = false;\n }\n });\n\n if (mode !== 'disabled') {\n tt.tech_.ready(function () {\n tt.tech_.on('timeupdate', timeupdateHandler);\n }, true);\n }\n\n /**\n * @memberof TextTrack\n * @member {boolean} default\n * If this track was set to be on or off by default. Cannot be changed after\n * creation.\n * @instance\n *\n * @readonly\n */\n Object.defineProperty(tt, 'default', {\n get: function get$$1() {\n return default_;\n },\n set: function set$$1() {}\n });\n\n /**\n * @memberof TextTrack\n * @member {string} mode\n * Set the mode of this TextTrack to a valid {@link TextTrack~Mode}. Will\n * not be set if setting to an invalid mode.\n * @instance\n *\n * @fires TextTrack#modechange\n */\n Object.defineProperty(tt, 'mode', {\n get: function get$$1() {\n return mode;\n },\n set: function set$$1(newMode) {\n var _this2 = this;\n\n if (!TextTrackMode[newMode]) {\n return;\n }\n mode = newMode;\n if (mode === 'showing') {\n\n this.tech_.ready(function () {\n _this2.tech_.on('timeupdate', timeupdateHandler);\n }, true);\n }\n /**\n * An event that fires when mode changes on this track. This allows\n * the TextTrackList that holds this track to act accordingly.\n *\n * > Note: This is not part of the spec!\n *\n * @event TextTrack#modechange\n * @type {EventTarget~Event}\n */\n this.trigger('modechange');\n }\n });\n\n /**\n * @memberof TextTrack\n * @member {TextTrackCueList} cues\n * The text track cue list for this TextTrack.\n * @instance\n */\n Object.defineProperty(tt, 'cues', {\n get: function get$$1() {\n if (!this.loaded_) {\n return null;\n }\n\n return cues;\n },\n set: function set$$1() {}\n });\n\n /**\n * @memberof TextTrack\n * @member {TextTrackCueList} activeCues\n * The list text track cues that are currently active for this TextTrack.\n * @instance\n */\n Object.defineProperty(tt, 'activeCues', {\n get: function get$$1() {\n if (!this.loaded_) {\n return null;\n }\n\n // nothing to do\n if (this.cues.length === 0) {\n return activeCues;\n }\n\n var ct = this.tech_.currentTime();\n var active = [];\n\n for (var i = 0, l = this.cues.length; i < l; i++) {\n var cue = this.cues[i];\n\n if (cue.startTime <= ct && cue.endTime >= ct) {\n active.push(cue);\n } else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) {\n active.push(cue);\n }\n }\n\n changed = false;\n\n if (active.length !== this.activeCues_.length) {\n changed = true;\n } else {\n for (var _i = 0; _i < active.length; _i++) {\n if (this.activeCues_.indexOf(active[_i]) === -1) {\n changed = true;\n }\n }\n }\n\n this.activeCues_ = active;\n activeCues.setCues_(this.activeCues_);\n\n return activeCues;\n },\n\n\n // /!\\ Keep this setter empty (see the timeupdate handler above)\n set: function set$$1() {}\n });\n\n if (settings.src) {\n tt.src = settings.src;\n loadTrack(settings.src, tt);\n } else {\n tt.loaded_ = true;\n }\n\n return _ret = tt, possibleConstructorReturn(_this, _ret);\n }\n\n /**\n * Add a cue to the internal list of cues.\n *\n * @param {TextTrack~Cue} cue\n * The cue to add to our internal list\n */\n\n\n TextTrack.prototype.addCue = function addCue(originalCue) {\n var cue = originalCue;\n\n if (window.vttjs && !(originalCue instanceof window.vttjs.VTTCue)) {\n cue = new window.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text);\n\n for (var prop in originalCue) {\n if (!(prop in cue)) {\n cue[prop] = originalCue[prop];\n }\n }\n\n // make sure that `id` is copied over\n cue.id = originalCue.id;\n cue.originalCue_ = originalCue;\n }\n\n var tracks = this.tech_.textTracks();\n\n for (var i = 0; i < tracks.length; i++) {\n if (tracks[i] !== this) {\n tracks[i].removeCue(cue);\n }\n }\n\n this.cues_.push(cue);\n this.cues.setCues_(this.cues_);\n };\n\n /**\n * Remove a cue from our internal list\n *\n * @param {TextTrack~Cue} removeCue\n * The cue to remove from our internal list\n */\n\n\n TextTrack.prototype.removeCue = function removeCue(_removeCue) {\n var i = this.cues_.length;\n\n while (i--) {\n var cue = this.cues_[i];\n\n if (cue === _removeCue || cue.originalCue_ && cue.originalCue_ === _removeCue) {\n this.cues_.splice(i, 1);\n this.cues.setCues_(this.cues_);\n break;\n }\n }\n };\n\n return TextTrack;\n}(Track);\n\n/**\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\n\n\nTextTrack.prototype.allowedEvents_ = {\n cuechange: 'cuechange'\n};\n\n/**\n * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList}\n * only one `AudioTrack` in the list will be enabled at a time.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack}\n * @extends Track\n */\n\nvar AudioTrack = function (_Track) {\n inherits(AudioTrack, _Track);\n\n /**\n * Create an instance of this class.\n *\n * @param {Object} [options={}]\n * Object of option names and values\n *\n * @param {AudioTrack~Kind} [options.kind='']\n * A valid audio track kind\n *\n * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n * A unique id for this AudioTrack.\n *\n * @param {string} [options.label='']\n * The menu label for this track.\n *\n * @param {string} [options.language='']\n * A valid two character language code.\n *\n * @param {boolean} [options.enabled]\n * If this track is the one that is currently playing. If this track is part of\n * an {@link AudioTrackList}, only one {@link AudioTrack} will be enabled.\n */\n function AudioTrack() {\n var _this, _ret;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, AudioTrack);\n\n var settings = mergeOptions(options, {\n kind: AudioTrackKind[options.kind] || ''\n });\n // on IE8 this will be a document element\n // for every other browser this will be a normal object\n var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n var enabled = false;\n\n if (IS_IE8) {\n for (var prop in AudioTrack.prototype) {\n if (prop !== 'constructor') {\n track[prop] = AudioTrack.prototype[prop];\n }\n }\n }\n /**\n * @memberof AudioTrack\n * @member {boolean} enabled\n * If this `AudioTrack` is enabled or not. When setting this will\n * fire {@link AudioTrack#enabledchange} if the state of enabled is changed.\n * @instance\n *\n * @fires VideoTrack#selectedchange\n */\n Object.defineProperty(track, 'enabled', {\n get: function get$$1() {\n return enabled;\n },\n set: function set$$1(newEnabled) {\n // an invalid or unchanged value\n if (typeof newEnabled !== 'boolean' || newEnabled === enabled) {\n return;\n }\n enabled = newEnabled;\n\n /**\n * An event that fires when enabled changes on this track. This allows\n * the AudioTrackList that holds this track to act accordingly.\n *\n * > Note: This is not part of the spec! Native tracks will do\n * this internally without an event.\n *\n * @event AudioTrack#enabledchange\n * @type {EventTarget~Event}\n */\n this.trigger('enabledchange');\n }\n });\n\n // if the user sets this track to selected then\n // set selected to that true value otherwise\n // we keep it false\n if (settings.enabled) {\n track.enabled = settings.enabled;\n }\n track.loaded_ = true;\n\n return _ret = track, possibleConstructorReturn(_this, _ret);\n }\n\n return AudioTrack;\n}(Track);\n\n/**\n * A representation of a single `VideoTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack}\n * @extends Track\n */\n\nvar VideoTrack = function (_Track) {\n inherits(VideoTrack, _Track);\n\n /**\n * Create an instance of this class.\n *\n * @param {Object} [options={}]\n * Object of option names and values\n *\n * @param {string} [options.kind='']\n * A valid {@link VideoTrack~Kind}\n *\n * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n * A unique id for this AudioTrack.\n *\n * @param {string} [options.label='']\n * The menu label for this track.\n *\n * @param {string} [options.language='']\n * A valid two character language code.\n *\n * @param {boolean} [options.selected]\n * If this track is the one that is currently playing.\n */\n function VideoTrack() {\n var _this, _ret;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, VideoTrack);\n\n var settings = mergeOptions(options, {\n kind: VideoTrackKind[options.kind] || ''\n });\n\n // on IE8 this will be a document element\n // for every other browser this will be a normal object\n var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n var selected = false;\n\n if (IS_IE8) {\n for (var prop in VideoTrack.prototype) {\n if (prop !== 'constructor') {\n track[prop] = VideoTrack.prototype[prop];\n }\n }\n }\n\n /**\n * @memberof VideoTrack\n * @member {boolean} selected\n * If this `VideoTrack` is selected or not. When setting this will\n * fire {@link VideoTrack#selectedchange} if the state of selected changed.\n * @instance\n *\n * @fires VideoTrack#selectedchange\n */\n Object.defineProperty(track, 'selected', {\n get: function get$$1() {\n return selected;\n },\n set: function set$$1(newSelected) {\n // an invalid or unchanged value\n if (typeof newSelected !== 'boolean' || newSelected === selected) {\n return;\n }\n selected = newSelected;\n\n /**\n * An event that fires when selected changes on this track. This allows\n * the VideoTrackList that holds this track to act accordingly.\n *\n * > Note: This is not part of the spec! Native tracks will do\n * this internally without an event.\n *\n * @event VideoTrack#selectedchange\n * @type {EventTarget~Event}\n */\n this.trigger('selectedchange');\n }\n });\n\n // if the user sets this track to selected then\n // set selected to that true value otherwise\n // we keep it false\n if (settings.selected) {\n track.selected = settings.selected;\n }\n\n return _ret = track, possibleConstructorReturn(_this, _ret);\n }\n\n return VideoTrack;\n}(Track);\n\n/**\n * @file html-track-element.js\n */\n\n/**\n * @memberof HTMLTrackElement\n * @typedef {HTMLTrackElement~ReadyState}\n * @enum {number}\n */\nvar NONE = 0;\nvar LOADING = 1;\nvar LOADED = 2;\nvar ERROR = 3;\n\n/**\n * A single track represented in the DOM.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement}\n * @extends EventTarget\n */\n\nvar HTMLTrackElement = function (_EventTarget) {\n inherits(HTMLTrackElement, _EventTarget);\n\n /**\n * Create an instance of this class.\n *\n * @param {Object} options={}\n * Object of option names and values\n *\n * @param {Tech} options.tech\n * A reference to the tech that owns this HTMLTrackElement.\n *\n * @param {TextTrack~Kind} [options.kind='subtitles']\n * A valid text track kind.\n *\n * @param {TextTrack~Mode} [options.mode='disabled']\n * A valid text track mode.\n *\n * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n * A unique id for this TextTrack.\n *\n * @param {string} [options.label='']\n * The menu label for this track.\n *\n * @param {string} [options.language='']\n * A valid two character language code.\n *\n * @param {string} [options.srclang='']\n * A valid two character language code. An alternative, but deprioritized\n * vesion of `options.language`\n *\n * @param {string} [options.src]\n * A url to TextTrack cues.\n *\n * @param {boolean} [options.default]\n * If this track should default to on or off.\n */\n function HTMLTrackElement() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n classCallCheck(this, HTMLTrackElement);\n\n var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n var readyState = void 0;\n var trackElement = _this; // eslint-disable-line\n\n if (IS_IE8) {\n trackElement = document.createElement('custom');\n\n for (var prop in HTMLTrackElement.prototype) {\n if (prop !== 'constructor') {\n trackElement[prop] = HTMLTrackElement.prototype[prop];\n }\n }\n }\n\n var track = new TextTrack(options);\n\n trackElement.kind = track.kind;\n trackElement.src = track.src;\n trackElement.srclang = track.language;\n trackElement.label = track.label;\n trackElement['default'] = track['default'];\n\n /**\n * @memberof HTMLTrackElement\n * @member {HTMLTrackElement~ReadyState} readyState\n * The current ready state of the track element.\n * @instance\n */\n Object.defineProperty(trackElement, 'readyState', {\n get: function get$$1() {\n return readyState;\n }\n });\n\n /**\n * @memberof HTMLTrackElement\n * @member {TextTrack} track\n * The underlying TextTrack object.\n * @instance\n *\n */\n Object.defineProperty(trackElement, 'track', {\n get: function get$$1() {\n return track;\n }\n });\n\n readyState = NONE;\n\n /**\n * @listens TextTrack#loadeddata\n * @fires HTMLTrackElement#load\n */\n track.addEventListener('loadeddata', function () {\n readyState = LOADED;\n\n trackElement.trigger({\n type: 'load',\n target: trackElement\n });\n });\n\n if (IS_IE8) {\n var _ret;\n\n return _ret = trackElement, possibleConstructorReturn(_this, _ret);\n }\n return _this;\n }\n\n return HTMLTrackElement;\n}(EventTarget);\n\nHTMLTrackElement.prototype.allowedEvents_ = {\n load: 'load'\n};\n\nHTMLTrackElement.NONE = NONE;\nHTMLTrackElement.LOADING = LOADING;\nHTMLTrackElement.LOADED = LOADED;\nHTMLTrackElement.ERROR = ERROR;\n\n/*\n * This file contains all track properties that are used in\n * player.js, tech.js, html5.js and possibly other techs in the future.\n */\n\nvar NORMAL = {\n audio: {\n ListClass: AudioTrackList,\n TrackClass: AudioTrack,\n capitalName: 'Audio'\n },\n video: {\n ListClass: VideoTrackList,\n TrackClass: VideoTrack,\n capitalName: 'Video'\n },\n text: {\n ListClass: TextTrackList,\n TrackClass: TextTrack,\n capitalName: 'Text'\n }\n};\n\nObject.keys(NORMAL).forEach(function (type) {\n NORMAL[type].getterName = type + 'Tracks';\n NORMAL[type].privateName = type + 'Tracks_';\n});\n\nvar REMOTE = {\n remoteText: {\n ListClass: TextTrackList,\n TrackClass: TextTrack,\n capitalName: 'RemoteText',\n getterName: 'remoteTextTracks',\n privateName: 'remoteTextTracks_'\n },\n remoteTextEl: {\n ListClass: HtmlTrackElementList,\n TrackClass: HTMLTrackElement,\n capitalName: 'RemoteTextTrackEls',\n getterName: 'remoteTextTrackEls',\n privateName: 'remoteTextTrackEls_'\n }\n};\n\nvar ALL = mergeOptions(NORMAL, REMOTE);\n\nREMOTE.names = Object.keys(REMOTE);\nNORMAL.names = Object.keys(NORMAL);\nALL.names = [].concat(REMOTE.names).concat(NORMAL.names);\n\n/**\n * @file tech.js\n */\n\n/**\n * An Object containing a structure like: `{src: 'url', type: 'mimetype'}` or string\n * that just contains the src url alone.\n * * `var SourceObject = {src: 'http://ex.com/video.mp4', type: 'video/mp4'};`\n * `var SourceString = 'http://example.com/some-video.mp4';`\n *\n * @typedef {Object|string} Tech~SourceObject\n *\n * @property {string} src\n * The url to the source\n *\n * @property {string} type\n * The mime type of the source\n */\n\n/**\n * A function used by {@link Tech} to create a new {@link TextTrack}.\n *\n * @private\n *\n * @param {Tech} self\n * An instance of the Tech class.\n *\n * @param {string} kind\n * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n *\n * @param {string} [label]\n * Label to identify the text track\n *\n * @param {string} [language]\n * Two letter language abbreviation\n *\n * @param {Object} [options={}]\n * An object with additional text track options\n *\n * @return {TextTrack}\n * The text track that was created.\n */\nfunction createTrackHelper(self, kind, label, language) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n\n var tracks = self.textTracks();\n\n options.kind = kind;\n\n if (label) {\n options.label = label;\n }\n if (language) {\n options.language = language;\n }\n options.tech = self;\n\n var track = new ALL.text.TrackClass(options);\n\n tracks.addTrack(track);\n\n return track;\n}\n\n/**\n * This is the base class for media playback technology controllers, such as\n * {@link Flash} and {@link HTML5}\n *\n * @extends Component\n */\n\nvar Tech = function (_Component) {\n inherits(Tech, _Component);\n\n /**\n * Create an instance of this Tech.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} ready\n * Callback function to call when the `HTML5` Tech is ready.\n */\n function Tech() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var ready = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n classCallCheck(this, Tech);\n\n // we don't want the tech to report user activity automatically.\n // This is done manually in addControlsListeners\n options.reportTouchActivity = false;\n\n // keep track of whether the current source has played at all to\n // implement a very limited played()\n var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n _this.hasStarted_ = false;\n _this.on('playing', function () {\n this.hasStarted_ = true;\n });\n _this.on('loadstart', function () {\n this.hasStarted_ = false;\n });\n\n ALL.names.forEach(function (name) {\n var props = ALL[name];\n\n if (options && options[props.getterName]) {\n _this[props.privateName] = options[props.getterName];\n }\n });\n\n // Manually track progress in cases where the browser/flash player doesn't report it.\n if (!_this.featuresProgressEvents) {\n _this.manualProgressOn();\n }\n\n // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n if (!_this.featuresTimeupdateEvents) {\n _this.manualTimeUpdatesOn();\n }\n\n ['Text', 'Audio', 'Video'].forEach(function (track) {\n if (options['native' + track + 'Tracks'] === false) {\n _this['featuresNative' + track + 'Tracks'] = false;\n }\n });\n\n if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n _this.featuresNativeTextTracks = false;\n } else if (options.nativeCaptions === true || options.nativeTextTracks === true) {\n _this.featuresNativeTextTracks = true;\n }\n\n if (!_this.featuresNativeTextTracks) {\n _this.emulateTextTracks();\n }\n\n _this.autoRemoteTextTracks_ = new ALL.text.ListClass();\n\n _this.initTrackListeners();\n\n // Turn on component tap events only if not using native controls\n if (!options.nativeControlsForTouch) {\n _this.emitTapEvents();\n }\n\n if (_this.constructor) {\n _this.name_ = _this.constructor.name || 'Unknown Tech';\n }\n return _this;\n }\n\n /**\n * A special function to trigger source set in a way that will allow player\n * to re-trigger if the player or tech are not ready yet.\n *\n * @fires Tech#sourceset\n * @param {string} src The source string at the time of the source changing.\n */\n\n\n Tech.prototype.triggerSourceset = function triggerSourceset(src) {\n var _this2 = this;\n\n if (!this.isReady_) {\n // on initial ready we have to trigger source set\n // 1ms after ready so that player can watch for it.\n this.one('ready', function () {\n return _this2.setTimeout(function () {\n return _this2.triggerSourceset(src);\n }, 1);\n });\n }\n\n /**\n * Fired when the source is set on the tech causing the media element\n * to reload.\n *\n * @see {@link Player#event:sourceset}\n * @event Tech#sourceset\n * @type {EventTarget~Event}\n */\n this.trigger({\n src: src,\n type: 'sourceset'\n });\n };\n\n /* Fallbacks for unsupported event types\n ================================================================================ */\n\n /**\n * Polyfill the `progress` event for browsers that don't support it natively.\n *\n * @see {@link Tech#trackProgress}\n */\n\n\n Tech.prototype.manualProgressOn = function manualProgressOn() {\n this.on('durationchange', this.onDurationChange);\n\n this.manualProgress = true;\n\n // Trigger progress watching when a source begins loading\n this.one('ready', this.trackProgress);\n };\n\n /**\n * Turn off the polyfill for `progress` events that was created in\n * {@link Tech#manualProgressOn}\n */\n\n\n Tech.prototype.manualProgressOff = function manualProgressOff() {\n this.manualProgress = false;\n this.stopTrackingProgress();\n\n this.off('durationchange', this.onDurationChange);\n };\n\n /**\n * This is used to trigger a `progress` event when the buffered percent changes. It\n * sets an interval function that will be called every 500 milliseconds to check if the\n * buffer end percent has changed.\n *\n * > This function is called by {@link Tech#manualProgressOn}\n *\n * @param {EventTarget~Event} event\n * The `ready` event that caused this to run.\n *\n * @listens Tech#ready\n * @fires Tech#progress\n */\n\n\n Tech.prototype.trackProgress = function trackProgress(event) {\n this.stopTrackingProgress();\n this.progressInterval = this.setInterval(bind(this, function () {\n // Don't trigger unless buffered amount is greater than last time\n\n var numBufferedPercent = this.bufferedPercent();\n\n if (this.bufferedPercent_ !== numBufferedPercent) {\n /**\n * See {@link Player#progress}\n *\n * @event Tech#progress\n * @type {EventTarget~Event}\n */\n this.trigger('progress');\n }\n\n this.bufferedPercent_ = numBufferedPercent;\n\n if (numBufferedPercent === 1) {\n this.stopTrackingProgress();\n }\n }), 500);\n };\n\n /**\n * Update our internal duration on a `durationchange` event by calling\n * {@link Tech#duration}.\n *\n * @param {EventTarget~Event} event\n * The `durationchange` event that caused this to run.\n *\n * @listens Tech#durationchange\n */\n\n\n Tech.prototype.onDurationChange = function onDurationChange(event) {\n this.duration_ = this.duration();\n };\n\n /**\n * Get and create a `TimeRange` object for buffering.\n *\n * @return {TimeRange}\n * The time range object that was created.\n */\n\n\n Tech.prototype.buffered = function buffered() {\n return createTimeRanges(0, 0);\n };\n\n /**\n * Get the percentage of the current video that is currently buffered.\n *\n * @return {number}\n * A number from 0 to 1 that represents the decimal percentage of the\n * video that is buffered.\n *\n */\n\n\n Tech.prototype.bufferedPercent = function bufferedPercent$$1() {\n return bufferedPercent(this.buffered(), this.duration_);\n };\n\n /**\n * Turn off the polyfill for `progress` events that was created in\n * {@link Tech#manualProgressOn}\n * Stop manually tracking progress events by clearing the interval that was set in\n * {@link Tech#trackProgress}.\n */\n\n\n Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {\n this.clearInterval(this.progressInterval);\n };\n\n /**\n * Polyfill the `timeupdate` event for browsers that don't support it.\n *\n * @see {@link Tech#trackCurrentTime}\n */\n\n\n Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {\n this.manualTimeUpdates = true;\n\n this.on('play', this.trackCurrentTime);\n this.on('pause', this.stopTrackingCurrentTime);\n };\n\n /**\n * Turn off the polyfill for `timeupdate` events that was created in\n * {@link Tech#manualTimeUpdatesOn}\n */\n\n\n Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {\n this.manualTimeUpdates = false;\n this.stopTrackingCurrentTime();\n this.off('play', this.trackCurrentTime);\n this.off('pause', this.stopTrackingCurrentTime);\n };\n\n /**\n * Sets up an interval function to track current time and trigger `timeupdate` every\n * 250 milliseconds.\n *\n * @listens Tech#play\n * @triggers Tech#timeupdate\n */\n\n\n Tech.prototype.trackCurrentTime = function trackCurrentTime() {\n if (this.currentTimeInterval) {\n this.stopTrackingCurrentTime();\n }\n this.currentTimeInterval = this.setInterval(function () {\n /**\n * Triggered at an interval of 250ms to indicated that time is passing in the video.\n *\n * @event Tech#timeupdate\n * @type {EventTarget~Event}\n */\n this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n\n // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n }, 250);\n };\n\n /**\n * Stop the interval function created in {@link Tech#trackCurrentTime} so that the\n * `timeupdate` event is no longer triggered.\n *\n * @listens {Tech#pause}\n */\n\n\n Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {\n this.clearInterval(this.currentTimeInterval);\n\n // #1002 - if the video ends right before the next timeupdate would happen,\n // the progress bar won't make it all the way to the end\n this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n };\n\n /**\n * Turn off all event polyfills, clear the `Tech`s {@link AudioTrackList},\n * {@link VideoTrackList}, and {@link TextTrackList}, and dispose of this Tech.\n *\n * @fires Component#dispose\n */\n\n\n Tech.prototype.dispose = function dispose() {\n\n // clear out all tracks because we can't reuse them between techs\n this.clearTracks(NORMAL.names);\n\n // Turn off any manual progress or timeupdate tracking\n if (this.manualProgress) {\n this.manualProgressOff();\n }\n\n if (this.manualTimeUpdates) {\n this.manualTimeUpdatesOff();\n }\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Clear out a single `TrackList` or an array of `TrackLists` given their names.\n *\n * > Note: Techs without source handlers should call this between sources for `video`\n * & `audio` tracks. You don't want to use them between tracks!\n *\n * @param {string[]|string} types\n * TrackList names to clear, valid names are `video`, `audio`, and\n * `text`.\n */\n\n\n Tech.prototype.clearTracks = function clearTracks(types) {\n var _this3 = this;\n\n types = [].concat(types);\n // clear out all tracks because we can't reuse them between techs\n types.forEach(function (type) {\n var list = _this3[type + 'Tracks']() || [];\n var i = list.length;\n\n while (i--) {\n var track = list[i];\n\n if (type === 'text') {\n _this3.removeRemoteTextTrack(track);\n }\n list.removeTrack(track);\n }\n });\n };\n\n /**\n * Remove any TextTracks added via addRemoteTextTrack that are\n * flagged for automatic garbage collection\n */\n\n\n Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() {\n var list = this.autoRemoteTextTracks_ || [];\n var i = list.length;\n\n while (i--) {\n var track = list[i];\n\n this.removeRemoteTextTrack(track);\n }\n };\n\n /**\n * Reset the tech, which will removes all sources and reset the internal readyState.\n *\n * @abstract\n */\n\n\n Tech.prototype.reset = function reset() {};\n\n /**\n * Get or set an error on the Tech.\n *\n * @param {MediaError} [err]\n * Error to set on the Tech\n *\n * @return {MediaError|null}\n * The current error object on the tech, or null if there isn't one.\n */\n\n\n Tech.prototype.error = function error(err) {\n if (err !== undefined) {\n this.error_ = new MediaError(err);\n this.trigger('error');\n }\n return this.error_;\n };\n\n /**\n * Returns the `TimeRange`s that have been played through for the current source.\n *\n * > NOTE: This implementation is incomplete. It does not track the played `TimeRange`.\n * It only checks wether the source has played at all or not.\n *\n * @return {TimeRange}\n * - A single time range if this video has played\n * - An empty set of ranges if not.\n */\n\n\n Tech.prototype.played = function played() {\n if (this.hasStarted_) {\n return createTimeRanges(0, 0);\n }\n return createTimeRanges();\n };\n\n /**\n * Causes a manual time update to occur if {@link Tech#manualTimeUpdatesOn} was\n * previously called.\n *\n * @fires Tech#timeupdate\n */\n\n\n Tech.prototype.setCurrentTime = function setCurrentTime() {\n // improve the accuracy of manual timeupdates\n if (this.manualTimeUpdates) {\n /**\n * A manual `timeupdate` event.\n *\n * @event Tech#timeupdate\n * @type {EventTarget~Event}\n */\n this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n }\n };\n\n /**\n * Turn on listeners for {@link VideoTrackList}, {@link {AudioTrackList}, and\n * {@link TextTrackList} events.\n *\n * This adds {@link EventTarget~EventListeners} for `addtrack`, and `removetrack`.\n *\n * @fires Tech#audiotrackchange\n * @fires Tech#videotrackchange\n * @fires Tech#texttrackchange\n */\n\n\n Tech.prototype.initTrackListeners = function initTrackListeners() {\n var _this4 = this;\n\n /**\n * Triggered when tracks are added or removed on the Tech {@link AudioTrackList}\n *\n * @event Tech#audiotrackchange\n * @type {EventTarget~Event}\n */\n\n /**\n * Triggered when tracks are added or removed on the Tech {@link VideoTrackList}\n *\n * @event Tech#videotrackchange\n * @type {EventTarget~Event}\n */\n\n /**\n * Triggered when tracks are added or removed on the Tech {@link TextTrackList}\n *\n * @event Tech#texttrackchange\n * @type {EventTarget~Event}\n */\n NORMAL.names.forEach(function (name) {\n var props = NORMAL[name];\n var trackListChanges = function trackListChanges() {\n _this4.trigger(name + 'trackchange');\n };\n\n var tracks = _this4[props.getterName]();\n\n tracks.addEventListener('removetrack', trackListChanges);\n tracks.addEventListener('addtrack', trackListChanges);\n\n _this4.on('dispose', function () {\n tracks.removeEventListener('removetrack', trackListChanges);\n tracks.removeEventListener('addtrack', trackListChanges);\n });\n });\n };\n\n /**\n * Emulate TextTracks using vtt.js if necessary\n *\n * @fires Tech#vttjsloaded\n * @fires Tech#vttjserror\n */\n\n\n Tech.prototype.addWebVttScript_ = function addWebVttScript_() {\n var _this5 = this;\n\n if (window.WebVTT) {\n return;\n }\n\n // Initially, Tech.el_ is a child of a dummy-div wait until the Component system\n // signals that the Tech is ready at which point Tech.el_ is part of the DOM\n // before inserting the WebVTT script\n if (document.body.contains(this.el())) {\n\n // load via require if available and vtt.js script location was not passed in\n // as an option. novtt builds will turn the above require call into an empty object\n // which will cause this if check to always fail.\n if (!this.options_['vtt.js'] && isPlain(vtt) && Object.keys(vtt).length > 0) {\n this.trigger('vttjsloaded');\n return;\n }\n\n // load vtt.js via the script location option or the cdn of no location was\n // passed in\n var script = document.createElement('script');\n\n script.src = this.options_['vtt.js'] || 'https://vjs.zencdn.net/vttjs/0.12.4/vtt.min.js';\n script.onload = function () {\n /**\n * Fired when vtt.js is loaded.\n *\n * @event Tech#vttjsloaded\n * @type {EventTarget~Event}\n */\n _this5.trigger('vttjsloaded');\n };\n script.onerror = function () {\n /**\n * Fired when vtt.js was not loaded due to an error\n *\n * @event Tech#vttjsloaded\n * @type {EventTarget~Event}\n */\n _this5.trigger('vttjserror');\n };\n this.on('dispose', function () {\n script.onload = null;\n script.onerror = null;\n });\n // but have not loaded yet and we set it to true before the inject so that\n // we don't overwrite the injected window.WebVTT if it loads right away\n window.WebVTT = true;\n this.el().parentNode.appendChild(script);\n } else {\n this.ready(this.addWebVttScript_);\n }\n };\n\n /**\n * Emulate texttracks\n *\n */\n\n\n Tech.prototype.emulateTextTracks = function emulateTextTracks() {\n var _this6 = this;\n\n var tracks = this.textTracks();\n var remoteTracks = this.remoteTextTracks();\n var handleAddTrack = function handleAddTrack(e) {\n return tracks.addTrack(e.track);\n };\n var handleRemoveTrack = function handleRemoveTrack(e) {\n return tracks.removeTrack(e.track);\n };\n\n remoteTracks.on('addtrack', handleAddTrack);\n remoteTracks.on('removetrack', handleRemoveTrack);\n\n this.addWebVttScript_();\n\n var updateDisplay = function updateDisplay() {\n return _this6.trigger('texttrackchange');\n };\n\n var textTracksChanges = function textTracksChanges() {\n updateDisplay();\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n track.removeEventListener('cuechange', updateDisplay);\n if (track.mode === 'showing') {\n track.addEventListener('cuechange', updateDisplay);\n }\n }\n };\n\n textTracksChanges();\n tracks.addEventListener('change', textTracksChanges);\n tracks.addEventListener('addtrack', textTracksChanges);\n tracks.addEventListener('removetrack', textTracksChanges);\n\n this.on('dispose', function () {\n remoteTracks.off('addtrack', handleAddTrack);\n remoteTracks.off('removetrack', handleRemoveTrack);\n tracks.removeEventListener('change', textTracksChanges);\n tracks.removeEventListener('addtrack', textTracksChanges);\n tracks.removeEventListener('removetrack', textTracksChanges);\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n track.removeEventListener('cuechange', updateDisplay);\n }\n });\n };\n\n /**\n * Create and returns a remote {@link TextTrack} object.\n *\n * @param {string} kind\n * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n *\n * @param {string} [label]\n * Label to identify the text track\n *\n * @param {string} [language]\n * Two letter language abbreviation\n *\n * @return {TextTrack}\n * The TextTrack that gets created.\n */\n\n\n Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n if (!kind) {\n throw new Error('TextTrack kind is required but was not provided');\n }\n\n return createTrackHelper(this, kind, label, language);\n };\n\n /**\n * Create an emulated TextTrack for use by addRemoteTextTrack\n *\n * This is intended to be overridden by classes that inherit from\n * Tech in order to create native or custom TextTracks.\n *\n * @param {Object} options\n * The object should contain the options to initialize the TextTrack with.\n *\n * @param {string} [options.kind]\n * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n *\n * @param {string} [options.label].\n * Label to identify the text track\n *\n * @param {string} [options.language]\n * Two letter language abbreviation.\n *\n * @return {HTMLTrackElement}\n * The track element that gets created.\n */\n\n\n Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n var track = mergeOptions(options, {\n tech: this\n });\n\n return new REMOTE.remoteTextEl.TrackClass(track);\n };\n\n /**\n * Creates a remote text track object and returns an html track element.\n *\n * > Note: This can be an emulated {@link HTMLTrackElement} or a native one.\n *\n * @param {Object} options\n * See {@link Tech#createRemoteTextTrack} for more detailed properties.\n *\n * @param {boolean} [manualCleanup=true]\n * - When false: the TextTrack will be automatically removed from the video\n * element whenever the source changes\n * - When True: The TextTrack will have to be cleaned up manually\n *\n * @return {HTMLTrackElement}\n * An Html Track Element.\n *\n * @deprecated The default functionality for this function will be equivalent\n * to \"manualCleanup=false\" in the future. The manualCleanup parameter will\n * also be removed.\n */\n\n\n Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() {\n var _this7 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var manualCleanup = arguments[1];\n\n var htmlTrackElement = this.createRemoteTextTrack(options);\n\n if (manualCleanup !== true && manualCleanup !== false) {\n // deprecation warning\n log$1.warn('Calling addRemoteTextTrack without explicitly setting the \"manualCleanup\" parameter to `true` is deprecated and default to `false` in future version of video.js');\n manualCleanup = true;\n }\n\n // store HTMLTrackElement and TextTrack to remote list\n this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);\n this.remoteTextTracks().addTrack(htmlTrackElement.track);\n\n if (manualCleanup !== true) {\n // create the TextTrackList if it doesn't exist\n this.ready(function () {\n return _this7.autoRemoteTextTracks_.addTrack(htmlTrackElement.track);\n });\n }\n\n return htmlTrackElement;\n };\n\n /**\n * Remove a remote text track from the remote `TextTrackList`.\n *\n * @param {TextTrack} track\n * `TextTrack` to remove from the `TextTrackList`\n */\n\n\n Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);\n\n // remove HTMLTrackElement and TextTrack from remote list\n this.remoteTextTrackEls().removeTrackElement_(trackElement);\n this.remoteTextTracks().removeTrack(track);\n this.autoRemoteTextTracks_.removeTrack(track);\n };\n\n /**\n * Gets available media playback quality metrics as specified by the W3C's Media\n * Playback Quality API.\n *\n * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n *\n * @return {Object}\n * An object with supported media playback quality metrics\n *\n * @abstract\n */\n\n\n Tech.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n return {};\n };\n\n /**\n * A method to set a poster from a `Tech`.\n *\n * @abstract\n */\n\n\n Tech.prototype.setPoster = function setPoster() {};\n\n /**\n * A method to check for the presence of the 'playsinine' <video> attribute.\n *\n * @abstract\n */\n\n\n Tech.prototype.playsinline = function playsinline() {};\n\n /**\n * A method to set or unset the 'playsinine' <video> attribute.\n *\n * @abstract\n */\n\n\n Tech.prototype.setPlaysinline = function setPlaysinline() {};\n\n /*\n * Check if the tech can support the given mime-type.\n *\n * The base tech does not support any type, but source handlers might\n * overwrite this.\n *\n * @param {string} type\n * The mimetype to check for support\n *\n * @return {string}\n * 'probably', 'maybe', or empty string\n *\n * @see [Spec]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType}\n *\n * @abstract\n */\n\n\n Tech.prototype.canPlayType = function canPlayType() {\n return '';\n };\n\n /**\n * Check if the type is supported by this tech.\n *\n * The base tech does not support any type, but source handlers might\n * overwrite this.\n *\n * @param {string} type\n * The media type to check\n * @return {string} Returns the native video element's response\n */\n\n\n Tech.canPlayType = function canPlayType() {\n return '';\n };\n\n /**\n * Check if the tech can support the given source\n * @param {Object} srcObj\n * The source object\n * @param {Object} options\n * The options passed to the tech\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\n\n\n Tech.canPlaySource = function canPlaySource(srcObj, options) {\n return Tech.canPlayType(srcObj.type);\n };\n\n /*\n * Return whether the argument is a Tech or not.\n * Can be passed either a Class like `Html5` or a instance like `player.tech_`\n *\n * @param {Object} component\n * The item to check\n *\n * @return {boolean}\n * Whether it is a tech or not\n * - True if it is a tech\n * - False if it is not\n */\n\n\n Tech.isTech = function isTech(component) {\n return component.prototype instanceof Tech || component instanceof Tech || component === Tech;\n };\n\n /**\n * Registers a `Tech` into a shared list for videojs.\n *\n * @param {string} name\n * Name of the `Tech` to register.\n *\n * @param {Object} tech\n * The `Tech` class to register.\n */\n\n\n Tech.registerTech = function registerTech(name, tech) {\n if (!Tech.techs_) {\n Tech.techs_ = {};\n }\n\n if (!Tech.isTech(tech)) {\n throw new Error('Tech ' + name + ' must be a Tech');\n }\n\n if (!Tech.canPlayType) {\n throw new Error('Techs must have a static canPlayType method on them');\n }\n if (!Tech.canPlaySource) {\n throw new Error('Techs must have a static canPlaySource method on them');\n }\n\n name = toTitleCase(name);\n\n Tech.techs_[name] = tech;\n if (name !== 'Tech') {\n // camel case the techName for use in techOrder\n Tech.defaultTechOrder_.push(name);\n }\n return tech;\n };\n\n /**\n * Get a `Tech` from the shared list by name.\n *\n * @param {string} name\n * `camelCase` or `TitleCase` name of the Tech to get\n *\n * @return {Tech|undefined}\n * The `Tech` or undefined if there was no tech with the name requsted.\n */\n\n\n Tech.getTech = function getTech(name) {\n if (!name) {\n return;\n }\n\n name = toTitleCase(name);\n\n if (Tech.techs_ && Tech.techs_[name]) {\n return Tech.techs_[name];\n }\n\n if (window && window.videojs && window.videojs[name]) {\n log$1.warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)');\n return window.videojs[name];\n }\n };\n\n return Tech;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n *\n * @returns {VideoTrackList}\n * @method Tech.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n *\n * @returns {AudioTrackList}\n * @method Tech.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.textTracks\n */\n\n/**\n * Get the remote element {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote element {@link HtmlTrackElementList}\n *\n * @returns {HtmlTrackElementList}\n * @method Tech.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name) {\n var props = ALL[name];\n\n Tech.prototype[props.getterName] = function () {\n this[props.privateName] = this[props.privateName] || new props.ListClass();\n return this[props.privateName];\n };\n});\n\n/**\n * List of associated text tracks\n *\n * @type {TextTrackList}\n * @private\n * @property Tech#textTracks_\n */\n\n/**\n * List of associated audio tracks.\n *\n * @type {AudioTrackList}\n * @private\n * @property Tech#audioTracks_\n */\n\n/**\n * List of associated video tracks.\n *\n * @type {VideoTrackList}\n * @private\n * @property Tech#videoTracks_\n */\n\n/**\n * Boolean indicating wether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresVolumeControl = true;\n\n/**\n * Boolean indicating whether the `Tech` supports muting volume.\n *\n * @type {bolean}\n * @default\n */\nTech.prototype.featuresMuteControl = true;\n\n/**\n * Boolean indicating whether the `Tech` supports fullscreen resize control.\n * Resizing plugins using request fullscreen reloads the plugin\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresFullscreenResize = false;\n\n/**\n * Boolean indicating wether the `Tech` supports changing the speed at which the video\n * plays. Examples:\n * - Set player to play 2x (twice) as fast\n * - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresPlaybackRate = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `progress` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualProgressOn} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresProgressEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `sourceset` event.\n *\n * A tech should set this to `true` and then use {@link Tech#triggerSourceset}\n * to trigger a {@link Tech#event:sourceset} at the earliest time after getting\n * a new source.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresSourceset = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `timeupdate` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualTimeUpdates} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresTimeupdateEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the native `TextTrack`s.\n * This will help us integrate with native `TextTrack`s if the browser supports them.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresNativeTextTracks = false;\n\n/**\n * A functional mixin for techs that want to use the Source Handler pattern.\n * Source handlers are scripts for handling specific formats.\n * The source handler pattern is used for adaptive formats (HLS, DASH) that\n * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n * Example: `Tech.withSourceHandlers.call(MyTech);`\n *\n * @param {Tech} _Tech\n * The tech to add source handler functions to.\n *\n * @mixes Tech~SourceHandlerAdditions\n */\nTech.withSourceHandlers = function (_Tech) {\n\n /**\n * Register a source handler\n *\n * @param {Function} handler\n * The source handler class\n *\n * @param {number} [index]\n * Register it at the following index\n */\n _Tech.registerSourceHandler = function (handler, index) {\n var handlers = _Tech.sourceHandlers;\n\n if (!handlers) {\n handlers = _Tech.sourceHandlers = [];\n }\n\n if (index === undefined) {\n // add to the end of the list\n index = handlers.length;\n }\n\n handlers.splice(index, 0, handler);\n };\n\n /**\n * Check if the tech can support the given type. Also checks the\n * Techs sourceHandlers.\n *\n * @param {string} type\n * The mimetype to check.\n *\n * @return {string}\n * 'probably', 'maybe', or '' (empty string)\n */\n _Tech.canPlayType = function (type) {\n var handlers = _Tech.sourceHandlers || [];\n var can = void 0;\n\n for (var i = 0; i < handlers.length; i++) {\n can = handlers[i].canPlayType(type);\n\n if (can) {\n return can;\n }\n }\n\n return '';\n };\n\n /**\n * Returns the first source handler that supports the source.\n *\n * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n *\n * @param {Tech~SourceObject} source\n * The source object\n *\n * @param {Object} options\n * The options passed to the tech\n *\n * @return {SourceHandler|null}\n * The first source handler that supports the source or null if\n * no SourceHandler supports the source\n */\n _Tech.selectSourceHandler = function (source, options) {\n var handlers = _Tech.sourceHandlers || [];\n var can = void 0;\n\n for (var i = 0; i < handlers.length; i++) {\n can = handlers[i].canHandleSource(source, options);\n\n if (can) {\n return handlers[i];\n }\n }\n\n return null;\n };\n\n /**\n * Check if the tech can support the given source.\n *\n * @param {Tech~SourceObject} srcObj\n * The source object\n *\n * @param {Object} options\n * The options passed to the tech\n *\n * @return {string}\n * 'probably', 'maybe', or '' (empty string)\n */\n _Tech.canPlaySource = function (srcObj, options) {\n var sh = _Tech.selectSourceHandler(srcObj, options);\n\n if (sh) {\n return sh.canHandleSource(srcObj, options);\n }\n\n return '';\n };\n\n /**\n * When using a source handler, prefer its implementation of\n * any function normally provided by the tech.\n */\n var deferrable = ['seekable', 'seeking', 'duration'];\n\n /**\n * A wrapper around {@link Tech#seekable} that will call a `SourceHandler`s seekable\n * function if it exists, with a fallback to the Techs seekable function.\n *\n * @method _Tech.seekable\n */\n\n /**\n * A wrapper around {@link Tech#duration} that will call a `SourceHandler`s duration\n * function if it exists, otherwise it will fallback to the techs duration function.\n *\n * @method _Tech.duration\n */\n\n deferrable.forEach(function (fnName) {\n var originalFn = this[fnName];\n\n if (typeof originalFn !== 'function') {\n return;\n }\n\n this[fnName] = function () {\n if (this.sourceHandler_ && this.sourceHandler_[fnName]) {\n return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);\n }\n return originalFn.apply(this, arguments);\n };\n }, _Tech.prototype);\n\n /**\n * Create a function for setting the source using a source object\n * and source handlers.\n * Should never be called unless a source handler was found.\n *\n * @param {Tech~SourceObject} source\n * A source object with src and type keys\n */\n _Tech.prototype.setSource = function (source) {\n var sh = _Tech.selectSourceHandler(source, this.options_);\n\n if (!sh) {\n // Fall back to a native source hander when unsupported sources are\n // deliberately set\n if (_Tech.nativeSourceHandler) {\n sh = _Tech.nativeSourceHandler;\n } else {\n log$1.error('No source hander found for the current source.');\n }\n }\n\n // Dispose any existing source handler\n this.disposeSourceHandler();\n this.off('dispose', this.disposeSourceHandler);\n\n if (sh !== _Tech.nativeSourceHandler) {\n this.currentSource_ = source;\n }\n\n this.sourceHandler_ = sh.handleSource(source, this, this.options_);\n this.on('dispose', this.disposeSourceHandler);\n };\n\n /**\n * Clean up any existing SourceHandlers and listeners when the Tech is disposed.\n *\n * @listens Tech#dispose\n */\n _Tech.prototype.disposeSourceHandler = function () {\n // if we have a source and get another one\n // then we are loading something new\n // than clear all of our current tracks\n if (this.currentSource_) {\n this.clearTracks(['audio', 'video']);\n this.currentSource_ = null;\n }\n\n // always clean up auto-text tracks\n this.cleanupAutoTextTracks();\n\n if (this.sourceHandler_) {\n\n if (this.sourceHandler_.dispose) {\n this.sourceHandler_.dispose();\n }\n\n this.sourceHandler_ = null;\n }\n };\n};\n\n// The base Tech class needs to be registered as a Component. It is the only\n// Tech that can be registered as a Component.\nComponent.registerComponent('Tech', Tech);\nTech.registerTech('Tech', Tech);\n\n/**\n * A list of techs that should be added to techOrder on Players\n *\n * @private\n */\nTech.defaultTechOrder_ = [];\n\nvar middlewares = {};\nvar middlewareInstances = {};\n\nvar TERMINATOR = {};\n\nfunction use(type, middleware) {\n middlewares[type] = middlewares[type] || [];\n middlewares[type].push(middleware);\n}\n\n\n\nfunction setSource(player, src, next) {\n player.setTimeout(function () {\n return setSourceHelper(src, middlewares[src.type], next, player);\n }, 1);\n}\n\nfunction setTech(middleware, tech) {\n middleware.forEach(function (mw) {\n return mw.setTech && mw.setTech(tech);\n });\n}\n\n/**\n * Calls a getter on the tech first, through each middleware\n * from right to left to the player.\n */\nfunction get$1(middleware, tech, method) {\n return middleware.reduceRight(middlewareIterator(method), tech[method]());\n}\n\n/**\n * Takes the argument given to the player and calls the setter method on each\n * middlware from left to right to the tech.\n */\nfunction set$1(middleware, tech, method, arg) {\n return tech[method](middleware.reduce(middlewareIterator(method), arg));\n}\n\n/**\n * Takes the argument given to the player and calls the `call` version of the method\n * on each middleware from left to right.\n * Then, call the passed in method on the tech and return the result unchanged\n * back to the player, through middleware, this time from right to left.\n */\nfunction mediate(middleware, tech, method) {\n var arg = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var callMethod = 'call' + toTitleCase(method);\n var middlewareValue = middleware.reduce(middlewareIterator(callMethod), arg);\n var terminated = middlewareValue === TERMINATOR;\n var returnValue = terminated ? null : tech[method](middlewareValue);\n\n executeRight(middleware, method, returnValue, terminated);\n\n return returnValue;\n}\n\nvar allowedGetters = {\n buffered: 1,\n currentTime: 1,\n duration: 1,\n seekable: 1,\n played: 1,\n paused: 1\n};\n\nvar allowedSetters = {\n setCurrentTime: 1\n};\n\nvar allowedMediators = {\n play: 1,\n pause: 1\n};\n\nfunction middlewareIterator(method) {\n return function (value, mw) {\n // if the previous middleware terminated, pass along the termination\n if (value === TERMINATOR) {\n return TERMINATOR;\n }\n\n if (mw[method]) {\n return mw[method](value);\n }\n\n return value;\n };\n}\n\nfunction executeRight(mws, method, value, terminated) {\n for (var i = mws.length - 1; i >= 0; i--) {\n var mw = mws[i];\n\n if (mw[method]) {\n mw[method](terminated, value);\n }\n }\n}\n\nfunction clearCacheForPlayer(player) {\n middlewareInstances[player.id()] = null;\n}\n\n/**\n * {\n * [playerId]: [[mwFactory, mwInstance], ...]\n * }\n */\nfunction getOrCreateFactory(player, mwFactory) {\n var mws = middlewareInstances[player.id()];\n var mw = null;\n\n if (mws === undefined || mws === null) {\n mw = mwFactory(player);\n middlewareInstances[player.id()] = [[mwFactory, mw]];\n return mw;\n }\n\n for (var i = 0; i < mws.length; i++) {\n var _mws$i = mws[i],\n mwf = _mws$i[0],\n mwi = _mws$i[1];\n\n\n if (mwf !== mwFactory) {\n continue;\n }\n\n mw = mwi;\n }\n\n if (mw === null) {\n mw = mwFactory(player);\n mws.push([mwFactory, mw]);\n }\n\n return mw;\n}\n\nfunction setSourceHelper() {\n var src = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var middleware = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var next = arguments[2];\n var player = arguments[3];\n var acc = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n var lastRun = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var mwFactory = middleware[0],\n mwrest = middleware.slice(1);\n\n // if mwFactory is a string, then we're at a fork in the road\n\n if (typeof mwFactory === 'string') {\n setSourceHelper(src, middlewares[mwFactory], next, player, acc, lastRun);\n\n // if we have an mwFactory, call it with the player to get the mw,\n // then call the mw's setSource method\n } else if (mwFactory) {\n var mw = getOrCreateFactory(player, mwFactory);\n\n // if setSource isn't present, implicitly select this middleware\n if (!mw.setSource) {\n acc.push(mw);\n return setSourceHelper(src, mwrest, next, player, acc, lastRun);\n }\n\n mw.setSource(assign({}, src), function (err, _src) {\n\n // something happened, try the next middleware on the current level\n // make sure to use the old src\n if (err) {\n return setSourceHelper(src, mwrest, next, player, acc, lastRun);\n }\n\n // we've succeeded, now we need to go deeper\n acc.push(mw);\n\n // if it's the same type, continue down the current chain\n // otherwise, we want to go down the new chain\n setSourceHelper(_src, src.type === _src.type ? mwrest : middlewares[_src.type], next, player, acc, lastRun);\n });\n } else if (mwrest.length) {\n setSourceHelper(src, mwrest, next, player, acc, lastRun);\n } else if (lastRun) {\n next(src, acc);\n } else {\n setSourceHelper(src, middlewares['*'], next, player, acc, true);\n }\n}\n\n/**\n * Mimetypes\n *\n * @see http://hul.harvard.edu/ois/////systems/wax/wax-public-help/mimetypes.htm\n * @typedef Mimetypes~Kind\n * @enum\n */\nvar MimetypesKind = {\n opus: 'video/ogg',\n ogv: 'video/ogg',\n mp4: 'video/mp4',\n mov: 'video/mp4',\n m4v: 'video/mp4',\n mkv: 'video/x-matroska',\n mp3: 'audio/mpeg',\n aac: 'audio/aac',\n oga: 'audio/ogg',\n m3u8: 'application/x-mpegURL'\n};\n\n/**\n * Get the mimetype of a given src url if possible\n *\n * @param {string} src\n * The url to the src\n *\n * @return {string}\n * return the mimetype if it was known or empty string otherwise\n */\nvar getMimetype = function getMimetype() {\n var src = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n var ext = getFileExtension(src);\n var mimetype = MimetypesKind[ext.toLowerCase()];\n\n return mimetype || '';\n};\n\n/**\n * Find the mime type of a given source string if possible. Uses the player\n * source cache.\n *\n * @param {Player} player\n * The player object\n *\n * @param {string} src\n * The source string\n *\n * @return {string}\n * The type that was found\n */\nvar findMimetype = function findMimetype(player, src) {\n if (!src) {\n return '';\n }\n\n // 1. check for the type in the `source` cache\n if (player.cache_.source.src === src && player.cache_.source.type) {\n return player.cache_.source.type;\n }\n\n // 2. see if we have this source in our `currentSources` cache\n var matchingSources = player.cache_.sources.filter(function (s) {\n return s.src === src;\n });\n\n if (matchingSources.length) {\n return matchingSources[0].type;\n }\n\n // 3. look for the src url in source elements and use the type there\n var sources = player.$$('source');\n\n for (var i = 0; i < sources.length; i++) {\n var s = sources[i];\n\n if (s.type && s.src && s.src === src) {\n return s.type;\n }\n }\n\n // 4. finally fallback to our list of mime types based on src url extension\n return getMimetype(src);\n};\n\n/**\n * @module filter-source\n */\n/**\n * Filter out single bad source objects or multiple source objects in an\n * array. Also flattens nested source object arrays into a 1 dimensional\n * array of source objects.\n *\n * @param {Tech~SourceObject|Tech~SourceObject[]} src\n * The src object to filter\n *\n * @return {Tech~SourceObject[]}\n * An array of sourceobjects containing only valid sources\n *\n * @private\n */\nvar filterSource = function filterSource(src) {\n // traverse array\n if (Array.isArray(src)) {\n var newsrc = [];\n\n src.forEach(function (srcobj) {\n srcobj = filterSource(srcobj);\n\n if (Array.isArray(srcobj)) {\n newsrc = newsrc.concat(srcobj);\n } else if (isObject(srcobj)) {\n newsrc.push(srcobj);\n }\n });\n\n src = newsrc;\n } else if (typeof src === 'string' && src.trim()) {\n // convert string into object\n src = [fixSource({ src: src })];\n } else if (isObject(src) && typeof src.src === 'string' && src.src && src.src.trim()) {\n // src is already valid\n src = [fixSource(src)];\n } else {\n // invalid source, turn it into an empty array\n src = [];\n }\n\n return src;\n};\n\n/**\n * Checks src mimetype, adding it when possible\n *\n * @param {Tech~SourceObject} src\n * The src object to check\n * @return {Tech~SourceObject}\n * src Object with known type\n */\nfunction fixSource(src) {\n var mimetype = getMimetype(src.src);\n\n if (!src.type && mimetype) {\n src.type = mimetype;\n }\n\n return src;\n}\n\n/**\n * @file loader.js\n */\n/**\n * The `MediaLoader` is the `Component` that decides which playback technology to load\n * when a player is initialized.\n *\n * @extends Component\n */\n\nvar MediaLoader = function (_Component) {\n inherits(MediaLoader, _Component);\n\n /**\n * Create an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should attach to.\n *\n * @param {Object} [options]\n * The key/value stroe of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function that is run when this component is ready.\n */\n function MediaLoader(player, options, ready) {\n classCallCheck(this, MediaLoader);\n\n // MediaLoader has no element\n var options_ = mergeOptions({ createEl: false }, options);\n\n // If there are no sources when the player is initialized,\n // load the first supported playback technology.\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options_, ready));\n\n if (!options.playerOptions.sources || options.playerOptions.sources.length === 0) {\n for (var i = 0, j = options.playerOptions.techOrder; i < j.length; i++) {\n var techName = toTitleCase(j[i]);\n var tech = Tech.getTech(techName);\n\n // Support old behavior of techs being registered as components.\n // Remove once that deprecated behavior is removed.\n if (!techName) {\n tech = Component.getComponent(techName);\n }\n\n // Check if the browser supports this technology\n if (tech && tech.isSupported()) {\n player.loadTech_(techName);\n break;\n }\n }\n } else {\n // Loop through playback technologies (HTML5, Flash) and check for support.\n // Then load the best source.\n // A few assumptions here:\n // All playback technologies respect preload false.\n player.src(options.playerOptions.sources);\n }\n return _this;\n }\n\n return MediaLoader;\n}(Component);\n\nComponent.registerComponent('MediaLoader', MediaLoader);\n\n/**\n * @file button.js\n */\n/**\n * Clickable Component which is clickable or keyboard actionable,\n * but is not a native HTML button.\n *\n * @extends Component\n */\n\nvar ClickableComponent = function (_Component) {\n inherits(ClickableComponent, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function ClickableComponent(player, options) {\n classCallCheck(this, ClickableComponent);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.emitTapEvents();\n\n _this.enable();\n return _this;\n }\n\n /**\n * Create the `Component`s DOM element.\n *\n * @param {string} [tag=div]\n * The element's node type.\n *\n * @param {Object} [props={}]\n * An object of properties that should be set on the element.\n *\n * @param {Object} [attributes={}]\n * An object of attributes that should be set on the element.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n ClickableComponent.prototype.createEl = function createEl$$1() {\n var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n props = assign({\n innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n className: this.buildCSSClass(),\n tabIndex: 0\n }, props);\n\n if (tag === 'button') {\n log$1.error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.');\n }\n\n // Add ARIA attributes for clickable element which is not a native HTML button\n attributes = assign({\n role: 'button'\n }, attributes);\n\n this.tabIndex_ = props.tabIndex;\n\n var el = _Component.prototype.createEl.call(this, tag, props, attributes);\n\n this.createControlTextEl(el);\n\n return el;\n };\n\n ClickableComponent.prototype.dispose = function dispose() {\n // remove controlTextEl_ on dipose\n this.controlTextEl_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Create a control text element on this `Component`\n *\n * @param {Element} [el]\n * Parent element for the control text.\n *\n * @return {Element}\n * The control text element that gets created.\n */\n\n\n ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) {\n this.controlTextEl_ = createEl('span', {\n className: 'vjs-control-text'\n }, {\n // let the screen reader user know that the text of the element may change\n 'aria-live': 'polite'\n });\n\n if (el) {\n el.appendChild(this.controlTextEl_);\n }\n\n this.controlText(this.controlText_, el);\n\n return this.controlTextEl_;\n };\n\n /**\n * Get or set the localize text to use for the controls on the `Component`.\n *\n * @param {string} [text]\n * Control text for element.\n *\n * @param {Element} [el=this.el()]\n * Element to set the title on.\n *\n * @return {string}\n * - The control text when getting\n */\n\n\n ClickableComponent.prototype.controlText = function controlText(text) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.el();\n\n if (text === undefined) {\n return this.controlText_ || 'Need Text';\n }\n\n var localizedText = this.localize(text);\n\n this.controlText_ = text;\n textContent(this.controlTextEl_, localizedText);\n if (!this.nonIconControl) {\n // Set title attribute if only an icon is shown\n el.setAttribute('title', localizedText);\n }\n };\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n ClickableComponent.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Enable this `Component`s element.\n */\n\n\n ClickableComponent.prototype.enable = function enable() {\n if (!this.enabled_) {\n this.enabled_ = true;\n this.removeClass('vjs-disabled');\n this.el_.setAttribute('aria-disabled', 'false');\n if (typeof this.tabIndex_ !== 'undefined') {\n this.el_.setAttribute('tabIndex', this.tabIndex_);\n }\n this.on(['tap', 'click'], this.handleClick);\n this.on('focus', this.handleFocus);\n this.on('blur', this.handleBlur);\n }\n };\n\n /**\n * Disable this `Component`s element.\n */\n\n\n ClickableComponent.prototype.disable = function disable() {\n this.enabled_ = false;\n this.addClass('vjs-disabled');\n this.el_.setAttribute('aria-disabled', 'true');\n if (typeof this.tabIndex_ !== 'undefined') {\n this.el_.removeAttribute('tabIndex');\n }\n this.off(['tap', 'click'], this.handleClick);\n this.off('focus', this.handleFocus);\n this.off('blur', this.handleBlur);\n };\n\n /**\n * This gets called when a `ClickableComponent` gets:\n * - Clicked (via the `click` event, listening starts in the constructor)\n * - Tapped (via the `tap` event, listening starts in the constructor)\n * - The following things happen in order:\n * 1. {@link ClickableComponent#handleFocus} is called via a `focus` event on the\n * `ClickableComponent`.\n * 2. {@link ClickableComponent#handleFocus} adds a listener for `keydown` on using\n * {@link ClickableComponent#handleKeyPress}.\n * 3. `ClickableComponent` has not had a `blur` event (`blur` means that focus was lost). The user presses\n * the space or enter key.\n * 4. {@link ClickableComponent#handleKeyPress} calls this function with the `keydown`\n * event as a parameter.\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n * @abstract\n */\n\n\n ClickableComponent.prototype.handleClick = function handleClick(event) {};\n\n /**\n * This gets called when a `ClickableComponent` gains focus via a `focus` event.\n * Turns on listening for `keydown` events. When they happen it\n * calls `this.handleKeyPress`.\n *\n * @param {EventTarget~Event} event\n * The `focus` event that caused this function to be called.\n *\n * @listens focus\n */\n\n\n ClickableComponent.prototype.handleFocus = function handleFocus(event) {\n on(document, 'keydown', bind(this, this.handleKeyPress));\n };\n\n /**\n * Called when this ClickableComponent has focus and a key gets pressed down. By\n * default it will call `this.handleClick` when the key is space or enter.\n *\n * @param {EventTarget~Event} event\n * The `keydown` event that caused this function to be called.\n *\n * @listens keydown\n */\n\n\n ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) {\n\n // Support Space (32) or Enter (13) key operation to fire a click event\n if (event.which === 32 || event.which === 13) {\n event.preventDefault();\n this.trigger('click');\n } else if (_Component.prototype.handleKeyPress) {\n\n // Pass keypress handling up for unsupported keys\n _Component.prototype.handleKeyPress.call(this, event);\n }\n };\n\n /**\n * Called when a `ClickableComponent` loses focus. Turns off the listener for\n * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n *\n * @param {EventTarget~Event} event\n * The `blur` event that caused this function to be called.\n *\n * @listens blur\n */\n\n\n ClickableComponent.prototype.handleBlur = function handleBlur(event) {\n off(document, 'keydown', bind(this, this.handleKeyPress));\n };\n\n return ClickableComponent;\n}(Component);\n\nComponent.registerComponent('ClickableComponent', ClickableComponent);\n\n/**\n * @file poster-image.js\n */\n/**\n * A `ClickableComponent` that handles showing the poster image for the player.\n *\n * @extends ClickableComponent\n */\n\nvar PosterImage = function (_ClickableComponent) {\n inherits(PosterImage, _ClickableComponent);\n\n /**\n * Create an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should attach to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function PosterImage(player, options) {\n classCallCheck(this, PosterImage);\n\n var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n _this.update();\n player.on('posterchange', bind(_this, _this.update));\n return _this;\n }\n\n /**\n * Clean up and dispose of the `PosterImage`.\n */\n\n\n PosterImage.prototype.dispose = function dispose() {\n this.player().off('posterchange', this.update);\n _ClickableComponent.prototype.dispose.call(this);\n };\n\n /**\n * Create the `PosterImage`s DOM element.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n PosterImage.prototype.createEl = function createEl$$1() {\n var el = createEl('div', {\n className: 'vjs-poster',\n\n // Don't want poster to be tabbable.\n tabIndex: -1\n });\n\n // To ensure the poster image resizes while maintaining its original aspect\n // ratio, use a div with `background-size` when available. For browsers that\n // do not support `background-size` (e.g. IE8), fall back on using a regular\n // img element.\n if (!BACKGROUND_SIZE_SUPPORTED) {\n this.fallbackImg_ = createEl('img');\n el.appendChild(this.fallbackImg_);\n }\n\n return el;\n };\n\n /**\n * An {@link EventTarget~EventListener} for {@link Player#posterchange} events.\n *\n * @listens Player#posterchange\n *\n * @param {EventTarget~Event} [event]\n * The `Player#posterchange` event that triggered this function.\n */\n\n\n PosterImage.prototype.update = function update(event) {\n var url = this.player().poster();\n\n this.setSrc(url);\n\n // If there's no poster source we should display:none on this component\n // so it's not still clickable or right-clickable\n if (url) {\n this.show();\n } else {\n this.hide();\n }\n };\n\n /**\n * Set the source of the `PosterImage` depending on the display method.\n *\n * @param {string} url\n * The URL to the source for the `PosterImage`.\n */\n\n\n PosterImage.prototype.setSrc = function setSrc(url) {\n if (this.fallbackImg_) {\n this.fallbackImg_.src = url;\n } else {\n var backgroundImage = '';\n\n // Any falsey values should stay as an empty string, otherwise\n // this will throw an extra error\n if (url) {\n backgroundImage = 'url(\"' + url + '\")';\n }\n\n this.el_.style.backgroundImage = backgroundImage;\n }\n };\n\n /**\n * An {@link EventTarget~EventListener} for clicks on the `PosterImage`. See\n * {@link ClickableComponent#handleClick} for instances where this will be triggered.\n *\n * @listens tap\n * @listens click\n * @listens keydown\n *\n * @param {EventTarget~Event} event\n + The `click`, `tap` or `keydown` event that caused this function to be called.\n */\n\n\n PosterImage.prototype.handleClick = function handleClick(event) {\n // We don't want a click to trigger playback when controls are disabled\n if (!this.player_.controls()) {\n return;\n }\n\n if (this.player_.paused()) {\n silencePromise(this.player_.play());\n } else {\n this.player_.pause();\n }\n };\n\n return PosterImage;\n}(ClickableComponent);\n\nComponent.registerComponent('PosterImage', PosterImage);\n\n/**\n * @file text-track-display.js\n */\nvar darkGray = '#222';\nvar lightGray = '#ccc';\nvar fontMap = {\n monospace: 'monospace',\n sansSerif: 'sans-serif',\n serif: 'serif',\n monospaceSansSerif: '\"Andale Mono\", \"Lucida Console\", monospace',\n monospaceSerif: '\"Courier New\", monospace',\n proportionalSansSerif: 'sans-serif',\n proportionalSerif: 'serif',\n casual: '\"Comic Sans MS\", Impact, fantasy',\n script: '\"Monotype Corsiva\", cursive',\n smallcaps: '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * Construct an rgba color from a given hex color code.\n *\n * @param {number} color\n * Hex number for color, like #f0e or #f604e2.\n *\n * @param {number} opacity\n * Value for opacity, 0.0 - 1.0.\n *\n * @return {string}\n * The rgba color that was created, like 'rgba(255, 0, 0, 0.3)'.\n */\nfunction constructColor(color, opacity) {\n var hex = void 0;\n\n if (color.length === 4) {\n // color looks like \"#f0e\"\n hex = color[1] + color[1] + color[2] + color[2] + color[3] + color[3];\n } else if (color.length === 7) {\n // color looks like \"#f604e2\"\n hex = color.slice(1);\n } else {\n throw new Error('Invalid color code provided, ' + color + '; must be formatted as e.g. #f0e or #f604e2.');\n }\n return 'rgba(' + parseInt(hex.slice(0, 2), 16) + ',' + parseInt(hex.slice(2, 4), 16) + ',' + parseInt(hex.slice(4, 6), 16) + ',' + opacity + ')';\n}\n\n/**\n * Try to update the style of a DOM element. Some style changes will throw an error,\n * particularly in IE8. Those should be noops.\n *\n * @param {Element} el\n * The DOM element to be styled.\n *\n * @param {string} style\n * The CSS property on the element that should be styled.\n *\n * @param {string} rule\n * The style rule that should be applied to the property.\n *\n * @private\n */\nfunction tryUpdateStyle(el, style, rule) {\n try {\n el.style[style] = rule;\n } catch (e) {\n\n // Satisfies linter.\n return;\n }\n}\n\n/**\n * The component for displaying text track cues.\n *\n * @extends Component\n */\n\nvar TextTrackDisplay = function (_Component) {\n inherits(TextTrackDisplay, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function to call when `TextTrackDisplay` is ready.\n */\n function TextTrackDisplay(player, options, ready) {\n classCallCheck(this, TextTrackDisplay);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options, ready));\n\n player.on('loadstart', bind(_this, _this.toggleDisplay));\n player.on('texttrackchange', bind(_this, _this.updateDisplay));\n player.on('loadstart', bind(_this, _this.preselectTrack));\n\n // This used to be called during player init, but was causing an error\n // if a track should show by default and the display hadn't loaded yet.\n // Should probably be moved to an external track loader when we support\n // tracks that don't need a display.\n player.ready(bind(_this, function () {\n if (player.tech_ && player.tech_.featuresNativeTextTracks) {\n this.hide();\n return;\n }\n\n player.on('fullscreenchange', bind(this, this.updateDisplay));\n\n var tracks = this.options_.playerOptions.tracks || [];\n\n for (var i = 0; i < tracks.length; i++) {\n this.player_.addRemoteTextTrack(tracks[i], true);\n }\n\n this.preselectTrack();\n }));\n return _this;\n }\n\n /**\n * Preselect a track following this precedence:\n * - matches the previously selected {@link TextTrack}'s language and kind\n * - matches the previously selected {@link TextTrack}'s language only\n * - is the first default captions track\n * - is the first default descriptions track\n *\n * @listens Player#loadstart\n */\n\n\n TextTrackDisplay.prototype.preselectTrack = function preselectTrack() {\n var modes = { captions: 1, subtitles: 1 };\n var trackList = this.player_.textTracks();\n var userPref = this.player_.cache_.selectedLanguage;\n var firstDesc = void 0;\n var firstCaptions = void 0;\n var preferredTrack = void 0;\n\n for (var i = 0; i < trackList.length; i++) {\n var track = trackList[i];\n\n if (userPref && userPref.enabled && userPref.language === track.language) {\n // Always choose the track that matches both language and kind\n if (track.kind === userPref.kind) {\n preferredTrack = track;\n // or choose the first track that matches language\n } else if (!preferredTrack) {\n preferredTrack = track;\n }\n\n // clear everything if offTextTrackMenuItem was clicked\n } else if (userPref && !userPref.enabled) {\n preferredTrack = null;\n firstDesc = null;\n firstCaptions = null;\n } else if (track['default']) {\n if (track.kind === 'descriptions' && !firstDesc) {\n firstDesc = track;\n } else if (track.kind in modes && !firstCaptions) {\n firstCaptions = track;\n }\n }\n }\n\n // The preferredTrack matches the user preference and takes\n // precendence over all the other tracks.\n // So, display the preferredTrack before the first default track\n // and the subtitles/captions track before the descriptions track\n if (preferredTrack) {\n preferredTrack.mode = 'showing';\n } else if (firstCaptions) {\n firstCaptions.mode = 'showing';\n } else if (firstDesc) {\n firstDesc.mode = 'showing';\n }\n };\n\n /**\n * Turn display of {@link TextTrack}'s from the current state into the other state.\n * There are only two states:\n * - 'shown'\n * - 'hidden'\n *\n * @listens Player#loadstart\n */\n\n\n TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {\n if (this.player_.tech_ && this.player_.tech_.featuresNativeTextTracks) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n /**\n * Create the {@link Component}'s DOM element.\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n TextTrackDisplay.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-text-track-display'\n }, {\n 'aria-live': 'off',\n 'aria-atomic': 'true'\n });\n };\n\n /**\n * Clear all displayed {@link TextTrack}s.\n */\n\n\n TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {\n if (typeof window.WebVTT === 'function') {\n window.WebVTT.processCues(window, [], this.el_);\n }\n };\n\n /**\n * Update the displayed TextTrack when a either a {@link Player#texttrackchange} or\n * a {@link Player#fullscreenchange} is fired.\n *\n * @listens Player#texttrackchange\n * @listens Player#fullscreenchange\n */\n\n\n TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {\n var tracks = this.player_.textTracks();\n\n this.clearDisplay();\n\n // Track display prioritization model: if multiple tracks are 'showing',\n // display the first 'subtitles' or 'captions' track which is 'showing',\n // otherwise display the first 'descriptions' track which is 'showing'\n\n var descriptionsTrack = null;\n var captionsSubtitlesTrack = null;\n var i = tracks.length;\n\n while (i--) {\n var track = tracks[i];\n\n if (track.mode === 'showing') {\n if (track.kind === 'descriptions') {\n descriptionsTrack = track;\n } else {\n captionsSubtitlesTrack = track;\n }\n }\n }\n\n if (captionsSubtitlesTrack) {\n if (this.getAttribute('aria-live') !== 'off') {\n this.setAttribute('aria-live', 'off');\n }\n this.updateForTrack(captionsSubtitlesTrack);\n } else if (descriptionsTrack) {\n if (this.getAttribute('aria-live') !== 'assertive') {\n this.setAttribute('aria-live', 'assertive');\n }\n this.updateForTrack(descriptionsTrack);\n }\n };\n\n /**\n * Add an {@link Texttrack} to to the {@link Tech}s {@link TextTrackList}.\n *\n * @param {TextTrack} track\n * Text track object to be added to the list.\n */\n\n\n TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {\n if (typeof window.WebVTT !== 'function' || !track.activeCues) {\n return;\n }\n\n var cues = [];\n\n for (var _i = 0; _i < track.activeCues.length; _i++) {\n cues.push(track.activeCues[_i]);\n }\n\n window.WebVTT.processCues(window, cues, this.el_);\n\n if (!this.player_.textTrackSettings) {\n return;\n }\n\n var overrides = this.player_.textTrackSettings.getValues();\n\n var i = cues.length;\n\n while (i--) {\n var cue = cues[i];\n\n if (!cue) {\n continue;\n }\n\n var cueDiv = cue.displayState;\n\n if (overrides.color) {\n cueDiv.firstChild.style.color = overrides.color;\n }\n if (overrides.textOpacity) {\n tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));\n }\n if (overrides.backgroundColor) {\n cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n }\n if (overrides.backgroundOpacity) {\n tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));\n }\n if (overrides.windowColor) {\n if (overrides.windowOpacity) {\n tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));\n } else {\n cueDiv.style.backgroundColor = overrides.windowColor;\n }\n }\n if (overrides.edgeStyle) {\n if (overrides.edgeStyle === 'dropshadow') {\n cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;\n } else if (overrides.edgeStyle === 'raised') {\n cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;\n } else if (overrides.edgeStyle === 'depressed') {\n cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;\n } else if (overrides.edgeStyle === 'uniform') {\n cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;\n }\n }\n if (overrides.fontPercent && overrides.fontPercent !== 1) {\n var fontSize = window.parseFloat(cueDiv.style.fontSize);\n\n cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';\n cueDiv.style.height = 'auto';\n cueDiv.style.top = 'auto';\n cueDiv.style.bottom = '2px';\n }\n if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n if (overrides.fontFamily === 'small-caps') {\n cueDiv.firstChild.style.fontVariant = 'small-caps';\n } else {\n cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n }\n }\n }\n };\n\n return TextTrackDisplay;\n}(Component);\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\n\n/**\n * @file loading-spinner.js\n */\n/**\n * A loading spinner for use during waiting/loading events.\n *\n * @extends Component\n */\n\nvar LoadingSpinner = function (_Component) {\n inherits(LoadingSpinner, _Component);\n\n function LoadingSpinner() {\n classCallCheck(this, LoadingSpinner);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the `LoadingSpinner`s DOM element.\n *\n * @return {Element}\n * The dom element that gets created.\n */\n LoadingSpinner.prototype.createEl = function createEl$$1() {\n var isAudio = this.player_.isAudio();\n var playerType = this.localize(isAudio ? 'Audio Player' : 'Video Player');\n var controlText = createEl('span', {\n className: 'vjs-control-text',\n innerHTML: this.localize('{1} is loading.', [playerType])\n });\n\n var el = _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-loading-spinner',\n dir: 'ltr'\n });\n\n el.appendChild(controlText);\n\n return el;\n };\n\n return LoadingSpinner;\n}(Component);\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\n\n/**\n * @file button.js\n */\n/**\n * Base class for all buttons.\n *\n * @extends ClickableComponent\n */\n\nvar Button = function (_ClickableComponent) {\n inherits(Button, _ClickableComponent);\n\n function Button() {\n classCallCheck(this, Button);\n return possibleConstructorReturn(this, _ClickableComponent.apply(this, arguments));\n }\n\n /**\n * Create the `Button`s DOM element.\n *\n * @param {string} [tag=\"button\"]\n * The element's node type. This argument is IGNORED: no matter what\n * is passed, it will always create a `button` element.\n *\n * @param {Object} [props={}]\n * An object of properties that should be set on the element.\n *\n * @param {Object} [attributes={}]\n * An object of attributes that should be set on the element.\n *\n * @return {Element}\n * The element that gets created.\n */\n Button.prototype.createEl = function createEl(tag) {\n var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n tag = 'button';\n\n props = assign({\n innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n className: this.buildCSSClass()\n }, props);\n\n // Add attributes for button element\n attributes = assign({\n\n // Necessary since the default button type is \"submit\"\n type: 'button'\n }, attributes);\n\n var el = Component.prototype.createEl.call(this, tag, props, attributes);\n\n this.createControlTextEl(el);\n\n return el;\n };\n\n /**\n * Add a child `Component` inside of this `Button`.\n *\n * @param {string|Component} child\n * The name or instance of a child to add.\n *\n * @param {Object} [options={}]\n * The key/value store of options that will get passed to children of\n * the child.\n *\n * @return {Component}\n * The `Component` that gets added as a child. When using a string the\n * `Component` will get created by this process.\n *\n * @deprecated since version 5\n */\n\n\n Button.prototype.addChild = function addChild(child) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var className = this.constructor.name;\n\n log$1.warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.');\n\n // Avoid the error message generated by ClickableComponent's addChild method\n return Component.prototype.addChild.call(this, child, options);\n };\n\n /**\n * Enable the `Button` element so that it can be activated or clicked. Use this with\n * {@link Button#disable}.\n */\n\n\n Button.prototype.enable = function enable() {\n _ClickableComponent.prototype.enable.call(this);\n this.el_.removeAttribute('disabled');\n };\n\n /**\n * Disable the `Button` element so that it cannot be activated or clicked. Use this with\n * {@link Button#enable}.\n */\n\n\n Button.prototype.disable = function disable() {\n _ClickableComponent.prototype.disable.call(this);\n this.el_.setAttribute('disabled', 'disabled');\n };\n\n /**\n * This gets called when a `Button` has focus and `keydown` is triggered via a key\n * press.\n *\n * @param {EventTarget~Event} event\n * The event that caused this function to get called.\n *\n * @listens keydown\n */\n\n\n Button.prototype.handleKeyPress = function handleKeyPress(event) {\n\n // Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button.\n if (event.which === 32 || event.which === 13) {\n return;\n }\n\n // Pass keypress handling up for unsupported keys\n _ClickableComponent.prototype.handleKeyPress.call(this, event);\n };\n\n return Button;\n}(ClickableComponent);\n\nComponent.registerComponent('Button', Button);\n\n/**\n * @file big-play-button.js\n */\n/**\n * The initial play button that shows before the video has played. The hiding of the\n * `BigPlayButton` get done via CSS and `Player` states.\n *\n * @extends Button\n */\n\nvar BigPlayButton = function (_Button) {\n inherits(BigPlayButton, _Button);\n\n function BigPlayButton(player, options) {\n classCallCheck(this, BigPlayButton);\n\n var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n _this.mouseused_ = false;\n\n _this.on('mousedown', _this.handleMouseDown);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object. Always returns 'vjs-big-play-button'.\n */\n\n\n BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-big-play-button';\n };\n\n /**\n * This gets called when a `BigPlayButton` \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n BigPlayButton.prototype.handleClick = function handleClick(event) {\n var playPromise = this.player_.play();\n\n // exit early if clicked via the mouse\n if (this.mouseused_ && event.clientX && event.clientY) {\n silencePromise(playPromise);\n return;\n }\n\n var cb = this.player_.getChild('controlBar');\n var playToggle = cb && cb.getChild('playToggle');\n\n if (!playToggle) {\n this.player_.focus();\n return;\n }\n\n var playFocus = function playFocus() {\n return playToggle.focus();\n };\n\n if (isPromise(playPromise)) {\n playPromise.then(playFocus, function () {});\n } else {\n this.setTimeout(playFocus, 1);\n }\n };\n\n BigPlayButton.prototype.handleKeyPress = function handleKeyPress(event) {\n this.mouseused_ = false;\n\n _Button.prototype.handleKeyPress.call(this, event);\n };\n\n BigPlayButton.prototype.handleMouseDown = function handleMouseDown(event) {\n this.mouseused_ = true;\n };\n\n return BigPlayButton;\n}(Button);\n\n/**\n * The text that should display over the `BigPlayButton`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\n\n/**\n * @file close-button.js\n */\n/**\n * The `CloseButton` is a `{@link Button}` that fires a `close` event when\n * it gets clicked.\n *\n * @extends Button\n */\n\nvar CloseButton = function (_Button) {\n inherits(CloseButton, _Button);\n\n /**\n * Creates an instance of the this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function CloseButton(player, options) {\n classCallCheck(this, CloseButton);\n\n var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n _this.controlText(options && options.controlText || _this.localize('Close'));\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n CloseButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this);\n };\n\n /**\n * This gets called when a `CloseButton` gets clicked. See\n * {@link ClickableComponent#handleClick} for more information on when this will be\n * triggered\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n * @fires CloseButton#close\n */\n\n\n CloseButton.prototype.handleClick = function handleClick(event) {\n\n /**\n * Triggered when the a `CloseButton` is clicked.\n *\n * @event CloseButton#close\n * @type {EventTarget~Event}\n *\n * @property {boolean} [bubbles=false]\n * set to false so that the close event does not\n * bubble up to parents if there is no listener\n */\n this.trigger({ type: 'close', bubbles: false });\n };\n\n return CloseButton;\n}(Button);\n\nComponent.registerComponent('CloseButton', CloseButton);\n\n/**\n * @file play-toggle.js\n */\n/**\n * Button to toggle between play and pause.\n *\n * @extends Button\n */\n\nvar PlayToggle = function (_Button) {\n inherits(PlayToggle, _Button);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function PlayToggle(player, options) {\n classCallCheck(this, PlayToggle);\n\n var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n _this.on(player, 'play', _this.handlePlay);\n _this.on(player, 'pause', _this.handlePause);\n _this.on(player, 'ended', _this.handleEnded);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n PlayToggle.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);\n };\n\n /**\n * This gets called when an `PlayToggle` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n PlayToggle.prototype.handleClick = function handleClick(event) {\n if (this.player_.paused()) {\n this.player_.play();\n } else {\n this.player_.pause();\n }\n };\n\n /**\n * This gets called once after the video has ended and the user seeks so that\n * we can change the replay button back to a play button.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#seeked\n */\n\n\n PlayToggle.prototype.handleSeeked = function handleSeeked(event) {\n this.removeClass('vjs-ended');\n\n if (this.player_.paused()) {\n this.handlePause(event);\n } else {\n this.handlePlay(event);\n }\n };\n\n /**\n * Add the vjs-playing class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#play\n */\n\n\n PlayToggle.prototype.handlePlay = function handlePlay(event) {\n this.removeClass('vjs-ended');\n this.removeClass('vjs-paused');\n this.addClass('vjs-playing');\n // change the button text to \"Pause\"\n this.controlText('Pause');\n };\n\n /**\n * Add the vjs-paused class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#pause\n */\n\n\n PlayToggle.prototype.handlePause = function handlePause(event) {\n this.removeClass('vjs-playing');\n this.addClass('vjs-paused');\n // change the button text to \"Play\"\n this.controlText('Play');\n };\n\n /**\n * Add the vjs-ended class to the element so it can change appearance\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#ended\n */\n\n\n PlayToggle.prototype.handleEnded = function handleEnded(event) {\n this.removeClass('vjs-playing');\n this.addClass('vjs-ended');\n // change the button text to \"Replay\"\n this.controlText('Replay');\n\n // on the next seek remove the replay button\n this.one(this.player_, 'seeked', this.handleSeeked);\n };\n\n return PlayToggle;\n}(Button);\n\n/**\n * The text that should display over the `PlayToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\n\n/**\n * @file format-time.js\n * @module format-time\n */\n\n/**\n* Format seconds as a time string, H:MM:SS or M:SS. Supplying a guide (in seconds)\n* will force a number of leading zeros to cover the length of the guide.\n*\n* @param {number} seconds\n* Number of seconds to be turned into a string\n*\n* @param {number} guide\n* Number (in seconds) to model the string after\n*\n* @return {string}\n* Time formatted as H:MM:SS or M:SS\n*/\nvar defaultImplementation = function defaultImplementation(seconds, guide) {\n seconds = seconds < 0 ? 0 : seconds;\n var s = Math.floor(seconds % 60);\n var m = Math.floor(seconds / 60 % 60);\n var h = Math.floor(seconds / 3600);\n var gm = Math.floor(guide / 60 % 60);\n var gh = Math.floor(guide / 3600);\n\n // handle invalid times\n if (isNaN(seconds) || seconds === Infinity) {\n // '-' is false for all relational operators (e.g. <, >=) so this setting\n // will add the minimum number of fields specified by the guide\n h = m = s = '-';\n }\n\n // Check if we need to show hours\n h = h > 0 || gh > 0 ? h + ':' : '';\n\n // If hours are showing, we may need to add a leading zero.\n // Always show at least one digit of minutes.\n m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';\n\n // Check if leading zero is need for seconds\n s = s < 10 ? '0' + s : s;\n\n return h + m + s;\n};\n\nvar implementation = defaultImplementation;\n\n/**\n * Replaces the default formatTime implementation with a custom implementation.\n *\n * @param {Function} customImplementation\n * A function which will be used in place of the default formatTime implementation.\n * Will receive the current time in seconds and the guide (in seconds) as arguments.\n */\nfunction setFormatTime(customImplementation) {\n implementation = customImplementation;\n}\n\n/**\n * Resets formatTime to the default implementation.\n */\nfunction resetFormatTime() {\n implementation = defaultImplementation;\n}\n\nvar formatTime = function (seconds) {\n var guide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : seconds;\n\n return implementation(seconds, guide);\n};\n\n/**\n * @file time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar TimeDisplay = function (_Component) {\n inherits(TimeDisplay, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function TimeDisplay(player, options) {\n classCallCheck(this, TimeDisplay);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.throttledUpdateContent = throttle(bind(_this, _this.updateContent), 25);\n _this.on(player, 'timeupdate', _this.throttledUpdateContent);\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n TimeDisplay.prototype.createEl = function createEl$$1(plainName) {\n var className = this.buildCSSClass();\n var el = _Component.prototype.createEl.call(this, 'div', {\n className: className + ' vjs-time-control vjs-control',\n innerHTML: '<span class=\"vjs-control-text\">' + this.localize(this.labelText_) + '\\xA0</span>'\n });\n\n this.contentEl_ = createEl('span', {\n className: className + '-display'\n }, {\n // tell screen readers not to automatically read the time as it changes\n 'aria-live': 'off'\n });\n\n this.updateTextNode_();\n el.appendChild(this.contentEl_);\n return el;\n };\n\n TimeDisplay.prototype.dispose = function dispose() {\n this.contentEl_ = null;\n this.textNode_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Updates the \"remaining time\" text node with new content using the\n * contents of the `formattedTime_` property.\n *\n * @private\n */\n\n\n TimeDisplay.prototype.updateTextNode_ = function updateTextNode_() {\n if (!this.contentEl_) {\n return;\n }\n\n while (this.contentEl_.firstChild) {\n this.contentEl_.removeChild(this.contentEl_.firstChild);\n }\n\n this.textNode_ = document.createTextNode(this.formattedTime_ || this.formatTime_(0));\n this.contentEl_.appendChild(this.textNode_);\n };\n\n /**\n * Generates a formatted time for this component to use in display.\n *\n * @param {number} time\n * A numeric time, in seconds.\n *\n * @return {string}\n * A formatted time\n *\n * @private\n */\n\n\n TimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n return formatTime(time);\n };\n\n /**\n * Updates the time display text node if it has what was passed in changed\n * the formatted time.\n *\n * @param {number} time\n * The time to update to\n *\n * @private\n */\n\n\n TimeDisplay.prototype.updateFormattedTime_ = function updateFormattedTime_(time) {\n var formattedTime = this.formatTime_(time);\n\n if (formattedTime === this.formattedTime_) {\n return;\n }\n\n this.formattedTime_ = formattedTime;\n this.requestAnimationFrame(this.updateTextNode_);\n };\n\n /**\n * To be filled out in the child class, should update the displayed time\n * in accordance with the fact that the current time has changed.\n *\n * @param {EventTarget~Event} [event]\n * The `timeupdate` event that caused this to run.\n *\n * @listens Player#timeupdate\n */\n\n\n TimeDisplay.prototype.updateContent = function updateContent(event) {};\n\n return TimeDisplay;\n}(Component);\n\n/**\n * The text that is added to the `TimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nTimeDisplay.prototype.labelText_ = 'Time';\n\n/**\n * The text that should display over the `TimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nTimeDisplay.prototype.controlText_ = 'Time';\n\nComponent.registerComponent('TimeDisplay', TimeDisplay);\n\n/**\n * @file current-time-display.js\n */\n/**\n * Displays the current time\n *\n * @extends Component\n */\n\nvar CurrentTimeDisplay = function (_TimeDisplay) {\n inherits(CurrentTimeDisplay, _TimeDisplay);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function CurrentTimeDisplay(player, options) {\n classCallCheck(this, CurrentTimeDisplay);\n\n var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n _this.on(player, 'ended', _this.handleEnded);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n CurrentTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-current-time';\n };\n\n /**\n * Update current time display\n *\n * @param {EventTarget~Event} [event]\n * The `timeupdate` event that caused this function to run.\n *\n * @listens Player#timeupdate\n */\n\n\n CurrentTimeDisplay.prototype.updateContent = function updateContent(event) {\n // Allows for smooth scrubbing, when player can't keep up.\n var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n\n this.updateFormattedTime_(time);\n };\n\n /**\n * When the player fires ended there should be no time left. Sadly\n * this is not always the case, lets make it seem like that is the case\n * for users.\n *\n * @param {EventTarget~Event} [event]\n * The `ended` event that caused this to run.\n *\n * @listens Player#ended\n */\n\n\n CurrentTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n if (!this.player_.duration()) {\n return;\n }\n this.updateFormattedTime_(this.player_.duration());\n };\n\n return CurrentTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `CurrentTimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nCurrentTimeDisplay.prototype.labelText_ = 'Current Time';\n\n/**\n * The text that should display over the `CurrentTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nCurrentTimeDisplay.prototype.controlText_ = 'Current Time';\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\n\n/**\n * @file duration-display.js\n */\n/**\n * Displays the duration\n *\n * @extends Component\n */\n\nvar DurationDisplay = function (_TimeDisplay) {\n inherits(DurationDisplay, _TimeDisplay);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function DurationDisplay(player, options) {\n classCallCheck(this, DurationDisplay);\n\n // we do not want to/need to throttle duration changes,\n // as they should always display the changed duration as\n // it has changed\n var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n _this.on(player, 'durationchange', _this.updateContent);\n\n // Also listen for timeupdate (in the parent) and loadedmetadata because removing those\n // listeners could have broken dependent applications/libraries. These\n // can likely be removed for 7.0.\n _this.on(player, 'loadedmetadata', _this.throttledUpdateContent);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n DurationDisplay.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-duration';\n };\n\n /**\n * Update duration time display.\n *\n * @param {EventTarget~Event} [event]\n * The `durationchange`, `timeupdate`, or `loadedmetadata` event that caused\n * this function to be called.\n *\n * @listens Player#durationchange\n * @listens Player#timeupdate\n * @listens Player#loadedmetadata\n */\n\n\n DurationDisplay.prototype.updateContent = function updateContent(event) {\n var duration = this.player_.duration();\n\n if (duration && this.duration_ !== duration) {\n this.duration_ = duration;\n this.updateFormattedTime_(duration);\n }\n };\n\n return DurationDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `DurationDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nDurationDisplay.prototype.labelText_ = 'Duration';\n\n/**\n * The text that should display over the `DurationDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nDurationDisplay.prototype.controlText_ = 'Duration';\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\n\n/**\n * @file time-divider.js\n */\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @extends Component\n */\n\nvar TimeDivider = function (_Component) {\n inherits(TimeDivider, _Component);\n\n function TimeDivider() {\n classCallCheck(this, TimeDivider);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the component's DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n TimeDivider.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-time-control vjs-time-divider',\n innerHTML: '<div><span>/</span></div>'\n });\n };\n\n return TimeDivider;\n}(Component);\n\nComponent.registerComponent('TimeDivider', TimeDivider);\n\n/**\n * @file remaining-time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar RemainingTimeDisplay = function (_TimeDisplay) {\n inherits(RemainingTimeDisplay, _TimeDisplay);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function RemainingTimeDisplay(player, options) {\n classCallCheck(this, RemainingTimeDisplay);\n\n var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n _this.on(player, 'durationchange', _this.throttledUpdateContent);\n _this.on(player, 'ended', _this.handleEnded);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n RemainingTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-remaining-time';\n };\n\n /**\n * The remaining time display prefixes numbers with a \"minus\" character.\n *\n * @param {number} time\n * A numeric time, in seconds.\n *\n * @return {string}\n * A formatted time\n *\n * @private\n */\n\n\n RemainingTimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n // TODO: The \"-\" should be decorative, and not announced by a screen reader\n return '-' + _TimeDisplay.prototype.formatTime_.call(this, time);\n };\n\n /**\n * Update remaining time display.\n *\n * @param {EventTarget~Event} [event]\n * The `timeupdate` or `durationchange` event that caused this to run.\n *\n * @listens Player#timeupdate\n * @listens Player#durationchange\n */\n\n\n RemainingTimeDisplay.prototype.updateContent = function updateContent(event) {\n if (!this.player_.duration()) {\n return;\n }\n\n // @deprecated We should only use remainingTimeDisplay\n // as of video.js 7\n if (this.player_.remainingTimeDisplay) {\n this.updateFormattedTime_(this.player_.remainingTimeDisplay());\n } else {\n this.updateFormattedTime_(this.player_.remainingTime());\n }\n };\n\n /**\n * When the player fires ended there should be no time left. Sadly\n * this is not always the case, lets make it seem like that is the case\n * for users.\n *\n * @param {EventTarget~Event} [event]\n * The `ended` event that caused this to run.\n *\n * @listens Player#ended\n */\n\n\n RemainingTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n if (!this.player_.duration()) {\n return;\n }\n this.updateFormattedTime_(0);\n };\n\n return RemainingTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `RemainingTimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nRemainingTimeDisplay.prototype.labelText_ = 'Remaining Time';\n\n/**\n * The text that should display over the `RemainingTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nRemainingTimeDisplay.prototype.controlText_ = 'Remaining Time';\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\n\n/**\n * @file live-display.js\n */\n// TODO - Future make it click to snap to live\n\n/**\n * Displays the live indicator when duration is Infinity.\n *\n * @extends Component\n */\n\nvar LiveDisplay = function (_Component) {\n inherits(LiveDisplay, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function LiveDisplay(player, options) {\n classCallCheck(this, LiveDisplay);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.updateShowing();\n _this.on(_this.player(), 'durationchange', _this.updateShowing);\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n LiveDisplay.prototype.createEl = function createEl$$1() {\n var el = _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-live-control vjs-control'\n });\n\n this.contentEl_ = createEl('div', {\n className: 'vjs-live-display',\n innerHTML: '<span class=\"vjs-control-text\">' + this.localize('Stream Type') + '\\xA0</span>' + this.localize('LIVE')\n }, {\n 'aria-live': 'off'\n });\n\n el.appendChild(this.contentEl_);\n return el;\n };\n\n LiveDisplay.prototype.dispose = function dispose() {\n this.contentEl_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Check the duration to see if the LiveDisplay should be showing or not. Then show/hide\n * it accordingly\n *\n * @param {EventTarget~Event} [event]\n * The {@link Player#durationchange} event that caused this function to run.\n *\n * @listens Player#durationchange\n */\n\n\n LiveDisplay.prototype.updateShowing = function updateShowing(event) {\n if (this.player().duration() === Infinity) {\n this.show();\n } else {\n this.hide();\n }\n };\n\n return LiveDisplay;\n}(Component);\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\n\n/**\n * @file slider.js\n */\n/**\n * The base functionality for a slider. Can be vertical or horizontal.\n * For instance the volume bar or the seek bar on a video is a slider.\n *\n * @extends Component\n */\n\nvar Slider = function (_Component) {\n inherits(Slider, _Component);\n\n /**\n * Create an instance of this class\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function Slider(player, options) {\n classCallCheck(this, Slider);\n\n // Set property names to bar to match with the child Slider class is looking for\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.bar = _this.getChild(_this.options_.barName);\n\n // Set a horizontal or vertical class on the slider depending on the slider type\n _this.vertical(!!_this.options_.vertical);\n\n _this.enable();\n return _this;\n }\n\n /**\n * Are controls are currently enabled for this slider or not.\n *\n * @return {boolean}\n * true if controls are enabled, false otherwise\n */\n\n\n Slider.prototype.enabled = function enabled() {\n return this.enabled_;\n };\n\n /**\n * Enable controls for this slider if they are disabled\n */\n\n\n Slider.prototype.enable = function enable() {\n if (this.enabled()) {\n return;\n }\n\n this.on('mousedown', this.handleMouseDown);\n this.on('touchstart', this.handleMouseDown);\n this.on('focus', this.handleFocus);\n this.on('blur', this.handleBlur);\n this.on('click', this.handleClick);\n\n this.on(this.player_, 'controlsvisible', this.update);\n\n if (this.playerEvent) {\n this.on(this.player_, this.playerEvent, this.update);\n }\n\n this.removeClass('disabled');\n this.setAttribute('tabindex', 0);\n\n this.enabled_ = true;\n };\n\n /**\n * Disable controls for this slider if they are enabled\n */\n\n\n Slider.prototype.disable = function disable() {\n if (!this.enabled()) {\n return;\n }\n var doc = this.bar.el_.ownerDocument;\n\n this.off('mousedown', this.handleMouseDown);\n this.off('touchstart', this.handleMouseDown);\n this.off('focus', this.handleFocus);\n this.off('blur', this.handleBlur);\n this.off('click', this.handleClick);\n this.off(this.player_, 'controlsvisible', this.update);\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n this.removeAttribute('tabindex');\n\n this.addClass('disabled');\n\n if (this.playerEvent) {\n this.off(this.player_, this.playerEvent, this.update);\n }\n this.enabled_ = false;\n };\n\n /**\n * Create the `Button`s DOM element.\n *\n * @param {string} type\n * Type of element to create.\n *\n * @param {Object} [props={}]\n * List of properties in Object form.\n *\n * @param {Object} [attributes={}]\n * list of attributes in Object form.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n Slider.prototype.createEl = function createEl$$1(type) {\n var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n // Add the slider element class to all sub classes\n props.className = props.className + ' vjs-slider';\n props = assign({\n tabIndex: 0\n }, props);\n\n attributes = assign({\n 'role': 'slider',\n 'aria-valuenow': 0,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'tabIndex': 0\n }, attributes);\n\n return _Component.prototype.createEl.call(this, type, props, attributes);\n };\n\n /**\n * Handle `mousedown` or `touchstart` events on the `Slider`.\n *\n * @param {EventTarget~Event} event\n * `mousedown` or `touchstart` event that triggered this function\n *\n * @listens mousedown\n * @listens touchstart\n * @fires Slider#slideractive\n */\n\n\n Slider.prototype.handleMouseDown = function handleMouseDown(event) {\n var doc = this.bar.el_.ownerDocument;\n\n if (event.type === 'mousedown') {\n event.preventDefault();\n }\n // Do not call preventDefault() on touchstart in Chrome\n // to avoid console warnings. Use a 'touch-action: none' style\n // instead to prevent unintented scrolling.\n // https://developers.google.com/web/updates/2017/01/scrolling-intervention\n if (event.type === 'touchstart' && !IS_CHROME) {\n event.preventDefault();\n }\n blockTextSelection();\n\n this.addClass('vjs-sliding');\n /**\n * Triggered when the slider is in an active state\n *\n * @event Slider#slideractive\n * @type {EventTarget~Event}\n */\n this.trigger('slideractive');\n\n this.on(doc, 'mousemove', this.handleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchmove', this.handleMouseMove);\n this.on(doc, 'touchend', this.handleMouseUp);\n\n this.handleMouseMove(event);\n };\n\n /**\n * Handle the `mousemove`, `touchmove`, and `mousedown` events on this `Slider`.\n * The `mousemove` and `touchmove` events will only only trigger this function during\n * `mousedown` and `touchstart`. This is due to {@link Slider#handleMouseDown} and\n * {@link Slider#handleMouseUp}.\n *\n * @param {EventTarget~Event} event\n * `mousedown`, `mousemove`, `touchstart`, or `touchmove` event that triggered\n * this function\n *\n * @listens mousemove\n * @listens touchmove\n */\n\n\n Slider.prototype.handleMouseMove = function handleMouseMove(event) {};\n\n /**\n * Handle `mouseup` or `touchend` events on the `Slider`.\n *\n * @param {EventTarget~Event} event\n * `mouseup` or `touchend` event that triggered this function.\n *\n * @listens touchend\n * @listens mouseup\n * @fires Slider#sliderinactive\n */\n\n\n Slider.prototype.handleMouseUp = function handleMouseUp() {\n var doc = this.bar.el_.ownerDocument;\n\n unblockTextSelection();\n\n this.removeClass('vjs-sliding');\n /**\n * Triggered when the slider is no longer in an active state.\n *\n * @event Slider#sliderinactive\n * @type {EventTarget~Event}\n */\n this.trigger('sliderinactive');\n\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n\n this.update();\n };\n\n /**\n * Update the progress bar of the `Slider`.\n *\n * @returns {number}\n * The percentage of progress the progress bar represents as a\n * number from 0 to 1.\n */\n\n\n Slider.prototype.update = function update() {\n\n // In VolumeBar init we have a setTimeout for update that pops and update\n // to the end of the execution stack. The player is destroyed before then\n // update will cause an error\n if (!this.el_) {\n return;\n }\n\n // If scrubbing, we could use a cached value to make the handle keep up\n // with the user's mouse. On HTML5 browsers scrubbing is really smooth, but\n // some flash players are slow, so we might want to utilize this later.\n // var progress = (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n var progress = this.getPercent();\n var bar = this.bar;\n\n // If there's no bar...\n if (!bar) {\n return;\n }\n\n // Protect against no duration and other division issues\n if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {\n progress = 0;\n }\n\n // Convert to a percentage for setting\n var percentage = (progress * 100).toFixed(2) + '%';\n var style = bar.el().style;\n\n // Set the new bar width or height\n if (this.vertical()) {\n style.height = percentage;\n } else {\n style.width = percentage;\n }\n\n return progress;\n };\n\n /**\n * Calculate distance for slider\n *\n * @param {EventTarget~Event} event\n * The event that caused this function to run.\n *\n * @return {number}\n * The current position of the Slider.\n * - postition.x for vertical `Slider`s\n * - postition.y for horizontal `Slider`s\n */\n\n\n Slider.prototype.calculateDistance = function calculateDistance(event) {\n var position = getPointerPosition(this.el_, event);\n\n if (this.vertical()) {\n return position.y;\n }\n return position.x;\n };\n\n /**\n * Handle a `focus` event on this `Slider`.\n *\n * @param {EventTarget~Event} event\n * The `focus` event that caused this function to run.\n *\n * @listens focus\n */\n\n\n Slider.prototype.handleFocus = function handleFocus() {\n this.on(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n };\n\n /**\n * Handle a `keydown` event on the `Slider`. Watches for left, rigth, up, and down\n * arrow keys. This function will only be called when the slider has focus. See\n * {@link Slider#handleFocus} and {@link Slider#handleBlur}.\n *\n * @param {EventTarget~Event} event\n * the `keydown` event that caused this function to run.\n *\n * @listens keydown\n */\n\n\n Slider.prototype.handleKeyPress = function handleKeyPress(event) {\n // Left and Down Arrows\n if (event.which === 37 || event.which === 40) {\n event.preventDefault();\n this.stepBack();\n\n // Up and Right Arrows\n } else if (event.which === 38 || event.which === 39) {\n event.preventDefault();\n this.stepForward();\n }\n };\n\n /**\n * Handle a `blur` event on this `Slider`.\n *\n * @param {EventTarget~Event} event\n * The `blur` event that caused this function to run.\n *\n * @listens blur\n */\n\n Slider.prototype.handleBlur = function handleBlur() {\n this.off(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n };\n\n /**\n * Listener for click events on slider, used to prevent clicks\n * from bubbling up to parent elements like button menus.\n *\n * @param {Object} event\n * Event that caused this object to run\n */\n\n\n Slider.prototype.handleClick = function handleClick(event) {\n event.stopImmediatePropagation();\n event.preventDefault();\n };\n\n /**\n * Get/set if slider is horizontal for vertical\n *\n * @param {boolean} [bool]\n * - true if slider is vertical,\n * - false is horizontal\n *\n * @return {boolean}\n * - true if slider is vertical, and getting\n * - false if the slider is horizontal, and getting\n */\n\n\n Slider.prototype.vertical = function vertical(bool) {\n if (bool === undefined) {\n return this.vertical_ || false;\n }\n\n this.vertical_ = !!bool;\n\n if (this.vertical_) {\n this.addClass('vjs-slider-vertical');\n } else {\n this.addClass('vjs-slider-horizontal');\n }\n };\n\n return Slider;\n}(Component);\n\nComponent.registerComponent('Slider', Slider);\n\n/**\n * @file load-progress-bar.js\n */\n/**\n * Shows loading progress\n *\n * @extends Component\n */\n\nvar LoadProgressBar = function (_Component) {\n inherits(LoadProgressBar, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function LoadProgressBar(player, options) {\n classCallCheck(this, LoadProgressBar);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.partEls_ = [];\n _this.on(player, 'progress', _this.update);\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n LoadProgressBar.prototype.createEl = function createEl$$1() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-load-progress',\n innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Loaded') + '</span>: 0%</span>'\n });\n };\n\n LoadProgressBar.prototype.dispose = function dispose() {\n this.partEls_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Update progress bar\n *\n * @param {EventTarget~Event} [event]\n * The `progress` event that caused this function to run.\n *\n * @listens Player#progress\n */\n\n\n LoadProgressBar.prototype.update = function update(event) {\n var buffered = this.player_.buffered();\n var duration = this.player_.duration();\n var bufferedEnd = this.player_.bufferedEnd();\n var children = this.partEls_;\n\n // get the percent width of a time compared to the total end\n var percentify = function percentify(time, end) {\n // no NaN\n var percent = time / end || 0;\n\n return (percent >= 1 ? 1 : percent) * 100 + '%';\n };\n\n // update the width of the progress bar\n this.el_.style.width = percentify(bufferedEnd, duration);\n\n // add child elements to represent the individual buffered time ranges\n for (var i = 0; i < buffered.length; i++) {\n var start = buffered.start(i);\n var end = buffered.end(i);\n var part = children[i];\n\n if (!part) {\n part = this.el_.appendChild(createEl());\n children[i] = part;\n }\n\n // set the percent based on the width of the progress bar (bufferedEnd)\n part.style.left = percentify(start, bufferedEnd);\n part.style.width = percentify(end - start, bufferedEnd);\n }\n\n // remove unused buffered range elements\n for (var _i = children.length; _i > buffered.length; _i--) {\n this.el_.removeChild(children[_i - 1]);\n }\n children.length = buffered.length;\n };\n\n return LoadProgressBar;\n}(Component);\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\n\n/**\n * @file time-tooltip.js\n */\n/**\n * Time tooltips display a time above the progress bar.\n *\n * @extends Component\n */\n\nvar TimeTooltip = function (_Component) {\n inherits(TimeTooltip, _Component);\n\n function TimeTooltip() {\n classCallCheck(this, TimeTooltip);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the time tooltip DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n TimeTooltip.prototype.createEl = function createEl$$1() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-time-tooltip'\n });\n };\n\n /**\n * Updates the position of the time tooltip relative to the `SeekBar`.\n *\n * @param {Object} seekBarRect\n * The `ClientRect` for the {@link SeekBar} element.\n *\n * @param {number} seekBarPoint\n * A number from 0 to 1, representing a horizontal reference point\n * from the left edge of the {@link SeekBar}\n */\n\n\n TimeTooltip.prototype.update = function update(seekBarRect, seekBarPoint, content) {\n var tooltipRect = getBoundingClientRect(this.el_);\n var playerRect = getBoundingClientRect(this.player_.el());\n var seekBarPointPx = seekBarRect.width * seekBarPoint;\n\n // do nothing if either rect isn't available\n // for example, if the player isn't in the DOM for testing\n if (!playerRect || !tooltipRect) {\n return;\n }\n\n // This is the space left of the `seekBarPoint` available within the bounds\n // of the player. We calculate any gap between the left edge of the player\n // and the left edge of the `SeekBar` and add the number of pixels in the\n // `SeekBar` before hitting the `seekBarPoint`\n var spaceLeftOfPoint = seekBarRect.left - playerRect.left + seekBarPointPx;\n\n // This is the space right of the `seekBarPoint` available within the bounds\n // of the player. We calculate the number of pixels from the `seekBarPoint`\n // to the right edge of the `SeekBar` and add to that any gap between the\n // right edge of the `SeekBar` and the player.\n var spaceRightOfPoint = seekBarRect.width - seekBarPointPx + (playerRect.right - seekBarRect.right);\n\n // This is the number of pixels by which the tooltip will need to be pulled\n // further to the right to center it over the `seekBarPoint`.\n var pullTooltipBy = tooltipRect.width / 2;\n\n // Adjust the `pullTooltipBy` distance to the left or right depending on\n // the results of the space calculations above.\n if (spaceLeftOfPoint < pullTooltipBy) {\n pullTooltipBy += pullTooltipBy - spaceLeftOfPoint;\n } else if (spaceRightOfPoint < pullTooltipBy) {\n pullTooltipBy = spaceRightOfPoint;\n }\n\n // Due to the imprecision of decimal/ratio based calculations and varying\n // rounding behaviors, there are cases where the spacing adjustment is off\n // by a pixel or two. This adds insurance to these calculations.\n if (pullTooltipBy < 0) {\n pullTooltipBy = 0;\n } else if (pullTooltipBy > tooltipRect.width) {\n pullTooltipBy = tooltipRect.width;\n }\n\n this.el_.style.right = '-' + pullTooltipBy + 'px';\n textContent(this.el_, content);\n };\n\n return TimeTooltip;\n}(Component);\n\nComponent.registerComponent('TimeTooltip', TimeTooltip);\n\n/**\n * @file play-progress-bar.js\n */\n/**\n * Used by {@link SeekBar} to display media playback progress as part of the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar PlayProgressBar = function (_Component) {\n inherits(PlayProgressBar, _Component);\n\n function PlayProgressBar() {\n classCallCheck(this, PlayProgressBar);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the the DOM element for this class.\n *\n * @return {Element}\n * The element that was created.\n */\n PlayProgressBar.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-play-progress vjs-slider-bar',\n innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Progress') + '</span>: 0%</span>'\n });\n };\n\n /**\n * Enqueues updates to its own DOM as well as the DOM of its\n * {@link TimeTooltip} child.\n *\n * @param {Object} seekBarRect\n * The `ClientRect` for the {@link SeekBar} element.\n *\n * @param {number} seekBarPoint\n * A number from 0 to 1, representing a horizontal reference point\n * from the left edge of the {@link SeekBar}\n */\n\n\n PlayProgressBar.prototype.update = function update(seekBarRect, seekBarPoint) {\n var _this2 = this;\n\n // If there is an existing rAF ID, cancel it so we don't over-queue.\n if (this.rafId_) {\n this.cancelAnimationFrame(this.rafId_);\n }\n\n this.rafId_ = this.requestAnimationFrame(function () {\n var time = _this2.player_.scrubbing() ? _this2.player_.getCache().currentTime : _this2.player_.currentTime();\n\n var content = formatTime(time, _this2.player_.duration());\n var timeTooltip = _this2.getChild('timeTooltip');\n\n if (timeTooltip) {\n timeTooltip.update(seekBarRect, seekBarPoint, content);\n }\n });\n };\n\n return PlayProgressBar;\n}(Component);\n\n/**\n * Default options for {@link PlayProgressBar}.\n *\n * @type {Object}\n * @private\n */\n\n\nPlayProgressBar.prototype.options_ = {\n children: []\n};\n\n// Time tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n PlayProgressBar.prototype.options_.children.push('timeTooltip');\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\n\n/**\n * @file mouse-time-display.js\n */\n/**\n * The {@link MouseTimeDisplay} component tracks mouse movement over the\n * {@link ProgressControl}. It displays an indicator and a {@link TimeTooltip}\n * indicating the time which is represented by a given point in the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar MouseTimeDisplay = function (_Component) {\n inherits(MouseTimeDisplay, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The {@link Player} that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function MouseTimeDisplay(player, options) {\n classCallCheck(this, MouseTimeDisplay);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.update = throttle(bind(_this, _this.update), 25);\n return _this;\n }\n\n /**\n * Create the DOM element for this class.\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n MouseTimeDisplay.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-mouse-display'\n });\n };\n\n /**\n * Enqueues updates to its own DOM as well as the DOM of its\n * {@link TimeTooltip} child.\n *\n * @param {Object} seekBarRect\n * The `ClientRect` for the {@link SeekBar} element.\n *\n * @param {number} seekBarPoint\n * A number from 0 to 1, representing a horizontal reference point\n * from the left edge of the {@link SeekBar}\n */\n\n\n MouseTimeDisplay.prototype.update = function update(seekBarRect, seekBarPoint) {\n var _this2 = this;\n\n // If there is an existing rAF ID, cancel it so we don't over-queue.\n if (this.rafId_) {\n this.cancelAnimationFrame(this.rafId_);\n }\n\n this.rafId_ = this.requestAnimationFrame(function () {\n var duration = _this2.player_.duration();\n var content = formatTime(seekBarPoint * duration, duration);\n\n _this2.el_.style.left = seekBarRect.width * seekBarPoint + 'px';\n _this2.getChild('timeTooltip').update(seekBarRect, seekBarPoint, content);\n });\n };\n\n return MouseTimeDisplay;\n}(Component);\n\n/**\n * Default options for `MouseTimeDisplay`\n *\n * @type {Object}\n * @private\n */\n\n\nMouseTimeDisplay.prototype.options_ = {\n children: ['timeTooltip']\n};\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\n\n/**\n * @file seek-bar.js\n */\n// The number of seconds the `step*` functions move the timeline.\nvar STEP_SECONDS = 5;\n\n// The interval at which the bar should update as it progresses.\nvar UPDATE_REFRESH_INTERVAL = 30;\n\n/**\n * Seek bar and container for the progress bars. Uses {@link PlayProgressBar}\n * as its `bar`.\n *\n * @extends Slider\n */\n\nvar SeekBar = function (_Slider) {\n inherits(SeekBar, _Slider);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function SeekBar(player, options) {\n classCallCheck(this, SeekBar);\n\n var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n _this.setEventHandlers_();\n return _this;\n }\n\n /**\n * Sets the event handlers\n *\n * @private\n */\n\n\n SeekBar.prototype.setEventHandlers_ = function setEventHandlers_() {\n var _this2 = this;\n\n this.update = throttle(bind(this, this.update), UPDATE_REFRESH_INTERVAL);\n\n this.on(this.player_, 'timeupdate', this.update);\n this.on(this.player_, 'ended', this.handleEnded);\n\n // when playing, let's ensure we smoothly update the play progress bar\n // via an interval\n this.updateInterval = null;\n\n this.on(this.player_, ['playing'], function () {\n _this2.clearInterval(_this2.updateInterval);\n\n _this2.updateInterval = _this2.setInterval(function () {\n _this2.requestAnimationFrame(function () {\n _this2.update();\n });\n }, UPDATE_REFRESH_INTERVAL);\n });\n\n this.on(this.player_, ['ended', 'pause', 'waiting'], function () {\n _this2.clearInterval(_this2.updateInterval);\n });\n\n this.on(this.player_, ['timeupdate', 'ended'], this.update);\n };\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n SeekBar.prototype.createEl = function createEl$$1() {\n return _Slider.prototype.createEl.call(this, 'div', {\n className: 'vjs-progress-holder'\n }, {\n 'aria-label': this.localize('Progress Bar')\n });\n };\n\n /**\n * This function updates the play progress bar and accessiblity\n * attributes to whatever is passed in.\n *\n * @param {number} currentTime\n * The currentTime value that should be used for accessiblity\n *\n * @param {number} percent\n * The percentage as a decimal that the bar should be filled from 0-1.\n *\n * @private\n */\n\n\n SeekBar.prototype.update_ = function update_(currentTime, percent) {\n var duration = this.player_.duration();\n\n // machine readable value of progress bar (percentage complete)\n this.el_.setAttribute('aria-valuenow', (percent * 100).toFixed(2));\n\n // human readable value of progress bar (time complete)\n this.el_.setAttribute('aria-valuetext', this.localize('progress bar timing: currentTime={1} duration={2}', [formatTime(currentTime, duration), formatTime(duration, duration)], '{1} of {2}'));\n\n // Update the `PlayProgressBar`.\n this.bar.update(getBoundingClientRect(this.el_), percent);\n };\n\n /**\n * Update the seek bar's UI.\n *\n * @param {EventTarget~Event} [event]\n * The `timeupdate` or `ended` event that caused this to run.\n *\n * @listens Player#timeupdate\n *\n * @returns {number}\n * The current percent at a number from 0-1\n */\n\n\n SeekBar.prototype.update = function update(event) {\n var percent = _Slider.prototype.update.call(this);\n\n this.update_(this.getCurrentTime_(), percent);\n return percent;\n };\n\n /**\n * Get the value of current time but allows for smooth scrubbing,\n * when player can't keep up.\n *\n * @return {number}\n * The current time value to display\n *\n * @private\n */\n\n\n SeekBar.prototype.getCurrentTime_ = function getCurrentTime_() {\n return this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n };\n\n /**\n * We want the seek bar to be full on ended\n * no matter what the actual internal values are. so we force it.\n *\n * @param {EventTarget~Event} [event]\n * The `timeupdate` or `ended` event that caused this to run.\n *\n * @listens Player#ended\n */\n\n\n SeekBar.prototype.handleEnded = function handleEnded(event) {\n this.update_(this.player_.duration(), 1);\n };\n\n /**\n * Get the percentage of media played so far.\n *\n * @return {number}\n * The percentage of media played so far (0 to 1).\n */\n\n\n SeekBar.prototype.getPercent = function getPercent() {\n var percent = this.getCurrentTime_() / this.player_.duration();\n\n return percent >= 1 ? 1 : percent;\n };\n\n /**\n * Handle mouse down on seek bar\n *\n * @param {EventTarget~Event} event\n * The `mousedown` event that caused this to run.\n *\n * @listens mousedown\n */\n\n\n SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {\n if (!isSingleLeftClick(event)) {\n return;\n }\n\n // Stop event propagation to prevent double fire in progress-control.js\n event.stopPropagation();\n this.player_.scrubbing(true);\n\n this.videoWasPlaying = !this.player_.paused();\n this.player_.pause();\n\n _Slider.prototype.handleMouseDown.call(this, event);\n };\n\n /**\n * Handle mouse move on seek bar\n *\n * @param {EventTarget~Event} event\n * The `mousemove` event that caused this to run.\n *\n * @listens mousemove\n */\n\n\n SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {\n if (!isSingleLeftClick(event)) {\n return;\n }\n\n var newTime = this.calculateDistance(event) * this.player_.duration();\n\n // Don't let video end while scrubbing.\n if (newTime === this.player_.duration()) {\n newTime = newTime - 0.1;\n }\n\n // Set new time (tell player to seek to new time)\n this.player_.currentTime(newTime);\n };\n\n SeekBar.prototype.enable = function enable() {\n _Slider.prototype.enable.call(this);\n var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n if (!mouseTimeDisplay) {\n return;\n }\n\n mouseTimeDisplay.show();\n };\n\n SeekBar.prototype.disable = function disable() {\n _Slider.prototype.disable.call(this);\n var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n if (!mouseTimeDisplay) {\n return;\n }\n\n mouseTimeDisplay.hide();\n };\n\n /**\n * Handle mouse up on seek bar\n *\n * @param {EventTarget~Event} event\n * The `mouseup` event that caused this to run.\n *\n * @listens mouseup\n */\n\n\n SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {\n _Slider.prototype.handleMouseUp.call(this, event);\n\n // Stop event propagation to prevent double fire in progress-control.js\n if (event) {\n event.stopPropagation();\n }\n this.player_.scrubbing(false);\n\n /**\n * Trigger timeupdate because we're done seeking and the time has changed.\n * This is particularly useful for if the player is paused to time the time displays.\n *\n * @event Tech#timeupdate\n * @type {EventTarget~Event}\n */\n this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n if (this.videoWasPlaying) {\n silencePromise(this.player_.play());\n }\n };\n\n /**\n * Move more quickly fast forward for keyboard-only users\n */\n\n\n SeekBar.prototype.stepForward = function stepForward() {\n this.player_.currentTime(this.player_.currentTime() + STEP_SECONDS);\n };\n\n /**\n * Move more quickly rewind for keyboard-only users\n */\n\n\n SeekBar.prototype.stepBack = function stepBack() {\n this.player_.currentTime(this.player_.currentTime() - STEP_SECONDS);\n };\n\n /**\n * Toggles the playback state of the player\n * This gets called when enter or space is used on the seekbar\n *\n * @param {EventTarget~Event} event\n * The `keydown` event that caused this function to be called\n *\n */\n\n\n SeekBar.prototype.handleAction = function handleAction(event) {\n if (this.player_.paused()) {\n this.player_.play();\n } else {\n this.player_.pause();\n }\n };\n\n /**\n * Called when this SeekBar has focus and a key gets pressed down. By\n * default it will call `this.handleAction` when the key is space or enter.\n *\n * @param {EventTarget~Event} event\n * The `keydown` event that caused this function to be called.\n *\n * @listens keydown\n */\n\n\n SeekBar.prototype.handleKeyPress = function handleKeyPress(event) {\n\n // Support Space (32) or Enter (13) key operation to fire a click event\n if (event.which === 32 || event.which === 13) {\n event.preventDefault();\n this.handleAction(event);\n } else if (_Slider.prototype.handleKeyPress) {\n\n // Pass keypress handling up for unsupported keys\n _Slider.prototype.handleKeyPress.call(this, event);\n }\n };\n\n return SeekBar;\n}(Slider);\n\n/**\n * Default options for the `SeekBar`\n *\n * @type {Object}\n * @private\n */\n\n\nSeekBar.prototype.options_ = {\n children: ['loadProgressBar', 'playProgressBar'],\n barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n SeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\n\n/**\n * @file progress-control.js\n */\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress.\n *\n * @extends Component\n */\n\nvar ProgressControl = function (_Component) {\n inherits(ProgressControl, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function ProgressControl(player, options) {\n classCallCheck(this, ProgressControl);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.handleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n _this.throttledHandleMouseSeek = throttle(bind(_this, _this.handleMouseSeek), 25);\n\n _this.enable();\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n ProgressControl.prototype.createEl = function createEl$$1() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-progress-control vjs-control'\n });\n };\n\n /**\n * When the mouse moves over the `ProgressControl`, the pointer position\n * gets passed down to the `MouseTimeDisplay` component.\n *\n * @param {EventTarget~Event} event\n * The `mousemove` event that caused this function to run.\n *\n * @listen mousemove\n */\n\n\n ProgressControl.prototype.handleMouseMove = function handleMouseMove(event) {\n var seekBar = this.getChild('seekBar');\n\n if (seekBar) {\n var mouseTimeDisplay = seekBar.getChild('mouseTimeDisplay');\n var seekBarEl = seekBar.el();\n var seekBarRect = getBoundingClientRect(seekBarEl);\n var seekBarPoint = getPointerPosition(seekBarEl, event).x;\n\n // The default skin has a gap on either side of the `SeekBar`. This means\n // that it's possible to trigger this behavior outside the boundaries of\n // the `SeekBar`. This ensures we stay within it at all times.\n if (seekBarPoint > 1) {\n seekBarPoint = 1;\n } else if (seekBarPoint < 0) {\n seekBarPoint = 0;\n }\n\n if (mouseTimeDisplay) {\n mouseTimeDisplay.update(seekBarRect, seekBarPoint);\n }\n }\n };\n\n /**\n * A throttled version of the {@link ProgressControl#handleMouseSeek} listener.\n *\n * @method ProgressControl#throttledHandleMouseSeek\n * @param {EventTarget~Event} event\n * The `mousemove` event that caused this function to run.\n *\n * @listen mousemove\n * @listen touchmove\n */\n\n /**\n * Handle `mousemove` or `touchmove` events on the `ProgressControl`.\n *\n * @param {EventTarget~Event} event\n * `mousedown` or `touchstart` event that triggered this function\n *\n * @listens mousemove\n * @listens touchmove\n */\n\n\n ProgressControl.prototype.handleMouseSeek = function handleMouseSeek(event) {\n var seekBar = this.getChild('seekBar');\n\n if (seekBar) {\n seekBar.handleMouseMove(event);\n }\n };\n\n /**\n * Are controls are currently enabled for this progress control.\n *\n * @return {boolean}\n * true if controls are enabled, false otherwise\n */\n\n\n ProgressControl.prototype.enabled = function enabled() {\n return this.enabled_;\n };\n\n /**\n * Disable all controls on the progress control and its children\n */\n\n\n ProgressControl.prototype.disable = function disable() {\n this.children().forEach(function (child) {\n return child.disable && child.disable();\n });\n\n if (!this.enabled()) {\n return;\n }\n\n this.off(['mousedown', 'touchstart'], this.handleMouseDown);\n this.off(this.el_, 'mousemove', this.handleMouseMove);\n this.handleMouseUp();\n\n this.addClass('disabled');\n\n this.enabled_ = false;\n };\n\n /**\n * Enable all controls on the progress control and its children\n */\n\n\n ProgressControl.prototype.enable = function enable() {\n this.children().forEach(function (child) {\n return child.enable && child.enable();\n });\n\n if (this.enabled()) {\n return;\n }\n\n this.on(['mousedown', 'touchstart'], this.handleMouseDown);\n this.on(this.el_, 'mousemove', this.handleMouseMove);\n this.removeClass('disabled');\n\n this.enabled_ = true;\n };\n\n /**\n * Handle `mousedown` or `touchstart` events on the `ProgressControl`.\n *\n * @param {EventTarget~Event} event\n * `mousedown` or `touchstart` event that triggered this function\n *\n * @listens mousedown\n * @listens touchstart\n */\n\n\n ProgressControl.prototype.handleMouseDown = function handleMouseDown(event) {\n var doc = this.el_.ownerDocument;\n var seekBar = this.getChild('seekBar');\n\n if (seekBar) {\n seekBar.handleMouseDown(event);\n }\n\n this.on(doc, 'mousemove', this.throttledHandleMouseSeek);\n this.on(doc, 'touchmove', this.throttledHandleMouseSeek);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchend', this.handleMouseUp);\n };\n\n /**\n * Handle `mouseup` or `touchend` events on the `ProgressControl`.\n *\n * @param {EventTarget~Event} event\n * `mouseup` or `touchend` event that triggered this function.\n *\n * @listens touchend\n * @listens mouseup\n */\n\n\n ProgressControl.prototype.handleMouseUp = function handleMouseUp(event) {\n var doc = this.el_.ownerDocument;\n var seekBar = this.getChild('seekBar');\n\n if (seekBar) {\n seekBar.handleMouseUp(event);\n }\n\n this.off(doc, 'mousemove', this.throttledHandleMouseSeek);\n this.off(doc, 'touchmove', this.throttledHandleMouseSeek);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchend', this.handleMouseUp);\n };\n\n return ProgressControl;\n}(Component);\n\n/**\n * Default options for `ProgressControl`\n *\n * @type {Object}\n * @private\n */\n\n\nProgressControl.prototype.options_ = {\n children: ['seekBar']\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\n\n/**\n * @file fullscreen-toggle.js\n */\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n */\n\nvar FullscreenToggle = function (_Button) {\n inherits(FullscreenToggle, _Button);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function FullscreenToggle(player, options) {\n classCallCheck(this, FullscreenToggle);\n\n var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n _this.on(player, 'fullscreenchange', _this.handleFullscreenChange);\n\n if (document[FullscreenApi.fullscreenEnabled] === false) {\n _this.disable();\n }\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Handles fullscreenchange on the player and change control text accordingly.\n *\n * @param {EventTarget~Event} [event]\n * The {@link Player#fullscreenchange} event that caused this function to be\n * called.\n *\n * @listens Player#fullscreenchange\n */\n\n\n FullscreenToggle.prototype.handleFullscreenChange = function handleFullscreenChange(event) {\n if (this.player_.isFullscreen()) {\n this.controlText('Non-Fullscreen');\n } else {\n this.controlText('Fullscreen');\n }\n };\n\n /**\n * This gets called when an `FullscreenToggle` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n FullscreenToggle.prototype.handleClick = function handleClick(event) {\n if (!this.player_.isFullscreen()) {\n this.player_.requestFullscreen();\n } else {\n this.player_.exitFullscreen();\n }\n };\n\n return FullscreenToggle;\n}(Button);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\n\n/**\n * Check if volume control is supported and if it isn't hide the\n * `Component` that was passed using the `vjs-hidden` class.\n *\n * @param {Component} self\n * The component that should be hidden if volume is unsupported\n *\n * @param {Player} player\n * A reference to the player\n *\n * @private\n */\nvar checkVolumeSupport = function checkVolumeSupport(self, player) {\n // hide volume controls when they're not supported by the current tech\n if (player.tech_ && !player.tech_.featuresVolumeControl) {\n self.addClass('vjs-hidden');\n }\n\n self.on(player, 'loadstart', function () {\n if (!player.tech_.featuresVolumeControl) {\n self.addClass('vjs-hidden');\n } else {\n self.removeClass('vjs-hidden');\n }\n });\n};\n\n/**\n * @file volume-level.js\n */\n/**\n * Shows volume level\n *\n * @extends Component\n */\n\nvar VolumeLevel = function (_Component) {\n inherits(VolumeLevel, _Component);\n\n function VolumeLevel() {\n classCallCheck(this, VolumeLevel);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n VolumeLevel.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-volume-level',\n innerHTML: '<span class=\"vjs-control-text\"></span>'\n });\n };\n\n return VolumeLevel;\n}(Component);\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\n\n/**\n * @file volume-bar.js\n */\n// Required children\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @extends Slider\n */\n\nvar VolumeBar = function (_Slider) {\n inherits(VolumeBar, _Slider);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function VolumeBar(player, options) {\n classCallCheck(this, VolumeBar);\n\n var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n _this.on('slideractive', _this.updateLastVolume_);\n _this.on(player, 'volumechange', _this.updateARIAAttributes);\n player.ready(function () {\n return _this.updateARIAAttributes();\n });\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n VolumeBar.prototype.createEl = function createEl$$1() {\n return _Slider.prototype.createEl.call(this, 'div', {\n className: 'vjs-volume-bar vjs-slider-bar'\n }, {\n 'aria-label': this.localize('Volume Level'),\n 'aria-live': 'polite'\n });\n };\n\n /**\n * Handle mouse down on volume bar\n *\n * @param {EventTarget~Event} event\n * The `mousedown` event that caused this to run.\n *\n * @listens mousedown\n */\n\n\n VolumeBar.prototype.handleMouseDown = function handleMouseDown(event) {\n if (!isSingleLeftClick(event)) {\n return;\n }\n\n _Slider.prototype.handleMouseDown.call(this, event);\n };\n\n /**\n * Handle movement events on the {@link VolumeMenuButton}.\n *\n * @param {EventTarget~Event} event\n * The event that caused this function to run.\n *\n * @listens mousemove\n */\n\n\n VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {\n if (!isSingleLeftClick(event)) {\n return;\n }\n\n this.checkMuted();\n this.player_.volume(this.calculateDistance(event));\n };\n\n /**\n * If the player is muted unmute it.\n */\n\n\n VolumeBar.prototype.checkMuted = function checkMuted() {\n if (this.player_.muted()) {\n this.player_.muted(false);\n }\n };\n\n /**\n * Get percent of volume level\n *\n * @return {number}\n * Volume level percent as a decimal number.\n */\n\n\n VolumeBar.prototype.getPercent = function getPercent() {\n if (this.player_.muted()) {\n return 0;\n }\n return this.player_.volume();\n };\n\n /**\n * Increase volume level for keyboard users\n */\n\n\n VolumeBar.prototype.stepForward = function stepForward() {\n this.checkMuted();\n this.player_.volume(this.player_.volume() + 0.1);\n };\n\n /**\n * Decrease volume level for keyboard users\n */\n\n\n VolumeBar.prototype.stepBack = function stepBack() {\n this.checkMuted();\n this.player_.volume(this.player_.volume() - 0.1);\n };\n\n /**\n * Update ARIA accessibility attributes\n *\n * @param {EventTarget~Event} [event]\n * The `volumechange` event that caused this function to run.\n *\n * @listens Player#volumechange\n */\n\n\n VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes(event) {\n var ariaValue = this.player_.muted() ? 0 : this.volumeAsPercentage_();\n\n this.el_.setAttribute('aria-valuenow', ariaValue);\n this.el_.setAttribute('aria-valuetext', ariaValue + '%');\n };\n\n /**\n * Returns the current value of the player volume as a percentage\n *\n * @private\n */\n\n\n VolumeBar.prototype.volumeAsPercentage_ = function volumeAsPercentage_() {\n return Math.round(this.player_.volume() * 100);\n };\n\n /**\n * When user starts dragging the VolumeBar, store the volume and listen for\n * the end of the drag. When the drag ends, if the volume was set to zero,\n * set lastVolume to the stored volume.\n *\n * @listens slideractive\n * @private\n */\n\n\n VolumeBar.prototype.updateLastVolume_ = function updateLastVolume_() {\n var _this2 = this;\n\n var volumeBeforeDrag = this.player_.volume();\n\n this.one('sliderinactive', function () {\n if (_this2.player_.volume() === 0) {\n _this2.player_.lastVolume_(volumeBeforeDrag);\n }\n });\n };\n\n return VolumeBar;\n}(Slider);\n\n/**\n * Default options for the `VolumeBar`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeBar.prototype.options_ = {\n children: ['volumeLevel'],\n barName: 'volumeLevel'\n};\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * The component for controlling the volume level\n *\n * @extends Component\n */\n\nvar VolumeControl = function (_Component) {\n inherits(VolumeControl, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n */\n function VolumeControl(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, VolumeControl);\n\n options.vertical = options.vertical || false;\n\n // Pass the vertical option down to the VolumeBar if\n // the VolumeBar is turned on.\n if (typeof options.volumeBar === 'undefined' || isPlain(options.volumeBar)) {\n options.volumeBar = options.volumeBar || {};\n options.volumeBar.vertical = options.vertical;\n }\n\n // hide this control if volume support is missing\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n checkVolumeSupport(_this, player);\n\n _this.throttledHandleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n\n _this.on('mousedown', _this.handleMouseDown);\n _this.on('touchstart', _this.handleMouseDown);\n\n // while the slider is active (the mouse has been pressed down and\n // is dragging) or in focus we do not want to hide the VolumeBar\n _this.on(_this.volumeBar, ['focus', 'slideractive'], function () {\n _this.volumeBar.addClass('vjs-slider-active');\n _this.addClass('vjs-slider-active');\n _this.trigger('slideractive');\n });\n\n _this.on(_this.volumeBar, ['blur', 'sliderinactive'], function () {\n _this.volumeBar.removeClass('vjs-slider-active');\n _this.removeClass('vjs-slider-active');\n _this.trigger('sliderinactive');\n });\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n VolumeControl.prototype.createEl = function createEl() {\n var orientationClass = 'vjs-volume-horizontal';\n\n if (this.options_.vertical) {\n orientationClass = 'vjs-volume-vertical';\n }\n\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-volume-control vjs-control ' + orientationClass\n });\n };\n\n /**\n * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n *\n * @param {EventTarget~Event} event\n * `mousedown` or `touchstart` event that triggered this function\n *\n * @listens mousedown\n * @listens touchstart\n */\n\n\n VolumeControl.prototype.handleMouseDown = function handleMouseDown(event) {\n var doc = this.el_.ownerDocument;\n\n this.on(doc, 'mousemove', this.throttledHandleMouseMove);\n this.on(doc, 'touchmove', this.throttledHandleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchend', this.handleMouseUp);\n };\n\n /**\n * Handle `mouseup` or `touchend` events on the `VolumeControl`.\n *\n * @param {EventTarget~Event} event\n * `mouseup` or `touchend` event that triggered this function.\n *\n * @listens touchend\n * @listens mouseup\n */\n\n\n VolumeControl.prototype.handleMouseUp = function handleMouseUp(event) {\n var doc = this.el_.ownerDocument;\n\n this.off(doc, 'mousemove', this.throttledHandleMouseMove);\n this.off(doc, 'touchmove', this.throttledHandleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchend', this.handleMouseUp);\n };\n\n /**\n * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n *\n * @param {EventTarget~Event} event\n * `mousedown` or `touchstart` event that triggered this function\n *\n * @listens mousedown\n * @listens touchstart\n */\n\n\n VolumeControl.prototype.handleMouseMove = function handleMouseMove(event) {\n this.volumeBar.handleMouseMove(event);\n };\n\n return VolumeControl;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeControl.prototype.options_ = {\n children: ['volumeBar']\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\n\n/**\n * Check if muting volume is supported and if it isn't hide the mute toggle\n * button.\n *\n * @param {Component} self\n * A reference to the mute toggle button\n *\n * @param {Player} player\n * A reference to the player\n *\n * @private\n */\nvar checkMuteSupport = function checkMuteSupport(self, player) {\n // hide mute toggle button if it's not supported by the current tech\n if (player.tech_ && !player.tech_.featuresMuteControl) {\n self.addClass('vjs-hidden');\n }\n\n self.on(player, 'loadstart', function () {\n if (!player.tech_.featuresMuteControl) {\n self.addClass('vjs-hidden');\n } else {\n self.removeClass('vjs-hidden');\n }\n });\n};\n\n/**\n * @file mute-toggle.js\n */\n/**\n * A button component for muting the audio.\n *\n * @extends Button\n */\n\nvar MuteToggle = function (_Button) {\n inherits(MuteToggle, _Button);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function MuteToggle(player, options) {\n classCallCheck(this, MuteToggle);\n\n // hide this control if volume support is missing\n var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n checkMuteSupport(_this, player);\n\n _this.on(player, ['loadstart', 'volumechange'], _this.update);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n MuteToggle.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);\n };\n\n /**\n * This gets called when an `MuteToggle` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n MuteToggle.prototype.handleClick = function handleClick(event) {\n var vol = this.player_.volume();\n var lastVolume = this.player_.lastVolume_();\n\n if (vol === 0) {\n var volumeToSet = lastVolume < 0.1 ? 0.1 : lastVolume;\n\n this.player_.volume(volumeToSet);\n this.player_.muted(false);\n } else {\n this.player_.muted(this.player_.muted() ? false : true);\n }\n };\n\n /**\n * Update the `MuteToggle` button based on the state of `volume` and `muted`\n * on the player.\n *\n * @param {EventTarget~Event} [event]\n * The {@link Player#loadstart} event if this function was called\n * through an event.\n *\n * @listens Player#loadstart\n * @listens Player#volumechange\n */\n\n\n MuteToggle.prototype.update = function update(event) {\n this.updateIcon_();\n this.updateControlText_();\n };\n\n /**\n * Update the appearance of the `MuteToggle` icon.\n *\n * Possible states (given `level` variable below):\n * - 0: crossed out\n * - 1: zero bars of volume\n * - 2: one bar of volume\n * - 3: two bars of volume\n *\n * @private\n */\n\n\n MuteToggle.prototype.updateIcon_ = function updateIcon_() {\n var vol = this.player_.volume();\n var level = 3;\n\n // in iOS when a player is loaded with muted attribute\n // and volume is changed with a native mute button\n // we want to make sure muted state is updated\n if (IS_IOS) {\n this.player_.muted(this.player_.tech_.el_.muted);\n }\n\n if (vol === 0 || this.player_.muted()) {\n level = 0;\n } else if (vol < 0.33) {\n level = 1;\n } else if (vol < 0.67) {\n level = 2;\n }\n\n // TODO improve muted icon classes\n for (var i = 0; i < 4; i++) {\n removeClass(this.el_, 'vjs-vol-' + i);\n }\n addClass(this.el_, 'vjs-vol-' + level);\n };\n\n /**\n * If `muted` has changed on the player, update the control text\n * (`title` attribute on `vjs-mute-control` element and content of\n * `vjs-control-text` element).\n *\n * @private\n */\n\n\n MuteToggle.prototype.updateControlText_ = function updateControlText_() {\n var soundOff = this.player_.muted() || this.player_.volume() === 0;\n var text = soundOff ? 'Unmute' : 'Mute';\n\n if (this.controlText() !== text) {\n this.controlText(text);\n }\n };\n\n return MuteToggle;\n}(Button);\n\n/**\n * The text that should display over the `MuteToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * A Component to contain the MuteToggle and VolumeControl so that\n * they can work together.\n *\n * @extends Component\n */\n\nvar VolumePanel = function (_Component) {\n inherits(VolumePanel, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n */\n function VolumePanel(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, VolumePanel);\n\n if (typeof options.inline !== 'undefined') {\n options.inline = options.inline;\n } else {\n options.inline = true;\n }\n\n // pass the inline option down to the VolumeControl as vertical if\n // the VolumeControl is on.\n if (typeof options.volumeControl === 'undefined' || isPlain(options.volumeControl)) {\n options.volumeControl = options.volumeControl || {};\n options.volumeControl.vertical = !options.inline;\n }\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.on(player, ['loadstart'], _this.volumePanelState_);\n\n // while the slider is active (the mouse has been pressed down and\n // is dragging) we do not want to hide the VolumeBar\n _this.on(_this.volumeControl, ['slideractive'], _this.sliderActive_);\n\n _this.on(_this.volumeControl, ['sliderinactive'], _this.sliderInactive_);\n return _this;\n }\n\n /**\n * Add vjs-slider-active class to the VolumePanel\n *\n * @listens VolumeControl#slideractive\n * @private\n */\n\n\n VolumePanel.prototype.sliderActive_ = function sliderActive_() {\n this.addClass('vjs-slider-active');\n };\n\n /**\n * Removes vjs-slider-active class to the VolumePanel\n *\n * @listens VolumeControl#sliderinactive\n * @private\n */\n\n\n VolumePanel.prototype.sliderInactive_ = function sliderInactive_() {\n this.removeClass('vjs-slider-active');\n };\n\n /**\n * Adds vjs-hidden or vjs-mute-toggle-only to the VolumePanel\n * depending on MuteToggle and VolumeControl state\n *\n * @listens Player#loadstart\n * @private\n */\n\n\n VolumePanel.prototype.volumePanelState_ = function volumePanelState_() {\n // hide volume panel if neither volume control or mute toggle\n // are displayed\n if (this.volumeControl.hasClass('vjs-hidden') && this.muteToggle.hasClass('vjs-hidden')) {\n this.addClass('vjs-hidden');\n }\n\n // if only mute toggle is visible we don't want\n // volume panel expanding when hovered or active\n if (this.volumeControl.hasClass('vjs-hidden') && !this.muteToggle.hasClass('vjs-hidden')) {\n this.addClass('vjs-mute-toggle-only');\n }\n };\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n VolumePanel.prototype.createEl = function createEl() {\n var orientationClass = 'vjs-volume-panel-horizontal';\n\n if (!this.options_.inline) {\n orientationClass = 'vjs-volume-panel-vertical';\n }\n\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-volume-panel vjs-control ' + orientationClass\n });\n };\n\n return VolumePanel;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumePanel.prototype.options_ = {\n children: ['muteToggle', 'volumeControl']\n};\n\nComponent.registerComponent('VolumePanel', VolumePanel);\n\n/**\n * @file menu.js\n */\n/**\n * The Menu component is used to build popup menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n */\n\nvar Menu = function (_Component) {\n inherits(Menu, _Component);\n\n /**\n * Create an instance of this class.\n *\n * @param {Player} player\n * the player that this component should attach to\n *\n * @param {Object} [options]\n * Object of option names and values\n *\n */\n function Menu(player, options) {\n classCallCheck(this, Menu);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n if (options) {\n _this.menuButton_ = options.menuButton;\n }\n\n _this.focusedChild_ = -1;\n\n _this.on('keydown', _this.handleKeyPress);\n return _this;\n }\n\n /**\n * Add a {@link MenuItem} to the menu.\n *\n * @param {Object|string} component\n * The name or instance of the `MenuItem` to add.\n *\n */\n\n\n Menu.prototype.addItem = function addItem(component) {\n this.addChild(component);\n component.on('click', bind(this, function (event) {\n // Unpress the associated MenuButton, and move focus back to it\n if (this.menuButton_) {\n this.menuButton_.unpressButton();\n\n // don't focus menu button if item is a caption settings item\n // because focus will move elsewhere and it logs an error on IE8\n if (component.name() !== 'CaptionSettingsMenuItem') {\n this.menuButton_.focus();\n }\n }\n }));\n };\n\n /**\n * Create the `Menu`s DOM element.\n *\n * @return {Element}\n * the element that was created\n */\n\n\n Menu.prototype.createEl = function createEl$$1() {\n var contentElType = this.options_.contentElType || 'ul';\n\n this.contentEl_ = createEl(contentElType, {\n className: 'vjs-menu-content'\n });\n\n this.contentEl_.setAttribute('role', 'menu');\n\n var el = _Component.prototype.createEl.call(this, 'div', {\n append: this.contentEl_,\n className: 'vjs-menu'\n });\n\n el.appendChild(this.contentEl_);\n\n // Prevent clicks from bubbling up. Needed for Menu Buttons,\n // where a click on the parent is significant\n on(el, 'click', function (event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n });\n\n return el;\n };\n\n Menu.prototype.dispose = function dispose() {\n this.contentEl_ = null;\n\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Handle a `keydown` event on this menu. This listener is added in the constructor.\n *\n * @param {EventTarget~Event} event\n * A `keydown` event that happened on the menu.\n *\n * @listens keydown\n */\n\n\n Menu.prototype.handleKeyPress = function handleKeyPress(event) {\n // Left and Down Arrows\n if (event.which === 37 || event.which === 40) {\n event.preventDefault();\n this.stepForward();\n\n // Up and Right Arrows\n } else if (event.which === 38 || event.which === 39) {\n event.preventDefault();\n this.stepBack();\n }\n };\n\n /**\n * Move to next (lower) menu item for keyboard users.\n */\n\n\n Menu.prototype.stepForward = function stepForward() {\n var stepChild = 0;\n\n if (this.focusedChild_ !== undefined) {\n stepChild = this.focusedChild_ + 1;\n }\n this.focus(stepChild);\n };\n\n /**\n * Move to previous (higher) menu item for keyboard users.\n */\n\n\n Menu.prototype.stepBack = function stepBack() {\n var stepChild = 0;\n\n if (this.focusedChild_ !== undefined) {\n stepChild = this.focusedChild_ - 1;\n }\n this.focus(stepChild);\n };\n\n /**\n * Set focus on a {@link MenuItem} in the `Menu`.\n *\n * @param {Object|string} [item=0]\n * Index of child item set focus on.\n */\n\n\n Menu.prototype.focus = function focus() {\n var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n var children = this.children().slice();\n var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className);\n\n if (haveTitle) {\n children.shift();\n }\n\n if (children.length > 0) {\n if (item < 0) {\n item = 0;\n } else if (item >= children.length) {\n item = children.length - 1;\n }\n\n this.focusedChild_ = item;\n\n children[item].el_.focus();\n }\n };\n\n return Menu;\n}(Component);\n\nComponent.registerComponent('Menu', Menu);\n\n/**\n * @file menu-button.js\n */\n/**\n * A `MenuButton` class for any popup {@link Menu}.\n *\n * @extends Component\n */\n\nvar MenuButton = function (_Component) {\n inherits(MenuButton, _Component);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n */\n function MenuButton(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, MenuButton);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n _this.menuButton_ = new Button(player, options);\n\n _this.menuButton_.controlText(_this.controlText_);\n _this.menuButton_.el_.setAttribute('aria-haspopup', 'true');\n\n // Add buildCSSClass values to the button, not the wrapper\n var buttonClass = Button.prototype.buildCSSClass();\n\n _this.menuButton_.el_.className = _this.buildCSSClass() + ' ' + buttonClass;\n _this.menuButton_.removeClass('vjs-control');\n\n _this.addChild(_this.menuButton_);\n\n _this.update();\n\n _this.enabled_ = true;\n\n _this.on(_this.menuButton_, 'tap', _this.handleClick);\n _this.on(_this.menuButton_, 'click', _this.handleClick);\n _this.on(_this.menuButton_, 'focus', _this.handleFocus);\n _this.on(_this.menuButton_, 'blur', _this.handleBlur);\n\n _this.on('keydown', _this.handleSubmenuKeyPress);\n return _this;\n }\n\n /**\n * Update the menu based on the current state of its items.\n */\n\n\n MenuButton.prototype.update = function update() {\n var menu = this.createMenu();\n\n if (this.menu) {\n this.menu.dispose();\n this.removeChild(this.menu);\n }\n\n this.menu = menu;\n this.addChild(menu);\n\n /**\n * Track the state of the menu button\n *\n * @type {Boolean}\n * @private\n */\n this.buttonPressed_ = false;\n this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n\n if (this.items && this.items.length <= this.hideThreshold_) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n /**\n * Create the menu and add all items to it.\n *\n * @return {Menu}\n * The constructed menu\n */\n\n\n MenuButton.prototype.createMenu = function createMenu() {\n var menu = new Menu(this.player_, { menuButton: this });\n\n /**\n * Hide the menu if the number of items is less than or equal to this threshold. This defaults\n * to 0 and whenever we add items which can be hidden to the menu we'll increment it. We list\n * it here because every time we run `createMenu` we need to reset the value.\n *\n * @protected\n * @type {Number}\n */\n this.hideThreshold_ = 0;\n\n // Add a title list item to the top\n if (this.options_.title) {\n var title = createEl('li', {\n className: 'vjs-menu-title',\n innerHTML: toTitleCase(this.options_.title),\n tabIndex: -1\n });\n\n this.hideThreshold_ += 1;\n\n menu.children_.unshift(title);\n prependTo(title, menu.contentEl());\n }\n\n this.items = this.createItems();\n\n if (this.items) {\n // Add menu items to the menu\n for (var i = 0; i < this.items.length; i++) {\n menu.addItem(this.items[i]);\n }\n }\n\n return menu;\n };\n\n /**\n * Create the list of menu items. Specific to each subclass.\n *\n * @abstract\n */\n\n\n MenuButton.prototype.createItems = function createItems() {};\n\n /**\n * Create the `MenuButtons`s DOM element.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n MenuButton.prototype.createEl = function createEl$$1() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: this.buildWrapperCSSClass()\n }, {});\n };\n\n /**\n * Allow sub components to stack CSS class names for the wrapper element\n *\n * @return {string}\n * The constructed wrapper DOM `className`\n */\n\n\n MenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n var menuButtonClass = 'vjs-menu-button';\n\n // If the inline option is passed, we want to use different styles altogether.\n if (this.options_.inline === true) {\n menuButtonClass += '-inline';\n } else {\n menuButtonClass += '-popup';\n }\n\n // TODO: Fix the CSS so that this isn't necessary\n var buttonClass = Button.prototype.buildCSSClass();\n\n return 'vjs-menu-button ' + menuButtonClass + ' ' + buttonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n MenuButton.prototype.buildCSSClass = function buildCSSClass() {\n var menuButtonClass = 'vjs-menu-button';\n\n // If the inline option is passed, we want to use different styles altogether.\n if (this.options_.inline === true) {\n menuButtonClass += '-inline';\n } else {\n menuButtonClass += '-popup';\n }\n\n return 'vjs-menu-button ' + menuButtonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Get or set the localized control text that will be used for accessibility.\n *\n * > NOTE: This will come from the internal `menuButton_` element.\n *\n * @param {string} [text]\n * Control text for element.\n *\n * @param {Element} [el=this.menuButton_.el()]\n * Element to set the title on.\n *\n * @return {string}\n * - The control text when getting\n */\n\n\n MenuButton.prototype.controlText = function controlText(text) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.menuButton_.el();\n\n return this.menuButton_.controlText(text, el);\n };\n\n /**\n * Handle a click on a `MenuButton`.\n * See {@link ClickableComponent#handleClick} for instances where this is called.\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n MenuButton.prototype.handleClick = function handleClick(event) {\n // When you click the button it adds focus, which will show the menu.\n // So we'll remove focus when the mouse leaves the button. Focus is needed\n // for tab navigation.\n\n this.one(this.menu.contentEl(), 'mouseleave', bind(this, function (e) {\n this.unpressButton();\n this.el_.blur();\n }));\n if (this.buttonPressed_) {\n this.unpressButton();\n } else {\n this.pressButton();\n }\n };\n\n /**\n * Set the focus to the actual button, not to this element\n */\n\n\n MenuButton.prototype.focus = function focus() {\n this.menuButton_.focus();\n };\n\n /**\n * Remove the focus from the actual button, not this element\n */\n\n\n MenuButton.prototype.blur = function blur() {\n this.menuButton_.blur();\n };\n\n /**\n * This gets called when a `MenuButton` gains focus via a `focus` event.\n * Turns on listening for `keydown` events. When they happen it\n * calls `this.handleKeyPress`.\n *\n * @param {EventTarget~Event} event\n * The `focus` event that caused this function to be called.\n *\n * @listens focus\n */\n\n\n MenuButton.prototype.handleFocus = function handleFocus() {\n on(document, 'keydown', bind(this, this.handleKeyPress));\n };\n\n /**\n * Called when a `MenuButton` loses focus. Turns off the listener for\n * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n *\n * @param {EventTarget~Event} event\n * The `blur` event that caused this function to be called.\n *\n * @listens blur\n */\n\n\n MenuButton.prototype.handleBlur = function handleBlur() {\n off(document, 'keydown', bind(this, this.handleKeyPress));\n };\n\n /**\n * Handle tab, escape, down arrow, and up arrow keys for `MenuButton`. See\n * {@link ClickableComponent#handleKeyPress} for instances where this is called.\n *\n * @param {EventTarget~Event} event\n * The `keydown` event that caused this function to be called.\n *\n * @listens keydown\n */\n\n\n MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {\n\n // Escape (27) key or Tab (9) key unpress the 'button'\n if (event.which === 27 || event.which === 9) {\n if (this.buttonPressed_) {\n this.unpressButton();\n }\n // Don't preventDefault for Tab key - we still want to lose focus\n if (event.which !== 9) {\n event.preventDefault();\n // Set focus back to the menu button's button\n this.menuButton_.el_.focus();\n }\n // Up (38) key or Down (40) key press the 'button'\n } else if (event.which === 38 || event.which === 40) {\n if (!this.buttonPressed_) {\n this.pressButton();\n event.preventDefault();\n }\n }\n };\n\n /**\n * Handle a `keydown` event on a sub-menu. The listener for this is added in\n * the constructor.\n *\n * @param {EventTarget~Event} event\n * Key press event\n *\n * @listens keydown\n */\n\n\n MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) {\n\n // Escape (27) key or Tab (9) key unpress the 'button'\n if (event.which === 27 || event.which === 9) {\n if (this.buttonPressed_) {\n this.unpressButton();\n }\n // Don't preventDefault for Tab key - we still want to lose focus\n if (event.which !== 9) {\n event.preventDefault();\n // Set focus back to the menu button's button\n this.menuButton_.el_.focus();\n }\n }\n };\n\n /**\n * Put the current `MenuButton` into a pressed state.\n */\n\n\n MenuButton.prototype.pressButton = function pressButton() {\n if (this.enabled_) {\n this.buttonPressed_ = true;\n this.menu.lockShowing();\n this.menuButton_.el_.setAttribute('aria-expanded', 'true');\n\n // set the focus into the submenu, except on iOS where it is resulting in\n // undesired scrolling behavior when the player is in an iframe\n if (IS_IOS && isInFrame()) {\n // Return early so that the menu isn't focused\n return;\n }\n\n this.menu.focus();\n }\n };\n\n /**\n * Take the current `MenuButton` out of a pressed state.\n */\n\n\n MenuButton.prototype.unpressButton = function unpressButton() {\n if (this.enabled_) {\n this.buttonPressed_ = false;\n this.menu.unlockShowing();\n this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n }\n };\n\n /**\n * Disable the `MenuButton`. Don't allow it to be clicked.\n */\n\n\n MenuButton.prototype.disable = function disable() {\n this.unpressButton();\n\n this.enabled_ = false;\n this.addClass('vjs-disabled');\n\n this.menuButton_.disable();\n };\n\n /**\n * Enable the `MenuButton`. Allow it to be clicked.\n */\n\n\n MenuButton.prototype.enable = function enable() {\n this.enabled_ = true;\n this.removeClass('vjs-disabled');\n\n this.menuButton_.enable();\n };\n\n return MenuButton;\n}(Component);\n\nComponent.registerComponent('MenuButton', MenuButton);\n\n/**\n * @file track-button.js\n */\n/**\n * The base class for buttons that toggle specific track types (e.g. subtitles).\n *\n * @extends MenuButton\n */\n\nvar TrackButton = function (_MenuButton) {\n inherits(TrackButton, _MenuButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function TrackButton(player, options) {\n classCallCheck(this, TrackButton);\n\n var tracks = options.tracks;\n\n var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n if (_this.items.length <= 1) {\n _this.hide();\n }\n\n if (!tracks) {\n return possibleConstructorReturn(_this);\n }\n\n var updateHandler = bind(_this, _this.update);\n\n tracks.addEventListener('removetrack', updateHandler);\n tracks.addEventListener('addtrack', updateHandler);\n _this.player_.on('ready', updateHandler);\n\n _this.player_.on('dispose', function () {\n tracks.removeEventListener('removetrack', updateHandler);\n tracks.removeEventListener('addtrack', updateHandler);\n });\n return _this;\n }\n\n return TrackButton;\n}(MenuButton);\n\nComponent.registerComponent('TrackButton', TrackButton);\n\n/**\n * @file menu-item.js\n */\n/**\n * The component for a menu item. `<li>`\n *\n * @extends ClickableComponent\n */\n\nvar MenuItem = function (_ClickableComponent) {\n inherits(MenuItem, _ClickableComponent);\n\n /**\n * Creates an instance of the this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n *\n */\n function MenuItem(player, options) {\n classCallCheck(this, MenuItem);\n\n var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n _this.selectable = options.selectable;\n _this.isSelected_ = options.selected || false;\n _this.multiSelectable = options.multiSelectable;\n\n _this.selected(_this.isSelected_);\n\n if (_this.selectable) {\n if (_this.multiSelectable) {\n _this.el_.setAttribute('role', 'menuitemcheckbox');\n } else {\n _this.el_.setAttribute('role', 'menuitemradio');\n }\n } else {\n _this.el_.setAttribute('role', 'menuitem');\n }\n return _this;\n }\n\n /**\n * Create the `MenuItem's DOM element\n *\n * @param {string} [type=li]\n * Element's node type, not actually used, always set to `li`.\n *\n * @param {Object} [props={}]\n * An object of properties that should be set on the element\n *\n * @param {Object} [attrs={}]\n * An object of attributes that should be set on the element\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n MenuItem.prototype.createEl = function createEl(type, props, attrs) {\n // The control is textual, not just an icon\n this.nonIconControl = true;\n\n return _ClickableComponent.prototype.createEl.call(this, 'li', assign({\n className: 'vjs-menu-item',\n innerHTML: '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label) + '</span>',\n tabIndex: -1\n }, props), attrs);\n };\n\n /**\n * Any click on a `MenuItem` puts it into the selected state.\n * See {@link ClickableComponent#handleClick} for instances where this is called.\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n MenuItem.prototype.handleClick = function handleClick(event) {\n this.selected(true);\n };\n\n /**\n * Set the state for this menu item as selected or not.\n *\n * @param {boolean} selected\n * if the menu item is selected or not\n */\n\n\n MenuItem.prototype.selected = function selected(_selected) {\n if (this.selectable) {\n if (_selected) {\n this.addClass('vjs-selected');\n this.el_.setAttribute('aria-checked', 'true');\n // aria-checked isn't fully supported by browsers/screen readers,\n // so indicate selected state to screen reader in the control text.\n this.controlText(', selected');\n this.isSelected_ = true;\n } else {\n this.removeClass('vjs-selected');\n this.el_.setAttribute('aria-checked', 'false');\n // Indicate un-selected state to screen reader\n this.controlText('');\n this.isSelected_ = false;\n }\n }\n };\n\n return MenuItem;\n}(ClickableComponent);\n\nComponent.registerComponent('MenuItem', MenuItem);\n\n/**\n * @file text-track-menu-item.js\n */\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @extends MenuItem\n */\n\nvar TextTrackMenuItem = function (_MenuItem) {\n inherits(TextTrackMenuItem, _MenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function TextTrackMenuItem(player, options) {\n classCallCheck(this, TextTrackMenuItem);\n\n var track = options.track;\n var tracks = player.textTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.mode === 'showing';\n\n var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n _this.track = track;\n var changeHandler = function changeHandler() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this.handleTracksChange.apply(_this, args);\n };\n var selectedLanguageChangeHandler = function selectedLanguageChangeHandler() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n _this.handleSelectedLanguageChange.apply(_this, args);\n };\n\n player.on(['loadstart', 'texttrackchange'], changeHandler);\n tracks.addEventListener('change', changeHandler);\n tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n _this.on('dispose', function () {\n player.off(['loadstart', 'texttrackchange'], changeHandler);\n tracks.removeEventListener('change', changeHandler);\n tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n });\n\n // iOS7 doesn't dispatch change events to TextTrackLists when an\n // associated track's mode changes. Without something like\n // Object.observe() (also not present on iOS7), it's not\n // possible to detect changes to the mode attribute and polyfill\n // the change event. As a poor substitute, we manually dispatch\n // change events whenever the controls modify the mode.\n if (tracks.onchange === undefined) {\n var event = void 0;\n\n _this.on(['tap', 'click'], function () {\n if (_typeof(window.Event) !== 'object') {\n // Android 2.3 throws an Illegal Constructor error for window.Event\n try {\n event = new window.Event('change');\n } catch (err) {\n // continue regardless of error\n }\n }\n\n if (!event) {\n event = document.createEvent('Event');\n event.initEvent('change', true, true);\n }\n\n tracks.dispatchEvent(event);\n });\n }\n\n // set the default state based on current tracks\n _this.handleTracksChange();\n return _this;\n }\n\n /**\n * This gets called when an `TextTrackMenuItem` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n TextTrackMenuItem.prototype.handleClick = function handleClick(event) {\n var kind = this.track.kind;\n var kinds = this.track.kinds;\n var tracks = this.player_.textTracks();\n\n if (!kinds) {\n kinds = [kind];\n }\n\n _MenuItem.prototype.handleClick.call(this, event);\n\n if (!tracks) {\n return;\n }\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n if (track === this.track && kinds.indexOf(track.kind) > -1) {\n if (track.mode !== 'showing') {\n track.mode = 'showing';\n }\n } else if (track.mode !== 'disabled') {\n track.mode = 'disabled';\n }\n }\n };\n\n /**\n * Handle text track list change\n *\n * @param {EventTarget~Event} event\n * The `change` event that caused this function to be called.\n *\n * @listens TextTrackList#change\n */\n\n\n TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n var shouldBeSelected = this.track.mode === 'showing';\n\n // Prevent redundant selected() calls because they may cause\n // screen readers to read the appended control text unnecessarily\n if (shouldBeSelected !== this.isSelected_) {\n this.selected(shouldBeSelected);\n }\n };\n\n TextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n if (this.track.mode === 'showing') {\n var selectedLanguage = this.player_.cache_.selectedLanguage;\n\n // Don't replace the kind of track across the same language\n if (selectedLanguage && selectedLanguage.enabled && selectedLanguage.language === this.track.language && selectedLanguage.kind !== this.track.kind) {\n return;\n }\n\n this.player_.cache_.selectedLanguage = {\n enabled: true,\n language: this.track.language,\n kind: this.track.kind\n };\n }\n };\n\n TextTrackMenuItem.prototype.dispose = function dispose() {\n // remove reference to track object on dispose\n this.track = null;\n\n _MenuItem.prototype.dispose.call(this);\n };\n\n return TextTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\n\n/**\n * @file off-text-track-menu-item.js\n */\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @extends TextTrackMenuItem\n */\n\nvar OffTextTrackMenuItem = function (_TextTrackMenuItem) {\n inherits(OffTextTrackMenuItem, _TextTrackMenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function OffTextTrackMenuItem(player, options) {\n classCallCheck(this, OffTextTrackMenuItem);\n\n // Create pseudo track info\n // Requires options['kind']\n options.track = {\n player: player,\n kind: options.kind,\n kinds: options.kinds,\n 'default': false,\n mode: 'disabled'\n };\n\n if (!options.kinds) {\n options.kinds = [options.kind];\n }\n\n if (options.label) {\n options.track.label = options.label;\n } else {\n options.track.label = options.kinds.join(' and ') + ' off';\n }\n\n // MenuItem is selectable\n options.selectable = true;\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n options.multiSelectable = false;\n\n return possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n }\n\n /**\n * Handle text track change\n *\n * @param {EventTarget~Event} event\n * The event that caused this function to run\n */\n\n\n OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n var tracks = this.player().textTracks();\n var shouldBeSelected = true;\n\n for (var i = 0, l = tracks.length; i < l; i++) {\n var track = tracks[i];\n\n if (this.options_.kinds.indexOf(track.kind) > -1 && track.mode === 'showing') {\n shouldBeSelected = false;\n break;\n }\n }\n\n // Prevent redundant selected() calls because they may cause\n // screen readers to read the appended control text unnecessarily\n if (shouldBeSelected !== this.isSelected_) {\n this.selected(shouldBeSelected);\n }\n };\n\n OffTextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n var tracks = this.player().textTracks();\n var allHidden = true;\n\n for (var i = 0, l = tracks.length; i < l; i++) {\n var track = tracks[i];\n\n if (['captions', 'descriptions', 'subtitles'].indexOf(track.kind) > -1 && track.mode === 'showing') {\n allHidden = false;\n break;\n }\n }\n\n if (allHidden) {\n this.player_.cache_.selectedLanguage = {\n enabled: false\n };\n }\n };\n\n return OffTextTrackMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\n\n/**\n * @file text-track-button.js\n */\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @extends MenuButton\n */\n\nvar TextTrackButton = function (_TrackButton) {\n inherits(TextTrackButton, _TrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n */\n function TextTrackButton(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, TextTrackButton);\n\n options.tracks = player.textTracks();\n\n return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n }\n\n /**\n * Create a menu item for each text track\n *\n * @param {TextTrackMenuItem[]} [items=[]]\n * Existing array of items to use during creation\n *\n * @return {TextTrackMenuItem[]}\n * Array of menu items that were created\n */\n\n\n TextTrackButton.prototype.createItems = function createItems() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var TrackMenuItem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TextTrackMenuItem;\n\n\n // Label is an overide for the [track] off label\n // USed to localise captions/subtitles\n var label = void 0;\n\n if (this.label_) {\n label = this.label_ + ' off';\n }\n // Add an OFF menu item to turn all tracks off\n items.push(new OffTextTrackMenuItem(this.player_, {\n kinds: this.kinds_,\n kind: this.kind_,\n label: label\n }));\n\n this.hideThreshold_ += 1;\n\n var tracks = this.player_.textTracks();\n\n if (!Array.isArray(this.kinds_)) {\n this.kinds_ = [this.kind_];\n }\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n // only add tracks that are of an appropriate kind and have a label\n if (this.kinds_.indexOf(track.kind) > -1) {\n\n var item = new TrackMenuItem(this.player_, {\n track: track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n });\n\n item.addClass('vjs-' + track.kind + '-menu-item');\n items.push(item);\n }\n }\n\n return items;\n };\n\n return TextTrackButton;\n}(TrackButton);\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\n\n/**\n * @file chapters-track-menu-item.js\n */\n/**\n * The chapter track menu item\n *\n * @extends MenuItem\n */\n\nvar ChaptersTrackMenuItem = function (_MenuItem) {\n inherits(ChaptersTrackMenuItem, _MenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function ChaptersTrackMenuItem(player, options) {\n classCallCheck(this, ChaptersTrackMenuItem);\n\n var track = options.track;\n var cue = options.cue;\n var currentTime = player.currentTime();\n\n // Modify options for parent MenuItem class's init.\n options.selectable = true;\n options.multiSelectable = false;\n options.label = cue.text;\n options.selected = cue.startTime <= currentTime && currentTime < cue.endTime;\n\n var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n _this.track = track;\n _this.cue = cue;\n track.addEventListener('cuechange', bind(_this, _this.update));\n return _this;\n }\n\n /**\n * This gets called when an `ChaptersTrackMenuItem` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n ChaptersTrackMenuItem.prototype.handleClick = function handleClick(event) {\n _MenuItem.prototype.handleClick.call(this);\n this.player_.currentTime(this.cue.startTime);\n this.update(this.cue.startTime);\n };\n\n /**\n * Update chapter menu item\n *\n * @param {EventTarget~Event} [event]\n * The `cuechange` event that caused this function to run.\n *\n * @listens TextTrack#cuechange\n */\n\n\n ChaptersTrackMenuItem.prototype.update = function update(event) {\n var cue = this.cue;\n var currentTime = this.player_.currentTime();\n\n // vjs.log(currentTime, cue.startTime);\n this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);\n };\n\n return ChaptersTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\n\n/**\n * @file chapters-button.js\n */\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @extends TextTrackButton\n */\n\nvar ChaptersButton = function (_TextTrackButton) {\n inherits(ChaptersButton, _TextTrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function to call when this function is ready.\n */\n function ChaptersButton(player, options, ready) {\n classCallCheck(this, ChaptersButton);\n return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n };\n\n ChaptersButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n /**\n * Update the menu based on the current state of its items.\n *\n * @param {EventTarget~Event} [event]\n * An event that triggered this function to run.\n *\n * @listens TextTrackList#addtrack\n * @listens TextTrackList#removetrack\n * @listens TextTrackList#change\n */\n\n\n ChaptersButton.prototype.update = function update(event) {\n if (!this.track_ || event && (event.type === 'addtrack' || event.type === 'removetrack')) {\n this.setTrack(this.findChaptersTrack());\n }\n _TextTrackButton.prototype.update.call(this);\n };\n\n /**\n * Set the currently selected track for the chapters button.\n *\n * @param {TextTrack} track\n * The new track to select. Nothing will change if this is the currently selected\n * track.\n */\n\n\n ChaptersButton.prototype.setTrack = function setTrack(track) {\n if (this.track_ === track) {\n return;\n }\n\n if (!this.updateHandler_) {\n this.updateHandler_ = this.update.bind(this);\n }\n\n // here this.track_ refers to the old track instance\n if (this.track_) {\n var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n if (remoteTextTrackEl) {\n remoteTextTrackEl.removeEventListener('load', this.updateHandler_);\n }\n\n this.track_ = null;\n }\n\n this.track_ = track;\n\n // here this.track_ refers to the new track instance\n if (this.track_) {\n this.track_.mode = 'hidden';\n\n var _remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n if (_remoteTextTrackEl) {\n _remoteTextTrackEl.addEventListener('load', this.updateHandler_);\n }\n }\n };\n\n /**\n * Find the track object that is currently in use by this ChaptersButton\n *\n * @return {TextTrack|undefined}\n * The current track or undefined if none was found.\n */\n\n\n ChaptersButton.prototype.findChaptersTrack = function findChaptersTrack() {\n var tracks = this.player_.textTracks() || [];\n\n for (var i = tracks.length - 1; i >= 0; i--) {\n // We will always choose the last track as our chaptersTrack\n var track = tracks[i];\n\n if (track.kind === this.kind_) {\n return track;\n }\n }\n };\n\n /**\n * Get the caption for the ChaptersButton based on the track label. This will also\n * use the current tracks localized kind as a fallback if a label does not exist.\n *\n * @return {string}\n * The tracks current label or the localized track kind.\n */\n\n\n ChaptersButton.prototype.getMenuCaption = function getMenuCaption() {\n if (this.track_ && this.track_.label) {\n return this.track_.label;\n }\n return this.localize(toTitleCase(this.kind_));\n };\n\n /**\n * Create menu from chapter track\n *\n * @return {Menu}\n * New menu for the chapter buttons\n */\n\n\n ChaptersButton.prototype.createMenu = function createMenu() {\n this.options_.title = this.getMenuCaption();\n return _TextTrackButton.prototype.createMenu.call(this);\n };\n\n /**\n * Create a menu item for each text track\n *\n * @return {TextTrackMenuItem[]}\n * Array of menu items\n */\n\n\n ChaptersButton.prototype.createItems = function createItems() {\n var items = [];\n\n if (!this.track_) {\n return items;\n }\n\n var cues = this.track_.cues;\n\n if (!cues) {\n return items;\n }\n\n for (var i = 0, l = cues.length; i < l; i++) {\n var cue = cues[i];\n var mi = new ChaptersTrackMenuItem(this.player_, { track: this.track_, cue: cue });\n\n items.push(mi);\n }\n\n return items;\n };\n\n return ChaptersButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nChaptersButton.prototype.kind_ = 'chapters';\n\n/**\n * The text that should display over the `ChaptersButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\n\n/**\n * @file descriptions-button.js\n */\n/**\n * The button component for toggling and selecting descriptions\n *\n * @extends TextTrackButton\n */\n\nvar DescriptionsButton = function (_TextTrackButton) {\n inherits(DescriptionsButton, _TextTrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function to call when this component is ready.\n */\n function DescriptionsButton(player, options, ready) {\n classCallCheck(this, DescriptionsButton);\n\n var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n\n var tracks = player.textTracks();\n var changeHandler = bind(_this, _this.handleTracksChange);\n\n tracks.addEventListener('change', changeHandler);\n _this.on('dispose', function () {\n tracks.removeEventListener('change', changeHandler);\n });\n return _this;\n }\n\n /**\n * Handle text track change\n *\n * @param {EventTarget~Event} event\n * The event that caused this function to run\n *\n * @listens TextTrackList#change\n */\n\n\n DescriptionsButton.prototype.handleTracksChange = function handleTracksChange(event) {\n var tracks = this.player().textTracks();\n var disabled = false;\n\n // Check whether a track of a different kind is showing\n for (var i = 0, l = tracks.length; i < l; i++) {\n var track = tracks[i];\n\n if (track.kind !== this.kind_ && track.mode === 'showing') {\n disabled = true;\n break;\n }\n }\n\n // If another track is showing, disable this menu button\n if (disabled) {\n this.disable();\n } else {\n this.enable();\n }\n };\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n DescriptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n };\n\n DescriptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n return DescriptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nDescriptionsButton.prototype.kind_ = 'descriptions';\n\n/**\n * The text that should display over the `DescriptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nDescriptionsButton.prototype.controlText_ = 'Descriptions';\n\nComponent.registerComponent('DescriptionsButton', DescriptionsButton);\n\n/**\n * @file subtitles-button.js\n */\n/**\n * The button component for toggling and selecting subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubtitlesButton = function (_TextTrackButton) {\n inherits(SubtitlesButton, _TextTrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function to call when this component is ready.\n */\n function SubtitlesButton(player, options, ready) {\n classCallCheck(this, SubtitlesButton);\n return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n };\n\n SubtitlesButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n return SubtitlesButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\n\n/**\n * The text that should display over the `SubtitlesButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\n\n/**\n * @file caption-settings-menu-item.js\n */\n/**\n * The menu item for caption track settings menu\n *\n * @extends TextTrackMenuItem\n */\n\nvar CaptionSettingsMenuItem = function (_TextTrackMenuItem) {\n inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function CaptionSettingsMenuItem(player, options) {\n classCallCheck(this, CaptionSettingsMenuItem);\n\n options.track = {\n player: player,\n kind: options.kind,\n label: options.kind + ' settings',\n selectable: false,\n 'default': false,\n mode: 'disabled'\n };\n\n // CaptionSettingsMenuItem has no concept of 'selected'\n options.selectable = false;\n\n options.name = 'CaptionSettingsMenuItem';\n\n var _this = possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n\n _this.addClass('vjs-texttrack-settings');\n _this.controlText(', opens ' + options.kind + ' settings dialog');\n return _this;\n }\n\n /**\n * This gets called when an `CaptionSettingsMenuItem` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n CaptionSettingsMenuItem.prototype.handleClick = function handleClick(event) {\n this.player().getChild('textTrackSettings').open();\n };\n\n return CaptionSettingsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\n\n/**\n * @file captions-button.js\n */\n/**\n * The button component for toggling and selecting captions\n *\n * @extends TextTrackButton\n */\n\nvar CaptionsButton = function (_TextTrackButton) {\n inherits(CaptionsButton, _TextTrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} [ready]\n * The function to call when this component is ready.\n */\n function CaptionsButton(player, options, ready) {\n classCallCheck(this, CaptionsButton);\n return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n };\n\n CaptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-captions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n /**\n * Create caption menu items\n *\n * @return {CaptionSettingsMenuItem[]}\n * The array of current menu items.\n */\n\n\n CaptionsButton.prototype.createItems = function createItems() {\n var items = [];\n\n if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks) && this.player().getChild('textTrackSettings')) {\n items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.kind_ }));\n\n this.hideThreshold_ += 1;\n }\n\n return _TextTrackButton.prototype.createItems.call(this, items);\n };\n\n return CaptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nCaptionsButton.prototype.kind_ = 'captions';\n\n/**\n * The text that should display over the `CaptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\n\n/**\n * @file subs-caps-menu-item.js\n */\n/**\n * SubsCapsMenuItem has an [cc] icon to distinguish captions from subtitles\n * in the SubsCapsMenu.\n *\n * @extends TextTrackMenuItem\n */\n\nvar SubsCapsMenuItem = function (_TextTrackMenuItem) {\n inherits(SubsCapsMenuItem, _TextTrackMenuItem);\n\n function SubsCapsMenuItem() {\n classCallCheck(this, SubsCapsMenuItem);\n return possibleConstructorReturn(this, _TextTrackMenuItem.apply(this, arguments));\n }\n\n SubsCapsMenuItem.prototype.createEl = function createEl(type, props, attrs) {\n var innerHTML = '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label);\n\n if (this.options_.track.kind === 'captions') {\n innerHTML += '\\n <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\\n <span class=\"vjs-control-text\"> ' + this.localize('Captions') + '</span>\\n ';\n }\n\n innerHTML += '</span>';\n\n var el = _TextTrackMenuItem.prototype.createEl.call(this, type, assign({\n innerHTML: innerHTML\n }, props), attrs);\n\n return el;\n };\n\n return SubsCapsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('SubsCapsMenuItem', SubsCapsMenuItem);\n\n/**\n * @file sub-caps-button.js\n */\n/**\n * The button component for toggling and selecting captions and/or subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubsCapsButton = function (_TextTrackButton) {\n inherits(SubsCapsButton, _TextTrackButton);\n\n function SubsCapsButton(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, SubsCapsButton);\n\n // Although North America uses \"captions\" in most cases for\n // \"captions and subtitles\" other locales use \"subtitles\"\n var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options));\n\n _this.label_ = 'subtitles';\n if (['en', 'en-us', 'en-ca', 'fr-ca'].indexOf(_this.player_.language_) > -1) {\n _this.label_ = 'captions';\n }\n _this.menuButton_.controlText(toTitleCase(_this.label_));\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n SubsCapsButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n };\n\n SubsCapsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n /**\n * Create caption/subtitles menu items\n *\n * @return {CaptionSettingsMenuItem[]}\n * The array of current menu items.\n */\n\n\n SubsCapsButton.prototype.createItems = function createItems() {\n var items = [];\n\n if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks) && this.player().getChild('textTrackSettings')) {\n items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.label_ }));\n\n this.hideThreshold_ += 1;\n }\n\n items = _TextTrackButton.prototype.createItems.call(this, items, SubsCapsMenuItem);\n return items;\n };\n\n return SubsCapsButton;\n}(TextTrackButton);\n\n/**\n * `kind`s of TextTrack to look for to associate it with this menu.\n *\n * @type {array}\n * @private\n */\n\n\nSubsCapsButton.prototype.kinds_ = ['captions', 'subtitles'];\n\n/**\n * The text that should display over the `SubsCapsButton`s controls.\n *\n *\n * @type {string}\n * @private\n */\nSubsCapsButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubsCapsButton', SubsCapsButton);\n\n/**\n * @file audio-track-menu-item.js\n */\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * @extends MenuItem\n */\n\nvar AudioTrackMenuItem = function (_MenuItem) {\n inherits(AudioTrackMenuItem, _MenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function AudioTrackMenuItem(player, options) {\n classCallCheck(this, AudioTrackMenuItem);\n\n var track = options.track;\n var tracks = player.audioTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.enabled;\n\n var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n _this.track = track;\n\n _this.addClass('vjs-' + track.kind + '-menu-item');\n\n var changeHandler = function changeHandler() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this.handleTracksChange.apply(_this, args);\n };\n\n tracks.addEventListener('change', changeHandler);\n _this.on('dispose', function () {\n tracks.removeEventListener('change', changeHandler);\n });\n return _this;\n }\n\n AudioTrackMenuItem.prototype.createEl = function createEl(type, props, attrs) {\n var innerHTML = '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label);\n\n if (this.options_.track.kind === 'main-desc') {\n innerHTML += '\\n <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\\n <span class=\"vjs-control-text\"> ' + this.localize('Descriptions') + '</span>\\n ';\n }\n\n innerHTML += '</span>';\n\n var el = _MenuItem.prototype.createEl.call(this, type, assign({\n innerHTML: innerHTML\n }, props), attrs);\n\n return el;\n };\n\n /**\n * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n AudioTrackMenuItem.prototype.handleClick = function handleClick(event) {\n var tracks = this.player_.audioTracks();\n\n _MenuItem.prototype.handleClick.call(this, event);\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n track.enabled = track === this.track;\n }\n };\n\n /**\n * Handle any {@link AudioTrack} change.\n *\n * @param {EventTarget~Event} [event]\n * The {@link AudioTrackList#change} event that caused this to run.\n *\n * @listens AudioTrackList#change\n */\n\n\n AudioTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n this.selected(this.track.enabled);\n };\n\n return AudioTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\n\n/**\n * @file audio-track-button.js\n */\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends TrackButton\n */\n\nvar AudioTrackButton = function (_TrackButton) {\n inherits(AudioTrackButton, _TrackButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options={}]\n * The key/value store of player options.\n */\n function AudioTrackButton(player) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n classCallCheck(this, AudioTrackButton);\n\n options.tracks = player.audioTracks();\n\n return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n AudioTrackButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-audio-button ' + _TrackButton.prototype.buildCSSClass.call(this);\n };\n\n AudioTrackButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-audio-button ' + _TrackButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n /**\n * Create a menu item for each audio track\n *\n * @param {AudioTrackMenuItem[]} [items=[]]\n * An array of existing menu items to use.\n *\n * @return {AudioTrackMenuItem[]}\n * An array of menu items\n */\n\n\n AudioTrackButton.prototype.createItems = function createItems() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n // if there's only one audio track, there no point in showing it\n this.hideThreshold_ = 1;\n\n var tracks = this.player_.audioTracks();\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n items.push(new AudioTrackMenuItem(this.player_, {\n track: track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n }));\n }\n\n return items;\n };\n\n return AudioTrackButton;\n}(TrackButton);\n\n/**\n * The text that should display over the `AudioTrackButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nAudioTrackButton.prototype.controlText_ = 'Audio Track';\nComponent.registerComponent('AudioTrackButton', AudioTrackButton);\n\n/**\n * @file playback-rate-menu-item.js\n */\n/**\n * The specific menu item type for selecting a playback rate.\n *\n * @extends MenuItem\n */\n\nvar PlaybackRateMenuItem = function (_MenuItem) {\n inherits(PlaybackRateMenuItem, _MenuItem);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function PlaybackRateMenuItem(player, options) {\n classCallCheck(this, PlaybackRateMenuItem);\n\n var label = options.rate;\n var rate = parseFloat(label, 10);\n\n // Modify options for parent MenuItem class's init.\n options.label = label;\n options.selected = rate === 1;\n options.selectable = true;\n options.multiSelectable = false;\n\n var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n _this.label = label;\n _this.rate = rate;\n\n _this.on(player, 'ratechange', _this.update);\n return _this;\n }\n\n /**\n * This gets called when an `PlaybackRateMenuItem` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n PlaybackRateMenuItem.prototype.handleClick = function handleClick(event) {\n _MenuItem.prototype.handleClick.call(this);\n this.player().playbackRate(this.rate);\n };\n\n /**\n * Update the PlaybackRateMenuItem when the playbackrate changes.\n *\n * @param {EventTarget~Event} [event]\n * The `ratechange` event that caused this function to run.\n *\n * @listens Player#ratechange\n */\n\n\n PlaybackRateMenuItem.prototype.update = function update(event) {\n this.selected(this.player().playbackRate() === this.rate);\n };\n\n return PlaybackRateMenuItem;\n}(MenuItem);\n\n/**\n * The text that should display over the `PlaybackRateMenuItem`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\n\n/**\n * @file playback-rate-menu-button.js\n */\n/**\n * The component for controlling the playback rate.\n *\n * @extends MenuButton\n */\n\nvar PlaybackRateMenuButton = function (_MenuButton) {\n inherits(PlaybackRateMenuButton, _MenuButton);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function PlaybackRateMenuButton(player, options) {\n classCallCheck(this, PlaybackRateMenuButton);\n\n var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n _this.updateVisibility();\n _this.updateLabel();\n\n _this.on(player, 'loadstart', _this.updateVisibility);\n _this.on(player, 'ratechange', _this.updateLabel);\n return _this;\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n PlaybackRateMenuButton.prototype.createEl = function createEl$$1() {\n var el = _MenuButton.prototype.createEl.call(this);\n\n this.labelEl_ = createEl('div', {\n className: 'vjs-playback-rate-value',\n innerHTML: '1x'\n });\n\n el.appendChild(this.labelEl_);\n\n return el;\n };\n\n PlaybackRateMenuButton.prototype.dispose = function dispose() {\n this.labelEl_ = null;\n\n _MenuButton.prototype.dispose.call(this);\n };\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n\n\n PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);\n };\n\n PlaybackRateMenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n return 'vjs-playback-rate ' + _MenuButton.prototype.buildWrapperCSSClass.call(this);\n };\n\n /**\n * Create the playback rate menu\n *\n * @return {Menu}\n * Menu object populated with {@link PlaybackRateMenuItem}s\n */\n\n\n PlaybackRateMenuButton.prototype.createMenu = function createMenu() {\n var menu = new Menu(this.player());\n var rates = this.playbackRates();\n\n if (rates) {\n for (var i = rates.length - 1; i >= 0; i--) {\n menu.addChild(new PlaybackRateMenuItem(this.player(), { rate: rates[i] + 'x' }));\n }\n }\n\n return menu;\n };\n\n /**\n * Updates ARIA accessibility attributes\n */\n\n\n PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {\n // Current playback rate\n this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n };\n\n /**\n * This gets called when an `PlaybackRateMenuButton` is \"clicked\". See\n * {@link ClickableComponent} for more detailed information on what a click can be.\n *\n * @param {EventTarget~Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n\n\n PlaybackRateMenuButton.prototype.handleClick = function handleClick(event) {\n // select next rate option\n var currentRate = this.player().playbackRate();\n var rates = this.playbackRates();\n\n // this will select first one if the last one currently selected\n var newRate = rates[0];\n\n for (var i = 0; i < rates.length; i++) {\n if (rates[i] > currentRate) {\n newRate = rates[i];\n break;\n }\n }\n this.player().playbackRate(newRate);\n };\n\n /**\n * Get possible playback rates\n *\n * @return {Array}\n * All possible playback rates\n */\n\n\n PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {\n return this.options_.playbackRates || this.options_.playerOptions && this.options_.playerOptions.playbackRates;\n };\n\n /**\n * Get whether playback rates is supported by the tech\n * and an array of playback rates exists\n *\n * @return {boolean}\n * Whether changing playback rate is supported\n */\n\n\n PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {\n return this.player().tech_ && this.player().tech_.featuresPlaybackRate && this.playbackRates() && this.playbackRates().length > 0;\n };\n\n /**\n * Hide playback rate controls when they're no playback rate options to select\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#loadstart\n */\n\n\n PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility(event) {\n if (this.playbackRateSupported()) {\n this.removeClass('vjs-hidden');\n } else {\n this.addClass('vjs-hidden');\n }\n };\n\n /**\n * Update button label when rate changed\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#ratechange\n */\n\n\n PlaybackRateMenuButton.prototype.updateLabel = function updateLabel(event) {\n if (this.playbackRateSupported()) {\n this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n }\n };\n\n return PlaybackRateMenuButton;\n}(MenuButton);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\n\n/**\n * @file spacer.js\n */\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n */\n\nvar Spacer = function (_Component) {\n inherits(Spacer, _Component);\n\n function Spacer() {\n classCallCheck(this, Spacer);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n Spacer.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n Spacer.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: this.buildCSSClass()\n });\n };\n\n return Spacer;\n}(Component);\n\nComponent.registerComponent('Spacer', Spacer);\n\n/**\n * @file custom-control-spacer.js\n */\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n */\n\nvar CustomControlSpacer = function (_Spacer) {\n inherits(CustomControlSpacer, _Spacer);\n\n function CustomControlSpacer() {\n classCallCheck(this, CustomControlSpacer);\n return possibleConstructorReturn(this, _Spacer.apply(this, arguments));\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n\n\n CustomControlSpacer.prototype.createEl = function createEl() {\n var el = _Spacer.prototype.createEl.call(this, {\n className: this.buildCSSClass()\n });\n\n // No-flex/table-cell mode requires there be some content\n // in the cell to fill the remaining space of the table.\n el.innerHTML = '\\xA0';\n return el;\n };\n\n return CustomControlSpacer;\n}(Spacer);\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\n\n/**\n * @file control-bar.js\n */\n// Required children\n/**\n * Container of main controls.\n *\n * @extends Component\n */\n\nvar ControlBar = function (_Component) {\n inherits(ControlBar, _Component);\n\n function ControlBar() {\n classCallCheck(this, ControlBar);\n return possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n /**\n * Create the `Component`'s DOM element\n *\n * @return {Element}\n * The element that was created.\n */\n ControlBar.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'div', {\n className: 'vjs-control-bar',\n dir: 'ltr'\n });\n };\n\n return ControlBar;\n}(Component);\n\n/**\n * Default options for `ControlBar`\n *\n * @type {Object}\n * @private\n */\n\n\nControlBar.prototype.options_ = {\n children: ['playToggle', 'volumePanel', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subsCapsButton', 'audioTrackButton', 'fullscreenToggle']\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\n\n/**\n * @file error-display.js\n */\n/**\n * A display that indicates an error has occurred. This means that the video\n * is unplayable.\n *\n * @extends ModalDialog\n */\n\nvar ErrorDisplay = function (_ModalDialog) {\n inherits(ErrorDisplay, _ModalDialog);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function ErrorDisplay(player, options) {\n classCallCheck(this, ErrorDisplay);\n\n var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n _this.on(player, 'error', _this.open);\n return _this;\n }\n\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n *\n * @deprecated Since version 5.\n */\n\n\n ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() {\n return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this);\n };\n\n /**\n * Gets the localized error message based on the `Player`s error.\n *\n * @return {string}\n * The `Player`s error message localized or an empty string.\n */\n\n\n ErrorDisplay.prototype.content = function content() {\n var error = this.player().error();\n\n return error ? this.localize(error.message) : '';\n };\n\n return ErrorDisplay;\n}(ModalDialog);\n\n/**\n * The default options for an `ErrorDisplay`.\n *\n * @private\n */\n\n\nErrorDisplay.prototype.options_ = mergeOptions(ModalDialog.prototype.options_, {\n pauseOnOpen: false,\n fillAlways: true,\n temporary: false,\n uncloseable: true\n});\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\n\n/**\n * @file text-track-settings.js\n */\nvar LOCAL_STORAGE_KEY = 'vjs-text-track-settings';\n\nvar COLOR_BLACK = ['#000', 'Black'];\nvar COLOR_BLUE = ['#00F', 'Blue'];\nvar COLOR_CYAN = ['#0FF', 'Cyan'];\nvar COLOR_GREEN = ['#0F0', 'Green'];\nvar COLOR_MAGENTA = ['#F0F', 'Magenta'];\nvar COLOR_RED = ['#F00', 'Red'];\nvar COLOR_WHITE = ['#FFF', 'White'];\nvar COLOR_YELLOW = ['#FF0', 'Yellow'];\n\nvar OPACITY_OPAQUE = ['1', 'Opaque'];\nvar OPACITY_SEMI = ['0.5', 'Semi-Transparent'];\nvar OPACITY_TRANS = ['0', 'Transparent'];\n\n// Configuration for the various <select> elements in the DOM of this component.\n//\n// Possible keys include:\n//\n// `default`:\n// The default option index. Only needs to be provided if not zero.\n// `parser`:\n// A function which is used to parse the value from the selected option in\n// a customized way.\n// `selector`:\n// The selector used to find the associated <select> element.\nvar selectConfigs = {\n backgroundColor: {\n selector: '.vjs-bg-color > select',\n id: 'captions-background-color-%s',\n label: 'Color',\n options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n },\n\n backgroundOpacity: {\n selector: '.vjs-bg-opacity > select',\n id: 'captions-background-opacity-%s',\n label: 'Transparency',\n options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS]\n },\n\n color: {\n selector: '.vjs-fg-color > select',\n id: 'captions-foreground-color-%s',\n label: 'Color',\n options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n },\n\n edgeStyle: {\n selector: '.vjs-edge-style > select',\n id: '%s',\n label: 'Text Edge Style',\n options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']]\n },\n\n fontFamily: {\n selector: '.vjs-font-family > select',\n id: 'captions-font-family-%s',\n label: 'Font Family',\n options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']]\n },\n\n fontPercent: {\n selector: '.vjs-font-percent > select',\n id: 'captions-font-size-%s',\n label: 'Font Size',\n options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']],\n 'default': 2,\n parser: function parser(v) {\n return v === '1.00' ? null : Number(v);\n }\n },\n\n textOpacity: {\n selector: '.vjs-text-opacity > select',\n id: 'captions-foreground-opacity-%s',\n label: 'Transparency',\n options: [OPACITY_OPAQUE, OPACITY_SEMI]\n },\n\n // Options for this object are defined below.\n windowColor: {\n selector: '.vjs-window-color > select',\n id: 'captions-window-color-%s',\n label: 'Color'\n },\n\n // Options for this object are defined below.\n windowOpacity: {\n selector: '.vjs-window-opacity > select',\n id: 'captions-window-opacity-%s',\n label: 'Transparency',\n options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE]\n }\n};\n\nselectConfigs.windowColor.options = selectConfigs.backgroundColor.options;\n\n/**\n * Get the actual value of an option.\n *\n * @param {string} value\n * The value to get\n *\n * @param {Function} [parser]\n * Optional function to adjust the value.\n *\n * @return {Mixed}\n * - Will be `undefined` if no value exists\n * - Will be `undefined` if the given value is \"none\".\n * - Will be the actual value otherwise.\n *\n * @private\n */\nfunction parseOptionValue(value, parser) {\n if (parser) {\n value = parser(value);\n }\n\n if (value && value !== 'none') {\n return value;\n }\n}\n\n/**\n * Gets the value of the selected <option> element within a <select> element.\n *\n * @param {Element} el\n * the element to look in\n *\n * @param {Function} [parser]\n * Optional function to adjust the value.\n *\n * @return {Mixed}\n * - Will be `undefined` if no value exists\n * - Will be `undefined` if the given value is \"none\".\n * - Will be the actual value otherwise.\n *\n * @private\n */\nfunction getSelectedOptionValue(el, parser) {\n var value = el.options[el.options.selectedIndex].value;\n\n return parseOptionValue(value, parser);\n}\n\n/**\n * Sets the selected <option> element within a <select> element based on a\n * given value.\n *\n * @param {Element} el\n * The element to look in.\n *\n * @param {string} value\n * the property to look on.\n *\n * @param {Function} [parser]\n * Optional function to adjust the value before comparing.\n *\n * @private\n */\nfunction setSelectedOption(el, value, parser) {\n if (!value) {\n return;\n }\n\n for (var i = 0; i < el.options.length; i++) {\n if (parseOptionValue(el.options[i].value, parser) === value) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\n/**\n * Manipulate Text Tracks settings.\n *\n * @extends ModalDialog\n */\n\nvar TextTrackSettings = function (_ModalDialog) {\n inherits(TextTrackSettings, _ModalDialog);\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n function TextTrackSettings(player, options) {\n classCallCheck(this, TextTrackSettings);\n\n options.temporary = false;\n\n var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n _this.updateDisplay = bind(_this, _this.updateDisplay);\n\n // fill the modal and pretend we have opened it\n _this.fill();\n _this.hasBeenOpened_ = _this.hasBeenFilled_ = true;\n\n _this.endDialog = createEl('p', {\n className: 'vjs-control-text',\n textContent: _this.localize('End of dialog window.')\n });\n _this.el().appendChild(_this.endDialog);\n\n _this.setDefaults();\n\n // Grab `persistTextTrackSettings` from the player options if not passed in child options\n if (options.persistTextTrackSettings === undefined) {\n _this.options_.persistTextTrackSettings = _this.options_.playerOptions.persistTextTrackSettings;\n }\n\n _this.on(_this.$('.vjs-done-button'), 'click', function () {\n _this.saveSettings();\n _this.close();\n });\n\n _this.on(_this.$('.vjs-default-button'), 'click', function () {\n _this.setDefaults();\n _this.updateDisplay();\n });\n\n each(selectConfigs, function (config) {\n _this.on(_this.$(config.selector), 'change', _this.updateDisplay);\n });\n\n if (_this.options_.persistTextTrackSettings) {\n _this.restoreSettings();\n }\n return _this;\n }\n\n TextTrackSettings.prototype.dispose = function dispose() {\n this.endDialog = null;\n\n _ModalDialog.prototype.dispose.call(this);\n };\n\n /**\n * Create a <select> element with configured options.\n *\n * @param {string} key\n * Configuration key to use during creation.\n *\n * @return {string}\n * An HTML string.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElSelect_ = function createElSelect_(key) {\n var _this2 = this;\n\n var legendId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'label';\n\n var config = selectConfigs[key];\n var id = config.id.replace('%s', this.id_);\n var selectLabelledbyIds = [legendId, id].join(' ').trim();\n\n return ['<' + type + ' id=\"' + id + '\" class=\"' + (type === 'label' ? 'vjs-label' : '') + '\">', this.localize(config.label), '</' + type + '>', '<select aria-labelledby=\"' + selectLabelledbyIds + '\">'].concat(config.options.map(function (o) {\n var optionId = id + '-' + o[1].replace(/\\W+/g, '');\n\n return ['<option id=\"' + optionId + '\" value=\"' + o[0] + '\" ', 'aria-labelledby=\"' + selectLabelledbyIds + ' ' + optionId + '\">', _this2.localize(o[1]), '</option>'].join('');\n })).concat('</select>').join('');\n };\n\n /**\n * Create foreground color element for the component\n *\n * @return {string}\n * An HTML string.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElFgColor_ = function createElFgColor_() {\n var legendId = 'captions-text-legend-' + this.id_;\n\n return ['<fieldset class=\"vjs-fg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Text'), '</legend>', this.createElSelect_('color', legendId), '<span class=\"vjs-text-opacity vjs-opacity\">', this.createElSelect_('textOpacity', legendId), '</span>', '</fieldset>'].join('');\n };\n\n /**\n * Create background color element for the component\n *\n * @return {string}\n * An HTML string.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElBgColor_ = function createElBgColor_() {\n var legendId = 'captions-background-' + this.id_;\n\n return ['<fieldset class=\"vjs-bg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Background'), '</legend>', this.createElSelect_('backgroundColor', legendId), '<span class=\"vjs-bg-opacity vjs-opacity\">', this.createElSelect_('backgroundOpacity', legendId), '</span>', '</fieldset>'].join('');\n };\n\n /**\n * Create window color element for the component\n *\n * @return {string}\n * An HTML string.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElWinColor_ = function createElWinColor_() {\n var legendId = 'captions-window-' + this.id_;\n\n return ['<fieldset class=\"vjs-window-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Window'), '</legend>', this.createElSelect_('windowColor', legendId), '<span class=\"vjs-window-opacity vjs-opacity\">', this.createElSelect_('windowOpacity', legendId), '</span>', '</fieldset>'].join('');\n };\n\n /**\n * Create color elements for the component\n *\n * @return {Element}\n * The element that was created\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElColors_ = function createElColors_() {\n return createEl('div', {\n className: 'vjs-track-settings-colors',\n innerHTML: [this.createElFgColor_(), this.createElBgColor_(), this.createElWinColor_()].join('')\n });\n };\n\n /**\n * Create font elements for the component\n *\n * @return {Element}\n * The element that was created.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElFont_ = function createElFont_() {\n return createEl('div', {\n className: 'vjs-track-settings-font',\n innerHTML: ['<fieldset class=\"vjs-font-percent vjs-track-setting\">', this.createElSelect_('fontPercent', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-edge-style vjs-track-setting\">', this.createElSelect_('edgeStyle', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-font-family vjs-track-setting\">', this.createElSelect_('fontFamily', '', 'legend'), '</fieldset>'].join('')\n });\n };\n\n /**\n * Create controls for the component\n *\n * @return {Element}\n * The element that was created.\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.createElControls_ = function createElControls_() {\n var defaultsDescription = this.localize('restore all settings to the default values');\n\n return createEl('div', {\n className: 'vjs-track-settings-controls',\n innerHTML: ['<button class=\"vjs-default-button\" title=\"' + defaultsDescription + '\">', this.localize('Reset'), '<span class=\"vjs-control-text\"> ' + defaultsDescription + '</span>', '</button>', '<button class=\"vjs-done-button\">' + this.localize('Done') + '</button>'].join('')\n });\n };\n\n TextTrackSettings.prototype.content = function content() {\n return [this.createElColors_(), this.createElFont_(), this.createElControls_()];\n };\n\n TextTrackSettings.prototype.label = function label() {\n return this.localize('Caption Settings Dialog');\n };\n\n TextTrackSettings.prototype.description = function description() {\n return this.localize('Beginning of dialog window. Escape will cancel and close the window.');\n };\n\n TextTrackSettings.prototype.buildCSSClass = function buildCSSClass() {\n return _ModalDialog.prototype.buildCSSClass.call(this) + ' vjs-text-track-settings';\n };\n\n /**\n * Gets an object of text track settings (or null).\n *\n * @return {Object}\n * An object with config values parsed from the DOM or localStorage.\n */\n\n\n TextTrackSettings.prototype.getValues = function getValues() {\n var _this3 = this;\n\n return reduce(selectConfigs, function (accum, config, key) {\n var value = getSelectedOptionValue(_this3.$(config.selector), config.parser);\n\n if (value !== undefined) {\n accum[key] = value;\n }\n\n return accum;\n }, {});\n };\n\n /**\n * Sets text track settings from an object of values.\n *\n * @param {Object} values\n * An object with config values parsed from the DOM or localStorage.\n */\n\n\n TextTrackSettings.prototype.setValues = function setValues(values) {\n var _this4 = this;\n\n each(selectConfigs, function (config, key) {\n setSelectedOption(_this4.$(config.selector), values[key], config.parser);\n });\n };\n\n /**\n * Sets all `<select>` elements to their default values.\n */\n\n\n TextTrackSettings.prototype.setDefaults = function setDefaults() {\n var _this5 = this;\n\n each(selectConfigs, function (config) {\n var index = config.hasOwnProperty('default') ? config['default'] : 0;\n\n _this5.$(config.selector).selectedIndex = index;\n });\n };\n\n /**\n * Restore texttrack settings from localStorage\n */\n\n\n TextTrackSettings.prototype.restoreSettings = function restoreSettings() {\n var values = void 0;\n\n try {\n values = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY));\n } catch (err) {\n log$1.warn(err);\n }\n\n if (values) {\n this.setValues(values);\n }\n };\n\n /**\n * Save text track settings to localStorage\n */\n\n\n TextTrackSettings.prototype.saveSettings = function saveSettings() {\n if (!this.options_.persistTextTrackSettings) {\n return;\n }\n\n var values = this.getValues();\n\n try {\n if (Object.keys(values).length) {\n window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(values));\n } else {\n window.localStorage.removeItem(LOCAL_STORAGE_KEY);\n }\n } catch (err) {\n log$1.warn(err);\n }\n };\n\n /**\n * Update display of text track settings\n */\n\n\n TextTrackSettings.prototype.updateDisplay = function updateDisplay() {\n var ttDisplay = this.player_.getChild('textTrackDisplay');\n\n if (ttDisplay) {\n ttDisplay.updateDisplay();\n }\n };\n\n /**\n * conditionally blur the element and refocus the captions button\n *\n * @private\n */\n\n\n TextTrackSettings.prototype.conditionalBlur_ = function conditionalBlur_() {\n this.previouslyActiveEl_ = null;\n this.off(document, 'keydown', this.handleKeyDown);\n\n var cb = this.player_.controlBar;\n var subsCapsBtn = cb && cb.subsCapsButton;\n var ccBtn = cb && cb.captionsButton;\n\n if (subsCapsBtn) {\n subsCapsBtn.focus();\n } else if (ccBtn) {\n ccBtn.focus();\n }\n };\n\n return TextTrackSettings;\n}(ModalDialog);\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\n/**\n * @file resize-manager.js\n */\n/**\n * A Resize Manager. It is in charge of triggering `playerresize` on the player in the right conditions.\n *\n * It'll either create an iframe and use a debounced resize handler on it or use the new {@link https://wicg.github.io/ResizeObserver/|ResizeObserver}.\n *\n * If the ResizeObserver is available natively, it will be used. A polyfill can be passed in as an option.\n * If a `playerresize` event is not needed, the ResizeManager component can be removed from the player, see the example below.\n * @example <caption>How to disable the resize manager</caption>\n * const player = videojs('#vid', {\n * resizeManager: false\n * });\n *\n * @see {@link https://wicg.github.io/ResizeObserver/|ResizeObserver specification}\n *\n * @extends Component\n */\n\nvar ResizeManager = function (_Component) {\n inherits(ResizeManager, _Component);\n\n /**\n * Create the ResizeManager.\n *\n * @param {Object} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of ResizeManager options.\n *\n * @param {Object} [options.ResizeObserver]\n * A polyfill for ResizeObserver can be passed in here.\n * If this is set to null it will ignore the native ResizeObserver and fall back to the iframe fallback.\n */\n function ResizeManager(player, options) {\n classCallCheck(this, ResizeManager);\n\n var RESIZE_OBSERVER_AVAILABLE = options.ResizeObserver || window.ResizeObserver;\n\n // if `null` was passed, we want to disable the ResizeObserver\n if (options.ResizeObserver === null) {\n RESIZE_OBSERVER_AVAILABLE = false;\n }\n\n // Only create an element when ResizeObserver isn't available\n var options_ = mergeOptions({ createEl: !RESIZE_OBSERVER_AVAILABLE }, options);\n\n var _this = possibleConstructorReturn(this, _Component.call(this, player, options_));\n\n _this.ResizeObserver = options.ResizeObserver || window.ResizeObserver;\n _this.loadListener_ = null;\n _this.resizeObserver_ = null;\n _this.debouncedHandler_ = debounce(function () {\n _this.resizeHandler();\n }, 100, false, player);\n\n if (RESIZE_OBSERVER_AVAILABLE) {\n _this.resizeObserver_ = new _this.ResizeObserver(_this.debouncedHandler_);\n _this.resizeObserver_.observe(player.el());\n } else {\n _this.loadListener_ = function () {\n if (_this.el_.contentWindow) {\n on(_this.el_.contentWindow, 'resize', _this.debouncedHandler_);\n }\n _this.off('load', _this.loadListener_);\n };\n\n _this.on('load', _this.loadListener_);\n }\n return _this;\n }\n\n ResizeManager.prototype.createEl = function createEl() {\n return _Component.prototype.createEl.call(this, 'iframe', {\n className: 'vjs-resize-manager'\n });\n };\n\n /**\n * Called when a resize is triggered on the iframe or a resize is observed via the ResizeObserver\n *\n * @fires Player#playerresize\n */\n\n\n ResizeManager.prototype.resizeHandler = function resizeHandler() {\n /**\n * Called when the player size has changed\n *\n * @event Player#playerresize\n * @type {EventTarget~Event}\n */\n this.player_.trigger('playerresize');\n };\n\n ResizeManager.prototype.dispose = function dispose() {\n if (this.resizeObserver_) {\n if (this.player_.el()) {\n this.resizeObserver_.unobserve(this.player_.el());\n }\n this.resizeObserver_.disconnect();\n }\n\n if (this.el_ && this.el_.contentWindow) {\n off(this.el_.contentWindow, 'resize', this.debouncedHandler_);\n }\n\n if (this.loadListener_) {\n this.off('load', this.loadListener_);\n }\n\n this.ResizeObserver = null;\n this.resizeObserver = null;\n this.debouncedHandler_ = null;\n this.loadListener_ = null;\n };\n\n return ResizeManager;\n}(Component);\n\nComponent.registerComponent('ResizeManager', ResizeManager);\n\n/**\n * This function is used to fire a sourceset when there is something\n * similar to `mediaEl.load()` being called. It will try to find the source via\n * the `src` attribute and then the `<source>` elements. It will then fire `sourceset`\n * with the source that was found or empty string if we cannot know. If it cannot\n * find a source then `sourceset` will not be fired.\n *\n * @param {Html5} tech\n * The tech object that sourceset was setup on\n *\n * @return {boolean}\n * returns false if the sourceset was not fired and true otherwise.\n */\nvar sourcesetLoad = function sourcesetLoad(tech) {\n var el = tech.el();\n\n // if `el.src` is set, that source will be loaded.\n if (el.hasAttribute('src')) {\n tech.triggerSourceset(el.src);\n return true;\n }\n\n /**\n * Since there isn't a src property on the media element, source elements will be used for\n * implementing the source selection algorithm. This happens asynchronously and\n * for most cases were there is more than one source we cannot tell what source will\n * be loaded, without re-implementing the source selection algorithm. At this time we are not\n * going to do that. There are three special cases that we do handle here though:\n *\n * 1. If there are no sources, do not fire `sourceset`.\n * 2. If there is only one `<source>` with a `src` property/attribute that is our `src`\n * 3. If there is more than one `<source>` but all of them have the same `src` url.\n * That will be our src.\n */\n var sources = tech.$$('source');\n var srcUrls = [];\n var src = '';\n\n // if there are no sources, do not fire sourceset\n if (!sources.length) {\n return false;\n }\n\n // only count valid/non-duplicate source elements\n for (var i = 0; i < sources.length; i++) {\n var url = sources[i].src;\n\n if (url && srcUrls.indexOf(url) === -1) {\n srcUrls.push(url);\n }\n }\n\n // there were no valid sources\n if (!srcUrls.length) {\n return false;\n }\n\n // there is only one valid source element url\n // use that\n if (srcUrls.length === 1) {\n src = srcUrls[0];\n }\n\n tech.triggerSourceset(src);\n return true;\n};\n\n/**\n * our implementation of an `innerHTML` descriptor for browsers\n * that do not have one.\n */\nvar innerHTMLDescriptorPolyfill = {};\n\nif (!IS_IE8) {\n innerHTMLDescriptorPolyfill = Object.defineProperty({}, 'innerHTML', {\n get: function get() {\n return this.cloneNode(true).innerHTML;\n },\n set: function set(v) {\n // make a dummy node to use innerHTML on\n var dummy = document.createElement(this.nodeName.toLowerCase());\n\n // set innerHTML to the value provided\n dummy.innerHTML = v;\n\n // make a document fragment to hold the nodes from dummy\n var docFrag = document.createDocumentFragment();\n\n // copy all of the nodes created by the innerHTML on dummy\n // to the document fragment\n while (dummy.childNodes.length) {\n docFrag.appendChild(dummy.childNodes[0]);\n }\n\n // remove content\n this.innerText = '';\n\n // now we add all of that html in one by appending the\n // document fragment. This is how innerHTML does it.\n window.Element.prototype.appendChild.call(this, docFrag);\n\n // then return the result that innerHTML's setter would\n return this.innerHTML;\n }\n });\n}\n/**\n * Get a property descriptor given a list of priorities and the\n * property to get.\n */\nvar getDescriptor = function getDescriptor(priority, prop) {\n var descriptor = {};\n\n for (var i = 0; i < priority.length; i++) {\n descriptor = Object.getOwnPropertyDescriptor(priority[i], prop);\n\n if (descriptor && descriptor.set && descriptor.get) {\n break;\n }\n }\n\n descriptor.enumerable = true;\n descriptor.configurable = true;\n\n return descriptor;\n};\n\nvar getInnerHTMLDescriptor = function getInnerHTMLDescriptor(tech) {\n return getDescriptor([tech.el(), window.HTMLMediaElement.prototype, window.Element.prototype, innerHTMLDescriptorPolyfill], 'innerHTML');\n};\n\n/**\n * Patches browser internal functions so that we can tell syncronously\n * if a `<source>` was appended to the media element. For some reason this\n * causes a `sourceset` if the the media element is ready and has no source.\n * This happens when:\n * - The page has just loaded and the media element does not have a source.\n * - The media element was emptied of all sources, then `load()` was called.\n *\n * It does this by patching the following functions/properties when they are supported:\n *\n * - `append()` - can be used to add a `<source>` element to the media element\n * - `appendChild()` - can be used to add a `<source>` element to the media element\n * - `insertAdjacentHTML()` - can be used to add a `<source>` element to the media element\n * - `innerHTML` - can be used to add a `<source>` element to the media element\n *\n * @param {Html5} tech\n * The tech object that sourceset is being setup on.\n */\nvar firstSourceWatch = function firstSourceWatch(tech) {\n var el = tech.el();\n\n // make sure firstSourceWatch isn't setup twice.\n if (el.resetSourceWatch_) {\n return;\n }\n\n var old = {};\n var innerDescriptor = getInnerHTMLDescriptor(tech);\n var appendWrapper = function appendWrapper(appendFn) {\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var retval = appendFn.apply(el, args);\n\n sourcesetLoad(tech);\n\n return retval;\n };\n };\n\n ['append', 'appendChild', 'insertAdjacentHTML'].forEach(function (k) {\n if (!el[k]) {\n return;\n }\n\n // store the old function\n old[k] = el[k];\n\n // call the old function with a sourceset if a source\n // was loaded\n el[k] = appendWrapper(old[k]);\n });\n\n Object.defineProperty(el, 'innerHTML', mergeOptions(innerDescriptor, {\n set: appendWrapper(innerDescriptor.set)\n }));\n\n el.resetSourceWatch_ = function () {\n el.resetSourceWatch_ = null;\n Object.keys(old).forEach(function (k) {\n el[k] = old[k];\n });\n\n Object.defineProperty(el, 'innerHTML', innerDescriptor);\n };\n\n // on the first sourceset, we need to revert our changes\n tech.one('sourceset', el.resetSourceWatch_);\n};\n\n/**\n * our implementation of a `src` descriptor for browsers\n * that do not have one.\n */\n\nvar srcDescriptorPolyfill = {};\n\nif (!IS_IE8) {\n srcDescriptorPolyfill = Object.defineProperty({}, 'src', {\n get: function get() {\n if (this.hasAttribute('src')) {\n return getAbsoluteURL(window.Element.prototype.getAttribute.call(this, 'src'));\n }\n\n return '';\n },\n set: function set(v) {\n window.Element.prototype.setAttribute.call(this, 'src', v);\n\n return v;\n }\n });\n}\n\nvar getSrcDescriptor = function getSrcDescriptor(tech) {\n return getDescriptor([tech.el(), window.HTMLMediaElement.prototype, srcDescriptorPolyfill], 'src');\n};\n\n/**\n * setup `sourceset` handling on the `Html5` tech. This function\n * patches the following element properties/functions:\n *\n * - `src` - to determine when `src` is set\n * - `setAttribute()` - to determine when `src` is set\n * - `load()` - this re-triggers the source selection algorithm, and can\n * cause a sourceset.\n *\n * If there is no source when we are adding `sourceset` support or during a `load()`\n * we also patch the functions listed in `firstSourceWatch`.\n *\n * @param {Html5} tech\n * The tech to patch\n */\nvar setupSourceset = function setupSourceset(tech) {\n if (!tech.featuresSourceset) {\n return;\n }\n\n var el = tech.el();\n\n // make sure sourceset isn't setup twice.\n if (el.resetSourceset_) {\n return;\n }\n\n var srcDescriptor = getSrcDescriptor(tech);\n var oldSetAttribute = el.setAttribute;\n var oldLoad = el.load;\n\n Object.defineProperty(el, 'src', mergeOptions(srcDescriptor, {\n set: function set(v) {\n var retval = srcDescriptor.set.call(el, v);\n\n // we use the getter here to get the actual value set on src\n tech.triggerSourceset(el.src);\n\n return retval;\n }\n }));\n\n el.setAttribute = function (n, v) {\n var retval = oldSetAttribute.call(el, n, v);\n\n if (/src/i.test(n)) {\n tech.triggerSourceset(el.src);\n }\n\n return retval;\n };\n\n el.load = function () {\n var retval = oldLoad.call(el);\n\n // if load was called, but there was no source to fire\n // sourceset on. We have to watch for a source append\n // as that can trigger a `sourceset` when the media element\n // has no source\n if (!sourcesetLoad(tech)) {\n tech.triggerSourceset('');\n firstSourceWatch(tech);\n }\n\n return retval;\n };\n\n if (el.currentSrc) {\n tech.triggerSourceset(el.currentSrc);\n } else if (!sourcesetLoad(tech)) {\n firstSourceWatch(tech);\n }\n\n el.resetSourceset_ = function () {\n el.resetSourceset_ = null;\n el.load = oldLoad;\n el.setAttribute = oldSetAttribute;\n Object.defineProperty(el, 'src', srcDescriptor);\n if (el.resetSourceWatch_) {\n el.resetSourceWatch_();\n }\n };\n};\n\nvar _templateObject$2 = taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n This may prevent text tracks from loading.']);\n\n/**\n * @file html5.js\n */\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @mixes Tech~SouceHandlerAdditions\n * @extends Tech\n */\n\nvar Html5 = function (_Tech) {\n inherits(Html5, _Tech);\n\n /**\n * Create an instance of this Tech.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n *\n * @param {Component~ReadyCallback} ready\n * Callback function to call when the `HTML5` Tech is ready.\n */\n function Html5(options, ready) {\n classCallCheck(this, Html5);\n\n var _this = possibleConstructorReturn(this, _Tech.call(this, options, ready));\n\n var source = options.source;\n var crossoriginTracks = false;\n\n // Set the source if one is provided\n // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n // anyway so the error gets fired.\n if (source && (_this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {\n _this.setSource(source);\n } else {\n _this.handleLateInit_(_this.el_);\n }\n\n // setup sourceset after late sourceset/init\n if (options.enableSourceset) {\n _this.setupSourcesetHandling_();\n }\n\n if (_this.el_.hasChildNodes()) {\n\n var nodes = _this.el_.childNodes;\n var nodesLength = nodes.length;\n var removeNodes = [];\n\n while (nodesLength--) {\n var node = nodes[nodesLength];\n var nodeName = node.nodeName.toLowerCase();\n\n if (nodeName === 'track') {\n if (!_this.featuresNativeTextTracks) {\n // Empty video tag tracks so the built-in player doesn't use them also.\n // This may not be fast enough to stop HTML5 browsers from reading the tags\n // so we'll need to turn off any default tracks if we're manually doing\n // captions and subtitles. videoElement.textTracks\n removeNodes.push(node);\n } else {\n // store HTMLTrackElement and TextTrack to remote list\n _this.remoteTextTrackEls().addTrackElement_(node);\n _this.remoteTextTracks().addTrack(node.track);\n _this.textTracks().addTrack(node.track);\n if (!crossoriginTracks && !_this.el_.hasAttribute('crossorigin') && isCrossOrigin(node.src)) {\n crossoriginTracks = true;\n }\n }\n }\n }\n\n for (var i = 0; i < removeNodes.length; i++) {\n _this.el_.removeChild(removeNodes[i]);\n }\n }\n\n _this.proxyNativeTracks_();\n if (_this.featuresNativeTextTracks && crossoriginTracks) {\n log$1.warn(tsml(_templateObject$2));\n }\n\n // prevent iOS Safari from disabling metadata text tracks during native playback\n _this.restoreMetadataTracksInIOSNativePlayer_();\n\n // Determine if native controls should be used\n // Our goal should be to get the custom controls on mobile solid everywhere\n // so we can remove this all together. Right now this will block custom\n // controls on touch enabled laptops like the Chrome Pixel\n if ((TOUCH_ENABLED || IS_IPHONE || IS_NATIVE_ANDROID) && options.nativeControlsForTouch === true) {\n _this.setControls(true);\n }\n\n // on iOS, we want to proxy `webkitbeginfullscreen` and `webkitendfullscreen`\n // into a `fullscreenchange` event\n _this.proxyWebkitFullscreen_();\n\n _this.triggerReady();\n return _this;\n }\n\n /**\n * Dispose of `HTML5` media element and remove all tracks.\n */\n\n\n Html5.prototype.dispose = function dispose() {\n if (this.el_ && this.el_.resetSourceset_) {\n this.el_.resetSourceset_();\n }\n Html5.disposeMediaElement(this.el_);\n this.options_ = null;\n\n // tech will handle clearing of the emulated track list\n _Tech.prototype.dispose.call(this);\n };\n\n /**\n * Modify the media element so that we can detect when\n * the source is changed. Fires `sourceset` just after the source has changed\n */\n\n\n Html5.prototype.setupSourcesetHandling_ = function setupSourcesetHandling_() {\n setupSourceset(this);\n };\n\n /**\n * When a captions track is enabled in the iOS Safari native player, all other\n * tracks are disabled (including metadata tracks), which nulls all of their\n * associated cue points. This will restore metadata tracks to their pre-fullscreen\n * state in those cases so that cue points are not needlessly lost.\n *\n * @private\n */\n\n\n Html5.prototype.restoreMetadataTracksInIOSNativePlayer_ = function restoreMetadataTracksInIOSNativePlayer_() {\n var textTracks = this.textTracks();\n var metadataTracksPreFullscreenState = void 0;\n\n // captures a snapshot of every metadata track's current state\n var takeMetadataTrackSnapshot = function takeMetadataTrackSnapshot() {\n metadataTracksPreFullscreenState = [];\n\n for (var i = 0; i < textTracks.length; i++) {\n var track = textTracks[i];\n\n if (track.kind === 'metadata') {\n metadataTracksPreFullscreenState.push({\n track: track,\n storedMode: track.mode\n });\n }\n }\n };\n\n // snapshot each metadata track's initial state, and update the snapshot\n // each time there is a track 'change' event\n takeMetadataTrackSnapshot();\n textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n this.on('dispose', function () {\n return textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n });\n\n var restoreTrackMode = function restoreTrackMode() {\n for (var i = 0; i < metadataTracksPreFullscreenState.length; i++) {\n var storedTrack = metadataTracksPreFullscreenState[i];\n\n if (storedTrack.track.mode === 'disabled' && storedTrack.track.mode !== storedTrack.storedMode) {\n storedTrack.track.mode = storedTrack.storedMode;\n }\n }\n // we only want this handler to be executed on the first 'change' event\n textTracks.removeEventListener('change', restoreTrackMode);\n };\n\n // when we enter fullscreen playback, stop updating the snapshot and\n // restore all track modes to their pre-fullscreen state\n this.on('webkitbeginfullscreen', function () {\n textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n\n // remove the listener before adding it just in case it wasn't previously removed\n textTracks.removeEventListener('change', restoreTrackMode);\n textTracks.addEventListener('change', restoreTrackMode);\n });\n\n // start updating the snapshot again after leaving fullscreen\n this.on('webkitendfullscreen', function () {\n // remove the listener before adding it just in case it wasn't previously removed\n textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n // remove the restoreTrackMode handler in case it wasn't triggered during fullscreen playback\n textTracks.removeEventListener('change', restoreTrackMode);\n });\n };\n\n /**\n * Proxy all native track list events to our track lists if the browser we are playing\n * in supports that type of track list.\n *\n * @private\n */\n\n\n Html5.prototype.proxyNativeTracks_ = function proxyNativeTracks_() {\n var _this2 = this;\n\n NORMAL.names.forEach(function (name) {\n var props = NORMAL[name];\n var elTracks = _this2.el()[props.getterName];\n var techTracks = _this2[props.getterName]();\n\n if (!_this2['featuresNative' + props.capitalName + 'Tracks'] || !elTracks || !elTracks.addEventListener) {\n return;\n }\n var listeners = {\n change: function change(e) {\n techTracks.trigger({\n type: 'change',\n target: techTracks,\n currentTarget: techTracks,\n srcElement: techTracks\n });\n },\n addtrack: function addtrack(e) {\n techTracks.addTrack(e.track);\n },\n removetrack: function removetrack(e) {\n techTracks.removeTrack(e.track);\n }\n };\n var removeOldTracks = function removeOldTracks() {\n var removeTracks = [];\n\n for (var i = 0; i < techTracks.length; i++) {\n var found = false;\n\n for (var j = 0; j < elTracks.length; j++) {\n if (elTracks[j] === techTracks[i]) {\n found = true;\n break;\n }\n }\n\n if (!found) {\n removeTracks.push(techTracks[i]);\n }\n }\n\n while (removeTracks.length) {\n techTracks.removeTrack(removeTracks.shift());\n }\n };\n\n Object.keys(listeners).forEach(function (eventName) {\n var listener = listeners[eventName];\n\n elTracks.addEventListener(eventName, listener);\n _this2.on('dispose', function (e) {\n return elTracks.removeEventListener(eventName, listener);\n });\n });\n\n // Remove (native) tracks that are not used anymore\n _this2.on('loadstart', removeOldTracks);\n _this2.on('dispose', function (e) {\n return _this2.off('loadstart', removeOldTracks);\n });\n });\n };\n\n /**\n * Create the `Html5` Tech's DOM element.\n *\n * @return {Element}\n * The element that gets created.\n */\n\n\n Html5.prototype.createEl = function createEl$$1() {\n var el = this.options_.tag;\n\n // Check if this browser supports moving the element into the box.\n // On the iPhone video will break if you move the element,\n // So we have to create a brand new element.\n // If we ingested the player div, we do not need to move the media element.\n if (!el || !(this.options_.playerElIngest || this.movingMediaElementInDOM)) {\n\n // If the original tag is still there, clone and remove it.\n if (el) {\n var clone = el.cloneNode(true);\n\n if (el.parentNode) {\n el.parentNode.insertBefore(clone, el);\n }\n Html5.disposeMediaElement(el);\n el = clone;\n } else {\n el = document.createElement('video');\n\n // determine if native controls should be used\n var tagAttributes = this.options_.tag && getAttributes(this.options_.tag);\n var attributes = mergeOptions({}, tagAttributes);\n\n if (!TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n delete attributes.controls;\n }\n\n setAttributes(el, assign(attributes, {\n id: this.options_.techId,\n 'class': 'vjs-tech'\n }));\n }\n\n el.playerId = this.options_.playerId;\n }\n\n if (typeof this.options_.preload !== 'undefined') {\n setAttribute(el, 'preload', this.options_.preload);\n }\n\n // Update specific tag settings, in case they were overridden\n // `autoplay` has to be *last* so that `muted` and `playsinline` are present\n // when iOS/Safari or other browsers attempt to autoplay.\n var settingsAttrs = ['loop', 'muted', 'playsinline', 'autoplay'];\n\n for (var i = 0; i < settingsAttrs.length; i++) {\n var attr = settingsAttrs[i];\n var value = this.options_[attr];\n\n if (typeof value !== 'undefined') {\n if (value) {\n setAttribute(el, attr, attr);\n } else {\n removeAttribute(el, attr);\n }\n el[attr] = value;\n }\n }\n\n return el;\n };\n\n /**\n * This will be triggered if the loadstart event has already fired, before videojs was\n * ready. Two known examples of when this can happen are:\n * 1. If we're loading the playback object after it has started loading\n * 2. The media is already playing the (often with autoplay on) then\n *\n * This function will fire another loadstart so that videojs can catchup.\n *\n * @fires Tech#loadstart\n *\n * @return {undefined}\n * returns nothing.\n */\n\n\n Html5.prototype.handleLateInit_ = function handleLateInit_(el) {\n if (el.networkState === 0 || el.networkState === 3) {\n // The video element hasn't started loading the source yet\n // or didn't find a source\n return;\n }\n\n if (el.readyState === 0) {\n // NetworkState is set synchronously BUT loadstart is fired at the\n // end of the current stack, usually before setInterval(fn, 0).\n // So at this point we know loadstart may have already fired or is\n // about to fire, and either way the player hasn't seen it yet.\n // We don't want to fire loadstart prematurely here and cause a\n // double loadstart so we'll wait and see if it happens between now\n // and the next loop, and fire it if not.\n // HOWEVER, we also want to make sure it fires before loadedmetadata\n // which could also happen between now and the next loop, so we'll\n // watch for that also.\n var loadstartFired = false;\n var setLoadstartFired = function setLoadstartFired() {\n loadstartFired = true;\n };\n\n this.on('loadstart', setLoadstartFired);\n\n var triggerLoadstart = function triggerLoadstart() {\n // We did miss the original loadstart. Make sure the player\n // sees loadstart before loadedmetadata\n if (!loadstartFired) {\n this.trigger('loadstart');\n }\n };\n\n this.on('loadedmetadata', triggerLoadstart);\n\n this.ready(function () {\n this.off('loadstart', setLoadstartFired);\n this.off('loadedmetadata', triggerLoadstart);\n\n if (!loadstartFired) {\n // We did miss the original native loadstart. Fire it now.\n this.trigger('loadstart');\n }\n });\n\n return;\n }\n\n // From here on we know that loadstart already fired and we missed it.\n // The other readyState events aren't as much of a problem if we double\n // them, so not going to go to as much trouble as loadstart to prevent\n // that unless we find reason to.\n var eventsToTrigger = ['loadstart'];\n\n // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n eventsToTrigger.push('loadedmetadata');\n\n // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n if (el.readyState >= 2) {\n eventsToTrigger.push('loadeddata');\n }\n\n // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n if (el.readyState >= 3) {\n eventsToTrigger.push('canplay');\n }\n\n // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n if (el.readyState >= 4) {\n eventsToTrigger.push('canplaythrough');\n }\n\n // We still need to give the player time to add event listeners\n this.ready(function () {\n eventsToTrigger.forEach(function (type) {\n this.trigger(type);\n }, this);\n });\n };\n\n /**\n * Set current time for the `HTML5` tech.\n *\n * @param {number} seconds\n * Set the current time of the media to this.\n */\n\n\n Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {\n try {\n this.el_.currentTime = seconds;\n } catch (e) {\n log$1(e, 'Video is not ready. (Video.js)');\n // this.warning(VideoJS.warnings.videoNotReady);\n }\n };\n\n /**\n * Get the current duration of the HTML5 media element.\n *\n * @return {number}\n * The duration of the media or 0 if there is no duration.\n */\n\n\n Html5.prototype.duration = function duration() {\n var _this3 = this;\n\n // Android Chrome will report duration as Infinity for VOD HLS until after\n // playback has started, which triggers the live display erroneously.\n // Return NaN if playback has not started and trigger a durationupdate once\n // the duration can be reliably known.\n if (this.el_.duration === Infinity && IS_ANDROID && IS_CHROME && this.el_.currentTime === 0) {\n // Wait for the first `timeupdate` with currentTime > 0 - there may be\n // several with 0\n var checkProgress = function checkProgress() {\n if (_this3.el_.currentTime > 0) {\n // Trigger durationchange for genuinely live video\n if (_this3.el_.duration === Infinity) {\n _this3.trigger('durationchange');\n }\n _this3.off('timeupdate', checkProgress);\n }\n };\n\n this.on('timeupdate', checkProgress);\n return NaN;\n }\n return this.el_.duration || NaN;\n };\n\n /**\n * Get the current width of the HTML5 media element.\n *\n * @return {number}\n * The width of the HTML5 media element.\n */\n\n\n Html5.prototype.width = function width() {\n return this.el_.offsetWidth;\n };\n\n /**\n * Get the current height of the HTML5 media element.\n *\n * @return {number}\n * The heigth of the HTML5 media element.\n */\n\n\n Html5.prototype.height = function height() {\n return this.el_.offsetHeight;\n };\n\n /**\n * Proxy iOS `webkitbeginfullscreen` and `webkitendfullscreen` into\n * `fullscreenchange` event.\n *\n * @private\n * @fires fullscreenchange\n * @listens webkitendfullscreen\n * @listens webkitbeginfullscreen\n * @listens webkitbeginfullscreen\n */\n\n\n Html5.prototype.proxyWebkitFullscreen_ = function proxyWebkitFullscreen_() {\n var _this4 = this;\n\n if (!('webkitDisplayingFullscreen' in this.el_)) {\n return;\n }\n\n var endFn = function endFn() {\n this.trigger('fullscreenchange', { isFullscreen: false });\n };\n\n var beginFn = function beginFn() {\n if ('webkitPresentationMode' in this.el_ && this.el_.webkitPresentationMode !== 'picture-in-picture') {\n this.one('webkitendfullscreen', endFn);\n\n this.trigger('fullscreenchange', { isFullscreen: true });\n }\n };\n\n this.on('webkitbeginfullscreen', beginFn);\n this.on('dispose', function () {\n _this4.off('webkitbeginfullscreen', beginFn);\n _this4.off('webkitendfullscreen', endFn);\n });\n };\n\n /**\n * Check if fullscreen is supported on the current playback device.\n *\n * @return {boolean}\n * - True if fullscreen is supported.\n * - False if fullscreen is not supported.\n */\n\n\n Html5.prototype.supportsFullScreen = function supportsFullScreen() {\n if (typeof this.el_.webkitEnterFullScreen === 'function') {\n var userAgent = window.navigator && window.navigator.userAgent || '';\n\n // Seems to be broken in Chromium/Chrome && Safari in Leopard\n if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Request that the `HTML5` Tech enter fullscreen.\n */\n\n\n Html5.prototype.enterFullScreen = function enterFullScreen() {\n var video = this.el_;\n\n if (video.paused && video.networkState <= video.HAVE_METADATA) {\n // attempt to prime the video element for programmatic access\n // this isn't necessary on the desktop but shouldn't hurt\n this.el_.play();\n\n // playing and pausing synchronously during the transition to fullscreen\n // can get iOS ~6.1 devices into a play/pause loop\n this.setTimeout(function () {\n video.pause();\n video.webkitEnterFullScreen();\n }, 0);\n } else {\n video.webkitEnterFullScreen();\n }\n };\n\n /**\n * Request that the `HTML5` Tech exit fullscreen.\n */\n\n\n Html5.prototype.exitFullScreen = function exitFullScreen() {\n this.el_.webkitExitFullScreen();\n };\n\n /**\n * A getter/setter for the `Html5` Tech's source object.\n * > Note: Please use {@link Html5#setSource}\n *\n * @param {Tech~SourceObject} [src]\n * The source object you want to set on the `HTML5` techs element.\n *\n * @return {Tech~SourceObject|undefined}\n * - The current source object when a source is not passed in.\n * - undefined when setting\n *\n * @deprecated Since version 5.\n */\n\n\n Html5.prototype.src = function src(_src) {\n if (_src === undefined) {\n return this.el_.src;\n }\n\n // Setting src through `src` instead of `setSrc` will be deprecated\n this.setSrc(_src);\n };\n\n /**\n * Reset the tech by removing all sources and then calling\n * {@link Html5.resetMediaElement}.\n */\n\n\n Html5.prototype.reset = function reset() {\n Html5.resetMediaElement(this.el_);\n };\n\n /**\n * Get the current source on the `HTML5` Tech. Falls back to returning the source from\n * the HTML5 media element.\n *\n * @return {Tech~SourceObject}\n * The current source object from the HTML5 tech. With a fallback to the\n * elements source.\n */\n\n\n Html5.prototype.currentSrc = function currentSrc() {\n if (this.currentSource_) {\n return this.currentSource_.src;\n }\n return this.el_.currentSrc;\n };\n\n /**\n * Set controls attribute for the HTML5 media Element.\n *\n * @param {string} val\n * Value to set the controls attribute to\n */\n\n\n Html5.prototype.setControls = function setControls(val) {\n this.el_.controls = !!val;\n };\n\n /**\n * Create and returns a remote {@link TextTrack} object.\n *\n * @param {string} kind\n * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n *\n * @param {string} [label]\n * Label to identify the text track\n *\n * @param {string} [language]\n * Two letter language abbreviation\n *\n * @return {TextTrack}\n * The TextTrack that gets created.\n */\n\n\n Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n if (!this.featuresNativeTextTracks) {\n return _Tech.prototype.addTextTrack.call(this, kind, label, language);\n }\n\n return this.el_.addTextTrack(kind, label, language);\n };\n\n /**\n * Creates either native TextTrack or an emulated TextTrack depending\n * on the value of `featuresNativeTextTracks`\n *\n * @param {Object} options\n * The object should contain the options to intialize the TextTrack with.\n *\n * @param {string} [options.kind]\n * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n *\n * @param {string} [options.label].\n * Label to identify the text track\n *\n * @param {string} [options.language]\n * Two letter language abbreviation.\n *\n * @param {boolean} [options.default]\n * Default this track to on.\n *\n * @param {string} [options.id]\n * The internal id to assign this track.\n *\n * @param {string} [options.src]\n * A source url for the track.\n *\n * @return {HTMLTrackElement}\n * The track element that gets created.\n */\n\n\n Html5.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n if (!this.featuresNativeTextTracks) {\n return _Tech.prototype.createRemoteTextTrack.call(this, options);\n }\n var htmlTrackElement = document.createElement('track');\n\n if (options.kind) {\n htmlTrackElement.kind = options.kind;\n }\n if (options.label) {\n htmlTrackElement.label = options.label;\n }\n if (options.language || options.srclang) {\n htmlTrackElement.srclang = options.language || options.srclang;\n }\n if (options['default']) {\n htmlTrackElement['default'] = options['default'];\n }\n if (options.id) {\n htmlTrackElement.id = options.id;\n }\n if (options.src) {\n htmlTrackElement.src = options.src;\n }\n\n return htmlTrackElement;\n };\n\n /**\n * Creates a remote text track object and returns an html track element.\n *\n * @param {Object} options The object should contain values for\n * kind, language, label, and src (location of the WebVTT file)\n * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be\n * automatically removed from the video element whenever the source changes\n * @return {HTMLTrackElement} An Html Track Element.\n * This can be an emulated {@link HTMLTrackElement} or a native one.\n * @deprecated The default value of the \"manualCleanup\" parameter will default\n * to \"false\" in upcoming versions of Video.js\n */\n\n\n Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n var htmlTrackElement = _Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup);\n\n if (this.featuresNativeTextTracks) {\n this.el().appendChild(htmlTrackElement);\n }\n\n return htmlTrackElement;\n };\n\n /**\n * Remove remote `TextTrack` from `TextTrackList` object\n *\n * @param {TextTrack} track\n * `TextTrack` object to remove\n */\n\n\n Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n _Tech.prototype.removeRemoteTextTrack.call(this, track);\n\n if (this.featuresNativeTextTracks) {\n var tracks = this.$$('track');\n\n var i = tracks.length;\n\n while (i--) {\n if (track === tracks[i] || track === tracks[i].track) {\n this.el().removeChild(tracks[i]);\n }\n }\n }\n };\n\n /**\n * Gets available media playback quality metrics as specified by the W3C's Media\n * Playback Quality API.\n *\n * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n *\n * @return {Object}\n * An object with supported media playback quality metrics\n */\n\n\n Html5.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n if (typeof this.el().getVideoPlaybackQuality === 'function') {\n return this.el().getVideoPlaybackQuality();\n }\n\n var videoPlaybackQuality = {};\n\n if (typeof this.el().webkitDroppedFrameCount !== 'undefined' && typeof this.el().webkitDecodedFrameCount !== 'undefined') {\n videoPlaybackQuality.droppedVideoFrames = this.el().webkitDroppedFrameCount;\n videoPlaybackQuality.totalVideoFrames = this.el().webkitDecodedFrameCount;\n }\n\n if (window.performance && typeof window.performance.now === 'function') {\n videoPlaybackQuality.creationTime = window.performance.now();\n } else if (window.performance && window.performance.timing && typeof window.performance.timing.navigationStart === 'number') {\n videoPlaybackQuality.creationTime = window.Date.now() - window.performance.timing.navigationStart;\n }\n\n return videoPlaybackQuality;\n };\n\n return Html5;\n}(Tech);\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\nif (isReal()) {\n\n /**\n * Element for testing browser HTML5 media capabilities\n *\n * @type {Element}\n * @constant\n * @private\n */\n Html5.TEST_VID = document.createElement('video');\n var track = document.createElement('track');\n\n track.kind = 'captions';\n track.srclang = 'en';\n track.label = 'English';\n Html5.TEST_VID.appendChild(track);\n}\n\n/**\n * Check if HTML5 media is supported by this browser/device.\n *\n * @return {boolean}\n * - True if HTML5 media is supported.\n * - False if HTML5 media is not supported.\n */\nHtml5.isSupported = function () {\n // IE9 with no Media Player is a LIAR! (#984)\n try {\n Html5.TEST_VID.volume = 0.5;\n } catch (e) {\n return false;\n }\n\n return !!(Html5.TEST_VID && Html5.TEST_VID.canPlayType);\n};\n\n/**\n * Check if the tech can support the given type\n *\n * @param {string} type\n * The mimetype to check\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlayType = function (type) {\n return Html5.TEST_VID.canPlayType(type);\n};\n\n/**\n * Check if the tech can support the given source\n * @param {Object} srcObj\n * The source object\n * @param {Object} options\n * The options passed to the tech\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlaySource = function (srcObj, options) {\n return Html5.canPlayType(srcObj.type);\n};\n\n/**\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {boolean}\n * - True if volume can be controlled\n * - False otherwise\n */\nHtml5.canControlVolume = function () {\n // IE will error if Windows Media Player not installed #3315\n try {\n var volume = Html5.TEST_VID.volume;\n\n Html5.TEST_VID.volume = volume / 2 + 0.1;\n return volume !== Html5.TEST_VID.volume;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Check if the volume can be muted in this browser/device.\n * Some devices, e.g. iOS, don't allow changing volume\n * but permits muting/unmuting.\n *\n * @return {bolean}\n * - True if volume can be muted\n * - False otherwise\n */\nHtml5.canMuteVolume = function () {\n try {\n var muted = Html5.TEST_VID.muted;\n\n // in some versions of iOS muted property doesn't always\n // work, so we want to set both property and attribute\n Html5.TEST_VID.muted = !muted;\n if (Html5.TEST_VID.muted) {\n setAttribute(Html5.TEST_VID, 'muted', 'muted');\n } else {\n removeAttribute(Html5.TEST_VID, 'muted', 'muted');\n }\n return muted !== Html5.TEST_VID.muted;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Check if the playback rate can be changed in this browser/device.\n *\n * @return {boolean}\n * - True if playback rate can be controlled\n * - False otherwise\n */\nHtml5.canControlPlaybackRate = function () {\n // Playback rate API is implemented in Android Chrome, but doesn't do anything\n // https://github.com/videojs/video.js/issues/3180\n if (IS_ANDROID && IS_CHROME && CHROME_VERSION < 58) {\n return false;\n }\n // IE will error if Windows Media Player not installed #3315\n try {\n var playbackRate = Html5.TEST_VID.playbackRate;\n\n Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;\n return playbackRate !== Html5.TEST_VID.playbackRate;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Check if we can override a video/audio elements attributes, with\n * Object.defineProperty.\n *\n * @return {boolean}\n * - True if builtin attributes can be overriden\n * - False otherwise\n */\nHtml5.canOverrideAttributes = function () {\n if (IS_IE8) {\n return false;\n }\n // if we cannot overwrite the src/innerHTML property, there is no support\n // iOS 7 safari for instance cannot do this.\n try {\n var noop = function noop() {};\n\n Object.defineProperty(document.createElement('video'), 'src', { get: noop, set: noop });\n Object.defineProperty(document.createElement('audio'), 'src', { get: noop, set: noop });\n Object.defineProperty(document.createElement('video'), 'innerHTML', { get: noop, set: noop });\n Object.defineProperty(document.createElement('audio'), 'innerHTML', { get: noop, set: noop });\n } catch (e) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Check to see if native `TextTrack`s are supported by this browser/device.\n *\n * @return {boolean}\n * - True if native `TextTrack`s are supported.\n * - False otherwise\n */\nHtml5.supportsNativeTextTracks = function () {\n return IS_ANY_SAFARI || IS_IOS && IS_CHROME;\n};\n\n/**\n * Check to see if native `VideoTrack`s are supported by this browser/device\n *\n * @return {boolean}\n * - True if native `VideoTrack`s are supported.\n * - False otherwise\n */\nHtml5.supportsNativeVideoTracks = function () {\n return !!(Html5.TEST_VID && Html5.TEST_VID.videoTracks);\n};\n\n/**\n * Check to see if native `AudioTrack`s are supported by this browser/device\n *\n * @return {boolean}\n * - True if native `AudioTrack`s are supported.\n * - False otherwise\n */\nHtml5.supportsNativeAudioTracks = function () {\n return !!(Html5.TEST_VID && Html5.TEST_VID.audioTracks);\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'resize', 'volumechange'];\n\n/**\n * Boolean indicating whether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default {@link Html5.canControlVolume}\n */\nHtml5.prototype.featuresVolumeControl = Html5.canControlVolume();\n\n/**\n * Boolean indicating whether the `Tech` supports muting volume.\n *\n * @type {bolean}\n * @default {@link Html5.canMuteVolume}\n */\nHtml5.prototype.featuresMuteControl = Html5.canMuteVolume();\n\n/**\n * Boolean indicating whether the `Tech` supports changing the speed at which the media\n * plays. Examples:\n * - Set player to play 2x (twice) as fast\n * - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default {@link Html5.canControlPlaybackRate}\n */\nHtml5.prototype.featuresPlaybackRate = Html5.canControlPlaybackRate();\n\n/**\n * Boolean indicating wether the `Tech` supports the `sourceset` event.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresSourceset = Html5.canOverrideAttributes();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the media element\n * moving in the DOM. iOS breaks if you move the media element, so this is set this to\n * false there. Everywhere else this should be true.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.movingMediaElementInDOM = !IS_IOS;\n\n// TODO: Previous comment: No longer appears to be used. Can probably be removed.\n// Is this true?\n/**\n * Boolean indicating whether the `HTML5` tech currently supports automatic media resize\n * when going into fullscreen.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresFullscreenResize = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the progress event.\n * If this is false, manual `progress` events will be triggred instead.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresProgressEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the timeupdate event.\n * If this is false, manual `timeupdate` events will be triggred instead.\n *\n * @default\n */\nHtml5.prototype.featuresTimeupdateEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `TextTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeTextTracks}\n */\nHtml5.prototype.featuresNativeTextTracks = Html5.supportsNativeTextTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `VideoTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeVideoTracks}\n */\nHtml5.prototype.featuresNativeVideoTracks = Html5.supportsNativeVideoTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `AudioTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeAudioTracks}\n */\nHtml5.prototype.featuresNativeAudioTracks = Html5.supportsNativeAudioTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nvar canPlayType = Html5.TEST_VID && Html5.TEST_VID.constructor.prototype.canPlayType;\nvar mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nvar mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function () {\n\n // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n // Firefox and Chrome report correctly\n if (ANDROID_VERSION >= 4.0 && !IS_FIREFOX && !IS_CHROME) {\n Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n if (type && mpegurlRE.test(type)) {\n return 'maybe';\n }\n return canPlayType.call(this, type);\n };\n\n // Override Android 2.2 and less canPlayType method which is broken\n } else if (IS_OLD_ANDROID) {\n Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n if (type && mp4RE.test(type)) {\n return 'maybe';\n }\n return canPlayType.call(this, type);\n };\n }\n};\n\nHtml5.unpatchCanPlayType = function () {\n var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n\n Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n return r;\n};\n\n// by default, patch the media element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function (el) {\n if (!el) {\n return;\n }\n\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n\n // remove any child track or source nodes to prevent their loading\n while (el.hasChildNodes()) {\n el.removeChild(el.firstChild);\n }\n\n // remove any src reference. not setting `src=''` because that causes a warning\n // in firefox\n el.removeAttribute('src');\n\n // force the media element to update its loading state by calling load()\n // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n if (typeof el.load === 'function') {\n // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n (function () {\n try {\n el.load();\n } catch (e) {\n // not supported\n }\n })();\n }\n};\n\nHtml5.resetMediaElement = function (el) {\n if (!el) {\n return;\n }\n\n var sources = el.querySelectorAll('source');\n var i = sources.length;\n\n while (i--) {\n el.removeChild(sources[i]);\n }\n\n // remove any src reference.\n // not setting `src=''` because that throws an error\n el.removeAttribute('src');\n\n if (typeof el.load === 'function') {\n // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n (function () {\n try {\n el.load();\n } catch (e) {\n // satisfy linter\n }\n })();\n }\n};\n\n/* Native HTML5 element property wrapping ----------------------------------- */\n// Wrap native boolean attributes with getters that check both property and attribute\n// The list is as followed:\n// muted, defaultMuted, autoplay, controls, loop, playsinline\n[\n/**\n * Get the value of `muted` from the media element. `muted` indicates\n * that the volume for the media should be set to silent. This does not actually change\n * the `volume` attribute.\n *\n * @method Html5#muted\n * @return {boolean}\n * - True if the value of `volume` should be ignored and the audio set to silent.\n * - False if the value of `volume` should be used.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Get the value of `defaultMuted` from the media element. `defaultMuted` indicates\n * whether the media should start muted or not. Only changes the default state of the\n * media. `muted` and `defaultMuted` can have different values. {@link Html5#muted} indicates the\n * current state.\n *\n * @method Html5#defaultMuted\n * @return {boolean}\n * - The value of `defaultMuted` from the media element.\n * - True indicates that the media should start muted.\n * - False indicates that the media should not start muted\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Get the value of `autoplay` from the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#autoplay\n * @return {boolean}\n * - The value of `autoplay` from the media element.\n * - True indicates that the media should start as soon as the page loads.\n * - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Get the value of `controls` from the media element. `controls` indicates\n * whether the native media controls should be shown or hidden.\n *\n * @method Html5#controls\n * @return {boolean}\n * - The value of `controls` from the media element.\n * - True indicates that native controls should be showing.\n * - False indicates that native controls should be hidden.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-controls}\n */\n'controls',\n\n/**\n * Get the value of `loop` from the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#loop\n * @return {boolean}\n * - The value of `loop` from the media element.\n * - True indicates that playback should seek back to start once\n * the end of a media is reached.\n * - False indicates that playback should not loop back to the start when the\n * end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Get the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#playsinline\n * @return {boolean}\n * - The value of `playsinline` from the media element.\n * - True indicates that the media should play inline.\n * - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n Html5.prototype[prop] = function () {\n return this.el_[prop] || this.el_.hasAttribute(prop);\n };\n});\n\n// Wrap native boolean attributes with setters that set both property and attribute\n// The list is as followed:\n// setMuted, setDefaultMuted, setAutoplay, setLoop, setPlaysinline\n// setControls is special-cased above\n[\n/**\n * Set the value of `muted` on the media element. `muted` indicates that the current\n * audio level should be silent.\n *\n * @method Html5#setMuted\n * @param {boolean} muted\n * - True if the audio should be set to silent\n * - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Set the value of `defaultMuted` on the media element. `defaultMuted` indicates that the current\n * audio level should be silent, but will only effect the muted level on intial playback..\n *\n * @method Html5.prototype.setDefaultMuted\n * @param {boolean} defaultMuted\n * - True if the audio should be set to silent\n * - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Set the value of `autoplay` on the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#setAutoplay\n * @param {boolean} autoplay\n * - True indicates that the media should start as soon as the page loads.\n * - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Set the value of `loop` on the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#setLoop\n * @param {boolean} loop\n * - True indicates that playback should seek back to start once\n * the end of a media is reached.\n * - False indicates that playback should not loop back to the start when the\n * end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Set the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#setPlaysinline\n * @param {boolean} playsinline\n * - True indicates that the media should play inline.\n * - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n this.el_[prop] = v;\n\n if (v) {\n this.el_.setAttribute(prop, prop);\n } else {\n this.el_.removeAttribute(prop);\n }\n };\n});\n\n// Wrap native properties with a getter\n// The list is as followed\n// paused, currentTime, buffered, volume, poster, preload, error, seeking\n// seekable, ended, playbackRate, defaultPlaybackRate, played, networkState\n// readyState, videoWidth, videoHeight\n[\n/**\n * Get the value of `paused` from the media element. `paused` indicates whether the media element\n * is currently paused or not.\n *\n * @method Html5#paused\n * @return {boolean}\n * The value of `paused` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-paused}\n */\n'paused',\n\n/**\n * Get the value of `currentTime` from the media element. `currentTime` indicates\n * the current second that the media is at in playback.\n *\n * @method Html5#currentTime\n * @return {number}\n * The value of `currentTime` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-currenttime}\n */\n'currentTime',\n\n/**\n * Get the value of `buffered` from the media element. `buffered` is a `TimeRange`\n * object that represents the parts of the media that are already downloaded and\n * available for playback.\n *\n * @method Html5#buffered\n * @return {TimeRange}\n * The value of `buffered` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-buffered}\n */\n'buffered',\n\n/**\n * Get the value of `volume` from the media element. `volume` indicates\n * the current playback volume of audio for a media. `volume` will be a value from 0\n * (silent) to 1 (loudest and default).\n *\n * @method Html5#volume\n * @return {number}\n * The value of `volume` from the media element. Value will be between 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Get the value of `poster` from the media element. `poster` indicates\n * that the url of an image file that can/will be shown when no media data is available.\n *\n * @method Html5#poster\n * @return {string}\n * The value of `poster` from the media element. Value will be a url to an\n * image.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-video-poster}\n */\n'poster',\n\n/**\n * Get the value of `preload` from the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n * media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n * interaction\n *\n * @method Html5#preload\n * @return {string}\n * The value of `preload` from the media element. Will be 'none', 'metadata',\n * or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Get the value of the `error` from the media element. `error` indicates any\n * MediaError that may have occured during playback. If error returns null there is no\n * current error.\n *\n * @method Html5#error\n * @return {MediaError|null}\n * The value of `error` from the media element. Will be `MediaError` if there\n * is a current error and null otherwise.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-error}\n */\n'error',\n\n/**\n * Get the value of `seeking` from the media element. `seeking` indicates whether the\n * media is currently seeking to a new position or not.\n *\n * @method Html5#seeking\n * @return {boolean}\n * - The value of `seeking` from the media element.\n * - True indicates that the media is currently seeking to a new position.\n * - Flase indicates that the media is not seeking to a new position at this time.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seeking}\n */\n'seeking',\n\n/**\n * Get the value of `seekable` from the media element. `seekable` returns a\n * `TimeRange` object indicating ranges of time that can currently be `seeked` to.\n *\n * @method Html5#seekable\n * @return {TimeRange}\n * The value of `seekable` from the media element. A `TimeRange` object\n * indicating the current ranges of time that can be seeked to.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seekable}\n */\n'seekable',\n\n/**\n * Get the value of `ended` from the media element. `ended` indicates whether\n * the media has reached the end or not.\n *\n * @method Html5#ended\n * @return {boolean}\n * - The value of `ended` from the media element.\n * - True indicates that the media has ended.\n * - False indicates that the media has not ended.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-ended}\n */\n'ended',\n\n/**\n * Get the value of `playbackRate` from the media element. `playbackRate` indicates\n * the rate at which the media is currently playing back. Examples:\n * - if playbackRate is set to 2, media will play twice as fast.\n * - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#playbackRate\n * @return {number}\n * The value of `playbackRate` from the media element. A number indicating\n * the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Get the value of `defaultPlaybackRate` from the media element. `defaultPlaybackRate` indicates\n * the rate at which the media is currently playing back. This value will not indicate the current\n * `playbackRate` after playback has started, use {@link Html5#playbackRate} for that.\n *\n * Examples:\n * - if defaultPlaybackRate is set to 2, media will play twice as fast.\n * - if defaultPlaybackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.defaultPlaybackRate\n * @return {number}\n * The value of `defaultPlaybackRate` from the media element. A number indicating\n * the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'defaultPlaybackRate',\n\n/**\n * Get the value of `played` from the media element. `played` returns a `TimeRange`\n * object representing points in the media timeline that have been played.\n *\n * @method Html5#played\n * @return {TimeRange}\n * The value of `played` from the media element. A `TimeRange` object indicating\n * the ranges of time that have been played.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-played}\n */\n'played',\n\n/**\n * Get the value of `networkState` from the media element. `networkState` indicates\n * the current network state. It returns an enumeration from the following list:\n * - 0: NETWORK_EMPTY\n * - 1: NEWORK_IDLE\n * - 2: NETWORK_LOADING\n * - 3: NETWORK_NO_SOURCE\n *\n * @method Html5#networkState\n * @return {number}\n * The value of `networkState` from the media element. This will be a number\n * from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-networkstate}\n */\n'networkState',\n\n/**\n * Get the value of `readyState` from the media element. `readyState` indicates\n * the current state of the media element. It returns an enumeration from the\n * following list:\n * - 0: HAVE_NOTHING\n * - 1: HAVE_METADATA\n * - 2: HAVE_CURRENT_DATA\n * - 3: HAVE_FUTURE_DATA\n * - 4: HAVE_ENOUGH_DATA\n *\n * @method Html5#readyState\n * @return {number}\n * The value of `readyState` from the media element. This will be a number\n * from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#ready-states}\n */\n'readyState',\n\n/**\n * Get the value of `videoWidth` from the video element. `videoWidth` indicates\n * the current width of the video in css pixels.\n *\n * @method Html5#videoWidth\n * @return {number}\n * The value of `videoWidth` from the video element. This will be a number\n * in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoWidth',\n\n/**\n * Get the value of `videoHeight` from the video element. `videoHeigth` indicates\n * the current height of the video in css pixels.\n *\n * @method Html5#videoHeight\n * @return {number}\n * The value of `videoHeight` from the video element. This will be a number\n * in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoHeight'].forEach(function (prop) {\n Html5.prototype[prop] = function () {\n return this.el_[prop];\n };\n});\n\n// Wrap native properties with a setter in this format:\n// set + toTitleCase(name)\n// The list is as follows:\n// setVolume, setSrc, setPoster, setPreload, setPlaybackRate, setDefaultPlaybackRate\n[\n/**\n * Set the value of `volume` on the media element. `volume` indicates the current\n * audio level as a percentage in decimal form. This means that 1 is 100%, 0.5 is 50%, and\n * so on.\n *\n * @method Html5#setVolume\n * @param {number} percentAsDecimal\n * The volume percent as a decimal. Valid range is from 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Set the value of `src` on the media element. `src` indicates the current\n * {@link Tech~SourceObject} for the media.\n *\n * @method Html5#setSrc\n * @param {Tech~SourceObject} src\n * The source object to set as the current source.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-src}\n */\n'src',\n\n/**\n * Set the value of `poster` on the media element. `poster` is the url to\n * an image file that can/will be shown when no media data is available.\n *\n * @method Html5#setPoster\n * @param {string} poster\n * The url to an image that should be used as the `poster` for the media\n * element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-poster}\n */\n'poster',\n\n/**\n * Set the value of `preload` on the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n * media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n * interaction\n *\n * @method Html5#setPreload\n * @param {string} preload\n * The value of `preload` to set on the media element. Must be 'none', 'metadata',\n * or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Set the value of `playbackRate` on the media element. `playbackRate` indicates\n * the rate at which the media should play back. Examples:\n * - if playbackRate is set to 2, media will play twice as fast.\n * - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#setPlaybackRate\n * @return {number}\n * The value of `playbackRate` from the media element. A number indicating\n * the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Set the value of `defaultPlaybackRate` on the media element. `defaultPlaybackRate` indicates\n * the rate at which the media should play back upon initial startup. Changing this value\n * after a video has started will do nothing. Instead you should used {@link Html5#setPlaybackRate}.\n *\n * Example Values:\n * - if playbackRate is set to 2, media will play twice as fast.\n * - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.setDefaultPlaybackRate\n * @return {number}\n * The value of `defaultPlaybackRate` from the media element. A number indicating\n * the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultplaybackrate}\n */\n'defaultPlaybackRate'].forEach(function (prop) {\n Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n this.el_[prop] = v;\n };\n});\n\n// wrap native functions with a function\n// The list is as follows:\n// pause, load play\n[\n/**\n * A wrapper around the media elements `pause` function. This will call the `HTML5`\n * media elements `pause` function.\n *\n * @method Html5#pause\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-pause}\n */\n'pause',\n\n/**\n * A wrapper around the media elements `load` function. This will call the `HTML5`s\n * media element `load` function.\n *\n * @method Html5#load\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-load}\n */\n'load',\n\n/**\n * A wrapper around the media elements `play` function. This will call the `HTML5`s\n * media element `play` function.\n *\n * @method Html5#play\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-play}\n */\n'play'].forEach(function (prop) {\n Html5.prototype[prop] = function () {\n return this.el_[prop]();\n };\n});\n\nTech.withSourceHandlers(Html5);\n\n/**\n * Native source handler for Html5, simply passes the source to the media element.\n *\n * @proprety {Tech~SourceObject} source\n * The source object\n *\n * @proprety {Html5} tech\n * The instance of the HTML5 tech.\n */\nHtml5.nativeSourceHandler = {};\n\n/**\n * Check if the media element can play the given mime type.\n *\n * @param {string} type\n * The mimetype to check\n *\n * @return {string}\n * 'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canPlayType = function (type) {\n // IE9 on Windows 7 without MediaPlayer throws an error here\n // https://github.com/videojs/video.js/issues/519\n try {\n return Html5.TEST_VID.canPlayType(type);\n } catch (e) {\n return '';\n }\n};\n\n/**\n * Check if the media element can handle a source natively.\n *\n * @param {Tech~SourceObject} source\n * The source object\n *\n * @param {Object} [options]\n * Options to be passed to the tech.\n *\n * @return {string}\n * 'probably', 'maybe', or '' (empty string).\n */\nHtml5.nativeSourceHandler.canHandleSource = function (source, options) {\n\n // If a type was provided we should rely on that\n if (source.type) {\n return Html5.nativeSourceHandler.canPlayType(source.type);\n\n // If no type, fall back to checking 'video/[EXTENSION]'\n } else if (source.src) {\n var ext = getFileExtension(source.src);\n\n return Html5.nativeSourceHandler.canPlayType('video/' + ext);\n }\n\n return '';\n};\n\n/**\n * Pass the source to the native media element.\n *\n * @param {Tech~SourceObject} source\n * The source object\n *\n * @param {Html5} tech\n * The instance of the Html5 tech\n *\n * @param {Object} [options]\n * The options to pass to the source\n */\nHtml5.nativeSourceHandler.handleSource = function (source, tech, options) {\n tech.setSrc(source.src);\n};\n\n/**\n * A noop for the native dispose function, as cleanup is not needed.\n */\nHtml5.nativeSourceHandler.dispose = function () {};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\nTech.registerTech('Html5', Html5);\n\nvar _templateObject$1 = taggedTemplateLiteralLoose(['\\n Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n See https://github.com/videojs/video.js/issues/2617 for more info.\\n '], ['\\n Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n See https://github.com/videojs/video.js/issues/2617 for more info.\\n ']);\n\n/**\n * @file player.js\n */\n// Subclasses Component\n// The following imports are used only to ensure that the corresponding modules\n// are always included in the video.js package. Importing the modules will\n// execute them and they will register themselves with video.js.\n// Import Html5 tech, at least for disposing the original video tag.\n// The following tech events are simply re-triggered\n// on the player when they happen\nvar TECH_EVENTS_RETRIGGER = [\n/**\n * Fired while the user agent is downloading media data.\n *\n * @event Player#progress\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `progress` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechProgress_\n * @fires Player#progress\n * @listens Tech#progress\n */\n'progress',\n\n/**\n * Fires when the loading of an audio/video is aborted.\n *\n * @event Player#abort\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `abort` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechAbort_\n * @fires Player#abort\n * @listens Tech#abort\n */\n'abort',\n\n/**\n * Fires when the browser is intentionally not getting media data.\n *\n * @event Player#suspend\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `suspend` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechSuspend_\n * @fires Player#suspend\n * @listens Tech#suspend\n */\n'suspend',\n\n/**\n * Fires when the current playlist is empty.\n *\n * @event Player#emptied\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `emptied` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechEmptied_\n * @fires Player#emptied\n * @listens Tech#emptied\n */\n'emptied',\n/**\n * Fires when the browser is trying to get media data, but data is not available.\n *\n * @event Player#stalled\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechStalled_\n * @fires Player#stalled\n * @listens Tech#stalled\n */\n'stalled',\n\n/**\n * Fires when the browser has loaded meta data for the audio/video.\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoadedmetadata_\n * @fires Player#loadedmetadata\n * @listens Tech#loadedmetadata\n */\n'loadedmetadata',\n\n/**\n * Fires when the browser has loaded the current frame of the audio/video.\n *\n * @event Player#loadeddata\n * @type {event}\n */\n/**\n * Retrigger the `loadeddata` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoaddeddata_\n * @fires Player#loadeddata\n * @listens Tech#loadeddata\n */\n'loadeddata',\n\n/**\n * Fires when the current playback position has changed.\n *\n * @event Player#timeupdate\n * @type {event}\n */\n/**\n * Retrigger the `timeupdate` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTimeUpdate_\n * @fires Player#timeupdate\n * @listens Tech#timeupdate\n */\n'timeupdate',\n\n/**\n * Fires when the video's intrinsic dimensions change\n *\n * @event Player#resize\n * @type {event}\n */\n/**\n * Retrigger the `resize` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechResize_\n * @fires Player#resize\n * @listens Tech#resize\n */\n'resize',\n\n/**\n * Fires when the volume has been changed\n *\n * @event Player#volumechange\n * @type {event}\n */\n/**\n * Retrigger the `volumechange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechVolumechange_\n * @fires Player#volumechange\n * @listens Tech#volumechange\n */\n'volumechange',\n\n/**\n * Fires when the text track has been changed\n *\n * @event Player#texttrackchange\n * @type {event}\n */\n/**\n * Retrigger the `texttrackchange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTexttrackchange_\n * @fires Player#texttrackchange\n * @listens Tech#texttrackchange\n */\n'texttrackchange'];\n\n// events to queue when playback rate is zero\n// this is a hash for the sole purpose of mapping non-camel-cased event names\n// to camel-cased function names\nvar TECH_EVENTS_QUEUE = {\n canplay: 'CanPlay',\n canplaythrough: 'CanPlayThrough',\n playing: 'Playing',\n seeked: 'Seeked'\n};\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods\n * are used to initialize a video.\n *\n * After an instance has been created it can be accessed globally in two ways:\n * 1. By calling `videojs('example_video_1');`\n * 2. By using it directly via `videojs.players.example_video_1;`\n *\n * @extends Component\n */\n\nvar Player = function (_Component) {\n inherits(Player, _Component);\n\n /**\n * Create an instance of this class.\n *\n * @param {Element} tag\n * The original video DOM element used for configuring options.\n *\n * @param {Object} [options]\n * Object of option names and values.\n *\n * @param {Component~ReadyCallback} [ready]\n * Ready callback function.\n */\n function Player(tag, options, ready) {\n classCallCheck(this, Player);\n\n // Make sure tag ID exists\n tag.id = tag.id || options.id || 'vjs_video_' + newGUID();\n\n // Set Options\n // The options argument overrides options set in the video tag\n // which overrides globally set options.\n // This latter part coincides with the load order\n // (tag must exist before Player)\n options = assign(Player.getTagSettings(tag), options);\n\n // Delay the initialization of children because we need to set up\n // player properties first, and can't use `this` before `super()`\n options.initChildren = false;\n\n // Same with creating the element\n options.createEl = false;\n\n // don't auto mixin the evented mixin\n options.evented = false;\n\n // we don't want the player to report touch activity on itself\n // see enableTouchActivity in Component\n options.reportTouchActivity = false;\n\n // If language is not set, get the closest lang attribute\n if (!options.language) {\n if (typeof tag.closest === 'function') {\n var closest = tag.closest('[lang]');\n\n if (closest && closest.getAttribute) {\n options.language = closest.getAttribute('lang');\n }\n } else {\n var element = tag;\n\n while (element && element.nodeType === 1) {\n if (getAttributes(element).hasOwnProperty('lang')) {\n options.language = element.getAttribute('lang');\n break;\n }\n element = element.parentNode;\n }\n }\n }\n\n // Run base component initializing with new options\n\n // Tracks when a tech changes the poster\n var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n _this.isPosterFromTech_ = false;\n\n // Holds callback info that gets queued when playback rate is zero\n // and a seek is happening\n _this.queuedCallbacks_ = [];\n\n // Turn off API access because we're loading a new tech that might load asynchronously\n _this.isReady_ = false;\n\n // Init state hasStarted_\n _this.hasStarted_ = false;\n\n // Init state userActive_\n _this.userActive_ = false;\n\n // if the global option object was accidentally blown away by\n // someone, bail early with an informative error\n if (!_this.options_ || !_this.options_.techOrder || !_this.options_.techOrder.length) {\n throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');\n }\n\n // Store the original tag used to set options\n _this.tag = tag;\n\n // Store the tag attributes used to restore html5 element\n _this.tagAttributes = tag && getAttributes(tag);\n\n // Update current language\n _this.language(_this.options_.language);\n\n // Update Supported Languages\n if (options.languages) {\n // Normalise player option languages to lowercase\n var languagesToLower = {};\n\n Object.getOwnPropertyNames(options.languages).forEach(function (name$$1) {\n languagesToLower[name$$1.toLowerCase()] = options.languages[name$$1];\n });\n _this.languages_ = languagesToLower;\n } else {\n _this.languages_ = Player.prototype.options_.languages;\n }\n\n // Cache for video property values.\n _this.cache_ = {};\n\n // Set poster\n _this.poster_ = options.poster || '';\n\n // Set controls\n _this.controls_ = !!options.controls;\n\n // Set default values for lastVolume\n _this.cache_.lastVolume = 1;\n\n // Original tag settings stored in options\n // now remove immediately so native controls don't flash.\n // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n tag.controls = false;\n tag.removeAttribute('controls');\n\n // the attribute overrides the option\n if (tag.hasAttribute('autoplay')) {\n _this.options_.autoplay = true;\n } else {\n // otherwise use the setter to validate and\n // set the correct value.\n _this.autoplay(_this.options_.autoplay);\n }\n\n /*\n * Store the internal state of scrubbing\n *\n * @private\n * @return {Boolean} True if the user is scrubbing\n */\n _this.scrubbing_ = false;\n\n _this.el_ = _this.createEl();\n\n // Set default value for lastPlaybackRate\n _this.cache_.lastPlaybackRate = _this.defaultPlaybackRate();\n\n // Make this an evented object and use `el_` as its event bus.\n evented(_this, { eventBusKey: 'el_' });\n\n // We also want to pass the original player options to each component and plugin\n // as well so they don't need to reach back into the player for options later.\n // We also need to do another copy of this.options_ so we don't end up with\n // an infinite loop.\n var playerOptionsCopy = mergeOptions(_this.options_);\n\n // Load plugins\n if (options.plugins) {\n var plugins = options.plugins;\n\n Object.keys(plugins).forEach(function (name$$1) {\n if (typeof this[name$$1] === 'function') {\n this[name$$1](plugins[name$$1]);\n } else {\n throw new Error('plugin \"' + name$$1 + '\" does not exist');\n }\n }, _this);\n }\n\n _this.options_.playerOptions = playerOptionsCopy;\n\n _this.middleware_ = [];\n\n _this.initChildren();\n\n // Set isAudio based on whether or not an audio tag was used\n _this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n // Update controls className. Can't do this when the controls are initially\n // set because the element doesn't exist yet.\n if (_this.controls()) {\n _this.addClass('vjs-controls-enabled');\n } else {\n _this.addClass('vjs-controls-disabled');\n }\n\n // Set ARIA label and region role depending on player type\n _this.el_.setAttribute('role', 'region');\n if (_this.isAudio()) {\n _this.el_.setAttribute('aria-label', _this.localize('Audio Player'));\n } else {\n _this.el_.setAttribute('aria-label', _this.localize('Video Player'));\n }\n\n if (_this.isAudio()) {\n _this.addClass('vjs-audio');\n }\n\n if (_this.flexNotSupported_()) {\n _this.addClass('vjs-no-flex');\n }\n\n // TODO: Make this smarter. Toggle user state between touching/mousing\n // using events, since devices can have both touch and mouse events.\n // if (browser.TOUCH_ENABLED) {\n // this.addClass('vjs-touch-enabled');\n // }\n\n // iOS Safari has broken hover handling\n if (!IS_IOS) {\n _this.addClass('vjs-workinghover');\n }\n\n // Make player easily findable by ID\n Player.players[_this.id_] = _this;\n\n // Add a major version class to aid css in plugins\n var majorVersion = version.split('.')[0];\n\n _this.addClass('vjs-v' + majorVersion);\n\n // When the player is first initialized, trigger activity so components\n // like the control bar show themselves if needed\n _this.userActive(true);\n _this.reportUserActivity();\n\n _this.one('play', _this.listenForUserActivity_);\n _this.on('fullscreenchange', _this.handleFullscreenChange_);\n _this.on('stageclick', _this.handleStageClick_);\n\n _this.changingSrc_ = false;\n _this.playWaitingForReady_ = false;\n _this.playOnLoadstart_ = null;\n return _this;\n }\n\n /**\n * Destroys the video player and does any necessary cleanup.\n *\n * This is especially helpful if you are dynamically adding and removing videos\n * to/from the DOM.\n *\n * @fires Player#dispose\n */\n\n\n Player.prototype.dispose = function dispose() {\n /**\n * Called when the player is being disposed of.\n *\n * @event Player#dispose\n * @type {EventTarget~Event}\n */\n this.trigger('dispose');\n // prevent dispose from being called twice\n this.off('dispose');\n\n if (this.styleEl_ && this.styleEl_.parentNode) {\n this.styleEl_.parentNode.removeChild(this.styleEl_);\n this.styleEl_ = null;\n }\n\n // Kill reference to this player\n Player.players[this.id_] = null;\n\n if (this.tag && this.tag.player) {\n this.tag.player = null;\n }\n\n if (this.el_ && this.el_.player) {\n this.el_.player = null;\n }\n\n if (this.tech_) {\n this.tech_.dispose();\n this.isPosterFromTech_ = false;\n this.poster_ = '';\n }\n\n if (this.playerElIngest_) {\n this.playerElIngest_ = null;\n }\n\n if (this.tag) {\n this.tag = null;\n }\n\n clearCacheForPlayer(this);\n\n // the actual .el_ is removed here\n _Component.prototype.dispose.call(this);\n };\n\n /**\n * Create the `Player`'s DOM element.\n *\n * @return {Element}\n * The DOM element that gets created.\n */\n\n\n Player.prototype.createEl = function createEl$$1() {\n var tag = this.tag;\n var el = void 0;\n var playerElIngest = this.playerElIngest_ = tag.parentNode && tag.parentNode.hasAttribute && tag.parentNode.hasAttribute('data-vjs-player');\n var divEmbed = this.tag.tagName.toLowerCase() === 'video-js';\n\n if (playerElIngest) {\n el = this.el_ = tag.parentNode;\n } else if (!divEmbed) {\n el = this.el_ = _Component.prototype.createEl.call(this, 'div');\n }\n\n // Copy over all the attributes from the tag, including ID and class\n // ID will now reference player box, not the video tag\n var attrs = getAttributes(tag);\n\n if (divEmbed) {\n el = this.el_ = tag;\n tag = this.tag = document.createElement('video');\n while (el.children.length) {\n tag.appendChild(el.firstChild);\n }\n\n if (!hasClass(el, 'video-js')) {\n addClass(el, 'video-js');\n }\n\n el.appendChild(tag);\n\n playerElIngest = this.playerElIngest_ = el;\n\n // copy over properties from the video-js element\n // ie8 doesn't support Object.keys nor hasOwnProperty\n // on dom elements so we have to specify properties individually\n ['autoplay', 'controls', 'crossOrigin', 'defaultMuted', 'defaultPlaybackRate', 'loop', 'muted', 'playbackRate', 'src', 'volume'].forEach(function (prop) {\n if (typeof el[prop] !== 'undefined') {\n tag[prop] = el[prop];\n }\n });\n }\n\n // set tabindex to -1 to remove the video element from the focus order\n tag.setAttribute('tabindex', '-1');\n // Workaround for #4583 (JAWS+IE doesn't announce BPB or play button)\n // See https://github.com/FreedomScientific/VFO-standards-support/issues/78\n // Note that we can't detect if JAWS is being used, but this ARIA attribute\n // doesn't change behavior of IE11 if JAWS is not being used\n if (IE_VERSION) {\n tag.setAttribute('role', 'application');\n }\n\n // Remove width/height attrs from tag so CSS can make it 100% width/height\n tag.removeAttribute('width');\n tag.removeAttribute('height');\n\n Object.getOwnPropertyNames(attrs).forEach(function (attr) {\n // workaround so we don't totally break IE7\n // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n if (attr === 'class') {\n el.className += ' ' + attrs[attr];\n\n if (divEmbed) {\n tag.className += ' ' + attrs[attr];\n }\n } else {\n el.setAttribute(attr, attrs[attr]);\n\n if (divEmbed) {\n tag.setAttribute(attr, attrs[attr]);\n }\n }\n });\n\n // Update tag id/class for use as HTML5 playback tech\n // Might think we should do this after embedding in container so .vjs-tech class\n // doesn't flash 100% width/height, but class only applies with .video-js parent\n tag.playerId = tag.id;\n tag.id += '_html5_api';\n tag.className = 'vjs-tech';\n\n // Make player findable on elements\n tag.player = el.player = this;\n // Default state of video is paused\n this.addClass('vjs-paused');\n\n // Add a style element in the player that we'll use to set the width/height\n // of the player in a way that's still overrideable by CSS, just like the\n // video element\n if (window.VIDEOJS_NO_DYNAMIC_STYLE !== true) {\n this.styleEl_ = createStyleElement('vjs-styles-dimensions');\n var defaultsStyleEl = $('.vjs-styles-defaults');\n var head = $('head');\n\n head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n }\n\n // Pass in the width/height/aspectRatio options which will update the style el\n this.width(this.options_.width);\n this.height(this.options_.height);\n this.fluid(this.options_.fluid);\n this.aspectRatio(this.options_.aspectRatio);\n\n // Hide any links within the video/audio tag, because IE doesn't hide them completely.\n var links = tag.getElementsByTagName('a');\n\n for (var i = 0; i < links.length; i++) {\n var linkEl = links.item(i);\n\n addClass(linkEl, 'vjs-hidden');\n linkEl.setAttribute('hidden', 'hidden');\n }\n\n // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n // keep track of the original for later so we can know if the source originally failed\n tag.initNetworkState_ = tag.networkState;\n\n // Wrap video tag in div (el/box) container\n if (tag.parentNode && !playerElIngest) {\n tag.parentNode.insertBefore(el, tag);\n }\n\n // insert the tag as the first child of the player element\n // then manually add it to the children array so that this.addChild\n // will work properly for other components\n //\n // Breaks iPhone, fixed in HTML5 setup.\n prependTo(tag, el);\n this.children_.unshift(tag);\n\n // Set lang attr on player to ensure CSS :lang() in consistent with player\n // if it's been set to something different to the doc\n this.el_.setAttribute('lang', this.language_);\n\n this.el_ = el;\n\n return el;\n };\n\n /**\n * A getter/setter for the `Player`'s width. Returns the player's configured value.\n * To get the current width use `currentWidth()`.\n *\n * @param {number} [value]\n * The value to set the `Player`'s width to.\n *\n * @return {number}\n * The current width of the `Player` when getting.\n */\n\n\n Player.prototype.width = function width(value) {\n return this.dimension('width', value);\n };\n\n /**\n * A getter/setter for the `Player`'s height. Returns the player's configured value.\n * To get the current height use `currentheight()`.\n *\n * @param {number} [value]\n * The value to set the `Player`'s heigth to.\n *\n * @return {number}\n * The current height of the `Player` when getting.\n */\n\n\n Player.prototype.height = function height(value) {\n return this.dimension('height', value);\n };\n\n /**\n * A getter/setter for the `Player`'s width & height.\n *\n * @param {string} dimension\n * This string can be:\n * - 'width'\n * - 'height'\n *\n * @param {number} [value]\n * Value for dimension specified in the first argument.\n *\n * @return {number}\n * The dimension arguments value when getting (width/height).\n */\n\n\n Player.prototype.dimension = function dimension(_dimension, value) {\n var privDimension = _dimension + '_';\n\n if (value === undefined) {\n return this[privDimension] || 0;\n }\n\n if (value === '') {\n // If an empty string is given, reset the dimension to be automatic\n this[privDimension] = undefined;\n this.updateStyleEl_();\n return;\n }\n\n var parsedVal = parseFloat(value);\n\n if (isNaN(parsedVal)) {\n log$1.error('Improper value \"' + value + '\" supplied for for ' + _dimension);\n return;\n }\n\n this[privDimension] = parsedVal;\n this.updateStyleEl_();\n };\n\n /**\n * A getter/setter/toggler for the vjs-fluid `className` on the `Player`.\n *\n * @param {boolean} [bool]\n * - A value of true adds the class.\n * - A value of false removes the class.\n * - No value will toggle the fluid class.\n *\n * @return {boolean|undefined}\n * - The value of fluid when getting.\n * - `undefined` when setting.\n */\n\n\n Player.prototype.fluid = function fluid(bool) {\n if (bool === undefined) {\n return !!this.fluid_;\n }\n\n this.fluid_ = !!bool;\n\n if (bool) {\n this.addClass('vjs-fluid');\n } else {\n this.removeClass('vjs-fluid');\n }\n\n this.updateStyleEl_();\n };\n\n /**\n * Get/Set the aspect ratio\n *\n * @param {string} [ratio]\n * Aspect ratio for player\n *\n * @return {string|undefined}\n * returns the current aspect ratio when getting\n */\n\n /**\n * A getter/setter for the `Player`'s aspect ratio.\n *\n * @param {string} [ratio]\n * The value to set the `Player's aspect ratio to.\n *\n * @return {string|undefined}\n * - The current aspect ratio of the `Player` when getting.\n * - undefined when setting\n */\n\n\n Player.prototype.aspectRatio = function aspectRatio(ratio) {\n if (ratio === undefined) {\n return this.aspectRatio_;\n }\n\n // Check for width:height format\n if (!/^\\d+\\:\\d+$/.test(ratio)) {\n throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n }\n this.aspectRatio_ = ratio;\n\n // We're assuming if you set an aspect ratio you want fluid mode,\n // because in fixed mode you could calculate width and height yourself.\n this.fluid(true);\n\n this.updateStyleEl_();\n };\n\n /**\n * Update styles of the `Player` element (height, width and aspect ratio).\n *\n * @private\n * @listens Tech#loadedmetadata\n */\n\n\n Player.prototype.updateStyleEl_ = function updateStyleEl_() {\n if (window.VIDEOJS_NO_DYNAMIC_STYLE === true) {\n var _width = typeof this.width_ === 'number' ? this.width_ : this.options_.width;\n var _height = typeof this.height_ === 'number' ? this.height_ : this.options_.height;\n var techEl = this.tech_ && this.tech_.el();\n\n if (techEl) {\n if (_width >= 0) {\n techEl.width = _width;\n }\n if (_height >= 0) {\n techEl.height = _height;\n }\n }\n\n return;\n }\n\n var width = void 0;\n var height = void 0;\n var aspectRatio = void 0;\n var idClass = void 0;\n\n // The aspect ratio is either used directly or to calculate width and height.\n if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n // Use any aspectRatio that's been specifically set\n aspectRatio = this.aspectRatio_;\n } else if (this.videoWidth() > 0) {\n // Otherwise try to get the aspect ratio from the video metadata\n aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n } else {\n // Or use a default. The video element's is 2:1, but 16:9 is more common.\n aspectRatio = '16:9';\n }\n\n // Get the ratio as a decimal we can use to calculate dimensions\n var ratioParts = aspectRatio.split(':');\n var ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n if (this.width_ !== undefined) {\n // Use any width that's been specifically set\n width = this.width_;\n } else if (this.height_ !== undefined) {\n // Or calulate the width from the aspect ratio if a height has been set\n width = this.height_ / ratioMultiplier;\n } else {\n // Or use the video's metadata, or use the video el's default of 300\n width = this.videoWidth() || 300;\n }\n\n if (this.height_ !== undefined) {\n // Use any height that's been specifically set\n height = this.height_;\n } else {\n // Otherwise calculate the height from the ratio and the width\n height = width * ratioMultiplier;\n }\n\n // Ensure the CSS class is valid by starting with an alpha character\n if (/^[^a-zA-Z]/.test(this.id())) {\n idClass = 'dimensions-' + this.id();\n } else {\n idClass = this.id() + '-dimensions';\n }\n\n // Ensure the right class is still on the player for the style element\n this.addClass(idClass);\n\n setTextContent(this.styleEl_, '\\n .' + idClass + ' {\\n width: ' + width + 'px;\\n height: ' + height + 'px;\\n }\\n\\n .' + idClass + '.vjs-fluid {\\n padding-top: ' + ratioMultiplier * 100 + '%;\\n }\\n ');\n };\n\n /**\n * Load/Create an instance of playback {@link Tech} including element\n * and API methods. Then append the `Tech` element in `Player` as a child.\n *\n * @param {string} techName\n * name of the playback technology\n *\n * @param {string} source\n * video source\n *\n * @private\n */\n\n\n Player.prototype.loadTech_ = function loadTech_(techName, source) {\n var _this2 = this;\n\n // Pause and remove current playback technology\n if (this.tech_) {\n this.unloadTech_();\n }\n\n var titleTechName = toTitleCase(techName);\n var camelTechName = techName.charAt(0).toLowerCase() + techName.slice(1);\n\n // get rid of the HTML5 video tag as soon as we are using another tech\n if (titleTechName !== 'Html5' && this.tag) {\n Tech.getTech('Html5').disposeMediaElement(this.tag);\n this.tag.player = null;\n this.tag = null;\n }\n\n this.techName_ = titleTechName;\n\n // Turn off API access because we're loading a new tech that might load asynchronously\n this.isReady_ = false;\n\n // if autoplay is a string we pass false to the tech\n // because the player is going to handle autoplay on `loadstart`\n var autoplay = typeof this.autoplay() === 'string' ? false : this.autoplay();\n\n // Grab tech-specific options from player options and add source and parent element to use.\n var techOptions = {\n source: source,\n autoplay: autoplay,\n 'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n 'playerId': this.id(),\n 'techId': this.id() + '_' + titleTechName + '_api',\n 'playsinline': this.options_.playsinline,\n 'preload': this.options_.preload,\n 'loop': this.options_.loop,\n 'muted': this.options_.muted,\n 'poster': this.poster(),\n 'language': this.language(),\n 'playerElIngest': this.playerElIngest_ || false,\n 'vtt.js': this.options_['vtt.js'],\n 'canOverridePoster': !!this.options_.techCanOverridePoster,\n 'enableSourceset': this.options_.enableSourceset\n };\n\n ALL.names.forEach(function (name$$1) {\n var props = ALL[name$$1];\n\n techOptions[props.getterName] = _this2[props.privateName];\n });\n\n assign(techOptions, this.options_[titleTechName]);\n assign(techOptions, this.options_[camelTechName]);\n assign(techOptions, this.options_[techName.toLowerCase()]);\n\n if (this.tag) {\n techOptions.tag = this.tag;\n }\n\n if (source && source.src === this.cache_.src && this.cache_.currentTime > 0) {\n techOptions.startTime = this.cache_.currentTime;\n }\n\n // Initialize tech instance\n var TechClass = Tech.getTech(techName);\n\n if (!TechClass) {\n throw new Error('No Tech named \\'' + titleTechName + '\\' exists! \\'' + titleTechName + '\\' should be registered using videojs.registerTech()\\'');\n }\n\n this.tech_ = new TechClass(techOptions);\n\n // player.triggerReady is always async, so don't need this to be async\n this.tech_.ready(bind(this, this.handleTechReady_), true);\n\n textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n // Listen to all HTML5-defined events and trigger them on the player\n TECH_EVENTS_RETRIGGER.forEach(function (event) {\n _this2.on(_this2.tech_, event, _this2['handleTech' + toTitleCase(event) + '_']);\n });\n\n Object.keys(TECH_EVENTS_QUEUE).forEach(function (event) {\n _this2.on(_this2.tech_, event, function (eventObj) {\n if (_this2.tech_.playbackRate() === 0 && _this2.tech_.seeking()) {\n _this2.queuedCallbacks_.push({\n callback: _this2['handleTech' + TECH_EVENTS_QUEUE[event] + '_'].bind(_this2),\n event: eventObj\n });\n return;\n }\n _this2['handleTech' + TECH_EVENTS_QUEUE[event] + '_'](eventObj);\n });\n });\n\n this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n this.on(this.tech_, 'sourceset', this.handleTechSourceset_);\n this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n this.on(this.tech_, 'ended', this.handleTechEnded_);\n this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n this.on(this.tech_, 'play', this.handleTechPlay_);\n this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n this.on(this.tech_, 'pause', this.handleTechPause_);\n this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n this.on(this.tech_, 'error', this.handleTechError_);\n this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n this.on(this.tech_, 'textdata', this.handleTechTextData_);\n this.on(this.tech_, 'ratechange', this.handleTechRateChange_);\n\n this.usingNativeControls(this.techGet_('controls'));\n\n if (this.controls() && !this.usingNativeControls()) {\n this.addTechControlsListeners_();\n }\n\n // Add the tech element in the DOM if it was not already there\n // Make sure to not insert the original video element if using Html5\n if (this.tech_.el().parentNode !== this.el() && (titleTechName !== 'Html5' || !this.tag)) {\n prependTo(this.tech_.el(), this.el());\n }\n\n // Get rid of the original video tag reference after the first tech is loaded\n if (this.tag) {\n this.tag.player = null;\n this.tag = null;\n }\n };\n\n /**\n * Unload and dispose of the current playback {@link Tech}.\n *\n * @private\n */\n\n\n Player.prototype.unloadTech_ = function unloadTech_() {\n var _this3 = this;\n\n // Save the current text tracks so that we can reuse the same text tracks with the next tech\n ALL.names.forEach(function (name$$1) {\n var props = ALL[name$$1];\n\n _this3[props.privateName] = _this3[props.getterName]();\n });\n this.textTracksJson_ = textTrackConverter.textTracksToJson(this.tech_);\n\n this.isReady_ = false;\n\n this.tech_.dispose();\n\n this.tech_ = false;\n\n if (this.isPosterFromTech_) {\n this.poster_ = '';\n this.trigger('posterchange');\n }\n\n this.isPosterFromTech_ = false;\n };\n\n /**\n * Return a reference to the current {@link Tech}.\n * It will print a warning by default about the danger of using the tech directly\n * but any argument that is passed in will silence the warning.\n *\n * @param {*} [safety]\n * Anything passed in to silence the warning\n *\n * @return {Tech}\n * The Tech\n */\n\n\n Player.prototype.tech = function tech(safety) {\n if (safety === undefined) {\n log$1.warn(tsml(_templateObject$1));\n }\n\n return this.tech_;\n };\n\n /**\n * Set up click and touch listeners for the playback element\n *\n * - On desktops: a click on the video itself will toggle playback\n * - On mobile devices: a click on the video toggles controls\n * which is done by toggling the user state between active and\n * inactive\n * - A tap can signal that a user has become active or has become inactive\n * e.g. a quick tap on an iPhone movie should reveal the controls. Another\n * quick tap should hide them again (signaling the user is in an inactive\n * viewing state)\n * - In addition to this, we still want the user to be considered inactive after\n * a few seconds of inactivity.\n *\n * > Note: the only part of iOS interaction we can't mimic with this setup\n * is a touch and hold on the video element counting as activity in order to\n * keep the controls showing, but that shouldn't be an issue. A touch and hold\n * on any controls will still keep the user active\n *\n * @private\n */\n\n\n Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {\n // Make sure to remove all the previous listeners in case we are called multiple times.\n this.removeTechControlsListeners_();\n\n // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n // trigger mousedown/up.\n // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n // Any touch events are set to block the mousedown event from happening\n this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n // If the controls were hidden we don't want that to change without a tap event\n // so we'll check if the controls were already showing before reporting user\n // activity\n this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n // The tap listener needs to come after the touchend listener because the tap\n // listener cancels out any reportedUserActivity when setting userActive(false)\n this.on(this.tech_, 'tap', this.handleTechTap_);\n };\n\n /**\n * Remove the listeners used for click and tap controls. This is needed for\n * toggling to controls disabled, where a tap/touch should do nothing.\n *\n * @private\n */\n\n\n Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {\n // We don't want to just use `this.off()` because there might be other needed\n // listeners added by techs that extend this.\n this.off(this.tech_, 'tap', this.handleTechTap_);\n this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n this.off(this.tech_, 'mousedown', this.handleTechClick_);\n };\n\n /**\n * Player waits for the tech to be ready\n *\n * @private\n */\n\n\n Player.prototype.handleTechReady_ = function handleTechReady_() {\n this.triggerReady();\n\n // Keep the same volume as before\n if (this.cache_.volume) {\n this.techCall_('setVolume', this.cache_.volume);\n }\n\n // Look if the tech found a higher resolution poster while loading\n this.handleTechPosterChange_();\n\n // Update the duration if available\n this.handleTechDurationChange_();\n\n // Chrome and Safari both have issues with autoplay.\n // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n // This fixes both issues. Need to wait for API, so it updates displays correctly\n if ((this.src() || this.currentSrc()) && this.tag && this.options_.autoplay && this.paused()) {\n try {\n // Chrome Fix. Fixed in Chrome v16.\n delete this.tag.poster;\n } catch (e) {\n log$1('deleting tag.poster throws in some browsers', e);\n }\n }\n };\n\n /**\n * Retrigger the `loadstart` event that was triggered by the {@link Tech}. This\n * function will also trigger {@link Player#firstplay} if it is the first loadstart\n * for a video.\n *\n * @fires Player#loadstart\n * @fires Player#firstplay\n * @listens Tech#loadstart\n * @private\n */\n\n\n Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {\n // TODO: Update to use `emptied` event instead. See #1277.\n\n this.removeClass('vjs-ended');\n this.removeClass('vjs-seeking');\n\n // reset the error state\n this.error(null);\n\n // If it's already playing we want to trigger a firstplay event now.\n // The firstplay event relies on both the play and loadstart events\n // which can happen in any order for a new source\n if (!this.paused()) {\n /**\n * Fired when the user agent begins looking for media data\n *\n * @event Player#loadstart\n * @type {EventTarget~Event}\n */\n this.trigger('loadstart');\n this.trigger('firstplay');\n } else {\n // reset the hasStarted state\n this.hasStarted(false);\n this.trigger('loadstart');\n }\n\n // autoplay happens after loadstart for the browser,\n // so we mimic that behavior\n this.manualAutoplay_(this.autoplay());\n };\n\n /**\n * Handle autoplay string values, rather than the typical boolean\n * values that should be handled by the tech. Note that this is not\n * part of any specification. Valid values and what they do can be\n * found on the autoplay getter at Player#autoplay()\n */\n\n\n Player.prototype.manualAutoplay_ = function manualAutoplay_(type) {\n var _this4 = this;\n\n if (!this.tech_ || typeof type !== 'string') {\n return;\n }\n\n var muted = function muted() {\n var previouslyMuted = _this4.muted();\n\n _this4.muted(true);\n\n var playPromise = _this4.play();\n\n if (!playPromise || !playPromise.then || !playPromise['catch']) {\n return;\n }\n\n return playPromise['catch'](function (e) {\n // restore old value of muted on failure\n _this4.muted(previouslyMuted);\n });\n };\n\n var promise = void 0;\n\n if (type === 'any') {\n promise = this.play();\n\n if (promise && promise.then && promise['catch']) {\n promise['catch'](function () {\n return muted();\n });\n }\n } else if (type === 'muted') {\n promise = muted();\n } else {\n promise = this.play();\n }\n\n if (!promise || !promise.then || !promise['catch']) {\n return;\n }\n\n return promise.then(function () {\n _this4.trigger({ type: 'autoplay-success', autoplay: type });\n })['catch'](function (e) {\n _this4.trigger({ type: 'autoplay-failure', autoplay: type });\n });\n };\n\n /**\n * Update the internal source caches so that we return the correct source from\n * `src()`, `currentSource()`, and `currentSources()`.\n *\n * > Note: `currentSources` will not be updated if the source that is passed in exists\n * in the current `currentSources` cache.\n *\n *\n * @param {Tech~SourceObject} srcObj\n * A string or object source to update our caches to.\n */\n\n\n Player.prototype.updateSourceCaches_ = function updateSourceCaches_() {\n var srcObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n\n var src = srcObj;\n var type = '';\n\n if (typeof src !== 'string') {\n src = srcObj.src;\n type = srcObj.type;\n }\n\n // if we are a blob url, don't update the source cache\n // blob urls can arise when playback is done via Media Source Extension (MSE)\n // such as m3u8 sources with @videojs/http-streaming (VHS)\n if (/^blob:/.test(src)) {\n return;\n }\n\n // make sure all the caches are set to default values\n // to prevent null checking\n this.cache_.source = this.cache_.source || {};\n this.cache_.sources = this.cache_.sources || [];\n\n // try to get the type of the src that was passed in\n if (src && !type) {\n type = findMimetype(this, src);\n }\n\n // update `currentSource` cache always\n this.cache_.source = mergeOptions({}, srcObj, { src: src, type: type });\n\n var matchingSources = this.cache_.sources.filter(function (s) {\n return s.src && s.src === src;\n });\n var sourceElSources = [];\n var sourceEls = this.$$('source');\n var matchingSourceEls = [];\n\n for (var i = 0; i < sourceEls.length; i++) {\n var sourceObj = getAttributes(sourceEls[i]);\n\n sourceElSources.push(sourceObj);\n\n if (sourceObj.src && sourceObj.src === src) {\n matchingSourceEls.push(sourceObj.src);\n }\n }\n\n // if we have matching source els but not matching sources\n // the current source cache is not up to date\n if (matchingSourceEls.length && !matchingSources.length) {\n this.cache_.sources = sourceElSources;\n // if we don't have matching source or source els set the\n // sources cache to the `currentSource` cache\n } else if (!matchingSources.length) {\n this.cache_.sources = [this.cache_.source];\n }\n\n // update the tech `src` cache\n this.cache_.src = src;\n };\n\n /**\n * *EXPERIMENTAL* Fired when the source is set or changed on the {@link Tech}\n * causing the media element to reload.\n *\n * It will fire for the initial source and each subsequent source.\n * This event is a custom event from Video.js and is triggered by the {@link Tech}.\n *\n * The event object for this event contains a `src` property that will contain the source\n * that was available when the event was triggered. This is generally only necessary if Video.js\n * is switching techs while the source was being changed.\n *\n * It is also fired when `load` is called on the player (or media element)\n * because the {@link https://html.spec.whatwg.org/multipage/media.html#dom-media-load|specification for `load`}\n * says that the resource selection algorithm needs to be aborted and restarted.\n * In this case, it is very likely that the `src` property will be set to the\n * empty string `\"\"` to indicate we do not know what the source will be but\n * that it is changing.\n *\n * *This event is currently still experimental and may change in minor releases.*\n * __To use this, pass `enableSourceset` option to the player.__\n *\n * @event Player#sourceset\n * @type {EventTarget~Event}\n * @prop {string} src\n * The source url available when the `sourceset` was triggered.\n * It will be an empty string if we cannot know what the source is\n * but know that the source will change.\n */\n /**\n * Retrigger the `sourceset` event that was triggered by the {@link Tech}.\n *\n * @fires Player#sourceset\n * @listens Tech#sourceset\n * @private\n */\n\n\n Player.prototype.handleTechSourceset_ = function handleTechSourceset_(event) {\n var _this5 = this;\n\n // only update the source cache when the source\n // was not updated using the player api\n if (!this.changingSrc_) {\n // update the source to the intial source right away\n // in some cases this will be empty string\n this.updateSourceCaches_(event.src);\n\n // if the `sourceset` `src` was an empty string\n // wait for a `loadstart` to update the cache to `currentSrc`.\n // If a sourceset happens before a `loadstart`, we reset the state\n // as this function will be called again.\n if (!event.src) {\n var updateCache = function updateCache(e) {\n if (e.type !== 'sourceset') {\n _this5.updateSourceCaches_(_this5.techGet_('currentSrc'));\n }\n\n _this5.tech_.off(['sourceset', 'loadstart'], updateCache);\n };\n\n this.tech_.one(['sourceset', 'loadstart'], updateCache);\n }\n }\n\n this.trigger({\n src: event.src,\n type: 'sourceset'\n });\n };\n\n /**\n * Add/remove the vjs-has-started class\n *\n * @fires Player#firstplay\n *\n * @param {boolean} request\n * - true: adds the class\n * - false: remove the class\n *\n * @return {boolean}\n * the boolean value of hasStarted_\n */\n\n\n Player.prototype.hasStarted = function hasStarted(request) {\n if (request === undefined) {\n // act as getter, if we have no request to change\n return this.hasStarted_;\n }\n\n if (request === this.hasStarted_) {\n return;\n }\n\n this.hasStarted_ = request;\n\n if (this.hasStarted_) {\n this.addClass('vjs-has-started');\n this.trigger('firstplay');\n } else {\n this.removeClass('vjs-has-started');\n }\n };\n\n /**\n * Fired whenever the media begins or resumes playback\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play}\n * @fires Player#play\n * @listens Tech#play\n * @private\n */\n\n\n Player.prototype.handleTechPlay_ = function handleTechPlay_() {\n this.removeClass('vjs-ended');\n this.removeClass('vjs-paused');\n this.addClass('vjs-playing');\n\n // hide the poster when the user hits play\n this.hasStarted(true);\n /**\n * Triggered whenever an {@link Tech#play} event happens. Indicates that\n * playback has started or resumed.\n *\n * @event Player#play\n * @type {EventTarget~Event}\n */\n this.trigger('play');\n };\n\n /**\n * Retrigger the `ratechange` event that was triggered by the {@link Tech}.\n *\n * If there were any events queued while the playback rate was zero, fire\n * those events now.\n *\n * @private\n * @method Player#handleTechRateChange_\n * @fires Player#ratechange\n * @listens Tech#ratechange\n */\n\n\n Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {\n if (this.tech_.playbackRate() > 0 && this.cache_.lastPlaybackRate === 0) {\n this.queuedCallbacks_.forEach(function (queued) {\n return queued.callback(queued.event);\n });\n this.queuedCallbacks_ = [];\n }\n this.cache_.lastPlaybackRate = this.tech_.playbackRate();\n /**\n * Fires when the playing speed of the audio/video is changed\n *\n * @event Player#ratechange\n * @type {event}\n */\n this.trigger('ratechange');\n };\n\n /**\n * Retrigger the `waiting` event that was triggered by the {@link Tech}.\n *\n * @fires Player#waiting\n * @listens Tech#waiting\n * @private\n */\n\n\n Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {\n var _this6 = this;\n\n this.addClass('vjs-waiting');\n /**\n * A readyState change on the DOM element has caused playback to stop.\n *\n * @event Player#waiting\n * @type {EventTarget~Event}\n */\n this.trigger('waiting');\n this.one('timeupdate', function () {\n return _this6.removeClass('vjs-waiting');\n });\n };\n\n /**\n * Retrigger the `canplay` event that was triggered by the {@link Tech}.\n * > Note: This is not consistent between browsers. See #1351\n *\n * @fires Player#canplay\n * @listens Tech#canplay\n * @private\n */\n\n\n Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {\n this.removeClass('vjs-waiting');\n /**\n * The media has a readyState of HAVE_FUTURE_DATA or greater.\n *\n * @event Player#canplay\n * @type {EventTarget~Event}\n */\n this.trigger('canplay');\n };\n\n /**\n * Retrigger the `canplaythrough` event that was triggered by the {@link Tech}.\n *\n * @fires Player#canplaythrough\n * @listens Tech#canplaythrough\n * @private\n */\n\n\n Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {\n this.removeClass('vjs-waiting');\n /**\n * The media has a readyState of HAVE_ENOUGH_DATA or greater. This means that the\n * entire media file can be played without buffering.\n *\n * @event Player#canplaythrough\n * @type {EventTarget~Event}\n */\n this.trigger('canplaythrough');\n };\n\n /**\n * Retrigger the `playing` event that was triggered by the {@link Tech}.\n *\n * @fires Player#playing\n * @listens Tech#playing\n * @private\n */\n\n\n Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {\n this.removeClass('vjs-waiting');\n /**\n * The media is no longer blocked from playback, and has started playing.\n *\n * @event Player#playing\n * @type {EventTarget~Event}\n */\n this.trigger('playing');\n };\n\n /**\n * Retrigger the `seeking` event that was triggered by the {@link Tech}.\n *\n * @fires Player#seeking\n * @listens Tech#seeking\n * @private\n */\n\n\n Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {\n this.addClass('vjs-seeking');\n /**\n * Fired whenever the player is jumping to a new time\n *\n * @event Player#seeking\n * @type {EventTarget~Event}\n */\n this.trigger('seeking');\n };\n\n /**\n * Retrigger the `seeked` event that was triggered by the {@link Tech}.\n *\n * @fires Player#seeked\n * @listens Tech#seeked\n * @private\n */\n\n\n Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {\n this.removeClass('vjs-seeking');\n /**\n * Fired when the player has finished jumping to a new time\n *\n * @event Player#seeked\n * @type {EventTarget~Event}\n */\n this.trigger('seeked');\n };\n\n /**\n * Retrigger the `firstplay` event that was triggered by the {@link Tech}.\n *\n * @fires Player#firstplay\n * @listens Tech#firstplay\n * @deprecated As of 6.0 firstplay event is deprecated.\n * As of 6.0 passing the `starttime` option to the player and the firstplay event are deprecated.\n * @private\n */\n\n\n Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {\n // If the first starttime attribute is specified\n // then we will start at the given offset in seconds\n if (this.options_.starttime) {\n log$1.warn('Passing the `starttime` option to the player will be deprecated in 6.0');\n this.currentTime(this.options_.starttime);\n }\n\n this.addClass('vjs-has-started');\n /**\n * Fired the first time a video is played. Not part of the HLS spec, and this is\n * probably not the best implementation yet, so use sparingly. If you don't have a\n * reason to prevent playback, use `myPlayer.one('play');` instead.\n *\n * @event Player#firstplay\n * @deprecated As of 6.0 firstplay event is deprecated.\n * @type {EventTarget~Event}\n */\n this.trigger('firstplay');\n };\n\n /**\n * Retrigger the `pause` event that was triggered by the {@link Tech}.\n *\n * @fires Player#pause\n * @listens Tech#pause\n * @private\n */\n\n\n Player.prototype.handleTechPause_ = function handleTechPause_() {\n this.removeClass('vjs-playing');\n this.addClass('vjs-paused');\n /**\n * Fired whenever the media has been paused\n *\n * @event Player#pause\n * @type {EventTarget~Event}\n */\n this.trigger('pause');\n };\n\n /**\n * Retrigger the `ended` event that was triggered by the {@link Tech}.\n *\n * @fires Player#ended\n * @listens Tech#ended\n * @private\n */\n\n\n Player.prototype.handleTechEnded_ = function handleTechEnded_() {\n this.addClass('vjs-ended');\n if (this.options_.loop) {\n this.currentTime(0);\n this.play();\n } else if (!this.paused()) {\n this.pause();\n }\n\n /**\n * Fired when the end of the media resource is reached (currentTime == duration)\n *\n * @event Player#ended\n * @type {EventTarget~Event}\n */\n this.trigger('ended');\n };\n\n /**\n * Fired when the duration of the media resource is first known or changed\n *\n * @listens Tech#durationchange\n * @private\n */\n\n\n Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {\n this.duration(this.techGet_('duration'));\n };\n\n /**\n * Handle a click on the media element to play/pause\n *\n * @param {EventTarget~Event} event\n * the event that caused this function to trigger\n *\n * @listens Tech#mousedown\n * @private\n */\n\n\n Player.prototype.handleTechClick_ = function handleTechClick_(event) {\n if (!isSingleLeftClick(event)) {\n return;\n }\n\n // When controls are disabled a click should not toggle playback because\n // the click is considered a control\n if (!this.controls_) {\n return;\n }\n\n if (this.paused()) {\n silencePromise(this.play());\n } else {\n this.pause();\n }\n };\n\n /**\n * Handle a tap on the media element. It will toggle the user\n * activity state, which hides and shows the controls.\n *\n * @listens Tech#tap\n * @private\n */\n\n\n Player.prototype.handleTechTap_ = function handleTechTap_() {\n this.userActive(!this.userActive());\n };\n\n /**\n * Handle touch to start\n *\n * @listens Tech#touchstart\n * @private\n */\n\n\n Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {\n this.userWasActive = this.userActive();\n };\n\n /**\n * Handle touch to move\n *\n * @listens Tech#touchmove\n * @private\n */\n\n\n Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {\n if (this.userWasActive) {\n this.reportUserActivity();\n }\n };\n\n /**\n * Handle touch to end\n *\n * @param {EventTarget~Event} event\n * the touchend event that triggered\n * this function\n *\n * @listens Tech#touchend\n * @private\n */\n\n\n Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {\n // Stop the mouse events from also happening\n event.preventDefault();\n };\n\n /**\n * Fired when the player switches in or out of fullscreen mode\n *\n * @private\n * @listens Player#fullscreenchange\n */\n\n\n Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {\n if (this.isFullscreen()) {\n this.addClass('vjs-fullscreen');\n } else {\n this.removeClass('vjs-fullscreen');\n }\n };\n\n /**\n * native click events on the SWF aren't triggered on IE11, Win8.1RT\n * use stageclick events triggered from inside the SWF instead\n *\n * @private\n * @listens stageclick\n */\n\n\n Player.prototype.handleStageClick_ = function handleStageClick_() {\n this.reportUserActivity();\n };\n\n /**\n * Handle Tech Fullscreen Change\n *\n * @param {EventTarget~Event} event\n * the fullscreenchange event that triggered this function\n *\n * @param {Object} data\n * the data that was sent with the event\n *\n * @private\n * @listens Tech#fullscreenchange\n * @fires Player#fullscreenchange\n */\n\n\n Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {\n if (data) {\n this.isFullscreen(data.isFullscreen);\n }\n /**\n * Fired when going in and out of fullscreen.\n *\n * @event Player#fullscreenchange\n * @type {EventTarget~Event}\n */\n this.trigger('fullscreenchange');\n };\n\n /**\n * Fires when an error occurred during the loading of an audio/video.\n *\n * @private\n * @listens Tech#error\n */\n\n\n Player.prototype.handleTechError_ = function handleTechError_() {\n var error = this.tech_.error();\n\n this.error(error);\n };\n\n /**\n * Retrigger the `textdata` event that was triggered by the {@link Tech}.\n *\n * @fires Player#textdata\n * @listens Tech#textdata\n * @private\n */\n\n\n Player.prototype.handleTechTextData_ = function handleTechTextData_() {\n var data = null;\n\n if (arguments.length > 1) {\n data = arguments[1];\n }\n\n /**\n * Fires when we get a textdata event from tech\n *\n * @event Player#textdata\n * @type {EventTarget~Event}\n */\n this.trigger('textdata', data);\n };\n\n /**\n * Get object for cached values.\n *\n * @return {Object}\n * get the current object cache\n */\n\n\n Player.prototype.getCache = function getCache() {\n return this.cache_;\n };\n\n /**\n * Pass values to the playback tech\n *\n * @param {string} [method]\n * the method to call\n *\n * @param {Object} arg\n * the argument to pass\n *\n * @private\n */\n\n\n Player.prototype.techCall_ = function techCall_(method, arg) {\n // If it's not ready yet, call method when it is\n\n this.ready(function () {\n if (method in allowedSetters) {\n return set$1(this.middleware_, this.tech_, method, arg);\n } else if (method in allowedMediators) {\n return mediate(this.middleware_, this.tech_, method, arg);\n }\n\n try {\n if (this.tech_) {\n this.tech_[method](arg);\n }\n } catch (e) {\n log$1(e);\n throw e;\n }\n }, true);\n };\n\n /**\n * Get calls can't wait for the tech, and sometimes don't need to.\n *\n * @param {string} method\n * Tech method\n *\n * @return {Function|undefined}\n * the method or undefined\n *\n * @private\n */\n\n\n Player.prototype.techGet_ = function techGet_(method) {\n if (!this.tech_ || !this.tech_.isReady_) {\n return;\n }\n\n if (method in allowedGetters) {\n return get$1(this.middleware_, this.tech_, method);\n } else if (method in allowedMediators) {\n return mediate(this.middleware_, this.tech_, method);\n }\n\n // Flash likes to die and reload when you hide or reposition it.\n // In these cases the object methods go away and we get errors.\n // When that happens we'll catch the errors and inform tech that it's not ready any more.\n try {\n return this.tech_[method]();\n } catch (e) {\n\n // When building additional tech libs, an expected method may not be defined yet\n if (this.tech_[method] === undefined) {\n log$1('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);\n throw e;\n }\n\n // When a method isn't available on the object it throws a TypeError\n if (e.name === 'TypeError') {\n log$1('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);\n this.tech_.isReady_ = false;\n throw e;\n }\n\n // If error unknown, just log and throw\n log$1(e);\n throw e;\n }\n };\n\n /**\n * Attempt to begin playback at the first opportunity.\n *\n * @return {Promise|undefined}\n * Returns a promise if the browser supports Promises (or one\n * was passed in as an option). This promise will be resolved on\n * the return value of play. If this is undefined it will fulfill the\n * promise chain otherwise the promise chain will be fulfilled when\n * the promise from play is fulfilled.\n */\n\n\n Player.prototype.play = function play() {\n var _this7 = this;\n\n var PromiseClass = this.options_.Promise || window.Promise;\n\n if (PromiseClass) {\n return new PromiseClass(function (resolve) {\n _this7.play_(resolve);\n });\n }\n\n return this.play_();\n };\n\n /**\n * The actual logic for play, takes a callback that will be resolved on the\n * return value of play. This allows us to resolve to the play promise if there\n * is one on modern browsers.\n *\n * @private\n * @param {Function} [callback]\n * The callback that should be called when the techs play is actually called\n */\n\n\n Player.prototype.play_ = function play_() {\n var _this8 = this;\n\n var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : silencePromise;\n\n // If this is called while we have a play queued up on a loadstart, remove\n // that listener to avoid getting in a potentially bad state.\n if (this.playOnLoadstart_) {\n this.off('loadstart', this.playOnLoadstart_);\n }\n\n // If the player/tech is not ready, queue up another call to `play()` for\n // when it is. This will loop back into this method for another attempt at\n // playback when the tech is ready.\n if (!this.isReady_) {\n\n // Bail out if we're already waiting for `ready`!\n if (this.playWaitingForReady_) {\n return;\n }\n\n this.playWaitingForReady_ = true;\n this.ready(function () {\n _this8.playWaitingForReady_ = false;\n callback(_this8.play());\n });\n\n // If the player/tech is ready and we have a source, we can attempt playback.\n } else if (!this.changingSrc_ && (this.src() || this.currentSrc())) {\n callback(this.techGet_('play'));\n return;\n\n // If the tech is ready, but we do not have a source, we'll need to wait\n // for both the `ready` and a `loadstart` when the source is finally\n // resolved by middleware and set on the player.\n //\n // This can happen if `play()` is called while changing sources or before\n // one has been set on the player.\n } else {\n\n this.playOnLoadstart_ = function () {\n _this8.playOnLoadstart_ = null;\n callback(_this8.play());\n };\n\n this.one('loadstart', this.playOnLoadstart_);\n }\n };\n\n /**\n * Pause the video playback\n *\n * @return {Player}\n * A reference to the player object this function was called on\n */\n\n\n Player.prototype.pause = function pause() {\n this.techCall_('pause');\n };\n\n /**\n * Check if the player is paused or has yet to play\n *\n * @return {boolean}\n * - false: if the media is currently playing\n * - true: if media is not currently playing\n */\n\n\n Player.prototype.paused = function paused() {\n // The initial state of paused should be true (in Safari it's actually false)\n return this.techGet_('paused') === false ? false : true;\n };\n\n /**\n * Get a TimeRange object representing the current ranges of time that the user\n * has played.\n *\n * @return {TimeRange}\n * A time range object that represents all the increments of time that have\n * been played.\n */\n\n\n Player.prototype.played = function played() {\n return this.techGet_('played') || createTimeRanges(0, 0);\n };\n\n /**\n * Returns whether or not the user is \"scrubbing\". Scrubbing is\n * when the user has clicked the progress bar handle and is\n * dragging it along the progress bar.\n *\n * @param {boolean} [isScrubbing]\n * wether the user is or is not scrubbing\n *\n * @return {boolean}\n * The value of scrubbing when getting\n */\n\n\n Player.prototype.scrubbing = function scrubbing(isScrubbing) {\n if (typeof isScrubbing === 'undefined') {\n return this.scrubbing_;\n }\n this.scrubbing_ = !!isScrubbing;\n\n if (isScrubbing) {\n this.addClass('vjs-scrubbing');\n } else {\n this.removeClass('vjs-scrubbing');\n }\n };\n\n /**\n * Get or set the current time (in seconds)\n *\n * @param {number|string} [seconds]\n * The time to seek to in seconds\n *\n * @return {number}\n * - the current time in seconds when getting\n */\n\n\n Player.prototype.currentTime = function currentTime(seconds) {\n if (typeof seconds !== 'undefined') {\n if (seconds < 0) {\n seconds = 0;\n }\n this.techCall_('setCurrentTime', seconds);\n return;\n }\n\n // cache last currentTime and return. default to 0 seconds\n //\n // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n // currentTime when scrubbing, but may not provide much performance benefit afterall.\n // Should be tested. Also something has to read the actual current time or the cache will\n // never get updated.\n this.cache_.currentTime = this.techGet_('currentTime') || 0;\n return this.cache_.currentTime;\n };\n\n /**\n * Normally gets the length in time of the video in seconds;\n * in all but the rarest use cases an argument will NOT be passed to the method\n *\n * > **NOTE**: The video must have started loading before the duration can be\n * known, and in the case of Flash, may not be known until the video starts\n * playing.\n *\n * @fires Player#durationchange\n *\n * @param {number} [seconds]\n * The duration of the video to set in seconds\n *\n * @return {number}\n * - The duration of the video in seconds when getting\n */\n\n\n Player.prototype.duration = function duration(seconds) {\n if (seconds === undefined) {\n // return NaN if the duration is not known\n return this.cache_.duration !== undefined ? this.cache_.duration : NaN;\n }\n\n seconds = parseFloat(seconds);\n\n // Standardize on Inifity for signaling video is live\n if (seconds < 0) {\n seconds = Infinity;\n }\n\n if (seconds !== this.cache_.duration) {\n // Cache the last set value for optimized scrubbing (esp. Flash)\n this.cache_.duration = seconds;\n\n if (seconds === Infinity) {\n this.addClass('vjs-live');\n } else {\n this.removeClass('vjs-live');\n }\n /**\n * @event Player#durationchange\n * @type {EventTarget~Event}\n */\n this.trigger('durationchange');\n }\n };\n\n /**\n * Calculates how much time is left in the video. Not part\n * of the native video API.\n *\n * @return {number}\n * The time remaining in seconds\n */\n\n\n Player.prototype.remainingTime = function remainingTime() {\n return this.duration() - this.currentTime();\n };\n\n /**\n * A remaining time function that is intented to be used when\n * the time is to be displayed directly to the user.\n *\n * @return {number}\n * The rounded time remaining in seconds\n */\n\n\n Player.prototype.remainingTimeDisplay = function remainingTimeDisplay() {\n return Math.floor(this.duration()) - Math.floor(this.currentTime());\n };\n\n //\n // Kind of like an array of portions of the video that have been downloaded.\n\n /**\n * Get a TimeRange object with an array of the times of the video\n * that have been downloaded. If you just want the percent of the\n * video that's been downloaded, use bufferedPercent.\n *\n * @see [Buffered Spec]{@link http://dev.w3.org/html5/spec/video.html#dom-media-buffered}\n *\n * @return {TimeRange}\n * A mock TimeRange object (following HTML spec)\n */\n\n\n Player.prototype.buffered = function buffered() {\n var buffered = this.techGet_('buffered');\n\n if (!buffered || !buffered.length) {\n buffered = createTimeRanges(0, 0);\n }\n\n return buffered;\n };\n\n /**\n * Get the percent (as a decimal) of the video that's been downloaded.\n * This method is not a part of the native HTML video API.\n *\n * @return {number}\n * A decimal between 0 and 1 representing the percent\n * that is bufferred 0 being 0% and 1 being 100%\n */\n\n\n Player.prototype.bufferedPercent = function bufferedPercent$$1() {\n return bufferedPercent(this.buffered(), this.duration());\n };\n\n /**\n * Get the ending time of the last buffered time range\n * This is used in the progress bar to encapsulate all time ranges.\n *\n * @return {number}\n * The end of the last buffered time range\n */\n\n\n Player.prototype.bufferedEnd = function bufferedEnd() {\n var buffered = this.buffered();\n var duration = this.duration();\n var end = buffered.end(buffered.length - 1);\n\n if (end > duration) {\n end = duration;\n }\n\n return end;\n };\n\n /**\n * Get or set the current volume of the media\n *\n * @param {number} [percentAsDecimal]\n * The new volume as a decimal percent:\n * - 0 is muted/0%/off\n * - 1.0 is 100%/full\n * - 0.5 is half volume or 50%\n *\n * @return {number}\n * The current volume as a percent when getting\n */\n\n\n Player.prototype.volume = function volume(percentAsDecimal) {\n var vol = void 0;\n\n if (percentAsDecimal !== undefined) {\n // Force value to between 0 and 1\n vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal)));\n this.cache_.volume = vol;\n this.techCall_('setVolume', vol);\n\n if (vol > 0) {\n this.lastVolume_(vol);\n }\n\n return;\n }\n\n // Default to 1 when returning current volume.\n vol = parseFloat(this.techGet_('volume'));\n return isNaN(vol) ? 1 : vol;\n };\n\n /**\n * Get the current muted state, or turn mute on or off\n *\n * @param {boolean} [muted]\n * - true to mute\n * - false to unmute\n *\n * @return {boolean}\n * - true if mute is on and getting\n * - false if mute is off and getting\n */\n\n\n Player.prototype.muted = function muted(_muted) {\n if (_muted !== undefined) {\n this.techCall_('setMuted', _muted);\n return;\n }\n return this.techGet_('muted') || false;\n };\n\n /**\n * Get the current defaultMuted state, or turn defaultMuted on or off. defaultMuted\n * indicates the state of muted on intial playback.\n *\n * ```js\n * var myPlayer = videojs('some-player-id');\n *\n * myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n *\n * // get, should be false\n * console.log(myPlayer.defaultMuted());\n * // set to true\n * myPlayer.defaultMuted(true);\n * // get should be true\n * console.log(myPlayer.defaultMuted());\n * ```\n *\n * @param {boolean} [defaultMuted]\n * - true to mute\n * - false to unmute\n *\n * @return {boolean|Player}\n * - true if defaultMuted is on and getting\n * - false if defaultMuted is off and getting\n * - A reference to the current player when setting\n */\n\n\n Player.prototype.defaultMuted = function defaultMuted(_defaultMuted) {\n if (_defaultMuted !== undefined) {\n return this.techCall_('setDefaultMuted', _defaultMuted);\n }\n return this.techGet_('defaultMuted') || false;\n };\n\n /**\n * Get the last volume, or set it\n *\n * @param {number} [percentAsDecimal]\n * The new last volume as a decimal percent:\n * - 0 is muted/0%/off\n * - 1.0 is 100%/full\n * - 0.5 is half volume or 50%\n *\n * @return {number}\n * the current value of lastVolume as a percent when getting\n *\n * @private\n */\n\n\n Player.prototype.lastVolume_ = function lastVolume_(percentAsDecimal) {\n if (percentAsDecimal !== undefined && percentAsDecimal !== 0) {\n this.cache_.lastVolume = percentAsDecimal;\n return;\n }\n return this.cache_.lastVolume;\n };\n\n /**\n * Check if current tech can support native fullscreen\n * (e.g. with built in controls like iOS, so not our flash swf)\n *\n * @return {boolean}\n * if native fullscreen is supported\n */\n\n\n Player.prototype.supportsFullScreen = function supportsFullScreen() {\n return this.techGet_('supportsFullScreen') || false;\n };\n\n /**\n * Check if the player is in fullscreen mode or tell the player that it\n * is or is not in fullscreen mode.\n *\n * > NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n * property and instead document.fullscreenElement is used. But isFullscreen is\n * still a valuable property for internal player workings.\n *\n * @param {boolean} [isFS]\n * Set the players current fullscreen state\n *\n * @return {boolean}\n * - true if fullscreen is on and getting\n * - false if fullscreen is off and getting\n */\n\n\n Player.prototype.isFullscreen = function isFullscreen(isFS) {\n if (isFS !== undefined) {\n this.isFullscreen_ = !!isFS;\n return;\n }\n return !!this.isFullscreen_;\n };\n\n /**\n * Increase the size of the video to full screen\n * In some browsers, full screen is not supported natively, so it enters\n * \"full window mode\", where the video fills the browser window.\n * In browsers and devices that support native full screen, sometimes the\n * browser's default controls will be shown, and not the Video.js custom skin.\n * This includes most mobile devices (iOS, Android) and older versions of\n * Safari.\n *\n * @fires Player#fullscreenchange\n */\n\n\n Player.prototype.requestFullscreen = function requestFullscreen() {\n var fsApi = FullscreenApi;\n\n this.isFullscreen(true);\n\n if (fsApi.requestFullscreen) {\n // the browser supports going fullscreen at the element level so we can\n // take the controls fullscreen as well as the video\n\n // Trigger fullscreenchange event after change\n // We have to specifically add this each time, and remove\n // when canceling fullscreen. Otherwise if there's multiple\n // players on a page, they would all be reacting to the same fullscreen\n // events\n on(document, fsApi.fullscreenchange, bind(this, function documentFullscreenChange(e) {\n this.isFullscreen(document[fsApi.fullscreenElement]);\n\n // If cancelling fullscreen, remove event listener.\n if (this.isFullscreen() === false) {\n off(document, fsApi.fullscreenchange, documentFullscreenChange);\n }\n /**\n * @event Player#fullscreenchange\n * @type {EventTarget~Event}\n */\n this.trigger('fullscreenchange');\n }));\n\n this.el_[fsApi.requestFullscreen]();\n } else if (this.tech_.supportsFullScreen()) {\n // we can't take the video.js controls fullscreen but we can go fullscreen\n // with native controls\n this.techCall_('enterFullScreen');\n } else {\n // fullscreen isn't supported so we'll just stretch the video element to\n // fill the viewport\n this.enterFullWindow();\n /**\n * @event Player#fullscreenchange\n * @type {EventTarget~Event}\n */\n this.trigger('fullscreenchange');\n }\n };\n\n /**\n * Return the video to its normal size after having been in full screen mode\n *\n * @fires Player#fullscreenchange\n */\n\n\n Player.prototype.exitFullscreen = function exitFullscreen() {\n var fsApi = FullscreenApi;\n\n this.isFullscreen(false);\n\n // Check for browser element fullscreen support\n if (fsApi.requestFullscreen) {\n document[fsApi.exitFullscreen]();\n } else if (this.tech_.supportsFullScreen()) {\n this.techCall_('exitFullScreen');\n } else {\n this.exitFullWindow();\n /**\n * @event Player#fullscreenchange\n * @type {EventTarget~Event}\n */\n this.trigger('fullscreenchange');\n }\n };\n\n /**\n * When fullscreen isn't supported we can stretch the\n * video container to as wide as the browser will let us.\n *\n * @fires Player#enterFullWindow\n */\n\n\n Player.prototype.enterFullWindow = function enterFullWindow() {\n this.isFullWindow = true;\n\n // Storing original doc overflow value to return to when fullscreen is off\n this.docOrigOverflow = document.documentElement.style.overflow;\n\n // Add listener for esc key to exit fullscreen\n on(document, 'keydown', bind(this, this.fullWindowOnEscKey));\n\n // Hide any scroll bars\n document.documentElement.style.overflow = 'hidden';\n\n // Apply fullscreen styles\n addClass(document.body, 'vjs-full-window');\n\n /**\n * @event Player#enterFullWindow\n * @type {EventTarget~Event}\n */\n this.trigger('enterFullWindow');\n };\n\n /**\n * Check for call to either exit full window or\n * full screen on ESC key\n *\n * @param {string} event\n * Event to check for key press\n */\n\n\n Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {\n if (event.keyCode === 27) {\n if (this.isFullscreen() === true) {\n this.exitFullscreen();\n } else {\n this.exitFullWindow();\n }\n }\n };\n\n /**\n * Exit full window\n *\n * @fires Player#exitFullWindow\n */\n\n\n Player.prototype.exitFullWindow = function exitFullWindow() {\n this.isFullWindow = false;\n off(document, 'keydown', this.fullWindowOnEscKey);\n\n // Unhide scroll bars.\n document.documentElement.style.overflow = this.docOrigOverflow;\n\n // Remove fullscreen styles\n removeClass(document.body, 'vjs-full-window');\n\n // Resize the box, controller, and poster to original sizes\n // this.positionAll();\n /**\n * @event Player#exitFullWindow\n * @type {EventTarget~Event}\n */\n this.trigger('exitFullWindow');\n };\n\n /**\n * Check whether the player can play a given mimetype\n *\n * @see https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype\n *\n * @param {string} type\n * The mimetype to check\n *\n * @return {string}\n * 'probably', 'maybe', or '' (empty string)\n */\n\n\n Player.prototype.canPlayType = function canPlayType(type) {\n var can = void 0;\n\n // Loop through each playback technology in the options order\n for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {\n var techName = j[i];\n var tech = Tech.getTech(techName);\n\n // Support old behavior of techs being registered as components.\n // Remove once that deprecated behavior is removed.\n if (!tech) {\n tech = Component.getComponent(techName);\n }\n\n // Check if the current tech is defined before continuing\n if (!tech) {\n log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n continue;\n }\n\n // Check if the browser supports this technology\n if (tech.isSupported()) {\n can = tech.canPlayType(type);\n\n if (can) {\n return can;\n }\n }\n }\n\n return '';\n };\n\n /**\n * Select source based on tech-order or source-order\n * Uses source-order selection if `options.sourceOrder` is truthy. Otherwise,\n * defaults to tech-order selection\n *\n * @param {Array} sources\n * The sources for a media asset\n *\n * @return {Object|boolean}\n * Object of source and tech order or false\n */\n\n\n Player.prototype.selectSource = function selectSource(sources) {\n var _this9 = this;\n\n // Get only the techs specified in `techOrder` that exist and are supported by the\n // current platform\n var techs = this.options_.techOrder.map(function (techName) {\n return [techName, Tech.getTech(techName)];\n }).filter(function (_ref) {\n var techName = _ref[0],\n tech = _ref[1];\n\n // Check if the current tech is defined before continuing\n if (tech) {\n // Check if the browser supports this technology\n return tech.isSupported();\n }\n\n log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n return false;\n });\n\n // Iterate over each `innerArray` element once per `outerArray` element and execute\n // `tester` with both. If `tester` returns a non-falsy value, exit early and return\n // that value.\n var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) {\n var found = void 0;\n\n outerArray.some(function (outerChoice) {\n return innerArray.some(function (innerChoice) {\n found = tester(outerChoice, innerChoice);\n\n if (found) {\n return true;\n }\n });\n });\n\n return found;\n };\n\n var foundSourceAndTech = void 0;\n var flip = function flip(fn) {\n return function (a, b) {\n return fn(b, a);\n };\n };\n var finder = function finder(_ref2, source) {\n var techName = _ref2[0],\n tech = _ref2[1];\n\n if (tech.canPlaySource(source, _this9.options_[techName.toLowerCase()])) {\n return { source: source, tech: techName };\n }\n };\n\n // Depending on the truthiness of `options.sourceOrder`, we swap the order of techs and sources\n // to select from them based on their priority.\n if (this.options_.sourceOrder) {\n // Source-first ordering\n foundSourceAndTech = findFirstPassingTechSourcePair(sources, techs, flip(finder));\n } else {\n // Tech-first ordering\n foundSourceAndTech = findFirstPassingTechSourcePair(techs, sources, finder);\n }\n\n return foundSourceAndTech || false;\n };\n\n /**\n * Get or set the video source.\n *\n * @param {Tech~SourceObject|Tech~SourceObject[]|string} [source]\n * A SourceObject, an array of SourceObjects, or a string referencing\n * a URL to a media source. It is _highly recommended_ that an object\n * or array of objects is used here, so that source selection\n * algorithms can take the `type` into account.\n *\n * If not provided, this method acts as a getter.\n *\n * @return {string|undefined}\n * If the `source` argument is missing, returns the current source\n * URL. Otherwise, returns nothing/undefined.\n */\n\n\n Player.prototype.src = function src(source) {\n var _this10 = this;\n\n // getter usage\n if (typeof source === 'undefined') {\n return this.cache_.src || '';\n }\n // filter out invalid sources and turn our source into\n // an array of source objects\n var sources = filterSource(source);\n\n // if a source was passed in then it is invalid because\n // it was filtered to a zero length Array. So we have to\n // show an error\n if (!sources.length) {\n this.setTimeout(function () {\n this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n }, 0);\n return;\n }\n\n // intial sources\n this.changingSrc_ = true;\n\n this.cache_.sources = sources;\n this.updateSourceCaches_(sources[0]);\n\n // middlewareSource is the source after it has been changed by middleware\n setSource(this, sources[0], function (middlewareSource, mws) {\n _this10.middleware_ = mws;\n\n // since sourceSet is async we have to update the cache again after we select a source since\n // the source that is selected could be out of order from the cache update above this callback.\n _this10.cache_.sources = sources;\n _this10.updateSourceCaches_(middlewareSource);\n\n var err = _this10.src_(middlewareSource);\n\n if (err) {\n if (sources.length > 1) {\n return _this10.src(sources.slice(1));\n }\n\n _this10.changingSrc_ = false;\n\n // We need to wrap this in a timeout to give folks a chance to add error event handlers\n _this10.setTimeout(function () {\n this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n }, 0);\n\n // we could not find an appropriate tech, but let's still notify the delegate that this is it\n // this needs a better comment about why this is needed\n _this10.triggerReady();\n\n return;\n }\n\n setTech(mws, _this10.tech_);\n });\n };\n\n /**\n * Set the source object on the tech, returns a boolean that indicates wether\n * there is a tech that can play the source or not\n *\n * @param {Tech~SourceObject} source\n * The source object to set on the Tech\n *\n * @return {Boolean}\n * - True if there is no Tech to playback this source\n * - False otherwise\n *\n * @private\n */\n\n\n Player.prototype.src_ = function src_(source) {\n var _this11 = this;\n\n var sourceTech = this.selectSource([source]);\n\n if (!sourceTech) {\n return true;\n }\n\n if (!titleCaseEquals(sourceTech.tech, this.techName_)) {\n this.changingSrc_ = true;\n // load this technology with the chosen source\n this.loadTech_(sourceTech.tech, sourceTech.source);\n this.tech_.ready(function () {\n _this11.changingSrc_ = false;\n });\n return false;\n }\n\n // wait until the tech is ready to set the source\n // and set it synchronously if possible (#2326)\n this.ready(function () {\n\n // The setSource tech method was added with source handlers\n // so older techs won't support it\n // We need to check the direct prototype for the case where subclasses\n // of the tech do not support source handlers\n if (this.tech_.constructor.prototype.hasOwnProperty('setSource')) {\n this.techCall_('setSource', source);\n } else {\n this.techCall_('src', source.src);\n }\n\n this.changingSrc_ = false;\n }, true);\n\n return false;\n };\n\n /**\n * Begin loading the src data.\n */\n\n\n Player.prototype.load = function load() {\n this.techCall_('load');\n };\n\n /**\n * Reset the player. Loads the first tech in the techOrder,\n * and calls `reset` on the tech`.\n */\n\n\n Player.prototype.reset = function reset() {\n if (this.tech_) {\n this.tech_.clearTracks('text');\n }\n this.loadTech_(this.options_.techOrder[0], null);\n this.techCall_('reset');\n };\n\n /**\n * Returns all of the current source objects.\n *\n * @return {Tech~SourceObject[]}\n * The current source objects\n */\n\n\n Player.prototype.currentSources = function currentSources() {\n var source = this.currentSource();\n var sources = [];\n\n // assume `{}` or `{ src }`\n if (Object.keys(source).length !== 0) {\n sources.push(source);\n }\n\n return this.cache_.sources || sources;\n };\n\n /**\n * Returns the current source object.\n *\n * @return {Tech~SourceObject}\n * The current source object\n */\n\n\n Player.prototype.currentSource = function currentSource() {\n return this.cache_.source || {};\n };\n\n /**\n * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n *\n * @return {string}\n * The current source\n */\n\n\n Player.prototype.currentSrc = function currentSrc() {\n return this.currentSource() && this.currentSource().src || '';\n };\n\n /**\n * Get the current source type e.g. video/mp4\n * This can allow you rebuild the current source object so that you could load the same\n * source and tech later\n *\n * @return {string}\n * The source MIME type\n */\n\n\n Player.prototype.currentType = function currentType() {\n return this.currentSource() && this.currentSource().type || '';\n };\n\n /**\n * Get or set the preload attribute\n *\n * @param {boolean} [value]\n * - true means that we should preload\n * - false maens that we should not preload\n *\n * @return {string}\n * The preload attribute value when getting\n */\n\n\n Player.prototype.preload = function preload(value) {\n if (value !== undefined) {\n this.techCall_('setPreload', value);\n this.options_.preload = value;\n return;\n }\n return this.techGet_('preload');\n };\n\n /**\n * Get or set the autoplay option. When this is a boolean it will\n * modify the attribute on the tech. When this is a string the attribute on\n * the tech will be removed and `Player` will handle autoplay on loadstarts.\n *\n * @param {boolean|string} [value]\n * - true: autoplay using the browser behavior\n * - false: do not autoplay\n * - 'play': call play() on every loadstart\n * - 'muted': call muted() then play() on every loadstart\n * - 'any': call play() on every loadstart. if that fails call muted() then play().\n * - *: values other than those listed here will be set `autoplay` to true\n *\n * @return {boolean|string}\n * The current value of autoplay when getting\n */\n\n\n Player.prototype.autoplay = function autoplay(value) {\n // getter usage\n if (value === undefined) {\n return this.options_.autoplay || false;\n }\n\n var techAutoplay = void 0;\n\n // if the value is a valid string set it to that\n if (typeof value === 'string' && /(any|play|muted)/.test(value)) {\n this.options_.autoplay = value;\n this.manualAutoplay_(value);\n techAutoplay = false;\n\n // any falsy value sets autoplay to false in the browser,\n // lets do the same\n } else if (!value) {\n this.options_.autoplay = false;\n\n // any other value (ie truthy) sets autoplay to true\n } else {\n this.options_.autoplay = true;\n }\n\n techAutoplay = techAutoplay || this.options_.autoplay;\n\n // if we don't have a tech then we do not queue up\n // a setAutoplay call on tech ready. We do this because the\n // autoplay option will be passed in the constructor and we\n // do not need to set it twice\n if (this.tech_) {\n this.techCall_('setAutoplay', techAutoplay);\n }\n };\n\n /**\n * Set or unset the playsinline attribute.\n * Playsinline tells the browser that non-fullscreen playback is preferred.\n *\n * @param {boolean} [value]\n * - true means that we should try to play inline by default\n * - false means that we should use the browser's default playback mode,\n * which in most cases is inline. iOS Safari is a notable exception\n * and plays fullscreen by default.\n *\n * @return {string|Player}\n * - the current value of playsinline\n * - the player when setting\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n\n\n Player.prototype.playsinline = function playsinline(value) {\n if (value !== undefined) {\n this.techCall_('setPlaysinline', value);\n this.options_.playsinline = value;\n return this;\n }\n return this.techGet_('playsinline');\n };\n\n /**\n * Get or set the loop attribute on the video element.\n *\n * @param {boolean} [value]\n * - true means that we should loop the video\n * - false means that we should not loop the video\n *\n * @return {string}\n * The current value of loop when getting\n */\n\n\n Player.prototype.loop = function loop(value) {\n if (value !== undefined) {\n this.techCall_('setLoop', value);\n this.options_.loop = value;\n return;\n }\n return this.techGet_('loop');\n };\n\n /**\n * Get or set the poster image source url\n *\n * @fires Player#posterchange\n *\n * @param {string} [src]\n * Poster image source URL\n *\n * @return {string}\n * The current value of poster when getting\n */\n\n\n Player.prototype.poster = function poster(src) {\n if (src === undefined) {\n return this.poster_;\n }\n\n // The correct way to remove a poster is to set as an empty string\n // other falsey values will throw errors\n if (!src) {\n src = '';\n }\n\n if (src === this.poster_) {\n return;\n }\n\n // update the internal poster variable\n this.poster_ = src;\n\n // update the tech's poster\n this.techCall_('setPoster', src);\n\n this.isPosterFromTech_ = false;\n\n // alert components that the poster has been set\n /**\n * This event fires when the poster image is changed on the player.\n *\n * @event Player#posterchange\n * @type {EventTarget~Event}\n */\n this.trigger('posterchange');\n };\n\n /**\n * Some techs (e.g. YouTube) can provide a poster source in an\n * asynchronous way. We want the poster component to use this\n * poster source so that it covers up the tech's controls.\n * (YouTube's play button). However we only want to use this\n * source if the player user hasn't set a poster through\n * the normal APIs.\n *\n * @fires Player#posterchange\n * @listens Tech#posterchange\n * @private\n */\n\n\n Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {\n if ((!this.poster_ || this.options_.techCanOverridePoster) && this.tech_ && this.tech_.poster) {\n var newPoster = this.tech_.poster() || '';\n\n if (newPoster !== this.poster_) {\n this.poster_ = newPoster;\n this.isPosterFromTech_ = true;\n\n // Let components know the poster has changed\n this.trigger('posterchange');\n }\n }\n };\n\n /**\n * Get or set whether or not the controls are showing.\n *\n * @fires Player#controlsenabled\n *\n * @param {boolean} [bool]\n * - true to turn controls on\n * - false to turn controls off\n *\n * @return {boolean}\n * The current value of controls when getting\n */\n\n\n Player.prototype.controls = function controls(bool) {\n if (bool === undefined) {\n return !!this.controls_;\n }\n\n bool = !!bool;\n\n // Don't trigger a change event unless it actually changed\n if (this.controls_ === bool) {\n return;\n }\n\n this.controls_ = bool;\n\n if (this.usingNativeControls()) {\n this.techCall_('setControls', bool);\n }\n\n if (this.controls_) {\n this.removeClass('vjs-controls-disabled');\n this.addClass('vjs-controls-enabled');\n /**\n * @event Player#controlsenabled\n * @type {EventTarget~Event}\n */\n this.trigger('controlsenabled');\n if (!this.usingNativeControls()) {\n this.addTechControlsListeners_();\n }\n } else {\n this.removeClass('vjs-controls-enabled');\n this.addClass('vjs-controls-disabled');\n /**\n * @event Player#controlsdisabled\n * @type {EventTarget~Event}\n */\n this.trigger('controlsdisabled');\n if (!this.usingNativeControls()) {\n this.removeTechControlsListeners_();\n }\n }\n };\n\n /**\n * Toggle native controls on/off. Native controls are the controls built into\n * devices (e.g. default iPhone controls), Flash, or other techs\n * (e.g. Vimeo Controls)\n * **This should only be set by the current tech, because only the tech knows\n * if it can support native controls**\n *\n * @fires Player#usingnativecontrols\n * @fires Player#usingcustomcontrols\n *\n * @param {boolean} [bool]\n * - true to turn native controls on\n * - false to turn native controls off\n *\n * @return {boolean}\n * The current value of native controls when getting\n */\n\n\n Player.prototype.usingNativeControls = function usingNativeControls(bool) {\n if (bool === undefined) {\n return !!this.usingNativeControls_;\n }\n\n bool = !!bool;\n\n // Don't trigger a change event unless it actually changed\n if (this.usingNativeControls_ === bool) {\n return;\n }\n\n this.usingNativeControls_ = bool;\n\n if (this.usingNativeControls_) {\n this.addClass('vjs-using-native-controls');\n\n /**\n * player is using the native device controls\n *\n * @event Player#usingnativecontrols\n * @type {EventTarget~Event}\n */\n this.trigger('usingnativecontrols');\n } else {\n this.removeClass('vjs-using-native-controls');\n\n /**\n * player is using the custom HTML controls\n *\n * @event Player#usingcustomcontrols\n * @type {EventTarget~Event}\n */\n this.trigger('usingcustomcontrols');\n }\n };\n\n /**\n * Set or get the current MediaError\n *\n * @fires Player#error\n *\n * @param {MediaError|string|number} [err]\n * A MediaError or a string/number to be turned\n * into a MediaError\n *\n * @return {MediaError|null}\n * The current MediaError when getting (or null)\n */\n\n\n Player.prototype.error = function error(err) {\n if (err === undefined) {\n return this.error_ || null;\n }\n\n // restoring to default\n if (err === null) {\n this.error_ = err;\n this.removeClass('vjs-error');\n if (this.errorDisplay) {\n this.errorDisplay.close();\n }\n return;\n }\n\n this.error_ = new MediaError(err);\n\n // add the vjs-error classname to the player\n this.addClass('vjs-error');\n\n // log the name of the error type and any message\n // ie8 just logs \"[object object]\" if you just log the error object\n log$1.error('(CODE:' + this.error_.code + ' ' + MediaError.errorTypes[this.error_.code] + ')', this.error_.message, this.error_);\n\n /**\n * @event Player#error\n * @type {EventTarget~Event}\n */\n this.trigger('error');\n\n return;\n };\n\n /**\n * Report user activity\n *\n * @param {Object} event\n * Event object\n */\n\n\n Player.prototype.reportUserActivity = function reportUserActivity(event) {\n this.userActivity_ = true;\n };\n\n /**\n * Get/set if user is active\n *\n * @fires Player#useractive\n * @fires Player#userinactive\n *\n * @param {boolean} [bool]\n * - true if the user is active\n * - false if the user is inactive\n *\n * @return {boolean}\n * The current value of userActive when getting\n */\n\n\n Player.prototype.userActive = function userActive(bool) {\n if (bool === undefined) {\n return this.userActive_;\n }\n\n bool = !!bool;\n\n if (bool === this.userActive_) {\n return;\n }\n\n this.userActive_ = bool;\n\n if (this.userActive_) {\n this.userActivity_ = true;\n this.removeClass('vjs-user-inactive');\n this.addClass('vjs-user-active');\n /**\n * @event Player#useractive\n * @type {EventTarget~Event}\n */\n this.trigger('useractive');\n return;\n }\n\n // Chrome/Safari/IE have bugs where when you change the cursor it can\n // trigger a mousemove event. This causes an issue when you're hiding\n // the cursor when the user is inactive, and a mousemove signals user\n // activity. Making it impossible to go into inactive mode. Specifically\n // this happens in fullscreen when we really need to hide the cursor.\n //\n // When this gets resolved in ALL browsers it can be removed\n // https://code.google.com/p/chromium/issues/detail?id=103041\n if (this.tech_) {\n this.tech_.one('mousemove', function (e) {\n e.stopPropagation();\n e.preventDefault();\n });\n }\n\n this.userActivity_ = false;\n this.removeClass('vjs-user-active');\n this.addClass('vjs-user-inactive');\n /**\n * @event Player#userinactive\n * @type {EventTarget~Event}\n */\n this.trigger('userinactive');\n };\n\n /**\n * Listen for user activity based on timeout value\n *\n * @private\n */\n\n\n Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {\n var mouseInProgress = void 0;\n var lastMoveX = void 0;\n var lastMoveY = void 0;\n var handleActivity = bind(this, this.reportUserActivity);\n\n var handleMouseMove = function handleMouseMove(e) {\n // #1068 - Prevent mousemove spamming\n // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n lastMoveX = e.screenX;\n lastMoveY = e.screenY;\n handleActivity();\n }\n };\n\n var handleMouseDown = function handleMouseDown() {\n handleActivity();\n // For as long as the they are touching the device or have their mouse down,\n // we consider them active even if they're not moving their finger or mouse.\n // So we want to continue to update that they are active\n this.clearInterval(mouseInProgress);\n // Setting userActivity=true now and setting the interval to the same time\n // as the activityCheck interval (250) should ensure we never miss the\n // next activityCheck\n mouseInProgress = this.setInterval(handleActivity, 250);\n };\n\n var handleMouseUp = function handleMouseUp(event) {\n handleActivity();\n // Stop the interval that maintains activity if the mouse/touch is down\n this.clearInterval(mouseInProgress);\n };\n\n // Any mouse movement will be considered user activity\n this.on('mousedown', handleMouseDown);\n this.on('mousemove', handleMouseMove);\n this.on('mouseup', handleMouseUp);\n\n // Listen for keyboard navigation\n // Shouldn't need to use inProgress interval because of key repeat\n this.on('keydown', handleActivity);\n this.on('keyup', handleActivity);\n\n // Run an interval every 250 milliseconds instead of stuffing everything into\n // the mousemove/touchmove function itself, to prevent performance degradation.\n // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n // then gets picked up by this loop\n // http://ejohn.org/blog/learning-from-twitter/\n var inactivityTimeout = void 0;\n\n this.setInterval(function () {\n // Check to see if mouse/touch activity has happened\n if (!this.userActivity_) {\n return;\n }\n\n // Reset the activity tracker\n this.userActivity_ = false;\n\n // If the user state was inactive, set the state to active\n this.userActive(true);\n\n // Clear any existing inactivity timeout to start the timer over\n this.clearTimeout(inactivityTimeout);\n\n var timeout = this.options_.inactivityTimeout;\n\n if (timeout <= 0) {\n return;\n }\n\n // In <timeout> milliseconds, if no more activity has occurred the\n // user will be considered inactive\n inactivityTimeout = this.setTimeout(function () {\n // Protect against the case where the inactivityTimeout can trigger just\n // before the next user activity is picked up by the activity check loop\n // causing a flicker\n if (!this.userActivity_) {\n this.userActive(false);\n }\n }, timeout);\n }, 250);\n };\n\n /**\n * Gets or sets the current playback rate. A playback rate of\n * 1.0 represents normal speed and 0.5 would indicate half-speed\n * playback, for instance.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n *\n * @param {number} [rate]\n * New playback rate to set.\n *\n * @return {number}\n * The current playback rate when getting or 1.0\n */\n\n\n Player.prototype.playbackRate = function playbackRate(rate) {\n if (rate !== undefined) {\n // NOTE: this.cache_.lastPlaybackRate is set from the tech handler\n // that is registered above\n this.techCall_('setPlaybackRate', rate);\n return;\n }\n\n if (this.tech_ && this.tech_.featuresPlaybackRate) {\n return this.cache_.lastPlaybackRate || this.techGet_('playbackRate');\n }\n return 1.0;\n };\n\n /**\n * Gets or sets the current default playback rate. A default playback rate of\n * 1.0 represents normal speed and 0.5 would indicate half-speed playback, for instance.\n * defaultPlaybackRate will only represent what the intial playbackRate of a video was, not\n * not the current playbackRate.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-defaultplaybackrate\n *\n * @param {number} [rate]\n * New default playback rate to set.\n *\n * @return {number|Player}\n * - The default playback rate when getting or 1.0\n * - the player when setting\n */\n\n\n Player.prototype.defaultPlaybackRate = function defaultPlaybackRate(rate) {\n if (rate !== undefined) {\n return this.techCall_('setDefaultPlaybackRate', rate);\n }\n\n if (this.tech_ && this.tech_.featuresPlaybackRate) {\n return this.techGet_('defaultPlaybackRate');\n }\n return 1.0;\n };\n\n /**\n * Gets or sets the audio flag\n *\n * @param {boolean} bool\n * - true signals that this is an audio player\n * - false signals that this is not an audio player\n *\n * @return {boolean}\n * The current value of isAudio when getting\n */\n\n\n Player.prototype.isAudio = function isAudio(bool) {\n if (bool !== undefined) {\n this.isAudio_ = !!bool;\n return;\n }\n\n return !!this.isAudio_;\n };\n\n /**\n * A helper method for adding a {@link TextTrack} to our\n * {@link TextTrackList}.\n *\n * In addition to the W3C settings we allow adding additional info through options.\n *\n * @see http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n *\n * @param {string} [kind]\n * the kind of TextTrack you are adding\n *\n * @param {string} [label]\n * the label to give the TextTrack label\n *\n * @param {string} [language]\n * the language to set on the TextTrack\n *\n * @return {TextTrack|undefined}\n * the TextTrack that was added or undefined\n * if there is no tech\n */\n\n\n Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n if (this.tech_) {\n return this.tech_.addTextTrack(kind, label, language);\n }\n };\n\n /**\n * Create a remote {@link TextTrack} and an {@link HTMLTrackElement}. It will\n * automatically removed from the video element whenever the source changes, unless\n * manualCleanup is set to false.\n *\n * @param {Object} options\n * Options to pass to {@link HTMLTrackElement} during creation. See\n * {@link HTMLTrackElement} for object properties that you should use.\n *\n * @param {boolean} [manualCleanup=true] if set to false, the TextTrack will be\n *\n * @return {HtmlTrackElement}\n * the HTMLTrackElement that was created and added\n * to the HtmlTrackElementList and the remote\n * TextTrackList\n *\n * @deprecated The default value of the \"manualCleanup\" parameter will default\n * to \"false\" in upcoming versions of Video.js\n */\n\n\n Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n if (this.tech_) {\n return this.tech_.addRemoteTextTrack(options, manualCleanup);\n }\n };\n\n /**\n * Remove a remote {@link TextTrack} from the respective\n * {@link TextTrackList} and {@link HtmlTrackElementList}.\n *\n * @param {Object} track\n * Remote {@link TextTrack} to remove\n *\n * @return {undefined}\n * does not return anything\n */\n\n\n Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack() {\n var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref3$track = _ref3.track,\n track = _ref3$track === undefined ? arguments[0] : _ref3$track;\n\n // destructure the input into an object with a track argument, defaulting to arguments[0]\n // default the whole argument to an empty object if nothing was passed in\n\n if (this.tech_) {\n return this.tech_.removeRemoteTextTrack(track);\n }\n };\n\n /**\n * Gets available media playback quality metrics as specified by the W3C's Media\n * Playback Quality API.\n *\n * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n *\n * @return {Object|undefined}\n * An object with supported media playback quality metrics or undefined if there\n * is no tech or the tech does not support it.\n */\n\n\n Player.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n return this.techGet_('getVideoPlaybackQuality');\n };\n\n /**\n * Get video width\n *\n * @return {number}\n * current video width\n */\n\n\n Player.prototype.videoWidth = function videoWidth() {\n return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n };\n\n /**\n * Get video height\n *\n * @return {number}\n * current video height\n */\n\n\n Player.prototype.videoHeight = function videoHeight() {\n return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n };\n\n /**\n * The player's language code\n * NOTE: The language should be set in the player options if you want the\n * the controls to be built with a specific language. Changing the lanugage\n * later will not update controls text.\n *\n * @param {string} [code]\n * the language code to set the player to\n *\n * @return {string}\n * The current language code when getting\n */\n\n\n Player.prototype.language = function language(code) {\n if (code === undefined) {\n return this.language_;\n }\n\n this.language_ = String(code).toLowerCase();\n };\n\n /**\n * Get the player's language dictionary\n * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n * Languages specified directly in the player options have precedence\n *\n * @return {Array}\n * An array of of supported languages\n */\n\n\n Player.prototype.languages = function languages() {\n return mergeOptions(Player.prototype.options_.languages, this.languages_);\n };\n\n /**\n * returns a JavaScript object reperesenting the current track\n * information. **DOES not return it as JSON**\n *\n * @return {Object}\n * Object representing the current of track info\n */\n\n\n Player.prototype.toJSON = function toJSON() {\n var options = mergeOptions(this.options_);\n var tracks = options.tracks;\n\n options.tracks = [];\n\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n\n // deep merge tracks and null out player so no circular references\n track = mergeOptions(track);\n track.player = undefined;\n options.tracks[i] = track;\n }\n\n return options;\n };\n\n /**\n * Creates a simple modal dialog (an instance of the {@link ModalDialog}\n * component) that immediately overlays the player with arbitrary\n * content and removes itself when closed.\n *\n * @param {string|Function|Element|Array|null} content\n * Same as {@link ModalDialog#content}'s param of the same name.\n * The most straight-forward usage is to provide a string or DOM\n * element.\n *\n * @param {Object} [options]\n * Extra options which will be passed on to the {@link ModalDialog}.\n *\n * @return {ModalDialog}\n * the {@link ModalDialog} that was created\n */\n\n\n Player.prototype.createModal = function createModal(content, options) {\n var _this12 = this;\n\n options = options || {};\n options.content = content || '';\n\n var modal = new ModalDialog(this, options);\n\n this.addChild(modal);\n modal.on('dispose', function () {\n _this12.removeChild(modal);\n });\n\n modal.open();\n return modal;\n };\n\n /**\n * Gets tag settings\n *\n * @param {Element} tag\n * The player tag\n *\n * @return {Object}\n * An object containing all of the settings\n * for a player tag\n */\n\n\n Player.getTagSettings = function getTagSettings(tag) {\n var baseOptions = {\n sources: [],\n tracks: []\n };\n\n var tagOptions = getAttributes(tag);\n var dataSetup = tagOptions['data-setup'];\n\n if (hasClass(tag, 'vjs-fluid')) {\n tagOptions.fluid = true;\n }\n\n // Check if data-setup attr exists.\n if (dataSetup !== null) {\n // Parse options JSON\n // If empty string, make it a parsable json object.\n var _safeParseTuple = safeParseTuple(dataSetup || '{}'),\n err = _safeParseTuple[0],\n data = _safeParseTuple[1];\n\n if (err) {\n log$1.error(err);\n }\n assign(tagOptions, data);\n }\n\n assign(baseOptions, tagOptions);\n\n // Get tag children settings\n if (tag.hasChildNodes()) {\n var children = tag.childNodes;\n\n for (var i = 0, j = children.length; i < j; i++) {\n var child = children[i];\n // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n var childName = child.nodeName.toLowerCase();\n\n if (childName === 'source') {\n baseOptions.sources.push(getAttributes(child));\n } else if (childName === 'track') {\n baseOptions.tracks.push(getAttributes(child));\n }\n }\n }\n\n return baseOptions;\n };\n\n /**\n * Determine wether or not flexbox is supported\n *\n * @return {boolean}\n * - true if flexbox is supported\n * - false if flexbox is not supported\n */\n\n\n Player.prototype.flexNotSupported_ = function flexNotSupported_() {\n var elem = document.createElement('i');\n\n // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n // common flex features that we can rely on when checking for flex support.\n return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style ||\n // IE10-specific (2012 flex spec)\n 'msFlexOrder' in elem.style);\n };\n\n return Player;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist\n *\n * @return {VideoTrackList}\n * the current video track list\n *\n * @method Player.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist\n *\n * @return {AudioTrackList}\n * the current audio track list\n *\n * @method Player.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @link http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n *\n * @return {TextTrackList}\n * the current text track list\n *\n * @method Player.prototype.textTracks\n */\n\n/**\n * Get the remote {@link TextTrackList}\n *\n * @return {TextTrackList}\n * The current remote text track list\n *\n * @method Player.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote {@link HtmlTrackElementList} tracks.\n *\n * @return {HtmlTrackElementList}\n * The current remote text track element list\n *\n * @method Player.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name$$1) {\n var props = ALL[name$$1];\n\n Player.prototype[props.getterName] = function () {\n if (this.tech_) {\n return this.tech_[props.getterName]();\n }\n\n // if we have not yet loadTech_, we create {video,audio,text}Tracks_\n // these will be passed to the tech during loading\n this[props.privateName] = this[props.privateName] || new props.ListClass();\n return this[props.privateName];\n };\n});\n\n/**\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nvar navigator = window.navigator;\n\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n // Default order of fallback technology\n techOrder: Tech.defaultTechOrder_,\n\n html5: {},\n flash: {},\n\n // default inactivity timeout\n inactivityTimeout: 2000,\n\n // default playback rates\n playbackRates: [],\n // Add playback rate selection by adding rates\n // 'playbackRates': [0.5, 1, 1.5, 2],\n\n // Included control sets\n children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],\n\n language: navigator && (navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language) || 'en',\n\n // locales and their language translations\n languages: {},\n\n // Default message to show when a video cannot be played.\n notSupportedMessage: 'No compatible source was found for this media.'\n};\n\nif (!IS_IE8) {\n Player.prototype.options_.children.push('resizeManager');\n}\n\n[\n/**\n * Returns whether or not the player is in the \"ended\" state.\n *\n * @return {Boolean} True if the player is in the ended state, false if not.\n * @method Player#ended\n */\n'ended',\n/**\n * Returns whether or not the player is in the \"seeking\" state.\n *\n * @return {Boolean} True if the player is in the seeking state, false if not.\n * @method Player#seeking\n */\n'seeking',\n/**\n * Returns the TimeRanges of the media that are currently available\n * for seeking to.\n *\n * @return {TimeRanges} the seekable intervals of the media timeline\n * @method Player#seekable\n */\n'seekable',\n/**\n * Returns the current state of network activity for the element, from\n * the codes in the list below.\n * - NETWORK_EMPTY (numeric value 0)\n * The element has not yet been initialised. All attributes are in\n * their initial states.\n * - NETWORK_IDLE (numeric value 1)\n * The element's resource selection algorithm is active and has\n * selected a resource, but it is not actually using the network at\n * this time.\n * - NETWORK_LOADING (numeric value 2)\n * The user agent is actively trying to download data.\n * - NETWORK_NO_SOURCE (numeric value 3)\n * The element's resource selection algorithm is active, but it has\n * not yet found a resource to use.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n * @return {number} the current network activity state\n * @method Player#networkState\n */\n'networkState',\n/**\n * Returns a value that expresses the current state of the element\n * with respect to rendering the current playback position, from the\n * codes in the list below.\n * - HAVE_NOTHING (numeric value 0)\n * No information regarding the media resource is available.\n * - HAVE_METADATA (numeric value 1)\n * Enough of the resource has been obtained that the duration of the\n * resource is available.\n * - HAVE_CURRENT_DATA (numeric value 2)\n * Data for the immediate current playback position is available.\n * - HAVE_FUTURE_DATA (numeric value 3)\n * Data for the immediate current playback position is available, as\n * well as enough data for the user agent to advance the current\n * playback position in the direction of playback.\n * - HAVE_ENOUGH_DATA (numeric value 4)\n * The user agent estimates that enough data is available for\n * playback to proceed uninterrupted.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n * @return {number} the current playback rendering state\n * @method Player#readyState\n */\n'readyState'].forEach(function (fn) {\n Player.prototype[fn] = function () {\n return this.techGet_(fn);\n };\n});\n\nTECH_EVENTS_RETRIGGER.forEach(function (event) {\n Player.prototype['handleTech' + toTitleCase(event) + '_'] = function () {\n return this.trigger(event);\n };\n});\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event Player#loadeddata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event Player#timeupdate\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the volume changes\n *\n * @event Player#volumechange\n * @type {EventTarget~Event}\n */\n\n/**\n * Reports whether or not a player has a plugin available.\n *\n * This does not report whether or not the plugin has ever been initialized\n * on this player. For that, [usingPlugin]{@link Player#usingPlugin}.\n *\n * @method Player#hasPlugin\n * @param {string} name\n * The name of a plugin.\n *\n * @return {boolean}\n * Whether or not this player has the requested plugin available.\n */\n\n/**\n * Reports whether or not a player is using a plugin by name.\n *\n * For basic plugins, this only reports whether the plugin has _ever_ been\n * initialized on this player.\n *\n * @method Player#usingPlugin\n * @param {string} name\n * The name of a plugin.\n *\n * @return {boolean}\n * Whether or not this player is using the requested plugin.\n */\n\nComponent.registerComponent('Player', Player);\n\n/**\n * @file plugin.js\n */\n/**\n * The base plugin name.\n *\n * @private\n * @constant\n * @type {string}\n */\nvar BASE_PLUGIN_NAME = 'plugin';\n\n/**\n * The key on which a player's active plugins cache is stored.\n *\n * @private\n * @constant\n * @type {string}\n */\nvar PLUGIN_CACHE_KEY = 'activePlugins_';\n\n/**\n * Stores registered plugins in a private space.\n *\n * @private\n * @type {Object}\n */\nvar pluginStorage = {};\n\n/**\n * Reports whether or not a plugin has been registered.\n *\n * @private\n * @param {string} name\n * The name of a plugin.\n *\n * @returns {boolean}\n * Whether or not the plugin has been registered.\n */\nvar pluginExists = function pluginExists(name) {\n return pluginStorage.hasOwnProperty(name);\n};\n\n/**\n * Get a single registered plugin by name.\n *\n * @private\n * @param {string} name\n * The name of a plugin.\n *\n * @returns {Function|undefined}\n * The plugin (or undefined).\n */\nvar getPlugin = function getPlugin(name) {\n return pluginExists(name) ? pluginStorage[name] : undefined;\n};\n\n/**\n * Marks a plugin as \"active\" on a player.\n *\n * Also, ensures that the player has an object for tracking active plugins.\n *\n * @private\n * @param {Player} player\n * A Video.js player instance.\n *\n * @param {string} name\n * The name of a plugin.\n */\nvar markPluginAsActive = function markPluginAsActive(player, name) {\n player[PLUGIN_CACHE_KEY] = player[PLUGIN_CACHE_KEY] || {};\n player[PLUGIN_CACHE_KEY][name] = true;\n};\n\n/**\n * Triggers a pair of plugin setup events.\n *\n * @private\n * @param {Player} player\n * A Video.js player instance.\n *\n * @param {Plugin~PluginEventHash} hash\n * A plugin event hash.\n *\n * @param {Boolean} [before]\n * If true, prefixes the event name with \"before\". In other words,\n * use this to trigger \"beforepluginsetup\" instead of \"pluginsetup\".\n */\nvar triggerSetupEvent = function triggerSetupEvent(player, hash, before) {\n var eventName = (before ? 'before' : '') + 'pluginsetup';\n\n player.trigger(eventName, hash);\n player.trigger(eventName + ':' + hash.name, hash);\n};\n\n/**\n * Takes a basic plugin function and returns a wrapper function which marks\n * on the player that the plugin has been activated.\n *\n * @private\n * @param {string} name\n * The name of the plugin.\n *\n * @param {Function} plugin\n * The basic plugin.\n *\n * @returns {Function}\n * A wrapper function for the given plugin.\n */\nvar createBasicPlugin = function createBasicPlugin(name, plugin) {\n var basicPluginWrapper = function basicPluginWrapper() {\n\n // We trigger the \"beforepluginsetup\" and \"pluginsetup\" events on the player\n // regardless, but we want the hash to be consistent with the hash provided\n // for advanced plugins.\n //\n // The only potentially counter-intuitive thing here is the `instance` in\n // the \"pluginsetup\" event is the value returned by the `plugin` function.\n triggerSetupEvent(this, { name: name, plugin: plugin, instance: null }, true);\n\n var instance = plugin.apply(this, arguments);\n\n markPluginAsActive(this, name);\n triggerSetupEvent(this, { name: name, plugin: plugin, instance: instance });\n\n return instance;\n };\n\n Object.keys(plugin).forEach(function (prop) {\n basicPluginWrapper[prop] = plugin[prop];\n });\n\n return basicPluginWrapper;\n};\n\n/**\n * Takes a plugin sub-class and returns a factory function for generating\n * instances of it.\n *\n * This factory function will replace itself with an instance of the requested\n * sub-class of Plugin.\n *\n * @private\n * @param {string} name\n * The name of the plugin.\n *\n * @param {Plugin} PluginSubClass\n * The advanced plugin.\n *\n * @returns {Function}\n */\nvar createPluginFactory = function createPluginFactory(name, PluginSubClass) {\n\n // Add a `name` property to the plugin prototype so that each plugin can\n // refer to itself by name.\n PluginSubClass.prototype.name = name;\n\n return function () {\n triggerSetupEvent(this, { name: name, plugin: PluginSubClass, instance: null }, true);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var instance = new (Function.prototype.bind.apply(PluginSubClass, [null].concat([this].concat(args))))();\n\n // The plugin is replaced by a function that returns the current instance.\n this[name] = function () {\n return instance;\n };\n\n triggerSetupEvent(this, instance.getEventHash());\n\n return instance;\n };\n};\n\n/**\n * Parent class for all advanced plugins.\n *\n * @mixes module:evented~EventedMixin\n * @mixes module:stateful~StatefulMixin\n * @fires Player#beforepluginsetup\n * @fires Player#beforepluginsetup:$name\n * @fires Player#pluginsetup\n * @fires Player#pluginsetup:$name\n * @listens Player#dispose\n * @throws {Error}\n * If attempting to instantiate the base {@link Plugin} class\n * directly instead of via a sub-class.\n */\n\nvar Plugin = function () {\n\n /**\n * Creates an instance of this class.\n *\n * Sub-classes should call `super` to ensure plugins are properly initialized.\n *\n * @param {Player} player\n * A Video.js player instance.\n */\n function Plugin(player) {\n classCallCheck(this, Plugin);\n\n if (this.constructor === Plugin) {\n throw new Error('Plugin must be sub-classed; not directly instantiated.');\n }\n\n this.player = player;\n\n // Make this object evented, but remove the added `trigger` method so we\n // use the prototype version instead.\n evented(this);\n delete this.trigger;\n\n stateful(this, this.constructor.defaultState);\n markPluginAsActive(player, this.name);\n\n // Auto-bind the dispose method so we can use it as a listener and unbind\n // it later easily.\n this.dispose = bind(this, this.dispose);\n\n // If the player is disposed, dispose the plugin.\n player.on('dispose', this.dispose);\n }\n\n /**\n * Get the version of the plugin that was set on <pluginName>.VERSION\n */\n\n\n Plugin.prototype.version = function version() {\n return this.constructor.VERSION;\n };\n\n /**\n * Each event triggered by plugins includes a hash of additional data with\n * conventional properties.\n *\n * This returns that object or mutates an existing hash.\n *\n * @param {Object} [hash={}]\n * An object to be used as event an event hash.\n *\n * @returns {Plugin~PluginEventHash}\n * An event hash object with provided properties mixed-in.\n */\n\n\n Plugin.prototype.getEventHash = function getEventHash() {\n var hash = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n hash.name = this.name;\n hash.plugin = this.constructor;\n hash.instance = this;\n return hash;\n };\n\n /**\n * Triggers an event on the plugin object and overrides\n * {@link module:evented~EventedMixin.trigger|EventedMixin.trigger}.\n *\n * @param {string|Object} event\n * An event type or an object with a type property.\n *\n * @param {Object} [hash={}]\n * Additional data hash to merge with a\n * {@link Plugin~PluginEventHash|PluginEventHash}.\n *\n * @returns {boolean}\n * Whether or not default was prevented.\n */\n\n\n Plugin.prototype.trigger = function trigger$$1(event) {\n var hash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return trigger(this.eventBusEl_, event, this.getEventHash(hash));\n };\n\n /**\n * Handles \"statechanged\" events on the plugin. No-op by default, override by\n * subclassing.\n *\n * @abstract\n * @param {Event} e\n * An event object provided by a \"statechanged\" event.\n *\n * @param {Object} e.changes\n * An object describing changes that occurred with the \"statechanged\"\n * event.\n */\n\n\n Plugin.prototype.handleStateChanged = function handleStateChanged(e) {};\n\n /**\n * Disposes a plugin.\n *\n * Subclasses can override this if they want, but for the sake of safety,\n * it's probably best to subscribe the \"dispose\" event.\n *\n * @fires Plugin#dispose\n */\n\n\n Plugin.prototype.dispose = function dispose() {\n var name = this.name,\n player = this.player;\n\n /**\n * Signals that a advanced plugin is about to be disposed.\n *\n * @event Plugin#dispose\n * @type {EventTarget~Event}\n */\n\n this.trigger('dispose');\n this.off();\n player.off('dispose', this.dispose);\n\n // Eliminate any possible sources of leaking memory by clearing up\n // references between the player and the plugin instance and nulling out\n // the plugin's state and replacing methods with a function that throws.\n player[PLUGIN_CACHE_KEY][name] = false;\n this.player = this.state = null;\n\n // Finally, replace the plugin name on the player with a new factory\n // function, so that the plugin is ready to be set up again.\n player[name] = createPluginFactory(name, pluginStorage[name]);\n };\n\n /**\n * Determines if a plugin is a basic plugin (i.e. not a sub-class of `Plugin`).\n *\n * @param {string|Function} plugin\n * If a string, matches the name of a plugin. If a function, will be\n * tested directly.\n *\n * @returns {boolean}\n * Whether or not a plugin is a basic plugin.\n */\n\n\n Plugin.isBasic = function isBasic(plugin) {\n var p = typeof plugin === 'string' ? getPlugin(plugin) : plugin;\n\n return typeof p === 'function' && !Plugin.prototype.isPrototypeOf(p.prototype);\n };\n\n /**\n * Register a Video.js plugin.\n *\n * @param {string} name\n * The name of the plugin to be registered. Must be a string and\n * must not match an existing plugin or a method on the `Player`\n * prototype.\n *\n * @param {Function} plugin\n * A sub-class of `Plugin` or a function for basic plugins.\n *\n * @returns {Function}\n * For advanced plugins, a factory function for that plugin. For\n * basic plugins, a wrapper function that initializes the plugin.\n */\n\n\n Plugin.registerPlugin = function registerPlugin(name, plugin) {\n if (typeof name !== 'string') {\n throw new Error('Illegal plugin name, \"' + name + '\", must be a string, was ' + (typeof name === 'undefined' ? 'undefined' : _typeof(name)) + '.');\n }\n\n if (pluginExists(name)) {\n log$1.warn('A plugin named \"' + name + '\" already exists. You may want to avoid re-registering plugins!');\n } else if (Player.prototype.hasOwnProperty(name)) {\n throw new Error('Illegal plugin name, \"' + name + '\", cannot share a name with an existing player method!');\n }\n\n if (typeof plugin !== 'function') {\n throw new Error('Illegal plugin for \"' + name + '\", must be a function, was ' + (typeof plugin === 'undefined' ? 'undefined' : _typeof(plugin)) + '.');\n }\n\n pluginStorage[name] = plugin;\n\n // Add a player prototype method for all sub-classed plugins (but not for\n // the base Plugin class).\n if (name !== BASE_PLUGIN_NAME) {\n if (Plugin.isBasic(plugin)) {\n Player.prototype[name] = createBasicPlugin(name, plugin);\n } else {\n Player.prototype[name] = createPluginFactory(name, plugin);\n }\n }\n\n return plugin;\n };\n\n /**\n * De-register a Video.js plugin.\n *\n * @param {string} name\n * The name of the plugin to be deregistered.\n */\n\n\n Plugin.deregisterPlugin = function deregisterPlugin(name) {\n if (name === BASE_PLUGIN_NAME) {\n throw new Error('Cannot de-register base plugin.');\n }\n if (pluginExists(name)) {\n delete pluginStorage[name];\n delete Player.prototype[name];\n }\n };\n\n /**\n * Gets an object containing multiple Video.js plugins.\n *\n * @param {Array} [names]\n * If provided, should be an array of plugin names. Defaults to _all_\n * plugin names.\n *\n * @returns {Object|undefined}\n * An object containing plugin(s) associated with their name(s) or\n * `undefined` if no matching plugins exist).\n */\n\n\n Plugin.getPlugins = function getPlugins() {\n var names = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object.keys(pluginStorage);\n\n var result = void 0;\n\n names.forEach(function (name) {\n var plugin = getPlugin(name);\n\n if (plugin) {\n result = result || {};\n result[name] = plugin;\n }\n });\n\n return result;\n };\n\n /**\n * Gets a plugin's version, if available\n *\n * @param {string} name\n * The name of a plugin.\n *\n * @returns {string}\n * The plugin's version or an empty string.\n */\n\n\n Plugin.getPluginVersion = function getPluginVersion(name) {\n var plugin = getPlugin(name);\n\n return plugin && plugin.VERSION || '';\n };\n\n return Plugin;\n}();\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @static\n * @method getPlugin\n * @memberOf Plugin\n * @param {string} name\n * The name of a plugin.\n *\n * @returns {Function|undefined}\n * The plugin (or `undefined`).\n */\n\n\nPlugin.getPlugin = getPlugin;\n\n/**\n * The name of the base plugin class as it is registered.\n *\n * @type {string}\n */\nPlugin.BASE_PLUGIN_NAME = BASE_PLUGIN_NAME;\n\nPlugin.registerPlugin(BASE_PLUGIN_NAME, Plugin);\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.usingPlugin = function (name) {\n return !!this[PLUGIN_CACHE_KEY] && this[PLUGIN_CACHE_KEY][name] === true;\n};\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.hasPlugin = function (name) {\n return !!pluginExists(name);\n};\n\n/**\n * Signals that a plugin is about to be set up on a player.\n *\n * @event Player#beforepluginsetup\n * @type {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin is about to be set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event Player#beforepluginsetup:$name\n * @type {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player.\n *\n * @event Player#pluginsetup\n * @type {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event Player#pluginsetup:$name\n * @type {Plugin~PluginEventHash}\n */\n\n/**\n * @typedef {Object} Plugin~PluginEventHash\n *\n * @property {string} instance\n * For basic plugins, the return value of the plugin function. For\n * advanced plugins, the plugin instance on which the event is fired.\n *\n * @property {string} name\n * The name of the plugin.\n *\n * @property {string} plugin\n * For basic plugins, the plugin function. For advanced plugins, the\n * plugin class/constructor.\n */\n\n/**\n * @file extend.js\n * @module extend\n */\n\n/**\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n *\n * @param {Object} subClass\n * The class to inherit to\n *\n * @param {Object} superClass\n * The class to inherit from\n *\n * @private\n */\nvar _inherits = function _inherits(subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError('Super expression must either be null or a function, not ' + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)));\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n if (superClass) {\n // node\n subClass.super_ = superClass;\n }\n};\n\n/**\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n *\n * @static\n * @const\n *\n * @param {Object} superClass\n * The class to inherit from\n *\n * @param {Object} [subClassMethods={}]\n * The class to inherit to\n *\n * @return {Object}\n * The new object with subClassMethods that inherited superClass.\n */\nvar extendFn = function extendFn(superClass) {\n var subClassMethods = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var subClass = function subClass() {\n superClass.apply(this, arguments);\n };\n\n var methods = {};\n\n if ((typeof subClassMethods === 'undefined' ? 'undefined' : _typeof(subClassMethods)) === 'object') {\n if (subClassMethods.constructor !== Object.prototype.constructor) {\n subClass = subClassMethods.constructor;\n }\n methods = subClassMethods;\n } else if (typeof subClassMethods === 'function') {\n subClass = subClassMethods;\n }\n\n _inherits(subClass, superClass);\n\n // Extend subObj's prototype with functions and other properties from props\n for (var name in methods) {\n if (methods.hasOwnProperty(name)) {\n subClass.prototype[name] = methods[name];\n }\n }\n\n return subClass;\n};\n\n/**\n * @file video.js\n * @module videojs\n */\n// Include the built-in techs\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined' && isReal()) {\n document.createElement('video');\n document.createElement('audio');\n document.createElement('track');\n document.createElement('video-js');\n}\n\n/**\n * Normalize an `id` value by trimming off a leading `#`\n *\n * @param {string} id\n * A string, maybe with a leading `#`.\n *\n * @returns {string}\n * The string, without any leading `#`.\n */\nvar normalizeId = function normalizeId(id) {\n return id.indexOf('#') === 0 ? id.slice(1) : id;\n};\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n *\n * @param {string|Element} id\n * Video element or video element ID\n *\n * @param {Object} [options]\n * Optional options object for config/settings\n *\n * @param {Component~ReadyCallback} [ready]\n * Optional ready callback\n *\n * @return {Player}\n * A player instance\n */\nfunction videojs(id, options, ready) {\n var player = videojs.getPlayer(id);\n\n if (player) {\n if (options) {\n log$1.warn('Player \"' + id + '\" is already initialised. Options will not be applied.');\n }\n if (ready) {\n player.ready(ready);\n }\n return player;\n }\n\n var el = typeof id === 'string' ? $('#' + normalizeId(id)) : id;\n\n if (!isEl(el)) {\n throw new TypeError('The element or ID supplied is not valid. (videojs)');\n }\n\n if (!document.body.contains(el)) {\n log$1.warn('The element supplied is not included in the DOM');\n }\n\n options = options || {};\n\n videojs.hooks('beforesetup').forEach(function (hookFunction) {\n var opts = hookFunction(el, mergeOptions(options));\n\n if (!isObject(opts) || Array.isArray(opts)) {\n log$1.error('please return an object in beforesetup hooks');\n return;\n }\n\n options = mergeOptions(options, opts);\n });\n\n // We get the current \"Player\" component here in case an integration has\n // replaced it with a custom player.\n var PlayerComponent = Component.getComponent('Player');\n\n player = new PlayerComponent(el, options, ready);\n\n videojs.hooks('setup').forEach(function (hookFunction) {\n return hookFunction(player);\n });\n\n return player;\n}\n\n/**\n * An Object that contains lifecycle hooks as keys which point to an array\n * of functions that are run when a lifecycle is triggered\n */\nvideojs.hooks_ = {};\n\n/**\n * Get a list of hooks for a specific lifecycle\n * @function videojs.hooks\n *\n * @param {string} type\n * the lifecyle to get hooks from\n *\n * @param {Function|Function[]} [fn]\n * Optionally add a hook (or hooks) to the lifecycle that your are getting.\n *\n * @return {Array}\n * an array of hooks, or an empty array if there are none.\n */\nvideojs.hooks = function (type, fn) {\n videojs.hooks_[type] = videojs.hooks_[type] || [];\n if (fn) {\n videojs.hooks_[type] = videojs.hooks_[type].concat(fn);\n }\n return videojs.hooks_[type];\n};\n\n/**\n * Add a function hook to a specific videojs lifecycle.\n *\n * @param {string} type\n * the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n * The function or array of functions to attach.\n */\nvideojs.hook = function (type, fn) {\n videojs.hooks(type, fn);\n};\n\n/**\n * Add a function hook that will only run once to a specific videojs lifecycle.\n *\n * @param {string} type\n * the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n * The function or array of functions to attach.\n */\nvideojs.hookOnce = function (type, fn) {\n videojs.hooks(type, [].concat(fn).map(function (original) {\n var wrapper = function wrapper() {\n videojs.removeHook(type, wrapper);\n return original.apply(undefined, arguments);\n };\n\n return wrapper;\n }));\n};\n\n/**\n * Remove a hook from a specific videojs lifecycle.\n *\n * @param {string} type\n * the lifecycle that the function hooked to\n *\n * @param {Function} fn\n * The hooked function to remove\n *\n * @return {boolean}\n * The function that was removed or undef\n */\nvideojs.removeHook = function (type, fn) {\n var index = videojs.hooks(type).indexOf(fn);\n\n if (index <= -1) {\n return false;\n }\n\n videojs.hooks_[type] = videojs.hooks_[type].slice();\n videojs.hooks_[type].splice(index, 1);\n\n return true;\n};\n\n// Add default styles\nif (window.VIDEOJS_NO_DYNAMIC_STYLE !== true && isReal()) {\n var style = $('.vjs-styles-defaults');\n\n if (!style) {\n style = createStyleElement('vjs-styles-defaults');\n var head = $('head');\n\n if (head) {\n head.insertBefore(style, head.firstChild);\n }\n setTextContent(style, '\\n .video-js {\\n width: 300px;\\n height: 150px;\\n }\\n\\n .vjs-fluid {\\n padding-top: 56.25%\\n }\\n ');\n }\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your\n// video in the DOM (weird behavior only with minified version)\nautoSetupTimeout(1, videojs);\n\n/**\n * Current software version. Follows semver.\n *\n * @type {string}\n */\nvideojs.VERSION = version;\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object}\n * The created players\n */\nvideojs.getPlayers = function () {\n return Player.players;\n};\n\n/**\n * Get a single player based on an ID or DOM element.\n *\n * This is useful if you want to check if an element or ID has an associated\n * Video.js player, but not create one if it doesn't.\n *\n * @param {string|Element} id\n * An HTML element - `<video>`, `<audio>`, or `<video-js>` -\n * or a string matching the `id` of such an element.\n *\n * @returns {Player|undefined}\n * A player instance or `undefined` if there is no player instance\n * matching the argument.\n */\nvideojs.getPlayer = function (id) {\n var players = Player.players;\n var tag = void 0;\n\n if (typeof id === 'string') {\n var nId = normalizeId(id);\n var player = players[nId];\n\n if (player) {\n return player;\n }\n\n tag = $('#' + nId);\n } else {\n tag = id;\n }\n\n if (isEl(tag)) {\n var _tag = tag,\n _player = _tag.player,\n playerId = _tag.playerId;\n\n // Element may have a `player` property referring to an already created\n // player instance. If so, return that.\n\n if (_player || players[playerId]) {\n return _player || players[playerId];\n }\n }\n};\n\n/**\n * Returns an array of all current players.\n *\n * @return {Array}\n * An array of all players. The array will be in the order that\n * `Object.keys` provides, which could potentially vary between\n * JavaScript engines.\n *\n */\nvideojs.getAllPlayers = function () {\n return (\n\n // Disposed players leave a key with a `null` value, so we need to make sure\n // we filter those out.\n Object.keys(Player.players).map(function (k) {\n return Player.players[k];\n }).filter(Boolean)\n );\n};\n\n/**\n * Expose players object.\n *\n * @memberOf videojs\n * @property {Object} players\n */\nvideojs.players = Player.players;\n\n/**\n * Get a component class object by name\n *\n * @borrows Component.getComponent as videojs.getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name. Used when adding to other\n * components, either through addChild `component.addChild('myComponent')` or through\n * default children options `{ children: ['myComponent'] }`.\n *\n * > NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {string} name\n * The class name of the component\n *\n * @param {Component} comp\n * The component class\n *\n * @return {Component}\n * The newly registered component\n */\nvideojs.registerComponent = function (name$$1, comp) {\n if (Tech.isTech(comp)) {\n log$1.warn('The ' + name$$1 + ' tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)');\n }\n\n Component.registerComponent.call(Component, name$$1, comp);\n};\n\n/**\n * Get a Tech class object by name\n *\n * @borrows Tech.getTech as videojs.getTech\n */\nvideojs.getTech = Tech.getTech;\n\n/**\n * Register a Tech so it can referred to by name.\n * This is used in the tech order for the player.\n *\n * @borrows Tech.registerTech as videojs.registerTech\n */\nvideojs.registerTech = Tech.registerTech;\n\n/**\n * Register a middleware to a source type.\n *\n * @param {String} type A string representing a MIME type.\n * @param {function(player):object} middleware A middleware factory that takes a player.\n */\nvideojs.use = use;\n\n/**\n * An object that can be returned by a middleware to signify\n * that the middleware is being terminated.\n *\n * @type {object}\n * @memberOf {videojs}\n * @property {object} middleware.TERMINATOR\n */\n// Object.defineProperty is not available in IE8\nif (!IS_IE8 && Object.defineProperty) {\n Object.defineProperty(videojs, 'middleware', {\n value: {},\n writeable: false,\n enumerable: true\n });\n\n Object.defineProperty(videojs.middleware, 'TERMINATOR', {\n value: TERMINATOR,\n writeable: false,\n enumerable: true\n });\n} else {\n videojs.middleware = { TERMINATOR: TERMINATOR };\n}\n\n/**\n * A suite of browser and device tests from {@link browser}.\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated since version 5.0\n * @type {boolean}\n */\nvideojs.TOUCH_ENABLED = TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n *\n * @borrows extend:extendFn as videojs.extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n *\n * @borrows merge-options:mergeOptions as videojs.mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n * > NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function() {}.bind(newContext);` instead of this.\n *\n * @borrows fn:bind as videojs.bind\n */\nvideojs.bind = bind;\n\n/**\n * Register a Video.js plugin.\n *\n * @borrows plugin:registerPlugin as videojs.registerPlugin\n * @method registerPlugin\n *\n * @param {string} name\n * The name of the plugin to be registered. Must be a string and\n * must not match an existing plugin or a method on the `Player`\n * prototype.\n *\n * @param {Function} plugin\n * A sub-class of `Plugin` or a function for basic plugins.\n *\n * @return {Function}\n * For advanced plugins, a factory function for that plugin. For\n * basic plugins, a wrapper function that initializes the plugin.\n */\nvideojs.registerPlugin = Plugin.registerPlugin;\n\n/**\n * Deregister a Video.js plugin.\n *\n * @borrows plugin:deregisterPlugin as videojs.deregisterPlugin\n * @method deregisterPlugin\n *\n * @param {string} name\n * The name of the plugin to be deregistered. Must be a string and\n * must match an existing plugin or a method on the `Player`\n * prototype.\n *\n */\nvideojs.deregisterPlugin = Plugin.deregisterPlugin;\n\n/**\n * Deprecated method to register a plugin with Video.js\n *\n * @deprecated\n * videojs.plugin() is deprecated; use videojs.registerPlugin() instead\n *\n * @param {string} name\n * The plugin name\n *\n * @param {Plugin|Function} plugin\n * The plugin sub-class or function\n */\nvideojs.plugin = function (name$$1, plugin) {\n log$1.warn('videojs.plugin() is deprecated; use videojs.registerPlugin() instead');\n return Plugin.registerPlugin(name$$1, plugin);\n};\n\n/**\n * Gets an object containing multiple Video.js plugins.\n *\n * @param {Array} [names]\n * If provided, should be an array of plugin names. Defaults to _all_\n * plugin names.\n *\n * @return {Object|undefined}\n * An object containing plugin(s) associated with their name(s) or\n * `undefined` if no matching plugins exist).\n */\nvideojs.getPlugins = Plugin.getPlugins;\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @param {string} name\n * The name of a plugin.\n *\n * @return {Function|undefined}\n * The plugin (or `undefined`).\n */\nvideojs.getPlugin = Plugin.getPlugin;\n\n/**\n * Gets a plugin's version, if available\n *\n * @param {string} name\n * The name of a plugin.\n *\n * @return {string}\n * The plugin's version or an empty string.\n */\nvideojs.getPluginVersion = Plugin.getPluginVersion;\n\n/**\n * Adding languages so that they're available to all players.\n * Example: `videojs.addLanguage('es', { 'Hello': 'Hola' });`\n *\n * @param {string} code\n * The language code or dictionary property\n *\n * @param {Object} data\n * The data values to be translated\n *\n * @return {Object}\n * The resulting language dictionary object\n */\nvideojs.addLanguage = function (code, data) {\n var _mergeOptions;\n\n code = ('' + code).toLowerCase();\n\n videojs.options.languages = mergeOptions(videojs.options.languages, (_mergeOptions = {}, _mergeOptions[code] = data, _mergeOptions));\n\n return videojs.options.languages[code];\n};\n\n/**\n * Log messages\n *\n * @borrows log:log as videojs.log\n */\nvideojs.log = log$1;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRange\n */\n/**\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRanges\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @borrows format-time:formatTime as videojs.formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Replaces format-time with a custom implementation, to be used in place of the default.\n *\n * @borrows format-time:setFormatTime as videojs.setFormatTime\n *\n * @method setFormatTime\n *\n * @param {Function} customFn\n * A custom format-time function which will be called with the current time and guide (in seconds) as arguments.\n * Passed fn should return a string.\n */\nvideojs.setFormatTime = setFormatTime;\n\n/**\n * Resets format-time to the default implementation.\n *\n * @borrows format-time:resetFormatTime as videojs.resetFormatTime\n *\n * @method resetFormatTime\n */\nvideojs.resetFormatTime = resetFormatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @borrows url:parseUrl as videojs.parseUrl\n *\n */\nvideojs.parseUrl = parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @borrows url:isCrossOrigin as videojs.isCrossOrigin\n */\nvideojs.isCrossOrigin = isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @borrows EventTarget as videojs.EventTarget\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @borrows events:on as videojs.on\n */\nvideojs.on = on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @borrows events:one as videojs.one\n */\nvideojs.one = one;\n\n/**\n * Removes event listeners from an element\n *\n * @borrows events:off as videojs.off\n */\nvideojs.off = off;\n\n/**\n * Trigger an event for an element\n *\n * @borrows events:trigger as videojs.trigger\n */\nvideojs.trigger = trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n * @param {Object} options\n * settings for the request.\n *\n * @return {XMLHttpRequest|XDomainRequest}\n * The request object.\n *\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @borrows TextTrack as videojs.TextTrack\n */\nvideojs.TextTrack = TextTrack;\n\n/**\n * export the AudioTrack class so that source handlers can create\n * AudioTracks and then add them to the players AudioTrackList\n *\n * @borrows AudioTrack as videojs.AudioTrack\n */\nvideojs.AudioTrack = AudioTrack;\n\n/**\n * export the VideoTrack class so that source handlers can create\n * VideoTracks and then add them to the players VideoTrackList\n *\n * @borrows VideoTrack as videojs.VideoTrack\n */\nvideojs.VideoTrack = VideoTrack;\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @borrows dom:isEl as videojs.isEl\n * @deprecated Use videojs.dom.isEl() instead\n */\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @borrows dom:isTextNode as videojs.isTextNode\n * @deprecated Use videojs.dom.isTextNode() instead\n */\n\n/**\n * Creates an element and applies properties.\n *\n * @borrows dom:createEl as videojs.createEl\n * @deprecated Use videojs.dom.createEl() instead\n */\n\n/**\n * Check if an element has a CSS class\n *\n * @borrows dom:hasElClass as videojs.hasClass\n * @deprecated Use videojs.dom.hasClass() instead\n */\n\n/**\n * Add a CSS class name to an element\n *\n * @borrows dom:addElClass as videojs.addClass\n * @deprecated Use videojs.dom.addClass() instead\n */\n\n/**\n * Remove a CSS class name from an element\n *\n * @borrows dom:removeElClass as videojs.removeClass\n * @deprecated Use videojs.dom.removeClass() instead\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @borrows dom:toggleElClass as videojs.toggleClass\n * @deprecated Use videojs.dom.toggleClass() instead\n */\n\n/**\n * Apply attributes to an HTML element.\n *\n * @borrows dom:setElAttributes as videojs.setAttribute\n * @deprecated Use videojs.dom.setAttributes() instead\n */\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @borrows dom:getElAttributes as videojs.getAttributes\n * @deprecated Use videojs.dom.getAttributes() instead\n */\n\n/**\n * Empties the contents of an element.\n *\n * @borrows dom:emptyEl as videojs.emptyEl\n * @deprecated Use videojs.dom.emptyEl() instead\n */\n\n/**\n * Normalizes and appends content to an element.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n * Normalized into a text node.\n *\n * - Element, TextNode\n * Passed through.\n *\n * - Array\n * A one-dimensional array of strings, elements, nodes, or functions (which\n * return single strings, elements, or nodes).\n *\n * - Function\n * If the sole argument, is expected to produce a string, element,\n * node, or array.\n *\n * @borrows dom:appendContents as videojs.appendContet\n * @deprecated Use videojs.dom.appendContent() instead\n */\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n * Normalized into a text node.\n *\n * - Element, TextNode\n * Passed through.\n *\n * - Array\n * A one-dimensional array of strings, elements, nodes, or functions (which\n * return single strings, elements, or nodes).\n *\n * - Function\n * If the sole argument, is expected to produce a string, element,\n * node, or array.\n *\n * @borrows dom:insertContent as videojs.insertContent\n * @deprecated Use videojs.dom.insertContent() instead\n */\n['isEl', 'isTextNode', 'createEl', 'hasClass', 'addClass', 'removeClass', 'toggleClass', 'setAttributes', 'getAttributes', 'emptyEl', 'appendContent', 'insertContent'].forEach(function (k) {\n videojs[k] = function () {\n log$1.warn('videojs.' + k + '() is deprecated; use videojs.dom.' + k + '() instead');\n return Dom[k].apply(null, arguments);\n };\n});\n\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is because in Firefox, if the player is loaded in an iframe with `display:none`,\n * then `getComputedStyle` returns `null`, so, we do a null-check to make sure\n * that the player doesn't break in these cases.\n * See https://bugzilla.mozilla.org/show_bug.cgi?id=548397 for more details.\n *\n * @borrows computed-style:computedStyle as videojs.computedStyle\n */\nvideojs.computedStyle = computedStyle;\n\n/**\n * Export the Dom utilities for use in external plugins\n * and Tech's\n */\nvideojs.dom = Dom;\n\n/**\n * Export the Url utilities for use in external plugins\n * and Tech's\n */\nvideojs.url = Url;\n\nmodule.exports = videojs;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDYuMTIuMUB2aWRlby5qcy9kaXN0L3ZpZGVvLmNqcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmlkZW8uanNANi4xMi4xQHZpZGVvLmpzL2Rpc3QvdmlkZW8uY2pzLmpzPzY3NjciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogVmlkZW8uanMgNi4xMi4xIDxodHRwOi8vdmlkZW9qcy5jb20vPlxuICogQ29weXJpZ2h0IEJyaWdodGNvdmUsIEluYy4gPGh0dHBzOi8vd3d3LmJyaWdodGNvdmUuY29tLz5cbiAqIEF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMFxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0U+XG4gKlxuICogSW5jbHVkZXMgdnR0LmpzIDxodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS92dHQuanM+XG4gKiBBdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjBcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS92dHQuanMvYmxvYi9tYXN0ZXIvTElDRU5TRT5cbiAqL1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIHdpbmRvdyA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdnbG9iYWwvd2luZG93JykpO1xudmFyIGRvY3VtZW50ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ2dsb2JhbC9kb2N1bWVudCcpKTtcbnZhciB0c21sID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3RzbWwnKSk7XG52YXIgc2FmZVBhcnNlVHVwbGUgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnc2FmZS1qc29uLXBhcnNlL3R1cGxlJykpO1xudmFyIHhociA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd4aHInKSk7XG52YXIgdnR0ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3ZpZGVvanMtdnR0LmpzJykpO1xuXG52YXIgdmVyc2lvbiA9IFwiNi4xMi4xXCI7XG5cbi8qKlxuICogQGZpbGUgYnJvd3Nlci5qc1xuICogQG1vZHVsZSBicm93c2VyXG4gKi9cbnZhciBVU0VSX0FHRU5UID0gd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbnZhciB3ZWJraXRWZXJzaW9uTWFwID0gL0FwcGxlV2ViS2l0XFwvKFtcXGQuXSspL2kuZXhlYyhVU0VSX0FHRU5UKTtcbnZhciBhcHBsZVdlYmtpdFZlcnNpb24gPSB3ZWJraXRWZXJzaW9uTWFwID8gcGFyc2VGbG9hdCh3ZWJraXRWZXJzaW9uTWFwLnBvcCgpKSA6IG51bGw7XG5cbi8qXG4gKiBEZXZpY2UgaXMgYW4gaVBob25lXG4gKlxuICogQHR5cGUge0Jvb2xlYW59XG4gKiBAY29uc3RhbnRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJU19JUEFEID0gL2lQYWQvaS50ZXN0KFVTRVJfQUdFTlQpO1xuXG4vLyBUaGUgRmFjZWJvb2sgYXBwJ3MgVUlXZWJWaWV3IGlkZW50aWZpZXMgYXMgYm90aCBhbiBpUGhvbmUgYW5kIGlQYWQsIHNvXG4vLyB0byBpZGVudGlmeSBpUGhvbmVzLCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgaVBhZHMuXG4vLyBodHRwOi8vYXJ0c3kuZ2l0aHViLmlvL2Jsb2cvMjAxMi8xMC8xOC90aGUtcGVyaWxzLW9mLWlvcy11c2VyLWFnZW50LXNuaWZmaW5nL1xudmFyIElTX0lQSE9ORSA9IC9pUGhvbmUvaS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19JUEFEO1xudmFyIElTX0lQT0QgPSAvaVBvZC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSVNfSU9TID0gSVNfSVBIT05FIHx8IElTX0lQQUQgfHwgSVNfSVBPRDtcblxudmFyIElPU19WRVJTSU9OID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWF0Y2ggPSBVU0VSX0FHRU5ULm1hdGNoKC9PUyAoXFxkKylfL2kpO1xuXG4gIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0oKTtcblxudmFyIElTX0FORFJPSUQgPSAvQW5kcm9pZC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgQU5EUk9JRF9WRVJTSU9OID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaGlzIG1hdGNoZXMgQW5kcm9pZCBNYWpvci5NaW5vci5QYXRjaCB2ZXJzaW9uc1xuICAvLyBBTkRST0lEX1ZFUlNJT04gaXMgTWFqb3IuTWlub3IgYXMgYSBOdW1iZXIsIGlmIE1pbm9yIGlzbid0IGF2YWlsYWJsZSwgdGhlbiBvbmx5IE1ham9yIGlzIHJldHVybmVkXG4gIHZhciBtYXRjaCA9IFVTRVJfQUdFTlQubWF0Y2goL0FuZHJvaWQgKFxcZCspKD86XFwuKFxcZCspKT8oPzpcXC4oXFxkKykpKi9pKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWFqb3IgPSBtYXRjaFsxXSAmJiBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIG1pbm9yID0gbWF0Y2hbMl0gJiYgcGFyc2VGbG9hdChtYXRjaFsyXSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbm9yKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0gKyAnLicgKyBtYXRjaFsyXSk7XG4gIH0gZWxzZSBpZiAobWFqb3IpIHtcbiAgICByZXR1cm4gbWFqb3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KCk7XG5cbi8vIE9sZCBBbmRyb2lkIGlzIGRlZmluZWQgYXMgVmVyc2lvbiBvbGRlciB0aGFuIDIuMywgYW5kIHJlcXVpcmluZyBhIHdlYmtpdCB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIGJyb3dzZXJcbnZhciBJU19PTERfQU5EUk9JRCA9IElTX0FORFJPSUQgJiYgL3dlYmtpdC9pLnRlc3QoVVNFUl9BR0VOVCkgJiYgQU5EUk9JRF9WRVJTSU9OIDwgMi4zO1xudmFyIElTX05BVElWRV9BTkRST0lEID0gSVNfQU5EUk9JRCAmJiBBTkRST0lEX1ZFUlNJT04gPCA1ICYmIGFwcGxlV2Via2l0VmVyc2lvbiA8IDUzNztcblxudmFyIElTX0ZJUkVGT1ggPSAvRmlyZWZveC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSVNfRURHRSA9IC9FZGdlL2kudGVzdChVU0VSX0FHRU5UKTtcbnZhciBJU19DSFJPTUUgPSAhSVNfRURHRSAmJiAoL0Nocm9tZS9pLnRlc3QoVVNFUl9BR0VOVCkgfHwgL0NyaU9TL2kudGVzdChVU0VSX0FHRU5UKSk7XG52YXIgQ0hST01FX1ZFUlNJT04gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBtYXRjaCA9IFVTRVJfQUdFTlQubWF0Y2goLyhDaHJvbWV8Q3JpT1MpXFwvKFxcZCspLyk7XG5cbiAgaWYgKG1hdGNoICYmIG1hdGNoWzJdKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMl0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufSgpO1xudmFyIElTX0lFOCA9IC9NU0lFXFxzOFxcLjAvLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSUVfVkVSU0lPTiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlc3VsdCA9IC9NU0lFXFxzKFxcZCspXFwuXFxkLy5leGVjKFVTRVJfQUdFTlQpO1xuICB2YXIgdmVyc2lvbiA9IHJlc3VsdCAmJiBwYXJzZUZsb2F0KHJlc3VsdFsxXSk7XG5cbiAgaWYgKCF2ZXJzaW9uICYmIC9UcmlkZW50XFwvNy4wL2kudGVzdChVU0VSX0FHRU5UKSAmJiAvcnY6MTEuMC8udGVzdChVU0VSX0FHRU5UKSkge1xuICAgIC8vIElFIDExIGhhcyBhIGRpZmZlcmVudCB1c2VyIGFnZW50IHN0cmluZyB0aGFuIG90aGVyIElFIHZlcnNpb25zXG4gICAgdmVyc2lvbiA9IDExLjA7XG4gIH1cblxuICByZXR1cm4gdmVyc2lvbjtcbn0oKTtcblxudmFyIElTX1NBRkFSSSA9IC9TYWZhcmkvaS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19DSFJPTUUgJiYgIUlTX0FORFJPSUQgJiYgIUlTX0VER0U7XG52YXIgSVNfQU5ZX1NBRkFSSSA9IChJU19TQUZBUkkgfHwgSVNfSU9TKSAmJiAhSVNfQ0hST01FO1xuXG52YXIgVE9VQ0hfRU5BQkxFRCA9IGlzUmVhbCgpICYmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiB3aW5kb3cuZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCk7XG5cbnZhciBCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEID0gaXNSZWFsKCkgJiYgJ2JhY2tncm91bmRTaXplJyBpbiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKS5zdHlsZTtcblxudmFyIGJyb3dzZXIgPSAoT2JqZWN0LmZyZWV6ZSB8fCBPYmplY3QpKHtcblx0SVNfSVBBRDogSVNfSVBBRCxcblx0SVNfSVBIT05FOiBJU19JUEhPTkUsXG5cdElTX0lQT0Q6IElTX0lQT0QsXG5cdElTX0lPUzogSVNfSU9TLFxuXHRJT1NfVkVSU0lPTjogSU9TX1ZFUlNJT04sXG5cdElTX0FORFJPSUQ6IElTX0FORFJPSUQsXG5cdEFORFJPSURfVkVSU0lPTjogQU5EUk9JRF9WRVJTSU9OLFxuXHRJU19PTERfQU5EUk9JRDogSVNfT0xEX0FORFJPSUQsXG5cdElTX05BVElWRV9BTkRST0lEOiBJU19OQVRJVkVfQU5EUk9JRCxcblx0SVNfRklSRUZPWDogSVNfRklSRUZPWCxcblx0SVNfRURHRTogSVNfRURHRSxcblx0SVNfQ0hST01FOiBJU19DSFJPTUUsXG5cdENIUk9NRV9WRVJTSU9OOiBDSFJPTUVfVkVSU0lPTixcblx0SVNfSUU4OiBJU19JRTgsXG5cdElFX1ZFUlNJT046IElFX1ZFUlNJT04sXG5cdElTX1NBRkFSSTogSVNfU0FGQVJJLFxuXHRJU19BTllfU0FGQVJJOiBJU19BTllfU0FGQVJJLFxuXHRUT1VDSF9FTkFCTEVEOiBUT1VDSF9FTkFCTEVELFxuXHRCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEOiBCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UgPSBmdW5jdGlvbiAoc3RyaW5ncywgcmF3KSB7XG4gIHN0cmluZ3MucmF3ID0gcmF3O1xuICByZXR1cm4gc3RyaW5ncztcbn07XG5cbi8qKlxuICogQGZpbGUgb2JqLmpzXG4gKiBAbW9kdWxlIG9ialxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9iajpFYWNoQ2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogICAgICAgIFRoZSBjdXJyZW50IGtleSBmb3IgdGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogICAgICAgIFRoZSBjdXJyZW50IGtleS12YWx1ZSBmb3Igb2JqZWN0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9iajpSZWR1Y2VDYWxsYmFja1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGFjY3VtXG4gKiAgICAgICAgVGhlIHZhbHVlIHRoYXQgaXMgYWNjdW11bGF0aW5nIG92ZXIgdGhlIHJlZHVjZSBsb29wLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiAgICAgICAgVGhlIGN1cnJlbnQga2V5IGZvciB0aGUgb2JqZWN0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiAgICAgICAgVGhlIGN1cnJlbnQga2V5LXZhbHVlIGZvciBvYmplY3QgdGhhdCBpcyBiZWluZyBpdGVyYXRlZCBvdmVyXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIFRoZSBuZXcgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogR2V0IHRoZSBrZXlzIG9mIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogICAgICAgIFRoZSBPYmplY3QgdG8gZ2V0IHRoZSBrZXlzIGZyb21cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqICAgICAgICAgQW4gYXJyYXkgb2YgdGhlIGtleXMgZnJvbSB0aGUgb2JqZWN0LiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZVxuICogICAgICAgICBvYmplY3QgcGFzc2VkIGluIHdhcyBpbnZhbGlkIG9yIGhhZCBubyBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBrZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9iamVjdCkgPyBPYmplY3Qua2V5cyhvYmplY3QpIDogW107XG59O1xuXG4vKipcbiAqIEFycmF5LWxpa2UgaXRlcmF0aW9uIGZvciBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqICAgICAgICBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3ZlclxuICpcbiAqIEBwYXJhbSB7b2JqOkVhY2hDYWxsYmFja30gZm5cbiAqICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGZvciBlYWNoIGtleSBpbiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBlYWNoKG9iamVjdCwgZm4pIHtcbiAga2V5cyhvYmplY3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBmbihvYmplY3Rba2V5XSwga2V5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXJyYXktbGlrZSByZWR1Y2UgZm9yIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogICAgICAgIFRoZSBPYmplY3QgdGhhdCB5b3Ugd2FudCB0byByZWR1Y2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICAgQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgZm9yIGVhY2gga2V5IGluIHRoZSBvYmplY3QuIEl0XG4gKiAgICAgICAgIHJlY2VpdmVzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBhbmQgdGhlIHBlci1pdGVyYXRpb24gdmFsdWUgYW5kIGtleVxuICogICAgICAgICBhcyBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gW2luaXRpYWwgPSAwXVxuICogICAgICAgIFN0YXJ0aW5nIHZhbHVlXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIFRoZSBmaW5hbCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlKG9iamVjdCwgZm4pIHtcbiAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgcmV0dXJuIGtleXMob2JqZWN0KS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtLCBrZXkpIHtcbiAgICByZXR1cm4gZm4oYWNjdW0sIG9iamVjdFtrZXldLCBrZXkpO1xuICB9LCBpbml0aWFsKTtcbn1cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLXN0eWxlIG9iamVjdCBzaGFsbG93IG1lcmdlL2V4dGVuZC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtICB7T2JqZWN0fSAuLi5zb3VyY2VzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNvdXJjZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KE9iamVjdCwgW3RhcmdldF0uY29uY2F0KHNvdXJjZXMpKTtcbiAgfVxuXG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlYWNoKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgYW4gb2JqZWN0IG9mIGFueSBraW5kIC0gaW5jbHVkaW5nIERPTSBub2RlcyxcbiAqIGFycmF5cywgcmVndWxhciBleHByZXNzaW9ucywgZXRjLiBOb3QgZnVuY3Rpb25zLCB0aG91Z2guXG4gKlxuICogVGhpcyBhdm9pZHMgdGhlIGdvdGNoYSB3aGVyZSB1c2luZyBgdHlwZW9mYCBvbiBhIGBudWxsYCB2YWx1ZVxuICogcmVzdWx0cyBpbiBgJ29iamVjdCdgLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHZhbHVlKSkgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgYXBwZWFycyB0byBiZSBhIFwicGxhaW5cIiBvYmplY3QgLSB0aGF0IGlzLCBhXG4gKiBkaXJlY3QgaW5zdGFuY2Ugb2YgYE9iamVjdGAuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufVxuXG4vKipcbiAqIEBmaWxlIGxvZy5qc1xuICogQG1vZHVsZSBsb2dcbiAqL1xudmFyIGxvZyA9IHZvaWQgMDtcblxuLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgbG9nZ2luZyBsZXZlbC5cbnZhciBsZXZlbCA9ICdpbmZvJztcblxuLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgdGhlIGxvZ2dpbmcgaGlzdG9yeS5cbnZhciBoaXN0b3J5ID0gW107XG5cbi8qKlxuICogTG9nIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIGFuZCBoaXN0b3J5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjb25zb2xlIG1ldGhvZCB0byB1c2UuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGFyZ3NcbiAqICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIG1hdGNoaW5nIGNvbnNvbGUgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSAge2Jvb2xlYW59IFtzdHJpbmdpZnldXG4gKiAgICAgICAgIEJ5IGRlZmF1bHQsIG9ubHkgb2xkIElFcyBzaG91bGQgZ2V0IGNvbnNvbGUgYXJndW1lbnQgc3RyaW5naWZpY2F0aW9uLFxuICogICAgICAgICBidXQgdGhpcyBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGZhY2lsaXRhdGUgdGVzdGluZy5cbiAqL1xudmFyIGxvZ0J5VHlwZSA9IGZ1bmN0aW9uIGxvZ0J5VHlwZSh0eXBlLCBhcmdzKSB7XG4gIHZhciBzdHJpbmdpZnkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICEhSUVfVkVSU0lPTiAmJiBJRV9WRVJTSU9OIDwgMTE7XG5cbiAgdmFyIGx2bCA9IGxvZy5sZXZlbHNbbGV2ZWxdO1xuICB2YXIgbHZsUmVnRXhwID0gbmV3IFJlZ0V4cCgnXignICsgbHZsICsgJykkJyk7XG5cbiAgaWYgKHR5cGUgIT09ICdsb2cnKSB7XG5cbiAgICAvLyBBZGQgdGhlIHR5cGUgdG8gdGhlIGZyb250IG9mIHRoZSBtZXNzYWdlIHdoZW4gaXQncyBub3QgXCJsb2dcIi5cbiAgICBhcmdzLnVuc2hpZnQodHlwZS50b1VwcGVyQ2FzZSgpICsgJzonKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGNsb25lIG9mIHRoZSBhcmdzIGF0IHRoaXMgcG9pbnQgdG8gaGlzdG9yeS5cbiAgaWYgKGhpc3RvcnkpIHtcbiAgICBoaXN0b3J5LnB1c2goW10uY29uY2F0KGFyZ3MpKTtcbiAgfVxuXG4gIC8vIEFkZCBjb25zb2xlIHByZWZpeCBhZnRlciBhZGRpbmcgdG8gaGlzdG9yeS5cbiAgYXJncy51bnNoaWZ0KCdWSURFT0pTOicpO1xuXG4gIC8vIElmIHRoZXJlJ3Mgbm8gY29uc29sZSB0aGVuIGRvbid0IHRyeSB0byBvdXRwdXQgbWVzc2FnZXMsIGJ1dCB0aGV5IHdpbGxcbiAgLy8gc3RpbGwgYmUgc3RvcmVkIGluIGhpc3RvcnkuXG4gIGlmICghd2luZG93LmNvbnNvbGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXYXMgc2V0dGluZyB0aGVzZSBvbmNlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbiwgYnV0IGNvbnRhaW5pbmcgdGhlbVxuICAvLyBpbiB0aGUgZnVuY3Rpb24gbWFrZXMgaXQgZWFzaWVyIHRvIHRlc3QgY2FzZXMgd2hlcmUgY29uc29sZSBkb2Vzbid0IGV4aXN0XG4gIC8vIHdoZW4gdGhlIG1vZHVsZSBpcyBleGVjdXRlZC5cbiAgdmFyIGZuID0gd2luZG93LmNvbnNvbGVbdHlwZV07XG5cbiAgaWYgKCFmbiAmJiB0eXBlID09PSAnZGVidWcnKSB7XG4gICAgLy8gQ2VydGFpbiBicm93c2VycyBkb24ndCBoYXZlIHN1cHBvcnQgZm9yIGNvbnNvbGUuZGVidWcuIEZvciB0aG9zZSwgd2VcbiAgICAvLyBzaG91bGQgZGVmYXVsdCB0byB0aGUgY2xvc2VzdCBjb21wYXJhYmxlIGxvZy5cbiAgICBmbiA9IHdpbmRvdy5jb25zb2xlLmluZm8gfHwgd2luZG93LmNvbnNvbGUubG9nO1xuICB9XG5cbiAgLy8gQmFpbCBvdXQgaWYgdGhlcmUncyBubyBjb25zb2xlIG9yIGlmIHRoaXMgdHlwZSBpcyBub3QgYWxsb3dlZCBieSB0aGVcbiAgLy8gY3VycmVudCBsb2dnaW5nIGxldmVsLlxuICBpZiAoIWZuIHx8ICFsdmwgfHwgIWx2bFJlZ0V4cC50ZXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSUVzIHByZXZpb3VzIHRvIDExIGxvZyBvYmplY3RzIHVzZWxlc3NseSBhcyBcIltvYmplY3QgT2JqZWN0XVwiOyBzbywgSlNPTmlmeVxuICAvLyBvYmplY3RzIGFuZCBhcnJheXMgZm9yIHRob3NlIGxlc3MtY2FwYWJsZSBicm93c2Vycy5cbiAgaWYgKHN0cmluZ2lmeSkge1xuICAgIGFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGEpIHx8IEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhc3QgdG8gc3RyaW5nIGJlZm9yZSBqb2luaW5nLCBzbyB3ZSBnZXQgbnVsbCBhbmQgdW5kZWZpbmVkIGV4cGxpY2l0bHlcbiAgICAgIC8vIGluY2x1ZGVkIGluIG91dHB1dCAoYXMgd2Ugd291bGQgaW4gYSBtb2Rlcm4gY29uc29sZSkuXG4gICAgICByZXR1cm4gU3RyaW5nKGEpO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vIE9sZCBJRSB2ZXJzaW9ucyBkbyBub3QgYWxsb3cgLmFwcGx5KCkgZm9yIGNvbnNvbGUgbWV0aG9kcyAodGhleSBhcmVcbiAgLy8gcmVwb3J0ZWQgYXMgb2JqZWN0cyByYXRoZXIgdGhhbiBmdW5jdGlvbnMpLlxuICBpZiAoIWZuLmFwcGx5KSB7XG4gICAgZm4oYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgZm5bQXJyYXkuaXNBcnJheShhcmdzKSA/ICdhcHBseScgOiAnY2FsbCddKHdpbmRvdy5jb25zb2xlLCBhcmdzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBMb2dzIHBsYWluIGRlYnVnIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0gICAge01peGVkW119IGFyZ3NcbiAqICAgICAgICAgICBPbmUgb3IgbW9yZSBtZXNzYWdlcyBvciBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZC5cbiAqL1xubG9nID0gZnVuY3Rpb24gbG9nKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBsb2dCeVR5cGUoJ2xvZycsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBhdmFpbGFibGUgbG9nZ2luZyBsZXZlbHMsIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgbGV2ZWwgbmFtZXNcbiAqIGFuZCB0aGUgdmFsdWVzIGFyZSBgfGAtc2VwYXJhdGVkIHN0cmluZ3MgY29udGFpbmluZyBsb2dnaW5nIG1ldGhvZHMgYWxsb3dlZFxuICogaW4gdGhhdCBsb2dnaW5nIGxldmVsLiBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuICogbWF0Y2hpbmcgdGhlIGZ1bmN0aW9uIG5hbWUgYmVpbmcgY2FsbGVkLlxuICpcbiAqIExldmVscyBwcm92aWRlZCBieSB2aWRlby5qcyBhcmU6XG4gKlxuICogLSBgb2ZmYDogTWF0Y2hlcyBubyBjYWxscy4gQW55IHZhbHVlIHRoYXQgY2FuIGJlIGNhc3QgdG8gYGZhbHNlYCB3aWxsIGhhdmVcbiAqICAgdGhpcyBlZmZlY3QuIFRoZSBtb3N0IHJlc3RyaWN0aXZlLlxuICogLSBgYWxsYDogTWF0Y2hlcyBvbmx5IFZpZGVvLmpzLXByb3ZpZGVkIGZ1bmN0aW9ucyAoYGRlYnVnYCwgYGxvZ2AsXG4gKiAgIGBsb2cud2FybmAsIGFuZCBgbG9nLmVycm9yYCkuXG4gKiAtIGBkZWJ1Z2A6IE1hdGNoZXMgYGxvZy5kZWJ1Z2AsIGBsb2dgLCBgbG9nLndhcm5gLCBhbmQgYGxvZy5lcnJvcmAgY2FsbHMuXG4gKiAtIGBpbmZvYCAoZGVmYXVsdCk6IE1hdGNoZXMgYGxvZ2AsIGBsb2cud2FybmAsIGFuZCBgbG9nLmVycm9yYCBjYWxscy5cbiAqIC0gYHdhcm5gOiBNYXRjaGVzIGBsb2cud2FybmAgYW5kIGBsb2cuZXJyb3JgIGNhbGxzLlxuICogLSBgZXJyb3JgOiBNYXRjaGVzIG9ubHkgYGxvZy5lcnJvcmAgY2FsbHMuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xubG9nLmxldmVscyA9IHtcbiAgYWxsOiAnZGVidWd8bG9nfHdhcm58ZXJyb3InLFxuICBvZmY6ICcnLFxuICBkZWJ1ZzogJ2RlYnVnfGxvZ3x3YXJufGVycm9yJyxcbiAgaW5mbzogJ2xvZ3x3YXJufGVycm9yJyxcbiAgd2FybjogJ3dhcm58ZXJyb3InLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgREVGQVVMVDogbGV2ZWxcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCB0aGUgY3VycmVudCBsb2dnaW5nIGxldmVsLiBJZiBhIHN0cmluZyBtYXRjaGluZyBhIGtleSBmcm9tXG4gKiB7QGxpbmsgbG9nLmxldmVsc30gaXMgcHJvdmlkZWQsIGFjdHMgYXMgYSBzZXR0ZXIuIFJlZ2FyZGxlc3Mgb2YgYXJndW1lbnQsXG4gKiByZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dpbmcgbGV2ZWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBbbHZsXVxuICogICAgICAgICBQYXNzIHRvIHNldCBhIG5ldyBsb2dnaW5nIGxldmVsLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgbG9nZ2luZyBsZXZlbC5cbiAqL1xubG9nLmxldmVsID0gZnVuY3Rpb24gKGx2bCkge1xuICBpZiAodHlwZW9mIGx2bCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWxvZy5sZXZlbHMuaGFzT3duUHJvcGVydHkobHZsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBsdmwgKyAnXCIgaW4gbm90IGEgdmFsaWQgbG9nIGxldmVsJyk7XG4gICAgfVxuICAgIGxldmVsID0gbHZsO1xuICB9XG4gIHJldHVybiBsZXZlbDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGV2ZXJ5dGhpbmcgdGhhdCBoYXMgYmVlbiBsb2dnZWQgdG8gdGhlIGhpc3RvcnkuXG4gKlxuICogVGhpcyBhcnJheSBpcyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGludGVybmFsIGhpc3RvcnkgcmVjb3JkLiBIb3dldmVyLCBpdHNcbiAqIGNvbnRlbnRzIGFyZSBfbm90XyBjbG9uZWQ7IHNvLCBtdXRhdGluZyBvYmplY3RzIGluc2lkZSB0aGlzIGFycmF5IHdpbGxcbiAqIG11dGF0ZSB0aGVtIGluIGhpc3RvcnkuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmxvZy5oaXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaGlzdG9yeSA/IFtdLmNvbmNhdChoaXN0b3J5KSA6IFtdO1xufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIGludGVybmFsIGhpc3RvcnkgdHJhY2tpbmcsIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IGZ1cnRoZXIgaGlzdG9yeVxuICogdHJhY2tpbmcuXG4gKi9cbmxvZy5oaXN0b3J5LmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoaGlzdG9yeSkge1xuICAgIGhpc3RvcnkubGVuZ3RoID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBEaXNhYmxlIGhpc3RvcnkgdHJhY2tpbmcgaWYgaXQgaXMgY3VycmVudGx5IGVuYWJsZWQuXG4gKi9cbmxvZy5oaXN0b3J5LmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChoaXN0b3J5ICE9PSBudWxsKSB7XG4gICAgaGlzdG9yeS5sZW5ndGggPSAwO1xuICAgIGhpc3RvcnkgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSBoaXN0b3J5IHRyYWNraW5nIGlmIGl0IGlzIGN1cnJlbnRseSBkaXNhYmxlZC5cbiAqL1xubG9nLmhpc3RvcnkuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoaGlzdG9yeSA9PT0gbnVsbCkge1xuICAgIGhpc3RvcnkgPSBbXTtcbiAgfVxufTtcblxuLyoqXG4gKiBMb2dzIGVycm9yIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmVycm9yYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkW119IGFyZ3NcbiAqICAgICAgICBPbmUgb3IgbW9yZSBtZXNzYWdlcyBvciBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCBhcyBhbiBlcnJvclxuICovXG5sb2cuZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnZXJyb3InLCBhcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyB3YXJuaW5nIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLndhcm5gLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJnc1xuICogICAgICAgIE9uZSBvciBtb3JlIG1lc3NhZ2VzIG9yIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIGFzIGEgd2FybmluZy5cbiAqL1xubG9nLndhcm4gPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnd2FybicsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGRlYnVnIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmRlYnVnYCwgYnV0IG1heSBhbHNvIGFjdCBhcyBhIGNvbXBhcmFibGVcbiAqIGxvZyBpZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZVxuICpcbiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJnc1xuICogICAgICAgIE9uZSBvciBtb3JlIG1lc3NhZ2VzIG9yIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIGFzIGRlYnVnLlxuICovXG5sb2cuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnZGVidWcnLCBhcmdzKTtcbn07XG5cbnZhciBsb2ckMSA9IGxvZztcblxuLyoqXG4gKiBAZmlsZSBjb21wdXRlZC1zdHlsZS5qc1xuICogQG1vZHVsZSBjb21wdXRlZC1zdHlsZVxuICovXG4vKipcbiAqIEEgc2FmZSBnZXRDb21wdXRlZFN0eWxlIHdpdGggYW4gSUU4IGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gRmlyZWZveCwgaWYgdGhlIHBsYXllciBpcyBsb2FkZWQgaW4gYW4gaWZyYW1lIHdpdGhcbiAqIGBkaXNwbGF5Om5vbmVgLCB0aGVuIGBnZXRDb21wdXRlZFN0eWxlYCByZXR1cm5zIGBudWxsYCwgc28sIHdlIGRvIGEgbnVsbC1jaGVjayB0b1xuICogbWFrZSBzdXJlICB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBicmVhayBpbiB0aGVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgeW91IHdhbnQgdGhlIGNvbXB1dGVkIHN0eWxlIG9mXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqICAgICAgICBUaGUgcHJvcGVydHkgbmFtZSB5b3Ugd2FudFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVkU3R5bGUoZWwsIHByb3ApIHtcbiAgaWYgKCFlbCB8fCAhcHJvcCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cbiAgICByZXR1cm4gY3MgPyBjc1twcm9wXSA6ICcnO1xuICB9XG5cbiAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZVtwcm9wXSB8fCAnJztcbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnU2V0dGluZyBhdHRyaWJ1dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgY3JlYXRlRWwoKVxcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXFxuICAgICAgICAgICAgICAgIGNyZWF0ZUVsKHR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpLiBBdHRlbXB0aW5nIHRvIHNldCAnLCAnIHRvICcsICcuJ10sIFsnU2V0dGluZyBhdHRyaWJ1dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgY3JlYXRlRWwoKVxcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXFxuICAgICAgICAgICAgICAgIGNyZWF0ZUVsKHR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpLiBBdHRlbXB0aW5nIHRvIHNldCAnLCAnIHRvICcsICcuJ10pO1xuXG4vKipcbiAqIEBmaWxlIGRvbS5qc1xuICogQG1vZHVsZSBkb21cbiAqL1xuLyoqXG4gKiBEZXRlY3QgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB3aXRoIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqICAgICAgICBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgbm9uLWJsYW5rXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICovXG5mdW5jdGlvbiBpc05vbkJsYW5rU3RyaW5nKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgL1xcUy8udGVzdChzdHIpO1xufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc2VkIHN0cmluZyBoYXMgd2hpdGVzcGFjZS4gVGhpcyBpcyB1c2VkIGJ5XG4gKiBjbGFzcyBtZXRob2RzIHRvIGJlIHJlbGF0aXZlbHkgY29uc2lzdGVudCB3aXRoIHRoZSBjbGFzc0xpc3QgQVBJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqICAgICAgICAgVGhlIHN0cmluZyB0byBjaGVjayBmb3Igd2hpdGVzcGFjZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqICAgICAgICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIHdoaXRlc3BhY2UgaW4gdGhlIHN0cmluZy5cbiAqXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZXaGl0ZXNwYWNlKHN0cikge1xuICBpZiAoL1xccy8udGVzdChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBoYXMgaWxsZWdhbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2R1Y2UgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGEgY2xhc3NOYW1lIHdpdGhpbiBhbiBlbGVtZW50cyBjbGFzc05hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICogICAgICAgICBUaGUgY2xhc3NOYW1lIHRvIGdlbmVyYXRlIHRoZSBSZWdFeHAgZm9yLlxuICpcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqICAgICAgICAgVGhlIFJlZ0V4cCB0aGF0IHdpbGwgY2hlY2sgZm9yIGEgc3BlY2lmaWMgYGNsYXNzTmFtZWAgaW4gYW4gZWxlbWVudHNcbiAqICAgICAgICAgY2xhc3NOYW1lLlxuICovXG5mdW5jdGlvbiBjbGFzc1JlZ0V4cChjbGFzc05hbWUpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJyhefFxcXFxzKScgKyBjbGFzc05hbWUgKyAnKCR8XFxcXHMpJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBET00gaW50ZXJmYWNlIGFwcGVhcnMgdG8gYmUgcmVhbC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1JlYWwoKSB7XG4gIHJldHVybiAoXG5cbiAgICAvLyBCb3RoIGRvY3VtZW50IGFuZCB3aW5kb3cgd2lsbCBuZXZlciBiZSB1bmRlZmluZWQgdGhhbmtzIHRvIGBnbG9iYWxgLlxuICAgIGRvY3VtZW50ID09PSB3aW5kb3cuZG9jdW1lbnQgJiZcblxuICAgIC8vIEluIElFIDwgOSwgRE9NIG1ldGhvZHMgcmV0dXJuIFwib2JqZWN0XCIgYXMgdGhlaXIgdHlwZSwgc28gYWxsIHdlIGNhblxuICAgIC8vIGNvbmZpZGVudGx5IGNoZWNrIGlzIHRoYXQgaXQgZXhpc3RzLlxuICAgIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIERldGVybWluZXMsIHZpYSBkdWNrIHR5cGluZywgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyBhIERPTSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiAgICAgICAgVGhlIHRoaW5nIHRvIGNoZWNrXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgRE9NIGVsZW1lbnRcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaXNFbCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgRE9NIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICpcbiAqL1xuZnVuY3Rpb24gaXNJbkZyYW1lKCkge1xuXG4gIC8vIFdlIG5lZWQgYSB0cnkvY2F0Y2ggaGVyZSBiZWNhdXNlIFNhZmFyaSB3aWxsIHRocm93IGVycm9ycyB3aGVuIGF0dGVtcHRpbmdcbiAgLy8gdG8gZ2V0IGVpdGhlciBgcGFyZW50YCBvciBgc2VsZmBcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LnBhcmVudCAhPT0gd2luZG93LnNlbGY7XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgZnVuY3Rpb25zIHRvIHF1ZXJ5IHRoZSBET00gdXNpbmcgYSBnaXZlbiBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICogICAgICAgICBUaGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcXVlcnkgd2l0aC5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgVGhlIHF1ZXJ5IG1ldGhvZFxuICovXG5mdW5jdGlvbiBjcmVhdGVRdWVyaWVyKG1ldGhvZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc05vbkJsYW5rU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50W21ldGhvZF0obnVsbCk7XG4gICAgfVxuICAgIGlmIChpc05vbkJsYW5rU3RyaW5nKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICB2YXIgY3R4ID0gaXNFbChjb250ZXh0KSA/IGNvbnRleHQgOiBkb2N1bWVudDtcblxuICAgIHJldHVybiBjdHhbbWV0aG9kXSAmJiBjdHhbbWV0aG9kXShzZWxlY3Rvcik7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbGVtZW50IGFuZCBhcHBsaWVzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWdOYW1lPSdkaXYnXVxuICogICAgICAgICBOYW1lIG9mIHRhZyB0byBiZSBjcmVhdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV1cbiAqICAgICAgICAgRWxlbWVudCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzPXt9XVxuICogICAgICAgICBFbGVtZW50IGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fFRleHROb2RlfEFycmF5fEZ1bmN0aW9ufSBbY29udGVudF1cbiAqICAgICAgICAgQ29udGVudHMgZm9yIHRoZSBlbGVtZW50IChzZWU6IHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH0pXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gIHZhciB0YWdOYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnZGl2JztcbiAgdmFyIHByb3BlcnRpZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHZhciBjb250ZW50ID0gYXJndW1lbnRzWzNdO1xuXG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICB2YXIgdmFsID0gcHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAvLyBTZWUgIzIxNzZcbiAgICAvLyBXZSBvcmlnaW5hbGx5IHdlcmUgYWNjZXB0aW5nIGJvdGggcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcyBpbiB0aGVcbiAgICAvLyBzYW1lIG9iamVjdCwgYnV0IHRoYXQgZG9lc24ndCB3b3JrIHNvIHdlbGwuXG4gICAgaWYgKHByb3BOYW1lLmluZGV4T2YoJ2FyaWEtJykgIT09IC0xIHx8IHByb3BOYW1lID09PSAncm9sZScgfHwgcHJvcE5hbWUgPT09ICd0eXBlJykge1xuICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCwgcHJvcE5hbWUsIHZhbCkpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKHByb3BOYW1lLCB2YWwpO1xuXG4gICAgICAvLyBIYW5kbGUgdGV4dENvbnRlbnQgc2luY2UgaXQncyBub3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUgYW5kIHdlIGhhdmUgYVxuICAgICAgLy8gbWV0aG9kIGZvciBpdC5cbiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0ZXh0Q29udGVudChlbCwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxbcHJvcE5hbWVdID0gdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJpYnV0ZXNbYXR0ck5hbWVdKTtcbiAgfSk7XG5cbiAgaWYgKGNvbnRlbnQpIHtcbiAgICBhcHBlbmRDb250ZW50KGVsLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBJbmplY3RzIHRleHQgaW50byBhbiBlbGVtZW50LCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGNvbnRlbnRzIGVudGlyZWx5LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byBhZGQgdGV4dCBjb250ZW50IGludG9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogICAgICAgIFRoZSB0ZXh0IGNvbnRlbnQgdG8gYWRkLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKiAgICAgICAgIFRoZSBlbGVtZW50IHdpdGggYWRkZWQgdGV4dCBjb250ZW50LlxuICovXG5mdW5jdGlvbiB0ZXh0Q29udGVudChlbCwgdGV4dCkge1xuICBpZiAodHlwZW9mIGVsLnRleHRDb250ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIGVsLmlubmVyVGV4dCA9IHRleHQ7XG4gIH0gZWxzZSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBJbnNlcnQgYW4gZWxlbWVudCBhcyB0aGUgZmlyc3QgY2hpbGQgbm9kZSBvZiBhbm90aGVyXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBjaGlsZFxuICogICAgICAgIEVsZW1lbnQgdG8gaW5zZXJ0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBwYXJlbnRcbiAqICAgICAgICBFbGVtZW50IHRvIGluc2VydCBjaGlsZCBpbnRvXG4gKi9cbmZ1bmN0aW9uIHByZXBlbmRUbyhjaGlsZCwgcGFyZW50KSB7XG4gIGlmIChwYXJlbnQuZmlyc3RDaGlsZCkge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHBhcmVudC5maXJzdENoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgICAgICBFbGVtZW50IHRvIGNoZWNrXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVG9DaGVja1xuICogICAgICAgIENsYXNzIG5hbWUgdG8gY2hlY2sgZm9yXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHRoZSBlbGVtZW50IGhhZCB0aGUgY2xhc3NcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9XG4gKiAgICAgICAgIFRocm93cyBhbiBlcnJvciBpZiBgY2xhc3NUb0NoZWNrYCBoYXMgd2hpdGUgc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzVG9DaGVjaykge1xuICB0aHJvd0lmV2hpdGVzcGFjZShjbGFzc1RvQ2hlY2spO1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NUb0NoZWNrKTtcbiAgfVxuICByZXR1cm4gY2xhc3NSZWdFeHAoY2xhc3NUb0NoZWNrKS50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiAgICAgICAgRWxlbWVudCB0byBhZGQgY2xhc3MgbmFtZSB0by5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0FkZFxuICogICAgICAgIENsYXNzIG5hbWUgdG8gYWRkLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKiAgICAgICAgIFRoZSBkb20gZWxlbWVudCB3aXRoIHRoZSBhZGRlZCBjbGFzcyBuYW1lLlxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc1RvQWRkKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc1RvQWRkKTtcblxuICAgIC8vIERvbid0IG5lZWQgdG8gYHRocm93SWZXaGl0ZXNwYWNlYCBoZXJlIGJlY2F1c2UgYGhhc0VsQ2xhc3NgIHdpbGwgZG8gaXRcbiAgICAvLyBpbiB0aGUgY2FzZSBvZiBjbGFzc0xpc3Qgbm90IGJlaW5nIHN1cHBvcnRlZC5cbiAgfSBlbHNlIGlmICghaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NUb0FkZCkpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IChlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNsYXNzVG9BZGQpLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gYW4gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogICAgICAgIEVsZW1lbnQgdG8gcmVtb3ZlIGEgY2xhc3MgbmFtZSBmcm9tLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvUmVtb3ZlXG4gKiAgICAgICAgQ2xhc3MgbmFtZSB0byByZW1vdmVcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZG9tIGVsZW1lbnQgd2l0aCBjbGFzcyBuYW1lIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzVG9SZW1vdmUpIHtcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzVG9SZW1vdmUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93SWZXaGl0ZXNwYWNlKGNsYXNzVG9SZW1vdmUpO1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoL1xccysvKS5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjICE9PSBjbGFzc1RvUmVtb3ZlO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIFRoZSBjYWxsYmFjayBkZWZpbml0aW9uIGZvciB0b2dnbGVFbENsYXNzLlxuICpcbiAqIEBjYWxsYmFjayBEb21+UHJlZGljYXRlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogICAgICAgIFRoZSBET00gZWxlbWVudCBvZiB0aGUgQ29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gKiAgICAgICAgVGhlIGBjbGFzc05hbWVgIHRoYXQgd2FudHMgdG8gYmUgdG9nZ2xlZFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICogICAgICAgICAtIElmIHRydWUgdGhlIGBjbGFzc1RvVG9nZ2xlYCB3aWxsIGdldCBhZGRlZCB0byBgZWxlbWVudGAuXG4gKiAgICAgICAgIC0gSWYgZmFsc2UgdGhlIGBjbGFzc1RvVG9nZ2xlYCB3aWxsIGdldCByZW1vdmVkIGZyb20gYGVsZW1lbnRgLlxuICogICAgICAgICAtIElmIHVuZGVmaW5lZCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaWdub3JlZFxuICovXG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWxcbiAqIGNvbmRpdGlvbiBvciB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byB0b2dnbGUgYSBjbGFzcyBuYW1lIG9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gKiAgICAgICAgVGhlIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHRvZ2dsZWRcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW58UHJlZGljYXRlQ2FsbGJhY2t9IFtwcmVkaWNhdGVdXG4gKiAgICAgICAgU2VlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHtAbGluayBEb21+UHJlZGljYXRlQ2FsbGJhY2t9XG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBhIGNsYXNzIHRoYXQgaGFzIGJlZW4gdG9nZ2xlZC5cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSwgcHJlZGljYXRlKSB7XG5cbiAgLy8gVGhpcyBDQU5OT1QgdXNlIGBjbGFzc0xpc3RgIGludGVybmFsbHkgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZVxuICAvLyBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBgY2xhc3NMaXN0LnRvZ2dsZSgpYCBtZXRob2QhIFdoaWNoIGlzIGZpbmUgYmVjYXVzZVxuICAvLyBgY2xhc3NMaXN0YCB3aWxsIGJlIHVzZWQgYnkgdGhlIGFkZC9yZW1vdmUgZnVuY3Rpb25zLlxuICB2YXIgaGFzID0gaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7XG5cbiAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcHJlZGljYXRlID0gIWhhcztcbiAgfVxuXG4gIC8vIElmIHRoZSBuZWNlc3NhcnkgY2xhc3Mgb3BlcmF0aW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlXG4gIC8vIGVsZW1lbnQsIG5vIGFjdGlvbiBpcyByZXF1aXJlZC5cbiAgaWYgKHByZWRpY2F0ZSA9PT0gaGFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByZWRpY2F0ZSkge1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzVG9Ub2dnbGUpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzVG9Ub2dnbGUpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQXBwbHkgYXR0cmlidXRlcyB0byBhbiBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgdG8gYWRkIGF0dHJpYnV0ZXMgdG8uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzXVxuICogICAgICAgIEF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhlbCwgYXR0cmlidXRlcykge1xuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyTmFtZSkge1xuICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcblxuICAgIGlmIChhdHRyVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0clZhbHVlID09PSBmYWxzZSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUgPT09IHRydWUgPyAnJyA6IGF0dHJWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZSB2YWx1ZXMsIGFzIGRlZmluZWQgb24gdGhlIEhUTUwgdGFnXG4gKiBBdHRyaWJ1dGVzIGFyZSBub3QgdGhlIHNhbWUgYXMgcHJvcGVydGllcy4gVGhleSdyZSBkZWZpbmVkIG9uIHRoZSB0YWdcbiAqIG9yIHdpdGggc2V0QXR0cmlidXRlICh3aGljaCBzaG91bGRuJ3QgYmUgdXNlZCB3aXRoIEhUTUwpXG4gKiBUaGlzIHdpbGwgcmV0dXJuIHRydWUgb3IgZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhZ1xuICogICAgICAgIEVsZW1lbnQgZnJvbSB3aGljaCB0byBnZXQgdGFnIGF0dHJpYnV0ZXMuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyh0YWcpIHtcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIC8vIGtub3duIGJvb2xlYW4gYXR0cmlidXRlc1xuICAvLyB3ZSBjYW4gY2hlY2sgZm9yIG1hdGNoaW5nIGJvb2xlYW4gcHJvcGVydGllcywgYnV0IG9sZGVyIGJyb3dzZXJzXG4gIC8vIHdvbid0IGtub3cgYWJvdXQgSFRNTDUgYm9vbGVhbiBhdHRyaWJ1dGVzIHRoYXQgd2Ugc3RpbGwgcmVhZCBmcm9tXG4gIHZhciBrbm93bkJvb2xlYW5zID0gJywnICsgJ2F1dG9wbGF5LGNvbnRyb2xzLHBsYXlzaW5saW5lLGxvb3AsbXV0ZWQsZGVmYXVsdCxkZWZhdWx0TXV0ZWQnICsgJywnO1xuXG4gIGlmICh0YWcgJiYgdGFnLmF0dHJpYnV0ZXMgJiYgdGFnLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgIHZhciBhdHRycyA9IHRhZy5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpXS5uYW1lO1xuICAgICAgdmFyIGF0dHJWYWwgPSBhdHRyc1tpXS52YWx1ZTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGtub3duIGJvb2xlYW5zXG4gICAgICAvLyB0aGUgbWF0Y2hpbmcgZWxlbWVudCBwcm9wZXJ0eSB3aWxsIHJldHVybiBhIHZhbHVlIGZvciB0eXBlb2ZcbiAgICAgIGlmICh0eXBlb2YgdGFnW2F0dHJOYW1lXSA9PT0gJ2Jvb2xlYW4nIHx8IGtub3duQm9vbGVhbnMuaW5kZXhPZignLCcgKyBhdHRyTmFtZSArICcsJykgIT09IC0xKSB7XG4gICAgICAgIC8vIHRoZSB2YWx1ZSBvZiBhbiBpbmNsdWRlZCBib29sZWFuIGF0dHJpYnV0ZSBpcyB0eXBpY2FsbHkgYW4gZW1wdHlcbiAgICAgICAgLy8gc3RyaW5nICgnJykgd2hpY2ggd291bGQgZXF1YWwgZmFsc2UgaWYgd2UganVzdCBjaGVjayBmb3IgYSBmYWxzZSB2YWx1ZS5cbiAgICAgICAgLy8gd2UgYWxzbyBkb24ndCB3YW50IHN1cHBvcnQgYmFkIGNvZGUgbGlrZSBhdXRvcGxheT0nZmFsc2UnXG4gICAgICAgIGF0dHJWYWwgPSBhdHRyVmFsICE9PSBudWxsID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvYmpbYXR0ck5hbWVdID0gYXR0clZhbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBBIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICogICAgICAgIEF0dHJpYnV0ZSB0byBnZXQgdGhlIHZhbHVlIG9mXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKSB7XG4gIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBhdHRyaWJ1dGVcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgQSBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAqICAgICAgICBBdHRyaWJ1dGUgdG8gc2V0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgICAgICAgVmFsdWUgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgdG9cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIGVsLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBBIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICogICAgICAgIEF0dHJpYnV0ZSB0byByZW1vdmVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpIHtcbiAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBibG9jayB0aGUgYWJpbGl0eSB0byBzZWxlY3QgdGV4dCB3aGlsZSBkcmFnZ2luZyBjb250cm9sc1xuICovXG5mdW5jdGlvbiBibG9ja1RleHRTZWxlY3Rpb24oKSB7XG4gIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbi8qKlxuICogVHVybiBvZmYgdGV4dCBzZWxlY3Rpb24gYmxvY2tpbmdcbiAqL1xuZnVuY3Rpb24gdW5ibG9ja1RleHRTZWxlY3Rpb24oKSB7XG4gIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogSWRlbnRpY2FsIHRvIHRoZSBuYXRpdmUgYGdldEJvdW5kaW5nQ2xpZW50UmVjdGAgZnVuY3Rpb24sIGJ1dCBlbnN1cmVzIHRoYXRcbiAqIHRoZSBtZXRob2QgaXMgc3VwcG9ydGVkIGF0IGFsbCAoaXQgaXMgaW4gYWxsIGJyb3dzZXJzIHdlIGNsYWltIHRvIHN1cHBvcnQpXG4gKiBhbmQgdGhhdCB0aGUgZWxlbWVudCBpcyBpbiB0aGUgRE9NIGJlZm9yZSBjb250aW51aW5nLlxuICpcbiAqIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBhbHNvIHNoaW1zIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcm92aWRlZCBieSBzb21lXG4gKiBvbGRlciBicm93c2VycyAobmFtZWx5LCBJRTgpLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgc29tZSBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBhZGRpbmcgcHJvcGVydGllcyB0byBhXG4gKiBgQ2xpZW50UmVjdGAvYERPTVJlY3RgIG9iamVjdDsgc28sIHdlIHNoYWxsb3ctY29weSBpdCB3aXRoIHRoZSBzdGFuZGFyZFxuICogcHJvcGVydGllcyAoZXhjZXB0IGB4YCBhbmQgYHlgIHdoaWNoIGFyZSBub3Qgd2lkZWx5IHN1cHBvcnRlZCkuIFRoaXMgaGVscHNcbiAqIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBrZXlzIGFyZSBub24tZW51bWVyYWJsZS5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogICAgICAgICBFbGVtZW50IHdob3NlIGBDbGllbnRSZWN0YCB3ZSB3YW50IHRvIGNhbGN1bGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICogICAgICAgICBBbHdheXMgcmV0dXJucyBhIHBsYWluXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICBpZiAoZWwgJiYgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsLnBhcmVudE5vZGUpIHtcbiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIFsnYm90dG9tJywgJ2hlaWdodCcsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGlmIChyZWN0W2tdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVjdFtrXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0LmhlaWdodCkge1xuICAgICAgcmVzdWx0LmhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZShlbCwgJ2hlaWdodCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC53aWR0aCkge1xuICAgICAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlKGVsLCAnd2lkdGgnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3N0aW9uIG9mIGEgRE9NIGVsZW1lbnQgb24gdGhlIHBhZ2UuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gbW9kdWxlOmRvbX5Qb3NpdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0XG4gKiAgICAgICAgICAgUGl4ZWxzIHRvIHRoZSBsZWZ0XG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcFxuICogICAgICAgICAgIFBpeGVscyBvbiB0b3BcbiAqL1xuXG4vKipcbiAqIE9mZnNldCBMZWZ0LlxuICogZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHRlY2huaXF1ZSBmcm9tXG4gKiBKb2huIFJlc2lnXG4gKlxuICogQHNlZSBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvZ2V0Ym91bmRpbmdjbGllbnRyZWN0LWlzLWF3ZXNvbWUvXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgZnJvbSB3aGljaCB0byBnZXQgb2Zmc2V0XG4gKlxuICogQHJldHVybiB7bW9kdWxlOmRvbX5Qb3NpdGlvbn1cbiAqICAgICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHBhc3NlZCBpbi5cbiAqL1xuZnVuY3Rpb24gZmluZFBvc2l0aW9uKGVsKSB7XG4gIHZhciBib3ggPSB2b2lkIDA7XG5cbiAgaWYgKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbC5wYXJlbnROb2RlKSB7XG4gICAgYm94ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICBpZiAoIWJveCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG4gIHZhciBjbGllbnRMZWZ0ID0gZG9jRWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgYm9keS5zY3JvbGxMZWZ0O1xuICB2YXIgbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XG5cbiAgdmFyIGNsaWVudFRvcCA9IGRvY0VsLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xuICB2YXIgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGJvZHkuc2Nyb2xsVG9wO1xuICB2YXIgdG9wID0gYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcblxuICAvLyBBbmRyb2lkIHNvbWV0aW1lcyByZXR1cm5zIHNsaWdodGx5IG9mZiBkZWNpbWFsIHZhbHVlcywgc28gbmVlZCB0byByb3VuZFxuICByZXR1cm4ge1xuICAgIGxlZnQ6IE1hdGgucm91bmQobGVmdCksXG4gICAgdG9wOiBNYXRoLnJvdW5kKHRvcClcbiAgfTtcbn1cblxuLyoqXG4gKiB4IGFuZCB5IGNvb3JkaW5hdGVzIGZvciBhIGRvbSBlbGVtZW50IG9yIG1vdXNlIHBvaW50ZXJcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEb21+Q29vcmRpbmF0ZXNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0geFxuICogICAgICAgICAgIHggY29vcmRpbmF0ZSBpbiBwaXhlbHNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0geVxuICogICAgICAgICAgIHkgY29vcmRpbmF0ZSBpbiBwaXhlbHNcbiAqL1xuXG4vKipcbiAqIEdldCBwb2ludGVyIHBvc2l0aW9uIGluIGVsZW1lbnRcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAqIFRoZSBiYXNlIG9uIHRoZSBjb29yZGluYXRlcyBhcmUgdGhlIGJvdHRvbSBsZWZ0IG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBFbGVtZW50IG9uIHdoaWNoIHRvIGdldCB0aGUgcG9pbnRlciBwb3NpdGlvbiBvblxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gKiAgICAgICAgRXZlbnQgb2JqZWN0XG4gKlxuICogQHJldHVybiB7RG9tfkNvb3JkaW5hdGVzfVxuICogICAgICAgICBBIENvb3JkaW5hdGVzIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb3VzZSBwb3NpdGlvbi5cbiAqXG4gKi9cbmZ1bmN0aW9uIGdldFBvaW50ZXJQb3NpdGlvbihlbCwgZXZlbnQpIHtcbiAgdmFyIHBvc2l0aW9uID0ge307XG4gIHZhciBib3ggPSBmaW5kUG9zaXRpb24oZWwpO1xuICB2YXIgYm94VyA9IGVsLm9mZnNldFdpZHRoO1xuICB2YXIgYm94SCA9IGVsLm9mZnNldEhlaWdodDtcblxuICB2YXIgYm94WSA9IGJveC50b3A7XG4gIHZhciBib3hYID0gYm94LmxlZnQ7XG4gIHZhciBwYWdlWSA9IGV2ZW50LnBhZ2VZO1xuICB2YXIgcGFnZVggPSBldmVudC5wYWdlWDtcblxuICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHtcbiAgICBwYWdlWCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO1xuICAgIHBhZ2VZID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVk7XG4gIH1cblxuICBwb3NpdGlvbi55ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGJveFkgLSBwYWdlWSArIGJveEgpIC8gYm94SCkpO1xuICBwb3NpdGlvbi54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHBhZ2VYIC0gYm94WCkgLyBib3hXKSk7XG5cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG4vKipcbiAqIERldGVybWluZXMsIHZpYSBkdWNrIHR5cGluZywgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyBhIHRleHQgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogICAgICAgIENoZWNrIGlmIHRoaXMgdmFsdWUgaXMgYSB0ZXh0IG5vZGUuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgdGV4dCBub2RlXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMztcbn1cblxuLyoqXG4gKiBFbXB0aWVzIHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byBlbXB0eSBjaGlsZHJlbiBmcm9tXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBubyBjaGlsZHJlblxuICovXG5mdW5jdGlvbiBlbXB0eUVsKGVsKSB7XG4gIHdoaWxlIChlbC5maXJzdENoaWxkKSB7XG4gICAgZWwucmVtb3ZlQ2hpbGQoZWwuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgY29udGVudCBmb3IgZXZlbnR1YWwgaW5zZXJ0aW9uIGludG8gdGhlIERPTS5cbiAqXG4gKiBUaGlzIGFsbG93cyBhIHdpZGUgcmFuZ2Ugb2YgY29udGVudCBkZWZpbml0aW9uIG1ldGhvZHMsIGJ1dCBwcm90ZWN0c1xuICogZnJvbSBmYWxsaW5nIGludG8gdGhlIHRyYXAgb2Ygc2ltcGx5IHdyaXRpbmcgdG8gYGlubmVySFRNTGAsIHdoaWNoIGlzXG4gKiBhbiBYU1MgY29uY2Vybi5cbiAqXG4gKiBUaGUgY29udGVudCBmb3IgYW4gZWxlbWVudCBjYW4gYmUgcGFzc2VkIGluIG11bHRpcGxlIHR5cGVzIGFuZFxuICogY29tYmluYXRpb25zLCB3aG9zZSBiZWhhdmlvciBpcyBhcyBmb2xsb3dzOlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnRcbiAqICAgICAgICAtIFN0cmluZzogTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICogICAgICAgIC0gRWxlbWVudC9UZXh0Tm9kZTogUGFzc2VkIHRocm91Z2guXG4gKiAgICAgICAgLSBBcnJheTogQSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2Ygc3RyaW5ncywgZWxlbWVudHMsIG5vZGVzLCBvciBmdW5jdGlvbnNcbiAqICAgICAgICAgICh3aGljaCByZXR1cm4gc2luZ2xlIHN0cmluZ3MsIGVsZW1lbnRzLCBvciBub2RlcykuXG4gKiAgICAgICAgLSBGdW5jdGlvbjogSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgICAgICAgICBub2RlLCBvciBhcnJheSBhcyBkZWZpbmVkIGFib3ZlLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogICAgICAgICBBbGwgb2YgdGhlIGNvbnRlbnQgdGhhdCB3YXMgcGFzc2VkIGluIG5vcm1hbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRlbnQoY29udGVudCkge1xuXG4gIC8vIEZpcnN0LCBpbnZva2UgY29udGVudCBpZiBpdCBpcyBhIGZ1bmN0aW9uLiBJZiBpdCBwcm9kdWNlcyBhbiBhcnJheSxcbiAgLy8gdGhhdCBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIG5vcm1hbGl6YXRpb24uXG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnRlbnQgPSBjb250ZW50KCk7XG4gIH1cblxuICAvLyBOZXh0IHVwLCBub3JtYWxpemUgdG8gYW4gYXJyYXksIHNvIG9uZSBvciBtYW55IGl0ZW1zIGNhbiBiZSBub3JtYWxpemVkLFxuICAvLyBmaWx0ZXJlZCwgYW5kIHJldHVybmVkLlxuICByZXR1cm4gKEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50IDogW2NvbnRlbnRdKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cbiAgICAvLyBGaXJzdCwgaW52b2tlIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24gdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSxcbiAgICAvLyB3aGljaCB3aWxsIGJlIHN1YnNlcXVlbnRseSBub3JtYWxpemVkIHRvIGEgTm9kZSBvZiBzb21lIGtpbmQuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc0VsKHZhbHVlKSB8fCBpc1RleHROb2RlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9cXFMvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgIH1cbiAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbmQgYXBwZW5kcyBjb250ZW50IHRvIGFuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgdG8gYXBwZW5kIG5vcm1hbGl6ZWQgY29udGVudCB0by5cbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudHxUZXh0Tm9kZXxBcnJheXxGdW5jdGlvbn0gY29udGVudFxuICogICAgICAgIFNlZSB0aGUgYGNvbnRlbnRgIGFyZ3VtZW50IG9mIHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH1cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB3aXRoIGFwcGVuZGVkIG5vcm1hbGl6ZWQgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kQ29udGVudChlbCwgY29udGVudCkge1xuICBub3JtYWxpemVDb250ZW50KGNvbnRlbnQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gZWwuYXBwZW5kQ2hpbGQobm9kZSk7XG4gIH0pO1xuICByZXR1cm4gZWw7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbmQgaW5zZXJ0cyBjb250ZW50IGludG8gYW4gZWxlbWVudDsgdGhpcyBpcyBpZGVudGljYWwgdG9cbiAqIGBhcHBlbmRDb250ZW50KClgLCBleGNlcHQgaXQgZW1wdGllcyB0aGUgZWxlbWVudCBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgRWxlbWVudCB0byBpbnNlcnQgbm9ybWFsaXplZCBjb250ZW50IGludG8uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudHxUZXh0Tm9kZXxBcnJheXxGdW5jdGlvbn0gY29udGVudFxuICogICAgICAgIFNlZSB0aGUgYGNvbnRlbnRgIGFyZ3VtZW50IG9mIHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH1cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB3aXRoIGluc2VydGVkIG5vcm1hbGl6ZWQgY29udGVudC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGluc2VydENvbnRlbnQoZWwsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIGFwcGVuZENvbnRlbnQoZW1wdHlFbChlbCksIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGV2ZW50IHdhcyBhIHNpbmdsZSBsZWZ0IGNsaWNrXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAqICAgICAgICBFdmVudCBvYmplY3RcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgYSBsZWZ0IGNsaWNrXG4gKiAgICAgICAgIC0gRmFsc2UgaWYgbm90IGEgbGVmdCBjbGlja1xuICovXG5mdW5jdGlvbiBpc1NpbmdsZUxlZnRDbGljayhldmVudCkge1xuICAvLyBOb3RlOiBpZiB5b3UgY3JlYXRlIHNvbWV0aGluZyBkcmFnZ2FibGUsIGJlIHN1cmUgdG9cbiAgLy8gY2FsbCBpdCBvbiBib3RoIGBtb3VzZWRvd25gIGFuZCBgbW91c2Vtb3ZlYCBldmVudCxcbiAgLy8gb3RoZXJ3aXNlIGBtb3VzZWRvd25gIHNob3VsZCBiZSBlbm91Z2ggZm9yIGEgYnV0dG9uXG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdW5kZWZpbmVkICYmIGV2ZW50LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIGBidXR0b25zYCA/XG4gICAgLy8gQmVjYXVzZSwgbWlkZGxlIG1vdXNlIHNvbWV0aW1lcyBoYXZlIHRoaXM6XG4gICAgLy8gZS5idXR0b24gPT09IDAgYW5kIGUuYnV0dG9ucyA9PT0gNFxuICAgIC8vIEZ1cnRoZXJtb3JlLCB3ZSB3YW50IHRvIHByZXZlbnQgY29tYmluYXRpb24gY2xpY2ssIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gSE9MRCBtaWRkbGVtb3VzZSB0aGVuIGxlZnQgY2xpY2ssIHRoYXQgd291bGQgYmVcbiAgICAvLyBlLmJ1dHRvbiA9PT0gMCwgZS5idXR0b25zID09PSA1XG4gICAgLy8ganVzdCBgYnV0dG9uYCBpcyBub3QgZ29ubmEgd29ya1xuXG4gICAgLy8gQWxyaWdodCwgdGhlbiB3aGF0IHRoaXMgYmxvY2sgZG9lcyA/XG4gICAgLy8gdGhpcyBpcyBmb3IgY2hyb21lIGBzaW11bGF0ZSBtb2JpbGUgZGV2aWNlc2BcbiAgICAvLyBJIHdhbnQgdG8gc3VwcG9ydCB0aGlzIGFzIHdlbGxcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5idXR0b25zID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBUb3VjaCBzY3JlZW4sIHNvbWV0aW1lcyBvbiBzb21lIHNwZWNpZmljIGRldmljZSwgYGJ1dHRvbnNgXG4gICAgLy8gZG9lc24ndCBoYXZlIGFueXRoaW5nIChzYWZhcmkgb24gaW9zLCBibGFja2JlcnJ5Li4uKVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoSUVfVkVSU0lPTiA9PT0gOSkge1xuICAgIC8vIElnbm9yZSBJRTlcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5idXR0b25zICE9PSAxKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhc29uIHdlIGhhdmUgdGhvc2UgaWYgZWxzZSBibG9jayBhYm92ZVxuICAgIC8vIGlmIGFueSBzcGVjaWFsIGNhc2Ugd2UgY2FuIGNhdGNoIGFuZCBsZXQgaXQgc2xpZGVcbiAgICAvLyB3ZSBkbyBpdCBhYm92ZSwgd2hlbiBnZXQgdG8gaGVyZSwgdGhpcyBkZWZpbml0ZWx5XG4gICAgLy8gaXMtbm90LWxlZnQtY2xpY2tcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEZpbmRzIGEgc2luZ2xlIERPTSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgd2l0aGluIHRoZSBvcHRpb25hbFxuICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAqICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICogICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICogICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gKiAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm91bmQgb3IgbnVsbC5cbiAqL1xudmFyICQgPSBjcmVhdGVRdWVyaWVyKCdxdWVyeVNlbGVjdG9yJyk7XG5cbi8qKlxuICogRmluZHMgYSBhbGwgRE9NIGVsZW1lbnRzIG1hdGNoaW5nIGBzZWxlY3RvcmAgd2l0aGluIHRoZSBvcHRpb25hbFxuICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiAgICAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAqICAgICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICogICAgICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICogICAgICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gKiAgICAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICpcbiAqIEByZXR1cm4ge05vZGVMaXN0fVxuICogICAgICAgICBBIGVsZW1lbnQgbGlzdCBvZiBlbGVtZW50cyB0aGF0IHdlcmUgZm91bmQuIFdpbGwgYmUgZW1wdHkgaWYgbm9uZSB3ZXJlIGZvdW5kLlxuICpcbiAqL1xudmFyICQkID0gY3JlYXRlUXVlcmllcigncXVlcnlTZWxlY3RvckFsbCcpO1xuXG5cblxudmFyIERvbSA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRpc1JlYWw6IGlzUmVhbCxcblx0aXNFbDogaXNFbCxcblx0aXNJbkZyYW1lOiBpc0luRnJhbWUsXG5cdGNyZWF0ZUVsOiBjcmVhdGVFbCxcblx0dGV4dENvbnRlbnQ6IHRleHRDb250ZW50LFxuXHRwcmVwZW5kVG86IHByZXBlbmRUbyxcblx0aGFzQ2xhc3M6IGhhc0NsYXNzLFxuXHRhZGRDbGFzczogYWRkQ2xhc3MsXG5cdHJlbW92ZUNsYXNzOiByZW1vdmVDbGFzcyxcblx0dG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuXHRzZXRBdHRyaWJ1dGVzOiBzZXRBdHRyaWJ1dGVzLFxuXHRnZXRBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzLFxuXHRnZXRBdHRyaWJ1dGU6IGdldEF0dHJpYnV0ZSxcblx0c2V0QXR0cmlidXRlOiBzZXRBdHRyaWJ1dGUsXG5cdHJlbW92ZUF0dHJpYnV0ZTogcmVtb3ZlQXR0cmlidXRlLFxuXHRibG9ja1RleHRTZWxlY3Rpb246IGJsb2NrVGV4dFNlbGVjdGlvbixcblx0dW5ibG9ja1RleHRTZWxlY3Rpb246IHVuYmxvY2tUZXh0U2VsZWN0aW9uLFxuXHRnZXRCb3VuZGluZ0NsaWVudFJlY3Q6IGdldEJvdW5kaW5nQ2xpZW50UmVjdCxcblx0ZmluZFBvc2l0aW9uOiBmaW5kUG9zaXRpb24sXG5cdGdldFBvaW50ZXJQb3NpdGlvbjogZ2V0UG9pbnRlclBvc2l0aW9uLFxuXHRpc1RleHROb2RlOiBpc1RleHROb2RlLFxuXHRlbXB0eUVsOiBlbXB0eUVsLFxuXHRub3JtYWxpemVDb250ZW50OiBub3JtYWxpemVDb250ZW50LFxuXHRhcHBlbmRDb250ZW50OiBhcHBlbmRDb250ZW50LFxuXHRpbnNlcnRDb250ZW50OiBpbnNlcnRDb250ZW50LFxuXHRpc1NpbmdsZUxlZnRDbGljazogaXNTaW5nbGVMZWZ0Q2xpY2ssXG5cdCQ6ICQsXG5cdCQkOiAkJFxufSk7XG5cbi8qKlxuICogQGZpbGUgZ3VpZC5qc1xuICogQG1vZHVsZSBndWlkXG4gKi9cblxuLyoqXG4gKiBVbmlxdWUgSUQgZm9yIGFuIGVsZW1lbnQgb3IgZnVuY3Rpb25cbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKi9cbnZhciBfZ3VpZCA9IDE7XG5cbi8qKlxuICogR2V0IGEgdW5pcXVlIGF1dG8taW5jcmVtZW50aW5nIElEIGJ5IG51bWJlciB0aGF0IGhhcyBub3QgYmVlbiByZXR1cm5lZCBiZWZvcmUuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBBIG5ldyB1bmlxdWUgSUQuXG4gKi9cbmZ1bmN0aW9uIG5ld0dVSUQoKSB7XG4gIHJldHVybiBfZ3VpZCsrO1xufVxuXG4vKipcbiAqIEBmaWxlIGRvbS1kYXRhLmpzXG4gKiBAbW9kdWxlIGRvbS1kYXRhXG4gKi9cbi8qKlxuICogRWxlbWVudCBEYXRhIFN0b3JlLlxuICpcbiAqIEFsbG93cyBmb3IgYmluZGluZyBkYXRhIHRvIGFuIGVsZW1lbnQgd2l0aG91dCBwdXR0aW5nIGl0IGRpcmVjdGx5IG9uIHRoZVxuICogZWxlbWVudC4gRXguIEV2ZW50IGxpc3RlbmVycyBhcmUgc3RvcmVkIGhlcmUuXG4gKiAoYWxzbyBmcm9tIGpzbmluamEuY29tLCBzbGlnaHRseSBtb2RpZmllZCBhbmQgdXBkYXRlZCBmb3IgY2xvc3VyZSBjb21waWxlcilcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xudmFyIGVsRGF0YSA9IHt9O1xuXG4vKlxuICogVW5pcXVlIGF0dHJpYnV0ZSBuYW1lIHRvIHN0b3JlIGFuIGVsZW1lbnQncyBndWlkIGluXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBjb25zdGFudFxuICogQHByaXZhdGVcbiAqL1xudmFyIGVsSWRBdHRyID0gJ3ZkYXRhJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIG9iamVjdCB3aGVyZSBkYXRhIGZvciBhbiBlbGVtZW50IGlzIHN0b3JlZFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBFbGVtZW50IHRvIHN0b3JlIGRhdGEgZm9yLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgICAgICAgVGhlIGNhY2hlIG9iamVjdCBmb3IgdGhhdCBlbCB0aGF0IHdhcyBwYXNzZWQgaW4uXG4gKi9cbmZ1bmN0aW9uIGdldERhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGVsW2VsSWRBdHRyXSA9IG5ld0dVSUQoKTtcbiAgfVxuXG4gIGlmICghZWxEYXRhW2lkXSkge1xuICAgIGVsRGF0YVtpZF0gPSB7fTtcbiAgfVxuXG4gIHJldHVybiBlbERhdGFbaWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMgY2FjaGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgQ2hlY2sgaWYgdGhpcyBlbGVtZW50IGhhcyBjYWNoZWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgdGhlIERPTSBlbGVtZW50IGhhcyBjYWNoZWQgZGF0YS5cbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGhhc0RhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gISFPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlbERhdGFbaWRdKS5sZW5ndGg7XG59XG5cbi8qKlxuICogRGVsZXRlIGRhdGEgZm9yIHRoZSBlbGVtZW50IGZyb20gdGhlIGNhY2hlIGFuZCB0aGUgZ3VpZCBhdHRyIGZyb20gZ2V0RWxlbWVudEJ5SWRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgUmVtb3ZlIGNhY2hlZCBkYXRhIGZvciB0aGlzIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZURhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHN0b3JlZCBkYXRhXG4gIGRlbGV0ZSBlbERhdGFbaWRdO1xuXG4gIC8vIFJlbW92ZSB0aGUgZWxJZEF0dHIgcHJvcGVydHkgZnJvbSB0aGUgRE9NIG5vZGVcbiAgdHJ5IHtcbiAgICBkZWxldGUgZWxbZWxJZEF0dHJdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGVsLnJlbW92ZUF0dHJpYnV0ZSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGVsSWRBdHRyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSUUgZG9lc24ndCBhcHBlYXIgdG8gc3VwcG9ydCByZW1vdmVBdHRyaWJ1dGUgb24gdGhlIGRvY3VtZW50IGVsZW1lbnRcbiAgICAgIGVsW2VsSWRBdHRyXSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGZpbGUgZXZlbnRzLmpzLiBBbiBFdmVudCBTeXN0ZW0gKEpvaG4gUmVzaWcgLSBTZWNyZXRzIG9mIGEgSlMgTmluamEgaHR0cDovL2pzbmluamEuY29tLylcbiAqIChPcmlnaW5hbCBib29rIHZlcnNpb24gd2Fzbid0IGNvbXBsZXRlbHkgdXNhYmxlLCBzbyBmaXhlZCBzb21lIHRoaW5ncyBhbmQgbWFkZSBDbG9zdXJlIENvbXBpbGVyIGNvbXBhdGlibGUpXG4gKiBUaGlzIHNob3VsZCB3b3JrIHZlcnkgc2ltaWxhcmx5IHRvIGpRdWVyeSdzIGV2ZW50cywgaG93ZXZlciBpdCdzIGJhc2VkIG9mZiB0aGUgYm9vayB2ZXJzaW9uIHdoaWNoIGlzbid0IGFzXG4gKiByb2J1c3QgYXMganF1ZXJ5J3MsIHNvIHRoZXJlJ3MgcHJvYmFibHkgc29tZSBkaWZmZXJlbmNlcy5cbiAqXG4gKiBAbW9kdWxlIGV2ZW50c1xuICovXG5cbi8qKlxuICogQ2xlYW4gdXAgdGhlIGxpc3RlbmVyIGNhY2hlIGFuZCBkaXNwYXRjaGVyc1xuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW1cbiAqICAgICAgICBFbGVtZW50IHRvIGNsZWFuIHVwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUeXBlIG9mIGV2ZW50IHRvIGNsZWFuIHVwXG4gKi9cbmZ1bmN0aW9uIF9jbGVhblVwRXZlbnRzKGVsZW0sIHR5cGUpIHtcbiAgdmFyIGRhdGEgPSBnZXREYXRhKGVsZW0pO1xuXG4gIC8vIFJlbW92ZSB0aGUgZXZlbnRzIG9mIGEgcGFydGljdWxhciB0eXBlIGlmIHRoZXJlIGFyZSBub25lIGxlZnRcbiAgaWYgKGRhdGEuaGFuZGxlcnNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGRhdGEuaGFuZGxlcnNbdHlwZV07XG4gICAgLy8gZGF0YS5oYW5kbGVyc1t0eXBlXSA9IG51bGw7XG4gICAgLy8gU2V0dGluZyB0byBudWxsIHdhcyBjYXVzaW5nIGFuIGVycm9yIHdpdGggZGF0YS5oYW5kbGVyc1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBtZXRhLWhhbmRsZXIgZnJvbSB0aGUgZWxlbWVudFxuICAgIGlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpIHtcbiAgICAgIGVsZW0uZGV0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGRhdGEuZGlzcGF0Y2hlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBldmVudHMgb2JqZWN0IGlmIHRoZXJlIGFyZSBubyB0eXBlcyBsZWZ0XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhLmhhbmRsZXJzKS5sZW5ndGggPD0gMCkge1xuICAgIGRlbGV0ZSBkYXRhLmhhbmRsZXJzO1xuICAgIGRlbGV0ZSBkYXRhLmRpc3BhdGNoZXI7XG4gICAgZGVsZXRlIGRhdGEuZGlzYWJsZWQ7XG4gIH1cblxuICAvLyBGaW5hbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBkYXRhIGlmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdFxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVtb3ZlRGF0YShlbGVtKTtcbiAgfVxufVxuXG4vKipcbiAqIExvb3BzIHRocm91Z2ggYW4gYXJyYXkgb2YgZXZlbnQgdHlwZXMgYW5kIGNhbGxzIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGZvciBlYWNoIHR5cGUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICBUaGUgZXZlbnQgbWV0aG9kIHdlIHdhbnQgdG8gdXNlLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW1cbiAqICAgICAgICBFbGVtZW50IG9yIG9iamVjdCB0byBiaW5kIGxpc3RlbmVycyB0b1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgVHlwZSBvZiBldmVudCB0byBiaW5kIHRvLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gY2FsbGJhY2tcbiAqICAgICAgICBFdmVudCBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gX2hhbmRsZU11bHRpcGxlRXZlbnRzKGZuLCBlbGVtLCB0eXBlcywgY2FsbGJhY2spIHtcbiAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIC8vIENhbGwgdGhlIGV2ZW50IG1ldGhvZCBmb3IgZWFjaCBvbmUgb2YgdGhlIHR5cGVzXG4gICAgZm4oZWxlbSwgdHlwZSwgY2FsbGJhY2spO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaXggYSBuYXRpdmUgZXZlbnQgdG8gaGF2ZSBzdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgICAgICBFdmVudCBvYmplY3QgdG8gZml4LlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgICAgICAgRml4ZWQgZXZlbnQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmaXhFdmVudChldmVudCkge1xuXG4gIGZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZXN0IGlmIGZpeGluZyB1cCBpcyBuZWVkZWRcbiAgLy8gVXNlZCB0byBjaGVjayBpZiAhZXZlbnQuc3RvcFByb3BhZ2F0aW9uIGluc3RlYWQgb2YgaXNQcm9wYWdhdGlvblN0b3BwZWRcbiAgLy8gQnV0IG5hdGl2ZSBldmVudHMgcmV0dXJuIHRydWUgZm9yIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGRvbid0IGhhdmVcbiAgLy8gb3RoZXIgZXhwZWN0ZWQgbWV0aG9kcyBsaWtlIGlzUHJvcGFnYXRpb25TdG9wcGVkLiBTZWVtcyB0byBiZSBhIHByb2JsZW1cbiAgLy8gd2l0aCB0aGUgSmF2YXNjcmlwdCBOaW5qYSBjb2RlLiBTbyB3ZSdyZSBqdXN0IG92ZXJyaWRpbmcgYWxsIGV2ZW50cyBub3cuXG4gIGlmICghZXZlbnQgfHwgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKSB7XG4gICAgdmFyIG9sZCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuICAgIGV2ZW50ID0ge307XG4gICAgLy8gQ2xvbmUgdGhlIG9sZCBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IHRoZSB2YWx1ZXMgZXZlbnQgPSB7fTtcbiAgICAvLyBJRTggRG9lc24ndCBsaWtlIHdoZW4geW91IG1lc3Mgd2l0aCBuYXRpdmUgZXZlbnQgcHJvcGVydGllc1xuICAgIC8vIEZpcmVmb3ggcmV0dXJucyBmYWxzZSBmb3IgZXZlbnQuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSBhbmQgb3RoZXIgcHJvcHNcbiAgICAvLyAgd2hpY2ggbWFrZXMgY29weWluZyBtb3JlIGRpZmZpY3VsdC5cbiAgICAvLyBUT0RPOiBQcm9iYWJseSBiZXN0IHRvIGNyZWF0ZSBhIHdoaXRlbGlzdCBvZiBldmVudCBwcm9wc1xuICAgIGZvciAodmFyIGtleSBpbiBvbGQpIHtcbiAgICAgIC8vIFNhZmFyaSA2LjAuMyB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQgbGF5ZXJYL1lcbiAgICAgIC8vIENocm9tZSB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQga2V5Ym9hcmRFdmVudC5rZXlMb2NhdGlvblxuICAgICAgLy8gYW5kIHdlYmtpdE1vdmVtZW50WC9ZXG4gICAgICBpZiAoa2V5ICE9PSAnbGF5ZXJYJyAmJiBrZXkgIT09ICdsYXllclknICYmIGtleSAhPT0gJ2tleUxvY2F0aW9uJyAmJiBrZXkgIT09ICd3ZWJraXRNb3ZlbWVudFgnICYmIGtleSAhPT0gJ3dlYmtpdE1vdmVtZW50WScpIHtcbiAgICAgICAgLy8gQ2hyb21lIDMyKyB3YXJucyBpZiB5b3UgdHJ5IHRvIGNvcHkgZGVwcmVjYXRlZCByZXR1cm5WYWx1ZSwgYnV0XG4gICAgICAgIC8vIHdlIHN0aWxsIHdhbnQgdG8gaWYgcHJldmVudERlZmF1bHQgaXNuJ3Qgc3VwcG9ydGVkIChJRTgpLlxuICAgICAgICBpZiAoIShrZXkgPT09ICdyZXR1cm5WYWx1ZScgJiYgb2xkLnByZXZlbnREZWZhdWx0KSkge1xuICAgICAgICAgIGV2ZW50W2tleV0gPSBvbGRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBldmVudCBvY2N1cnJlZCBvbiB0aGlzIGVsZW1lbnRcbiAgICBpZiAoIWV2ZW50LnRhcmdldCkge1xuICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgd2hpY2ggb3RoZXIgZWxlbWVudCB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0b1xuICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIHRoZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIG9sZC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIG9sZC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcblxuICAgIC8vIFN0b3AgdGhlIGV2ZW50IGZyb20gYnViYmxpbmdcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBvbGQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgb2xkLmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgfTtcblxuICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuRmFsc2U7XG5cbiAgICAvLyBTdG9wIHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIGFuZCBleGVjdXRpbmcgb3RoZXIgaGFuZGxlcnNcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuICAgICAgICBvbGQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5GYWxzZTtcblxuICAgIC8vIEhhbmRsZSBtb3VzZSBwb3NpdGlvblxuICAgIGlmIChldmVudC5jbGllbnRYICE9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuICAgICAgZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7XG4gICAgICBldmVudC5wYWdlWSA9IGV2ZW50LmNsaWVudFkgKyAoZG9jICYmIGRvYy5zY3JvbGxUb3AgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudFRvcCB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wIHx8IDApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBrZXkgcHJlc3Nlc1xuICAgIGV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTtcblxuICAgIC8vIEZpeCBidXR0b24gZm9yIG1vdXNlIGNsaWNrczpcbiAgICAvLyAwID09IGxlZnQ7IDEgPT0gbWlkZGxlOyAyID09IHJpZ2h0XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gbnVsbCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgZG9lcyBub3QgcGFzcyB2aWRlb2pzLXN0YW5kYXJkXG4gICAgICAvLyBhbmQuLi4geWlrZXMuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgZXZlbnQuYnV0dG9uID0gZXZlbnQuYnV0dG9uICYgMSA/IDAgOiBldmVudC5idXR0b24gJiA0ID8gMSA6IGV2ZW50LmJ1dHRvbiAmIDIgPyAyIDogMDtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGZpeGVkLXVwIGluc3RhbmNlXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZSBzdXBwb3J0ZWRcbiAqL1xudmFyIF9zdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgX3N1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdHMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBkaXNyZWdhcmRcbiAgfVxufSkoKTtcblxuLyoqXG4gKiBUb3VjaCBldmVudHMgQ2hyb21lIGV4cGVjdHMgdG8gYmUgcGFzc2l2ZVxuICovXG52YXIgcGFzc2l2ZUV2ZW50cyA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnXTtcblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWxlbWVudFxuICogSXQgc3RvcmVzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGluIGEgc2VwYXJhdGUgY2FjaGUgb2JqZWN0XG4gKiBhbmQgYWRkcyBhIGdlbmVyaWMgaGFuZGxlciB0byB0aGUgZWxlbWVudCdzIGV2ZW50LFxuICogYWxvbmcgd2l0aCBhIHVuaXF1ZSBpZCAoZ3VpZCkgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbVxuICogICAgICAgIEVsZW1lbnQgb3Igb2JqZWN0IHRvIGJpbmQgbGlzdGVuZXJzIHRvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGVcbiAqICAgICAgICBUeXBlIG9mIGV2ZW50IHRvIGJpbmQgdG8uXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmblxuICogICAgICAgIEV2ZW50IGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBvbihlbGVtLCB0eXBlLCBmbikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBfaGFuZGxlTXVsdGlwbGVFdmVudHMob24sIGVsZW0sIHR5cGUsIGZuKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gZ2V0RGF0YShlbGVtKTtcblxuICAvLyBXZSBuZWVkIGEgcGxhY2UgdG8gc3RvcmUgYWxsIG91ciBoYW5kbGVyIGRhdGFcbiAgaWYgKCFkYXRhLmhhbmRsZXJzKSB7XG4gICAgZGF0YS5oYW5kbGVycyA9IHt9O1xuICB9XG5cbiAgaWYgKCFkYXRhLmhhbmRsZXJzW3R5cGVdKSB7XG4gICAgZGF0YS5oYW5kbGVyc1t0eXBlXSA9IFtdO1xuICB9XG5cbiAgaWYgKCFmbi5ndWlkKSB7XG4gICAgZm4uZ3VpZCA9IG5ld0dVSUQoKTtcbiAgfVxuXG4gIGRhdGEuaGFuZGxlcnNbdHlwZV0ucHVzaChmbik7XG5cbiAgaWYgKCFkYXRhLmRpc3BhdGNoZXIpIHtcbiAgICBkYXRhLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBkYXRhLmRpc3BhdGNoZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhhc2gpIHtcblxuICAgICAgaWYgKGRhdGEuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudCA9IGZpeEV2ZW50KGV2ZW50KTtcblxuICAgICAgdmFyIGhhbmRsZXJzID0gZGF0YS5oYW5kbGVyc1tldmVudC50eXBlXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIC8vIENvcHkgaGFuZGxlcnMgc28gaWYgaGFuZGxlcnMgYXJlIGFkZGVkL3JlbW92ZWQgZHVyaW5nIHRoZSBwcm9jZXNzIGl0IGRvZXNuJ3QgdGhyb3cgZXZlcnl0aGluZyBvZmYuXG4gICAgICAgIHZhciBoYW5kbGVyc0NvcHkgPSBoYW5kbGVycy5zbGljZSgwKTtcblxuICAgICAgICBmb3IgKHZhciBtID0gMCwgbiA9IGhhbmRsZXJzQ29weS5sZW5ndGg7IG0gPCBuOyBtKyspIHtcbiAgICAgICAgICBpZiAoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGhhbmRsZXJzQ29weVttXS5jYWxsKGVsZW0sIGV2ZW50LCBoYXNoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgbG9nJDEuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHZhciBvcHRpb25zID0gZmFsc2U7XG5cbiAgICAgIGlmIChfc3VwcG9ydHNQYXNzaXZlICYmIHBhc3NpdmVFdmVudHMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkge1xuICAgICAgZWxlbS5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZGF0YS5kaXNwYXRjaGVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtXG4gKiAgICAgICAgT2JqZWN0IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3R5cGVdXG4gKiAgICAgICAgVHlwZSBvZiBsaXN0ZW5lciB0byByZW1vdmUuIERvbid0IGluY2x1ZGUgdG8gcmVtb3ZlIGFsbCBldmVudHMgZnJvbSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gW2ZuXVxuICogICAgICAgIFNwZWNpZmljIGxpc3RlbmVyIHRvIHJlbW92ZS4gRG9uJ3QgaW5jbHVkZSB0byByZW1vdmUgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICogICAgICAgIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG9mZihlbGVtLCB0eXBlLCBmbikge1xuICAvLyBEb24ndCB3YW50IHRvIGFkZCBhIGNhY2hlIG9iamVjdCB0aHJvdWdoIGdldEVsRGF0YSBpZiBub3QgbmVlZGVkXG4gIGlmICghaGFzRGF0YShlbGVtKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0gZ2V0RGF0YShlbGVtKTtcblxuICAvLyBJZiBubyBldmVudHMgZXhpc3QsIG5vdGhpbmcgdG8gdW5iaW5kXG4gIGlmICghZGF0YS5oYW5kbGVycykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIF9oYW5kbGVNdWx0aXBsZUV2ZW50cyhvZmYsIGVsZW0sIHR5cGUsIGZuKTtcbiAgfVxuXG4gIC8vIFV0aWxpdHkgZnVuY3Rpb25cbiAgdmFyIHJlbW92ZVR5cGUgPSBmdW5jdGlvbiByZW1vdmVUeXBlKGVsLCB0KSB7XG4gICAgZGF0YS5oYW5kbGVyc1t0XSA9IFtdO1xuICAgIF9jbGVhblVwRXZlbnRzKGVsLCB0KTtcbiAgfTtcblxuICAvLyBBcmUgd2UgcmVtb3ZpbmcgYWxsIGJvdW5kIGV2ZW50cz9cbiAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAodmFyIHQgaW4gZGF0YS5oYW5kbGVycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLmhhbmRsZXJzIHx8IHt9LCB0KSkge1xuICAgICAgICByZW1vdmVUeXBlKGVsZW0sIHQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGFuZGxlcnMgPSBkYXRhLmhhbmRsZXJzW3R5cGVdO1xuXG4gIC8vIElmIG5vIGhhbmRsZXJzIGV4aXN0LCBub3RoaW5nIHRvIHVuYmluZFxuICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgbm8gbGlzdGVuZXIgd2FzIHByb3ZpZGVkLCByZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdHlwZVxuICBpZiAoIWZuKSB7XG4gICAgcmVtb3ZlVHlwZShlbGVtLCB0eXBlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSdyZSBvbmx5IHJlbW92aW5nIGEgc2luZ2xlIGhhbmRsZXJcbiAgaWYgKGZuLmd1aWQpIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IGhhbmRsZXJzLmxlbmd0aDsgbisrKSB7XG4gICAgICBpZiAoaGFuZGxlcnNbbl0uZ3VpZCA9PT0gZm4uZ3VpZCkge1xuICAgICAgICBoYW5kbGVycy5zcGxpY2Uobi0tLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xlYW5VcEV2ZW50cyhlbGVtLCB0eXBlKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGFuIGV2ZW50IGZvciBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbVxuICogICAgICAgIEVsZW1lbnQgdG8gdHJpZ2dlciBhbiBldmVudCBvblxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR8c3RyaW5nfSBldmVudFxuICogICAgICAgIEEgc3RyaW5nICh0aGUgdHlwZSkgb3IgYW4gZXZlbnQgb2JqZWN0IHdpdGggYSB0eXBlIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF1cbiAqICAgICAgICBkYXRhIGhhc2ggdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBldmVudFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICogICAgICAgICAtIFJldHVybnMgdGhlIG9wcG9zaXRlIG9mIGBkZWZhdWx0UHJldmVudGVkYCBpZiBkZWZhdWx0IHdhcyBwcmV2ZW50ZWRcbiAqICAgICAgICAgLSBPdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gdHJpZ2dlcihlbGVtLCBldmVudCwgaGFzaCkge1xuICAvLyBGZXRjaGVzIGVsZW1lbnQgZGF0YSBhbmQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCAoZm9yIGJ1YmJsaW5nKS5cbiAgLy8gRG9uJ3Qgd2FudCB0byBhZGQgYSBkYXRhIG9iamVjdCB0byBjYWNoZSBmb3IgZXZlcnkgcGFyZW50LFxuICAvLyBzbyBjaGVja2luZyBoYXNFbERhdGEgZmlyc3QuXG4gIHZhciBlbGVtRGF0YSA9IGhhc0RhdGEoZWxlbSkgPyBnZXREYXRhKGVsZW0pIDoge307XG4gIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50O1xuICAvLyB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCxcbiAgLy8gaGFuZGxlcjtcblxuICAvLyBJZiBhbiBldmVudCBuYW1lIHdhcyBwYXNzZWQgYXMgYSBzdHJpbmcsIGNyZWF0ZXMgYW4gZXZlbnQgb3V0IG9mIGl0XG4gIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgZXZlbnQgPSB7IHR5cGU6IGV2ZW50LCB0YXJnZXQ6IGVsZW0gfTtcbiAgfSBlbHNlIGlmICghZXZlbnQudGFyZ2V0KSB7XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZXMgdGhlIGV2ZW50IHByb3BlcnRpZXMuXG4gIGV2ZW50ID0gZml4RXZlbnQoZXZlbnQpO1xuXG4gIC8vIElmIHRoZSBwYXNzZWQgZWxlbWVudCBoYXMgYSBkaXNwYXRjaGVyLCBleGVjdXRlcyB0aGUgZXN0YWJsaXNoZWQgaGFuZGxlcnMuXG4gIGlmIChlbGVtRGF0YS5kaXNwYXRjaGVyKSB7XG4gICAgZWxlbURhdGEuZGlzcGF0Y2hlci5jYWxsKGVsZW0sIGV2ZW50LCBoYXNoKTtcbiAgfVxuXG4gIC8vIFVubGVzcyBleHBsaWNpdGx5IHN0b3BwZWQgb3IgdGhlIGV2ZW50IGRvZXMgbm90IGJ1YmJsZSAoZS5nLiBtZWRpYSBldmVudHMpXG4gIC8vIHJlY3Vyc2l2ZWx5IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gYnViYmxlIHRoZSBldmVudCB1cCB0aGUgRE9NLlxuICBpZiAocGFyZW50ICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICYmIGV2ZW50LmJ1YmJsZXMgPT09IHRydWUpIHtcbiAgICB0cmlnZ2VyLmNhbGwobnVsbCwgcGFyZW50LCBldmVudCwgaGFzaCk7XG5cbiAgICAvLyBJZiBhdCB0aGUgdG9wIG9mIHRoZSBET00sIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiB1bmxlc3MgZGlzYWJsZWQuXG4gIH0gZWxzZSBpZiAoIXBhcmVudCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHZhciB0YXJnZXREYXRhID0gZ2V0RGF0YShldmVudC50YXJnZXQpO1xuXG4gICAgLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgaGFzIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnRhcmdldFtldmVudC50eXBlXSkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgZXZlbnQgZGlzcGF0Y2hpbmcgb24gdGhlIHRhcmdldCBhcyB3ZSBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgdGhlIGhhbmRsZXIuXG4gICAgICB0YXJnZXREYXRhLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIC8vIEV4ZWN1dGVzIHRoZSBkZWZhdWx0IGFjdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnQudGFyZ2V0W2V2ZW50LnR5cGVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldFtldmVudC50eXBlXSgpO1xuICAgICAgfVxuICAgICAgLy8gUmUtZW5hYmxlcyBldmVudCBkaXNwYXRjaGluZy5cbiAgICAgIHRhcmdldERhdGEuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBJbmZvcm0gdGhlIHRyaWdnZXJlciBpZiB0aGUgZGVmYXVsdCB3YXMgcHJldmVudGVkIGJ5IHJldHVybmluZyBmYWxzZVxuICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG59XG5cbi8qKlxuICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtXG4gKiAgICAgICAgRWxlbWVudCBvciBvYmplY3QgdG8gYmluZCB0by5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gdHlwZVxuICogICAgICAgIE5hbWUvdHlwZSBvZiBldmVudFxuICpcbiAqIEBwYXJhbSB7RXZlbnR+RXZlbnRMaXN0ZW5lcn0gZm5cbiAqICAgICAgICBFdmVudCBMaXN0ZW5lciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvbmUoZWxlbSwgdHlwZSwgZm4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gX2hhbmRsZU11bHRpcGxlRXZlbnRzKG9uZSwgZWxlbSwgdHlwZSwgZm4pO1xuICB9XG4gIHZhciBmdW5jID0gZnVuY3Rpb24gZnVuYygpIHtcbiAgICBvZmYoZWxlbSwgdHlwZSwgZnVuYyk7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICAvLyBjb3B5IHRoZSBndWlkIHRvIHRoZSBuZXcgZnVuY3Rpb24gc28gaXQgY2FuIHJlbW92ZWQgdXNpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uJ3MgSURcbiAgZnVuYy5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgbmV3R1VJRCgpO1xuICBvbihlbGVtLCB0eXBlLCBmdW5jKTtcbn1cblxudmFyIEV2ZW50cyA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRmaXhFdmVudDogZml4RXZlbnQsXG5cdG9uOiBvbixcblx0b2ZmOiBvZmYsXG5cdHRyaWdnZXI6IHRyaWdnZXIsXG5cdG9uZTogb25lXG59KTtcblxuLyoqXG4gKiBAZmlsZSBzZXR1cC5qcyAtIEZ1bmN0aW9ucyBmb3Igc2V0dGluZyB1cCBhIHBsYXllciB3aXRob3V0XG4gKiB1c2VyIGludGVyYWN0aW9uIGJhc2VkIG9uIHRoZSBkYXRhLXNldHVwIGBhdHRyaWJ1dGVgIG9mIHRoZSB2aWRlbyB0YWcuXG4gKlxuICogQG1vZHVsZSBzZXR1cFxuICovXG52YXIgX3dpbmRvd0xvYWRlZCA9IGZhbHNlO1xudmFyIHZpZGVvanMkMiA9IHZvaWQgMDtcblxuLyoqXG4gKiBTZXQgdXAgYW55IHRhZ3MgdGhhdCBoYXZlIGEgZGF0YS1zZXR1cCBgYXR0cmlidXRlYCB3aGVuIHRoZSBwbGF5ZXIgaXMgc3RhcnRlZC5cbiAqL1xudmFyIGF1dG9TZXR1cCA9IGZ1bmN0aW9uIGF1dG9TZXR1cCgpIHtcblxuICAvLyBQcm90ZWN0IGFnYWluc3QgYnJlYWthZ2UgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzIGFuZCBjaGVjayBnbG9iYWwgYXV0b1NldHVwIG9wdGlvbi5cbiAgaWYgKCFpc1JlYWwoKSB8fCB2aWRlb2pzJDIub3B0aW9ucy5hdXRvU2V0dXAgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT25lIGRheSwgd2hlbiB3ZSBzdG9wIHN1cHBvcnRpbmcgSUU4LCBnbyBiYWNrIHRvIHRoaXMsIGJ1dCBpbiB0aGUgbWVhbnRpbWUuLi4qaGFjayBoYWNrIGhhY2sqXG4gIC8vIHZhciB2aWRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJykpO1xuICAvLyB2YXIgYXVkaW9zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2F1ZGlvJykpO1xuICAvLyB2YXIgbWVkaWFFbHMgPSB2aWRzLmNvbmNhdChhdWRpb3MpO1xuXG4gIC8vIEJlY2F1c2UgSUU4IGRvZXNuJ3Qgc3VwcG9ydCBjYWxsaW5nIHNsaWNlIG9uIGEgbm9kZSBsaXN0LCB3ZSBuZWVkIHRvIGxvb3BcbiAgLy8gdGhyb3VnaCBlYWNoIGxpc3Qgb2YgZWxlbWVudHMgdG8gYnVpbGQgdXAgYSBuZXcsIGNvbWJpbmVkIGxpc3Qgb2YgZWxlbWVudHMuXG4gIHZhciB2aWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7XG4gIHZhciBhdWRpb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXVkaW8nKTtcbiAgdmFyIGRpdnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8tanMnKTtcbiAgdmFyIG1lZGlhRWxzID0gW107XG5cbiAgaWYgKHZpZHMgJiYgdmlkcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGUgPSB2aWRzLmxlbmd0aDsgaSA8IGU7IGkrKykge1xuICAgICAgbWVkaWFFbHMucHVzaCh2aWRzW2ldKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXVkaW9zICYmIGF1ZGlvcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBfZSA9IGF1ZGlvcy5sZW5ndGg7IF9pIDwgX2U7IF9pKyspIHtcbiAgICAgIG1lZGlhRWxzLnB1c2goYXVkaW9zW19pXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpdnMgJiYgZGl2cy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgX2kyID0gMCwgX2UyID0gZGl2cy5sZW5ndGg7IF9pMiA8IF9lMjsgX2kyKyspIHtcbiAgICAgIG1lZGlhRWxzLnB1c2goZGl2c1tfaTJdKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbnkgbWVkaWEgZWxlbWVudHMgZXhpc3RcbiAgaWYgKG1lZGlhRWxzICYmIG1lZGlhRWxzLmxlbmd0aCA+IDApIHtcblxuICAgIGZvciAodmFyIF9pMyA9IDAsIF9lMyA9IG1lZGlhRWxzLmxlbmd0aDsgX2kzIDwgX2UzOyBfaTMrKykge1xuICAgICAgdmFyIG1lZGlhRWwgPSBtZWRpYUVsc1tfaTNdO1xuXG4gICAgICAvLyBDaGVjayBpZiBlbGVtZW50IGV4aXN0cywgaGFzIGdldEF0dHJpYnV0ZSBmdW5jLlxuICAgICAgLy8gSUUgc2VlbXMgdG8gY29uc2lkZXIgdHlwZW9mIGVsLmdldEF0dHJpYnV0ZSA9PSAnb2JqZWN0JyBpbnN0ZWFkIG9mXG4gICAgICAvLyAnZnVuY3Rpb24nIGxpa2UgZXhwZWN0ZWQsIGF0IGxlYXN0IHdoZW4gbG9hZGluZyB0aGUgcGxheWVyIGltbWVkaWF0ZWx5LlxuICAgICAgaWYgKG1lZGlhRWwgJiYgbWVkaWFFbC5nZXRBdHRyaWJ1dGUpIHtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBwbGF5ZXIgaGFzbid0IGFscmVhZHkgYmVlbiBzZXQgdXAuXG4gICAgICAgIGlmIChtZWRpYUVsLnBsYXllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSBtZWRpYUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXR1cCcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YS1zZXR1cCBhdHRyIGV4aXN0cy5cbiAgICAgICAgICAvLyBXZSBvbmx5IGF1dG8tc2V0dXAgaWYgdGhleSd2ZSBhZGRlZCB0aGUgZGF0YS1zZXR1cCBhdHRyLlxuICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpZGVvLmpzIGluc3RhbmNlLlxuICAgICAgICAgICAgdmlkZW9qcyQyKG1lZGlhRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGdldEF0dHJpYnV0ZSBpc24ndCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBET00uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRvU2V0dXBUaW1lb3V0KDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2aWRlb3Mgd2VyZSBmb3VuZCwgc28ga2VlcCBsb29waW5nIHVubGVzcyBwYWdlIGlzIGZpbmlzaGVkIGxvYWRpbmcuXG4gIH0gZWxzZSBpZiAoIV93aW5kb3dMb2FkZWQpIHtcbiAgICBhdXRvU2V0dXBUaW1lb3V0KDEpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhaXQgdW50aWwgdGhlIHBhZ2UgaXMgbG9hZGVkIGJlZm9yZSBydW5uaW5nIGF1dG9TZXR1cC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpblxuICogYXV0b1NldHVwIGlmIGBoYXNMb2FkZWRgIHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdhaXRcbiAqICAgICAgICBIb3cgbG9uZyB0byB3YWl0IGluIG1zXG4gKlxuICogQHBhcmFtIHttb2R1bGU6dmlkZW9qc30gW3Zqc11cbiAqICAgICAgICBUaGUgdmlkZW9qcyBsaWJyYXJ5IGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGF1dG9TZXR1cFRpbWVvdXQod2FpdCwgdmpzKSB7XG4gIGlmICh2anMpIHtcbiAgICB2aWRlb2pzJDIgPSB2anM7XG4gIH1cblxuICB3aW5kb3cuc2V0VGltZW91dChhdXRvU2V0dXAsIHdhaXQpO1xufVxuXG5pZiAoaXNSZWFsKCkgJiYgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICBfd2luZG93TG9hZGVkID0gdHJ1ZTtcbn0gZWxzZSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIHRoZSBsb2FkIGV2ZW50IG9uIHdpbmRvdywgYW5kIHNldCBfd2luZG93TG9hZGVkIHRvIHRydWUuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGxvYWRcbiAgICovXG4gIG9uZSh3aW5kb3csICdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIF93aW5kb3dMb2FkZWQgPSB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZmlsZSBzdHlsZXNoZWV0LmpzXG4gKiBAbW9kdWxlIHN0eWxlc2hlZXRcbiAqL1xuLyoqXG4gKiBDcmVhdGUgYSBET00gc3lsZSBlbGVtZW50IGdpdmVuIGEgY2xhc3NOYW1lIGZvciBpdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiAgICAgICAgVGhlIGNsYXNzTmFtZSB0byBhZGQgdG8gdGhlIGNyZWF0ZWQgc3R5bGUgZWxlbWVudC5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICovXG52YXIgY3JlYXRlU3R5bGVFbGVtZW50ID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KGNsYXNzTmFtZSkge1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gIHN0eWxlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vKipcbiAqIEFkZCB0ZXh0IHRvIGEgRE9NIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBFbGVtZW50IHRvIGFkZCB0ZXh0IGNvbnRlbnQgdG8uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAqICAgICAgICBUaGUgdGV4dCB0byBhZGQgdG8gdGhlIGVsZW1lbnQuXG4gKi9cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIHNldFRleHRDb250ZW50KGVsLCBjb250ZW50KSB7XG4gIGlmIChlbC5zdHlsZVNoZWV0KSB7XG4gICAgZWwuc3R5bGVTaGVldC5jc3NUZXh0ID0gY29udGVudDtcbiAgfSBlbHNlIHtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gIH1cbn07XG5cbi8qKlxuICogQGZpbGUgZm4uanNcbiAqIEBtb2R1bGUgZm5cbiAqL1xuLyoqXG4gKiBCaW5kIChhLmsuYSBwcm94eSBvciBDb250ZXh0KS4gQSBzaW1wbGUgbWV0aG9kIGZvciBjaGFuZ2luZyB0aGUgY29udGV4dCBvZiBhIGZ1bmN0aW9uXG4gKiBJdCBhbHNvIHN0b3JlcyBhIHVuaXF1ZSBpZCBvbiB0aGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGVhc2lseSByZW1vdmVkIGZyb20gZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGNvbnRleHRcbiAqICAgICAgICBUaGUgb2JqZWN0IHRvIGJpbmQgYXMgc2NvcGUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gYmUgYm91bmQgdG8gYSBzY29wZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3VpZF1cbiAqICAgICAgICBBbiBvcHRpb25hbCB1bmlxdWUgSUQgZm9yIHRoZSBmdW5jdGlvbiB0byBiZSBzZXRcbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgVGhlIG5ldyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgYm91bmQgaW50byB0aGUgY29udGV4dCBnaXZlblxuICovXG52YXIgYmluZCA9IGZ1bmN0aW9uIGJpbmQoY29udGV4dCwgZm4sIHVpZCkge1xuICAvLyBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhcyBhIHVuaXF1ZSBJRFxuICBpZiAoIWZuLmd1aWQpIHtcbiAgICBmbi5ndWlkID0gbmV3R1VJRCgpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gdGhhdCBjaGFuZ2VzIHRoZSBjb250ZXh0XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uIGJvdW5kKCkge1xuICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8vIEFsbG93IGZvciB0aGUgYWJpbGl0eSB0byBpbmRpdmlkdWFsaXplIHRoaXMgZnVuY3Rpb25cbiAgLy8gTmVlZGVkIGluIHRoZSBjYXNlIHdoZXJlIG11bHRpcGxlIG9iamVjdHMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgcHJvdG90eXBlXG4gIC8vIElGIGJvdGggaXRlbXMgYWRkIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggdGhlIHNhbWUgZnVuY3Rpb24sIHRoZW4geW91IHRyeSB0byByZW1vdmUganVzdCBvbmVcbiAgLy8gaXQgd2lsbCByZW1vdmUgYm90aCBiZWNhdXNlIHRoZXkgYm90aCBoYXZlIHRoZSBzYW1lIGd1aWQuXG4gIC8vIHdoZW4gdXNpbmcgdGhpcywgeW91IG5lZWQgdG8gdXNlIHRoZSBiaW5kIG1ldGhvZCB3aGVuIHlvdSByZW1vdmUgdGhlIGxpc3RlbmVyIGFzIHdlbGwuXG4gIC8vIGN1cnJlbnRseSB1c2VkIGluIHRleHQgdHJhY2tzXG4gIGJvdW5kLmd1aWQgPSB1aWQgPyB1aWQgKyAnXycgKyBmbi5ndWlkIDogZm4uZ3VpZDtcblxuICByZXR1cm4gYm91bmQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHRoZSBnaXZlbiBmdW5jdGlvbiwgYGZuYCwgd2l0aCBhIG5ldyBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZm5gXG4gKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKiAgICAgICAgIFRoZSBmdW5jdGlvbiB0byBiZSB0aHJvdHRsZWQuXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgIHdhaXRcbiAqICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYnkgd2hpY2ggdG8gdGhyb3R0bGUuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uIHRocm90dGxlKGZuLCB3YWl0KSB7XG4gIHZhciBsYXN0ID0gRGF0ZS5ub3coKTtcblxuICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24gdGhyb3R0bGVkKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKG5vdyAtIGxhc3QgPj0gd2FpdCkge1xuICAgICAgZm4uYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgbGFzdCA9IG5vdztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuXG4gKlxuICogSW5zcGlyZWQgYnkgbG9kYXNoIGFuZCB1bmRlcnNjb3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuY1xuICogICAgICAgICBUaGUgZnVuY3Rpb24gdG8gd3JhcCB3aXRoIGRlYm91bmNlIGJlaGF2aW9yLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gd2FpdFxuICogICAgICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGFmdGVyIHRoZSBsYXN0IGludm9jYXRpb24uXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2ltbWVkaWF0ZV1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseSB1cG9uIGNyZWF0aW9uLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHQ9d2luZG93XVxuICogICAgICAgICBUaGUgXCJjb250ZXh0XCIgaW4gd2hpY2ggdGhlIGRlYm91bmNlZCBmdW5jdGlvbiBzaG91bGQgZGVib3VuY2UuIEZvclxuICogICAgICAgICBleGFtcGxlLCBpZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB0aWVkIHRvIGEgVmlkZW8uanMgcGxheWVyLFxuICogICAgICAgICB0aGUgcGxheWVyIGNhbiBiZSBwYXNzZWQgaGVyZS4gQWx0ZXJuYXRpdmVseSwgZGVmYXVsdHMgdG8gdGhlXG4gKiAgICAgICAgIGdsb2JhbCBgd2luZG93YCBvYmplY3QuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiAgICAgICAgIEEgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG52YXIgZGVib3VuY2UgPSBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHdpbmRvdztcblxuICB2YXIgdGltZW91dCA9IHZvaWQgMDtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgX2xhdGVyID0gZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIF9sYXRlciA9IG51bGw7XG4gICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIXRpbWVvdXQgJiYgaW1tZWRpYXRlKSB7XG4gICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnRleHQuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQoX2xhdGVyLCB3YWl0KTtcbiAgfTtcbiAgLyogZXNsaW50LWVuYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbn07XG5cbi8qKlxuICogQGZpbGUgc3JjL2pzL2V2ZW50LXRhcmdldC5qc1xuICovXG4vKipcbiAqIGBFdmVudFRhcmdldGAgaXMgYSBjbGFzcyB0aGF0IGNhbiBoYXZlIHRoZSBzYW1lIEFQSSBhcyB0aGUgRE9NIGBFdmVudFRhcmdldGAuIEl0XG4gKiBhZGRzIHNob3J0aGFuZCBmdW5jdGlvbnMgdGhhdCB3cmFwIGFyb3VuZCBsZW5ndGh5IGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKiB0aGUgYG9uYCBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIGBhZGRFdmVudExpc3RlbmVyYC5cbiAqXG4gKiBAc2VlIFtFdmVudFRhcmdldCBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItRXZlbnRzL2V2ZW50cy5odG1sI0V2ZW50cy1FdmVudFRhcmdldH1cbiAqIEBjbGFzcyBFdmVudFRhcmdldFxuICovXG52YXIgRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiBFdmVudFRhcmdldCgpIHt9O1xuXG4vKipcbiAqIEEgQ3VzdG9tIERPTSBldmVudC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudFRhcmdldH5FdmVudFxuICogQHNlZSBbUHJvcGVydGllc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50fVxuICovXG5cbi8qKlxuICogQWxsIGV2ZW50IGxpc3RlbmVycyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICpcbiAqIEBjYWxsYmFjayBFdmVudFRhcmdldH5FdmVudExpc3RlbmVyXG4gKiBAdGhpcyB7RXZlbnRUYXJnZXR9XG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAqICAgICAgICB0aGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF1cbiAqICAgICAgICBoYXNoIG9mIGRhdGEgc2VudCBkdXJpbmcgdGhlIGV2ZW50XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBldmVudCBuYW1lcyBhcyBrZXlzIGFuZCBib29sZWFucyBhcyB2YWx1ZXMuXG4gKlxuICogPiBOT1RFOiBJZiBhbiBldmVudCBuYW1lIGlzIHNldCB0byBhIHRydWUgdmFsdWUgaGVyZSB7QGxpbmsgRXZlbnRUYXJnZXQjdHJpZ2dlcn1cbiAqICAgICAgICAgd2lsbCBoYXZlIGV4dHJhIGZ1bmN0aW9uYWxpdHkuIFNlZSB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSBFdmVudFRhcmdldC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c19cbiAqIEBwcml2YXRlXG4gKi9cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHt9O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50IGxpc3RlbmVyYCB0byBhbiBpbnN0YW5jZSBvZiBhbiBgRXZlbnRUYXJnZXRgLiBBbiBgZXZlbnQgbGlzdGVuZXJgIGlzIGFcbiAqIGZ1bmN0aW9uIHRoYXQgd2lsbCBnZXQgY2FsbGVkIHdoZW4gYW4gZXZlbnQgd2l0aCBhIGNlcnRhaW4gbmFtZSBnZXRzIHRyaWdnZXJlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gdHlwZVxuICogICAgICAgIEFuIGV2ZW50IG5hbWUgb3IgYW4gYXJyYXkgb2YgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmblxuICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdpdGggYEV2ZW50VGFyZ2V0YHNcbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIC8vIFJlbW92ZSB0aGUgYWRkRXZlbnRMaXN0ZW5lciBhbGlhcyBiZWZvcmUgY2FsbGluZyBFdmVudHMub25cbiAgLy8gc28gd2UgZG9uJ3QgZ2V0IGludG8gYW4gaW5maW5pdGUgdHlwZSBsb29wXG4gIHZhciBhZWwgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXI7XG5cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge307XG4gIG9uKHRoaXMsIHR5cGUsIGZuKTtcbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gYWVsO1xufTtcblxuLyoqXG4gKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb259LiBBbGxvd3MgYEV2ZW50VGFyZ2V0YCB0byBtaW1pY1xuICogdGhlIHN0YW5kYXJkIERPTSBBUEkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2VlIHtAbGluayBFdmVudFRhcmdldCNvbn1cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUub247XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBgZXZlbnQgbGlzdGVuZXJgIGZvciBhIHNwZWNpZmljIGV2ZW50IGZyb20gYW4gaW5zdGFuY2Ugb2YgYEV2ZW50VGFyZ2V0YC5cbiAqIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB0aGUgYGV2ZW50IGxpc3RlbmVyYCB3aWxsIG5vIGxvbmdlciBnZXQgY2FsbGVkIHdoZW4gdGhlXG4gKiBuYW1lZCBldmVudCBoYXBwZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlXG4gKiAgICAgICAgQW4gZXZlbnQgbmFtZSBvciBhbiBhcnJheSBvZiBldmVudCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZuXG4gKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbW92ZS5cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICBvZmYodGhpcywgdHlwZSwgZm4pO1xufTtcblxuLyoqXG4gKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfS4gQWxsb3dzIGBFdmVudFRhcmdldGAgdG8gbWltaWNcbiAqIHRoZSBzdGFuZGFyZCBET00gQVBJLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHNlZSB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfVxuICovXG5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5vZmY7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbiBgZXZlbnQgbGlzdGVuZXJgIHRoYXQgZ2V0cyB0cmlnZ2VyZWQgb25seSBvbmNlLiBBZnRlciB0aGVcbiAqIGZpcnN0IHRyaWdnZXIgaXQgd2lsbCBnZXQgcmVtb3ZlZC4gVGhpcyBpcyBsaWtlIGFkZGluZyBhbiBgZXZlbnQgbGlzdGVuZXJgXG4gKiB3aXRoIHtAbGluayBFdmVudFRhcmdldCNvbn0gdGhhdCBjYWxscyB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfSBvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGVcbiAqICAgICAgICBBbiBldmVudCBuYW1lIG9yIGFuIGFycmF5IG9mIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gZm5cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZXZlbnQgbmFtZS5cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAvLyBSZW1vdmUgdGhlIGFkZEV2ZW50TGlzdGVuZXIgYWxpYWxpbmcgRXZlbnRzLm9uXG4gIC8vIHNvIHdlIGRvbid0IGdldCBpbnRvIGFuIGluZmluaXRlIHR5cGUgbG9vcFxuICB2YXIgYWVsID0gdGhpcy5hZGRFdmVudExpc3RlbmVyO1xuXG4gIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHt9O1xuICBvbmUodGhpcywgdHlwZSwgZm4pO1xuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBhZWw7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFuIGV2ZW50IHRvIGhhcHBlbi4gVGhpcyB3aWxsIHRoZW4gY2F1c2UgYW55IGBldmVudCBsaXN0ZW5lcnNgXG4gKiB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGF0IGV2ZW50LCB0byBnZXQgY2FsbGVkLiBJZiB0aGVyZSBhcmUgbm8gYGV2ZW50IGxpc3RlbmVyc2BcbiAqIGZvciBhbiBldmVudCB0aGVuIG5vdGhpbmcgd2lsbCBoYXBwZW4uXG4gKlxuICogSWYgdGhlIG5hbWUgb2YgdGhlIGBFdmVudGAgdGhhdCBpcyBiZWluZyB0cmlnZ2VyZWQgaXMgaW4gYEV2ZW50VGFyZ2V0LmFsbG93ZWRFdmVudHNfYC5cbiAqIFRyaWdnZXIgd2lsbCBhbHNvIGNhbGwgdGhlIGBvbmAgKyBgdXBwZXJjYXNlRXZlbnROYW1lYCBmdW5jdGlvbi5cbiAqXG4gKiBFeGFtcGxlOlxuICogJ2NsaWNrJyBpcyBpbiBgRXZlbnRUYXJnZXQuYWxsb3dlZEV2ZW50c19gLCBzbywgdHJpZ2dlciB3aWxsIGF0dGVtcHQgdG8gY2FsbFxuICogYG9uQ2xpY2tgIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xFdmVudFRhcmdldH5FdmVudHxPYmplY3R9IGV2ZW50XG4gKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LCBhbiBgRXZlbnRgLCBvciBhbiBvYmplY3Qgd2l0aCBhIGtleSBvZiB0eXBlIHNldCB0b1xuICogICAgICAgIGFuIGV2ZW50IG5hbWUuXG4gKi9cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgIGV2ZW50ID0geyB0eXBlOiB0eXBlIH07XG4gIH1cbiAgZXZlbnQgPSBmaXhFdmVudChldmVudCk7XG5cbiAgaWYgKHRoaXMuYWxsb3dlZEV2ZW50c19bdHlwZV0gJiYgdGhpc1snb24nICsgdHlwZV0pIHtcbiAgICB0aGlzWydvbicgKyB0eXBlXShldmVudCk7XG4gIH1cblxuICB0cmlnZ2VyKHRoaXMsIGV2ZW50KTtcbn07XG5cbi8qKlxuICogQW4gYWxpYXMgb2Yge0BsaW5rIEV2ZW50VGFyZ2V0I3RyaWdnZXJ9LiBBbGxvd3MgYEV2ZW50VGFyZ2V0YCB0byBtaW1pY1xuICogdGhlIHN0YW5kYXJkIERPTSBBUEkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2VlIHtAbGluayBFdmVudFRhcmdldCN0cmlnZ2VyfVxuICovXG5FdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyO1xuXG4vKipcbiAqIEBmaWxlIG1peGlucy9ldmVudGVkLmpzXG4gKiBAbW9kdWxlIGV2ZW50ZWRcbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBoYXMgaGFkIHRoZSBldmVudGVkIG1peGluIGFwcGxpZWQuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvYmplY3RcbiAqICAgICAgICAgQW4gb2JqZWN0IHRvIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBhcHBlYXJzIHRvIGJlIGV2ZW50ZWQuXG4gKi9cbnZhciBpc0V2ZW50ZWQgPSBmdW5jdGlvbiBpc0V2ZW50ZWQob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBFdmVudFRhcmdldCB8fCAhIW9iamVjdC5ldmVudEJ1c0VsXyAmJiBbJ29uJywgJ29uZScsICdvZmYnLCAndHJpZ2dlciddLmV2ZXJ5KGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3Rba10gPT09ICdmdW5jdGlvbic7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgdmFsdWUgaXMgYSB2YWxpZCBldmVudCB0eXBlIC0gbm9uLWVtcHR5IHN0cmluZyBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSB0eXBlXG4gKiAgICAgICAgIFRoZSB0eXBlIHZhbHVlIHRvIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHR5cGUgaXMgYSB2YWxpZCBldmVudCB0eXBlLlxuICovXG52YXIgaXNWYWxpZEV2ZW50VHlwZSA9IGZ1bmN0aW9uIGlzVmFsaWRFdmVudFR5cGUodHlwZSkge1xuICByZXR1cm4gKFxuICAgIC8vIFRoZSByZWdleCBoZXJlIHZlcmlmaWVzIHRoYXQgdGhlIGB0eXBlYCBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLVxuICAgIC8vIHdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyAmJiAvXFxTLy50ZXN0KHR5cGUpIHx8IEFycmF5LmlzQXJyYXkodHlwZSkgJiYgISF0eXBlLmxlbmd0aFxuICApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSB2YWxpZCBldmVudCB0YXJnZXQuIFRocm93cyBpZiBub3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogICAgICAgICBJZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGV2ZW50IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogICAgICAgICBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKi9cbnZhciB2YWxpZGF0ZVRhcmdldCA9IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAoIXRhcmdldC5ub2RlTmFtZSAmJiAhaXNFdmVudGVkKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyZ2V0OyBtdXN0IGJlIGEgRE9NIG5vZGUgb3IgZXZlbnRlZCBvYmplY3QuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgdmFsaWQgZXZlbnQgdGFyZ2V0LiBUaHJvd3MgaWYgbm90LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqICAgICAgICAgSWYgdGhlIHR5cGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgZXZlbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHR5cGVcbiAqICAgICAgICAgVGhlIHR5cGUgdG8gdGVzdC5cbiAqL1xudmFyIHZhbGlkYXRlRXZlbnRUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVFdmVudFR5cGUodHlwZSkge1xuICBpZiAoIWlzVmFsaWRFdmVudFR5cGUodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZTsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYXJyYXkuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgdmFsaWQgbGlzdGVuZXIuIFRocm93cyBpZiBub3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogICAgICAgICBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgICAgICAgIFRoZSBsaXN0ZW5lciB0byB0ZXN0LlxuICovXG52YXIgdmFsaWRhdGVMaXN0ZW5lciA9IGZ1bmN0aW9uIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0ZW5lcjsgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBnaXZlbiB0byBgb24oKWAgb3IgYG9uZSgpYCwgdmFsaWRhdGVzIHRoZW0sIGFuZFxuICogbm9ybWFsaXplcyB0aGVtIGludG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNlbGZcbiAqICAgICAgICAgVGhlIGV2ZW50ZWQgb2JqZWN0IG9uIHdoaWNoIGBvbigpYCBvciBgb25lKClgIHdhcyBjYWxsZWQuIFRoaXNcbiAqICAgICAgICAgb2JqZWN0IHdpbGwgYmUgYm91bmQgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgdGhlIGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBhcmdzXG4gKiAgICAgICAgIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYG9uKClgIG9yIGBvbmUoKWAuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyB1c2VmdWwgdmFsdWVzIGZvciBgb24oKWAgb3IgYG9uZSgpYCBjYWxscy5cbiAqL1xudmFyIG5vcm1hbGl6ZUxpc3RlbkFyZ3MgPSBmdW5jdGlvbiBub3JtYWxpemVMaXN0ZW5BcmdzKHNlbGYsIGFyZ3MpIHtcblxuICAvLyBJZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBsZXNzIHRoYW4gMywgdGhlIHRhcmdldCBpcyBhbHdheXMgdGhlXG4gIC8vIGV2ZW50ZWQgb2JqZWN0IGl0c2VsZi5cbiAgdmFyIGlzVGFyZ2V0aW5nU2VsZiA9IGFyZ3MubGVuZ3RoIDwgMyB8fCBhcmdzWzBdID09PSBzZWxmIHx8IGFyZ3NbMF0gPT09IHNlbGYuZXZlbnRCdXNFbF87XG4gIHZhciB0YXJnZXQgPSB2b2lkIDA7XG4gIHZhciB0eXBlID0gdm9pZCAwO1xuICB2YXIgbGlzdGVuZXIgPSB2b2lkIDA7XG5cbiAgaWYgKGlzVGFyZ2V0aW5nU2VsZikge1xuICAgIHRhcmdldCA9IHNlbGYuZXZlbnRCdXNFbF87XG5cbiAgICAvLyBEZWFsIHdpdGggY2FzZXMgd2hlcmUgd2UgZ290IDMgYXJndW1lbnRzLCBidXQgd2UgYXJlIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHRoZSBldmVudGVkIG9iamVjdCBpdHNlbGYuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgIGFyZ3Muc2hpZnQoKTtcbiAgICB9XG5cbiAgICB0eXBlID0gYXJnc1swXTtcbiAgICBsaXN0ZW5lciA9IGFyZ3NbMV07XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gYXJnc1swXTtcbiAgICB0eXBlID0gYXJnc1sxXTtcbiAgICBsaXN0ZW5lciA9IGFyZ3NbMl07XG4gIH1cblxuICB2YWxpZGF0ZVRhcmdldCh0YXJnZXQpO1xuICB2YWxpZGF0ZUV2ZW50VHlwZSh0eXBlKTtcbiAgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgbGlzdGVuZXIgPSBiaW5kKHNlbGYsIGxpc3RlbmVyKTtcblxuICByZXR1cm4geyBpc1RhcmdldGluZ1NlbGY6IGlzVGFyZ2V0aW5nU2VsZiwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xufTtcblxuLyoqXG4gKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgZXZlbnQgdHlwZShzKSBvbiB0aGUgdGFyZ2V0LCBub3JtYWxpemluZyBmb3JcbiAqIHRoZSB0eXBlIG9mIHRhcmdldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7RWxlbWVudHxPYmplY3R9IHRhcmdldFxuICogICAgICAgICBBIERPTSBub2RlIG9yIGV2ZW50ZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbWV0aG9kXG4gKiAgICAgICAgIFRoZSBldmVudCBiaW5kaW5nIG1ldGhvZCB0byB1c2UgKFwib25cIiBvciBcIm9uZVwiKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHR5cGVcbiAqICAgICAgICAgT25lIG9yIG1vcmUgZXZlbnQgdHlwZShzKS5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgICAgICAgQSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqL1xudmFyIGxpc3RlbiA9IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIG1ldGhvZCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFsaWRhdGVUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0Lm5vZGVOYW1lKSB7XG4gICAgRXZlbnRzW21ldGhvZF0odGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0W21ldGhvZF0odHlwZSwgbGlzdGVuZXIpO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnRhaW5zIG1ldGhvZHMgdGhhdCBwcm92aWRlIGV2ZW50IGNhcGFiaWxpdGVzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWRcbiAqIHRvIHtAbGluayBtb2R1bGU6ZXZlbnRlZHxldmVudGVkfS5cbiAqXG4gKiBAbWl4aW4gRXZlbnRlZE1peGluXG4gKi9cbnZhciBFdmVudGVkTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IChvciBldmVudHMpIG9uIHRoaXMgb2JqZWN0IG9yIGFub3RoZXIgZXZlbnRlZFxuICAgKiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ3xBcnJheXxFbGVtZW50fE9iamVjdH0gdGFyZ2V0T3JUeXBlXG4gICAqICAgICAgICAgSWYgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSwgaXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdHlwZShzKVxuICAgKiAgICAgICAgIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBsaXN0ZW5lci5cbiAgICpcbiAgICogICAgICAgICBBbm90aGVyIGV2ZW50ZWQgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaGVyZSBpbnN0ZWFkLCB3aGljaCB3aWxsXG4gICAqICAgICAgICAgY2F1c2UgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgZXZlbnRzIG9uIF90aGF0XyBvYmplY3QuXG4gICAqXG4gICAqICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoZSBsaXN0ZW5lcidzIGB0aGlzYCB2YWx1ZSB3aWxsIGJlIGJvdW5kIHRvXG4gICAqICAgICAgICAgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ3xBcnJheXxGdW5jdGlvbn0gdHlwZU9yTGlzdGVuZXJcbiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGEgc3RyaW5nIG9yIGFycmF5LCB0aGlzIHNob3VsZCBiZSB0aGVcbiAgICogICAgICAgICBsaXN0ZW5lciBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgc3RyaW5nIG9yIGFycmF5IG9mIGV2ZW50XG4gICAqICAgICAgICAgdHlwZShzKS5cbiAgICpcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IFtsaXN0ZW5lcl1cbiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGFub3RoZXIgZXZlbnRlZCBvYmplY3QsIHRoaXMgd2lsbCBiZVxuICAgKiAgICAgICAgIHRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICovXG4gIG9uOiBmdW5jdGlvbiBvbiQkMSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIF9ub3JtYWxpemVMaXN0ZW5BcmdzID0gbm9ybWFsaXplTGlzdGVuQXJncyh0aGlzLCBhcmdzKSxcbiAgICAgICAgaXNUYXJnZXRpbmdTZWxmID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MuaXNUYXJnZXRpbmdTZWxmLFxuICAgICAgICB0YXJnZXQgPSBfbm9ybWFsaXplTGlzdGVuQXJncy50YXJnZXQsXG4gICAgICAgIHR5cGUgPSBfbm9ybWFsaXplTGlzdGVuQXJncy50eXBlLFxuICAgICAgICBsaXN0ZW5lciA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzLmxpc3RlbmVyO1xuXG4gICAgbGlzdGVuKHRhcmdldCwgJ29uJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgbGlzdGVuaW5nIHRvIGFub3RoZXIgZXZlbnRlZCBvYmplY3QuXG4gICAgaWYgKCFpc1RhcmdldGluZ1NlbGYpIHtcblxuICAgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJPbkRpc3Bvc2UgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lck9uRGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9mZih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlciBpdFxuICAgICAgLy8gdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlLmd1aWQgPSBsaXN0ZW5lci5ndWlkO1xuXG4gICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byB0aGUgdGFyZ2V0J3MgZGlzcG9zZSBldmVudCBhcyB3ZWxsLiBUaGlzIGVuc3VyZXNcbiAgICAgIC8vIHRoYXQgaWYgdGhlIHRhcmdldCBpcyBkaXNwb3NlZCBCRUZPUkUgdGhpcyBvYmplY3QsIHdlIHJlbW92ZSB0aGVcbiAgICAgIC8vIHJlbW92YWwgbGlzdGVuZXIgdGhhdCB3YXMganVzdCBhZGRlZC4gT3RoZXJ3aXNlLCB3ZSBjcmVhdGUgYSBtZW1vcnkgbGVhay5cbiAgICAgIHZhciByZW1vdmVSZW1vdmVyT25UYXJnZXREaXNwb3NlID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9mZignZGlzcG9zZScsIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlclxuICAgICAgLy8gaXQgdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHJlbW92ZVJlbW92ZXJPblRhcmdldERpc3Bvc2UuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7XG5cbiAgICAgIGxpc3Rlbih0aGlzLCAnb24nLCAnZGlzcG9zZScsIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlKTtcbiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbicsICdkaXNwb3NlJywgcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSk7XG4gICAgfVxuICB9LFxuXG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IChvciBldmVudHMpIG9uIHRoaXMgb2JqZWN0IG9yIGFub3RoZXIgZXZlbnRlZFxuICAgKiBvYmplY3QuIFRoZSBsaXN0ZW5lciB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UgYW5kIHRoZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSB0YXJnZXRPclR5cGVcbiAgICogICAgICAgICBJZiB0aGlzIGlzIGEgc3RyaW5nIG9yIGFycmF5LCBpdCByZXByZXNlbnRzIHRoZSBldmVudCB0eXBlKHMpXG4gICAqICAgICAgICAgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGxpc3RlbmVyLlxuICAgKlxuICAgKiAgICAgICAgIEFub3RoZXIgZXZlbnRlZCBvYmplY3QgY2FuIGJlIHBhc3NlZCBoZXJlIGluc3RlYWQsIHdoaWNoIHdpbGxcbiAgICogICAgICAgICBjYXVzZSB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBldmVudHMgb24gX3RoYXRfIG9iamVjdC5cbiAgICpcbiAgICogICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhlIGxpc3RlbmVyJ3MgYHRoaXNgIHZhbHVlIHdpbGwgYmUgYm91bmQgdG9cbiAgICogICAgICAgICB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEZ1bmN0aW9ufSB0eXBlT3JMaXN0ZW5lclxuICAgKiAgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgYSBzdHJpbmcgb3IgYXJyYXksIHRoaXMgc2hvdWxkIGJlIHRoZVxuICAgKiAgICAgICAgIGxpc3RlbmVyIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgZXZlbnRcbiAgICogICAgICAgICB0eXBlKHMpLlxuICAgKlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW2xpc3RlbmVyXVxuICAgKiAgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgYW5vdGhlciBldmVudGVkIG9iamVjdCwgdGhpcyB3aWxsIGJlXG4gICAqICAgICAgICAgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgb25lOiBmdW5jdGlvbiBvbmUkJDEoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBfbm9ybWFsaXplTGlzdGVuQXJnczIgPSBub3JtYWxpemVMaXN0ZW5BcmdzKHRoaXMsIGFyZ3MpLFxuICAgICAgICBpc1RhcmdldGluZ1NlbGYgPSBfbm9ybWFsaXplTGlzdGVuQXJnczIuaXNUYXJnZXRpbmdTZWxmLFxuICAgICAgICB0YXJnZXQgPSBfbm9ybWFsaXplTGlzdGVuQXJnczIudGFyZ2V0LFxuICAgICAgICB0eXBlID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MyLnR5cGUsXG4gICAgICAgIGxpc3RlbmVyID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MyLmxpc3RlbmVyO1xuXG4gICAgLy8gVGFyZ2V0aW5nIHRoaXMgZXZlbnRlZCBvYmplY3QuXG5cblxuICAgIGlmIChpc1RhcmdldGluZ1NlbGYpIHtcbiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbmUnLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFRhcmdldGluZyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LlxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgbGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIGxhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIub2ZmKHRhcmdldCwgdHlwZSwgd3JhcHBlcik7XG4gICAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGxhcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlclxuICAgICAgLy8gaXQgdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHdyYXBwZXIuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7XG4gICAgICBsaXN0ZW4odGFyZ2V0LCAnb25lJywgdHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgbGlzdGVuZXIocykgZnJvbSBldmVudChzKSBvbiBhbiBldmVudGVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSBbdGFyZ2V0T3JUeXBlXVxuICAgKiAgICAgICAgIElmIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXksIGl0IHJlcHJlc2VudHMgdGhlIGV2ZW50IHR5cGUocykuXG4gICAqXG4gICAqICAgICAgICAgQW5vdGhlciBldmVudGVkIG9iamVjdCBjYW4gYmUgcGFzc2VkIGhlcmUgaW5zdGVhZCwgaW4gd2hpY2ggY2FzZVxuICAgKiAgICAgICAgIEFMTCAzIGFyZ3VtZW50cyBhcmUgX3JlcXVpcmVkXy5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBbdHlwZU9yTGlzdGVuZXJdXG4gICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhIHN0cmluZyBvciBhcnJheSwgdGhpcyBtYXkgYmUgdGhlXG4gICAqICAgICAgICAgbGlzdGVuZXIgZnVuY3Rpb24uIE90aGVyd2lzZSwgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSBvZiBldmVudFxuICAgKiAgICAgICAgIHR5cGUocykuXG4gICAqXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbbGlzdGVuZXJdXG4gICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LCB0aGlzIHdpbGwgYmVcbiAgICogICAgICAgICB0aGUgbGlzdGVuZXIgZnVuY3Rpb247IG90aGVyd2lzZSwgX2FsbF8gbGlzdGVuZXJzIGJvdW5kIHRvIHRoZVxuICAgKiAgICAgICAgIGV2ZW50IHR5cGUocykgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYkJDEodGFyZ2V0T3JUeXBlLCB0eXBlT3JMaXN0ZW5lciwgbGlzdGVuZXIpIHtcblxuICAgIC8vIFRhcmdldGluZyB0aGlzIGV2ZW50ZWQgb2JqZWN0LlxuICAgIGlmICghdGFyZ2V0T3JUeXBlIHx8IGlzVmFsaWRFdmVudFR5cGUodGFyZ2V0T3JUeXBlKSkge1xuICAgICAgb2ZmKHRoaXMuZXZlbnRCdXNFbF8sIHRhcmdldE9yVHlwZSwgdHlwZU9yTGlzdGVuZXIpO1xuXG4gICAgICAvLyBUYXJnZXRpbmcgYW5vdGhlciBldmVudGVkIG9iamVjdC5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhcmdldCA9IHRhcmdldE9yVHlwZTtcbiAgICAgIHZhciB0eXBlID0gdHlwZU9yTGlzdGVuZXI7XG5cbiAgICAgIC8vIEZhaWwgZmFzdCBhbmQgaW4gYSBtZWFuaW5nZnVsIHdheSFcbiAgICAgIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCk7XG4gICAgICB2YWxpZGF0ZUV2ZW50VHlwZSh0eXBlKTtcbiAgICAgIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlcmUncyBhdCBsZWFzdCBhIGd1aWQsIGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGhhc24ndCBiZWVuIHVzZWRcbiAgICAgIGxpc3RlbmVyID0gYmluZCh0aGlzLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgZGlzcG9zZSBsaXN0ZW5lciBvbiB0aGlzIGV2ZW50ZWQgb2JqZWN0LCB3aGljaCB3YXMgZ2l2ZW5cbiAgICAgIC8vIHRoZSBzYW1lIGd1aWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVyIGluIG9uKCkuXG4gICAgICB0aGlzLm9mZignZGlzcG9zZScsIGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZSkge1xuICAgICAgICBvZmYodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIG9mZih0YXJnZXQsICdkaXNwb3NlJywgbGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc0V2ZW50ZWQodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQub2ZmKHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgdGFyZ2V0Lm9mZignZGlzcG9zZScsIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cblxuICAvKipcbiAgICogRmlyZSBhbiBldmVudCBvbiB0aGlzIGV2ZW50ZWQgb2JqZWN0LCBjYXVzaW5nIGl0cyBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gICB7c3RyaW5nfE9iamVjdH0gZXZlbnRcbiAgICogICAgICAgICAgQW4gZXZlbnQgdHlwZSBvciBhbiBvYmplY3Qgd2l0aCBhIHR5cGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtPYmplY3R9IFtoYXNoXVxuICAgKiAgICAgICAgICBBbiBhZGRpdGlvbmFsIG9iamVjdCB0byBwYXNzIGFsb25nIHRvIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdhcyBwcmV2ZW50ZWQuXG4gICAqL1xuICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyJCQxKGV2ZW50LCBoYXNoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIodGhpcy5ldmVudEJ1c0VsXywgZXZlbnQsIGhhc2gpO1xuICB9XG59O1xuXG4vKipcbiAqIEFwcGxpZXMge0BsaW5rIG1vZHVsZTpldmVudGVkfkV2ZW50ZWRNaXhpbnxFdmVudGVkTWl4aW59IHRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogICAgICAgICBUaGUgb2JqZWN0IHRvIHdoaWNoIHRvIGFkZCBldmVudCBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gW29wdGlvbnM9e31dXG4gKiAgICAgICAgIE9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBtaXhpbiBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFtvcHRpb25zLmV2ZW50QnVzS2V5XVxuICogICAgICAgICBCeSBkZWZhdWx0LCBhZGRzIGEgYGV2ZW50QnVzRWxfYCBET00gZWxlbWVudCB0byB0aGUgdGFyZ2V0IG9iamVjdCxcbiAqICAgICAgICAgd2hpY2ggaXMgdXNlZCBhcyBhbiBldmVudCBidXMuIElmIHRoZSB0YXJnZXQgb2JqZWN0IGFscmVhZHkgaGFzIGFcbiAqICAgICAgICAgRE9NIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCwgcGFzcyBpdHMga2V5IGhlcmUuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBUaGUgdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXZlbnRlZCh0YXJnZXQpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXZlbnRCdXNLZXkgPSBvcHRpb25zLmV2ZW50QnVzS2V5O1xuXG4gIC8vIFNldCBvciBjcmVhdGUgdGhlIGV2ZW50QnVzRWxfLlxuXG4gIGlmIChldmVudEJ1c0tleSkge1xuICAgIGlmICghdGFyZ2V0W2V2ZW50QnVzS2V5XS5ub2RlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZXZlbnRCdXNLZXkgXCInICsgZXZlbnRCdXNLZXkgKyAnXCIgZG9lcyBub3QgcmVmZXIgdG8gYW4gZWxlbWVudC4nKTtcbiAgICB9XG4gICAgdGFyZ2V0LmV2ZW50QnVzRWxfID0gdGFyZ2V0W2V2ZW50QnVzS2V5XTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuZXZlbnRCdXNFbF8gPSBjcmVhdGVFbCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndmpzLWV2ZW50LWJ1cycgfSk7XG4gIH1cblxuICBhc3NpZ24odGFyZ2V0LCBFdmVudGVkTWl4aW4pO1xuXG4gIC8vIFdoZW4gYW55IGV2ZW50ZWQgb2JqZWN0IGlzIGRpc3Bvc2VkLCBpdCByZW1vdmVzIGFsbCBpdHMgbGlzdGVuZXJzLlxuICB0YXJnZXQub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGFyZ2V0Lm9mZigpO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRhcmdldC5ldmVudEJ1c0VsXyA9IG51bGw7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogQGZpbGUgbWl4aW5zL3N0YXRlZnVsLmpzXG4gKiBAbW9kdWxlIHN0YXRlZnVsXG4gKi9cbi8qKlxuICogQ29udGFpbnMgbWV0aG9kcyB0aGF0IHByb3ZpZGUgc3RhdGVmdWxuZXNzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWRcbiAqIHRvIHtAbGluayBtb2R1bGU6c3RhdGVmdWx9LlxuICpcbiAqIEBtaXhpbiBTdGF0ZWZ1bE1peGluXG4gKi9cbnZhciBTdGF0ZWZ1bE1peGluID0ge1xuXG4gIC8qKlxuICAgKiBBIGhhc2ggY29udGFpbmluZyBhcmJpdHJhcnkga2V5cyBhbmQgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2ZcbiAgICogdGhlIG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRlOiB7fSxcblxuICAvKipcbiAgICogU2V0IHRoZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkgbXV0YXRpbmcgaXRzXG4gICAqIHtAbGluayBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbi5zdGF0ZXxzdGF0ZX0gb2JqZWN0IGluIHBsYWNlLlxuICAgKlxuICAgKiBAZmlyZXMgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbiNzdGF0ZWNoYW5nZWRcbiAgICogQHBhcmFtICAge09iamVjdHxGdW5jdGlvbn0gc3RhdGVVcGRhdGVzXG4gICAqICAgICAgICAgIEEgbmV3IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHNoYWxsb3ctbWVyZ2UgaW50byB0aGUgcGx1Z2luIHN0YXRlLlxuICAgKiAgICAgICAgICBDYW4gYmUgYSBwbGFpbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBwbGFpbiBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQuIElmIG5vIGNoYW5nZXNcbiAgICogICAgICAgICAgb2NjdXJyZWQsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBzZXRTdGF0ZTogZnVuY3Rpb24gc2V0U3RhdGUoc3RhdGVVcGRhdGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIFN1cHBvcnQgcHJvdmlkaW5nIHRoZSBgc3RhdGVVcGRhdGVzYCBzdGF0ZSBhcyBhIGZ1bmN0aW9uLlxuICAgIGlmICh0eXBlb2Ygc3RhdGVVcGRhdGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZVVwZGF0ZXMgPSBzdGF0ZVVwZGF0ZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhbmdlcyA9IHZvaWQgMDtcblxuICAgIGVhY2goc3RhdGVVcGRhdGVzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuXG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYW5nZSBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gd2hhdCdzIGluIHRoZVxuICAgICAgLy8gY3VycmVudCBzdGF0ZS5cbiAgICAgIGlmIChfdGhpcy5zdGF0ZVtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcyB8fCB7fTtcbiAgICAgICAgY2hhbmdlc1trZXldID0ge1xuICAgICAgICAgIGZyb206IF90aGlzLnN0YXRlW2tleV0sXG4gICAgICAgICAgdG86IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgdHJpZ2dlciBcInN0YXRlY2hhbmdlXCIgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzIEFORCB3ZSBoYXZlIGEgdHJpZ2dlclxuICAgIC8vIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyB1cyB0byBub3QgcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGJlIGFuXG4gICAgLy8gZXZlbnRlZCBvYmplY3QuXG4gICAgaWYgKGNoYW5nZXMgJiYgaXNFdmVudGVkKHRoaXMpKSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogQW4gZXZlbnQgdHJpZ2dlcmVkIG9uIGFuIG9iamVjdCB0aGF0IGlzIGJvdGhcbiAgICAgICAqIHtAbGluayBtb2R1bGU6c3RhdGVmdWx8c3RhdGVmdWx9IGFuZCB7QGxpbmsgbW9kdWxlOmV2ZW50ZWR8ZXZlbnRlZH1cbiAgICAgICAqIGluZGljYXRpbmcgdGhhdCBpdHMgc3RhdGUgaGFzIGNoYW5nZWQuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50ICAgIG1vZHVsZTpzdGF0ZWZ1bH5TdGF0ZWZ1bE1peGluI3N0YXRlY2hhbmdlZFxuICAgICAgICogQHR5cGUgICAgIHtPYmplY3R9XG4gICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY2hhbmdlc1xuICAgICAgICogICAgICAgICAgIEEgaGFzaCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBjaGFuZ2VkIGFuZFxuICAgICAgICogICAgICAgICAgIHRoZSB2YWx1ZXMgdGhleSB3ZXJlIGNoYW5nZWQgYGZyb21gIGFuZCBgdG9gLlxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgICAgICB0eXBlOiAnc3RhdGVjaGFuZ2VkJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cbn07XG5cbi8qKlxuICogQXBwbGllcyB7QGxpbmsgbW9kdWxlOnN0YXRlZnVsflN0YXRlZnVsTWl4aW58U3RhdGVmdWxNaXhpbn0gdG8gYSB0YXJnZXRcbiAqIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgdGFyZ2V0IG9iamVjdCBpcyB7QGxpbmsgbW9kdWxlOmV2ZW50ZWR8ZXZlbnRlZH0gYW5kIGhhcyBhXG4gKiBgaGFuZGxlU3RhdGVDaGFuZ2VkYCBtZXRob2QsIHRoYXQgbWV0aG9kIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGVcbiAqIGBzdGF0ZWNoYW5nZWRgIGV2ZW50IG9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0gICB7T2JqZWN0fSB0YXJnZXRcbiAqICAgICAgICAgIFRoZSBvYmplY3QgdG8gYmUgbWFkZSBzdGF0ZWZ1bC5cbiAqXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBbZGVmYXVsdFN0YXRlXVxuICogICAgICAgICAgQSBkZWZhdWx0IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHBvcHVsYXRlIHRoZSBuZXdseS1zdGF0ZWZ1bCBvYmplY3Qnc1xuICogICAgICAgICAgYHN0YXRlYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICogICAgICAgICAgUmV0dXJucyB0aGUgYHRhcmdldGAuXG4gKi9cbmZ1bmN0aW9uIHN0YXRlZnVsKHRhcmdldCwgZGVmYXVsdFN0YXRlKSB7XG4gIGFzc2lnbih0YXJnZXQsIFN0YXRlZnVsTWl4aW4pO1xuXG4gIC8vIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgbWl4aW5nLWluIGJlY2F1c2Ugd2UgbmVlZCB0byByZXBsYWNlIHRoZSBgc3RhdGVgXG4gIC8vIGFkZGVkIGluIHRoYXQgc3RlcC5cbiAgdGFyZ2V0LnN0YXRlID0gYXNzaWduKHt9LCB0YXJnZXQuc3RhdGUsIGRlZmF1bHRTdGF0ZSk7XG5cbiAgLy8gQXV0by1iaW5kIHRoZSBgaGFuZGxlU3RhdGVDaGFuZ2VkYCBtZXRob2Qgb2YgdGhlIHRhcmdldCBvYmplY3QgaWYgaXQgZXhpc3RzLlxuICBpZiAodHlwZW9mIHRhcmdldC5oYW5kbGVTdGF0ZUNoYW5nZWQgPT09ICdmdW5jdGlvbicgJiYgaXNFdmVudGVkKHRhcmdldCkpIHtcbiAgICB0YXJnZXQub24oJ3N0YXRlY2hhbmdlZCcsIHRhcmdldC5oYW5kbGVTdGF0ZUNoYW5nZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqXG4gKiBAZmlsZSB0by10aXRsZS1jYXNlLmpzXG4gKiBAbW9kdWxlIHRvLXRpdGxlLWNhc2VcbiAqL1xuXG4vKipcbiAqIFVwcGVyY2FzZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqICAgICAgICBTdHJpbmcgdG8gYmUgdXBwZXJjYXNlZFxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIHN0cmluZyB3aXRoIGFuIHVwcGVyY2FzZWQgZmlyc3QgbGV0dGVyXG4gKi9cbmZ1bmN0aW9uIHRvVGl0bGVDYXNlKHN0cmluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgVGl0bGVDYXNlIHZlcnNpb25zIG9mIHRoZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cjFcbiAqICAgICAgICBUaGUgZmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyMlxuICogICAgICAgIFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICBXaGV0aGVyIHRoZSBUaXRsZUNhc2UgdmVyc2lvbnMgb2YgdGhlIHN0cmluZ3MgYXJlIGVxdWFsXG4gKi9cbmZ1bmN0aW9uIHRpdGxlQ2FzZUVxdWFscyhzdHIxLCBzdHIyKSB7XG4gIHJldHVybiB0b1RpdGxlQ2FzZShzdHIxKSA9PT0gdG9UaXRsZUNhc2Uoc3RyMik7XG59XG5cbi8qKlxuICogQGZpbGUgbWVyZ2Utb3B0aW9ucy5qc1xuICogQG1vZHVsZSBtZXJnZS1vcHRpb25zXG4gKi9cbi8qKlxuICogRGVlcC1tZXJnZSBvbmUgb3IgbW9yZSBvcHRpb25zIG9iamVjdHMsIHJlY3Vyc2l2ZWx5IG1lcmdpbmcgKipvbmx5KiogcGxhaW5cbiAqIG9iamVjdCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSAgIHtPYmplY3RbXX0gc291cmNlc1xuICogICAgICAgICAgT25lIG9yIG1vcmUgb2JqZWN0cyB0byBtZXJnZSBpbnRvIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICogICAgICAgICAgQSBuZXcgb2JqZWN0IHRoYXQgaXMgdGhlIG1lcmdlZCByZXN1bHQgb2YgYWxsIHNvdXJjZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucygpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlYWNoKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICghaXNQbGFpbih2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzUGxhaW4ocmVzdWx0W2tleV0pKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ge307XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VPcHRpb25zKHJlc3VsdFtrZXldLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGxheWVyIENvbXBvbmVudCAtIEJhc2UgY2xhc3MgZm9yIGFsbCBVSSBvYmplY3RzXG4gKlxuICogQGZpbGUgY29tcG9uZW50LmpzXG4gKi9cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIFVJIENvbXBvbmVudHMuXG4gKiBDb21wb25lbnRzIGFyZSBVSSBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCBib3RoIGEgamF2YXNjcmlwdCBvYmplY3QgYW5kIGFuIGVsZW1lbnRcbiAqIGluIHRoZSBET00uIFRoZXkgY2FuIGJlIGNoaWxkcmVuIG9mIG90aGVyIGNvbXBvbmVudHMsIGFuZCBjYW4gaGF2ZVxuICogY2hpbGRyZW4gdGhlbXNlbHZlcy5cbiAqXG4gKiBDb21wb25lbnRzIGNhbiBhbHNvIHVzZSBtZXRob2RzIGZyb20ge0BsaW5rIEV2ZW50VGFyZ2V0fVxuICovXG5cbnZhciBDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyByZWFkeS4gRG9lcyBub3QgaGF2ZSBhbnlcbiAgICogcGFyYW10ZXJzIGFuZCBhbnkgY2FsbGJhY2sgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ29tcG9uZW50flJlYWR5Q2FsbGJhY2tcbiAgICogQHRoaXMgQ29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5jaGlsZHJlbl1cbiAgICogICAgICAgIEFuIGFycmF5IG9mIGNoaWxkcmVuIG9iamVjdHMgdG8gaW50aWFsaXplIHRoaXMgY29tcG9uZW50IHdpdGguIENoaWxkcmVuIG9iamVjdHMgaGF2ZVxuICAgKiAgICAgICAgYSBuYW1lIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGlmIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50IG9mIHRoZSBzYW1lIHR5cGUgbmVlZHMgdG8gYmVcbiAgICogICAgICAgIGFkZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldXG4gICAqICAgICAgICBGdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGBDb21wb25lbnRgIGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gQ29tcG9uZW50KHBsYXllciwgb3B0aW9ucywgcmVhZHkpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xuXG5cbiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGJlIHRoZSBwbGF5ZXIgaXRzZWxmIGFuZCB3ZSBjYW4ndCBwYXNzIGB0aGlzYCB0byBzdXBlclxuICAgIGlmICghcGxheWVyICYmIHRoaXMucGxheSkge1xuICAgICAgdGhpcy5wbGF5ZXJfID0gcGxheWVyID0gdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8gPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgcHJvdG90eXBlLm9wdGlvbnNfIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVycmlkaW5nIGRlZmF1bHRzXG4gICAgdGhpcy5vcHRpb25zXyA9IG1lcmdlT3B0aW9ucyh7fSwgdGhpcy5vcHRpb25zXyk7XG5cbiAgICAvLyBVcGRhdGVkIG9wdGlvbnMgd2l0aCBzdXBwbGllZCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb3B0aW9ucyk7XG5cbiAgICAvLyBHZXQgSUQgZnJvbSBvcHRpb25zIG9yIG9wdGlvbnMgZWxlbWVudCBpZiBvbmUgaXMgc3VwcGxpZWRcbiAgICB0aGlzLmlkXyA9IG9wdGlvbnMuaWQgfHwgb3B0aW9ucy5lbCAmJiBvcHRpb25zLmVsLmlkO1xuXG4gICAgLy8gSWYgdGhlcmUgd2FzIG5vIElEIGZyb20gdGhlIG9wdGlvbnMsIGdlbmVyYXRlIG9uZVxuICAgIGlmICghdGhpcy5pZF8pIHtcbiAgICAgIC8vIERvbid0IHJlcXVpcmUgdGhlIHBsYXllciBJRCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZiBtb2NrIHBsYXllcnNcbiAgICAgIHZhciBpZCA9IHBsYXllciAmJiBwbGF5ZXIuaWQgJiYgcGxheWVyLmlkKCkgfHwgJ25vX3BsYXllcic7XG5cbiAgICAgIHRoaXMuaWRfID0gaWQgKyAnX2NvbXBvbmVudF8nICsgbmV3R1VJRCgpO1xuICAgIH1cblxuICAgIHRoaXMubmFtZV8gPSBvcHRpb25zLm5hbWUgfHwgbnVsbDtcblxuICAgIC8vIENyZWF0ZSBlbGVtZW50IGlmIG9uZSB3YXNuJ3QgcHJvdmlkZWQgaW4gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zLmVsKSB7XG4gICAgICB0aGlzLmVsXyA9IG9wdGlvbnMuZWw7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmNyZWF0ZUVsICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbF8gPSB0aGlzLmNyZWF0ZUVsKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgZXZlbnRlZCBpcyBhbnl0aGluZyBleGNlcHQgZmFsc2UsIHdlIHdhbnQgdG8gbWl4aW4gaW4gZXZlbnRlZFxuICAgIGlmIChvcHRpb25zLmV2ZW50ZWQgIT09IGZhbHNlKSB7XG4gICAgICAvLyBNYWtlIHRoaXMgYW4gZXZlbnRlZCBvYmplY3QgYW5kIHVzZSBgZWxfYCwgaWYgYXZhaWxhYmxlLCBhcyBpdHMgZXZlbnQgYnVzXG4gICAgICBldmVudGVkKHRoaXMsIHsgZXZlbnRCdXNLZXk6IHRoaXMuZWxfID8gJ2VsXycgOiBudWxsIH0pO1xuICAgIH1cbiAgICBzdGF0ZWZ1bCh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRTdGF0ZSk7XG5cbiAgICB0aGlzLmNoaWxkcmVuXyA9IFtdO1xuICAgIHRoaXMuY2hpbGRJbmRleF8gPSB7fTtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IHt9O1xuXG4gICAgLy8gQWRkIGFueSBjaGlsZCBjb21wb25lbnRzIGluIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucy5pbml0Q2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmluaXRDaGlsZHJlbigpO1xuICAgIH1cblxuICAgIHRoaXMucmVhZHkocmVhZHkpO1xuICAgIC8vIERvbid0IHdhbnQgdG8gdHJpZ2dlciByZWFkeSBoZXJlIG9yIGl0IHdpbGwgYmVmb3JlIGluaXQgaXMgYWN0dWFsbHlcbiAgICAvLyBmaW5pc2hlZCBmb3IgYWxsIGNoaWxkcmVuIHRoYXQgcnVuIHRoaXMgY29uc3RydWN0b3JcblxuICAgIGlmIChvcHRpb25zLnJlcG9ydFRvdWNoQWN0aXZpdHkgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmVuYWJsZVRvdWNoQWN0aXZpdHkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGUgYENvbXBvbmVudGAgYW5kIGFsbCBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAZmlyZXMgQ29tcG9uZW50I2Rpc3Bvc2VcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBgQ29tcG9uZW50YCBpcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBDb21wb25lbnQjZGlzcG9zZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdXG4gICAgICogICAgICAgICAgIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZSBjbG9zZSBldmVudCBkb2VzIG5vdFxuICAgICAqICAgICAgICAgICBidWJibGUgdXBcbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAnZGlzcG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pO1xuXG4gICAgLy8gRGlzcG9zZSBhbGwgY2hpbGRyZW4uXG4gICAgaWYgKHRoaXMuY2hpbGRyZW5fKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5fW2ldLmRpc3Bvc2UpIHtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuX1tpXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGUgY2hpbGQgcmVmZXJlbmNlc1xuICAgIHRoaXMuY2hpbGRyZW5fID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkSW5kZXhfID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5lbF8pIHtcbiAgICAgIC8vIFJlbW92ZSBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAodGhpcy5lbF8ucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmVsXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxfKTtcbiAgICAgIH1cblxuICAgICAgcmVtb3ZlRGF0YSh0aGlzLmVsXyk7XG4gICAgICB0aGlzLmVsXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyIGFmdGVyIGRpc3Bvc2luZyBvZiB0aGUgZWxlbWVudFxuICAgIHRoaXMucGxheWVyXyA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUge0BsaW5rIFBsYXllcn0gdGhhdCB0aGUgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9XG4gICAqICAgICAgICAgVGhlIHBsYXllciB0aGF0IHRoaXMgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucGxheWVyID0gZnVuY3Rpb24gcGxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllcl87XG4gIH07XG5cbiAgLyoqXG4gICAqIERlZXAgbWVyZ2Ugb2Ygb3B0aW9ucyBvYmplY3RzIHdpdGggbmV3IG9wdGlvbnMuXG4gICAqID4gTm90ZTogV2hlbiBib3RoIGBvYmpgIGFuZCBgb3B0aW9uc2AgY29udGFpbiBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgb2JqZWN0cy5cbiAgICogICAgICAgICBUaGUgdHdvIHByb3BlcnRpZXMgZ2V0IG1lcmdlZCB1c2luZyB7QGxpbmsgbW9kdWxlOm1lcmdlT3B0aW9uc31cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiAgICAgICAgVGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5ldyBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgQSBuZXcgb2JqZWN0IG9mIGB0aGlzLm9wdGlvbnNfYCBhbmQgYG9iamAgbWVyZ2VkIHRvZ2V0aGVyLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDVcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbiBvcHRpb25zKG9iaikge1xuICAgIGxvZyQxLndhcm4oJ3RoaXMub3B0aW9ucygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluIDYuMCcpO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNfO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb2JqKTtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zXztcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBgQ29tcG9uZW50YHMgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgYENvbXBvbmVudGAuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbCA9IGZ1bmN0aW9uIGVsKCkge1xuICAgIHJldHVybiB0aGlzLmVsXztcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnTmFtZV1cbiAgICogICAgICAgIEVsZW1lbnQncyBET00gbm9kZSB0eXBlLiBlLmcuICdkaXYnXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzXVxuICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSh0YWdOYW1lLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKHRhZ05hbWUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMb2NhbGl6ZSBhIHN0cmluZyBnaXZlbiB0aGUgc3RyaW5nIGluIGVuZ2xpc2guXG4gICAqXG4gICAqIElmIHRva2VucyBhcmUgcHJvdmlkZWQsIGl0J2xsIHRyeSBhbmQgcnVuIGEgc2ltcGxlIHRva2VuIHJlcGxhY2VtZW50IG9uIHRoZSBwcm92aWRlZCBzdHJpbmcuXG4gICAqIFRoZSB0b2tlbnMgaXQgbG9va3MgZm9yIGxvb2sgbGlrZSBgezF9YCB3aXRoIHRoZSBpbmRleCBiZWluZyAxLWluZGV4ZWQgaW50byB0aGUgdG9rZW5zIGFycmF5LlxuICAgKlxuICAgKiBJZiBhIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBpdCdsbCB1c2UgdGhhdCBvdmVyIGBzdHJpbmdgLFxuICAgKiBpZiBhIHZhbHVlIGlzbid0IGZvdW5kIGluIHByb3ZpZGVkIGxhbmd1YWdlIGZpbGVzLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGVzY3JpcHRpdmUga2V5IGZvciB0b2tlbiByZXBsYWNlbWVudFxuICAgKiBidXQgaGF2ZSBhIHN1Y2NpbmN0IGxvY2FsaXplZCBzdHJpbmcgYW5kIG5vdCByZXF1aXJlIGBlbi5qc29uYCB0byBiZSBpbmNsdWRlZC5cbiAgICpcbiAgICogQ3VycmVudGx5LCBpdCBpcyB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyIHRpbWluZy5cbiAgICogYGBganNcbiAgICoge1xuICAgKiAgIFwicHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uPXsyfVwiOiBcInsxfSBvZiB7Mn1cIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJdCBpcyB0aGVuIHVzZWQgbGlrZSBzbzpcbiAgICogYGBganNcbiAgICogdGhpcy5sb2NhbGl6ZSgncHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uezJ9JyxcbiAgICogICAgICAgICAgICAgICBbdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCksIHRoaXMucGxheWVyXy5kdXJhdGlvbigpXSxcbiAgICogICAgICAgICAgICAgICAnezF9IG9mIHsyfScpO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2hpY2ggb3V0cHV0cyBzb21ldGhpbmcgbGlrZTogYDAxOjIzIG9mIDI0OjU2YC5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiAgICAgICAgVGhlIHN0cmluZyB0byBsb2NhbGl6ZSBhbmQgdGhlIGtleSB0byBsb29rdXAgaW4gdGhlIGxhbmd1YWdlIGZpbGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdG9rZW5zXVxuICAgKiAgICAgICAgSWYgdGhlIGN1cnJlbnQgaXRlbSBoYXMgdG9rZW4gcmVwbGFjZW1lbnRzLCBwcm92aWRlIHRoZSB0b2tlbnMgaGVyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZWZhdWx0VmFsdWVdXG4gICAqICAgICAgICBEZWZhdWx0cyB0byBgc3RyaW5nYC4gQ2FuIGJlIGEgZGVmYXVsdCB2YWx1ZSB0byB1c2UgZm9yIHRva2VuIHJlcGxhY2VtZW50XG4gICAqICAgICAgICBpZiB0aGUgbG9va3VwIGtleSBpcyBuZWVkZWQgdG8gYmUgc2VwYXJhdGUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgbG9jYWxpemVkIHN0cmluZyBvciBpZiBubyBsb2NhbGl6YXRpb24gZXhpc3RzIHRoZSBlbmdsaXNoIHN0cmluZy5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmxvY2FsaXplID0gZnVuY3Rpb24gbG9jYWxpemUoc3RyaW5nLCB0b2tlbnMpIHtcbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBzdHJpbmc7XG5cbiAgICB2YXIgY29kZSA9IHRoaXMucGxheWVyXy5sYW5ndWFnZSAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2UoKTtcbiAgICB2YXIgbGFuZ3VhZ2VzID0gdGhpcy5wbGF5ZXJfLmxhbmd1YWdlcyAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2VzKCk7XG4gICAgdmFyIGxhbmd1YWdlID0gbGFuZ3VhZ2VzICYmIGxhbmd1YWdlc1tjb2RlXTtcbiAgICB2YXIgcHJpbWFyeUNvZGUgPSBjb2RlICYmIGNvZGUuc3BsaXQoJy0nKVswXTtcbiAgICB2YXIgcHJpbWFyeUxhbmcgPSBsYW5ndWFnZXMgJiYgbGFuZ3VhZ2VzW3ByaW1hcnlDb2RlXTtcblxuICAgIHZhciBsb2NhbGl6ZWRTdHJpbmcgPSBkZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAobGFuZ3VhZ2UgJiYgbGFuZ3VhZ2Vbc3RyaW5nXSkge1xuICAgICAgbG9jYWxpemVkU3RyaW5nID0gbGFuZ3VhZ2Vbc3RyaW5nXTtcbiAgICB9IGVsc2UgaWYgKHByaW1hcnlMYW5nICYmIHByaW1hcnlMYW5nW3N0cmluZ10pIHtcbiAgICAgIGxvY2FsaXplZFN0cmluZyA9IHByaW1hcnlMYW5nW3N0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRva2Vucykge1xuICAgICAgbG9jYWxpemVkU3RyaW5nID0gbG9jYWxpemVkU3RyaW5nLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRva2Vuc1tpbmRleCAtIDFdO1xuICAgICAgICB2YXIgcmV0ID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXQgPSBtYXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxpemVkU3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGBDb21wb25lbnRgcyBET00gZWxlbWVudC4gVGhpcyBpcyB3aGVyZSBjaGlsZHJlbiBnZXQgaW5zZXJ0ZWQuXG4gICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCByZXR1cm5lZCBpbiB7QGxpbmsgQ29tcG9uZW50I2VsfS5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgY29udGVudCBlbGVtZW50IGZvciB0aGlzIGBDb21wb25lbnRgLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY29udGVudEVsID0gZnVuY3Rpb24gY29udGVudEVsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRFbF8gfHwgdGhpcy5lbF87XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGlzIGBDb21wb25lbnRgcyBJRFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGlkIG9mIHRoaXMgYENvbXBvbmVudGBcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGBDb21wb25lbnRgcyBuYW1lLiBUaGUgbmFtZSBnZXRzIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBgQ29tcG9uZW50YFxuICAgKiBhbmQgaXMgc2V0IGR1cmluZyByZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgbmFtZSBvZiB0aGlzIGBDb21wb25lbnRgLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZV87XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBhbGwgY2hpbGQgY29tcG9uZW50c1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICogICAgICAgICBUaGUgY2hpbGRyZW5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5fO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBgQ29tcG9uZW50YCB3aXRoIHRoZSBnaXZlbiBgaWRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgY2hpbGQgYENvbXBvbmVudGAgdG8gZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIFRoZSBjaGlsZCBgQ29tcG9uZW50YCB3aXRoIHRoZSBnaXZlbiBgaWRgIG9yIHVuZGVmaW5lZC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkQnlJZCA9IGZ1bmN0aW9uIGdldENoaWxkQnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkSW5kZXhfW2lkXTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIGBDb21wb25lbnRgIHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAgICogICAgICAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgIG9yIHVuZGVmaW5lZC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gZ2V0Q2hpbGQobmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5hbWUgPSB0b1RpdGxlQ2FzZShuYW1lKTtcblxuICAgIHJldHVybiB0aGlzLmNoaWxkTmFtZUluZGV4X1tuYW1lXTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2hpbGQgYENvbXBvbmVudGAgaW5zaWRlIHRoZSBjdXJyZW50IGBDb21wb25lbnRgLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xDb21wb25lbnR9IGNoaWxkXG4gICAqICAgICAgICBUaGUgbmFtZSBvciBpbnN0YW5jZSBvZiBhIGNoaWxkIHRvIGFkZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBvcHRpb25zIHRoYXQgd2lsbCBnZXQgcGFzc2VkIHRvIGNoaWxkcmVuIG9mXG4gICAqICAgICAgICB0aGUgY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9dGhpcy5jaGlsZHJlbl8ubGVuZ3RoXVxuICAgKiAgICAgICAgVGhlIGluZGV4IHRvIGF0dGVtcHQgdG8gYWRkIGEgY2hpbGQgaW50by5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiAgICAgICAgIFRoZSBgQ29tcG9uZW50YCB0aGF0IGdldHMgYWRkZWQgYXMgYSBjaGlsZC4gV2hlbiB1c2luZyBhIHN0cmluZyB0aGVcbiAgICogICAgICAgICBgQ29tcG9uZW50YCB3aWxsIGdldCBjcmVhdGVkIGJ5IHRoaXMgcHJvY2Vzcy5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0aGlzLmNoaWxkcmVuXy5sZW5ndGg7XG5cbiAgICB2YXIgY29tcG9uZW50ID0gdm9pZCAwO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gdm9pZCAwO1xuXG4gICAgLy8gSWYgY2hpbGQgaXMgYSBzdHJpbmcsIGNyZWF0ZSBjb21wb25lbnQgd2l0aCBvcHRpb25zXG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0b1RpdGxlQ2FzZShjaGlsZCk7XG5cbiAgICAgIHZhciBjb21wb25lbnRDbGFzc05hbWUgPSBvcHRpb25zLmNvbXBvbmVudENsYXNzIHx8IGNvbXBvbmVudE5hbWU7XG5cbiAgICAgIC8vIFNldCBuYW1lIHRocm91Z2ggb3B0aW9uc1xuICAgICAgb3B0aW9ucy5uYW1lID0gY29tcG9uZW50TmFtZTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCAmIGVsZW1lbnQgZm9yIHRoaXMgY29udHJvbHMgc2V0XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIC5wbGF5ZXJfLCB0aGlzIGlzIGEgcGxheWVyXG4gICAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGNvbXBvbmVudENsYXNzTmFtZSk7XG5cbiAgICAgIGlmICghQ29tcG9uZW50Q2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgJyArIGNvbXBvbmVudENsYXNzTmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgIH1cblxuICAgICAgLy8gZGF0YSBzdG9yZWQgZGlyZWN0bHkgb24gdGhlIHZpZGVvanMgb2JqZWN0IG1heSBiZVxuICAgICAgLy8gbWlzaWRlbnRpZmllZCBhcyBhIGNvbXBvbmVudCB0byByZXRhaW5cbiAgICAgIC8vIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggNC54LiBjaGVjayB0byBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb21wb25lbnQgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZC5cbiAgICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRDbGFzcyh0aGlzLnBsYXllcl8gfHwgdGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIGNoaWxkIGlzIGEgY29tcG9uZW50IGluc3RhbmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudCA9IGNoaWxkO1xuICAgIH1cblxuICAgIHRoaXMuY2hpbGRyZW5fLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTtcblxuICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmNoaWxkSW5kZXhfW2NvbXBvbmVudC5pZCgpXSA9IGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIG5hbWUgd2Fzbid0IHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQsIGNoZWNrIGlmIHdlIGNhbiB1c2UgdGhlXG4gICAgLy8gbmFtZSBmdW5jdGlvbiBvZiB0aGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgY29tcG9uZW50Lm5hbWUgJiYgdG9UaXRsZUNhc2UoY29tcG9uZW50Lm5hbWUoKSk7XG5cbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50TmFtZV0gPSBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBVSSBvYmplY3QncyBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgZGl2IChib3gpXG4gICAgLy8gSGF2aW5nIGFuIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZWwgPT09ICdmdW5jdGlvbicgJiYgY29tcG9uZW50LmVsKCkpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gdGhpcy5jb250ZW50RWwoKS5jaGlsZHJlbjtcbiAgICAgIHZhciByZWZOb2RlID0gY2hpbGROb2Rlc1tpbmRleF0gfHwgbnVsbDtcblxuICAgICAgdGhpcy5jb250ZW50RWwoKS5pbnNlcnRCZWZvcmUoY29tcG9uZW50LmVsKCksIHJlZk5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBzbyBpdCBjYW4gc3RvcmVkIG9uIHBhcmVudCBvYmplY3QgaWYgZGVzaXJlZC5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBgQ29tcG9uZW50YCBmcm9tIHRoaXMgYENvbXBvbmVudGBzIGxpc3Qgb2YgY2hpbGRyZW4uIEFsc28gcmVtb3Zlc1xuICAgKiB0aGUgY2hpbGQgYENvbXBvbmVudGBzIGVsZW1lbnQgZnJvbSB0aGlzIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50XG4gICAqICAgICAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgdG8gcmVtb3ZlLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZChjb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbXBvbmVudCA9IHRoaXMuZ2V0Q2hpbGQoY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5jaGlsZHJlbl8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRGb3VuZCA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuY2hpbGRyZW5fLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbl9baV0gPT09IGNvbXBvbmVudCkge1xuICAgICAgICBjaGlsZEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbl8uc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkRm91bmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkSW5kZXhfW2NvbXBvbmVudC5pZCgpXSA9IG51bGw7XG4gICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50Lm5hbWUoKV0gPSBudWxsO1xuXG4gICAgdmFyIGNvbXBFbCA9IGNvbXBvbmVudC5lbCgpO1xuXG4gICAgaWYgKGNvbXBFbCAmJiBjb21wRWwucGFyZW50Tm9kZSA9PT0gdGhpcy5jb250ZW50RWwoKSkge1xuICAgICAgdGhpcy5jb250ZW50RWwoKS5yZW1vdmVDaGlsZChjb21wb25lbnQuZWwoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYW5kIGluaXRpYWxpemUgZGVmYXVsdCBjaGlsZCBgQ29tcG9uZW50YHMgYmFzZWQgdXBvbiBvcHRpb25zLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdENoaWxkcmVuID0gZnVuY3Rpb24gaW5pdENoaWxkcmVuKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLm9wdGlvbnNfLmNoaWxkcmVuO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAvLyBgdGhpc2AgaXMgYHBhcmVudGBcbiAgICAgIHZhciBwYXJlbnRPcHRpb25zID0gdGhpcy5vcHRpb25zXztcblxuICAgICAgdmFyIGhhbmRsZUFkZCA9IGZ1bmN0aW9uIGhhbmRsZUFkZChjaGlsZCkge1xuICAgICAgICB2YXIgbmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgIHZhciBvcHRzID0gY2hpbGQub3B0cztcblxuICAgICAgICAvLyBBbGxvdyBvcHRpb25zIGZvciBjaGlsZHJlbiB0byBiZSBzZXQgYXQgdGhlIHBhcmVudCBvcHRpb25zXG4gICAgICAgIC8vIGUuZy4gdmlkZW9qcyhpZCwgeyBjb250cm9sQmFyOiBmYWxzZSB9KTtcbiAgICAgICAgLy8gaW5zdGVhZCBvZiB2aWRlb2pzKGlkLCB7IGNoaWxkcmVuOiB7IGNvbnRyb2xCYXI6IGZhbHNlIH0pO1xuICAgICAgICBpZiAocGFyZW50T3B0aW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0cyA9IHBhcmVudE9wdGlvbnNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBmb3IgZGlzYWJsaW5nIGRlZmF1bHQgY29tcG9uZW50c1xuICAgICAgICAvLyBlLmcuIG9wdGlvbnNbJ2NoaWxkcmVuJ11bJ3Bvc3RlckltYWdlJ10gPSBmYWxzZVxuICAgICAgICBpZiAob3B0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBvcHRpb25zIHRvIGJlIHBhc3NlZCBhcyBhIHNpbXBsZSBib29sZWFuIGlmIG5vIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gaXMgbmVjZXNzYXJ5LlxuICAgICAgICBpZiAob3B0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGFsc28gd2FudCB0byBwYXNzIHRoZSBvcmlnaW5hbCBwbGF5ZXIgb3B0aW9uc1xuICAgICAgICAvLyB0byBlYWNoIGNvbXBvbmVudCBhcyB3ZWxsIHNvIHRoZXkgZG9uJ3QgbmVlZCB0b1xuICAgICAgICAvLyByZWFjaCBiYWNrIGludG8gdGhlIHBsYXllciBmb3Igb3B0aW9ucyBsYXRlci5cbiAgICAgICAgb3B0cy5wbGF5ZXJPcHRpb25zID0gX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucztcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIGFkZCB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgICAvLyBBZGQgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBieSBuYW1lIG9uIHRoZSBwYXJlbnQgaW5zdGFuY2UuXG4gICAgICAgIC8vIElmIHR3byBvZiB0aGUgc2FtZSBjb21wb25lbnQgYXJlIHVzZWQsIGRpZmZlcmVudCBuYW1lcyBzaG91bGQgYmUgc3VwcGxpZWRcbiAgICAgICAgLy8gZm9yIGVhY2hcbiAgICAgICAgdmFyIG5ld0NoaWxkID0gX3RoaXMuYWRkQ2hpbGQobmFtZSwgb3B0cyk7XG5cbiAgICAgICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICAgICAgX3RoaXNbbmFtZV0gPSBuZXdDaGlsZDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQWxsb3cgZm9yIGFuIGFycmF5IG9mIGNoaWxkcmVuIGRldGFpbHMgdG8gcGFzc2VkIGluIHRoZSBvcHRpb25zXG4gICAgICB2YXIgd29ya2luZ0NoaWxkcmVuID0gdm9pZCAwO1xuICAgICAgdmFyIFRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KCdUZWNoJyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICB3b3JraW5nQ2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtpbmdDaGlsZHJlbiA9IE9iamVjdC5rZXlzKGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgd29ya2luZ0NoaWxkcmVuXG4gICAgICAvLyBjaGlsZHJlbiB0aGF0IGFyZSBpbiB0aGlzLm9wdGlvbnNfIGJ1dCBhbHNvIGluIHdvcmtpbmdDaGlsZHJlbiAgd291bGRcbiAgICAgIC8vIGdpdmUgdXMgZXh0cmEgY2hpbGRyZW4gd2UgZG8gbm90IHdhbnQuIFNvLCB3ZSB3YW50IHRvIGZpbHRlciB0aGVtIG91dC5cbiAgICAgIC5jb25jYXQoT2JqZWN0LmtleXModGhpcy5vcHRpb25zXykuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gIXdvcmtpbmdDaGlsZHJlbi5zb21lKGZ1bmN0aW9uICh3Y2hpbGQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHdjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZCA9PT0gd2NoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hpbGQgPT09IHdjaGlsZC5uYW1lO1xuICAgICAgICB9KTtcbiAgICAgIH0pKS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBuYW1lID0gdm9pZCAwO1xuICAgICAgICB2YXIgb3B0cyA9IHZvaWQgMDtcblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG5hbWUgPSBjaGlsZDtcbiAgICAgICAgICBvcHRzID0gY2hpbGRyZW5bbmFtZV0gfHwgX3RoaXMub3B0aW9uc19bbmFtZV0gfHwge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgICAgb3B0cyA9IGNoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogbmFtZSwgb3B0czogb3B0cyB9O1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAvLyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGNoaWxkLm5hbWUgaXNuJ3QgaW4gdGhlIHRlY2hPcmRlciBzaW5jZVxuICAgICAgICAvLyB0ZWNocyBhcmUgcmVnaXN0ZXJkIGFzIENvbXBvbmVudHMgYnV0IGNhbid0IGFyZW4ndCBjb21wYXRpYmxlXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMjc3MlxuICAgICAgICB2YXIgYyA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGQub3B0cy5jb21wb25lbnRDbGFzcyB8fCB0b1RpdGxlQ2FzZShjaGlsZC5uYW1lKSk7XG5cbiAgICAgICAgcmV0dXJuIGMgJiYgIVRlY2guaXNUZWNoKGMpO1xuICAgICAgfSkuZm9yRWFjaChoYW5kbGVBZGQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBjbGFzcyBuYW1lLiBTaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHN1Yi1jb21wb25lbnRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBjbGFzcyBuYW1lIGZvciB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICAvLyBDaGlsZCBjbGFzc2VzIGNhbiBpbmNsdWRlIGEgZnVuY3Rpb24gdGhhdCBkb2VzOlxuICAgIC8vIHJldHVybiAnQ0xBU1MgTkFNRScgKyB0aGlzLl9zdXBlcigpO1xuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAvKipcbiAgICogQmluZCBhIGxpc3RlbmVyIHRvIHRoZSBjb21wb25lbnQncyByZWFkeSBzdGF0ZS5cbiAgICogRGlmZmVyZW50IGZyb20gZXZlbnQgbGlzdGVuZXJzIGluIHRoYXQgaWYgdGhlIHJlYWR5IGV2ZW50IGhhcyBhbHJlYWR5IGhhcHBlbmVkXG4gICAqIGl0IHdpbGwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogICAgICAgICBSZXR1cm5zIGl0c2VsZjsgbWV0aG9kIGNhbiBiZSBjaGFpbmVkLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIHZhciBzeW5jID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeV8pIHtcbiAgICAgIHRoaXMucmVhZHlRdWV1ZV8gPSB0aGlzLnJlYWR5UXVldWVfIHx8IFtdO1xuICAgICAgdGhpcy5yZWFkeVF1ZXVlXy5wdXNoKGZuKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgZm4uY2FsbCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkgYnkgZGVmYXVsdCBmb3IgY29uc2lzdGVuY3lcbiAgICAgIHRoaXMuc2V0VGltZW91dChmbiwgMSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFsbCB0aGUgcmVhZHkgbGlzdGVuZXJzIGZvciB0aGlzIGBDb21wb25lbnRgLlxuICAgKlxuICAgKiBAZmlyZXMgQ29tcG9uZW50I3JlYWR5XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS50cmlnZ2VyUmVhZHkgPSBmdW5jdGlvbiB0cmlnZ2VyUmVhZHkoKSB7XG4gICAgdGhpcy5pc1JlYWR5XyA9IHRydWU7XG5cbiAgICAvLyBFbnN1cmUgcmVhZHkgaXMgdHJpZ2dlcmVkIGFzeW5jaHJvbm91c2x5XG4gICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWFkeVF1ZXVlID0gdGhpcy5yZWFkeVF1ZXVlXztcblxuICAgICAgLy8gUmVzZXQgUmVhZHkgUXVldWVcbiAgICAgIHRoaXMucmVhZHlRdWV1ZV8gPSBbXTtcblxuICAgICAgaWYgKHJlYWR5UXVldWUgJiYgcmVhZHlRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlYWR5UXVldWUuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICBmbi5jYWxsKHRoaXMpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWxsb3cgZm9yIHVzaW5nIGV2ZW50IGxpc3RlbmVycyBhbHNvXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgYENvbXBvbmVudGAgaXMgcmVhZHkuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IENvbXBvbmVudCNyZWFkeVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3JlYWR5Jyk7XG4gICAgfSwgMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBzaW5nbGUgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgc1xuICAgKiBgY29udGVudEVsKClgIG9yIGFub3RoZXIgY3VzdG9tIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV1cbiAgICogICAgICAgIEEgRE9NIGVsZW1lbnQgd2l0aGluIHdoaWNoIHRvIHF1ZXJ5LiBDYW4gYWxzbyBiZSBhIHNlbGVjdG9yIHN0cmluZyBpblxuICAgKiAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCB3aWxsIGdldCB1c2VkIGFzIGNvbnRleHQuIElmXG4gICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJuc1xuICAgKiAgICAgICAgbm90aGluZyBpdCBmYWxscyBiYWNrIHRvIGBkb2N1bWVudGAuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICogICAgICAgICB0aGUgZG9tIGVsZW1lbnQgdGhhdCB3YXMgZm91bmQsIG9yIG51bGxcbiAgICpcbiAgICogQHNlZSBbSW5mb3JtYXRpb24gb24gQ1NTIFNlbGVjdG9yc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvQ1NTL0dldHRpbmdfU3RhcnRlZC9TZWxlY3RvcnMpXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS4kID0gZnVuY3Rpb24gJCQkMShzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiAkKHNlbGVjdG9yLCBjb250ZXh0IHx8IHRoaXMuY29udGVudEVsKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgc1xuICAgKiBgY29udGVudEVsKClgIG9yIGFub3RoZXIgY3VzdG9tIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV1cbiAgICogICAgICAgIEEgRE9NIGVsZW1lbnQgd2l0aGluIHdoaWNoIHRvIHF1ZXJ5LiBDYW4gYWxzbyBiZSBhIHNlbGVjdG9yIHN0cmluZyBpblxuICAgKiAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCB3aWxsIGdldCB1c2VkIGFzIGNvbnRleHQuIElmXG4gICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJuc1xuICAgKiAgICAgICAgbm90aGluZyBpdCBmYWxscyBiYWNrIHRvIGBkb2N1bWVudGAuXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGVMaXN0fVxuICAgKiAgICAgICAgIGEgbGlzdCBvZiBkb20gZWxlbWVudHMgdGhhdCB3ZXJlIGZvdW5kXG4gICAqXG4gICAqIEBzZWUgW0luZm9ybWF0aW9uIG9uIENTUyBTZWxlY3RvcnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0d1aWRlL0NTUy9HZXR0aW5nX1N0YXJ0ZWQvU2VsZWN0b3JzKVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuJCQgPSBmdW5jdGlvbiAkJCQkMShzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiAkJChzZWxlY3RvciwgY29udGV4dCB8fCB0aGlzLmNvbnRlbnRFbCgpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQncyBlbGVtZW50IGhhcyBhIENTUyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0NoZWNrXG4gICAqICAgICAgICBDU1MgY2xhc3MgbmFtZSB0byBjaGVjay5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgdGhlIGBDb21wb25lbnRgIGhhcyB0aGUgY2xhc3MuXG4gICAqICAgICAgICAgLSBGYWxzZSBpZiB0aGUgYENvbXBvbmVudGAgZG9lcyBub3QgaGF2ZSB0aGUgY2xhc3NgXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uIGhhc0NsYXNzJCQxKGNsYXNzVG9DaGVjaykge1xuICAgIHJldHVybiBoYXNDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0NoZWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgQ1NTIGNsYXNzIG5hbWUgdG8gdGhlIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0FkZFxuICAgKiAgICAgICAgQ1NTIGNsYXNzIG5hbWUgdG8gYWRkXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIGFkZENsYXNzJCQxKGNsYXNzVG9BZGQpIHtcbiAgICBhZGRDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0FkZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gdGhlIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb1JlbW92ZVxuICAgKiAgICAgICAgQ1NTIGNsYXNzIG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzJCQxKGNsYXNzVG9SZW1vdmUpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsXywgY2xhc3NUb1JlbW92ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBvciByZW1vdmUgYSBDU1MgY2xhc3MgbmFtZSBmcm9tIHRoZSBjb21wb25lbnQncyBlbGVtZW50LlxuICAgKiAtIGBjbGFzc1RvVG9nZ2xlYCBnZXRzIGFkZGVkIHdoZW4ge0BsaW5rIENvbXBvbmVudCNoYXNDbGFzc30gd291bGQgcmV0dXJuIGZhbHNlLlxuICAgKiAtIGBjbGFzc1RvVG9nZ2xlYCBnZXRzIHJlbW92ZWQgd2hlbiB7QGxpbmsgQ29tcG9uZW50I2hhc0NsYXNzfSB3b3VsZCByZXR1cm4gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gICAqICAgICAgICAgVGhlIGNsYXNzIHRvIGFkZCBvciByZW1vdmUgYmFzZWQgb24gKEBsaW5rIENvbXBvbmVudCNoYXNDbGFzc31cbiAgICpcbiAgICogQHBhcmFtICB7Ym9vbGVhbnxEb21+cHJlZGljYXRlfSBbcHJlZGljYXRlXVxuICAgKiAgICAgICAgIEFuIHtAbGluayBEb21+cHJlZGljYXRlfSBmdW5jdGlvbiBvciBhIGJvb2xlYW5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gdG9nZ2xlQ2xhc3MkJDEoY2xhc3NUb1RvZ2dsZSwgcHJlZGljYXRlKSB7XG4gICAgdG9nZ2xlQ2xhc3ModGhpcy5lbF8sIGNsYXNzVG9Ub2dnbGUsIHByZWRpY2F0ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGBDb21wb25lbnRgcyBlbGVtZW50IGlmIGl0IGlzIGhpZGRlbiBieSByZW1vdmluZyB0aGVcbiAgICogJ3Zqcy1oaWRkZW4nIGNsYXNzIG5hbWUgZnJvbSBpdC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQgaWYgaXQgaXMgY3VycmVudGx5IHNob3dpbmcgYnkgYWRkaW5nIHRoZVxuICAgKiAndmpzLWhpZGRlbmAgY2xhc3MgbmFtZSB0byBpdC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9jayBhIGBDb21wb25lbnRgcyBlbGVtZW50IGluIGl0cyB2aXNpYmxlIHN0YXRlIGJ5IGFkZGluZyB0aGUgJ3Zqcy1sb2NrLXNob3dpbmcnXG4gICAqIGNsYXNzIG5hbWUgdG8gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUubG9ja1Nob3dpbmcgPSBmdW5jdGlvbiBsb2NrU2hvd2luZygpIHtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtbG9jay1zaG93aW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVubG9jayBhIGBDb21wb25lbnRgcyBlbGVtZW50IGZyb20gaXRzIHZpc2libGUgc3RhdGUgYnkgcmVtb3ZpbmcgdGhlICd2anMtbG9jay1zaG93aW5nJ1xuICAgKiBjbGFzcyBuYW1lIGZyb20gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUudW5sb2NrU2hvd2luZyA9IGZ1bmN0aW9uIHVubG9ja1Nob3dpbmcoKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWxvY2stc2hvd2luZycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB3YXMgYXNrZWQgZm9yLlxuICAgKiAgICAgICAgIC0gQ2FuIGJlIGFuIGVtcHR5IHN0cmluZyBvbiBzb21lIGJyb3dzZXJzIGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3RcbiAgICogICAgICAgICAgIG9yIGhhcyBubyB2YWx1ZVxuICAgKiAgICAgICAgIC0gTW9zdCBicm93c2VycyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBhdHRpYnV0ZSBkb2VzIG5vdCBleGlzdCBvciBoYXNcbiAgICogICAgICAgICAgIG5vIHZhbHVlLlxuICAgKlxuICAgKiBAc2VlIFtET00gQVBJXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRBdHRyaWJ1dGV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUkJDEoYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0aGlzLmVsXywgYXR0cmlidXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhlIGBDb21wb25lbnRgJ3MgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogICAgICAgIFZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLlxuICAgKlxuICAgKiBAc2VlIFtET00gQVBJXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zZXRBdHRyaWJ1dGV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUkJDEoYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIHNldEF0dHJpYnV0ZSh0aGlzLmVsXywgYXR0cmlidXRlLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUuXG4gICAqXG4gICAqIEBzZWUgW0RPTSBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlbW92ZUF0dHJpYnV0ZX1cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZSQkMShhdHRyaWJ1dGUpIHtcbiAgICByZW1vdmVBdHRyaWJ1dGUodGhpcy5lbF8sIGF0dHJpYnV0ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjb21wb25lbnQgYmFzZWQgdXBvbiB0aGUgQ1NTIHN0eWxlcy5cbiAgICogU2VlIHtAbGluayBDb21wb25lbnQjZGltZW5zaW9ufSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbbnVtXVxuICAgKiAgICAgICAgVGhlIHdpZHRoIHRoYXQgeW91IHdhbnQgdG8gc2V0IHBvc3RmaXhlZCB3aXRoICclJywgJ3B4JyBvciBub3RoaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXVxuICAgKiAgICAgICAgU2tpcCB0aGUgY29tcG9uZW50cmVzaXplIGV2ZW50IHRyaWdnZXJcbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfHN0cmluZ31cbiAgICogICAgICAgICBUaGUgd2lkdGggd2hlbiBnZXR0aW5nLCB6ZXJvIGlmIHRoZXJlIGlzIG5vIHdpZHRoLiBDYW4gYmUgYSBzdHJpbmdcbiAgICogICAgICAgICAgIHBvc3RwaXhlZCB3aXRoICclJyBvciAncHgnLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aChudW0sIHNraXBMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ3dpZHRoJywgbnVtLCBza2lwTGlzdGVuZXJzKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjb21wb25lbnQgYmFzZWQgdXBvbiB0aGUgQ1NTIHN0eWxlcy5cbiAgICogU2VlIHtAbGluayBDb21wb25lbnQjZGltZW5zaW9ufSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbbnVtXVxuICAgKiAgICAgICAgVGhlIGhlaWdodCB0aGF0IHlvdSB3YW50IHRvIHNldCBwb3N0Zml4ZWQgd2l0aCAnJScsICdweCcgb3Igbm90aGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcExpc3RlbmVyc11cbiAgICogICAgICAgIFNraXAgdGhlIGNvbXBvbmVudHJlc2l6ZSBldmVudCB0cmlnZ2VyXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcnxzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIHdpZHRoIHdoZW4gZ2V0dGluZywgemVybyBpZiB0aGVyZSBpcyBubyB3aWR0aC4gQ2FuIGJlIGEgc3RyaW5nXG4gICAqICAgICAgICAgcG9zdHBpeGVkIHdpdGggJyUnIG9yICdweCcuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQobnVtLCBza2lwTGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uKCdoZWlnaHQnLCBudW0sIHNraXBMaXN0ZW5lcnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgYm90aCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGAgZWxlbWVudCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ8c3RyaW5nfSB3aWR0aFxuICAgKiAgICAgICAgIFdpZHRoIHRvIHNldCB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSAge251bWJlcnxzdHJpbmd9IGhlaWdodFxuICAgKiAgICAgICAgIEhlaWdodCB0byBzZXQgdGhlIGBDb21wb25lbnRgcyBlbGVtZW50IHRvLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZGltZW5zaW9ucyA9IGZ1bmN0aW9uIGRpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIC8vIFNraXAgY29tcG9uZW50cmVzaXplIGxpc3RlbmVycyBvbiB3aWR0aCBmb3Igb3B0aW1pemF0aW9uXG4gICAgdGhpcy53aWR0aCh3aWR0aCwgdHJ1ZSk7XG4gICAgdGhpcy5oZWlnaHQoaGVpZ2h0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGBDb21wb25lbnRgIGVsZW1lbnQuIFRoaXMgaXMgdGhlIHNoYXJlZCBjb2RlXG4gICAqIGZvciB0aGUge0BsaW5rIENvbXBvbmVudCN3aWR0aH0gYW5kIHtAbGluayBDb21wb25lbnQjaGVpZ2h0fS5cbiAgICpcbiAgICogVGhpbmdzIHRvIGtub3c6XG4gICAqIC0gSWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpbiBhbiBudW1iZXIgdGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIHBvc3RmaXhlZCB3aXRoICdweCcuXG4gICAqIC0gSWYgdGhlIHdpZHRoL2hlaWdodCBpcyBhIHBlcmNlbnQgdGhpcyB3aWxsIHJldHVybiB0aGUgcGVyY2VudCBwb3N0Zml4ZWQgd2l0aCAnJSdcbiAgICogLSBIaWRkZW4gZWxlbWVudHMgaGF2ZSBhIHdpZHRoIG9mIDAgd2l0aCBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLiBUaGlzIGZ1bmN0aW9uXG4gICAqICAgZGVmYXVsdHMgdG8gdGhlIGBDb21wb25lbnRgcyBgc3R5bGUud2lkdGhgIGFuZCBmYWxscyBiYWNrIHRvIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqICAgU2VlIFt0aGlzXXtAbGluayBodHRwOi8vd3d3LmZvbGlvdGVrLmNvbS9kZXZibG9nL2dldHRpbmctdGhlLXdpZHRoLW9mLWEtaGlkZGVuLWVsZW1lbnQtd2l0aC1qcXVlcnktdXNpbmctd2lkdGgvfVxuICAgKiAgIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqIC0gSWYgeW91IHdhbnQgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgQ29tcG9uZW50I2N1cnJlbnRXaWR0aH1cbiAgICogICBhbmQge0BsaW5rIHtDb21wb25lbnQjY3VycmVudEhlaWdodH1cbiAgICpcbiAgICogQGZpcmVzIENvbXBvbmVudCNjb21wb25lbnRyZXNpemVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoT3JIZWlnaHRcbiAgIDggICAgICAgICd3aWR0aCcgb3IgJ2hlaWdodCdcbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfHN0cmluZ30gW251bV1cbiAgIDggICAgICAgICBOZXcgZGltZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXVxuICAgKiAgICAgICAgIFNraXAgY29tcG9uZW50cmVzaXplIGV2ZW50IHRyaWdnZXJcbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBkaW1lbnNpb24gd2hlbiBnZXR0aW5nIG9yIDAgaWYgdW5zZXRcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uIGRpbWVuc2lvbih3aWR0aE9ySGVpZ2h0LCBudW0sIHNraXBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNldCB0byB6ZXJvIGlmIG51bGwgb3IgbGl0ZXJhbGx5IE5hTiAoTmFOICE9PSBOYU4pXG4gICAgICBpZiAobnVtID09PSBudWxsIHx8IG51bSAhPT0gbnVtKSB7XG4gICAgICAgIG51bSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHVzaW5nIGNzcyB3aWR0aC9oZWlnaHQgKCUgb3IgcHgpIGFuZCBhZGp1c3RcbiAgICAgIGlmICgoJycgKyBudW0pLmluZGV4T2YoJyUnKSAhPT0gLTEgfHwgKCcnICsgbnVtKS5pbmRleE9mKCdweCcpICE9PSAtMSkge1xuICAgICAgICB0aGlzLmVsXy5zdHlsZVt3aWR0aE9ySGVpZ2h0XSA9IG51bTtcbiAgICAgIH0gZWxzZSBpZiAobnVtID09PSAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF0gPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxfLnN0eWxlW3dpZHRoT3JIZWlnaHRdID0gbnVtICsgJ3B4JztcbiAgICAgIH1cblxuICAgICAgLy8gc2tpcExpc3RlbmVycyBhbGxvd3MgdXMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGUgcmVzaXplIGV2ZW50IHdoZW4gc2V0dGluZyBib3RoIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgIGlmICghc2tpcExpc3RlbmVycykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgcmVzaXplZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IENvbXBvbmVudCNjb21wb25lbnRyZXNpemVcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjb21wb25lbnRyZXNpemUnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdCBzZXR0aW5nIGEgdmFsdWUsIHNvIGdldHRpbmcgaXRcbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIXRoaXMuZWxfKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGltZW5zaW9uIHZhbHVlIGZyb20gc3R5bGVcbiAgICB2YXIgdmFsID0gdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF07XG4gICAgdmFyIHB4SW5kZXggPSB2YWwuaW5kZXhPZigncHgnKTtcblxuICAgIGlmIChweEluZGV4ICE9PSAtMSkge1xuICAgICAgLy8gUmV0dXJuIHRoZSBwaXhlbCB2YWx1ZSB3aXRoIG5vICdweCdcbiAgICAgIHJldHVybiBwYXJzZUludCh2YWwuc2xpY2UoMCwgcHhJbmRleCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBObyBweCBzbyB1c2luZyAlIG9yIG5vIHN0eWxlIHdhcyBzZXQsIHNvIGZhbGxpbmcgYmFjayB0byBvZmZzZXRXaWR0aC9oZWlnaHRcbiAgICAvLyBJZiBjb21wb25lbnQgaGFzIGRpc3BsYXk6bm9uZSwgb2Zmc2V0IHdpbGwgcmV0dXJuIDBcbiAgICAvLyBUT0RPOiBoYW5kbGUgZGlzcGxheTpub25lIGFuZCBubyBkaW1lbnNpb24gc3R5bGUgdXNpbmcgcHhcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5lbF9bJ29mZnNldCcgKyB0b1RpdGxlQ2FzZSh3aWR0aE9ySGVpZ2h0KV0sIDEwKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSB3aWR0aCBvciB0aGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YCBlbGVtZW50cyBjb21wdXRlZCBzdHlsZS4gVXNlc1xuICAgKiBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhPckhlaWdodFxuICAgKiAgICAgICAgQSBzdHJpbmcgY29udGFpbmluZyAnd2lkdGgnIG9yICdoZWlnaHQnLiBXaGljaGV2ZXIgb25lIHlvdSB3YW50IHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBkaW1lbnNpb24gdGhhdCBnZXRzIGFza2VkIGZvciBvciAwIGlmIG5vdGhpbmcgd2FzIHNldFxuICAgKiAgICAgICAgIGZvciB0aGF0IGRpbWVuc2lvbi5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnREaW1lbnNpb24gPSBmdW5jdGlvbiBjdXJyZW50RGltZW5zaW9uKHdpZHRoT3JIZWlnaHQpIHtcbiAgICB2YXIgY29tcHV0ZWRXaWR0aE9ySGVpZ2h0ID0gMDtcblxuICAgIGlmICh3aWR0aE9ySGVpZ2h0ICE9PSAnd2lkdGgnICYmIHdpZHRoT3JIZWlnaHQgIT09ICdoZWlnaHQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1cnJlbnREaW1lbnNpb24gb25seSBhY2NlcHRzIHdpZHRoIG9yIGhlaWdodCB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbF8pO1xuXG4gICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUod2lkdGhPckhlaWdodCkgfHwgY29tcHV0ZWRTdHlsZVt3aWR0aE9ySGVpZ2h0XTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ3B4JyBmcm9tIHZhcmlhYmxlIGFuZCBwYXJzZSBhcyBpbnRlZ2VyXG4gICAgY29tcHV0ZWRXaWR0aE9ySGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZFdpZHRoT3JIZWlnaHQpO1xuXG4gICAgLy8gaWYgdGhlIGNvbXB1dGVkIHZhbHVlIGlzIHN0aWxsIDAsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgYnJvd3NlciBpcyBseWluZ1xuICAgIC8vIGFuZCB3ZSB3YW50IHRvIGNoZWNrIHRoZSBvZmZzZXQgdmFsdWVzLlxuICAgIC8vIFRoaXMgY29kZSBhbHNvIHJ1bnMgb24gSUU4IGFuZCB3aGVyZXZlciBnZXRDb21wdXRlZFN0eWxlIGRvZXNuJ3QgZXhpc3QuXG4gICAgaWYgKGNvbXB1dGVkV2lkdGhPckhlaWdodCA9PT0gMCkge1xuICAgICAgdmFyIHJ1bGUgPSAnb2Zmc2V0JyArIHRvVGl0bGVDYXNlKHdpZHRoT3JIZWlnaHQpO1xuXG4gICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSB0aGlzLmVsX1tydWxlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWRXaWR0aE9ySGVpZ2h0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBvZiB0aGUgYENvbXBvbmVudGBzXG4gICAqIGNvbXB1dGVkIHN0eWxlLiBVc2VzIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBvbmVudH5EaW1lbnNpb25PYmplY3RcbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoXG4gICAqICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodFxuICAgKiAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIG9mIHRoZSBgQ29tcG9uZW50YHNcbiAgICogY29tcHV0ZWQgc3R5bGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH5EaW1lbnNpb25PYmplY3R9XG4gICAqICAgICAgICAgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXBvbmVudHMgZWxlbWVudFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY3VycmVudERpbWVuc2lvbnMgPSBmdW5jdGlvbiBjdXJyZW50RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKSxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKVxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS4gVXNlcyBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IHdpZHRoXG4gICAqICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnRXaWR0aCA9IGZ1bmN0aW9uIGN1cnJlbnRXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RGltZW5zaW9uKCd3aWR0aCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLiBVc2VzIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn0gaGVpZ2h0XG4gICAqICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YHMgY29tcHV0ZWQgc3R5bGUuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5jdXJyZW50SGVpZ2h0ID0gZnVuY3Rpb24gY3VycmVudEhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBmb2N1cyB0byB0aGlzIGNvbXBvbmVudFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICB0aGlzLmVsXy5mb2N1cygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGZvY3VzIGZyb20gdGhpcyBjb21wb25lbnRcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmJsdXIgPSBmdW5jdGlvbiBibHVyKCkge1xuICAgIHRoaXMuZWxfLmJsdXIoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhICd0YXAnIGV2ZW50cyB3aGVuIHRvdWNoIGV2ZW50IHN1cHBvcnQgZ2V0cyBkZXRlY3RlZC4gVGhpcyBnZXRzIHVzZWQgdG9cbiAgICogc3VwcG9ydCB0b2dnbGluZyB0aGUgY29udHJvbHMgdGhyb3VnaCBhIHRhcCBvbiB0aGUgdmlkZW8uIFRoZXkgZ2V0IGVuYWJsZWRcbiAgICogYmVjYXVzZSBldmVyeSBzdWItY29tcG9uZW50IHdvdWxkIGhhdmUgZXh0cmEgb3ZlcmhlYWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAZmlyZXMgQ29tcG9uZW50I3RhcFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hzdGFydFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2htb3ZlXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGxlYXZlXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hlbmRcbiAgICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbWl0VGFwRXZlbnRzID0gZnVuY3Rpb24gZW1pdFRhcEV2ZW50cygpIHtcbiAgICAvLyBUcmFjayB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGhvdyBsb25nIHRoZSB0b3VjaCBsYXN0ZWRcbiAgICB2YXIgdG91Y2hTdGFydCA9IDA7XG4gICAgdmFyIGZpcnN0VG91Y2ggPSBudWxsO1xuXG4gICAgLy8gTWF4aW11bSBtb3ZlbWVudCBhbGxvd2VkIGR1cmluZyBhIHRvdWNoIGV2ZW50IHRvIHN0aWxsIGJlIGNvbnNpZGVyZWQgYSB0YXBcbiAgICAvLyBPdGhlciBwb3B1bGFyIGxpYnMgdXNlIGFueXdoZXJlIGZyb20gMiAoaGFtbWVyLmpzKSB0byAxNSxcbiAgICAvLyBzbyAxMCBzZWVtcyBsaWtlIGEgbmljZSwgcm91bmQgbnVtYmVyLlxuICAgIHZhciB0YXBNb3ZlbWVudFRocmVzaG9sZCA9IDEwO1xuXG4gICAgLy8gVGhlIG1heGltdW0gbGVuZ3RoIGEgdG91Y2ggY2FuIGJlIHdoaWxlIHN0aWxsIGJlaW5nIGNvbnNpZGVyZWQgYSB0YXBcbiAgICB2YXIgdG91Y2hUaW1lVGhyZXNob2xkID0gMjAwO1xuXG4gICAgdmFyIGNvdWxkQmVUYXAgPSB2b2lkIDA7XG5cbiAgICB0aGlzLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZpbmdlciwgZG9uJ3QgY29uc2lkZXIgdHJlYXRpbmcgdGhpcyBhcyBhIGNsaWNrXG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gQ29weSBwYWdlWC9wYWdlWSBmcm9tIHRoZSBvYmplY3RcbiAgICAgICAgZmlyc3RUb3VjaCA9IHtcbiAgICAgICAgICBwYWdlWDogZXZlbnQudG91Y2hlc1swXS5wYWdlWCxcbiAgICAgICAgICBwYWdlWTogZXZlbnQudG91Y2hlc1swXS5wYWdlWVxuICAgICAgICB9O1xuICAgICAgICAvLyBSZWNvcmQgc3RhcnQgdGltZSBzbyB3ZSBjYW4gZGV0ZWN0IGEgdGFwIHZzLiBcInRvdWNoIGFuZCBob2xkXCJcbiAgICAgICAgdG91Y2hTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBSZXNldCBjb3VsZEJlVGFwIHRyYWNraW5nXG4gICAgICAgIGNvdWxkQmVUYXAgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbigndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZpbmdlciwgZG9uJ3QgY29uc2lkZXIgdHJlYXRpbmcgdGhpcyBhcyBhIGNsaWNrXG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvdWxkQmVUYXAgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RUb3VjaCkge1xuICAgICAgICAvLyBTb21lIGRldmljZXMgd2lsbCB0aHJvdyB0b3VjaG1vdmVzIGZvciBhbGwgYnV0IHRoZSBzbGlnaHRlc3Qgb2YgdGFwcy5cbiAgICAgICAgLy8gU28sIGlmIHdlIG1vdmVkIG9ubHkgYSBzbWFsbCBkaXN0YW5jZSwgdGhpcyBjb3VsZCBzdGlsbCBiZSBhIHRhcFxuICAgICAgICB2YXIgeGRpZmYgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZmlyc3RUb3VjaC5wYWdlWDtcbiAgICAgICAgdmFyIHlkaWZmID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGZpcnN0VG91Y2gucGFnZVk7XG4gICAgICAgIHZhciB0b3VjaERpc3RhbmNlID0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcblxuICAgICAgICBpZiAodG91Y2hEaXN0YW5jZSA+IHRhcE1vdmVtZW50VGhyZXNob2xkKSB7XG4gICAgICAgICAgY291bGRCZVRhcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbm9UYXAgPSBmdW5jdGlvbiBub1RhcCgpIHtcbiAgICAgIGNvdWxkQmVUYXAgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gVE9ETzogTGlzdGVuIHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuIGh0dHA6Ly95b3V0dS5iZS9EdWpmcFhPS1VwOD90PTEzbThzXG4gICAgdGhpcy5vbigndG91Y2hsZWF2ZScsIG5vVGFwKTtcbiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIG5vVGFwKTtcblxuICAgIC8vIFdoZW4gdGhlIHRvdWNoIGVuZHMsIG1lYXN1cmUgaG93IGxvbmcgaXQgdG9vayBhbmQgdHJpZ2dlciB0aGUgYXBwcm9wcmlhdGVcbiAgICAvLyBldmVudFxuICAgIHRoaXMub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBmaXJzdFRvdWNoID0gbnVsbDtcbiAgICAgIC8vIFByb2NlZWQgb25seSBpZiB0aGUgdG91Y2htb3ZlL2xlYXZlL2NhbmNlbCBldmVudCBkaWRuJ3QgaGFwcGVuXG4gICAgICBpZiAoY291bGRCZVRhcCA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBNZWFzdXJlIGhvdyBsb25nIHRoZSB0b3VjaCBsYXN0ZWRcbiAgICAgICAgdmFyIHRvdWNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdG91Y2hTdGFydDtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvdWNoIHdhcyBsZXNzIHRoYW4gdGhlIHRocmVzaG9sZCB0byBiZSBjb25zaWRlcmVkIGEgdGFwXG4gICAgICAgIGlmICh0b3VjaFRpbWUgPCB0b3VjaFRpbWVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBEb24ndCBsZXQgYnJvd3NlciB0dXJuIHRoaXMgaW50byBhIGNsaWNrXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGBDb21wb25lbnRgIGlzIHRhcHBlZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBldmVudCBDb21wb25lbnQjdGFwXG4gICAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMudHJpZ2dlcigndGFwJyk7XG4gICAgICAgICAgLy8gSXQgbWF5IGJlIGdvb2QgdG8gY29weSB0aGUgdG91Y2hlbmQgZXZlbnQgb2JqZWN0IGFuZCBjaGFuZ2UgdGhlXG4gICAgICAgICAgLy8gdHlwZSB0byB0YXAsIGlmIHRoZSBvdGhlciBldmVudCBwcm9wZXJ0aWVzIGFyZW4ndCBleGFjdCBhZnRlclxuICAgICAgICAgIC8vIEV2ZW50cy5maXhFdmVudCBydW5zIChlLmcuIGV2ZW50LnRhcmdldClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdXNlciBhY3Rpdml0eSB3aGVuZXZlciB0b3VjaCBldmVudHMgaGFwcGVuLiBUaGlzIGNhbiBnZXRcbiAgICogdHVybmVkIG9mZiBieSBhbnkgc3ViLWNvbXBvbmVudHMgdGhhdCB3YW50cyB0b3VjaCBldmVudHMgdG8gYWN0IGFub3RoZXIgd2F5LlxuICAgKlxuICAgKiBSZXBvcnQgdXNlciB0b3VjaCBhY3Rpdml0eSB3aGVuIHRvdWNoIGV2ZW50cyBvY2N1ci4gVXNlciBhY3Rpdml0eSBnZXRzIHVzZWQgdG9cbiAgICogZGV0ZXJtaW5lIHdoZW4gY29udHJvbHMgc2hvdWxkIHNob3cvaGlkZS4gSXQgaXMgc2ltcGxlIHdoZW4gaXQgY29tZXMgdG8gbW91c2VcbiAgICogZXZlbnRzLCBiZWNhdXNlIGFueSBtb3VzZSBldmVudCBzaG91bGQgc2hvdyB0aGUgY29udHJvbHMuIFNvIHdlIGNhcHR1cmUgbW91c2VcbiAgICogZXZlbnRzIHRoYXQgYnViYmxlIHVwIHRvIHRoZSBwbGF5ZXIgYW5kIHJlcG9ydCBhY3Rpdml0eSB3aGVuIHRoYXQgaGFwcGVucy5cbiAgICogV2l0aCB0b3VjaCBldmVudHMgaXQgaXNuJ3QgYXMgZWFzeSBhcyBgdG91Y2hzdGFydGAgYW5kIGB0b3VjaGVuZGAgdG9nZ2xlIHBsYXllclxuICAgKiBjb250cm9scy4gU28gdG91Y2ggZXZlbnRzIGNhbid0IGhlbHAgdXMgYXQgdGhlIHBsYXllciBsZXZlbCBlaXRoZXIuXG4gICAqXG4gICAqIFVzZXIgYWN0aXZpdHkgZ2V0cyBjaGVja2VkIGFzeW5jaHJvbm91c2x5LiBTbyB3aGF0IGNvdWxkIGhhcHBlbiBpcyBhIHRhcCBldmVudFxuICAgKiBvbiB0aGUgdmlkZW8gdHVybnMgdGhlIGNvbnRyb2xzIG9mZi4gVGhlbiB0aGUgYHRvdWNoZW5kYCBldmVudCBidWJibGVzIHVwIHRvXG4gICAqIHRoZSBwbGF5ZXIuIFdoaWNoLCBpZiBpdCByZXBvcnRlZCB1c2VyIGFjdGl2aXR5LCB3b3VsZCB0dXJuIHRoZSBjb250cm9scyByaWdodFxuICAgKiBiYWNrIG9uLiBXZSBhbHNvIGRvbid0IHdhbnQgdG8gY29tcGxldGVseSBibG9jayB0b3VjaCBldmVudHMgZnJvbSBidWJibGluZyB1cC5cbiAgICogRnVydGhlcm1vcmUgYSBgdG91Y2htb3ZlYCBldmVudCBhbmQgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHRhcCwgc2hvdWxkIG5vdCB0dXJuXG4gICAqIGNvbnRyb2xzIGJhY2sgb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaHN0YXJ0XG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaG1vdmVcbiAgICogQGxpc3RlbnMgQ29tcG9uZW50I3RvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZW5hYmxlVG91Y2hBY3Rpdml0eSA9IGZ1bmN0aW9uIGVuYWJsZVRvdWNoQWN0aXZpdHkoKSB7XG4gICAgLy8gRG9uJ3QgY29udGludWUgaWYgdGhlIHJvb3QgcGxheWVyIGRvZXNuJ3Qgc3VwcG9ydCByZXBvcnRpbmcgdXNlciBhY3Rpdml0eVxuICAgIGlmICghdGhpcy5wbGF5ZXIoKSB8fCAhdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBmb3IgcmVwb3J0aW5nIHRoYXQgdGhlIHVzZXIgaXMgYWN0aXZlXG4gICAgdmFyIHJlcG9ydCA9IGJpbmQodGhpcy5wbGF5ZXIoKSwgdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpO1xuXG4gICAgdmFyIHRvdWNoSG9sZGluZyA9IHZvaWQgMDtcblxuICAgIHRoaXMub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXBvcnQoKTtcbiAgICAgIC8vIEZvciBhcyBsb25nIGFzIHRoZSB0aGV5IGFyZSB0b3VjaGluZyB0aGUgZGV2aWNlIG9yIGhhdmUgdGhlaXIgbW91c2UgZG93bixcbiAgICAgIC8vIHdlIGNvbnNpZGVyIHRoZW0gYWN0aXZlIGV2ZW4gaWYgdGhleSdyZSBub3QgbW92aW5nIHRoZWlyIGZpbmdlciBvciBtb3VzZS5cbiAgICAgIC8vIFNvIHdlIHdhbnQgdG8gY29udGludWUgdG8gdXBkYXRlIHRoYXQgdGhleSBhcmUgYWN0aXZlXG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwodG91Y2hIb2xkaW5nKTtcbiAgICAgIC8vIHJlcG9ydCBhdCB0aGUgc2FtZSBpbnRlcnZhbCBhcyBhY3Rpdml0eUNoZWNrXG4gICAgICB0b3VjaEhvbGRpbmcgPSB0aGlzLnNldEludGVydmFsKHJlcG9ydCwgMjUwKTtcbiAgICB9KTtcblxuICAgIHZhciB0b3VjaEVuZCA9IGZ1bmN0aW9uIHRvdWNoRW5kKGV2ZW50KSB7XG4gICAgICByZXBvcnQoKTtcbiAgICAgIC8vIHN0b3AgdGhlIGludGVydmFsIHRoYXQgbWFpbnRhaW5zIGFjdGl2aXR5IGlmIHRoZSB0b3VjaCBpcyBob2xkaW5nXG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwodG91Y2hIb2xkaW5nKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbigndG91Y2htb3ZlJywgcmVwb3J0KTtcbiAgICB0aGlzLm9uKCd0b3VjaGVuZCcsIHRvdWNoRW5kKTtcbiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIHRvdWNoRW5kKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayB0aGF0IGhhcyBubyBwYXJhbWV0ZXJzIGFuZCBpcyBib3VuZCBpbnRvIGBDb21wb25lbnRgcyBjb250ZXh0LlxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja1xuICAgKiBAdGhpcyBDb21wb25lbnRcbiAgICovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJ1bnMgYWZ0ZXIgYW4gYHhgIG1pbGxpc2Vjb25kIHRpbWVvdXQuIFRoaXMgZnVuY3Rpb24gaXMgYVxuICAgKiB3cmFwcGVyIGFyb3VuZCBgd2luZG93LnNldFRpbWVvdXRgLiBUaGVyZSBhcmUgYSBmZXcgcmVhc29ucyB0byB1c2UgdGhpcyBvbmVcbiAgICogaW5zdGVhZCB0aG91Z2g6XG4gICAqIDEuIEl0IGdldHMgY2xlYXJlZCB2aWEgIHtAbGluayBDb21wb25lbnQjY2xlYXJUaW1lb3V0fSB3aGVuXG4gICAqICAgIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0gZ2V0cyBjYWxsZWQuXG4gICAqIDIuIFRoZSBmdW5jdGlvbiBjYWxsYmFjayB3aWxsIGdldHMgdHVybmVkIGludG8gYSB7QGxpbmsgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja31cbiAgICpcbiAgICogPiBOb3RlOiBZb3UgY2FuJ3QgdXNlIGB3aW5kb3cuY2xlYXJUaW1lb3V0YCBvbiB0aGUgaWQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4gVGhpc1xuICAgKiAgICAgICAgIHdpbGwgY2F1c2UgaXRzIGRpc3Bvc2UgbGlzdGVuZXIgbm90IHRvIGdldCBjbGVhbmVkIHVwISBQbGVhc2UgdXNlXG4gICAqICAgICAgICAge0BsaW5rIENvbXBvbmVudCNjbGVhclRpbWVvdXR9IG9yIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0gaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+R2VuZXJpY0NhbGxiYWNrfSBmblxuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gYWZ0ZXIgYHRpbWVvdXRgLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKiAgICAgICAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyBhIHRpbWVvdXQgSUQgdGhhdCBnZXRzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRpbWVvdXQuIEl0IGNhbiBhbHNvXG4gICAqICAgICAgICAgZ2V0IHVzZWQgaW4ge0BsaW5rIENvbXBvbmVudCNjbGVhclRpbWVvdXR9IHRvIGNsZWFyIHRoZSB0aW1lb3V0IHRoYXRcbiAgICogICAgICAgICB3YXMgc2V0LlxuICAgKlxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjZGlzcG9zZVxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL3NldFRpbWVvdXR9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmbiwgdGltZW91dCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgLy8gZGVjbGFyZSBhcyB2YXJpYWJsZXMgc28gdGhleSBhcmUgcHJvcGVybHkgYXZhaWxhYmxlIGluIHRpbWVvdXQgZnVuY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB2YXIgdGltZW91dElkLCBkaXNwb3NlRm47XG5cbiAgICBmbiA9IGJpbmQodGhpcywgZm4pO1xuXG4gICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLm9mZignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG4gICAgICBmbigpO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLXRpbWVvdXQtJyArIHRpbWVvdXRJZDtcblxuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIHRpbWVvdXRJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYXJzIGEgdGltZW91dCB0aGF0IGdldHMgY3JlYXRlZCB2aWEgYHdpbmRvdy5zZXRUaW1lb3V0YCBvclxuICAgKiB7QGxpbmsgQ29tcG9uZW50I3NldFRpbWVvdXR9LiBJZiB5b3Ugc2V0IGEgdGltZW91dCB2aWEge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fVxuICAgKiB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGB3aW5kb3cuY2xlYXJUaW1vdXRgLiBJZiB5b3UgZG9uJ3QgeW91ciBkaXNwb3NlXG4gICAqIGxpc3RlbmVyIHdpbGwgbm90IGdldCBjbGVhbmVkIHVwIHVudGlsIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0hXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0SWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgdGltZW91dCB0byBjbGVhci4gVGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiAgICAgICAge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fSBvciBgd2luZG93LnNldFRpbWVvdXRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgdGltZW91dCBpZCB0aGF0IHdhcyBjbGVhcmVkLlxuICAgKlxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL2NsZWFyVGltZW91dH1cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge307XG5cbiAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtdGltZW91dC0nICsgdGltZW91dElkO1xuXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIHRpbWVvdXRJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBydW4gZXZlcnkgYHhgIG1pbGxpc2Vjb25kcy4gVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXJcbiAgICogYXJvdW5kIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLiBUaGVyZSBhcmUgYSBmZXcgcmVhc29ucyB0byB1c2UgdGhpcyBvbmUgaW5zdGVhZCB0aG91Z2guXG4gICAqIDEuIEl0IGdldHMgY2xlYXJlZCB2aWEgIHtAbGluayBDb21wb25lbnQjY2xlYXJJbnRlcnZhbH0gd2hlblxuICAgKiAgICB7QGxpbmsgQ29tcG9uZW50I2Rpc3Bvc2V9IGdldHMgY2FsbGVkLlxuICAgKiAyLiBUaGUgZnVuY3Rpb24gY2FsbGJhY2sgd2lsbCBiZSBhIHtAbGluayBDb21wb25lbnR+R2VuZXJpY0NhbGxiYWNrfVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9IGZuXG4gICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gcnVuIGV2ZXJ5IGB4YCBzZWNvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWxcbiAgICogICAgICAgIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBldmVyeSBgeGAgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyBhbiBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnRlcnZhbC4gSXQgY2FuIGFsc28gYmUgYmUgdXNlZCBpblxuICAgKiAgICAgICAgIHtAbGluayBDb21wb25lbnQjY2xlYXJJbnRlcnZhbH0gdG8gY2xlYXIgdGhlIGludGVydmFsLlxuICAgKlxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjZGlzcG9zZVxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL3NldEludGVydmFsfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiBzZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIGZuID0gYmluZCh0aGlzLCBmbik7XG5cbiAgICB2YXIgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpO1xuXG4gICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHtcbiAgICAgIHJldHVybiBfdGhpczMuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICB9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkO1xuXG4gICAgdGhpcy5vbignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG5cbiAgICByZXR1cm4gaW50ZXJ2YWxJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYXJzIGFuIGludGVydmFsIHRoYXQgZ2V0cyBjcmVhdGVkIHZpYSBgd2luZG93LnNldEludGVydmFsYCBvclxuICAgKiB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfS4gSWYgeW91IHNldCBhbiBpbnRldmFsIHZpYSB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfVxuICAgKiB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGB3aW5kb3cuY2xlYXJJbnRlcnZhbGAuIElmIHlvdSBkb24ndCB5b3VyIGRpc3Bvc2VcbiAgICogbGlzdGVuZXIgd2lsbCBub3QgZ2V0IGNsZWFuZWQgdXAgdW50aWwge0BsaW5rIENvbXBvbmVudCNkaXNwb3NlfSFcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludGVydmFsSWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgaW50ZXJ2YWwgdG8gY2xlYXIuIFRoZSByZXR1cm4gdmFsdWUgb2ZcbiAgICogICAgICAgIHtAbGluayBDb21wb25lbnQjc2V0SW50ZXJ2YWx9IG9yIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgaW50ZXJ2YWwgaWQgdGhhdCB3YXMgY2xlYXJlZC5cbiAgICpcbiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd1RpbWVycy9jbGVhckludGVydmFsfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCkge1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuXG4gICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHt9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkO1xuXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIGludGVydmFsSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyB1cCBhIGNhbGxiYWNrIHRvIGJlIHBhc3NlZCB0byByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKHJBRiksIGJ1dFxuICAgKiB3aXRoIGEgZmV3IGV4dHJhIGJvbnVzZXM6XG4gICAqXG4gICAqIC0gU3VwcG9ydHMgYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCByQUYgYnkgZmFsbGluZyBiYWNrIHRvXG4gICAqICAge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fS5cbiAgICpcbiAgICogLSBUaGUgY2FsbGJhY2sgaXMgdHVybmVkIGludG8gYSB7QGxpbmsgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja30gKGkuZS5cbiAgICogICBib3VuZCB0byB0aGUgY29tcG9uZW50KS5cbiAgICpcbiAgICogLSBBdXRvbWF0aWMgY2FuY2VsbGF0aW9uIG9mIHRoZSByQUYgY2FsbGJhY2sgaXMgaGFuZGxlZCBpZiB0aGUgY29tcG9uZW50XG4gICAqICAgaXMgZGlzcG9zZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtICB7Q29tcG9uZW50fkdlbmVyaWNDYWxsYmFja30gZm5cbiAgICogICAgICAgICBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBib3VuZCB0byB0aGlzIGNvbXBvbmVudCBhbmQgZXhlY3V0ZWQganVzdFxuICAgKiAgICAgICAgIGJlZm9yZSB0aGUgYnJvd3NlcidzIG5leHQgcmVwYWludC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFJldHVybnMgYW4gckFGIElEIHRoYXQgZ2V0cyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0aW1lb3V0LiBJdCBjYW5cbiAgICogICAgICAgICBhbHNvIGJlIHVzZWQgaW4ge0BsaW5rIENvbXBvbmVudCNjYW5jZWxBbmltYXRpb25GcmFtZX0gdG8gY2FuY2VsXG4gICAqICAgICAgICAgdGhlIGFuaW1hdGlvbiBmcmFtZSBjYWxsYmFjay5cbiAgICpcbiAgICogQGxpc3RlbnMgQ29tcG9uZW50I2Rpc3Bvc2VcbiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIC8vIGRlY2xhcmUgYXMgdmFyaWFibGVzIHNvIHRoZXkgYXJlIHByb3Blcmx5IGF2YWlsYWJsZSBpbiByQUYgZnVuY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB2YXIgaWQsIGRpc3Bvc2VGbjtcblxuICAgIGlmICh0aGlzLnN1cHBvcnRzUmFmXykge1xuICAgICAgZm4gPSBiaW5kKHRoaXMsIGZuKTtcblxuICAgICAgaWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0Lm9mZignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG4gICAgICAgIGZuKCk7XG4gICAgICB9KTtcblxuICAgICAgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcbiAgICAgIH07XG5cbiAgICAgIGRpc3Bvc2VGbi5ndWlkID0gJ3Zqcy1yYWYtJyArIGlkO1xuICAgICAgdGhpcy5vbignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG5cbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdXNpbmcgYSB0aW1lci5cbiAgICByZXR1cm4gdGhpcy5zZXRUaW1lb3V0KGZuLCAxMDAwIC8gNjApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcXVldWVkIGNhbGxiYWNrIHBhc3NlZCB0byB7QGxpbmsgQ29tcG9uZW50I3JlcXVlc3RBbmltYXRpb25GcmFtZX1cbiAgICogKHJBRikuXG4gICAqXG4gICAqIElmIHlvdSBxdWV1ZSBhbiByQUYgY2FsbGJhY2sgdmlhIHtAbGluayBDb21wb25lbnQjcmVxdWVzdEFuaW1hdGlvbkZyYW1lfSxcbiAgICogdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lYC4gSWYgeW91IGRvbid0LFxuICAgKiB5b3VyIGRpc3Bvc2UgbGlzdGVuZXIgd2lsbCBub3QgZ2V0IGNsZWFuZWQgdXAgdW50aWwge0BsaW5rIENvbXBvbmVudCNkaXNwb3NlfSFcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAqICAgICAgICBUaGUgckFGIElEIHRvIGNsZWFyLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBDb21wb25lbnQjcmVxdWVzdEFuaW1hdGlvbkZyYW1lfS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFJldHVybnMgdGhlIHJBRiBJRCB0aGF0IHdhcyBjbGVhcmVkLlxuICAgKlxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L2NhbmNlbEFuaW1hdGlvbkZyYW1lfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZShpZCkge1xuICAgIGlmICh0aGlzLnN1cHBvcnRzUmFmXykge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcblxuICAgICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHt9O1xuXG4gICAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtcmFmLScgKyBpZDtcblxuICAgICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHVzaW5nIGEgdGltZXIuXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJUaW1lb3V0KGlkKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBgQ29tcG9uZW50YCB3aXRoIGB2aWRlb2pzYCBnaXZlbiB0aGUgbmFtZSBhbmQgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogPiBOT1RFOiB7QGxpbmsgVGVjaH1zIHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIGBDb21wb25lbnRgLiB7QGxpbmsgVGVjaH1zXG4gICAqICAgICAgICAgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIFRlY2gucmVnaXN0ZXJUZWNofSBvclxuICAgKiAgICAgICAgIHtAbGluayB2aWRlb2pzOnZpZGVvanMucmVnaXN0ZXJUZWNofS5cbiAgICpcbiAgICogPiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHNlZW4gb24gdmlkZW9qcyBhc1xuICAgKiAgICAgICAgIHtAbGluayB2aWRlb2pzOnZpZGVvanMucmVnaXN0ZXJDb21wb25lbnR9LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGBDb21wb25lbnRgIHRvIHJlZ2lzdGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gQ29tcG9uZW50VG9SZWdpc3RlclxuICAgKiAgICAgICAgVGhlIGBDb21wb25lbnRgIGNsYXNzIHRvIHJlZ2lzdGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgQ29tcG9uZW50VG9SZWdpc3Rlcikge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb21wb25lbnQgbmFtZSwgXCInICsgbmFtZSArICdcIjsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgdmFyIFRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KCdUZWNoJyk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGNoZWNrIGlzIG9ubHkgZG9uZSBpZiBUZWNoIGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG4gICAgdmFyIGlzVGVjaCA9IFRlY2ggJiYgVGVjaC5pc1RlY2goQ29tcG9uZW50VG9SZWdpc3Rlcik7XG4gICAgdmFyIGlzQ29tcCA9IENvbXBvbmVudCA9PT0gQ29tcG9uZW50VG9SZWdpc3RlciB8fCBDb21wb25lbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoQ29tcG9uZW50VG9SZWdpc3Rlci5wcm90b3R5cGUpO1xuXG4gICAgaWYgKGlzVGVjaCB8fCAhaXNDb21wKSB7XG4gICAgICB2YXIgcmVhc29uID0gdm9pZCAwO1xuXG4gICAgICBpZiAoaXNUZWNoKSB7XG4gICAgICAgIHJlYXNvbiA9ICd0ZWNocyBtdXN0IGJlIHJlZ2lzdGVyZWQgdXNpbmcgVGVjaC5yZWdpc3RlclRlY2goKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWFzb24gPSAnbXVzdCBiZSBhIENvbXBvbmVudCBzdWJjbGFzcyc7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb21wb25lbnQsIFwiJyArIG5hbWUgKyAnXCI7ICcgKyByZWFzb24gKyAnLicpO1xuICAgIH1cblxuICAgIG5hbWUgPSB0b1RpdGxlQ2FzZShuYW1lKTtcblxuICAgIGlmICghQ29tcG9uZW50LmNvbXBvbmVudHNfKSB7XG4gICAgICBDb21wb25lbnQuY29tcG9uZW50c18gPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgUGxheWVyID0gQ29tcG9uZW50LmdldENvbXBvbmVudCgnUGxheWVyJyk7XG5cbiAgICBpZiAobmFtZSA9PT0gJ1BsYXllcicgJiYgUGxheWVyICYmIFBsYXllci5wbGF5ZXJzKSB7XG4gICAgICB2YXIgcGxheWVycyA9IFBsYXllci5wbGF5ZXJzO1xuICAgICAgdmFyIHBsYXllck5hbWVzID0gT2JqZWN0LmtleXMocGxheWVycyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgcGxheWVycyB0aGF0IHdlcmUgZGlzcG9zZWQsIHRoZW4gdGhlaXIgbmFtZSB3aWxsIHN0aWxsIGJlXG4gICAgICAvLyBpbiBQbGF5ZXJzLnBsYXllcnMuIFNvLCB3ZSBtdXN0IGxvb3AgdGhyb3VnaCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHZhbHVlXG4gICAgICAvLyBmb3IgZWFjaCBpdGVtIGlzIG5vdCBudWxsLiBUaGlzIGFsbG93cyByZWdpc3RyYXRpb24gb2YgdGhlIFBsYXllciBjb21wb25lbnRcbiAgICAgIC8vIGFmdGVyIGFsbCBwbGF5ZXJzIGhhdmUgYmVlbiBkaXNwb3NlZCBvciBiZWZvcmUgYW55IHdlcmUgY3JlYXRlZC5cbiAgICAgIGlmIChwbGF5ZXJzICYmIHBsYXllck5hbWVzLmxlbmd0aCA+IDAgJiYgcGxheWVyTmFtZXMubWFwKGZ1bmN0aW9uIChwbmFtZSkge1xuICAgICAgICByZXR1cm4gcGxheWVyc1twbmFtZV07XG4gICAgICB9KS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmVnaXN0ZXIgUGxheWVyIGNvbXBvbmVudCBhZnRlciBwbGF5ZXIgaGFzIGJlZW4gY3JlYXRlZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21wb25lbnQuY29tcG9uZW50c19bbmFtZV0gPSBDb21wb25lbnRUb1JlZ2lzdGVyO1xuXG4gICAgcmV0dXJuIENvbXBvbmVudFRvUmVnaXN0ZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBDb21wb25lbnRgIGJhc2VkIG9uIHRoZSBuYW1lIGl0IHdhcyByZWdpc3RlcmVkIHdpdGguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqICAgICAgICBUaGUgTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiAgICAgICAgIFRoZSBgQ29tcG9uZW50YCB0aGF0IGdvdCByZWdpc3RlcmVkIHVuZGVyIHRoZSBnaXZlbiBuYW1lLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBJbiBgdmlkZW9qc2AgNiB0aGlzIHdpbGwgbm90IHJldHVybiBgQ29tcG9uZW50YHMgdGhhdCB3ZXJlIG5vdFxuICAgKiAgICAgICAgICAgICByZWdpc3RlcmVkIHVzaW5nIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnR9LiBDdXJyZW50bHkgd2VcbiAgICogICAgICAgICAgICAgY2hlY2sgdGhlIGdsb2JhbCBgdmlkZW9qc2Agb2JqZWN0IGZvciBhIGBDb21wb25lbnRgIG5hbWUgYW5kXG4gICAqICAgICAgICAgICAgIHJldHVybiB0aGF0IGlmIGl0IGV4aXN0cy5cbiAgICovXG5cblxuICBDb21wb25lbnQuZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2V0Q29tcG9uZW50KG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBvbmVudHNfICYmIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0oKTtcblxuLyoqXG4gKiBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBzdXBwb3J0cyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAqXG4gKiBUaGlzIGlzIGV4cG9zZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc3VwcG9ydHNSYWZfID0gdHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDb21wb25lbnQnLCBDb21wb25lbnQpO1xuXG4vKipcbiAqIEBmaWxlIHRpbWUtcmFuZ2VzLmpzXG4gKiBAbW9kdWxlIHRpbWUtcmFuZ2VzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGF0IHRoZSBzdGFydCBvciBlbmRcbiAqIG9mIGEgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAZnVuY3Rpb24gdGltZS1yYW5nZXM6aW5kZXhGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9MF1cbiAqICAgICAgICBUaGUgcmFuZ2UgbnVtYmVyIHRvIHJldHVybiB0aGUgdGltZSBmb3IuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdGltZSB0aGF0IG9mZnNldCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqIEBkZXByaWNhdGVkIGluZGV4IG11c3QgYmUgc2V0IHRvIGEgdmFsdWUsIGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmFuZ2VzIG9mIHRpbWUgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUaW1lUmFuZ2VcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiAgICAgICAgICAgVGhlIG51bWJlciBvZiB0aW1lIHJhbmdlcyByZXByZXNlbnRlZCBieSB0aGlzIE9iamVjdFxuICpcbiAqIEBwcm9wZXJ0eSB7dGltZS1yYW5nZXM6aW5kZXhGdW5jdGlvbn0gc3RhcnRcbiAqICAgICAgICAgICBSZXR1cm5zIHRoZSB0aW1lIG9mZnNldCBhdCB3aGljaCBhIHNwZWNpZmllZCB0aW1lIHJhbmdlIGJlZ2lucy5cbiAqXG4gKiBAcHJvcGVydHkge3RpbWUtcmFuZ2VzOmluZGV4RnVuY3Rpb259IGVuZFxuICogICAgICAgICAgIFJldHVybnMgdGhlIHRpbWUgb2Zmc2V0IGF0IHdoaWNoIGEgc3BlY2lmaWVkIHRpbWUgcmFuZ2UgZW5kcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UaW1lUmFuZ2VzXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhbnkgb2YgdGhlIHRpbWUgcmFuZ2VzIGFyZSBvdmVyIHRoZSBtYXhpbXVtIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbk5hbWVcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqICAgICAgICBUaGUgaW5kZXggdG8gY2hlY2tcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4SW5kZXhcbiAqICAgICAgICBUaGUgbWF4aW11bSBwb3NzaWJsZSBpbmRleFxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgdGltZVJhbmdlcyBwcm92aWRlZCBhcmUgb3ZlciB0aGUgbWF4SW5kZXhcbiAqL1xuZnVuY3Rpb24gcmFuZ2VDaGVjayhmbk5hbWUsIGluZGV4LCBtYXhJbmRleCkge1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPiBtYXhJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGV4ZWN1dGUgXFwnJyArIGZuTmFtZSArICdcXCcgb24gXFwnVGltZVJhbmdlc1xcJzogVGhlIGluZGV4IHByb3ZpZGVkICgnICsgaW5kZXggKyAnKSBpcyBub24tbnVtZXJpYyBvciBvdXQgb2YgYm91bmRzICgwLScgKyBtYXhJbmRleCArICcpLicpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGF0IHRoZSBzdGFydCBvciBlbmRcbiAqIG9mIGEgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm5OYW1lXG4gKiAgICAgICAgVGhlIGZ1bmN0aW9uIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlSW5kZXhcbiAqICAgICAgICBUaGUgcHJvcHJldHkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZXQgdGhlIHRpbWUuIHNob3VsZCBiZSAnc3RhcnQnIG9yICdlbmQnXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmFuZ2VzXG4gKiAgICAgICAgQW4gYXJyYXkgb2YgdGltZSByYW5nZXNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBbcmFuZ2VJbmRleD0wXVxuICogICAgICAgIFRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGF0XG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdGltZSB0aGF0IG9mZnNldCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqXG4gKiBAZGVwcmljYXRlZCByYW5nZUluZGV4IG11c3QgYmUgc2V0IHRvIGEgdmFsdWUsIGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHJhbmdlSW5kZXggaXMgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgcmFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGdldFJhbmdlKGZuTmFtZSwgdmFsdWVJbmRleCwgcmFuZ2VzLCByYW5nZUluZGV4KSB7XG4gIHJhbmdlQ2hlY2soZm5OYW1lLCByYW5nZUluZGV4LCByYW5nZXMubGVuZ3RoIC0gMSk7XG4gIHJldHVybiByYW5nZXNbcmFuZ2VJbmRleF1bdmFsdWVJbmRleF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGltZSByYW5nZSBvYmplY3QgZ2l2ZW4gcmFuZ2VzIG9mIHRpbWUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gW3Jhbmdlc11cbiAqICAgICAgICBBbiBhcnJheSBvZiB0aW1lIHJhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlc09iaihyYW5nZXMpIHtcbiAgaWYgKHJhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IHJhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgVGltZVJhbmdlcyBvYmplY3QgaXMgZW1wdHknKTtcbiAgICAgIH0sXG4gICAgICBlbmQ6IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIFRpbWVSYW5nZXMgb2JqZWN0IGlzIGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxlbmd0aDogcmFuZ2VzLmxlbmd0aCxcbiAgICBzdGFydDogZ2V0UmFuZ2UuYmluZChudWxsLCAnc3RhcnQnLCAwLCByYW5nZXMpLFxuICAgIGVuZDogZ2V0UmFuZ2UuYmluZChudWxsLCAnZW5kJywgMSwgcmFuZ2VzKVxuICB9O1xufVxuXG4vKipcbiAqIFNob3VsZCBjcmVhdGUgYSBmYWtlIGBUaW1lUmFuZ2VgIG9iamVjdCB3aGljaCBtaW1pY3MgYW4gSFRNTDUgdGltZSByYW5nZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxBcnJheX0gc3RhcnRcbiAqICAgICAgICBUaGUgc3RhcnQgb2YgYSBzaW5nbGUgcmFuZ2Ugb3IgYW4gYXJyYXkgb2YgcmFuZ2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogICAgICAgIFRoZSBlbmQgb2YgYSBzaW5nbGUgcmFuZ2UuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlcyhzdGFydCwgZW5kKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzT2JqKHN0YXJ0KTtcbiAgfSBlbHNlIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVSYW5nZXNPYmooKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaihbW3N0YXJ0LCBlbmRdXSk7XG59XG5cbi8qKlxuICogQGZpbGUgYnVmZmVyLmpzXG4gKiBAbW9kdWxlIGJ1ZmZlclxuICovXG4vKipcbiAqIENvbXB1dGUgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIG1lZGlhIHRoYXQgaGFzIGJlZW4gYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHtUaW1lUmFuZ2V9IGJ1ZmZlcmVkXG4gKiAgICAgICAgVGhlIGN1cnJlbnQgYFRpbWVSYW5nZWAgb2JqZWN0IHJlcHJlc2VudGluZyBidWZmZXJlZCB0aW1lIHJhbmdlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvblxuICogICAgICAgIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBtZWRpYVxuICpcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgUGVyY2VudCBidWZmZXJlZCBvZiB0aGUgdG90YWwgZHVyYXRpb24gaW4gZGVjaW1hbCBmb3JtLlxuICovXG5mdW5jdGlvbiBidWZmZXJlZFBlcmNlbnQoYnVmZmVyZWQsIGR1cmF0aW9uKSB7XG4gIHZhciBidWZmZXJlZER1cmF0aW9uID0gMDtcbiAgdmFyIHN0YXJ0ID0gdm9pZCAwO1xuICB2YXIgZW5kID0gdm9pZCAwO1xuXG4gIGlmICghZHVyYXRpb24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmICghYnVmZmVyZWQgfHwgIWJ1ZmZlcmVkLmxlbmd0aCkge1xuICAgIGJ1ZmZlcmVkID0gY3JlYXRlVGltZVJhbmdlcygwLCAwKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgIGVuZCA9IGJ1ZmZlcmVkLmVuZChpKTtcblxuICAgIC8vIGJ1ZmZlcmVkIGVuZCBjYW4gYmUgYmlnZ2VyIHRoYW4gZHVyYXRpb24gYnkgYSB2ZXJ5IHNtYWxsIGZyYWN0aW9uXG4gICAgaWYgKGVuZCA+IGR1cmF0aW9uKSB7XG4gICAgICBlbmQgPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICBidWZmZXJlZER1cmF0aW9uICs9IGVuZCAtIHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlcmVkRHVyYXRpb24gLyBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBAZmlsZSBmdWxsc2NyZWVuLWFwaS5qc1xuICogQG1vZHVsZSBmdWxsc2NyZWVuLWFwaVxuICogQHByaXZhdGVcbiAqL1xuLyoqXG4gKiBTdG9yZSB0aGUgYnJvd3Nlci1zcGVjaWZpYyBtZXRob2RzIGZvciB0aGUgZnVsbHNjcmVlbiBBUEkuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBzZWUgW1NwZWNpZmljYXRpb25de0BsaW5rIGh0dHBzOi8vZnVsbHNjcmVlbi5zcGVjLndoYXR3Zy5vcmd9XG4gKiBAc2VlIFtNYXAgQXBwcm9hY2ggRnJvbSBTY3JlZW5mdWxsLmpzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3NjcmVlbmZ1bGwuanN9XG4gKi9cbnZhciBGdWxsc2NyZWVuQXBpID0ge307XG5cbi8vIGJyb3dzZXIgQVBJIG1ldGhvZHNcbnZhciBhcGlNYXAgPSBbWydyZXF1ZXN0RnVsbHNjcmVlbicsICdleGl0RnVsbHNjcmVlbicsICdmdWxsc2NyZWVuRWxlbWVudCcsICdmdWxsc2NyZWVuRW5hYmxlZCcsICdmdWxsc2NyZWVuY2hhbmdlJywgJ2Z1bGxzY3JlZW5lcnJvciddLFxuLy8gV2ViS2l0XG5bJ3dlYmtpdFJlcXVlc3RGdWxsc2NyZWVuJywgJ3dlYmtpdEV4aXRGdWxsc2NyZWVuJywgJ3dlYmtpdEZ1bGxzY3JlZW5FbGVtZW50JywgJ3dlYmtpdEZ1bGxzY3JlZW5FbmFibGVkJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sXG4vLyBPbGQgV2ViS2l0IChTYWZhcmkgNS4xKVxuWyd3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbicsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sXG4vLyBNb3ppbGxhXG5bJ21velJlcXVlc3RGdWxsU2NyZWVuJywgJ21vekNhbmNlbEZ1bGxTY3JlZW4nLCAnbW96RnVsbFNjcmVlbkVsZW1lbnQnLCAnbW96RnVsbFNjcmVlbkVuYWJsZWQnLCAnbW96ZnVsbHNjcmVlbmNoYW5nZScsICdtb3pmdWxsc2NyZWVuZXJyb3InXSxcbi8vIE1pY3Jvc29mdFxuWydtc1JlcXVlc3RGdWxsc2NyZWVuJywgJ21zRXhpdEZ1bGxzY3JlZW4nLCAnbXNGdWxsc2NyZWVuRWxlbWVudCcsICdtc0Z1bGxzY3JlZW5FbmFibGVkJywgJ01TRnVsbHNjcmVlbkNoYW5nZScsICdNU0Z1bGxzY3JlZW5FcnJvciddXTtcblxudmFyIHNwZWNBcGkgPSBhcGlNYXBbMF07XG52YXIgYnJvd3NlckFwaSA9IHZvaWQgMDtcblxuLy8gZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQgc2V0IG9mIGZ1bmN0aW9uc1xuZm9yICh2YXIgaSA9IDA7IGkgPCBhcGlNYXAubGVuZ3RoOyBpKyspIHtcbiAgLy8gY2hlY2sgZm9yIGV4aXRGdWxsc2NyZWVuIGZ1bmN0aW9uXG4gIGlmIChhcGlNYXBbaV1bMV0gaW4gZG9jdW1lbnQpIHtcbiAgICBicm93c2VyQXBpID0gYXBpTWFwW2ldO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIG1hcCB0aGUgYnJvd3NlciBBUEkgbmFtZXMgdG8gdGhlIHNwZWMgQVBJIG5hbWVzXG5pZiAoYnJvd3NlckFwaSkge1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYnJvd3NlckFwaS5sZW5ndGg7IF9pKyspIHtcbiAgICBGdWxsc2NyZWVuQXBpW3NwZWNBcGlbX2ldXSA9IGJyb3dzZXJBcGlbX2ldO1xuICB9XG59XG5cbi8qKlxuICogQGZpbGUgbWVkaWEtZXJyb3IuanNcbiAqL1xuLyoqXG4gKiBBIEN1c3RvbSBgTWVkaWFFcnJvcmAgY2xhc3Mgd2hpY2ggbWltaWNzIHRoZSBzdGFuZGFyZCBIVE1MNSBgTWVkaWFFcnJvcmAgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfE9iamVjdHxNZWRpYUVycm9yfSB2YWx1ZVxuICogICAgICAgIFRoaXMgY2FuIGJlIG9mIG11bHRpcGxlIHR5cGVzOlxuICogICAgICAgIC0gbnVtYmVyOiBzaG91bGQgYmUgYSBzdGFuZGFyZCBlcnJvciBjb2RlXG4gKiAgICAgICAgLSBzdHJpbmc6IGFuIGVycm9yIG1lc3NhZ2UgKHRoZSBjb2RlIHdpbGwgYmUgMClcbiAqICAgICAgICAtIE9iamVjdDogYXJiaXRyYXJ5IHByb3BlcnRpZXNcbiAqICAgICAgICAtIGBNZWRpYUVycm9yYCAobmF0aXZlKTogdXNlZCB0byBwb3B1bGF0ZSBhIHZpZGVvLmpzIGBNZWRpYUVycm9yYCBvYmplY3RcbiAqICAgICAgICAtIGBNZWRpYUVycm9yYCAodmlkZW8uanMpOiB3aWxsIHJldHVybiBpdHNlbGYgaWYgaXQncyBhbHJlYWR5IGFcbiAqICAgICAgICAgIHZpZGVvLmpzIGBNZWRpYUVycm9yYCBvYmplY3QuXG4gKlxuICogQHNlZSBbTWVkaWFFcnJvciBTcGVjXXtAbGluayBodHRwczovL2Rldi53My5vcmcvaHRtbDUvc3BlYy1hdXRob3Itdmlldy92aWRlby5odG1sI21lZGlhZXJyb3J9XG4gKiBAc2VlIFtFbmNyeXB0ZWQgTWVkaWFFcnJvciBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1lbmNyeXB0ZWQtbWVkaWEtMjAxMzA1MTAvI2Vycm9yLWNvZGVzfVxuICpcbiAqIEBjbGFzcyBNZWRpYUVycm9yXG4gKi9cbmZ1bmN0aW9uIE1lZGlhRXJyb3IodmFsdWUpIHtcblxuICAvLyBBbGxvdyByZWR1bmRhbnQgY2FsbHMgdG8gdGhpcyBjb25zdHJ1Y3RvciB0byBhdm9pZCBoYXZpbmcgYGluc3RhbmNlb2ZgXG4gIC8vIGNoZWNrcyBwZXBwZXJlZCBhcm91bmQgdGhlIGNvZGUuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1lZGlhRXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRoaXMuY29kZSA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBkZWZhdWx0IGNvZGUgaXMgemVybywgc28gdGhpcyBpcyBhIGN1c3RvbSBlcnJvclxuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXG4gICAgLy8gV2UgYXNzaWduIHRoZSBgY29kZWAgcHJvcGVydHkgbWFudWFsbHkgYmVjYXVzZSBuYXRpdmUgYE1lZGlhRXJyb3JgIG9iamVjdHNcbiAgICAvLyBkbyBub3QgZXhwb3NlIGl0IGFzIGFuIG93bi9lbnVtZXJhYmxlIHByb3BlcnR5IG9mIHRoZSBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5jb2RlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb2RlID0gdmFsdWUuY29kZTtcbiAgICB9XG5cbiAgICBhc3NpZ24odGhpcywgdmFsdWUpO1xuICB9XG5cbiAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBNZWRpYUVycm9yLmRlZmF1bHRNZXNzYWdlc1t0aGlzLmNvZGVdIHx8ICcnO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGVycm9yIGNvZGUgdGhhdCByZWZlcnMgdHdvIG9uZSBvZiB0aGUgZGVmaW5lZCBgTWVkaWFFcnJvcmAgdHlwZXNcbiAqXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZWRpYUVycm9yLnByb3RvdHlwZS5jb2RlID0gMDtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBtZXNzYWdlIHRoYXQgdG8gc2hvdyB3aXRoIHRoZSBlcnJvci4gTWVzc2FnZSBpcyBub3QgcGFydCBvZiB0aGUgSFRNTDVcbiAqIHZpZGVvIHNwZWMgYnV0IGFsbG93cyBmb3IgbW9yZSBpbmZvcm1hdGl2ZSBjdXN0b20gZXJyb3JzLlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbk1lZGlhRXJyb3IucHJvdG90eXBlLm1lc3NhZ2UgPSAnJztcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBzdGF0dXMgY29kZSB0aGF0IGNhbiBiZSBzZXQgYnkgcGx1Z2lucyB0byBhbGxvdyBldmVuIG1vcmUgZGV0YWlsIGFib3V0XG4gKiB0aGUgZXJyb3IuIEZvciBleGFtcGxlIGEgcGx1Z2luIG1pZ2h0IHByb3ZpZGUgYSBzcGVjaWZpYyBIVFRQIHN0YXR1cyBjb2RlIGFuZCBhblxuICogZXJyb3IgbWVzc2FnZSBmb3IgdGhhdCBjb2RlLiBUaGVuIHdoZW4gdGhlIHBsdWdpbiBnZXRzIHRoYXQgZXJyb3IgdGhpcyBjbGFzcyB3aWxsXG4gKiBrbm93IGhvdyB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgZm9yIGl0LiBUaGlzIGFsbG93cyBhIGN1c3RvbSBtZXNzYWdlIHRvIHNob3dcbiAqIHVwIG9uIHRoZSBgUGxheWVyYCBlcnJvciBvdmVybGF5LlxuICpcbiAqIEB0eXBlIHtBcnJheX1cbiAqL1xuTWVkaWFFcnJvci5wcm90b3R5cGUuc3RhdHVzID0gbnVsbDtcblxuLyoqXG4gKiBFcnJvcnMgaW5kZXhlZCBieSB0aGUgVzNDIHN0YW5kYXJkLiBUaGUgb3JkZXIgKipDQU5OT1QgQ0hBTkdFKiohIFNlZSB0aGVcbiAqIHNwZWNpZmljYXRpb24gbGlzdGVkIHVuZGVyIHtAbGluayBNZWRpYUVycm9yfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZW51bSB7YXJyYXl9XG4gKiBAcmVhZG9ubHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSAwIC0gTUVESUFfRVJSX0NVU1RPTVxuICogQHByb3BlcnR5IHtzdHJpbmd9IDEgLSBNRURJQV9FUlJfQ1VTVE9NXG4gKiBAcHJvcGVydHkge3N0cmluZ30gMiAtIE1FRElBX0VSUl9BQk9SVEVEXG4gKiBAcHJvcGVydHkge3N0cmluZ30gMyAtIE1FRElBX0VSUl9ORVRXT1JLXG4gKiBAcHJvcGVydHkge3N0cmluZ30gNCAtIE1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRFxuICogQHByb3BlcnR5IHtzdHJpbmd9IDUgLSBNRURJQV9FUlJfRU5DUllQVEVEXG4gKi9cbk1lZGlhRXJyb3IuZXJyb3JUeXBlcyA9IFsnTUVESUFfRVJSX0NVU1RPTScsICdNRURJQV9FUlJfQUJPUlRFRCcsICdNRURJQV9FUlJfTkVUV09SSycsICdNRURJQV9FUlJfREVDT0RFJywgJ01FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRCcsICdNRURJQV9FUlJfRU5DUllQVEVEJ107XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgYE1lZGlhRXJyb3JgIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSB7QGxpbmsgTWVkaWFFcnJvci5lcnJvclR5cGVzfS5cbiAqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKiBAY29uc3RhbnRcbiAqL1xuTWVkaWFFcnJvci5kZWZhdWx0TWVzc2FnZXMgPSB7XG4gIDE6ICdZb3UgYWJvcnRlZCB0aGUgbWVkaWEgcGxheWJhY2snLFxuICAyOiAnQSBuZXR3b3JrIGVycm9yIGNhdXNlZCB0aGUgbWVkaWEgZG93bmxvYWQgdG8gZmFpbCBwYXJ0LXdheS4nLFxuICAzOiAnVGhlIG1lZGlhIHBsYXliYWNrIHdhcyBhYm9ydGVkIGR1ZSB0byBhIGNvcnJ1cHRpb24gcHJvYmxlbSBvciBiZWNhdXNlIHRoZSBtZWRpYSB1c2VkIGZlYXR1cmVzIHlvdXIgYnJvd3NlciBkaWQgbm90IHN1cHBvcnQuJyxcbiAgNDogJ1RoZSBtZWRpYSBjb3VsZCBub3QgYmUgbG9hZGVkLCBlaXRoZXIgYmVjYXVzZSB0aGUgc2VydmVyIG9yIG5ldHdvcmsgZmFpbGVkIG9yIGJlY2F1c2UgdGhlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicsXG4gIDU6ICdUaGUgbWVkaWEgaXMgZW5jcnlwdGVkIGFuZCB3ZSBkbyBub3QgaGF2ZSB0aGUga2V5cyB0byBkZWNyeXB0IGl0Lidcbn07XG5cbi8vIEFkZCB0eXBlcyBhcyBwcm9wZXJ0aWVzIG9uIE1lZGlhRXJyb3Jcbi8vIGUuZy4gTWVkaWFFcnJvci5NRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQgPSA0O1xuZm9yICh2YXIgZXJyTnVtID0gMDsgZXJyTnVtIDwgTWVkaWFFcnJvci5lcnJvclR5cGVzLmxlbmd0aDsgZXJyTnVtKyspIHtcbiAgTWVkaWFFcnJvcltNZWRpYUVycm9yLmVycm9yVHlwZXNbZXJyTnVtXV0gPSBlcnJOdW07XG4gIC8vIHZhbHVlcyBzaG91bGQgYmUgYWNjZXNzaWJsZSBvbiBib3RoIHRoZSBjbGFzcyBhbmQgaW5zdGFuY2VcbiAgTWVkaWFFcnJvci5wcm90b3R5cGVbTWVkaWFFcnJvci5lcnJvclR5cGVzW2Vyck51bV1dID0gZXJyTnVtO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgaXMgYFByb21pc2VgLWxpa2UgKGkuZS4gaGFzIGEgYHRoZW5gIG1ldGhvZCkuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSAgdmFsdWVcbiAqICAgICAgICAgQW4gb2JqZWN0IHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYFByb21pc2VgLWxpa2UuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBgUHJvbWlzZWAtbGlrZS5cbiAqL1xuZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFNpbGVuY2UgYSBQcm9taXNlLWxpa2Ugb2JqZWN0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBhdm9pZGluZyBub24taGFybWZ1bCwgYnV0IHBvdGVudGlhbGx5IGNvbmZ1c2luZyBcInVuY2F1Z2h0XG4gKiBwbGF5IHByb21pc2VcIiByZWplY3Rpb24gZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSB2YWx1ZVxuICogICAgICAgICBBbiBvYmplY3QgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBgUHJvbWlzZWAtbGlrZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZVByb21pc2UodmFsdWUpIHtcbiAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICB2YWx1ZS50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7fSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLWxpc3QtY29udmVydGVyLmpzIFV0aWxpdGllcyBmb3IgY2FwdHVyaW5nIHRleHQgdHJhY2sgc3RhdGUgYW5kXG4gKiByZS1jcmVhdGluZyB0cmFja3MgYmFzZWQgb24gYSBjYXB0dXJlLlxuICpcbiAqIEBtb2R1bGUgdGV4dC10cmFjay1saXN0LWNvbnZlcnRlclxuICovXG5cbi8qKlxuICogRXhhbWluZSBhIHNpbmdsZSB7QGxpbmsgVGV4dFRyYWNrfSBhbmQgcmV0dXJuIGEgSlNPTi1jb21wYXRpYmxlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXRcbiAqIHJlcHJlc2VudHMgdGhlIHtAbGluayBUZXh0VHJhY2t9J3Mgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVGhlIHRleHQgdHJhY2sgdG8gcXVlcnkuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBIHNlcmlhbGl6YWJsZSBqYXZhc2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUZXh0VHJhY2suXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgdHJhY2tUb0pzb25fID0gZnVuY3Rpb24gdHJhY2tUb0pzb25fKHRyYWNrKSB7XG4gIHZhciByZXQgPSBbJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZ3VhZ2UnLCAnaWQnLCAnaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZScsICdtb2RlJywgJ3NyYyddLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wLCBpKSB7XG5cbiAgICBpZiAodHJhY2tbcHJvcF0pIHtcbiAgICAgIGFjY1twcm9wXSA9IHRyYWNrW3Byb3BdO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHtcbiAgICBjdWVzOiB0cmFjay5jdWVzICYmIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFjay5jdWVzLCBmdW5jdGlvbiAoY3VlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFRpbWU6IGN1ZS5zdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IGN1ZS5lbmRUaW1lLFxuICAgICAgICB0ZXh0OiBjdWUudGV4dCxcbiAgICAgICAgaWQ6IGN1ZS5pZFxuICAgICAgfTtcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBFeGFtaW5lIGEge0BsaW5rIFRlY2h9IGFuZCByZXR1cm4gYSBKU09OLWNvbXBhdGlibGUgamF2YXNjcmlwdCBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gKiBzdGF0ZSBvZiBhbGwge0BsaW5rIFRleHRUcmFja31zIGN1cnJlbnRseSBjb25maWd1cmVkLiBUaGUgcmV0dXJuIGFycmF5IGlzIGNvbXBhdGlibGUgd2l0aFxuICoge0BsaW5rIHRleHQtdHJhY2stbGlzdC1jb252ZXJ0ZXI6anNvblRvVGV4dFRyYWNrc30uXG4gKlxuICogQHBhcmFtIHtUZWNofSB0ZWNoXG4gKiAgICAgICAgVGhlIHRlY2ggb2JqZWN0IHRvIHF1ZXJ5XG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiAgICAgICAgIEEgc2VyaWFsaXphYmxlIGphdmFzY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBUZWNofXNcbiAqICAgICAgICAge0BsaW5rIFRleHRUcmFja0xpc3R9LlxuICovXG52YXIgdGV4dFRyYWNrc1RvSnNvbiA9IGZ1bmN0aW9uIHRleHRUcmFja3NUb0pzb24odGVjaCkge1xuXG4gIHZhciB0cmFja0VscyA9IHRlY2guJCQoJ3RyYWNrJyk7XG5cbiAgdmFyIHRyYWNrT2JqcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFja0VscywgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC50cmFjaztcbiAgfSk7XG4gIHZhciB0cmFja3MgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodHJhY2tFbHMsIGZ1bmN0aW9uICh0cmFja0VsKSB7XG4gICAgdmFyIGpzb24gPSB0cmFja1RvSnNvbl8odHJhY2tFbC50cmFjayk7XG5cbiAgICBpZiAodHJhY2tFbC5zcmMpIHtcbiAgICAgIGpzb24uc3JjID0gdHJhY2tFbC5zcmM7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9KTtcblxuICByZXR1cm4gdHJhY2tzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGVjaC50ZXh0VHJhY2tzKCksIGZ1bmN0aW9uICh0cmFjaykge1xuICAgIHJldHVybiB0cmFja09ianMuaW5kZXhPZih0cmFjaykgPT09IC0xO1xuICB9KS5tYXAodHJhY2tUb0pzb25fKSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHNldCBvZiByZW1vdGUge0BsaW5rIFRleHRUcmFja31zIG9uIGEge0BsaW5rIFRlY2h9IGJhc2VkIG9uIGFuIGFycmF5IG9mIGphdmFzY3JpcHRcbiAqIG9iamVjdCB7QGxpbmsgVGV4dFRyYWNrfSByZXByZXNlbnRhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0ganNvblxuICogICAgICAgIEFuIGFycmF5IG9mIGBUZXh0VHJhY2tgIHJlcHJlc2VudGF0aW9uIG9iamVjdHMsIGxpa2UgdGhvc2UgdGhhdCB3b3VsZCBiZVxuICogICAgICAgIHByb2R1Y2VkIGJ5IGB0ZXh0VHJhY2tzVG9Kc29uYC5cbiAqXG4gKiBAcGFyYW0ge1RlY2h9IHRlY2hcbiAqICAgICAgICBUaGUgYFRlY2hgIHRvIGNyZWF0ZSB0aGUgYFRleHRUcmFja2BzIG9uLlxuICovXG52YXIganNvblRvVGV4dFRyYWNrcyA9IGZ1bmN0aW9uIGpzb25Ub1RleHRUcmFja3MoanNvbiwgdGVjaCkge1xuICBqc29uLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgdmFyIGFkZGVkVHJhY2sgPSB0ZWNoLmFkZFJlbW90ZVRleHRUcmFjayh0cmFjaykudHJhY2s7XG5cbiAgICBpZiAoIXRyYWNrLnNyYyAmJiB0cmFjay5jdWVzKSB7XG4gICAgICB0cmFjay5jdWVzLmZvckVhY2goZnVuY3Rpb24gKGN1ZSkge1xuICAgICAgICByZXR1cm4gYWRkZWRUcmFjay5hZGRDdWUoY3VlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRlY2gudGV4dFRyYWNrcygpO1xufTtcblxudmFyIHRleHRUcmFja0NvbnZlcnRlciA9IHsgdGV4dFRyYWNrc1RvSnNvbjogdGV4dFRyYWNrc1RvSnNvbiwganNvblRvVGV4dFRyYWNrczoganNvblRvVGV4dFRyYWNrcywgdHJhY2tUb0pzb25fOiB0cmFja1RvSnNvbl8gfTtcblxuLyoqXG4gKiBAZmlsZSBtb2RhbC1kaWFsb2cuanNcbiAqL1xudmFyIE1PREFMX0NMQVNTX05BTUUgPSAndmpzLW1vZGFsLWRpYWxvZyc7XG52YXIgRVNDID0gMjc7XG5cbi8qKlxuICogVGhlIGBNb2RhbERpYWxvZ2AgZGlzcGxheXMgb3ZlciB0aGUgdmlkZW8gYW5kIGl0cyBjb250cm9scywgd2hpY2ggYmxvY2tzXG4gKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwbGF5ZXIgdW50aWwgaXQgaXMgY2xvc2VkLlxuICpcbiAqIE1vZGFsIGRpYWxvZ3MgaW5jbHVkZSBhIFwiQ2xvc2VcIiBidXR0b24gYW5kIHdpbGwgY2xvc2Ugd2hlbiB0aGF0IGJ1dHRvblxuICogaXMgYWN0aXZhdGVkIC0gb3Igd2hlbiBFU0MgaXMgcHJlc3NlZCBhbnl3aGVyZS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTW9kYWxEaWFsb2cgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhNb2RhbERpYWxvZywgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gW29wdGlvbnMuY29udGVudD11bmRlZmluZWRdXG4gICAqICAgICAgICBQcm92aWRlIGN1c3RvbWl6ZWQgY29udGVudCBmb3IgdGhpcyBtb2RhbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlc2NyaXB0aW9uXVxuICAgKiAgICAgICAgQSB0ZXh0IGRlc2NyaXB0aW9uIGZvciB0aGUgbW9kYWwsIHByaW1hcmlseSBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5maWxsQWx3YXlzPWZhbHNlXVxuICAgKiAgICAgICAgTm9ybWFsbHksIG1vZGFscyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgb25seSB0aGUgZmlyc3QgdGltZVxuICAgKiAgICAgICAgdGhleSBvcGVuLiBUaGlzIHRlbGxzIHRoZSBtb2RhbCB0byByZWZyZXNoIGl0cyBjb250ZW50XG4gICAqICAgICAgICBldmVyeSB0aW1lIGl0IG9wZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdXG4gICAqICAgICAgICBBIHRleHQgbGFiZWwgZm9yIHRoZSBtb2RhbCwgcHJpbWFyaWx5IGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRlbXBvcmFyeT10cnVlXVxuICAgKiAgICAgICAgSWYgYHRydWVgLCB0aGUgbW9kYWwgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2U7IGl0IHdpbGwgYmVcbiAgICogICAgICAgIGRpc3Bvc2VkIGFzIHNvb24gYXMgaXQncyBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudW5jbG9zZWFibGU9ZmFsc2VdXG4gICAqICAgICAgICBJZiBgdHJ1ZWAsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gY2xvc2UgdGhlIG1vZGFsXG4gICAqICAgICAgICB0aHJvdWdoIHRoZSBVSSBpbiB0aGUgbm9ybWFsIHdheXMuIFByb2dyYW1tYXRpYyBjbG9zaW5nIGlzXG4gICAqICAgICAgICBzdGlsbCBwb3NzaWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIE1vZGFsRGlhbG9nKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGFsRGlhbG9nKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMub3BlbmVkXyA9IF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSBmYWxzZTtcblxuICAgIF90aGlzLmNsb3NlYWJsZSghX3RoaXMub3B0aW9uc18udW5jbG9zZWFibGUpO1xuICAgIF90aGlzLmNvbnRlbnQoX3RoaXMub3B0aW9uc18uY29udGVudCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnRFbCBpcyBkZWZpbmVkIEFGVEVSIGFueSBjaGlsZHJlbiBhcmUgaW5pdGlhbGl6ZWRcbiAgICAvLyBiZWNhdXNlIHdlIG9ubHkgd2FudCB0aGUgY29udGVudHMgb2YgdGhlIG1vZGFsIGluIHRoZSBjb250ZW50RWxcbiAgICAvLyAobm90IHRoZSBVSSBlbGVtZW50cyBsaWtlIHRoZSBjbG9zZSBidXR0b24pLlxuICAgIF90aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiBNT0RBTF9DTEFTU19OQU1FICsgJy1jb250ZW50J1xuICAgIH0sIHtcbiAgICAgIHJvbGU6ICdkb2N1bWVudCdcbiAgICB9KTtcblxuICAgIF90aGlzLmRlc2NFbF8gPSBjcmVhdGVFbCgncCcsIHtcbiAgICAgIGNsYXNzTmFtZTogTU9EQUxfQ0xBU1NfTkFNRSArICctZGVzY3JpcHRpb24gdmpzLWNvbnRyb2wtdGV4dCcsXG4gICAgICBpZDogX3RoaXMuZWwoKS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICAgIH0pO1xuXG4gICAgdGV4dENvbnRlbnQoX3RoaXMuZGVzY0VsXywgX3RoaXMuZGVzY3JpcHRpb24oKSk7XG4gICAgX3RoaXMuZWxfLmFwcGVuZENoaWxkKF90aGlzLmRlc2NFbF8pO1xuICAgIF90aGlzLmVsXy5hcHBlbmRDaGlsZChfdGhpcy5jb250ZW50RWxfKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgTW9kYWxEaWFsb2dgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgRE9NIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKCksXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCB7XG4gICAgICAnYXJpYS1kZXNjcmliZWRieSc6IHRoaXMuaWQoKSArICdfZGVzY3JpcHRpb24nLFxuICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuICAgICAgJ2FyaWEtbGFiZWwnOiB0aGlzLmxhYmVsKCksXG4gICAgICAncm9sZSc6ICdkaWFsb2cnXG4gICAgfSk7XG4gIH07XG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMuY29udGVudEVsXyA9IG51bGw7XG4gICAgdGhpcy5kZXNjRWxfID0gbnVsbDtcbiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBNT0RBTF9DTEFTU19OQU1FICsgJyB2anMtaGlkZGVuICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYGtleWRvd25gIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIEVTQywgd2hpY2ggY2xvc2VzXG4gICAqIHRoZSBtb2RhbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZVxuICAgKiAgICAgICAgVGhlIGtleXByZXNzIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhlKSB7XG4gICAgaWYgKGUud2hpY2ggPT09IEVTQyAmJiB0aGlzLmNsb3NlYWJsZSgpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYWJlbCBzdHJpbmcgZm9yIHRoaXMgbW9kYWwuIFByaW1hcmlseSB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgdGhlIGxvY2FsaXplZCBvciByYXcgbGFiZWwgb2YgdGhpcyBtb2RhbC5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSh0aGlzLm9wdGlvbnNfLmxhYmVsIHx8ICdNb2RhbCBXaW5kb3cnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGlzIG1vZGFsLiBQcmltYXJpbHkgdXNlZCBmb3JcbiAgICogYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBsb2NhbGl6ZWQgb3IgcmF3IGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9kYWwuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGRlc2MgPSB0aGlzLm9wdGlvbnNfLmRlc2NyaXB0aW9uIHx8IHRoaXMubG9jYWxpemUoJ1RoaXMgaXMgYSBtb2RhbCB3aW5kb3cuJyk7XG5cbiAgICAvLyBBcHBlbmQgYSB1bml2ZXJzYWwgY2xvc2VhYmlsaXR5IG1lc3NhZ2UgaWYgdGhlIG1vZGFsIGlzIGNsb3NlYWJsZS5cbiAgICBpZiAodGhpcy5jbG9zZWFibGUoKSkge1xuICAgICAgZGVzYyArPSAnICcgKyB0aGlzLmxvY2FsaXplKCdUaGlzIG1vZGFsIGNhbiBiZSBjbG9zZWQgYnkgcHJlc3NpbmcgdGhlIEVzY2FwZSBrZXkgb3IgYWN0aXZhdGluZyB0aGUgY2xvc2UgYnV0dG9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBkZXNjO1xuICB9O1xuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbW9kYWwuXG4gICAqXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbG9wZW5cbiAgICogQGZpcmVzIE1vZGFsRGlhbG9nI21vZGFsb3BlblxuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gb3BlbigpIHtcbiAgICBpZiAoIXRoaXMub3BlbmVkXykge1xuICAgICAgdmFyIHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIGEgYE1vZGFsRGlhbG9nYCBpcyBvcGVuZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxvcGVuXG4gICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbG9wZW4nKTtcbiAgICAgIHRoaXMub3BlbmVkXyA9IHRydWU7XG5cbiAgICAgIC8vIEZpbGwgY29udGVudCBpZiB0aGUgbW9kYWwgaGFzIG5ldmVyIG9wZW5lZCBiZWZvcmUgYW5kXG4gICAgICAvLyBuZXZlciBiZWVuIGZpbGxlZC5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnNfLmZpbGxBbHdheXMgfHwgIXRoaXMuaGFzQmVlbk9wZW5lZF8gJiYgIXRoaXMuaGFzQmVlbkZpbGxlZF8pIHtcbiAgICAgICAgdGhpcy5maWxsKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwbGF5ZXIgd2FzIHBsYXlpbmcsIHBhdXNlIGl0IGFuZCB0YWtlIG5vdGUgb2YgaXRzIHByZXZpb3VzbHlcbiAgICAgIC8vIHBsYXlpbmcgc3RhdGUuXG4gICAgICB0aGlzLndhc1BsYXlpbmdfID0gIXBsYXllci5wYXVzZWQoKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9uc18ucGF1c2VPbk9wZW4gJiYgdGhpcy53YXNQbGF5aW5nXykge1xuICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2xvc2VhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5vbih0aGlzLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIGNvbnRyb2xzIGFuZCBub3RlIGlmIHRoZXkgd2VyZSBlbmFibGVkLlxuICAgICAgdGhpcy5oYWRDb250cm9sc18gPSBwbGF5ZXIuY29udHJvbHMoKTtcbiAgICAgIHBsYXllci5jb250cm9scyhmYWxzZSk7XG5cbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5jb25kaXRpb25hbEZvY3VzXygpO1xuICAgICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgLyoqXG4gICAgICAgICogRmlyZWQganVzdCBhZnRlciBhIGBNb2RhbERpYWxvZ2AgaXMgb3BlbmVkLlxuICAgICAgICAqXG4gICAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsb3BlblxuICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignbW9kYWxvcGVuJyk7XG4gICAgICB0aGlzLmhhc0JlZW5PcGVuZWRfID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBgTW9kYWxEaWFsb2dgIGlzIGN1cnJlbnRseSBvcGVuIG9yIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gW3ZhbHVlXVxuICAgKiAgICAgICAgIElmIGdpdmVuLCBpdCB3aWxsIG9wZW4gKGB0cnVlYCkgb3IgY2xvc2UgKGBmYWxzZWApIHRoZSBtb2RhbC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0aGUgY3VycmVudCBvcGVuIHN0YXRlIG9mIHRoZSBtb2RhbGRpYWxvZ1xuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcGVuZWQgPSBmdW5jdGlvbiBvcGVuZWQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXNbdmFsdWUgPyAnb3BlbicgOiAnY2xvc2UnXSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGVuZWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG1vZGFsLCBkb2VzIG5vdGhpbmcgaWYgdGhlIGBNb2RhbERpYWxvZ2AgaXNcbiAgICogbm90IG9wZW4uXG4gICAqXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbGNsb3NlXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNtb2RhbGNsb3NlXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLm9wZW5lZF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAvKipcbiAgICAgICogRmlyZWQganVzdCBiZWZvcmUgYSBgTW9kYWxEaWFsb2dgIGlzIGNsb3NlZC5cbiAgICAgICpcbiAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsY2xvc2VcbiAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZW1vZGFsY2xvc2UnKTtcbiAgICB0aGlzLm9wZW5lZF8gPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLndhc1BsYXlpbmdfICYmIHRoaXMub3B0aW9uc18ucGF1c2VPbk9wZW4pIHtcbiAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xvc2VhYmxlKCkpIHtcbiAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFkQ29udHJvbHNfKSB7XG4gICAgICBwbGF5ZXIuY29udHJvbHModHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5oaWRlKCk7XG4gICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgLyoqXG4gICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgYSBgTW9kYWxEaWFsb2dgIGlzIGNsb3NlZC5cbiAgICAgICpcbiAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsY2xvc2VcbiAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsY2xvc2UnKTtcbiAgICB0aGlzLmNvbmRpdGlvbmFsQmx1cl8oKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnNfLnRlbXBvcmFyeSkge1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGBNb2RhbERpYWxvZ2AgaXMgY2xvc2VhYmxlIHZpYSB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgICBJZiBnaXZlbiBhcyBhIGJvb2xlYW4sIGl0IHdpbGwgc2V0IHRoZSBgY2xvc2VhYmxlYCBvcHRpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIGNsb3NhYmxlIG9wdGlvbi5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY2xvc2VhYmxlID0gZnVuY3Rpb24gY2xvc2VhYmxlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YXIgY2xvc2VhYmxlID0gdGhpcy5jbG9zZWFibGVfID0gISF2YWx1ZTtcbiAgICAgIHZhciBjbG9zZSA9IHRoaXMuZ2V0Q2hpbGQoJ2Nsb3NlQnV0dG9uJyk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYmVpbmcgbWFkZSBjbG9zZWFibGUgYW5kIGhhcyBubyBjbG9zZSBidXR0b24sIGFkZCBvbmUuXG4gICAgICBpZiAoY2xvc2VhYmxlICYmICFjbG9zZSkge1xuXG4gICAgICAgIC8vIFRoZSBjbG9zZSBidXR0b24gc2hvdWxkIGJlIGEgY2hpbGQgb2YgdGhlIG1vZGFsIC0gbm90IGl0c1xuICAgICAgICAvLyBjb250ZW50IGVsZW1lbnQsIHNvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgY29udGVudCBlbGVtZW50LlxuICAgICAgICB2YXIgdGVtcCA9IHRoaXMuY29udGVudEVsXztcblxuICAgICAgICB0aGlzLmNvbnRlbnRFbF8gPSB0aGlzLmVsXztcbiAgICAgICAgY2xvc2UgPSB0aGlzLmFkZENoaWxkKCdjbG9zZUJ1dHRvbicsIHsgY29udHJvbFRleHQ6ICdDbG9zZSBNb2RhbCBEaWFsb2cnIH0pO1xuICAgICAgICB0aGlzLmNvbnRlbnRFbF8gPSB0ZW1wO1xuICAgICAgICB0aGlzLm9uKGNsb3NlLCAnY2xvc2UnLCB0aGlzLmNsb3NlKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBiZWluZyBtYWRlIHVuY2xvc2VhYmxlIGFuZCBoYXMgYSBjbG9zZSBidXR0b24sIHJlbW92ZSBpdC5cbiAgICAgIGlmICghY2xvc2VhYmxlICYmIGNsb3NlKSB7XG4gICAgICAgIHRoaXMub2ZmKGNsb3NlLCAnY2xvc2UnLCB0aGlzLmNsb3NlKTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChjbG9zZSk7XG4gICAgICAgIGNsb3NlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VhYmxlXztcbiAgfTtcblxuICAvKipcbiAgICogRmlsbCB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQgd2l0aCB0aGUgbW9kYWwncyBcImNvbnRlbnRcIiBvcHRpb24uXG4gICAqIFRoZSBjb250ZW50IGVsZW1lbnQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB0aGlzIGNoYW5nZSB0YWtlcyBwbGFjZS5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwoKSB7XG4gICAgdGhpcy5maWxsV2l0aCh0aGlzLmNvbnRlbnQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbGwgdGhlIG1vZGFsJ3MgY29udGVudCBlbGVtZW50IHdpdGggYXJiaXRyYXJ5IGNvbnRlbnQuXG4gICAqIFRoZSBjb250ZW50IGVsZW1lbnQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB0aGlzIGNoYW5nZSB0YWtlcyBwbGFjZS5cbiAgICpcbiAgICogQGZpcmVzIE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsZmlsbFxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjbW9kYWxmaWxsXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IFtjb250ZW50XVxuICAgKiAgICAgICAgVGhlIHNhbWUgcnVsZXMgYXBwbHkgdG8gdGhpcyBhcyBhcHBseSB0byB0aGUgYGNvbnRlbnRgIG9wdGlvbi5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZmlsbFdpdGggPSBmdW5jdGlvbiBmaWxsV2l0aChjb250ZW50KSB7XG4gICAgdmFyIGNvbnRlbnRFbCA9IHRoaXMuY29udGVudEVsKCk7XG4gICAgdmFyIHBhcmVudEVsID0gY29udGVudEVsLnBhcmVudE5vZGU7XG4gICAgdmFyIG5leHRTaWJsaW5nRWwgPSBjb250ZW50RWwubmV4dFNpYmxpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSBhIGBNb2RhbERpYWxvZ2AgaXMgZmlsbGVkIHdpdGggY29udGVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbGZpbGxcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGZpbGwnKTtcbiAgICB0aGlzLmhhc0JlZW5GaWxsZWRfID0gdHJ1ZTtcblxuICAgIC8vIERldGFjaCB0aGUgY29udGVudCBlbGVtZW50IGZyb20gdGhlIERPTSBiZWZvcmUgcGVyZm9ybWluZ1xuICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGxpdmUgRE9NIG11bHRpcGxlIHRpbWVzLlxuICAgIHBhcmVudEVsLnJlbW92ZUNoaWxkKGNvbnRlbnRFbCk7XG4gICAgdGhpcy5lbXB0eSgpO1xuICAgIGluc2VydENvbnRlbnQoY29udGVudEVsLCBjb250ZW50KTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGFmdGVyIGEgYE1vZGFsRGlhbG9nYCBpcyBmaWxsZWQgd2l0aCBjb250ZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsZmlsbFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsZmlsbCcpO1xuXG4gICAgLy8gUmUtaW5qZWN0IHRoZSByZS1maWxsZWQgY29udGVudCBlbGVtZW50LlxuICAgIGlmIChuZXh0U2libGluZ0VsKSB7XG4gICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUoY29udGVudEVsLCBuZXh0U2libGluZ0VsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQoY29udGVudEVsKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY2xvc2UgYnV0dG9uIGlzIGxhc3QgaW4gdGhlIGRpYWxvZyBET01cbiAgICB2YXIgY2xvc2VCdXR0b24gPSB0aGlzLmdldENoaWxkKCdjbG9zZUJ1dHRvbicpO1xuXG4gICAgaWYgKGNsb3NlQnV0dG9uKSB7XG4gICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChjbG9zZUJ1dHRvbi5lbF8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRW1wdGllcyB0aGUgY29udGVudCBlbGVtZW50LiBUaGlzIGhhcHBlbnMgYW55dGltZSB0aGUgbW9kYWwgaXMgZmlsbGVkLlxuICAgKlxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxlbXB0eVxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjbW9kYWxlbXB0eVxuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIGEgYE1vZGFsRGlhbG9nYCBpcyBlbXB0aWVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsZW1wdHlcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGVtcHR5Jyk7XG4gICAgZW1wdHlFbCh0aGlzLmNvbnRlbnRFbCgpKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgYSBgTW9kYWxEaWFsb2dgIGlzIGVtcHRpZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjbW9kYWxlbXB0eVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsZW1wdHknKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBtb2RhbCBjb250ZW50LCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nXG4gICAqIHJlbmRlcmVkIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCB1cGRhdGUgdGhlIERPTSBvciBmaWxsIHRoZSBtb2RhbCwgYnV0IGl0IGlzIGNhbGxlZCBkdXJpbmdcbiAgICogdGhhdCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtNaXhlZH0gW3ZhbHVlXVxuICAgKiAgICAgICAgIElmIGRlZmluZWQsIHNldHMgdGhlIGludGVybmFsIGNvbnRlbnQgdmFsdWUgdG8gYmUgdXNlZCBvbiB0aGVcbiAgICogICAgICAgICBuZXh0IGNhbGwocykgdG8gYGZpbGxgLiBUaGlzIHZhbHVlIGlzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nXG4gICAqICAgICAgICAgaW5zZXJ0ZWQuIFRvIFwiY2xlYXJcIiB0aGUgaW50ZXJuYWwgY29udGVudCB2YWx1ZSwgcGFzcyBgbnVsbGAuXG4gICAqXG4gICAqIEByZXR1cm4ge01peGVkfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIG1vZGFsIGRpYWxvZ1xuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gY29udGVudCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRfID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb25kaXRpb25hbGx5IGZvY3VzIHRoZSBtb2RhbCBkaWFsb2cgaWYgZm9jdXMgd2FzIHByZXZpb3VzbHkgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxGb2N1c18gPSBmdW5jdGlvbiBjb25kaXRpb25hbEZvY3VzXygpIHtcbiAgICB2YXIgYWN0aXZlRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHZhciBwbGF5ZXJFbCA9IHRoaXMucGxheWVyXy5lbF87XG5cbiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuXG4gICAgaWYgKHBsYXllckVsLmNvbnRhaW5zKGFjdGl2ZUVsKSB8fCBwbGF5ZXJFbCA9PT0gYWN0aXZlRWwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXyA9IGFjdGl2ZUVsO1xuXG4gICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgIHRoaXMub24oZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbmRpdGlvbmFsbHkgYmx1ciB0aGUgZWxlbWVudCBhbmQgcmVmb2N1cyB0aGUgbGFzdCBmb2N1c2VkIGVsZW1lbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxCbHVyXyA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQmx1cl8oKSB7XG4gICAgaWYgKHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXykge1xuICAgICAgdGhpcy5wcmV2aW91c2x5QWN0aXZlRWxfLmZvY3VzKCk7XG4gICAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEtleWRvd24gaGFuZGxlci4gQXR0YWNoZWQgd2hlbiBtb2RhbCBpcyBmb2N1c2VkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgLy8gZXhpdCBlYXJseSBpZiBpdCBpc24ndCBhIHRhYiBrZXlcbiAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZm9jdXNhYmxlRWxzID0gdGhpcy5mb2N1c2FibGVFbHNfKCk7XG4gICAgdmFyIGFjdGl2ZUVsID0gdGhpcy5lbF8ucXVlcnlTZWxlY3RvcignOmZvY3VzJyk7XG4gICAgdmFyIGZvY3VzSW5kZXggPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvY3VzYWJsZUVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFjdGl2ZUVsID09PSBmb2N1c2FibGVFbHNbaV0pIHtcbiAgICAgICAgZm9jdXNJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsXykge1xuICAgICAgZm9jdXNJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgIGZvY3VzYWJsZUVsc1tmb2N1c2FibGVFbHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgZm9jdXNJbmRleCA9PT0gZm9jdXNhYmxlRWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvY3VzYWJsZUVsc1swXS5mb2N1cygpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmZvY3VzYWJsZUVsc18gPSBmdW5jdGlvbiBmb2N1c2FibGVFbHNfKCkge1xuICAgIHZhciBhbGxDaGlsZHJlbiA9IHRoaXMuZWxfLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTtcblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYWxsQ2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIChjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQW5jaG9yRWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQXJlYUVsZW1lbnQpICYmIGNoaWxkLmhhc0F0dHJpYnV0ZSgnaHJlZicpIHx8IChjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQpICYmICFjaGlsZC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTE9iamVjdEVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVtYmVkRWxlbWVudCB8fCBjaGlsZC5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykgJiYgY2hpbGQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpICE9PSAtMSB8fCBjaGlsZC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbERpYWxvZztcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBNb2RhbERpYWxvZ2AgZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuTW9kYWxEaWFsb2cucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBwYXVzZU9uT3BlbjogdHJ1ZSxcbiAgdGVtcG9yYXJ5OiB0cnVlXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ01vZGFsRGlhbG9nJywgTW9kYWxEaWFsb2cpO1xuXG4vKipcbiAqIEBmaWxlIHRyYWNrLWxpc3QuanNcbiAqL1xuLyoqXG4gKiBDb21tb24gZnVuY3Rpb25hbGl5IGJldHdlZW4ge0BsaW5rIFRleHRUcmFja0xpc3R9LCB7QGxpbmsgQXVkaW9UcmFja0xpc3R9LCBhbmRcbiAqIHtAbGluayBWaWRlb1RyYWNrTGlzdH1cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudFRhcmdldFxuICovXG5cbnZhciBUcmFja0xpc3QgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKFRyYWNrTGlzdCwgX0V2ZW50VGFyZ2V0KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtUcmFja1tdfSB0cmFja3NcbiAgICogICAgICAgIEEgbGlzdCBvZiB0cmFja3MgdG8gaW5pdGlhbGl6ZSB0aGUgbGlzdCB3aXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xpc3RdXG4gICAqICAgICAgICBUaGUgY2hpbGQgb2JqZWN0IHdpdGggaW5oZXJpdGFuY2UgZG9uZSBtYW51YWxseSBmb3IgaWU4LlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGZ1bmN0aW9uIFRyYWNrTGlzdCgpIHtcbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIHZhciBfcmV0O1xuXG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2tMaXN0KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0V2ZW50VGFyZ2V0LmNhbGwodGhpcykpO1xuXG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gX3RoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIGlmIChJU19JRTgpIHtcbiAgICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIFRyYWNrTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGlzdC50cmFja3NfID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVHJhY2tMaXN0XG4gICAgICogQG1lbWJlciB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKiAgICAgICAgIFRoZSBjdXJyZW50IG51bWJlciBvZiBgVHJhY2tgcyBpbiB0aGUgdGhpcyBUcmFja2lzdC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3NfLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsaXN0LmFkZFRyYWNrKHRyYWNrc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gbXVzdCByZXR1cm4gdGhlIG9iamVjdCwgYXMgZm9yIGllOCBpdCB3aWxsIG5vdCBiZSB0aGlzXG4gICAgLy8gYnV0IGEgcmVmZXJlbmNlIHRvIGEgZG9jdW1lbnQgb2JqZWN0XG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB7QGxpbmsgVHJhY2t9IHRvIHRoZSBgVHJhY2tMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge1RyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIGF1ZGlvLCB2aWRlbywgb3IgdGV4dCB0cmFjayB0byBhZGQgdG8gdGhlIGxpc3QuXG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjYWRkdHJhY2tcbiAgICovXG5cblxuICBUcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrID0gZnVuY3Rpb24gYWRkVHJhY2sodHJhY2spIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnRyYWNrc18ubGVuZ3RoO1xuXG4gICAgaWYgKCEoJycgKyBpbmRleCBpbiB0aGlzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrc19baW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSB0cmFja3NcbiAgICBpZiAodGhpcy50cmFja3NfLmluZGV4T2YodHJhY2spID09PSAtMSkge1xuICAgICAgdGhpcy50cmFja3NfLnB1c2godHJhY2spO1xuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRyYWNrIGlzIGFkZGVkIHRvIGEgdHJhY2sgbGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBAZXZlbnQgVHJhY2tMaXN0I2FkZHRyYWNrXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKiBAcHJvcGVydHkge1RyYWNrfSB0cmFja1xuICAgICAgICogICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIHRyYWNrIHRoYXQgd2FzIGFkZGVkLlxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgICB0cmFjazogdHJhY2ssXG4gICAgICAgIHR5cGU6ICdhZGR0cmFjaydcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEge0BsaW5rIFRyYWNrfSBmcm9tIHRoZSBgVHJhY2tMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge1RyYWNrfSBydHJhY2tcbiAgICogICAgICAgIFRoZSBhdWRpbywgdmlkZW8sIG9yIHRleHQgdHJhY2sgdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3QuXG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjcmVtb3ZldHJhY2tcbiAgICovXG5cblxuICBUcmFja0xpc3QucHJvdG90eXBlLnJlbW92ZVRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlVHJhY2socnRyYWNrKSB7XG4gICAgdmFyIHRyYWNrID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRoaXNbaV0gPT09IHJ0cmFjaykge1xuICAgICAgICB0cmFjayA9IHRoaXNbaV07XG4gICAgICAgIGlmICh0cmFjay5vZmYpIHtcbiAgICAgICAgICB0cmFjay5vZmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhY2tzXy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRyYWNrIGxpc3QuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgVHJhY2tMaXN0I3JlbW92ZXRyYWNrXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqIEBwcm9wZXJ0eSB7VHJhY2t9IHRyYWNrXG4gICAgICogICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIHRyYWNrIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKHtcbiAgICAgIHRyYWNrOiB0cmFjayxcbiAgICAgIHR5cGU6ICdyZW1vdmV0cmFjaydcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGEgVHJhY2sgZnJvbSB0aGUgVHJhY2tMaXN0IGJ5IGEgdHJhY2tzIGlkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIHRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZ2V0XG4gICAqIEBtZXRob2QgZ2V0VHJhY2tCeUlkXG4gICAqIEByZXR1cm4ge1RyYWNrfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRyYWNrTGlzdC5wcm90b3R5cGUuZ2V0VHJhY2tCeUlkID0gZnVuY3Rpb24gZ2V0VHJhY2tCeUlkKGlkKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0aGlzW2ldO1xuXG4gICAgICBpZiAodHJhY2suaWQgPT09IGlkKSB7XG4gICAgICAgIHJlc3VsdCA9IHRyYWNrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBUcmFja0xpc3Q7XG59KEV2ZW50VGFyZ2V0KTtcblxuLyoqXG4gKiBUcmlnZ2VyZWQgd2hlbiBhIGRpZmZlcmVudCB0cmFjayBpcyBzZWxlY3RlZC9lbmFibGVkLlxuICpcbiAqIEBldmVudCBUcmFja0xpc3QjY2hhbmdlXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cblxuLyoqXG4gKiBFdmVudHMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggb24gKyBldmVudE5hbWUuIFNlZSB7QGxpbmsgRXZlbnRIYW5kbGVyfS5cbiAqXG4gKiBAcHJvcGVydHkge09iamVjdH0gVHJhY2tMaXN0I2FsbG93ZWRFdmVudHNfXG4gKiBAcHJpdmF0ZVxuICovXG5cblxuVHJhY2tMaXN0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgYWRkdHJhY2s6ICdhZGR0cmFjaycsXG4gIHJlbW92ZXRyYWNrOiAncmVtb3ZldHJhY2snXG59O1xuXG4vLyBlbXVsYXRlIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgc3VwcG9ydCB0byBhbGxvdyBmb3IgZmVhdHVyZSBkZXRlY3Rpb25cbmZvciAodmFyIGV2ZW50IGluIFRyYWNrTGlzdC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c18pIHtcbiAgVHJhY2tMaXN0LnByb3RvdHlwZVsnb24nICsgZXZlbnRdID0gbnVsbDtcbn1cblxuLyoqXG4gKiBAZmlsZSBhdWRpby10cmFjay1saXN0LmpzXG4gKi9cbi8qKlxuICogQW55d2hlcmUgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIHdlIGRpdmVyZ2UgZnJvbSB0aGUgc3BlY1xuICogYXMgd2Ugb25seSBzdXBwb3J0IG9uZSBlbmFibGVkIGF1ZGlvdHJhY2sgYXQgYSB0aW1lXG4gKlxuICogQHBhcmFtIHtBdWRpb1RyYWNrTGlzdH0gbGlzdFxuICogICAgICAgIGxpc3QgdG8gd29yayBvblxuICpcbiAqIEBwYXJhbSB7QXVkaW9UcmFja30gdHJhY2tcbiAqICAgICAgICBUaGUgdHJhY2sgdG8gc2tpcFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBkaXNhYmxlT3RoZXJzID0gZnVuY3Rpb24gZGlzYWJsZU90aGVycyhsaXN0LCB0cmFjaykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGxpc3RbaV0pLmxlbmd0aCB8fCB0cmFjay5pZCA9PT0gbGlzdFtpXS5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGFub3RoZXIgYXVkaW8gdHJhY2sgaXMgZW5hYmxlZCwgZGlzYWJsZSBpdFxuICAgIGxpc3RbaV0uZW5hYmxlZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGxpc3Qgb2Yge0BsaW5rIEF1ZGlvVHJhY2t9IGZvciBhIG1lZGlhIGZpbGUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIEF1ZGlvVHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFja0xpc3QsIF9UcmFja0xpc3QpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtBdWRpb1RyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYEF1ZGlvVHJhY2tgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBBdWRpb1RyYWNrTGlzdCgpIHtcbiAgICB2YXIgX3RoaXMsIF9yZXQ7XG5cbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIG1ha2Ugc3VyZSBvbmx5IDEgdHJhY2sgaXMgZW5hYmxlZFxuICAgIC8vIHNvcnRlZCBmcm9tIGxhc3QgaW5kZXggdG8gZmlyc3QgaW5kZXhcbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodHJhY2tzW2ldLmVuYWJsZWQpIHtcbiAgICAgICAgZGlzYWJsZU90aGVycyh0cmFja3MsIHRyYWNrc1tpXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoX3Byb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W19wcm9wXSA9IEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZVtfcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tMaXN0LmNhbGwodGhpcywgdHJhY2tzLCBsaXN0KSksIF90aGlzKTtcbiAgICBsaXN0LmNoYW5naW5nXyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4ge0BsaW5rIEF1ZGlvVHJhY2t9IHRvIHRoZSBgQXVkaW9UcmFja0xpc3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUaGUgQXVkaW9UcmFjayB0byBhZGQgdG8gdGhlIGxpc3RcbiAgICpcbiAgICogQGZpcmVzIFRyYWNrTGlzdCNhZGR0cmFja1xuICAgKi9cblxuXG4gIEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uIGFkZFRyYWNrKHRyYWNrKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAodHJhY2suZW5hYmxlZCkge1xuICAgICAgZGlzYWJsZU90aGVycyh0aGlzLCB0cmFjayk7XG4gICAgfVxuXG4gICAgX1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2suY2FsbCh0aGlzLCB0cmFjayk7XG4gICAgLy8gbmF0aXZlIHRyYWNrcyBkb24ndCBoYXZlIHRoaXNcbiAgICBpZiAoIXRyYWNrLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2VcbiAgICAgKiBAZmlyZXMgVHJhY2tMaXN0I2NoYW5nZVxuICAgICAqL1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2VuYWJsZWRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB3aGVuIHdlIGFyZSBkaXNhYmxpbmcgb3RoZXIgdHJhY2tzIChzaW5jZSB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtb3JlIHRoYW4gb25lIHRyYWNrIGF0IGEgdGltZSkgd2Ugd2lsbCBzZXQgY2hhbmdpbmdfXG4gICAgICAvLyB0byB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgdHJpZ2dlciBhZGRpdGlvbmFsIGNoYW5nZSBldmVudHNcbiAgICAgIGlmIChfdGhpczIuY2hhbmdpbmdfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSB0cnVlO1xuICAgICAgZGlzYWJsZU90aGVycyhfdGhpczIsIHRyYWNrKTtcbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIF90aGlzMi50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gQXVkaW9UcmFja0xpc3Q7XG59KFRyYWNrTGlzdCk7XG5cbi8qKlxuICogQGZpbGUgdmlkZW8tdHJhY2stbGlzdC5qc1xuICovXG4vKipcbiAqIFVuLXNlbGVjdCBhbGwgb3RoZXIge0BsaW5rIFZpZGVvVHJhY2t9cyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge1ZpZGVvVHJhY2tMaXN0fSBsaXN0XG4gKiAgICAgICAgbGlzdCB0byB3b3JrIG9uXG4gKlxuICogQHBhcmFtIHtWaWRlb1RyYWNrfSB0cmFja1xuICogICAgICAgIFRoZSB0cmFjayB0byBza2lwXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGRpc2FibGVPdGhlcnMkMSA9IGZ1bmN0aW9uIGRpc2FibGVPdGhlcnMobGlzdCwgdHJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhsaXN0W2ldKS5sZW5ndGggfHwgdHJhY2suaWQgPT09IGxpc3RbaV0uaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBhbm90aGVyIHZpZGVvIHRyYWNrIGlzIGVuYWJsZWQsIGRpc2FibGUgaXRcbiAgICBsaXN0W2ldLnNlbGVjdGVkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgVmlkZW9UcmFja30gZm9yIGEgdmlkZW8uXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIFZpZGVvVHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHtcbiAgaW5oZXJpdHMoVmlkZW9UcmFja0xpc3QsIF9UcmFja0xpc3QpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWaWRlb1RyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYFZpZGVvVHJhY2tgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBWaWRlb1RyYWNrTGlzdCgpIHtcbiAgICB2YXIgX3RoaXMsIF9yZXQ7XG5cbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWaWRlb1RyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIG1ha2Ugc3VyZSBvbmx5IDEgdHJhY2sgaXMgZW5hYmxlZFxuICAgIC8vIHNvcnRlZCBmcm9tIGxhc3QgaW5kZXggdG8gZmlyc3QgaW5kZXhcbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodHJhY2tzW2ldLnNlbGVjdGVkKSB7XG4gICAgICAgIGRpc2FibGVPdGhlcnMkMSh0cmFja3MsIHRyYWNrc1tpXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIFZpZGVvVHJhY2tMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoX3Byb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W19wcm9wXSA9IFZpZGVvVHJhY2tMaXN0LnByb3RvdHlwZVtfcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tMaXN0LmNhbGwodGhpcywgdHJhY2tzLCBsaXN0KSksIF90aGlzKTtcbiAgICBsaXN0LmNoYW5naW5nXyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfSBWaWRlb1RyYWNrTGlzdCNzZWxlY3RlZEluZGV4XG4gICAgICogICAgICAgICBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQge0BsaW5rIFZpZGVvVHJhY2tgfS5cbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ3NlbGVjdGVkSW5kZXgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXNbX2ldLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gX2k7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JldCA9IGxpc3QsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHtAbGluayBWaWRlb1RyYWNrfSB0byB0aGUgYFZpZGVvVHJhY2tMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtWaWRlb1RyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIFZpZGVvVHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0XG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjYWRkdHJhY2tcbiAgICovXG5cblxuICBWaWRlb1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2sgPSBmdW5jdGlvbiBhZGRUcmFjayh0cmFjaykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHRyYWNrLnNlbGVjdGVkKSB7XG4gICAgICBkaXNhYmxlT3RoZXJzJDEodGhpcywgdHJhY2spO1xuICAgIH1cblxuICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spO1xuICAgIC8vIG5hdGl2ZSB0cmFja3MgZG9uJ3QgaGF2ZSB0aGlzXG4gICAgaWYgKCF0cmFjay5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVmlkZW9UcmFjayNzZWxlY3RlZGNoYW5nZVxuICAgICAqIEBmaXJlcyBUcmFja0xpc3QjY2hhbmdlXG4gICAgICovXG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0ZWRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLmNoYW5naW5nXykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfdGhpczIuY2hhbmdpbmdfID0gdHJ1ZTtcbiAgICAgIGRpc2FibGVPdGhlcnMkMShfdGhpczIsIHRyYWNrKTtcbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIF90aGlzMi50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVmlkZW9UcmFja0xpc3Q7XG59KFRyYWNrTGlzdCk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1saXN0LmpzXG4gKi9cbi8qKlxuICogVGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgVGV4dFRyYWNrfSBmb3IgYSBtZWRpYSBmaWxlLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIFRleHRUcmFja0xpc3QgPSBmdW5jdGlvbiAoX1RyYWNrTGlzdCkge1xuICBpbmhlcml0cyhUZXh0VHJhY2tMaXN0LCBfVHJhY2tMaXN0KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYFRleHRUcmFja2AgdG8gaW5zdGFudGlhdGUgdGhlIGxpc3Qgd2l0aC5cbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja0xpc3QoKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIHRyYWNrcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIFRleHRUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChfcHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIGxpc3RbX3Byb3BdID0gVGV4dFRyYWNrTGlzdC5wcm90b3R5cGVbX3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGlzdCA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrTGlzdC5jYWxsKHRoaXMsIHRyYWNrcywgbGlzdCkpLCBfdGhpcyk7XG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB7QGxpbmsgVGV4dFRyYWNrfSB0byB0aGUgYFRleHRUcmFja0xpc3RgXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIHRleHQgdHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAZmlyZXMgVHJhY2tMaXN0I2FkZHRyYWNrXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2sgPSBmdW5jdGlvbiBhZGRUcmFjayh0cmFjaykge1xuICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spO1xuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI21vZGVjaGFuZ2VcbiAgICAgKiBAZmlyZXMgVHJhY2tMaXN0I2NoYW5nZVxuICAgICAqL1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfSkpO1xuXG4gICAgdmFyIG5vbkxhbmd1YWdlVGV4dFRyYWNrS2luZCA9IFsnbWV0YWRhdGEnLCAnY2hhcHRlcnMnXTtcblxuICAgIGlmIChub25MYW5ndWFnZVRleHRUcmFja0tpbmQuaW5kZXhPZih0cmFjay5raW5kKSA9PT0gLTEpIHtcbiAgICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzZWxlY3RlZGxhbmd1YWdlY2hhbmdlJyk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tMaXN0O1xufShUcmFja0xpc3QpO1xuXG4vKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC1saXN0LmpzXG4gKi9cblxuLyoqXG4gKiBUaGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fXMuXG4gKi9cblxudmFyIEh0bWxUcmFja0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtIdG1sVHJhY2tFbGVtZW50W119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYEh0bWxUcmFja0VsZW1lbnRgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBIdG1sVHJhY2tFbGVtZW50TGlzdCgpIHtcbiAgICB2YXIgdHJhY2tFbGVtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSHRtbFRyYWNrRWxlbWVudExpc3QpO1xuXG4gICAgdmFyIGxpc3QgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gSHRtbFRyYWNrRWxlbWVudExpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxpc3QudHJhY2tFbGVtZW50c18gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBIdG1sVHJhY2tFbGVtZW50TGlzdFxuICAgICAqIEBtZW1iZXIge251bWJlcn0gbGVuZ3RoXG4gICAgICogICAgICAgICBUaGUgY3VycmVudCBudW1iZXIgb2YgYFRyYWNrYHMgaW4gdGhlIHRoaXMgVHJhY2tpc3QuXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdsZW5ndGgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRyYWNrRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3QuYWRkVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fSB0byB0aGUgYEh0bWxUcmFja0VsZW1lbnRMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge0h0bWxUcmFja0VsZW1lbnR9IHRyYWNrRWxlbWVudFxuICAgKiAgICAgICAgVGhlIHRyYWNrIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZS5hZGRUcmFja0VsZW1lbnRfID0gZnVuY3Rpb24gYWRkVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnRyYWNrRWxlbWVudHNfLmxlbmd0aDtcblxuICAgIGlmICghKCcnICsgaW5kZXggaW4gdGhpcykpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFja0VsZW1lbnRzX1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIGVsZW1lbnRzXG4gICAgaWYgKHRoaXMudHJhY2tFbGVtZW50c18uaW5kZXhPZih0cmFja0VsZW1lbnQpID09PSAtMSkge1xuICAgICAgdGhpcy50cmFja0VsZW1lbnRzXy5wdXNoKHRyYWNrRWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYW4ge0BsaW5rIEh0bWxUcmFja0VsZW1lbnR9IGZyb20gdGhlIGBIdG1sVHJhY2tFbGVtZW50TGlzdGAgZ2l2ZW4gYW5cbiAgICoge0BsaW5rIFRleHRUcmFja30uXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIHRyYWNrIGFzc29jaWF0ZWQgd2l0aCBhIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0h0bWxUcmFja0VsZW1lbnR8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRoYXQgd2FzIGZvdW5kIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBIdG1sVHJhY2tFbGVtZW50TGlzdC5wcm90b3R5cGUuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18gPSBmdW5jdGlvbiBnZXRUcmFja0VsZW1lbnRCeVRyYWNrXyh0cmFjaykge1xuICAgIHZhciB0cmFja0VsZW1lbnRfID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmFjayA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXS50cmFjaykge1xuICAgICAgICB0cmFja0VsZW1lbnRfID0gdGhpcy50cmFja0VsZW1lbnRzX1tpXTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2tFbGVtZW50XztcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEge0BsaW5rIEh0bWxUcmFja0VsZW1lbnR9IGZyb20gdGhlIGBIdG1sVHJhY2tFbGVtZW50TGlzdGBcbiAgICpcbiAgICogQHBhcmFtIHtIdG1sVHJhY2tFbGVtZW50fSB0cmFja0VsZW1lbnRcbiAgICogICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZS5yZW1vdmVUcmFja0VsZW1lbnRfID0gZnVuY3Rpb24gcmVtb3ZlVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy50cmFja0VsZW1lbnRzXy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRyYWNrRWxlbWVudCA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXSkge1xuICAgICAgICB0aGlzLnRyYWNrRWxlbWVudHNfLnNwbGljZShpLCAxKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEh0bWxUcmFja0VsZW1lbnRMaXN0O1xufSgpO1xuXG4vKipcbiAqIEBmaWxlIHRleHQtdHJhY2stY3VlLWxpc3QuanNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0VHJhY2tDdWVMaXN0flRleHRUcmFja0N1ZVxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxuICogICAgICAgICAgIFRoZSB1bmlxdWUgaWQgZm9yIHRoaXMgdGV4dCB0cmFjayBjdWVcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RhcnRUaW1lXG4gKiAgICAgICAgICAgVGhlIHN0YXJ0IHRpbWUgZm9yIHRoaXMgdGV4dCB0cmFjayBjdWVcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gZW5kVGltZVxuICogICAgICAgICAgIFRoZSBlbmQgdGltZSBmb3IgdGhpcyB0ZXh0IHRyYWNrIGN1ZVxuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGF1c2VPbkV4aXRcbiAqICAgICAgICAgICBQYXVzZSB3aGVuIHRoZSBlbmQgdGltZSBpcyByZWFjaGVkIGlmIHRydWUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja2N1ZX1cbiAqL1xuXG4vKipcbiAqIEEgTGlzdCBvZiBUZXh0VHJhY2tDdWVzLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tjdWVsaXN0fVxuICovXG5cbnZhciBUZXh0VHJhY2tDdWVMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGN1ZXNcbiAgICogICAgICAgIEEgbGlzdCBvZiBjdWVzIHRvIGJlIGluaXRpYWxpemVkIHdpdGhcbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja0N1ZUxpc3QoY3Vlcykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja0N1ZUxpc3QpO1xuXG4gICAgdmFyIGxpc3QgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXy5jYWxsKGxpc3QsIGN1ZXMpO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja0N1ZUxpc3RcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9IGxlbmd0aFxuICAgICAqICAgICAgICAgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGBUZXh0VHJhY2tDdWVgcyBpbiB0aGUgVGV4dFRyYWNrQ3VlTGlzdC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGhfO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0dGVyIGZvciBjdWVzIGluIHRoaXMgbGlzdC4gQ3JlYXRlcyBnZXR0ZXJzXG4gICAqIGFuIGFuIGluZGV4IGZvciB0aGUgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY3Vlc1xuICAgKiAgICAgICAgQW4gYXJyYXkgb2YgY3VlcyB0byBzZXRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXyA9IGZ1bmN0aW9uIHNldEN1ZXNfKGN1ZXMpIHtcbiAgICB2YXIgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGwgPSBjdWVzLmxlbmd0aDtcblxuICAgIHRoaXMuY3Vlc18gPSBjdWVzO1xuICAgIHRoaXMubGVuZ3RoXyA9IGN1ZXMubGVuZ3RoO1xuXG4gICAgdmFyIGRlZmluZVByb3AgPSBmdW5jdGlvbiBkZWZpbmVQcm9wKGluZGV4KSB7XG4gICAgICBpZiAoISgnJyArIGluZGV4IGluIHRoaXMpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJyArIGluZGV4LCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdWVzX1tpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKG9sZExlbmd0aCA8IGwpIHtcbiAgICAgIGkgPSBvbGRMZW5ndGg7XG5cbiAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGRlZmluZVByb3AuY2FsbCh0aGlzLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBUZXh0VHJhY2tDdWVgIHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSBgVGV4dFRyYWNrQ3VlTGlzdGAgYnkgaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKiAgICAgICAgVGhlIGlkIG9mIHRoZSBjdWUgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yLlxuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tDdWVMaXN0flRleHRUcmFja0N1ZXxudWxsfVxuICAgKiAgICAgICAgIEEgc2luZ2xlIGN1ZSBvciBudWxsIGlmIG5vbmUgd2FzIGZvdW5kLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0N1ZUxpc3QucHJvdG90eXBlLmdldEN1ZUJ5SWQgPSBmdW5jdGlvbiBnZXRDdWVCeUlkKGlkKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY3VlID0gdGhpc1tpXTtcblxuICAgICAgaWYgKGN1ZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY3VlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tDdWVMaXN0O1xufSgpO1xuXG4vKipcbiAqIEBmaWxlIHRyYWNrLWtpbmRzLmpzXG4gKi9cblxuLyoqXG4gKiBBbGwgcG9zc2libGUgYFZpZGVvVHJhY2tLaW5kYHNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tdmlkZW90cmFjay1raW5kXG4gKiBAdHlwZWRlZiBWaWRlb1RyYWNrfktpbmRcbiAqIEBlbnVtXG4gKi9cbnZhciBWaWRlb1RyYWNrS2luZCA9IHtcbiAgYWx0ZXJuYXRpdmU6ICdhbHRlcm5hdGl2ZScsXG4gIGNhcHRpb25zOiAnY2FwdGlvbnMnLFxuICBtYWluOiAnbWFpbicsXG4gIHNpZ246ICdzaWduJyxcbiAgc3VidGl0bGVzOiAnc3VidGl0bGVzJyxcbiAgY29tbWVudGFyeTogJ2NvbW1lbnRhcnknXG59O1xuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBgQXVkaW9UcmFja0tpbmRgc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1hdWRpb3RyYWNrLWtpbmRcbiAqIEB0eXBlZGVmIEF1ZGlvVHJhY2t+S2luZFxuICogQGVudW1cbiAqL1xudmFyIEF1ZGlvVHJhY2tLaW5kID0ge1xuICAnYWx0ZXJuYXRpdmUnOiAnYWx0ZXJuYXRpdmUnLFxuICAnZGVzY3JpcHRpb25zJzogJ2Rlc2NyaXB0aW9ucycsXG4gICdtYWluJzogJ21haW4nLFxuICAnbWFpbi1kZXNjJzogJ21haW4tZGVzYycsXG4gICd0cmFuc2xhdGlvbic6ICd0cmFuc2xhdGlvbicsXG4gICdjb21tZW50YXJ5JzogJ2NvbW1lbnRhcnknXG59O1xuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBgVGV4dFRyYWNrS2luZGBzXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLXRleHR0cmFjay1raW5kXG4gKiBAdHlwZWRlZiBUZXh0VHJhY2t+S2luZFxuICogQGVudW1cbiAqL1xudmFyIFRleHRUcmFja0tpbmQgPSB7XG4gIHN1YnRpdGxlczogJ3N1YnRpdGxlcycsXG4gIGNhcHRpb25zOiAnY2FwdGlvbnMnLFxuICBkZXNjcmlwdGlvbnM6ICdkZXNjcmlwdGlvbnMnLFxuICBjaGFwdGVyczogJ2NoYXB0ZXJzJyxcbiAgbWV0YWRhdGE6ICdtZXRhZGF0YSdcbn07XG5cbi8qKlxuICogQWxsIHBvc3NpYmxlIGBUZXh0VHJhY2tNb2RlYHNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2ttb2RlXG4gKiBAdHlwZWRlZiBUZXh0VHJhY2t+TW9kZVxuICogQGVudW1cbiAqL1xudmFyIFRleHRUcmFja01vZGUgPSB7XG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBzaG93aW5nOiAnc2hvd2luZydcbn07XG5cbi8qKlxuICogQGZpbGUgdHJhY2suanNcbiAqL1xuLyoqXG4gKiBBIFRyYWNrIGNsYXNzIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIEF1ZGlvVHJhY2t9LFxuICoge0BsaW5rIFZpZGVvVHJhY2t9LCBhbmQge0BsaW5rIFRleHRUcmFja30uXG4gKlxuICogPiBOb3RlOiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseVxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbH1cbiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0XG4gKiBAYWJzdHJhY3RcbiAqL1xuXG52YXIgVHJhY2sgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKFRyYWNrLCBfRXZlbnRUYXJnZXQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5raW5kPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCBraW5kIGZvciB0aGUgdHJhY2sgdHlwZSB5b3UgYXJlIGNyZWF0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZnVuY3Rpb24gVHJhY2soKSB7XG4gICAgdmFyIF9yZXQ7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2spO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfRXZlbnRUYXJnZXQuY2FsbCh0aGlzKSk7XG5cbiAgICB2YXIgdHJhY2sgPSBfdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gVHJhY2sucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgdHJhY2tbcHJvcF0gPSBUcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJhY2tQcm9wcyA9IHtcbiAgICAgIGlkOiBvcHRpb25zLmlkIHx8ICd2anNfdHJhY2tfJyArIG5ld0dVSUQoKSxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCB8fCAnJyxcbiAgICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsIHx8ICcnLFxuICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgfHwgJydcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRyYWNrXG4gICAgICogQG1lbWJlciB7c3RyaW5nfSBpZFxuICAgICAqICAgICAgICAgVGhlIGlkIG9mIHRoaXMgdHJhY2suIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVHJhY2tcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9IGtpbmRcbiAgICAgKiAgICAgICAgIFRoZSBraW5kIG9mIHRyYWNrIHRoYXQgdGhpcyBpcy4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgICogQGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBUcmFja1xuICAgICAqIEBtZW1iZXIge3N0cmluZ30gbGFiZWxcbiAgICAgKiAgICAgICAgIFRoZSBsYWJlbCBvZiB0aGlzIHRyYWNrLiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRyYWNrXG4gICAgICogQG1lbWJlciB7c3RyaW5nfSBsYW5ndWFnZVxuICAgICAqICAgICAgICAgVGhlIHR3byBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyB0cmFjay4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICAgKiAgICAgICAgIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFjaywga2V5LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICAgIHJldHVybiB0cmFja1Byb3BzW2tleV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKCkge31cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdHJhY2tQcm9wcykge1xuICAgICAgX2xvb3Aoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IHRyYWNrLCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIHJldHVybiBUcmFjaztcbn0oRXZlbnRUYXJnZXQpO1xuXG4vKipcbiAqIEBmaWxlIHVybC5qc1xuICogQG1vZHVsZSB1cmxcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSB1cmw6VVJMT2JqZWN0XG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sXG4gKiAgICAgICAgICAgVGhlIHByb3RvY29sIG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob3N0bmFtZVxuICogICAgICAgICAgIFRoZSBob3N0bmFtZSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcG9ydFxuICogICAgICAgICAgIFRoZSBwb3J0IG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRobmFtZVxuICogICAgICAgICAgIFRoZSBwYXRobmFtZSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VhcmNoXG4gKiAgICAgICAgICAgVGhlIHNlYXJjaCBxdWVyeSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFzaFxuICogICAgICAgICAgIFRoZSBoYXNoIG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob3N0XG4gKiAgICAgICAgICAgVGhlIGhvc3Qgb2YgdGhlIHVybCB0aGF0IHdhcyBwYXJzZWQuXG4gKi9cblxuLyoqXG4gKiBSZXNvbHZlIGFuZCBwYXJzZSB0aGUgZWxlbWVudHMgb2YgYSBVUkwuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB1cmxcbiAqICAgICAgICAgVGhlIHVybCB0byBwYXJzZVxuICpcbiAqIEByZXR1cm4ge3VybDpVUkxPYmplY3R9XG4gKiAgICAgICAgIEFuIG9iamVjdCBvZiB1cmwgZGV0YWlsc1xuICovXG52YXIgcGFyc2VVcmwgPSBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgdmFyIHByb3BzID0gWydwcm90b2NvbCcsICdob3N0bmFtZScsICdwb3J0JywgJ3BhdGhuYW1lJywgJ3NlYXJjaCcsICdoYXNoJywgJ2hvc3QnXTtcblxuICAvLyBhZGQgdGhlIHVybCB0byBhbiBhbmNob3IgYW5kIGxldCB0aGUgYnJvd3NlciBwYXJzZSB0aGUgVVJMXG4gIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gIGEuaHJlZiA9IHVybDtcblxuICAvLyBJRTggKGFuZCA5PykgRml4XG4gIC8vIGllOCBkb2Vzbid0IHBhcnNlIHRoZSBVUkwgY29ycmVjdGx5IHVudGlsIHRoZSBhbmNob3IgaXMgYWN0dWFsbHlcbiAgLy8gYWRkZWQgdG8gdGhlIGJvZHksIGFuZCBhbiBpbm5lckhUTUwgaXMgbmVlZGVkIHRvIHRyaWdnZXIgdGhlIHBhcnNpbmdcbiAgdmFyIGFkZFRvQm9keSA9IGEuaG9zdCA9PT0gJycgJiYgYS5wcm90b2NvbCAhPT0gJ2ZpbGU6JztcbiAgdmFyIGRpdiA9IHZvaWQgMDtcblxuICBpZiAoYWRkVG9Cb2R5KSB7XG4gICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmlubmVySFRNTCA9ICc8YSBocmVmPVwiJyArIHVybCArICdcIj48L2E+JztcbiAgICBhID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgLy8gcHJldmVudCB0aGUgZGl2IGZyb20gYWZmZWN0aW5nIGxheW91dFxuICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZTsgcG9zaXRpb246YWJzb2x1dGU7Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICB9XG5cbiAgLy8gQ29weSB0aGUgc3BlY2lmaWMgVVJMIHByb3BlcnRpZXMgdG8gYSBuZXcgb2JqZWN0XG4gIC8vIFRoaXMgaXMgYWxzbyBuZWVkZWQgZm9yIElFOCBiZWNhdXNlIHRoZSBhbmNob3IgbG9zZXMgaXRzXG4gIC8vIHByb3BlcnRpZXMgd2hlbiBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgZG9tXG4gIHZhciBkZXRhaWxzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIGRldGFpbHNbcHJvcHNbaV1dID0gYVtwcm9wc1tpXV07XG4gIH1cblxuICAvLyBJRTkgYWRkcyB0aGUgcG9ydCB0byB0aGUgaG9zdCBwcm9wZXJ0eSB1bmxpa2UgZXZlcnlvbmUgZWxzZS4gSWZcbiAgLy8gYSBwb3J0IGlkZW50aWZpZXIgaXMgYWRkZWQgZm9yIHN0YW5kYXJkIHBvcnRzLCBzdHJpcCBpdC5cbiAgaWYgKGRldGFpbHMucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBkZXRhaWxzLmhvc3QgPSBkZXRhaWxzLmhvc3QucmVwbGFjZSgvOjgwJC8sICcnKTtcbiAgfVxuXG4gIGlmIChkZXRhaWxzLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgIGRldGFpbHMuaG9zdCA9IGRldGFpbHMuaG9zdC5yZXBsYWNlKC86NDQzJC8sICcnKTtcbiAgfVxuXG4gIGlmICghZGV0YWlscy5wcm90b2NvbCkge1xuICAgIGRldGFpbHMucHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gIH1cblxuICBpZiAoYWRkVG9Cb2R5KSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICB9XG5cbiAgcmV0dXJuIGRldGFpbHM7XG59O1xuXG4vKipcbiAqIEdldCBhYnNvbHV0ZSB2ZXJzaW9uIG9mIHJlbGF0aXZlIFVSTC4gVXNlZCB0byB0ZWxsIGZsYXNoIGNvcnJlY3QgVVJMLlxuICpcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICogICAgICAgICBVUkwgdG8gbWFrZSBhYnNvbHV0ZVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgQWJzb2x1dGUgVVJMXG4gKlxuICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3MDgzMi9nZXR0aW5nLWFuLWFic29sdXRlLXVybC1mcm9tLWEtcmVsYXRpdmUtb25lLWllNi1pc3N1ZVxuICovXG52YXIgZ2V0QWJzb2x1dGVVUkwgPSBmdW5jdGlvbiBnZXRBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQ2hlY2sgaWYgYWJzb2x1dGUgVVJMXG4gIGlmICghdXJsLm1hdGNoKC9eaHR0cHM/OlxcL1xcLy8pKSB7XG4gICAgLy8gQ29udmVydCB0byBhYnNvbHV0ZSBVUkwuIEZsYXNoIGhvc3RlZCBvZmYtc2l0ZSBuZWVkcyBhbiBhYnNvbHV0ZSBVUkwuXG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LmlubmVySFRNTCA9ICc8YSBocmVmPVwiJyArIHVybCArICdcIj54PC9hPic7XG4gICAgdXJsID0gZGl2LmZpcnN0Q2hpbGQuaHJlZjtcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgcGFzc2VkIGZpbGUgbmFtZS4gSXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nXG4gKiBpZiBwYXNzZWQgYW4gaW52YWxpZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiAgICAgICAgVGhlIGZpbGVOYW1lIHBhdGggbGlrZSAnL3BhdGgvdG8vZmlsZS5tcDQnXG4gKlxuICogQHJldHVybnMge3N0cmluZ31cbiAqICAgICAgICAgIFRoZSBleHRlbnNpb24gaW4gbG93ZXIgY2FzZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9cbiAqICAgICAgICAgIGV4dGVuc2lvbiBjb3VsZCBiZSBmb3VuZC5cbiAqL1xudmFyIGdldEZpbGVFeHRlbnNpb24gPSBmdW5jdGlvbiBnZXRGaWxlRXh0ZW5zaW9uKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzcGxpdFBhdGhSZSA9IC9eKFxcLz8pKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/KShcXC4oW15cXC5cXC9cXD9dKykpKSg/OltcXC9dKnxbXFw/XS4qKSQvaTtcbiAgICB2YXIgcGF0aFBhcnRzID0gc3BsaXRQYXRoUmUuZXhlYyhwYXRoKTtcblxuICAgIGlmIChwYXRoUGFydHMpIHtcbiAgICAgIHJldHVybiBwYXRoUGFydHMucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdXJsIHBhc3NlZCBpcyBhIGNyb3NzIGRvbWFpbiByZXF1ZXN0IG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiAgICAgICAgVGhlIHVybCB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICBXaGV0aGVyIGl0IGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90LlxuICovXG52YXIgaXNDcm9zc09yaWdpbiA9IGZ1bmN0aW9uIGlzQ3Jvc3NPcmlnaW4odXJsKSB7XG4gIHZhciB3aW5Mb2MgPSB3aW5kb3cubG9jYXRpb247XG4gIHZhciB1cmxJbmZvID0gcGFyc2VVcmwodXJsKTtcblxuICAvLyBJRTggcHJvdG9jb2wgcmVsYXRpdmUgdXJscyB3aWxsIHJldHVybiAnOicgZm9yIHByb3RvY29sXG4gIHZhciBzcmNQcm90b2NvbCA9IHVybEluZm8ucHJvdG9jb2wgPT09ICc6JyA/IHdpbkxvYy5wcm90b2NvbCA6IHVybEluZm8ucHJvdG9jb2w7XG5cbiAgLy8gQ2hlY2sgaWYgdXJsIGlzIGZvciBhbm90aGVyIGRvbWFpbi9vcmlnaW5cbiAgLy8gSUU4IGRvZXNuJ3Qga25vdyBsb2NhdGlvbi5vcmlnaW4sIHNvIHdlIHdvbid0IHJlbHkgb24gaXQgaGVyZVxuICB2YXIgY3Jvc3NPcmlnaW4gPSBzcmNQcm90b2NvbCArIHVybEluZm8uaG9zdCAhPT0gd2luTG9jLnByb3RvY29sICsgd2luTG9jLmhvc3Q7XG5cbiAgcmV0dXJuIGNyb3NzT3JpZ2luO1xufTtcblxudmFyIFVybCA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRwYXJzZVVybDogcGFyc2VVcmwsXG5cdGdldEFic29sdXRlVVJMOiBnZXRBYnNvbHV0ZVVSTCxcblx0Z2V0RmlsZUV4dGVuc2lvbjogZ2V0RmlsZUV4dGVuc2lvbixcblx0aXNDcm9zc09yaWdpbjogaXNDcm9zc09yaWdpblxufSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay5qc1xuICovXG4vKipcbiAqIFRha2VzIGEgd2VidnR0IGZpbGUgY29udGVudHMgYW5kIHBhcnNlcyBpdCBpbnRvIGN1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjQ29udGVudFxuICogICAgICAgIHdlYlZUVCBmaWxlIGNvbnRlbnRzXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVGV4dFRyYWNrIHRvIGFkZCBjdWVzIHRvLiBDdWVzIGNvbWUgZnJvbSB0aGUgc3JjQ29udGVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgcGFyc2VDdWVzID0gZnVuY3Rpb24gcGFyc2VDdWVzKHNyY0NvbnRlbnQsIHRyYWNrKSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgd2luZG93LldlYlZUVC5QYXJzZXIod2luZG93LCB3aW5kb3cudnR0anMsIHdpbmRvdy5XZWJWVFQuU3RyaW5nRGVjb2RlcigpKTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuXG4gIHBhcnNlci5vbmN1ZSA9IGZ1bmN0aW9uIChjdWUpIHtcbiAgICB0cmFjay5hZGRDdWUoY3VlKTtcbiAgfTtcblxuICBwYXJzZXIub25wYXJzaW5nZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gIH07XG5cbiAgcGFyc2VyLm9uZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJhY2sudHJpZ2dlcih7XG4gICAgICB0eXBlOiAnbG9hZGVkZGF0YScsXG4gICAgICB0YXJnZXQ6IHRyYWNrXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyLnBhcnNlKHNyY0NvbnRlbnQpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwQ29sbGFwc2VkKCdUZXh0IFRyYWNrIHBhcnNpbmcgZXJyb3JzIGZvciAnICsgdHJhY2suc3JjKTtcbiAgICB9XG4gICAgZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICByZXR1cm4gbG9nJDEuZXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICAgIGlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5ncm91cEVuZCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZXIuZmx1c2goKTtcbn07XG5cbi8qKlxuICogTG9hZCBhIGBUZXh0VHJhY2tgIGZyb20gYSBzcGVjaWZlZCB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogICAgICAgIFVybCB0byBsb2FkIHRyYWNrIGZyb20uXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVHJhY2sgdG8gYWRkIGN1ZXMgdG8uIENvbWVzIGZyb20gdGhlIGNvbnRlbnQgYXQgdGhlIGVuZCBvZiBgdXJsYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbG9hZFRyYWNrID0gZnVuY3Rpb24gbG9hZFRyYWNrKHNyYywgdHJhY2spIHtcbiAgdmFyIG9wdHMgPSB7XG4gICAgdXJpOiBzcmNcbiAgfTtcbiAgdmFyIGNyb3NzT3JpZ2luID0gaXNDcm9zc09yaWdpbihzcmMpO1xuXG4gIGlmIChjcm9zc09yaWdpbikge1xuICAgIG9wdHMuY29ycyA9IGNyb3NzT3JpZ2luO1xuICB9XG5cbiAgeGhyKG9wdHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVyciwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBsb2ckMS5lcnJvcihlcnIsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICB0cmFjay5sb2FkZWRfID0gdHJ1ZTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHZ0dGpzIGhhcyBsb2FkZWQsIG90aGVyd2lzZSwgd2FpdCB0aWxsIGl0IGZpbmlzaGVkIGxvYWRpbmdcbiAgICAvLyBOT1RFOiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGFsdC92aWRlby5ub3Z0dC5qcyBidWlsZFxuICAgIGlmICh0eXBlb2Ygd2luZG93LldlYlZUVCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRyYWNrLnRlY2hfKSB7XG4gICAgICAgIHZhciBsb2FkSGFuZGxlciA9IGZ1bmN0aW9uIGxvYWRIYW5kbGVyKCkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUN1ZXMocmVzcG9uc2VCb2R5LCB0cmFjayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdHJhY2sudGVjaF8ub24oJ3Z0dGpzbG9hZGVkJywgbG9hZEhhbmRsZXIpO1xuICAgICAgICB0cmFjay50ZWNoXy5vbigndnR0anNlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsb2ckMS5lcnJvcigndnR0anMgZmFpbGVkIHRvIGxvYWQsIHN0b3BwaW5nIHRyeWluZyB0byBwcm9jZXNzICcgKyB0cmFjay5zcmMpO1xuICAgICAgICAgIHRyYWNrLnRlY2hfLm9mZigndnR0anNsb2FkZWQnLCBsb2FkSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZUN1ZXMocmVzcG9uc2VCb2R5LCB0cmFjayk7XG4gICAgfVxuICB9KSk7XG59O1xuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYFRleHRUcmFja2AuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja31cbiAqIEBleHRlbmRzIFRyYWNrXG4gKi9cblxudmFyIFRleHRUcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHtcbiAgaW5oZXJpdHMoVGV4dFRyYWNrLCBfVHJhY2spO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnM9e31cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge1RlY2h9IG9wdGlvbnMudGVjaFxuICAgKiAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRlY2ggdGhhdCBvd25zIHRoaXMgVGV4dFRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIGtpbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ11cbiAgICogICAgICAgIEEgdmFsaWQgdGV4dCB0cmFjayBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBUZXh0VHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ11cbiAgICogICAgICAgIFRoZSBtZW51IGxhYmVsIGZvciB0aGlzIHRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4gQW4gYWx0ZXJuYXRpdmUsIGJ1dCBkZXByaW9yaXRpemVkXG4gICAqICAgICAgICB2ZXNpb24gb2YgYG9wdGlvbnMubGFuZ3VhZ2VgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHVybCB0byBUZXh0VHJhY2sgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgSWYgdGhpcyB0cmFjayBzaG91bGQgZGVmYXVsdCB0byBvbiBvciBvZmYuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2soKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFjayk7XG5cbiAgICBpZiAoIW9wdGlvbnMudGVjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRlY2ggd2FzIG5vdCBwcm92aWRlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBtZXJnZU9wdGlvbnMob3B0aW9ucywge1xuICAgICAga2luZDogVGV4dFRyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICdzdWJ0aXRsZXMnLFxuICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5zcmNsYW5nIHx8ICcnXG4gICAgfSk7XG4gICAgdmFyIG1vZGUgPSBUZXh0VHJhY2tNb2RlW3NldHRpbmdzLm1vZGVdIHx8ICdkaXNhYmxlZCc7XG4gICAgdmFyIGRlZmF1bHRfID0gc2V0dGluZ3NbJ2RlZmF1bHQnXTtcblxuICAgIGlmIChzZXR0aW5ncy5raW5kID09PSAnbWV0YWRhdGEnIHx8IHNldHRpbmdzLmtpbmQgPT09ICdjaGFwdGVycycpIHtcbiAgICAgIG1vZGUgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgLy8gb24gSUU4IHRoaXMgd2lsbCBiZSBhIGRvY3VtZW50IGVsZW1lbnRcbiAgICAvLyBmb3IgZXZlcnkgb3RoZXIgYnJvd3NlciB0aGlzIHdpbGwgYmUgYSBub3JtYWwgb2JqZWN0XG4gICAgdmFyIHR0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2suY2FsbCh0aGlzLCBzZXR0aW5ncykpLCBfdGhpcyk7XG5cbiAgICB0dC50ZWNoXyA9IHNldHRpbmdzLnRlY2g7XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIFRleHRUcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0dFtwcm9wXSA9IFRleHRUcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0dC5jdWVzXyA9IFtdO1xuICAgIHR0LmFjdGl2ZUN1ZXNfID0gW107XG5cbiAgICB2YXIgY3VlcyA9IG5ldyBUZXh0VHJhY2tDdWVMaXN0KHR0LmN1ZXNfKTtcbiAgICB2YXIgYWN0aXZlQ3VlcyA9IG5ldyBUZXh0VHJhY2tDdWVMaXN0KHR0LmFjdGl2ZUN1ZXNfKTtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciB0aW1ldXBkYXRlSGFuZGxlciA9IGJpbmQodHQsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgLy8gQWNjZXNzaW5nIHRoaXMuYWN0aXZlQ3VlcyBmb3IgdGhlIHNpZGUtZWZmZWN0cyBvZiB1cGRhdGluZyBpdHNlbGZcbiAgICAgIC8vIGR1ZSB0byBpdCdzIG5hdHVyZSBhcyBhIGdldHRlciBmdW5jdGlvbi4gRG8gbm90IHJlbW92ZSBvciBjdWVzIHdpbGxcbiAgICAgIC8vIHN0b3AgdXBkYXRpbmchXG4gICAgICAvLyBVc2UgdGhlIHNldHRlciB0byBwcmV2ZW50IGRlbGV0aW9uIGZyb20gdWdsaWZ5IChwdXJlX2dldHRlcnMgcnVsZSlcbiAgICAgIHRoaXMuYWN0aXZlQ3VlcyA9IHRoaXMuYWN0aXZlQ3VlcztcbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcignY3VlY2hhbmdlJyk7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChtb2RlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICB0dC50ZWNoXy5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHR0LnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpO1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IGRlZmF1bHRcbiAgICAgKiAgICAgICAgIElmIHRoaXMgdHJhY2sgd2FzIHNldCB0byBiZSBvbiBvciBvZmYgYnkgZGVmYXVsdC4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICAgKiAgICAgICAgIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnZGVmYXVsdCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdF87XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoKSB7fVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge3N0cmluZ30gbW9kZVxuICAgICAqICAgICAgICAgU2V0IHRoZSBtb2RlIG9mIHRoaXMgVGV4dFRyYWNrIHRvIGEgdmFsaWQge0BsaW5rIFRleHRUcmFja35Nb2RlfS4gV2lsbFxuICAgICAqICAgICAgICAgbm90IGJlIHNldCBpZiBzZXR0aW5nIHRvIGFuIGludmFsaWQgbW9kZS5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEBmaXJlcyBUZXh0VHJhY2sjbW9kZWNoYW5nZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ21vZGUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobmV3TW9kZSkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAoIVRleHRUcmFja01vZGVbbmV3TW9kZV0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbW9kZSA9IG5ld01vZGU7XG4gICAgICAgIGlmIChtb2RlID09PSAnc2hvd2luZycpIHtcblxuICAgICAgICAgIHRoaXMudGVjaF8ucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpO1xuICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gbW9kZSBjaGFuZ2VzIG9uIHRoaXMgdHJhY2suIFRoaXMgYWxsb3dzXG4gICAgICAgICAqIHRoZSBUZXh0VHJhY2tMaXN0IHRoYXQgaG9sZHMgdGhpcyB0cmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gTm90ZTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlYyFcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFRleHRUcmFjayNtb2RlY2hhbmdlXG4gICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcignbW9kZWNoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge1RleHRUcmFja0N1ZUxpc3R9IGN1ZXNcbiAgICAgKiAgICAgICAgIFRoZSB0ZXh0IHRyYWNrIGN1ZSBsaXN0IGZvciB0aGlzIFRleHRUcmFjay5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHQsICdjdWVzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWRfKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VlcztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVGV4dFRyYWNrXG4gICAgICogQG1lbWJlciB7VGV4dFRyYWNrQ3VlTGlzdH0gYWN0aXZlQ3Vlc1xuICAgICAqICAgICAgICAgVGhlIGxpc3QgdGV4dCB0cmFjayBjdWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgVGV4dFRyYWNrLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ2FjdGl2ZUN1ZXMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZF8pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgaWYgKHRoaXMuY3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZlQ3VlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdCA9IHRoaXMudGVjaF8uY3VycmVudFRpbWUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5jdWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBjdWUgPSB0aGlzLmN1ZXNbaV07XG5cbiAgICAgICAgICBpZiAoY3VlLnN0YXJ0VGltZSA8PSBjdCAmJiBjdWUuZW5kVGltZSA+PSBjdCkge1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goY3VlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5zdGFydFRpbWUgPT09IGN1ZS5lbmRUaW1lICYmIGN1ZS5zdGFydFRpbWUgPD0gY3QgJiYgY3VlLnN0YXJ0VGltZSArIDAuNSA+PSBjdCkge1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goY3VlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggIT09IHRoaXMuYWN0aXZlQ3Vlc18ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFjdGl2ZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUN1ZXNfLmluZGV4T2YoYWN0aXZlW19pXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlQ3Vlc18gPSBhY3RpdmU7XG4gICAgICAgIGFjdGl2ZUN1ZXMuc2V0Q3Vlc18odGhpcy5hY3RpdmVDdWVzXyk7XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUN1ZXM7XG4gICAgICB9LFxuXG5cbiAgICAgIC8vIC8hXFwgS2VlcCB0aGlzIHNldHRlciBlbXB0eSAoc2VlIHRoZSB0aW1ldXBkYXRlIGhhbmRsZXIgYWJvdmUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc3JjKSB7XG4gICAgICB0dC5zcmMgPSBzZXR0aW5ncy5zcmM7XG4gICAgICBsb2FkVHJhY2soc2V0dGluZ3Muc3JjLCB0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR0LmxvYWRlZF8gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gdHQsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1ZSB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBjdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35DdWV9IGN1ZVxuICAgKiAgICAgICAgVGhlIGN1ZSB0byBhZGQgdG8gb3VyIGludGVybmFsIGxpc3RcbiAgICovXG5cblxuICBUZXh0VHJhY2sucHJvdG90eXBlLmFkZEN1ZSA9IGZ1bmN0aW9uIGFkZEN1ZShvcmlnaW5hbEN1ZSkge1xuICAgIHZhciBjdWUgPSBvcmlnaW5hbEN1ZTtcblxuICAgIGlmICh3aW5kb3cudnR0anMgJiYgIShvcmlnaW5hbEN1ZSBpbnN0YW5jZW9mIHdpbmRvdy52dHRqcy5WVFRDdWUpKSB7XG4gICAgICBjdWUgPSBuZXcgd2luZG93LnZ0dGpzLlZUVEN1ZShvcmlnaW5hbEN1ZS5zdGFydFRpbWUsIG9yaWdpbmFsQ3VlLmVuZFRpbWUsIG9yaWdpbmFsQ3VlLnRleHQpO1xuXG4gICAgICBmb3IgKHZhciBwcm9wIGluIG9yaWdpbmFsQ3VlKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gY3VlKSkge1xuICAgICAgICAgIGN1ZVtwcm9wXSA9IG9yaWdpbmFsQ3VlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGBpZGAgaXMgY29waWVkIG92ZXJcbiAgICAgIGN1ZS5pZCA9IG9yaWdpbmFsQ3VlLmlkO1xuICAgICAgY3VlLm9yaWdpbmFsQ3VlXyA9IG9yaWdpbmFsQ3VlO1xuICAgIH1cblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnRlY2hfLnRleHRUcmFja3MoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHJhY2tzW2ldICE9PSB0aGlzKSB7XG4gICAgICAgIHRyYWNrc1tpXS5yZW1vdmVDdWUoY3VlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmN1ZXNfLnB1c2goY3VlKTtcbiAgICB0aGlzLmN1ZXMuc2V0Q3Vlc18odGhpcy5jdWVzXyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGN1ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfkN1ZX0gcmVtb3ZlQ3VlXG4gICAqICAgICAgICBUaGUgY3VlIHRvIHJlbW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0XG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrLnByb3RvdHlwZS5yZW1vdmVDdWUgPSBmdW5jdGlvbiByZW1vdmVDdWUoX3JlbW92ZUN1ZSkge1xuICAgIHZhciBpID0gdGhpcy5jdWVzXy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YXIgY3VlID0gdGhpcy5jdWVzX1tpXTtcblxuICAgICAgaWYgKGN1ZSA9PT0gX3JlbW92ZUN1ZSB8fCBjdWUub3JpZ2luYWxDdWVfICYmIGN1ZS5vcmlnaW5hbEN1ZV8gPT09IF9yZW1vdmVDdWUpIHtcbiAgICAgICAgdGhpcy5jdWVzXy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuY3Vlcy5zZXRDdWVzXyh0aGlzLmN1ZXNfKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2s7XG59KFRyYWNrKTtcblxuLyoqXG4gKiBjdWVjaGFuZ2UgLSBPbmUgb3IgbW9yZSBjdWVzIGluIHRoZSB0cmFjayBoYXZlIGJlY29tZSBhY3RpdmUgb3Igc3RvcHBlZCBiZWluZyBhY3RpdmUuXG4gKi9cblxuXG5UZXh0VHJhY2sucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfID0ge1xuICBjdWVjaGFuZ2U6ICdjdWVjaGFuZ2UnXG59O1xuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYEF1ZGlvVHJhY2tgLiBJZiBpdCBpcyBwYXJ0IG9mIGFuIHtAbGluayBBdWRpb1RyYWNrTGlzdH1cbiAqIG9ubHkgb25lIGBBdWRpb1RyYWNrYCBpbiB0aGUgbGlzdCB3aWxsIGJlIGVuYWJsZWQgYXQgYSB0aW1lLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNhdWRpb3RyYWNrfVxuICogQGV4dGVuZHMgVHJhY2tcbiAqL1xuXG52YXIgQXVkaW9UcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFjaywgX1RyYWNrKTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t+S2luZH0gW29wdGlvbnMua2luZD0nJ11cbiAgICogICAgICAgIEEgdmFsaWQgYXVkaW8gdHJhY2sga2luZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlZF1cbiAgICogICAgICAgIElmIHRoaXMgdHJhY2sgaXMgdGhlIG9uZSB0aGF0IGlzIGN1cnJlbnRseSBwbGF5aW5nLiBJZiB0aGlzIHRyYWNrIGlzIHBhcnQgb2ZcbiAgICogICAgICAgIGFuIHtAbGluayBBdWRpb1RyYWNrTGlzdH0sIG9ubHkgb25lIHtAbGluayBBdWRpb1RyYWNrfSB3aWxsIGJlIGVuYWJsZWQuXG4gICAqL1xuICBmdW5jdGlvbiBBdWRpb1RyYWNrKCkge1xuICAgIHZhciBfdGhpcywgX3JldDtcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zLCB7XG4gICAgICBraW5kOiBBdWRpb1RyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICcnXG4gICAgfSk7XG4gICAgLy8gb24gSUU4IHRoaXMgd2lsbCBiZSBhIGRvY3VtZW50IGVsZW1lbnRcbiAgICAvLyBmb3IgZXZlcnkgb3RoZXIgYnJvd3NlciB0aGlzIHdpbGwgYmUgYSBub3JtYWwgb2JqZWN0XG4gICAgdmFyIHRyYWNrID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2suY2FsbCh0aGlzLCBzZXR0aW5ncykpLCBfdGhpcyk7XG4gICAgdmFyIGVuYWJsZWQgPSBmYWxzZTtcblxuICAgIGlmIChJU19JRTgpIHtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gQXVkaW9UcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0cmFja1twcm9wXSA9IEF1ZGlvVHJhY2sucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBBdWRpb1RyYWNrXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqICAgICAgICAgSWYgdGhpcyBgQXVkaW9UcmFja2AgaXMgZW5hYmxlZCBvciBub3QuIFdoZW4gc2V0dGluZyB0aGlzIHdpbGxcbiAgICAgKiAgICAgICAgIGZpcmUge0BsaW5rIEF1ZGlvVHJhY2sjZW5hYmxlZGNoYW5nZX0gaWYgdGhlIHN0YXRlIG9mIGVuYWJsZWQgaXMgY2hhbmdlZC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEBmaXJlcyBWaWRlb1RyYWNrI3NlbGVjdGVkY2hhbmdlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrLCAnZW5hYmxlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gZW5hYmxlZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShuZXdFbmFibGVkKSB7XG4gICAgICAgIC8vIGFuIGludmFsaWQgb3IgdW5jaGFuZ2VkIHZhbHVlXG4gICAgICAgIGlmICh0eXBlb2YgbmV3RW5hYmxlZCAhPT0gJ2Jvb2xlYW4nIHx8IG5ld0VuYWJsZWQgPT09IGVuYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlZCA9IG5ld0VuYWJsZWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBlbmFibGVkIGNoYW5nZXMgb24gdGhpcyB0cmFjay4gVGhpcyBhbGxvd3NcbiAgICAgICAgICogdGhlIEF1ZGlvVHJhY2tMaXN0IHRoYXQgaG9sZHMgdGhpcyB0cmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gTm90ZTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlYyEgTmF0aXZlIHRyYWNrcyB3aWxsIGRvXG4gICAgICAgICAqICAgICAgICAgdGhpcyBpbnRlcm5hbGx5IHdpdGhvdXQgYW4gZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2VcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdlbmFibGVkY2hhbmdlJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBzZXRzIHRoaXMgdHJhY2sgdG8gc2VsZWN0ZWQgdGhlblxuICAgIC8vIHNldCBzZWxlY3RlZCB0byB0aGF0IHRydWUgdmFsdWUgb3RoZXJ3aXNlXG4gICAgLy8gd2Uga2VlcCBpdCBmYWxzZVxuICAgIGlmIChzZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICB0cmFjay5lbmFibGVkID0gc2V0dGluZ3MuZW5hYmxlZDtcbiAgICB9XG4gICAgdHJhY2subG9hZGVkXyA9IHRydWU7XG5cbiAgICByZXR1cm4gX3JldCA9IHRyYWNrLCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIHJldHVybiBBdWRpb1RyYWNrO1xufShUcmFjayk7XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBgVmlkZW9UcmFja2AuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2t9XG4gKiBAZXh0ZW5kcyBUcmFja1xuICovXG5cbnZhciBWaWRlb1RyYWNrID0gZnVuY3Rpb24gKF9UcmFjaykge1xuICBpbmhlcml0cyhWaWRlb1RyYWNrLCBfVHJhY2spO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5raW5kPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB7QGxpbmsgVmlkZW9UcmFja35LaW5kfVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VsZWN0ZWRdXG4gICAqICAgICAgICBJZiB0aGlzIHRyYWNrIGlzIHRoZSBvbmUgdGhhdCBpcyBjdXJyZW50bHkgcGxheWluZy5cbiAgICovXG4gIGZ1bmN0aW9uIFZpZGVvVHJhY2soKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZGVvVHJhY2spO1xuXG4gICAgdmFyIHNldHRpbmdzID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHtcbiAgICAgIGtpbmQ6IFZpZGVvVHJhY2tLaW5kW29wdGlvbnMua2luZF0gfHwgJydcbiAgICB9KTtcblxuICAgIC8vIG9uIElFOCB0aGlzIHdpbGwgYmUgYSBkb2N1bWVudCBlbGVtZW50XG4gICAgLy8gZm9yIGV2ZXJ5IG90aGVyIGJyb3dzZXIgdGhpcyB3aWxsIGJlIGEgbm9ybWFsIG9iamVjdFxuICAgIHZhciB0cmFjayA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrLmNhbGwodGhpcywgc2V0dGluZ3MpKSwgX3RoaXMpO1xuICAgIHZhciBzZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBWaWRlb1RyYWNrLnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRyYWNrW3Byb3BdID0gVmlkZW9UcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVmlkZW9UcmFja1xuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IHNlbGVjdGVkXG4gICAgICogICAgICAgICBJZiB0aGlzIGBWaWRlb1RyYWNrYCBpcyBzZWxlY3RlZCBvciBub3QuIFdoZW4gc2V0dGluZyB0aGlzIHdpbGxcbiAgICAgKiAgICAgICAgIGZpcmUge0BsaW5rIFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2V9IGlmIHRoZSBzdGF0ZSBvZiBzZWxlY3RlZCBjaGFuZ2VkLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQGZpcmVzIFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhY2ssICdzZWxlY3RlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobmV3U2VsZWN0ZWQpIHtcbiAgICAgICAgLy8gYW4gaW52YWxpZCBvciB1bmNoYW5nZWQgdmFsdWVcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdTZWxlY3RlZCAhPT0gJ2Jvb2xlYW4nIHx8IG5ld1NlbGVjdGVkID09PSBzZWxlY3RlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZCA9IG5ld1NlbGVjdGVkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gc2VsZWN0ZWQgY2hhbmdlcyBvbiB0aGlzIHRyYWNrLiBUaGlzIGFsbG93c1xuICAgICAgICAgKiB0aGUgVmlkZW9UcmFja0xpc3QgdGhhdCBob2xkcyB0aGlzIHRyYWNrIHRvIGFjdCBhY2NvcmRpbmdseS5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBOb3RlOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjISBOYXRpdmUgdHJhY2tzIHdpbGwgZG9cbiAgICAgICAgICogICAgICAgICB0aGlzIGludGVybmFsbHkgd2l0aG91dCBhbiBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2VcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzZWxlY3RlZGNoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaWYgdGhlIHVzZXIgc2V0cyB0aGlzIHRyYWNrIHRvIHNlbGVjdGVkIHRoZW5cbiAgICAvLyBzZXQgc2VsZWN0ZWQgdG8gdGhhdCB0cnVlIHZhbHVlIG90aGVyd2lzZVxuICAgIC8vIHdlIGtlZXAgaXQgZmFsc2VcbiAgICBpZiAoc2V0dGluZ3Muc2VsZWN0ZWQpIHtcbiAgICAgIHRyYWNrLnNlbGVjdGVkID0gc2V0dGluZ3Muc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSB0cmFjaywgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICByZXR1cm4gVmlkZW9UcmFjaztcbn0oVHJhY2spO1xuXG4vKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC5qc1xuICovXG5cbi8qKlxuICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAqIEB0eXBlZGVmIHtIVE1MVHJhY2tFbGVtZW50flJlYWR5U3RhdGV9XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG52YXIgTk9ORSA9IDA7XG52YXIgTE9BRElORyA9IDE7XG52YXIgTE9BREVEID0gMjtcbnZhciBFUlJPUiA9IDM7XG5cbi8qKlxuICogQSBzaW5nbGUgdHJhY2sgcmVwcmVzZW50ZWQgaW4gdGhlIERPTS5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjaHRtbHRyYWNrZWxlbWVudH1cbiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0XG4gKi9cblxudmFyIEhUTUxUcmFja0VsZW1lbnQgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKEhUTUxUcmFja0VsZW1lbnQsIF9FdmVudFRhcmdldCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucz17fVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH0gb3B0aW9ucy50ZWNoXG4gICAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdGVjaCB0aGF0IG93bnMgdGhpcyBIVE1MVHJhY2tFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIGtpbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ11cbiAgICogICAgICAgIEEgdmFsaWQgdGV4dCB0cmFjayBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBUZXh0VHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ11cbiAgICogICAgICAgIFRoZSBtZW51IGxhYmVsIGZvciB0aGlzIHRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4gQW4gYWx0ZXJuYXRpdmUsIGJ1dCBkZXByaW9yaXRpemVkXG4gICAqICAgICAgICB2ZXNpb24gb2YgYG9wdGlvbnMubGFuZ3VhZ2VgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHVybCB0byBUZXh0VHJhY2sgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgSWYgdGhpcyB0cmFjayBzaG91bGQgZGVmYXVsdCB0byBvbiBvciBvZmYuXG4gICAqL1xuICBmdW5jdGlvbiBIVE1MVHJhY2tFbGVtZW50KCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIVE1MVHJhY2tFbGVtZW50KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0V2ZW50VGFyZ2V0LmNhbGwodGhpcykpO1xuXG4gICAgdmFyIHJlYWR5U3RhdGUgPSB2b2lkIDA7XG4gICAgdmFyIHRyYWNrRWxlbWVudCA9IF90aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICB0cmFja0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBIVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRyYWNrRWxlbWVudFtwcm9wXSA9IEhUTUxUcmFja0VsZW1lbnQucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyYWNrID0gbmV3IFRleHRUcmFjayhvcHRpb25zKTtcblxuICAgIHRyYWNrRWxlbWVudC5raW5kID0gdHJhY2sua2luZDtcbiAgICB0cmFja0VsZW1lbnQuc3JjID0gdHJhY2suc3JjO1xuICAgIHRyYWNrRWxlbWVudC5zcmNsYW5nID0gdHJhY2subGFuZ3VhZ2U7XG4gICAgdHJhY2tFbGVtZW50LmxhYmVsID0gdHJhY2subGFiZWw7XG4gICAgdHJhY2tFbGVtZW50WydkZWZhdWx0J10gPSB0cmFja1snZGVmYXVsdCddO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAgICAgKiBAbWVtYmVyIHtIVE1MVHJhY2tFbGVtZW50flJlYWR5U3RhdGV9IHJlYWR5U3RhdGVcbiAgICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHJlYWR5IHN0YXRlIG9mIHRoZSB0cmFjayBlbGVtZW50LlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFja0VsZW1lbnQsICdyZWFkeVN0YXRlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIHJldHVybiByZWFkeVN0YXRlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAgICAgKiBAbWVtYmVyIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAgICogICAgICAgICBUaGUgdW5kZXJseWluZyBUZXh0VHJhY2sgb2JqZWN0LlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrRWxlbWVudCwgJ3RyYWNrJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIHJldHVybiB0cmFjaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWR5U3RhdGUgPSBOT05FO1xuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI2xvYWRlZGRhdGFcbiAgICAgKiBAZmlyZXMgSFRNTFRyYWNrRWxlbWVudCNsb2FkXG4gICAgICovXG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlYWR5U3RhdGUgPSBMT0FERUQ7XG5cbiAgICAgIHRyYWNrRWxlbWVudC50cmlnZ2VyKHtcbiAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICB0YXJnZXQ6IHRyYWNrRWxlbWVudFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICB2YXIgX3JldDtcblxuICAgICAgcmV0dXJuIF9yZXQgPSB0cmFja0VsZW1lbnQsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gSFRNTFRyYWNrRWxlbWVudDtcbn0oRXZlbnRUYXJnZXQpO1xuXG5IVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgbG9hZDogJ2xvYWQnXG59O1xuXG5IVE1MVHJhY2tFbGVtZW50Lk5PTkUgPSBOT05FO1xuSFRNTFRyYWNrRWxlbWVudC5MT0FESU5HID0gTE9BRElORztcbkhUTUxUcmFja0VsZW1lbnQuTE9BREVEID0gTE9BREVEO1xuSFRNTFRyYWNrRWxlbWVudC5FUlJPUiA9IEVSUk9SO1xuXG4vKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0cmFjayBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWQgaW5cbiAqIHBsYXllci5qcywgdGVjaC5qcywgaHRtbDUuanMgYW5kIHBvc3NpYmx5IG90aGVyIHRlY2hzIGluIHRoZSBmdXR1cmUuXG4gKi9cblxudmFyIE5PUk1BTCA9IHtcbiAgYXVkaW86IHtcbiAgICBMaXN0Q2xhc3M6IEF1ZGlvVHJhY2tMaXN0LFxuICAgIFRyYWNrQ2xhc3M6IEF1ZGlvVHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdBdWRpbydcbiAgfSxcbiAgdmlkZW86IHtcbiAgICBMaXN0Q2xhc3M6IFZpZGVvVHJhY2tMaXN0LFxuICAgIFRyYWNrQ2xhc3M6IFZpZGVvVHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdWaWRlbydcbiAgfSxcbiAgdGV4dDoge1xuICAgIExpc3RDbGFzczogVGV4dFRyYWNrTGlzdCxcbiAgICBUcmFja0NsYXNzOiBUZXh0VHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdUZXh0J1xuICB9XG59O1xuXG5PYmplY3Qua2V5cyhOT1JNQUwpLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgTk9STUFMW3R5cGVdLmdldHRlck5hbWUgPSB0eXBlICsgJ1RyYWNrcyc7XG4gIE5PUk1BTFt0eXBlXS5wcml2YXRlTmFtZSA9IHR5cGUgKyAnVHJhY2tzXyc7XG59KTtcblxudmFyIFJFTU9URSA9IHtcbiAgcmVtb3RlVGV4dDoge1xuICAgIExpc3RDbGFzczogVGV4dFRyYWNrTGlzdCxcbiAgICBUcmFja0NsYXNzOiBUZXh0VHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdSZW1vdGVUZXh0JyxcbiAgICBnZXR0ZXJOYW1lOiAncmVtb3RlVGV4dFRyYWNrcycsXG4gICAgcHJpdmF0ZU5hbWU6ICdyZW1vdGVUZXh0VHJhY2tzXydcbiAgfSxcbiAgcmVtb3RlVGV4dEVsOiB7XG4gICAgTGlzdENsYXNzOiBIdG1sVHJhY2tFbGVtZW50TGlzdCxcbiAgICBUcmFja0NsYXNzOiBIVE1MVHJhY2tFbGVtZW50LFxuICAgIGNhcGl0YWxOYW1lOiAnUmVtb3RlVGV4dFRyYWNrRWxzJyxcbiAgICBnZXR0ZXJOYW1lOiAncmVtb3RlVGV4dFRyYWNrRWxzJyxcbiAgICBwcml2YXRlTmFtZTogJ3JlbW90ZVRleHRUcmFja0Vsc18nXG4gIH1cbn07XG5cbnZhciBBTEwgPSBtZXJnZU9wdGlvbnMoTk9STUFMLCBSRU1PVEUpO1xuXG5SRU1PVEUubmFtZXMgPSBPYmplY3Qua2V5cyhSRU1PVEUpO1xuTk9STUFMLm5hbWVzID0gT2JqZWN0LmtleXMoTk9STUFMKTtcbkFMTC5uYW1lcyA9IFtdLmNvbmNhdChSRU1PVEUubmFtZXMpLmNvbmNhdChOT1JNQUwubmFtZXMpO1xuXG4vKipcbiAqIEBmaWxlIHRlY2guanNcbiAqL1xuXG4vKipcbiAqIEFuIE9iamVjdCBjb250YWluaW5nIGEgc3RydWN0dXJlIGxpa2U6IGB7c3JjOiAndXJsJywgdHlwZTogJ21pbWV0eXBlJ31gIG9yIHN0cmluZ1xuICogdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBzcmMgdXJsIGFsb25lLlxuICogKiBgdmFyIFNvdXJjZU9iamVjdCA9IHtzcmM6ICdodHRwOi8vZXguY29tL3ZpZGVvLm1wNCcsIHR5cGU6ICd2aWRlby9tcDQnfTtgXG4gICAqIGB2YXIgU291cmNlU3RyaW5nID0gJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21lLXZpZGVvLm1wNCc7YFxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R8c3RyaW5nfSBUZWNoflNvdXJjZU9iamVjdFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzcmNcbiAqICAgICAgICAgICBUaGUgdXJsIHRvIHRoZSBzb3VyY2VcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogICAgICAgICAgIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHNvdXJjZVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB1c2VkIGJ5IHtAbGluayBUZWNofSB0byBjcmVhdGUgYSBuZXcge0BsaW5rIFRleHRUcmFja30uXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0ge1RlY2h9IHNlbGZcbiAqICAgICAgICBBbiBpbnN0YW5jZSBvZiB0aGUgVGVjaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZFxuICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gKiAgICAgICAgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlXVxuICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICogICAgICAgIEFuIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgdGV4dCB0cmFjayBvcHRpb25zXG4gKlxuICogQHJldHVybiB7VGV4dFRyYWNrfVxuICogICAgICAgICAgVGhlIHRleHQgdHJhY2sgdGhhdCB3YXMgY3JlYXRlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVHJhY2tIZWxwZXIoc2VsZiwga2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB7fTtcblxuICB2YXIgdHJhY2tzID0gc2VsZi50ZXh0VHJhY2tzKCk7XG5cbiAgb3B0aW9ucy5raW5kID0ga2luZDtcblxuICBpZiAobGFiZWwpIHtcbiAgICBvcHRpb25zLmxhYmVsID0gbGFiZWw7XG4gIH1cbiAgaWYgKGxhbmd1YWdlKSB7XG4gICAgb3B0aW9ucy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICB9XG4gIG9wdGlvbnMudGVjaCA9IHNlbGY7XG5cbiAgdmFyIHRyYWNrID0gbmV3IEFMTC50ZXh0LlRyYWNrQ2xhc3Mob3B0aW9ucyk7XG5cbiAgdHJhY2tzLmFkZFRyYWNrKHRyYWNrKTtcblxuICByZXR1cm4gdHJhY2s7XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbWVkaWEgcGxheWJhY2sgdGVjaG5vbG9neSBjb250cm9sbGVycywgc3VjaCBhc1xuICoge0BsaW5rIEZsYXNofSBhbmQge0BsaW5rIEhUTUw1fVxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUZWNoID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGVjaCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIFRlY2guXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IHJlYWR5XG4gICAqICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGBIVE1MNWAgVGVjaCBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIFRlY2goKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciByZWFkeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGVjaCk7XG5cbiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSB0ZWNoIHRvIHJlcG9ydCB1c2VyIGFjdGl2aXR5IGF1dG9tYXRpY2FsbHkuXG4gICAgLy8gVGhpcyBpcyBkb25lIG1hbnVhbGx5IGluIGFkZENvbnRyb2xzTGlzdGVuZXJzXG4gICAgb3B0aW9ucy5yZXBvcnRUb3VjaEFjdGl2aXR5ID0gZmFsc2U7XG5cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQgc291cmNlIGhhcyBwbGF5ZWQgYXQgYWxsIHRvXG4gICAgLy8gaW1wbGVtZW50IGEgdmVyeSBsaW1pdGVkIHBsYXllZCgpXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIF90aGlzLmhhc1N0YXJ0ZWRfID0gZmFsc2U7XG4gICAgX3RoaXMub24oJ3BsYXlpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmhhc1N0YXJ0ZWRfID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBfdGhpcy5vbignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBwcm9wcyA9IEFMTFtuYW1lXTtcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1twcm9wcy5nZXR0ZXJOYW1lXSkge1xuICAgICAgICBfdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gPSBvcHRpb25zW3Byb3BzLmdldHRlck5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTWFudWFsbHkgdHJhY2sgcHJvZ3Jlc3MgaW4gY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIvZmxhc2ggcGxheWVyIGRvZXNuJ3QgcmVwb3J0IGl0LlxuICAgIGlmICghX3RoaXMuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cykge1xuICAgICAgX3RoaXMubWFudWFsUHJvZ3Jlc3NPbigpO1xuICAgIH1cblxuICAgIC8vIE1hbnVhbGx5IHRyYWNrIHRpbWV1cGRhdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBicm93c2VyL2ZsYXNoIHBsYXllciBkb2Vzbid0IHJlcG9ydCBpdC5cbiAgICBpZiAoIV90aGlzLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cykge1xuICAgICAgX3RoaXMubWFudWFsVGltZVVwZGF0ZXNPbigpO1xuICAgIH1cblxuICAgIFsnVGV4dCcsICdBdWRpbycsICdWaWRlbyddLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgICBpZiAob3B0aW9uc1snbmF0aXZlJyArIHRyYWNrICsgJ1RyYWNrcyddID09PSBmYWxzZSkge1xuICAgICAgICBfdGhpc1snZmVhdHVyZXNOYXRpdmUnICsgdHJhY2sgKyAnVHJhY2tzJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLm5hdGl2ZUNhcHRpb25zID09PSBmYWxzZSB8fCBvcHRpb25zLm5hdGl2ZVRleHRUcmFja3MgPT09IGZhbHNlKSB7XG4gICAgICBfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubmF0aXZlQ2FwdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucy5uYXRpdmVUZXh0VHJhY2tzID09PSB0cnVlKSB7XG4gICAgICBfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghX3RoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICBfdGhpcy5lbXVsYXRlVGV4dFRyYWNrcygpO1xuICAgIH1cblxuICAgIF90aGlzLmF1dG9SZW1vdGVUZXh0VHJhY2tzXyA9IG5ldyBBTEwudGV4dC5MaXN0Q2xhc3MoKTtcblxuICAgIF90aGlzLmluaXRUcmFja0xpc3RlbmVycygpO1xuXG4gICAgLy8gVHVybiBvbiBjb21wb25lbnQgdGFwIGV2ZW50cyBvbmx5IGlmIG5vdCB1c2luZyBuYXRpdmUgY29udHJvbHNcbiAgICBpZiAoIW9wdGlvbnMubmF0aXZlQ29udHJvbHNGb3JUb3VjaCkge1xuICAgICAgX3RoaXMuZW1pdFRhcEV2ZW50cygpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgX3RoaXMubmFtZV8gPSBfdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdVbmtub3duIFRlY2gnO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsIGZ1bmN0aW9uIHRvIHRyaWdnZXIgc291cmNlIHNldCBpbiBhIHdheSB0aGF0IHdpbGwgYWxsb3cgcGxheWVyXG4gICAqIHRvIHJlLXRyaWdnZXIgaWYgdGhlIHBsYXllciBvciB0ZWNoIGFyZSBub3QgcmVhZHkgeWV0LlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCNzb3VyY2VzZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyBUaGUgc291cmNlIHN0cmluZyBhdCB0aGUgdGltZSBvZiB0aGUgc291cmNlIGNoYW5naW5nLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLnRyaWdnZXJTb3VyY2VzZXQgPSBmdW5jdGlvbiB0cmlnZ2VyU291cmNlc2V0KHNyYykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmlzUmVhZHlfKSB7XG4gICAgICAvLyBvbiBpbml0aWFsIHJlYWR5IHdlIGhhdmUgdG8gdHJpZ2dlciBzb3VyY2Ugc2V0XG4gICAgICAvLyAxbXMgYWZ0ZXIgcmVhZHkgc28gdGhhdCBwbGF5ZXIgY2FuIHdhdGNoIGZvciBpdC5cbiAgICAgIHRoaXMub25lKCdyZWFkeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnRyaWdnZXJTb3VyY2VzZXQoc3JjKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2V0IG9uIHRoZSB0ZWNoIGNhdXNpbmcgdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAgKiB0byByZWxvYWQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBQbGF5ZXIjZXZlbnQ6c291cmNlc2V0fVxuICAgICAqIEBldmVudCBUZWNoI3NvdXJjZXNldFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgc3JjOiBzcmMsXG4gICAgICB0eXBlOiAnc291cmNlc2V0J1xuICAgIH0pO1xuICB9O1xuXG4gIC8qIEZhbGxiYWNrcyBmb3IgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZXNcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogUG9seWZpbGwgdGhlIGBwcm9ncmVzc2AgZXZlbnQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCBuYXRpdmVseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgVGVjaCN0cmFja1Byb2dyZXNzfVxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLm1hbnVhbFByb2dyZXNzT24gPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09uKCkge1xuICAgIHRoaXMub24oJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5vbkR1cmF0aW9uQ2hhbmdlKTtcblxuICAgIHRoaXMubWFudWFsUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgLy8gVHJpZ2dlciBwcm9ncmVzcyB3YXRjaGluZyB3aGVuIGEgc291cmNlIGJlZ2lucyBsb2FkaW5nXG4gICAgdGhpcy5vbmUoJ3JlYWR5JywgdGhpcy50cmFja1Byb2dyZXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogVHVybiBvZmYgdGhlIHBvbHlmaWxsIGZvciBgcHJvZ3Jlc3NgIGV2ZW50cyB0aGF0IHdhcyBjcmVhdGVkIGluXG4gICAqIHtAbGluayBUZWNoI21hbnVhbFByb2dyZXNzT259XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUubWFudWFsUHJvZ3Jlc3NPZmYgPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09mZigpIHtcbiAgICB0aGlzLm1hbnVhbFByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdQcm9ncmVzcygpO1xuXG4gICAgdGhpcy5vZmYoJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5vbkR1cmF0aW9uQ2hhbmdlKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyB1c2VkIHRvIHRyaWdnZXIgYSBgcHJvZ3Jlc3NgIGV2ZW50IHdoZW4gdGhlIGJ1ZmZlcmVkIHBlcmNlbnQgY2hhbmdlcy4gSXRcbiAgICogc2V0cyBhbiBpbnRlcnZhbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IDUwMCBtaWxsaXNlY29uZHMgdG8gY2hlY2sgaWYgdGhlXG4gICAqIGJ1ZmZlciBlbmQgcGVyY2VudCBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogPiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB7QGxpbmsgVGVjaCNtYW51YWxQcm9ncmVzc09ufVxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGByZWFkeWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjcmVhZHlcbiAgICogQGZpcmVzIFRlY2gjcHJvZ3Jlc3NcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS50cmFja1Byb2dyZXNzID0gZnVuY3Rpb24gdHJhY2tQcm9ncmVzcyhldmVudCkge1xuICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTtcbiAgICB0aGlzLnByb2dyZXNzSW50ZXJ2YWwgPSB0aGlzLnNldEludGVydmFsKGJpbmQodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB1bmxlc3MgYnVmZmVyZWQgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBsYXN0IHRpbWVcblxuICAgICAgdmFyIG51bUJ1ZmZlcmVkUGVyY2VudCA9IHRoaXMuYnVmZmVyZWRQZXJjZW50KCk7XG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkUGVyY2VudF8gIT09IG51bUJ1ZmZlcmVkUGVyY2VudCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU2VlIHtAbGluayBQbGF5ZXIjcHJvZ3Jlc3N9XG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBUZWNoI3Byb2dyZXNzXG4gICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcigncHJvZ3Jlc3MnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWZmZXJlZFBlcmNlbnRfID0gbnVtQnVmZmVyZWRQZXJjZW50O1xuXG4gICAgICBpZiAobnVtQnVmZmVyZWRQZXJjZW50ID09PSAxKSB7XG4gICAgICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTtcbiAgICAgIH1cbiAgICB9KSwgNTAwKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIG91ciBpbnRlcm5hbCBkdXJhdGlvbiBvbiBhIGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgYnkgY2FsbGluZ1xuICAgKiB7QGxpbmsgVGVjaCNkdXJhdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGR1cmF0aW9uY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCNkdXJhdGlvbmNoYW5nZVxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLm9uRHVyYXRpb25DaGFuZ2UgPSBmdW5jdGlvbiBvbkR1cmF0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5kdXJhdGlvbl8gPSB0aGlzLmR1cmF0aW9uKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbmQgY3JlYXRlIGEgYFRpbWVSYW5nZWAgb2JqZWN0IGZvciBidWZmZXJpbmcuXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAgICogICAgICAgICBUaGUgdGltZSByYW5nZSBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5idWZmZXJlZCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkKCkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cnJlbnQgdmlkZW8gdGhhdCBpcyBjdXJyZW50bHkgYnVmZmVyZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlY2ltYWwgcGVyY2VudGFnZSBvZiB0aGVcbiAgICogICAgICAgICB2aWRlbyB0aGF0IGlzIGJ1ZmZlcmVkLlxuICAgKlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmJ1ZmZlcmVkUGVyY2VudCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudCQkMSgpIHtcbiAgICByZXR1cm4gYnVmZmVyZWRQZXJjZW50KHRoaXMuYnVmZmVyZWQoKSwgdGhpcy5kdXJhdGlvbl8pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUdXJuIG9mZiB0aGUgcG9seWZpbGwgZm9yIGBwcm9ncmVzc2AgZXZlbnRzIHRoYXQgd2FzIGNyZWF0ZWQgaW5cbiAgICoge0BsaW5rIFRlY2gjbWFudWFsUHJvZ3Jlc3NPbn1cbiAgICogU3RvcCBtYW51YWxseSB0cmFja2luZyBwcm9ncmVzcyBldmVudHMgYnkgY2xlYXJpbmcgdGhlIGludGVydmFsIHRoYXQgd2FzIHNldCBpblxuICAgKiB7QGxpbmsgVGVjaCN0cmFja1Byb2dyZXNzfS5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zdG9wVHJhY2tpbmdQcm9ncmVzcyA9IGZ1bmN0aW9uIHN0b3BUcmFja2luZ1Byb2dyZXNzKCkge1xuICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzSW50ZXJ2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQb2x5ZmlsbCB0aGUgYHRpbWV1cGRhdGVgIGV2ZW50IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgaXQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIFRlY2gjdHJhY2tDdXJyZW50VGltZX1cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5tYW51YWxUaW1lVXBkYXRlc09uID0gZnVuY3Rpb24gbWFudWFsVGltZVVwZGF0ZXNPbigpIHtcbiAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzID0gdHJ1ZTtcblxuICAgIHRoaXMub24oJ3BsYXknLCB0aGlzLnRyYWNrQ3VycmVudFRpbWUpO1xuICAgIHRoaXMub24oJ3BhdXNlJywgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIHRoZSBwb2x5ZmlsbCBmb3IgYHRpbWV1cGRhdGVgIGV2ZW50cyB0aGF0IHdhcyBjcmVhdGVkIGluXG4gICAqIHtAbGluayBUZWNoI21hbnVhbFRpbWVVcGRhdGVzT259XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUubWFudWFsVGltZVVwZGF0ZXNPZmYgPSBmdW5jdGlvbiBtYW51YWxUaW1lVXBkYXRlc09mZigpIHtcbiAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpO1xuICAgIHRoaXMub2ZmKCdwbGF5JywgdGhpcy50cmFja0N1cnJlbnRUaW1lKTtcbiAgICB0aGlzLm9mZigncGF1c2UnLCB0aGlzLnN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB1cCBhbiBpbnRlcnZhbCBmdW5jdGlvbiB0byB0cmFjayBjdXJyZW50IHRpbWUgYW5kIHRyaWdnZXIgYHRpbWV1cGRhdGVgIGV2ZXJ5XG4gICAqIDI1MCBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjcGxheVxuICAgKiBAdHJpZ2dlcnMgVGVjaCN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUudHJhY2tDdXJyZW50VGltZSA9IGZ1bmN0aW9uIHRyYWNrQ3VycmVudFRpbWUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFRpbWVJbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwgPSB0aGlzLnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogVHJpZ2dlcmVkIGF0IGFuIGludGVydmFsIG9mIDI1MG1zIHRvIGluZGljYXRlZCB0aGF0IHRpbWUgaXMgcGFzc2luZyBpbiB0aGUgdmlkZW8uXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFRlY2gjdGltZXVwZGF0ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG5cbiAgICAgIC8vIDQyID0gMjQgZnBzIC8vIDI1MCBpcyB3aGF0IFdlYmtpdCB1c2VzIC8vIEZGIHVzZXMgMTVcbiAgICB9LCAyNTApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBpbnRlcnZhbCBmdW5jdGlvbiBjcmVhdGVkIGluIHtAbGluayBUZWNoI3RyYWNrQ3VycmVudFRpbWV9IHNvIHRoYXQgdGhlXG4gICAqIGB0aW1ldXBkYXRlYCBldmVudCBpcyBubyBsb25nZXIgdHJpZ2dlcmVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB7VGVjaCNwYXVzZX1cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSA9IGZ1bmN0aW9uIHN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKCkge1xuICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwpO1xuXG4gICAgLy8gIzEwMDIgLSBpZiB0aGUgdmlkZW8gZW5kcyByaWdodCBiZWZvcmUgdGhlIG5leHQgdGltZXVwZGF0ZSB3b3VsZCBoYXBwZW4sXG4gICAgLy8gdGhlIHByb2dyZXNzIGJhciB3b24ndCBtYWtlIGl0IGFsbCB0aGUgd2F5IHRvIHRoZSBlbmRcbiAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIGFsbCBldmVudCBwb2x5ZmlsbHMsIGNsZWFyIHRoZSBgVGVjaGBzIHtAbGluayBBdWRpb1RyYWNrTGlzdH0sXG4gICAqIHtAbGluayBWaWRlb1RyYWNrTGlzdH0sIGFuZCB7QGxpbmsgVGV4dFRyYWNrTGlzdH0sIGFuZCBkaXNwb3NlIG9mIHRoaXMgVGVjaC5cbiAgICpcbiAgICogQGZpcmVzIENvbXBvbmVudCNkaXNwb3NlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cbiAgICAvLyBjbGVhciBvdXQgYWxsIHRyYWNrcyBiZWNhdXNlIHdlIGNhbid0IHJldXNlIHRoZW0gYmV0d2VlbiB0ZWNoc1xuICAgIHRoaXMuY2xlYXJUcmFja3MoTk9STUFMLm5hbWVzKTtcblxuICAgIC8vIFR1cm4gb2ZmIGFueSBtYW51YWwgcHJvZ3Jlc3Mgb3IgdGltZXVwZGF0ZSB0cmFja2luZ1xuICAgIGlmICh0aGlzLm1hbnVhbFByb2dyZXNzKSB7XG4gICAgICB0aGlzLm1hbnVhbFByb2dyZXNzT2ZmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFudWFsVGltZVVwZGF0ZXMpIHtcbiAgICAgIHRoaXMubWFudWFsVGltZVVwZGF0ZXNPZmYoKTtcbiAgICB9XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENsZWFyIG91dCBhIHNpbmdsZSBgVHJhY2tMaXN0YCBvciBhbiBhcnJheSBvZiBgVHJhY2tMaXN0c2AgZ2l2ZW4gdGhlaXIgbmFtZXMuXG4gICAqXG4gICAqID4gTm90ZTogVGVjaHMgd2l0aG91dCBzb3VyY2UgaGFuZGxlcnMgc2hvdWxkIGNhbGwgdGhpcyBiZXR3ZWVuIHNvdXJjZXMgZm9yIGB2aWRlb2BcbiAgICogICAgICAgICAmIGBhdWRpb2AgdHJhY2tzLiBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlbSBiZXR3ZWVuIHRyYWNrcyFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxzdHJpbmd9IHR5cGVzXG4gICAqICAgICAgICBUcmFja0xpc3QgbmFtZXMgdG8gY2xlYXIsIHZhbGlkIG5hbWVzIGFyZSBgdmlkZW9gLCBgYXVkaW9gLCBhbmRcbiAgICogICAgICAgIGB0ZXh0YC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5jbGVhclRyYWNrcyA9IGZ1bmN0aW9uIGNsZWFyVHJhY2tzKHR5cGVzKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0eXBlcyA9IFtdLmNvbmNhdCh0eXBlcyk7XG4gICAgLy8gY2xlYXIgb3V0IGFsbCB0cmFja3MgYmVjYXVzZSB3ZSBjYW4ndCByZXVzZSB0aGVtIGJldHdlZW4gdGVjaHNcbiAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB2YXIgbGlzdCA9IF90aGlzM1t0eXBlICsgJ1RyYWNrcyddKCkgfHwgW107XG4gICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIF90aGlzMy5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW55IFRleHRUcmFja3MgYWRkZWQgdmlhIGFkZFJlbW90ZVRleHRUcmFjayB0aGF0IGFyZVxuICAgKiBmbGFnZ2VkIGZvciBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuY2xlYW51cEF1dG9UZXh0VHJhY2tzID0gZnVuY3Rpb24gY2xlYW51cEF1dG9UZXh0VHJhY2tzKCkge1xuICAgIHZhciBsaXN0ID0gdGhpcy5hdXRvUmVtb3RlVGV4dFRyYWNrc18gfHwgW107XG4gICAgdmFyIGkgPSBsaXN0Lmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMucmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB0ZWNoLCB3aGljaCB3aWxsIHJlbW92ZXMgYWxsIHNvdXJjZXMgYW5kIHJlc2V0IHRoZSBpbnRlcm5hbCByZWFkeVN0YXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge307XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgYW4gZXJyb3Igb24gdGhlIFRlY2guXG4gICAqXG4gICAqIEBwYXJhbSB7TWVkaWFFcnJvcn0gW2Vycl1cbiAgICogICAgICAgIEVycm9yIHRvIHNldCBvbiB0aGUgVGVjaFxuICAgKlxuICAgKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgZXJyb3Igb2JqZWN0IG9uIHRoZSB0ZWNoLCBvciBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGVycikge1xuICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lcnJvcl8gPSBuZXcgTWVkaWFFcnJvcihlcnIpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lcnJvcl87XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBUaW1lUmFuZ2VgcyB0aGF0IGhhdmUgYmVlbiBwbGF5ZWQgdGhyb3VnaCBmb3IgdGhlIGN1cnJlbnQgc291cmNlLlxuICAgKlxuICAgKiA+IE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wbGV0ZS4gSXQgZG9lcyBub3QgdHJhY2sgdGhlIHBsYXllZCBgVGltZVJhbmdlYC5cbiAgICogICAgICAgICBJdCBvbmx5IGNoZWNrcyB3ZXRoZXIgdGhlIHNvdXJjZSBoYXMgcGxheWVkIGF0IGFsbCBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAgICogICAgICAgICAtIEEgc2luZ2xlIHRpbWUgcmFuZ2UgaWYgdGhpcyB2aWRlbyBoYXMgcGxheWVkXG4gICAqICAgICAgICAgLSBBbiBlbXB0eSBzZXQgb2YgcmFuZ2VzIGlmIG5vdC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5wbGF5ZWQgPSBmdW5jdGlvbiBwbGF5ZWQoKSB7XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZF8pIHtcbiAgICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlcygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYXVzZXMgYSBtYW51YWwgdGltZSB1cGRhdGUgdG8gb2NjdXIgaWYge0BsaW5rIFRlY2gjbWFudWFsVGltZVVwZGF0ZXNPbn0gd2FzXG4gICAqIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuc2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbiBzZXRDdXJyZW50VGltZSgpIHtcbiAgICAvLyBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiBtYW51YWwgdGltZXVwZGF0ZXNcbiAgICBpZiAodGhpcy5tYW51YWxUaW1lVXBkYXRlcykge1xuICAgICAgLyoqXG4gICAgICAgKiBBIG1hbnVhbCBgdGltZXVwZGF0ZWAgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFRlY2gjdGltZXVwZGF0ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUdXJuIG9uIGxpc3RlbmVycyBmb3Ige0BsaW5rIFZpZGVvVHJhY2tMaXN0fSwge0BsaW5rIHtBdWRpb1RyYWNrTGlzdH0sIGFuZFxuICAgKiB7QGxpbmsgVGV4dFRyYWNrTGlzdH0gZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIGFkZHMge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJzfSBmb3IgYGFkZHRyYWNrYCwgYW5kICBgcmVtb3ZldHJhY2tgLlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCNhdWRpb3RyYWNrY2hhbmdlXG4gICAqIEBmaXJlcyBUZWNoI3ZpZGVvdHJhY2tjaGFuZ2VcbiAgICogQGZpcmVzIFRlY2gjdGV4dHRyYWNrY2hhbmdlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuaW5pdFRyYWNrTGlzdGVuZXJzID0gZnVuY3Rpb24gaW5pdFRyYWNrTGlzdGVuZXJzKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdHJhY2tzIGFyZSBhZGRlZCBvciByZW1vdmVkIG9uIHRoZSBUZWNoIHtAbGluayBBdWRpb1RyYWNrTGlzdH1cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI2F1ZGlvdHJhY2tjaGFuZ2VcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0cmFja3MgYXJlIGFkZGVkIG9yIHJlbW92ZWQgb24gdGhlIFRlY2gge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICAgICAqXG4gICAgICogQGV2ZW50IFRlY2gjdmlkZW90cmFja2NoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRyYWNrcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgVGVjaCB7QGxpbmsgVGV4dFRyYWNrTGlzdH1cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI3RleHR0cmFja2NoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICBOT1JNQUwubmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIHByb3BzID0gTk9STUFMW25hbWVdO1xuICAgICAgdmFyIHRyYWNrTGlzdENoYW5nZXMgPSBmdW5jdGlvbiB0cmFja0xpc3RDaGFuZ2VzKCkge1xuICAgICAgICBfdGhpczQudHJpZ2dlcihuYW1lICsgJ3RyYWNrY2hhbmdlJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdHJhY2tzID0gX3RoaXM0W3Byb3BzLmdldHRlck5hbWVdKCk7XG5cbiAgICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpO1xuICAgICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG5cbiAgICAgIF90aGlzNC5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG4gICAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtdWxhdGUgVGV4dFRyYWNrcyB1c2luZyB2dHQuanMgaWYgbmVjZXNzYXJ5XG4gICAqXG4gICAqIEBmaXJlcyBUZWNoI3Z0dGpzbG9hZGVkXG4gICAqIEBmaXJlcyBUZWNoI3Z0dGpzZXJyb3JcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5hZGRXZWJWdHRTY3JpcHRfID0gZnVuY3Rpb24gYWRkV2ViVnR0U2NyaXB0XygpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIGlmICh3aW5kb3cuV2ViVlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGx5LCBUZWNoLmVsXyBpcyBhIGNoaWxkIG9mIGEgZHVtbXktZGl2IHdhaXQgdW50aWwgdGhlIENvbXBvbmVudCBzeXN0ZW1cbiAgICAvLyBzaWduYWxzIHRoYXQgdGhlIFRlY2ggaXMgcmVhZHkgYXQgd2hpY2ggcG9pbnQgVGVjaC5lbF8gaXMgcGFydCBvZiB0aGUgRE9NXG4gICAgLy8gYmVmb3JlIGluc2VydGluZyB0aGUgV2ViVlRUIHNjcmlwdFxuICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuZWwoKSkpIHtcblxuICAgICAgLy8gbG9hZCB2aWEgcmVxdWlyZSBpZiBhdmFpbGFibGUgYW5kIHZ0dC5qcyBzY3JpcHQgbG9jYXRpb24gd2FzIG5vdCBwYXNzZWQgaW5cbiAgICAgIC8vIGFzIGFuIG9wdGlvbi4gbm92dHQgYnVpbGRzIHdpbGwgdHVybiB0aGUgYWJvdmUgcmVxdWlyZSBjYWxsIGludG8gYW4gZW1wdHkgb2JqZWN0XG4gICAgICAvLyB3aGljaCB3aWxsIGNhdXNlIHRoaXMgaWYgY2hlY2sgdG8gYWx3YXlzIGZhaWwuXG4gICAgICBpZiAoIXRoaXMub3B0aW9uc19bJ3Z0dC5qcyddICYmIGlzUGxhaW4odnR0KSAmJiBPYmplY3Qua2V5cyh2dHQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCd2dHRqc2xvYWRlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGxvYWQgdnR0LmpzIHZpYSB0aGUgc2NyaXB0IGxvY2F0aW9uIG9wdGlvbiBvciB0aGUgY2RuIG9mIG5vIGxvY2F0aW9uIHdhc1xuICAgICAgLy8gcGFzc2VkIGluXG4gICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cbiAgICAgIHNjcmlwdC5zcmMgPSB0aGlzLm9wdGlvbnNfWyd2dHQuanMnXSB8fCAnaHR0cHM6Ly92anMuemVuY2RuLm5ldC92dHRqcy8wLjEyLjQvdnR0Lm1pbi5qcyc7XG4gICAgICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB2dHQuanMgaXMgbG9hZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgVGVjaCN2dHRqc2xvYWRlZFxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBfdGhpczUudHJpZ2dlcigndnR0anNsb2FkZWQnKTtcbiAgICAgIH07XG4gICAgICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdnR0LmpzIHdhcyBub3QgbG9hZGVkIGR1ZSB0byBhbiBlcnJvclxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgVGVjaCN2dHRqc2xvYWRlZFxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBfdGhpczUudHJpZ2dlcigndnR0anNlcnJvcicpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuICAgICAgICBzY3JpcHQub25lcnJvciA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIC8vIGJ1dCBoYXZlIG5vdCBsb2FkZWQgeWV0IGFuZCB3ZSBzZXQgaXQgdG8gdHJ1ZSBiZWZvcmUgdGhlIGluamVjdCBzbyB0aGF0XG4gICAgICAvLyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGluamVjdGVkIHdpbmRvdy5XZWJWVFQgaWYgaXQgbG9hZHMgcmlnaHQgYXdheVxuICAgICAgd2luZG93LldlYlZUVCA9IHRydWU7XG4gICAgICB0aGlzLmVsKCkucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlYWR5KHRoaXMuYWRkV2ViVnR0U2NyaXB0Xyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBFbXVsYXRlIHRleHR0cmFja3NcbiAgICpcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5lbXVsYXRlVGV4dFRyYWNrcyA9IGZ1bmN0aW9uIGVtdWxhdGVUZXh0VHJhY2tzKCkge1xuICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgdmFyIHRyYWNrcyA9IHRoaXMudGV4dFRyYWNrcygpO1xuICAgIHZhciByZW1vdGVUcmFja3MgPSB0aGlzLnJlbW90ZVRleHRUcmFja3MoKTtcbiAgICB2YXIgaGFuZGxlQWRkVHJhY2sgPSBmdW5jdGlvbiBoYW5kbGVBZGRUcmFjayhlKSB7XG4gICAgICByZXR1cm4gdHJhY2tzLmFkZFRyYWNrKGUudHJhY2spO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVJlbW92ZVRyYWNrID0gZnVuY3Rpb24gaGFuZGxlUmVtb3ZlVHJhY2soZSkge1xuICAgICAgcmV0dXJuIHRyYWNrcy5yZW1vdmVUcmFjayhlLnRyYWNrKTtcbiAgICB9O1xuXG4gICAgcmVtb3RlVHJhY2tzLm9uKCdhZGR0cmFjaycsIGhhbmRsZUFkZFRyYWNrKTtcbiAgICByZW1vdGVUcmFja3Mub24oJ3JlbW92ZXRyYWNrJywgaGFuZGxlUmVtb3ZlVHJhY2spO1xuXG4gICAgdGhpcy5hZGRXZWJWdHRTY3JpcHRfKCk7XG5cbiAgICB2YXIgdXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgICByZXR1cm4gX3RoaXM2LnRyaWdnZXIoJ3RleHR0cmFja2NoYW5nZScpO1xuICAgIH07XG5cbiAgICB2YXIgdGV4dFRyYWNrc0NoYW5nZXMgPSBmdW5jdGlvbiB0ZXh0VHJhY2tzQ2hhbmdlcygpIHtcbiAgICAgIHVwZGF0ZURpc3BsYXkoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICAgIHRyYWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIHVwZGF0ZURpc3BsYXkpO1xuICAgICAgICBpZiAodHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignY3VlY2hhbmdlJywgdXBkYXRlRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGV4dFRyYWNrc0NoYW5nZXMoKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGV4dFRyYWNrc0NoYW5nZXMpO1xuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRleHRUcmFja3NDaGFuZ2VzKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG5cbiAgICB0aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3RlVHJhY2tzLm9mZignYWRkdHJhY2snLCBoYW5kbGVBZGRUcmFjayk7XG4gICAgICByZW1vdGVUcmFja3Mub2ZmKCdyZW1vdmV0cmFjaycsIGhhbmRsZVJlbW92ZVRyYWNrKTtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG4gICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG4gICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgICB0cmFjay5yZW1vdmVFdmVudExpc3RlbmVyKCdjdWVjaGFuZ2UnLCB1cGRhdGVEaXNwbGF5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZXR1cm5zIGEgcmVtb3RlIHtAbGluayBUZXh0VHJhY2t9IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmRcbiAgICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICAgKiAgICAgICAgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZV1cbiAgICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge1RleHRUcmFja31cbiAgICogICAgICAgICBUaGUgVGV4dFRyYWNrIHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmFkZFRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFRleHRUcmFjayhraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAoIWtpbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dFRyYWNrIGtpbmQgaXMgcmVxdWlyZWQgYnV0IHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlVHJhY2tIZWxwZXIodGhpcywga2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVtdWxhdGVkIFRleHRUcmFjayBmb3IgdXNlIGJ5IGFkZFJlbW90ZVRleHRUcmFja1xuICAgKlxuICAgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbVxuICAgKiBUZWNoIGluIG9yZGVyIHRvIGNyZWF0ZSBuYXRpdmUgb3IgY3VzdG9tIFRleHRUcmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqICAgICAgICBUaGUgb2JqZWN0IHNob3VsZCBjb250YWluIHRoZSBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIFRleHRUcmFjayB3aXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2luZF1cbiAgICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXS5cbiAgICogICAgICAgIExhYmVsIHRvIGlkZW50aWZ5IHRoZSB0ZXh0IHRyYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYW5ndWFnZV1cbiAgICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIVE1MVHJhY2tFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmNyZWF0ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZVRleHRUcmFjayhvcHRpb25zKSB7XG4gICAgdmFyIHRyYWNrID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHtcbiAgICAgIHRlY2g6IHRoaXNcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUkVNT1RFLnJlbW90ZVRleHRFbC5UcmFja0NsYXNzKHRyYWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqID4gTm90ZTogVGhpcyBjYW4gYmUgYW4gZW11bGF0ZWQge0BsaW5rIEhUTUxUcmFja0VsZW1lbnR9IG9yIGEgbmF0aXZlIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFNlZSB7QGxpbmsgVGVjaCNjcmVhdGVSZW1vdGVUZXh0VHJhY2t9IGZvciBtb3JlIGRldGFpbGVkIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbnVhbENsZWFudXA9dHJ1ZV1cbiAgICogICAgICAgIC0gV2hlbiBmYWxzZTogdGhlIFRleHRUcmFjayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSB2aWRlb1xuICAgKiAgICAgICAgICBlbGVtZW50IHdoZW5ldmVyIHRoZSBzb3VyY2UgY2hhbmdlc1xuICAgKiAgICAgICAgLSBXaGVuIFRydWU6IFRoZSBUZXh0VHJhY2sgd2lsbCBoYXZlIHRvIGJlIGNsZWFuZWQgdXAgbWFudWFsbHlcbiAgICpcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH1cbiAgICogICAgICAgICBBbiBIdG1sIFRyYWNrIEVsZW1lbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoZSBkZWZhdWx0IGZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBlcXVpdmFsZW50XG4gICAqICAgICAgICAgICAgIHRvIFwibWFudWFsQ2xlYW51cD1mYWxzZVwiIGluIHRoZSBmdXR1cmUuIFRoZSBtYW51YWxDbGVhbnVwIHBhcmFtZXRlciB3aWxsXG4gICAqICAgICAgICAgICAgIGFsc28gYmUgcmVtb3ZlZC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2sgPSBmdW5jdGlvbiBhZGRSZW1vdGVUZXh0VHJhY2soKSB7XG4gICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIG1hbnVhbENsZWFudXAgPSBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IHRoaXMuY3JlYXRlUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpO1xuXG4gICAgaWYgKG1hbnVhbENsZWFudXAgIT09IHRydWUgJiYgbWFudWFsQ2xlYW51cCAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGRlcHJlY2F0aW9uIHdhcm5pbmdcbiAgICAgIGxvZyQxLndhcm4oJ0NhbGxpbmcgYWRkUmVtb3RlVGV4dFRyYWNrIHdpdGhvdXQgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBcIm1hbnVhbENsZWFudXBcIiBwYXJhbWV0ZXIgdG8gYHRydWVgIGlzIGRlcHJlY2F0ZWQgYW5kIGRlZmF1bHQgdG8gYGZhbHNlYCBpbiBmdXR1cmUgdmVyc2lvbiBvZiB2aWRlby5qcycpO1xuICAgICAgbWFudWFsQ2xlYW51cCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIHRvIHJlbW90ZSBsaXN0XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5hZGRUcmFja0VsZW1lbnRfKGh0bWxUcmFja0VsZW1lbnQpO1xuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrcygpLmFkZFRyYWNrKGh0bWxUcmFja0VsZW1lbnQudHJhY2spO1xuXG4gICAgaWYgKG1hbnVhbENsZWFudXAgIT09IHRydWUpIHtcbiAgICAgIC8vIGNyZWF0ZSB0aGUgVGV4dFRyYWNrTGlzdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzNy5hdXRvUmVtb3RlVGV4dFRyYWNrc18uYWRkVHJhY2soaHRtbFRyYWNrRWxlbWVudC50cmFjayk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcmVtb3RlIHRleHQgdHJhY2sgZnJvbSB0aGUgcmVtb3RlIGBUZXh0VHJhY2tMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCB0byByZW1vdmUgZnJvbSB0aGUgYFRleHRUcmFja0xpc3RgXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUucmVtb3ZlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKSB7XG4gICAgdmFyIHRyYWNrRWxlbWVudCA9IHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odHJhY2spO1xuXG4gICAgLy8gcmVtb3ZlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayBmcm9tIHJlbW90ZSBsaXN0XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5yZW1vdmVUcmFja0VsZW1lbnRfKHRyYWNrRWxlbWVudCk7XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgIHRoaXMuYXV0b1JlbW90ZVRleHRUcmFja3NfLnJlbW92ZVRyYWNrKHRyYWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBhdmFpbGFibGUgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzIGFzIHNwZWNpZmllZCBieSB0aGUgVzNDJ3MgTWVkaWFcbiAgICogUGxheWJhY2sgUXVhbGl0eSBBUEkuXG4gICAqXG4gICAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbWVkaWEtcGxheWJhY2stcXVhbGl0eX1cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiAgICAgICAgIEFuIG9iamVjdCB3aXRoIHN1cHBvcnRlZCBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3NcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPSBmdW5jdGlvbiBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpIHtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgbWV0aG9kIHRvIHNldCBhIHBvc3RlciBmcm9tIGEgYFRlY2hgLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zZXRQb3N0ZXIgPSBmdW5jdGlvbiBzZXRQb3N0ZXIoKSB7fTtcblxuICAvKipcbiAgICogQSBtZXRob2QgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgJ3BsYXlzaW5pbmUnIDx2aWRlbz4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5wbGF5c2lubGluZSA9IGZ1bmN0aW9uIHBsYXlzaW5saW5lKCkge307XG5cbiAgLyoqXG4gICAqIEEgbWV0aG9kIHRvIHNldCBvciB1bnNldCB0aGUgJ3BsYXlzaW5pbmUnIDx2aWRlbz4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zZXRQbGF5c2lubGluZSA9IGZ1bmN0aW9uIHNldFBsYXlzaW5saW5lKCkge307XG5cbiAgLypcbiAgICogQ2hlY2sgaWYgdGhlIHRlY2ggY2FuIHN1cHBvcnQgdGhlIGdpdmVuIG1pbWUtdHlwZS5cbiAgICpcbiAgICogVGhlIGJhc2UgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlLCBidXQgc291cmNlIGhhbmRsZXJzIG1pZ2h0XG4gICAqIG92ZXJ3cml0ZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2sgZm9yIHN1cHBvcnRcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yIGVtcHR5IHN0cmluZ1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTE1lZGlhRWxlbWVudC9jYW5QbGF5VHlwZX1cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZCBieSB0aGlzIHRlY2guXG4gICAqXG4gICAqIFRoZSBiYXNlIHRlY2ggZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSwgYnV0IHNvdXJjZSBoYW5kbGVycyBtaWdodFxuICAgKiBvdmVyd3JpdGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgIFRoZSBtZWRpYSB0eXBlIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgbmF0aXZlIHZpZGVvIGVsZW1lbnQncyByZXNwb25zZVxuICAgKi9cblxuXG4gIFRlY2guY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY09ialxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGVjaFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9ICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuXG5cbiAgVGVjaC5jYW5QbGF5U291cmNlID0gZnVuY3Rpb24gY2FuUGxheVNvdXJjZShzcmNPYmosIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gVGVjaC5jYW5QbGF5VHlwZShzcmNPYmoudHlwZSk7XG4gIH07XG5cbiAgLypcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgVGVjaCBvciBub3QuXG4gICAqIENhbiBiZSBwYXNzZWQgZWl0aGVyIGEgQ2xhc3MgbGlrZSBgSHRtbDVgIG9yIGEgaW5zdGFuY2UgbGlrZSBgcGxheWVyLnRlY2hfYFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29tcG9uZW50XG4gICAqICAgICAgICBUaGUgaXRlbSB0byBjaGVja1xuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIFdoZXRoZXIgaXQgaXMgYSB0ZWNoIG9yIG5vdFxuICAgKiAgICAgICAgIC0gVHJ1ZSBpZiBpdCBpcyBhIHRlY2hcbiAgICogICAgICAgICAtIEZhbHNlIGlmIGl0IGlzIG5vdFxuICAgKi9cblxuXG4gIFRlY2guaXNUZWNoID0gZnVuY3Rpb24gaXNUZWNoKGNvbXBvbmVudCkge1xuICAgIHJldHVybiBjb21wb25lbnQucHJvdG90eXBlIGluc3RhbmNlb2YgVGVjaCB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBUZWNoIHx8IGNvbXBvbmVudCA9PT0gVGVjaDtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgYFRlY2hgIGludG8gYSBzaGFyZWQgbGlzdCBmb3IgdmlkZW9qcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGBUZWNoYCB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRlY2hcbiAgICogICAgICAgIFRoZSBgVGVjaGAgY2xhc3MgdG8gcmVnaXN0ZXIuXG4gICAqL1xuXG5cbiAgVGVjaC5yZWdpc3RlclRlY2ggPSBmdW5jdGlvbiByZWdpc3RlclRlY2gobmFtZSwgdGVjaCkge1xuICAgIGlmICghVGVjaC50ZWNoc18pIHtcbiAgICAgIFRlY2gudGVjaHNfID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFUZWNoLmlzVGVjaCh0ZWNoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNoICcgKyBuYW1lICsgJyBtdXN0IGJlIGEgVGVjaCcpO1xuICAgIH1cblxuICAgIGlmICghVGVjaC5jYW5QbGF5VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNocyBtdXN0IGhhdmUgYSBzdGF0aWMgY2FuUGxheVR5cGUgbWV0aG9kIG9uIHRoZW0nKTtcbiAgICB9XG4gICAgaWYgKCFUZWNoLmNhblBsYXlTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVjaHMgbXVzdCBoYXZlIGEgc3RhdGljIGNhblBsYXlTb3VyY2UgbWV0aG9kIG9uIHRoZW0nKTtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBUZWNoLnRlY2hzX1tuYW1lXSA9IHRlY2g7XG4gICAgaWYgKG5hbWUgIT09ICdUZWNoJykge1xuICAgICAgLy8gY2FtZWwgY2FzZSB0aGUgdGVjaE5hbWUgZm9yIHVzZSBpbiB0ZWNoT3JkZXJcbiAgICAgIFRlY2guZGVmYXVsdFRlY2hPcmRlcl8ucHVzaChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlY2g7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBUZWNoYCBmcm9tIHRoZSBzaGFyZWQgbGlzdCBieSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgYGNhbWVsQ2FzZWAgb3IgYFRpdGxlQ2FzZWAgbmFtZSBvZiB0aGUgVGVjaCB0byBnZXRcbiAgICpcbiAgICogQHJldHVybiB7VGVjaHx1bmRlZmluZWR9XG4gICAqICAgICAgICAgVGhlIGBUZWNoYCBvciB1bmRlZmluZWQgaWYgdGhlcmUgd2FzIG5vIHRlY2ggd2l0aCB0aGUgbmFtZSByZXF1c3RlZC5cbiAgICovXG5cblxuICBUZWNoLmdldFRlY2ggPSBmdW5jdGlvbiBnZXRUZWNoKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBpZiAoVGVjaC50ZWNoc18gJiYgVGVjaC50ZWNoc19bbmFtZV0pIHtcbiAgICAgIHJldHVybiBUZWNoLnRlY2hzX1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93ICYmIHdpbmRvdy52aWRlb2pzICYmIHdpbmRvdy52aWRlb2pzW25hbWVdKSB7XG4gICAgICBsb2ckMS53YXJuKCdUaGUgJyArIG5hbWUgKyAnIHRlY2ggd2FzIGFkZGVkIHRvIHRoZSB2aWRlb2pzIG9iamVjdCB3aGVuIGl0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVzaW5nIHZpZGVvanMucmVnaXN0ZXJUZWNoKG5hbWUsIHRlY2gpJyk7XG4gICAgICByZXR1cm4gd2luZG93LnZpZGVvanNbbmFtZV07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZWNoO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtWaWRlb1RyYWNrTGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUudmlkZW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtBdWRpb1RyYWNrTGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUuYXVkaW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybnMge1RleHRUcmFja0xpc3R9XG4gKiBAbWV0aG9kIFRlY2gucHJvdG90eXBlLnRleHRUcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgcmVtb3RlIGVsZW1lbnQge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybnMge1RleHRUcmFja0xpc3R9XG4gKiBAbWV0aG9kIFRlY2gucHJvdG90eXBlLnJlbW90ZVRleHRUcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgcmVtb3RlIGVsZW1lbnQge0BsaW5rIEh0bWxUcmFja0VsZW1lbnRMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtIdG1sVHJhY2tFbGVtZW50TGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUucmVtb3RlVGV4dFRyYWNrRWxzXG4gKi9cblxuQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHByb3BzID0gQUxMW25hbWVdO1xuXG4gIFRlY2gucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdID0gdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gfHwgbmV3IHByb3BzLkxpc3RDbGFzcygpO1xuICAgIHJldHVybiB0aGlzW3Byb3BzLnByaXZhdGVOYW1lXTtcbiAgfTtcbn0pO1xuXG4vKipcbiAqIExpc3Qgb2YgYXNzb2NpYXRlZCB0ZXh0IHRyYWNrc1xuICpcbiAqIEB0eXBlIHtUZXh0VHJhY2tMaXN0fVxuICogQHByaXZhdGVcbiAqIEBwcm9wZXJ0eSBUZWNoI3RleHRUcmFja3NfXG4gKi9cblxuLyoqXG4gKiBMaXN0IG9mIGFzc29jaWF0ZWQgYXVkaW8gdHJhY2tzLlxuICpcbiAqIEB0eXBlIHtBdWRpb1RyYWNrTGlzdH1cbiAqIEBwcml2YXRlXG4gKiBAcHJvcGVydHkgVGVjaCNhdWRpb1RyYWNrc19cbiAqL1xuXG4vKipcbiAqIExpc3Qgb2YgYXNzb2NpYXRlZCB2aWRlbyB0cmFja3MuXG4gKlxuICogQHR5cGUge1ZpZGVvVHJhY2tMaXN0fVxuICogQHByaXZhdGVcbiAqIEBwcm9wZXJ0eSBUZWNoI3ZpZGVvVHJhY2tzX1xuICovXG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHZvbHVtZSBjb250cm9sLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNWb2x1bWVDb250cm9sID0gdHJ1ZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIG11dGluZyB2b2x1bWUuXG4gKlxuICogQHR5cGUge2JvbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzTXV0ZUNvbnRyb2wgPSB0cnVlO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgZnVsbHNjcmVlbiByZXNpemUgY29udHJvbC5cbiAqIFJlc2l6aW5nIHBsdWdpbnMgdXNpbmcgcmVxdWVzdCBmdWxsc2NyZWVuIHJlbG9hZHMgdGhlIHBsdWdpblxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNGdWxsc2NyZWVuUmVzaXplID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIGNoYW5naW5nIHRoZSBzcGVlZCBhdCB3aGljaCB0aGUgdmlkZW9cbiAqIHBsYXlzLiBFeGFtcGxlczpcbiAqICAgLSBTZXQgcGxheWVyIHRvIHBsYXkgMnggKHR3aWNlKSBhcyBmYXN0XG4gKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDAuNXggKGhhbGYpIGFzIGZhc3RcbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50LiBUaGlzIGlzIGN1cnJlbnRseVxuICogbm90IHRyaWdnZXJlZCBieSB2aWRlby1qcy1zd2YuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZlxuICoge0BsaW5rIFRlY2gjbWFudWFsUHJvZ3Jlc3NPbn0gc2hvdWxkIGJlIGNhbGxlZC5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzUHJvZ3Jlc3NFdmVudHMgPSBmYWxzZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgdGhlIGBzb3VyY2VzZXRgIGV2ZW50LlxuICpcbiAqIEEgdGVjaCBzaG91bGQgc2V0IHRoaXMgdG8gYHRydWVgIGFuZCB0aGVuIHVzZSB7QGxpbmsgVGVjaCN0cmlnZ2VyU291cmNlc2V0fVxuICogdG8gdHJpZ2dlciBhIHtAbGluayBUZWNoI2V2ZW50OnNvdXJjZXNldH0gYXQgdGhlIGVhcmxpZXN0IHRpbWUgYWZ0ZXIgZ2V0dGluZ1xuICogYSBuZXcgc291cmNlLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNTb3VyY2VzZXQgPSBmYWxzZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgdGhlIGB0aW1ldXBkYXRlYCBldmVudC4gVGhpcyBpcyBjdXJyZW50bHlcbiAqIG5vdCB0cmlnZ2VyZWQgYnkgdmlkZW8tanMtc3dmLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAqIHtAbGluayBUZWNoI21hbnVhbFRpbWVVcGRhdGVzfSBzaG91bGQgYmUgY2FsbGVkLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNUaW1ldXBkYXRlRXZlbnRzID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHRoZSBuYXRpdmUgYFRleHRUcmFja2BzLlxuICogVGhpcyB3aWxsIGhlbHAgdXMgaW50ZWdyYXRlIHdpdGggbmF0aXZlIGBUZXh0VHJhY2tgcyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGVtLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gZmFsc2U7XG5cbi8qKlxuICogQSBmdW5jdGlvbmFsIG1peGluIGZvciB0ZWNocyB0aGF0IHdhbnQgdG8gdXNlIHRoZSBTb3VyY2UgSGFuZGxlciBwYXR0ZXJuLlxuICogU291cmNlIGhhbmRsZXJzIGFyZSBzY3JpcHRzIGZvciBoYW5kbGluZyBzcGVjaWZpYyBmb3JtYXRzLlxuICogVGhlIHNvdXJjZSBoYW5kbGVyIHBhdHRlcm4gaXMgdXNlZCBmb3IgYWRhcHRpdmUgZm9ybWF0cyAoSExTLCBEQVNIKSB0aGF0XG4gKiBtYW51YWxseSBsb2FkIHZpZGVvIGRhdGEgYW5kIGZlZWQgaXQgaW50byBhIFNvdXJjZSBCdWZmZXIgKE1lZGlhIFNvdXJjZSBFeHRlbnNpb25zKVxuICogRXhhbXBsZTogYFRlY2gud2l0aFNvdXJjZUhhbmRsZXJzLmNhbGwoTXlUZWNoKTtgXG4gKlxuICogQHBhcmFtIHtUZWNofSBfVGVjaFxuICogICAgICAgIFRoZSB0ZWNoIHRvIGFkZCBzb3VyY2UgaGFuZGxlciBmdW5jdGlvbnMgdG8uXG4gKlxuICogQG1peGVzIFRlY2h+U291cmNlSGFuZGxlckFkZGl0aW9uc1xuICovXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyA9IGZ1bmN0aW9uIChfVGVjaCkge1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNvdXJjZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogICAgICAgIFRoZSBzb3VyY2UgaGFuZGxlciBjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuICAgKiAgICAgICAgUmVnaXN0ZXIgaXQgYXQgdGhlIGZvbGxvd2luZyBpbmRleFxuICAgKi9cbiAgX1RlY2gucmVnaXN0ZXJTb3VyY2VIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIsIGluZGV4KSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnM7XG5cbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgICBpbmRleCA9IGhhbmRsZXJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDAsIGhhbmRsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gdHlwZS4gQWxzbyBjaGVja3MgdGhlXG4gICAqIFRlY2hzIHNvdXJjZUhhbmRsZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiAgICAgICAgIFRoZSBtaW1ldHlwZSB0byBjaGVjay5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuICBfVGVjaC5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgfHwgW107XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhblBsYXlUeXBlKHR5cGUpO1xuXG4gICAgICBpZiAoY2FuKSB7XG4gICAgICAgIHJldHVybiBjYW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBzb3VyY2UgaGFuZGxlciB0aGF0IHN1cHBvcnRzIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIFRPRE86IEFuc3dlciBxdWVzdGlvbjogc2hvdWxkICdwcm9iYWJseScgYmUgcHJpb3JpdGl6ZWQgb3ZlciAnbWF5YmUnXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGVjaFxuICAgKlxuICAgKiBAcmV0dXJuIHtTb3VyY2VIYW5kbGVyfG51bGx9XG4gICAqICAgICAgICAgIFRoZSBmaXJzdCBzb3VyY2UgaGFuZGxlciB0aGF0IHN1cHBvcnRzIHRoZSBzb3VyY2Ugb3IgbnVsbCBpZlxuICAgKiAgICAgICAgICBubyBTb3VyY2VIYW5kbGVyIHN1cHBvcnRzIHRoZSBzb3VyY2VcbiAgICovXG4gIF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIgPSBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgfHwgW107XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhbkhhbmRsZVNvdXJjZShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoY2FuKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHRlY2ggY2FuIHN1cHBvcnQgdGhlIGdpdmVuIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc3JjT2JqXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiAgICAgICAgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB0ZWNoXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKVxuICAgKi9cbiAgX1RlY2guY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uIChzcmNPYmosIG9wdGlvbnMpIHtcbiAgICB2YXIgc2ggPSBfVGVjaC5zZWxlY3RTb3VyY2VIYW5kbGVyKHNyY09iaiwgb3B0aW9ucyk7XG5cbiAgICBpZiAoc2gpIHtcbiAgICAgIHJldHVybiBzaC5jYW5IYW5kbGVTb3VyY2Uoc3JjT2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgYSBzb3VyY2UgaGFuZGxlciwgcHJlZmVyIGl0cyBpbXBsZW1lbnRhdGlvbiBvZlxuICAgKiBhbnkgZnVuY3Rpb24gbm9ybWFsbHkgcHJvdmlkZWQgYnkgdGhlIHRlY2guXG4gICAqL1xuICB2YXIgZGVmZXJyYWJsZSA9IFsnc2Vla2FibGUnLCAnc2Vla2luZycsICdkdXJhdGlvbiddO1xuXG4gIC8qKlxuICAgKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZWNoI3NlZWthYmxlfSB0aGF0IHdpbGwgY2FsbCBhIGBTb3VyY2VIYW5kbGVyYHMgc2Vla2FibGVcbiAgICogZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCB3aXRoIGEgZmFsbGJhY2sgdG8gdGhlIFRlY2hzIHNlZWthYmxlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAbWV0aG9kIF9UZWNoLnNlZWthYmxlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZWNoI2R1cmF0aW9ufSB0aGF0IHdpbGwgY2FsbCBhIGBTb3VyY2VIYW5kbGVyYHMgZHVyYXRpb25cbiAgICogZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjayB0byB0aGUgdGVjaHMgZHVyYXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBtZXRob2QgX1RlY2guZHVyYXRpb25cbiAgICovXG5cbiAgZGVmZXJyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChmbk5hbWUpIHtcbiAgICB2YXIgb3JpZ2luYWxGbiA9IHRoaXNbZm5OYW1lXTtcblxuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXNbZm5OYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLnNvdXJjZUhhbmRsZXJfICYmIHRoaXMuc291cmNlSGFuZGxlcl9bZm5OYW1lXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VIYW5kbGVyX1tmbk5hbWVdLmFwcGx5KHRoaXMuc291cmNlSGFuZGxlcl8sIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIF9UZWNoLnByb3RvdHlwZSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHRoZSBzb3VyY2UgdXNpbmcgYSBzb3VyY2Ugb2JqZWN0XG4gICAqIGFuZCBzb3VyY2UgaGFuZGxlcnMuXG4gICAqIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgdW5sZXNzIGEgc291cmNlIGhhbmRsZXIgd2FzIGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzb3VyY2VcbiAgICogICAgICAgIEEgc291cmNlIG9iamVjdCB3aXRoIHNyYyBhbmQgdHlwZSBrZXlzXG4gICAqL1xuICBfVGVjaC5wcm90b3R5cGUuc2V0U291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHZhciBzaCA9IF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIoc291cmNlLCB0aGlzLm9wdGlvbnNfKTtcblxuICAgIGlmICghc2gpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBhIG5hdGl2ZSBzb3VyY2UgaGFuZGVyIHdoZW4gdW5zdXBwb3J0ZWQgc291cmNlcyBhcmVcbiAgICAgIC8vIGRlbGliZXJhdGVseSBzZXRcbiAgICAgIGlmIChfVGVjaC5uYXRpdmVTb3VyY2VIYW5kbGVyKSB7XG4gICAgICAgIHNoID0gX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZyQxLmVycm9yKCdObyBzb3VyY2UgaGFuZGVyIGZvdW5kIGZvciB0aGUgY3VycmVudCBzb3VyY2UuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzcG9zZSBhbnkgZXhpc3Rpbmcgc291cmNlIGhhbmRsZXJcbiAgICB0aGlzLmRpc3Bvc2VTb3VyY2VIYW5kbGVyKCk7XG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2VTb3VyY2VIYW5kbGVyKTtcblxuICAgIGlmIChzaCAhPT0gX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcikge1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlXyA9IHNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZUhhbmRsZXJfID0gc2guaGFuZGxlU291cmNlKHNvdXJjZSwgdGhpcywgdGhpcy5vcHRpb25zXyk7XG4gICAgdGhpcy5vbignZGlzcG9zZScsIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbnkgZXhpc3RpbmcgU291cmNlSGFuZGxlcnMgYW5kIGxpc3RlbmVycyB3aGVuIHRoZSBUZWNoIGlzIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAbGlzdGVucyBUZWNoI2Rpc3Bvc2VcbiAgICovXG4gIF9UZWNoLnByb3RvdHlwZS5kaXNwb3NlU291cmNlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc291cmNlIGFuZCBnZXQgYW5vdGhlciBvbmVcbiAgICAvLyB0aGVuIHdlIGFyZSBsb2FkaW5nIHNvbWV0aGluZyBuZXdcbiAgICAvLyB0aGFuIGNsZWFyIGFsbCBvZiBvdXIgY3VycmVudCB0cmFja3NcbiAgICBpZiAodGhpcy5jdXJyZW50U291cmNlXykge1xuICAgICAgdGhpcy5jbGVhclRyYWNrcyhbJ2F1ZGlvJywgJ3ZpZGVvJ10pO1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIGNsZWFuIHVwIGF1dG8tdGV4dCB0cmFja3NcbiAgICB0aGlzLmNsZWFudXBBdXRvVGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKHRoaXMuc291cmNlSGFuZGxlcl8pIHtcblxuICAgICAgaWYgKHRoaXMuc291cmNlSGFuZGxlcl8uZGlzcG9zZSkge1xuICAgICAgICB0aGlzLnNvdXJjZUhhbmRsZXJfLmRpc3Bvc2UoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3VyY2VIYW5kbGVyXyA9IG51bGw7XG4gICAgfVxuICB9O1xufTtcblxuLy8gVGhlIGJhc2UgVGVjaCBjbGFzcyBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFzIGEgQ29tcG9uZW50LiBJdCBpcyB0aGUgb25seVxuLy8gVGVjaCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGFzIGEgQ29tcG9uZW50LlxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZWNoJywgVGVjaCk7XG5UZWNoLnJlZ2lzdGVyVGVjaCgnVGVjaCcsIFRlY2gpO1xuXG4vKipcbiAqIEEgbGlzdCBvZiB0ZWNocyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0ZWNoT3JkZXIgb24gUGxheWVyc1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblRlY2guZGVmYXVsdFRlY2hPcmRlcl8gPSBbXTtcblxudmFyIG1pZGRsZXdhcmVzID0ge307XG52YXIgbWlkZGxld2FyZUluc3RhbmNlcyA9IHt9O1xuXG52YXIgVEVSTUlOQVRPUiA9IHt9O1xuXG5mdW5jdGlvbiB1c2UodHlwZSwgbWlkZGxld2FyZSkge1xuICBtaWRkbGV3YXJlc1t0eXBlXSA9IG1pZGRsZXdhcmVzW3R5cGVdIHx8IFtdO1xuICBtaWRkbGV3YXJlc1t0eXBlXS5wdXNoKG1pZGRsZXdhcmUpO1xufVxuXG5cblxuZnVuY3Rpb24gc2V0U291cmNlKHBsYXllciwgc3JjLCBuZXh0KSB7XG4gIHBsYXllci5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2V0U291cmNlSGVscGVyKHNyYywgbWlkZGxld2FyZXNbc3JjLnR5cGVdLCBuZXh0LCBwbGF5ZXIpO1xuICB9LCAxKTtcbn1cblxuZnVuY3Rpb24gc2V0VGVjaChtaWRkbGV3YXJlLCB0ZWNoKSB7XG4gIG1pZGRsZXdhcmUuZm9yRWFjaChmdW5jdGlvbiAobXcpIHtcbiAgICByZXR1cm4gbXcuc2V0VGVjaCAmJiBtdy5zZXRUZWNoKHRlY2gpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGdldHRlciBvbiB0aGUgdGVjaCBmaXJzdCwgdGhyb3VnaCBlYWNoIG1pZGRsZXdhcmVcbiAqIGZyb20gcmlnaHQgdG8gbGVmdCB0byB0aGUgcGxheWVyLlxuICovXG5mdW5jdGlvbiBnZXQkMShtaWRkbGV3YXJlLCB0ZWNoLCBtZXRob2QpIHtcbiAgcmV0dXJuIG1pZGRsZXdhcmUucmVkdWNlUmlnaHQobWlkZGxld2FyZUl0ZXJhdG9yKG1ldGhvZCksIHRlY2hbbWV0aG9kXSgpKTtcbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgYXJndW1lbnQgZ2l2ZW4gdG8gdGhlIHBsYXllciBhbmQgY2FsbHMgdGhlIHNldHRlciBtZXRob2Qgb24gZWFjaFxuICogbWlkZGx3YXJlIGZyb20gbGVmdCB0byByaWdodCB0byB0aGUgdGVjaC5cbiAqL1xuZnVuY3Rpb24gc2V0JDEobWlkZGxld2FyZSwgdGVjaCwgbWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuIHRlY2hbbWV0aG9kXShtaWRkbGV3YXJlLnJlZHVjZShtaWRkbGV3YXJlSXRlcmF0b3IobWV0aG9kKSwgYXJnKSk7XG59XG5cbi8qKlxuICogVGFrZXMgdGhlIGFyZ3VtZW50IGdpdmVuIHRvIHRoZSBwbGF5ZXIgYW5kIGNhbGxzIHRoZSBgY2FsbGAgdmVyc2lvbiBvZiB0aGUgbWV0aG9kXG4gKiBvbiBlYWNoIG1pZGRsZXdhcmUgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogVGhlbiwgY2FsbCB0aGUgcGFzc2VkIGluIG1ldGhvZCBvbiB0aGUgdGVjaCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgdW5jaGFuZ2VkXG4gKiBiYWNrIHRvIHRoZSBwbGF5ZXIsIHRocm91Z2ggbWlkZGxld2FyZSwgdGhpcyB0aW1lIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqL1xuZnVuY3Rpb24gbWVkaWF0ZShtaWRkbGV3YXJlLCB0ZWNoLCBtZXRob2QpIHtcbiAgdmFyIGFyZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY2FsbE1ldGhvZCA9ICdjYWxsJyArIHRvVGl0bGVDYXNlKG1ldGhvZCk7XG4gIHZhciBtaWRkbGV3YXJlVmFsdWUgPSBtaWRkbGV3YXJlLnJlZHVjZShtaWRkbGV3YXJlSXRlcmF0b3IoY2FsbE1ldGhvZCksIGFyZyk7XG4gIHZhciB0ZXJtaW5hdGVkID0gbWlkZGxld2FyZVZhbHVlID09PSBURVJNSU5BVE9SO1xuICB2YXIgcmV0dXJuVmFsdWUgPSB0ZXJtaW5hdGVkID8gbnVsbCA6IHRlY2hbbWV0aG9kXShtaWRkbGV3YXJlVmFsdWUpO1xuXG4gIGV4ZWN1dGVSaWdodChtaWRkbGV3YXJlLCBtZXRob2QsIHJldHVyblZhbHVlLCB0ZXJtaW5hdGVkKTtcblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbnZhciBhbGxvd2VkR2V0dGVycyA9IHtcbiAgYnVmZmVyZWQ6IDEsXG4gIGN1cnJlbnRUaW1lOiAxLFxuICBkdXJhdGlvbjogMSxcbiAgc2Vla2FibGU6IDEsXG4gIHBsYXllZDogMSxcbiAgcGF1c2VkOiAxXG59O1xuXG52YXIgYWxsb3dlZFNldHRlcnMgPSB7XG4gIHNldEN1cnJlbnRUaW1lOiAxXG59O1xuXG52YXIgYWxsb3dlZE1lZGlhdG9ycyA9IHtcbiAgcGxheTogMSxcbiAgcGF1c2U6IDFcbn07XG5cbmZ1bmN0aW9uIG1pZGRsZXdhcmVJdGVyYXRvcihtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgbXcpIHtcbiAgICAvLyBpZiB0aGUgcHJldmlvdXMgbWlkZGxld2FyZSB0ZXJtaW5hdGVkLCBwYXNzIGFsb25nIHRoZSB0ZXJtaW5hdGlvblxuICAgIGlmICh2YWx1ZSA9PT0gVEVSTUlOQVRPUikge1xuICAgICAgcmV0dXJuIFRFUk1JTkFUT1I7XG4gICAgfVxuXG4gICAgaWYgKG13W21ldGhvZF0pIHtcbiAgICAgIHJldHVybiBtd1ttZXRob2RdKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVSaWdodChtd3MsIG1ldGhvZCwgdmFsdWUsIHRlcm1pbmF0ZWQpIHtcbiAgZm9yICh2YXIgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBtdyA9IG13c1tpXTtcblxuICAgIGlmIChtd1ttZXRob2RdKSB7XG4gICAgICBtd1ttZXRob2RdKHRlcm1pbmF0ZWQsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDYWNoZUZvclBsYXllcihwbGF5ZXIpIHtcbiAgbWlkZGxld2FyZUluc3RhbmNlc1twbGF5ZXIuaWQoKV0gPSBudWxsO1xufVxuXG4vKipcbiAqIHtcbiAqICBbcGxheWVySWRdOiBbW213RmFjdG9yeSwgbXdJbnN0YW5jZV0sIC4uLl1cbiAqIH1cbiAqL1xuZnVuY3Rpb24gZ2V0T3JDcmVhdGVGYWN0b3J5KHBsYXllciwgbXdGYWN0b3J5KSB7XG4gIHZhciBtd3MgPSBtaWRkbGV3YXJlSW5zdGFuY2VzW3BsYXllci5pZCgpXTtcbiAgdmFyIG13ID0gbnVsbDtcblxuICBpZiAobXdzID09PSB1bmRlZmluZWQgfHwgbXdzID09PSBudWxsKSB7XG4gICAgbXcgPSBtd0ZhY3RvcnkocGxheWVyKTtcbiAgICBtaWRkbGV3YXJlSW5zdGFuY2VzW3BsYXllci5pZCgpXSA9IFtbbXdGYWN0b3J5LCBtd11dO1xuICAgIHJldHVybiBtdztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9td3MkaSA9IG13c1tpXSxcbiAgICAgICAgbXdmID0gX213cyRpWzBdLFxuICAgICAgICBtd2kgPSBfbXdzJGlbMV07XG5cblxuICAgIGlmIChtd2YgIT09IG13RmFjdG9yeSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbXcgPSBtd2k7XG4gIH1cblxuICBpZiAobXcgPT09IG51bGwpIHtcbiAgICBtdyA9IG13RmFjdG9yeShwbGF5ZXIpO1xuICAgIG13cy5wdXNoKFttd0ZhY3RvcnksIG13XSk7XG4gIH1cblxuICByZXR1cm4gbXc7XG59XG5cbmZ1bmN0aW9uIHNldFNvdXJjZUhlbHBlcigpIHtcbiAgdmFyIHNyYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBtaWRkbGV3YXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgdmFyIG5leHQgPSBhcmd1bWVudHNbMl07XG4gIHZhciBwbGF5ZXIgPSBhcmd1bWVudHNbM107XG4gIHZhciBhY2MgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IFtdO1xuICB2YXIgbGFzdFJ1biA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogZmFsc2U7XG4gIHZhciBtd0ZhY3RvcnkgPSBtaWRkbGV3YXJlWzBdLFxuICAgICAgbXdyZXN0ID0gbWlkZGxld2FyZS5zbGljZSgxKTtcblxuICAvLyBpZiBtd0ZhY3RvcnkgaXMgYSBzdHJpbmcsIHRoZW4gd2UncmUgYXQgYSBmb3JrIGluIHRoZSByb2FkXG5cbiAgaWYgKHR5cGVvZiBtd0ZhY3RvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgc2V0U291cmNlSGVscGVyKHNyYywgbWlkZGxld2FyZXNbbXdGYWN0b3J5XSwgbmV4dCwgcGxheWVyLCBhY2MsIGxhc3RSdW4pO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbiBtd0ZhY3RvcnksIGNhbGwgaXQgd2l0aCB0aGUgcGxheWVyIHRvIGdldCB0aGUgbXcsXG4gICAgLy8gdGhlbiBjYWxsIHRoZSBtdydzIHNldFNvdXJjZSBtZXRob2RcbiAgfSBlbHNlIGlmIChtd0ZhY3RvcnkpIHtcbiAgICB2YXIgbXcgPSBnZXRPckNyZWF0ZUZhY3RvcnkocGxheWVyLCBtd0ZhY3RvcnkpO1xuXG4gICAgLy8gaWYgc2V0U291cmNlIGlzbid0IHByZXNlbnQsIGltcGxpY2l0bHkgc2VsZWN0IHRoaXMgbWlkZGxld2FyZVxuICAgIGlmICghbXcuc2V0U291cmNlKSB7XG4gICAgICBhY2MucHVzaChtdyk7XG4gICAgICByZXR1cm4gc2V0U291cmNlSGVscGVyKHNyYywgbXdyZXN0LCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7XG4gICAgfVxuXG4gICAgbXcuc2V0U291cmNlKGFzc2lnbih7fSwgc3JjKSwgZnVuY3Rpb24gKGVyciwgX3NyYykge1xuXG4gICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRyeSB0aGUgbmV4dCBtaWRkbGV3YXJlIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgICAvLyBtYWtlIHN1cmUgdG8gdXNlIHRoZSBvbGQgc3JjXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzZXRTb3VyY2VIZWxwZXIoc3JjLCBtd3Jlc3QsIG5leHQsIHBsYXllciwgYWNjLCBsYXN0UnVuKTtcbiAgICAgIH1cblxuICAgICAgLy8gd2UndmUgc3VjY2VlZGVkLCBub3cgd2UgbmVlZCB0byBnbyBkZWVwZXJcbiAgICAgIGFjYy5wdXNoKG13KTtcblxuICAgICAgLy8gaWYgaXQncyB0aGUgc2FtZSB0eXBlLCBjb250aW51ZSBkb3duIHRoZSBjdXJyZW50IGNoYWluXG4gICAgICAvLyBvdGhlcndpc2UsIHdlIHdhbnQgdG8gZ28gZG93biB0aGUgbmV3IGNoYWluXG4gICAgICBzZXRTb3VyY2VIZWxwZXIoX3NyYywgc3JjLnR5cGUgPT09IF9zcmMudHlwZSA/IG13cmVzdCA6IG1pZGRsZXdhcmVzW19zcmMudHlwZV0sIG5leHQsIHBsYXllciwgYWNjLCBsYXN0UnVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtd3Jlc3QubGVuZ3RoKSB7XG4gICAgc2V0U291cmNlSGVscGVyKHNyYywgbXdyZXN0LCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7XG4gIH0gZWxzZSBpZiAobGFzdFJ1bikge1xuICAgIG5leHQoc3JjLCBhY2MpO1xuICB9IGVsc2Uge1xuICAgIHNldFNvdXJjZUhlbHBlcihzcmMsIG1pZGRsZXdhcmVzWycqJ10sIG5leHQsIHBsYXllciwgYWNjLCB0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pbWV0eXBlc1xuICpcbiAqIEBzZWUgaHR0cDovL2h1bC5oYXJ2YXJkLmVkdS9vaXMvLy8vL3N5c3RlbXMvd2F4L3dheC1wdWJsaWMtaGVscC9taW1ldHlwZXMuaHRtXG4gKiBAdHlwZWRlZiBNaW1ldHlwZXN+S2luZFxuICogQGVudW1cbiAqL1xudmFyIE1pbWV0eXBlc0tpbmQgPSB7XG4gIG9wdXM6ICd2aWRlby9vZ2cnLFxuICBvZ3Y6ICd2aWRlby9vZ2cnLFxuICBtcDQ6ICd2aWRlby9tcDQnLFxuICBtb3Y6ICd2aWRlby9tcDQnLFxuICBtNHY6ICd2aWRlby9tcDQnLFxuICBta3Y6ICd2aWRlby94LW1hdHJvc2thJyxcbiAgbXAzOiAnYXVkaW8vbXBlZycsXG4gIGFhYzogJ2F1ZGlvL2FhYycsXG4gIG9nYTogJ2F1ZGlvL29nZycsXG4gIG0zdTg6ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXG59O1xuXG4vKipcbiAqIEdldCB0aGUgbWltZXR5cGUgb2YgYSBnaXZlbiBzcmMgdXJsIGlmIHBvc3NpYmxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogICAgICAgIFRoZSB1cmwgdG8gdGhlIHNyY1xuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgcmV0dXJuIHRoZSBtaW1ldHlwZSBpZiBpdCB3YXMga25vd24gb3IgZW1wdHkgc3RyaW5nIG90aGVyd2lzZVxuICovXG52YXIgZ2V0TWltZXR5cGUgPSBmdW5jdGlvbiBnZXRNaW1ldHlwZSgpIHtcbiAgdmFyIHNyYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG5cbiAgdmFyIGV4dCA9IGdldEZpbGVFeHRlbnNpb24oc3JjKTtcbiAgdmFyIG1pbWV0eXBlID0gTWltZXR5cGVzS2luZFtleHQudG9Mb3dlckNhc2UoKV07XG5cbiAgcmV0dXJuIG1pbWV0eXBlIHx8ICcnO1xufTtcblxuLyoqXG4gKiBGaW5kIHRoZSBtaW1lIHR5cGUgb2YgYSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGlmIHBvc3NpYmxlLiBVc2VzIHRoZSBwbGF5ZXJcbiAqIHNvdXJjZSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gKiAgICAgICAgVGhlIHBsYXllciBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmdcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgIFRoZSB0eXBlIHRoYXQgd2FzIGZvdW5kXG4gKi9cbnZhciBmaW5kTWltZXR5cGUgPSBmdW5jdGlvbiBmaW5kTWltZXR5cGUocGxheWVyLCBzcmMpIHtcbiAgaWYgKCFzcmMpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyAxLiBjaGVjayBmb3IgdGhlIHR5cGUgaW4gdGhlIGBzb3VyY2VgIGNhY2hlXG4gIGlmIChwbGF5ZXIuY2FjaGVfLnNvdXJjZS5zcmMgPT09IHNyYyAmJiBwbGF5ZXIuY2FjaGVfLnNvdXJjZS50eXBlKSB7XG4gICAgcmV0dXJuIHBsYXllci5jYWNoZV8uc291cmNlLnR5cGU7XG4gIH1cblxuICAvLyAyLiBzZWUgaWYgd2UgaGF2ZSB0aGlzIHNvdXJjZSBpbiBvdXIgYGN1cnJlbnRTb3VyY2VzYCBjYWNoZVxuICB2YXIgbWF0Y2hpbmdTb3VyY2VzID0gcGxheWVyLmNhY2hlXy5zb3VyY2VzLmZpbHRlcihmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnNyYyA9PT0gc3JjO1xuICB9KTtcblxuICBpZiAobWF0Y2hpbmdTb3VyY2VzLmxlbmd0aCkge1xuICAgIHJldHVybiBtYXRjaGluZ1NvdXJjZXNbMF0udHlwZTtcbiAgfVxuXG4gIC8vIDMuIGxvb2sgZm9yIHRoZSBzcmMgdXJsIGluIHNvdXJjZSBlbGVtZW50cyBhbmQgdXNlIHRoZSB0eXBlIHRoZXJlXG4gIHZhciBzb3VyY2VzID0gcGxheWVyLiQkKCdzb3VyY2UnKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IHNvdXJjZXNbaV07XG5cbiAgICBpZiAocy50eXBlICYmIHMuc3JjICYmIHMuc3JjID09PSBzcmMpIHtcbiAgICAgIHJldHVybiBzLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gNC4gZmluYWxseSBmYWxsYmFjayB0byBvdXIgbGlzdCBvZiBtaW1lIHR5cGVzIGJhc2VkIG9uIHNyYyB1cmwgZXh0ZW5zaW9uXG4gIHJldHVybiBnZXRNaW1ldHlwZShzcmMpO1xufTtcblxuLyoqXG4gKiBAbW9kdWxlIGZpbHRlci1zb3VyY2VcbiAqL1xuLyoqXG4gKiBGaWx0ZXIgb3V0IHNpbmdsZSBiYWQgc291cmNlIG9iamVjdHMgb3IgbXVsdGlwbGUgc291cmNlIG9iamVjdHMgaW4gYW5cbiAqIGFycmF5LiBBbHNvIGZsYXR0ZW5zIG5lc3RlZCBzb3VyY2Ugb2JqZWN0IGFycmF5cyBpbnRvIGEgMSBkaW1lbnNpb25hbFxuICogYXJyYXkgb2Ygc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdHxUZWNoflNvdXJjZU9iamVjdFtdfSBzcmNcbiAqICAgICAgICBUaGUgc3JjIG9iamVjdCB0byBmaWx0ZXJcbiAqXG4gKiBAcmV0dXJuIHtUZWNoflNvdXJjZU9iamVjdFtdfVxuICogICAgICAgICBBbiBhcnJheSBvZiBzb3VyY2VvYmplY3RzIGNvbnRhaW5pbmcgb25seSB2YWxpZCBzb3VyY2VzXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGZpbHRlclNvdXJjZSA9IGZ1bmN0aW9uIGZpbHRlclNvdXJjZShzcmMpIHtcbiAgLy8gdHJhdmVyc2UgYXJyYXlcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHZhciBuZXdzcmMgPSBbXTtcblxuICAgIHNyYy5mb3JFYWNoKGZ1bmN0aW9uIChzcmNvYmopIHtcbiAgICAgIHNyY29iaiA9IGZpbHRlclNvdXJjZShzcmNvYmopO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzcmNvYmopKSB7XG4gICAgICAgIG5ld3NyYyA9IG5ld3NyYy5jb25jYXQoc3Jjb2JqKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3Jjb2JqKSkge1xuICAgICAgICBuZXdzcmMucHVzaChzcmNvYmopO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3JjID0gbmV3c3JjO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzcmMgPT09ICdzdHJpbmcnICYmIHNyYy50cmltKCkpIHtcbiAgICAvLyBjb252ZXJ0IHN0cmluZyBpbnRvIG9iamVjdFxuICAgIHNyYyA9IFtmaXhTb3VyY2UoeyBzcmM6IHNyYyB9KV07XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSAmJiB0eXBlb2Ygc3JjLnNyYyA9PT0gJ3N0cmluZycgJiYgc3JjLnNyYyAmJiBzcmMuc3JjLnRyaW0oKSkge1xuICAgIC8vIHNyYyBpcyBhbHJlYWR5IHZhbGlkXG4gICAgc3JjID0gW2ZpeFNvdXJjZShzcmMpXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbnZhbGlkIHNvdXJjZSwgdHVybiBpdCBpbnRvIGFuIGVtcHR5IGFycmF5XG4gICAgc3JjID0gW107XG4gIH1cblxuICByZXR1cm4gc3JjO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgc3JjIG1pbWV0eXBlLCBhZGRpbmcgaXQgd2hlbiBwb3NzaWJsZVxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNyY1xuICogICAgICAgIFRoZSBzcmMgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtUZWNoflNvdXJjZU9iamVjdH1cbiAqICAgICAgICBzcmMgT2JqZWN0IHdpdGgga25vd24gdHlwZVxuICovXG5mdW5jdGlvbiBmaXhTb3VyY2Uoc3JjKSB7XG4gIHZhciBtaW1ldHlwZSA9IGdldE1pbWV0eXBlKHNyYy5zcmMpO1xuXG4gIGlmICghc3JjLnR5cGUgJiYgbWltZXR5cGUpIHtcbiAgICBzcmMudHlwZSA9IG1pbWV0eXBlO1xuICB9XG5cbiAgcmV0dXJuIHNyYztcbn1cblxuLyoqXG4gKiBAZmlsZSBsb2FkZXIuanNcbiAqL1xuLyoqXG4gKiBUaGUgYE1lZGlhTG9hZGVyYCBpcyB0aGUgYENvbXBvbmVudGAgdGhhdCBkZWNpZGVzIHdoaWNoIHBsYXliYWNrIHRlY2hub2xvZ3kgdG8gbG9hZFxuICogd2hlbiBhIHBsYXllciBpcyBpbml0aWFsaXplZC5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTWVkaWFMb2FkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhNZWRpYUxvYWRlciwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBhdHRhY2ggdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3Ryb2Ugb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHJ1biB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gTWVkaWFMb2FkZXIocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lZGlhTG9hZGVyKTtcblxuICAgIC8vIE1lZGlhTG9hZGVyIGhhcyBubyBlbGVtZW50XG4gICAgdmFyIG9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKHsgY3JlYXRlRWw6IGZhbHNlIH0sIG9wdGlvbnMpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHNvdXJjZXMgd2hlbiB0aGUgcGxheWVyIGlzIGluaXRpYWxpemVkLFxuICAgIC8vIGxvYWQgdGhlIGZpcnN0IHN1cHBvcnRlZCBwbGF5YmFjayB0ZWNobm9sb2d5LlxuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zXywgcmVhZHkpKTtcblxuICAgIGlmICghb3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMgfHwgb3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG9wdGlvbnMucGxheWVyT3B0aW9ucy50ZWNoT3JkZXI7IGkgPCBqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ZWNoTmFtZSA9IHRvVGl0bGVDYXNlKGpbaV0pO1xuICAgICAgICB2YXIgdGVjaCA9IFRlY2guZ2V0VGVjaCh0ZWNoTmFtZSk7XG5cbiAgICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC5cbiAgICAgICAgaWYgKCF0ZWNoTmFtZSkge1xuICAgICAgICAgIHRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHRlY2hOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICBpZiAodGVjaCAmJiB0ZWNoLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICBwbGF5ZXIubG9hZFRlY2hfKHRlY2hOYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb29wIHRocm91Z2ggcGxheWJhY2sgdGVjaG5vbG9naWVzIChIVE1MNSwgRmxhc2gpIGFuZCBjaGVjayBmb3Igc3VwcG9ydC5cbiAgICAgIC8vIFRoZW4gbG9hZCB0aGUgYmVzdCBzb3VyY2UuXG4gICAgICAvLyBBIGZldyBhc3N1bXB0aW9ucyBoZXJlOlxuICAgICAgLy8gICBBbGwgcGxheWJhY2sgdGVjaG5vbG9naWVzIHJlc3BlY3QgcHJlbG9hZCBmYWxzZS5cbiAgICAgIHBsYXllci5zcmMob3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gTWVkaWFMb2FkZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVkaWFMb2FkZXInLCBNZWRpYUxvYWRlcik7XG5cbi8qKlxuICogQGZpbGUgYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogQ2xpY2thYmxlIENvbXBvbmVudCB3aGljaCBpcyBjbGlja2FibGUgb3Iga2V5Ym9hcmQgYWN0aW9uYWJsZSxcbiAqIGJ1dCBpcyBub3QgYSBuYXRpdmUgSFRNTCBidXR0b24uXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIENsaWNrYWJsZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKENsaWNrYWJsZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2xpY2thYmxlQ29tcG9uZW50KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmVtaXRUYXBFdmVudHMoKTtcblxuICAgIF90aGlzLmVuYWJsZSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgcyBET00gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9ZGl2XVxuICAgKiAgICAgICAgVGhlIGVsZW1lbnQncyBub2RlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbYXR0cmlidXRlcz17fV1cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIHRhZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2Rpdic7XG4gICAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICBpbm5lckhUTUw6ICc8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInZqcy1pY29uLXBsYWNlaG9sZGVyXCI+PC9zcGFuPicsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpLFxuICAgICAgdGFiSW5kZXg6IDBcbiAgICB9LCBwcm9wcyk7XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgbG9nJDEuZXJyb3IoJ0NyZWF0aW5nIGEgQ2xpY2thYmxlQ29tcG9uZW50IHdpdGggYW4gSFRNTCBlbGVtZW50IG9mICcgKyB0YWcgKyAnIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIEJ1dHRvbiBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIC8vIEFkZCBBUklBIGF0dHJpYnV0ZXMgZm9yIGNsaWNrYWJsZSBlbGVtZW50IHdoaWNoIGlzIG5vdCBhIG5hdGl2ZSBIVE1MIGJ1dHRvblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe1xuICAgICAgcm9sZTogJ2J1dHRvbidcbiAgICB9LCBhdHRyaWJ1dGVzKTtcblxuICAgIHRoaXMudGFiSW5kZXhfID0gcHJvcHMudGFiSW5kZXg7XG5cbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHRhZywgcHJvcHMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgdGhpcy5jcmVhdGVDb250cm9sVGV4dEVsKGVsKTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8vIHJlbW92ZSBjb250cm9sVGV4dEVsXyBvbiBkaXBvc2VcbiAgICB0aGlzLmNvbnRyb2xUZXh0RWxfID0gbnVsbDtcblxuICAgIF9Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udHJvbCB0ZXh0IGVsZW1lbnQgb24gdGhpcyBgQ29tcG9uZW50YFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbF1cbiAgICogICAgICAgIFBhcmVudCBlbGVtZW50IGZvciB0aGUgY29udHJvbCB0ZXh0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBjb250cm9sIHRleHQgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUNvbnRyb2xUZXh0RWwgPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sVGV4dEVsKGVsKSB7XG4gICAgdGhpcy5jb250cm9sVGV4dEVsXyA9IGNyZWF0ZUVsKCdzcGFuJywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWNvbnRyb2wtdGV4dCdcbiAgICB9LCB7XG4gICAgICAvLyBsZXQgdGhlIHNjcmVlbiByZWFkZXIgdXNlciBrbm93IHRoYXQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgbWF5IGNoYW5nZVxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnXG4gICAgfSk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udHJvbFRleHRFbF8pO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbFRleHQodGhpcy5jb250cm9sVGV4dF8sIGVsKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0RWxfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBsb2NhbGl6ZSB0ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoZSBgQ29tcG9uZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XVxuICAgKiAgICAgICAgQ29udHJvbCB0ZXh0IGZvciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLmVsKCldXG4gICAqICAgICAgICBFbGVtZW50IHRvIHNldCB0aGUgdGl0bGUgb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAtIFRoZSBjb250cm9sIHRleHQgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5jb250cm9sVGV4dCA9IGZ1bmN0aW9uIGNvbnRyb2xUZXh0KHRleHQpIHtcbiAgICB2YXIgZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZWwoKTtcblxuICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0XyB8fCAnTmVlZCBUZXh0JztcbiAgICB9XG5cbiAgICB2YXIgbG9jYWxpemVkVGV4dCA9IHRoaXMubG9jYWxpemUodGV4dCk7XG5cbiAgICB0aGlzLmNvbnRyb2xUZXh0XyA9IHRleHQ7XG4gICAgdGV4dENvbnRlbnQodGhpcy5jb250cm9sVGV4dEVsXywgbG9jYWxpemVkVGV4dCk7XG4gICAgaWYgKCF0aGlzLm5vbkljb25Db250cm9sKSB7XG4gICAgICAvLyBTZXQgdGl0bGUgYXR0cmlidXRlIGlmIG9ubHkgYW4gaWNvbiBpcyBzaG93blxuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0aXRsZScsIGxvY2FsaXplZFRleHQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY29udHJvbCB2anMtYnV0dG9uICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGlzIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKi9cblxuXG4gIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkXykge1xuICAgICAgdGhpcy5lbmFibGVkXyA9IHRydWU7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZGlzYWJsZWQnKTtcbiAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICdmYWxzZScpO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnRhYkluZGV4XyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsIHRoaXMudGFiSW5kZXhfKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub24oWyd0YXAnLCAnY2xpY2snXSwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMpO1xuICAgICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoaXMgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7XG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICBpZiAodHlwZW9mIHRoaXMudGFiSW5kZXhfICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5lbF8ucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgIH1cbiAgICB0aGlzLm9mZihbJ3RhcCcsICdjbGljayddLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICB0aGlzLm9mZignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTtcbiAgICB0aGlzLm9mZignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGdldHM6XG4gICAqIC0gQ2xpY2tlZCAodmlhIHRoZSBgY2xpY2tgIGV2ZW50LCBsaXN0ZW5pbmcgc3RhcnRzIGluIHRoZSBjb25zdHJ1Y3RvcilcbiAgICogLSBUYXBwZWQgKHZpYSB0aGUgYHRhcGAgZXZlbnQsIGxpc3RlbmluZyBzdGFydHMgaW4gdGhlIGNvbnN0cnVjdG9yKVxuICAgKiAtIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGhhcHBlbiBpbiBvcmRlcjpcbiAgICogICAxLiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUZvY3VzfSBpcyBjYWxsZWQgdmlhIGEgYGZvY3VzYCBldmVudCBvbiB0aGVcbiAgICogICAgICBgQ2xpY2thYmxlQ29tcG9uZW50YC5cbiAgICogICAyLiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUZvY3VzfSBhZGRzIGEgbGlzdGVuZXIgZm9yIGBrZXlkb3duYCBvbiB1c2luZ1xuICAgKiAgICAgIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9LlxuICAgKiAgIDMuIGBDbGlja2FibGVDb21wb25lbnRgIGhhcyBub3QgaGFkIGEgYGJsdXJgIGV2ZW50IChgYmx1cmAgbWVhbnMgdGhhdCBmb2N1cyB3YXMgbG9zdCkuIFRoZSB1c2VyIHByZXNzZXNcbiAgICogICAgICB0aGUgc3BhY2Ugb3IgZW50ZXIga2V5LlxuICAgKiAgIDQuIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgYGtleWRvd25gXG4gICAqICAgICAgZXZlbnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHt9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQ2xpY2thYmxlQ29tcG9uZW50YCBnYWlucyBmb2N1cyB2aWEgYSBgZm9jdXNgIGV2ZW50LlxuICAgKiBUdXJucyBvbiBsaXN0ZW5pbmcgZm9yIGBrZXlkb3duYCBldmVudHMuIFdoZW4gdGhleSBoYXBwZW4gaXRcbiAgICogY2FsbHMgYHRoaXMuaGFuZGxlS2V5UHJlc3NgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBmb2N1c2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGZvY3VzXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGV2ZW50KSB7XG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoaXMgQ2xpY2thYmxlQ29tcG9uZW50IGhhcyBmb2N1cyBhbmQgYSBrZXkgZ2V0cyBwcmVzc2VkIGRvd24uIEJ5XG4gICAqIGRlZmF1bHQgaXQgd2lsbCBjYWxsIGB0aGlzLmhhbmRsZUNsaWNrYCB3aGVuIHRoZSBrZXkgaXMgc3BhY2Ugb3IgZW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG5cbiAgICAvLyBTdXBwb3J0IFNwYWNlICgzMikgb3IgRW50ZXIgKDEzKSBrZXkgb3BlcmF0aW9uIHRvIGZpcmUgYSBjbGljayBldmVudFxuICAgIGlmIChldmVudC53aGljaCA9PT0gMzIgfHwgZXZlbnQud2hpY2ggPT09IDEzKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdjbGljaycpO1xuICAgIH0gZWxzZSBpZiAoX0NvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MpIHtcblxuICAgICAgLy8gUGFzcyBrZXlwcmVzcyBoYW5kbGluZyB1cCBmb3IgdW5zdXBwb3J0ZWQga2V5c1xuICAgICAgX0NvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGxvc2VzIGZvY3VzLiBUdXJucyBvZmYgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBga2V5ZG93bmAgZXZlbnRzLiBXaGljaCBTdG9wcyBgdGhpcy5oYW5kbGVLZXlQcmVzc2AgZnJvbSBnZXR0aW5nIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgYmx1cmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGJsdXJcbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpO1xuICB9O1xuXG4gIHJldHVybiBDbGlja2FibGVDb21wb25lbnQ7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2xpY2thYmxlQ29tcG9uZW50JywgQ2xpY2thYmxlQ29tcG9uZW50KTtcblxuLyoqXG4gKiBAZmlsZSBwb3N0ZXItaW1hZ2UuanNcbiAqL1xuLyoqXG4gKiBBIGBDbGlja2FibGVDb21wb25lbnRgIHRoYXQgaGFuZGxlcyBzaG93aW5nIHRoZSBwb3N0ZXIgaW1hZ2UgZm9yIHRoZSBwbGF5ZXIuXG4gKlxuICogQGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50XG4gKi9cblxudmFyIFBvc3RlckltYWdlID0gZnVuY3Rpb24gKF9DbGlja2FibGVDb21wb25lbnQpIHtcbiAgaW5oZXJpdHMoUG9zdGVySW1hZ2UsIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYXR0YWNoIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUG9zdGVySW1hZ2UocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdGVySW1hZ2UpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ2xpY2thYmxlQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy51cGRhdGUoKTtcbiAgICBwbGF5ZXIub24oJ3Bvc3RlcmNoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSkpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbmQgZGlzcG9zZSBvZiB0aGUgYFBvc3RlckltYWdlYC5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5wbGF5ZXIoKS5vZmYoJ3Bvc3RlcmNoYW5nZScsIHRoaXMudXBkYXRlKTtcbiAgICBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYFBvc3RlckltYWdlYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgUG9zdGVySW1hZ2UucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIGVsID0gY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wb3N0ZXInLFxuXG4gICAgICAvLyBEb24ndCB3YW50IHBvc3RlciB0byBiZSB0YWJiYWJsZS5cbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0pO1xuXG4gICAgLy8gVG8gZW5zdXJlIHRoZSBwb3N0ZXIgaW1hZ2UgcmVzaXplcyB3aGlsZSBtYWludGFpbmluZyBpdHMgb3JpZ2luYWwgYXNwZWN0XG4gICAgLy8gcmF0aW8sIHVzZSBhIGRpdiB3aXRoIGBiYWNrZ3JvdW5kLXNpemVgIHdoZW4gYXZhaWxhYmxlLiBGb3IgYnJvd3NlcnMgdGhhdFxuICAgIC8vIGRvIG5vdCBzdXBwb3J0IGBiYWNrZ3JvdW5kLXNpemVgIChlLmcuIElFOCksIGZhbGwgYmFjayBvbiB1c2luZyBhIHJlZ3VsYXJcbiAgICAvLyBpbWcgZWxlbWVudC5cbiAgICBpZiAoIUJBQ0tHUk9VTkRfU0laRV9TVVBQT1JURUQpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tJbWdfID0gY3JlYXRlRWwoJ2ltZycpO1xuICAgICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5mYWxsYmFja0ltZ18pO1xuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICAvKipcbiAgICogQW4ge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZvciB7QGxpbmsgUGxheWVyI3Bvc3RlcmNoYW5nZX0gZXZlbnRzLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcG9zdGVyY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgUGxheWVyI3Bvc3RlcmNoYW5nZWAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbi5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7XG4gICAgdmFyIHVybCA9IHRoaXMucGxheWVyKCkucG9zdGVyKCk7XG5cbiAgICB0aGlzLnNldFNyYyh1cmwpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBwb3N0ZXIgc291cmNlIHdlIHNob3VsZCBkaXNwbGF5Om5vbmUgb24gdGhpcyBjb21wb25lbnRcbiAgICAvLyBzbyBpdCdzIG5vdCBzdGlsbCBjbGlja2FibGUgb3IgcmlnaHQtY2xpY2thYmxlXG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGBQb3N0ZXJJbWFnZWAgZGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiAgICAgICAgVGhlIFVSTCB0byB0aGUgc291cmNlIGZvciB0aGUgYFBvc3RlckltYWdlYC5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUuc2V0U3JjID0gZnVuY3Rpb24gc2V0U3JjKHVybCkge1xuICAgIGlmICh0aGlzLmZhbGxiYWNrSW1nXykge1xuICAgICAgdGhpcy5mYWxsYmFja0ltZ18uc3JjID0gdXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYmFja2dyb3VuZEltYWdlID0gJyc7XG5cbiAgICAgIC8vIEFueSBmYWxzZXkgdmFsdWVzIHNob3VsZCBzdGF5IGFzIGFuIGVtcHR5IHN0cmluZywgb3RoZXJ3aXNlXG4gICAgICAvLyB0aGlzIHdpbGwgdGhyb3cgYW4gZXh0cmEgZXJyb3JcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlID0gJ3VybChcIicgKyB1cmwgKyAnXCIpJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbF8uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQW4ge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZvciBjbGlja3Mgb24gdGhlIGBQb3N0ZXJJbWFnZWAuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUNsaWNrfSBmb3IgaW5zdGFuY2VzIHdoZXJlIHRoaXMgd2lsbCBiZSB0cmlnZ2VyZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICArICAgICAgICBUaGUgYGNsaWNrYCwgYHRhcGAgb3IgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKi9cblxuXG4gIFBvc3RlckltYWdlLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBhIGNsaWNrIHRvIHRyaWdnZXIgcGxheWJhY2sgd2hlbiBjb250cm9scyBhcmUgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMucGxheWVyXy5jb250cm9scygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgc2lsZW5jZVByb21pc2UodGhpcy5wbGF5ZXJfLnBsYXkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5wYXVzZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9zdGVySW1hZ2U7XG59KENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUG9zdGVySW1hZ2UnLCBQb3N0ZXJJbWFnZSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1kaXNwbGF5LmpzXG4gKi9cbnZhciBkYXJrR3JheSA9ICcjMjIyJztcbnZhciBsaWdodEdyYXkgPSAnI2NjYyc7XG52YXIgZm9udE1hcCA9IHtcbiAgbW9ub3NwYWNlOiAnbW9ub3NwYWNlJyxcbiAgc2Fuc1NlcmlmOiAnc2Fucy1zZXJpZicsXG4gIHNlcmlmOiAnc2VyaWYnLFxuICBtb25vc3BhY2VTYW5zU2VyaWY6ICdcIkFuZGFsZSBNb25vXCIsIFwiTHVjaWRhIENvbnNvbGVcIiwgbW9ub3NwYWNlJyxcbiAgbW9ub3NwYWNlU2VyaWY6ICdcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gIHByb3BvcnRpb25hbFNhbnNTZXJpZjogJ3NhbnMtc2VyaWYnLFxuICBwcm9wb3J0aW9uYWxTZXJpZjogJ3NlcmlmJyxcbiAgY2FzdWFsOiAnXCJDb21pYyBTYW5zIE1TXCIsIEltcGFjdCwgZmFudGFzeScsXG4gIHNjcmlwdDogJ1wiTW9ub3R5cGUgQ29yc2l2YVwiLCBjdXJzaXZlJyxcbiAgc21hbGxjYXBzOiAnXCJBbmRhbGUgTW9ub1wiLCBcIkx1Y2lkYSBDb25zb2xlXCIsIG1vbm9zcGFjZSwgc2Fucy1zZXJpZidcbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIHJnYmEgY29sb3IgZnJvbSBhIGdpdmVuIGhleCBjb2xvciBjb2RlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2xvclxuICogICAgICAgIEhleCBudW1iZXIgZm9yIGNvbG9yLCBsaWtlICNmMGUgb3IgI2Y2MDRlMi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb3BhY2l0eVxuICogICAgICAgIFZhbHVlIGZvciBvcGFjaXR5LCAwLjAgLSAxLjAuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICBUaGUgcmdiYSBjb2xvciB0aGF0IHdhcyBjcmVhdGVkLCBsaWtlICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScuXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yKGNvbG9yLCBvcGFjaXR5KSB7XG4gIHZhciBoZXggPSB2b2lkIDA7XG5cbiAgaWYgKGNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgIC8vIGNvbG9yIGxvb2tzIGxpa2UgXCIjZjBlXCJcbiAgICBoZXggPSBjb2xvclsxXSArIGNvbG9yWzFdICsgY29sb3JbMl0gKyBjb2xvclsyXSArIGNvbG9yWzNdICsgY29sb3JbM107XG4gIH0gZWxzZSBpZiAoY29sb3IubGVuZ3RoID09PSA3KSB7XG4gICAgLy8gY29sb3IgbG9va3MgbGlrZSBcIiNmNjA0ZTJcIlxuICAgIGhleCA9IGNvbG9yLnNsaWNlKDEpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xvciBjb2RlIHByb3ZpZGVkLCAnICsgY29sb3IgKyAnOyBtdXN0IGJlIGZvcm1hdHRlZCBhcyBlLmcuICNmMGUgb3IgI2Y2MDRlMi4nKTtcbiAgfVxuICByZXR1cm4gJ3JnYmEoJyArIHBhcnNlSW50KGhleC5zbGljZSgwLCAyKSwgMTYpICsgJywnICsgcGFyc2VJbnQoaGV4LnNsaWNlKDIsIDQpLCAxNikgKyAnLCcgKyBwYXJzZUludChoZXguc2xpY2UoNCwgNiksIDE2KSArICcsJyArIG9wYWNpdHkgKyAnKSc7XG59XG5cbi8qKlxuICogVHJ5IHRvIHVwZGF0ZSB0aGUgc3R5bGUgb2YgYSBET00gZWxlbWVudC4gU29tZSBzdHlsZSBjaGFuZ2VzIHdpbGwgdGhyb3cgYW4gZXJyb3IsXG4gKiBwYXJ0aWN1bGFybHkgaW4gSUU4LiBUaG9zZSBzaG91bGQgYmUgbm9vcHMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBET00gZWxlbWVudCB0byBiZSBzdHlsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlXG4gKiAgICAgICAgVGhlIENTUyBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBiZSBzdHlsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bGVcbiAqICAgICAgICBUaGUgc3R5bGUgcnVsZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0cnlVcGRhdGVTdHlsZShlbCwgc3R5bGUsIHJ1bGUpIHtcbiAgdHJ5IHtcbiAgICBlbC5zdHlsZVtzdHlsZV0gPSBydWxlO1xuICB9IGNhdGNoIChlKSB7XG5cbiAgICAvLyBTYXRpc2ZpZXMgbGludGVyLlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgdGV4dCB0cmFjayBjdWVzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUZXh0VHJhY2tEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGV4dFRyYWNrRGlzcGxheSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYFRleHRUcmFja0Rpc3BsYXlgIGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gVGV4dFRyYWNrRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrRGlzcGxheSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSk7XG5cbiAgICBwbGF5ZXIub24oJ2xvYWRzdGFydCcsIGJpbmQoX3RoaXMsIF90aGlzLnRvZ2dsZURpc3BsYXkpKTtcbiAgICBwbGF5ZXIub24oJ3RleHR0cmFja2NoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZURpc3BsYXkpKTtcbiAgICBwbGF5ZXIub24oJ2xvYWRzdGFydCcsIGJpbmQoX3RoaXMsIF90aGlzLnByZXNlbGVjdFRyYWNrKSk7XG5cbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgY2FsbGVkIGR1cmluZyBwbGF5ZXIgaW5pdCwgYnV0IHdhcyBjYXVzaW5nIGFuIGVycm9yXG4gICAgLy8gaWYgYSB0cmFjayBzaG91bGQgc2hvdyBieSBkZWZhdWx0IGFuZCB0aGUgZGlzcGxheSBoYWRuJ3QgbG9hZGVkIHlldC5cbiAgICAvLyBTaG91bGQgcHJvYmFibHkgYmUgbW92ZWQgdG8gYW4gZXh0ZXJuYWwgdHJhY2sgbG9hZGVyIHdoZW4gd2Ugc3VwcG9ydFxuICAgIC8vIHRyYWNrcyB0aGF0IGRvbid0IG5lZWQgYSBkaXNwbGF5LlxuICAgIHBsYXllci5yZWFkeShiaW5kKF90aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGxheWVyLnRlY2hfICYmIHBsYXllci50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgYmluZCh0aGlzLCB0aGlzLnVwZGF0ZURpc3BsYXkpKTtcblxuICAgICAgdmFyIHRyYWNrcyA9IHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy50cmFja3MgfHwgW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucGxheWVyXy5hZGRSZW1vdGVUZXh0VHJhY2sodHJhY2tzW2ldLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmVzZWxlY3RUcmFjaygpO1xuICAgIH0pKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgKiBQcmVzZWxlY3QgYSB0cmFjayBmb2xsb3dpbmcgdGhpcyBwcmVjZWRlbmNlOlxuICAqIC0gbWF0Y2hlcyB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCB7QGxpbmsgVGV4dFRyYWNrfSdzIGxhbmd1YWdlIGFuZCBraW5kXG4gICogLSBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHtAbGluayBUZXh0VHJhY2t9J3MgbGFuZ3VhZ2Ugb25seVxuICAqIC0gaXMgdGhlIGZpcnN0IGRlZmF1bHQgY2FwdGlvbnMgdHJhY2tcbiAgKiAtIGlzIHRoZSBmaXJzdCBkZWZhdWx0IGRlc2NyaXB0aW9ucyB0cmFja1xuICAqXG4gICogQGxpc3RlbnMgUGxheWVyI2xvYWRzdGFydFxuICAqL1xuXG5cbiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUucHJlc2VsZWN0VHJhY2sgPSBmdW5jdGlvbiBwcmVzZWxlY3RUcmFjaygpIHtcbiAgICB2YXIgbW9kZXMgPSB7IGNhcHRpb25zOiAxLCBzdWJ0aXRsZXM6IDEgfTtcbiAgICB2YXIgdHJhY2tMaXN0ID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja3MoKTtcbiAgICB2YXIgdXNlclByZWYgPSB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2U7XG4gICAgdmFyIGZpcnN0RGVzYyA9IHZvaWQgMDtcbiAgICB2YXIgZmlyc3RDYXB0aW9ucyA9IHZvaWQgMDtcbiAgICB2YXIgcHJlZmVycmVkVHJhY2sgPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRyYWNrID0gdHJhY2tMaXN0W2ldO1xuXG4gICAgICBpZiAodXNlclByZWYgJiYgdXNlclByZWYuZW5hYmxlZCAmJiB1c2VyUHJlZi5sYW5ndWFnZSA9PT0gdHJhY2subGFuZ3VhZ2UpIHtcbiAgICAgICAgLy8gQWx3YXlzIGNob29zZSB0aGUgdHJhY2sgdGhhdCBtYXRjaGVzIGJvdGggbGFuZ3VhZ2UgYW5kIGtpbmRcbiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09IHVzZXJQcmVmLmtpbmQpIHtcbiAgICAgICAgICBwcmVmZXJyZWRUcmFjayA9IHRyYWNrO1xuICAgICAgICAgIC8vIG9yIGNob29zZSB0aGUgZmlyc3QgdHJhY2sgdGhhdCBtYXRjaGVzIGxhbmd1YWdlXG4gICAgICAgIH0gZWxzZSBpZiAoIXByZWZlcnJlZFRyYWNrKSB7XG4gICAgICAgICAgcHJlZmVycmVkVHJhY2sgPSB0cmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIGV2ZXJ5dGhpbmcgaWYgb2ZmVGV4dFRyYWNrTWVudUl0ZW0gd2FzIGNsaWNrZWRcbiAgICAgIH0gZWxzZSBpZiAodXNlclByZWYgJiYgIXVzZXJQcmVmLmVuYWJsZWQpIHtcbiAgICAgICAgcHJlZmVycmVkVHJhY2sgPSBudWxsO1xuICAgICAgICBmaXJzdERlc2MgPSBudWxsO1xuICAgICAgICBmaXJzdENhcHRpb25zID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHJhY2tbJ2RlZmF1bHQnXSkge1xuICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2Rlc2NyaXB0aW9ucycgJiYgIWZpcnN0RGVzYykge1xuICAgICAgICAgIGZpcnN0RGVzYyA9IHRyYWNrO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLmtpbmQgaW4gbW9kZXMgJiYgIWZpcnN0Q2FwdGlvbnMpIHtcbiAgICAgICAgICBmaXJzdENhcHRpb25zID0gdHJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlZmVycmVkVHJhY2sgbWF0Y2hlcyB0aGUgdXNlciBwcmVmZXJlbmNlIGFuZCB0YWtlc1xuICAgIC8vIHByZWNlbmRlbmNlIG92ZXIgYWxsIHRoZSBvdGhlciB0cmFja3MuXG4gICAgLy8gU28sIGRpc3BsYXkgdGhlIHByZWZlcnJlZFRyYWNrIGJlZm9yZSB0aGUgZmlyc3QgZGVmYXVsdCB0cmFja1xuICAgIC8vIGFuZCB0aGUgc3VidGl0bGVzL2NhcHRpb25zIHRyYWNrIGJlZm9yZSB0aGUgZGVzY3JpcHRpb25zIHRyYWNrXG4gICAgaWYgKHByZWZlcnJlZFRyYWNrKSB7XG4gICAgICBwcmVmZXJyZWRUcmFjay5tb2RlID0gJ3Nob3dpbmcnO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RDYXB0aW9ucykge1xuICAgICAgZmlyc3RDYXB0aW9ucy5tb2RlID0gJ3Nob3dpbmcnO1xuICAgIH0gZWxzZSBpZiAoZmlyc3REZXNjKSB7XG4gICAgICBmaXJzdERlc2MubW9kZSA9ICdzaG93aW5nJztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gZGlzcGxheSBvZiB7QGxpbmsgVGV4dFRyYWNrfSdzIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgaW50byB0aGUgb3RoZXIgc3RhdGUuXG4gICAqIFRoZXJlIGFyZSBvbmx5IHR3byBzdGF0ZXM6XG4gICAqIC0gJ3Nob3duJ1xuICAgKiAtICdoaWRkZW4nXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNsb2Fkc3RhcnRcbiAgICovXG5cblxuICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS50b2dnbGVEaXNwbGF5ID0gZnVuY3Rpb24gdG9nZ2xlRGlzcGxheSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnRlY2hfICYmIHRoaXMucGxheWVyXy50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUge0BsaW5rIENvbXBvbmVudH0ncyBET00gZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0Rpc3BsYXkucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10ZXh0LXRyYWNrLWRpc3BsYXknXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGl2ZSc6ICdvZmYnLFxuICAgICAgJ2FyaWEtYXRvbWljJzogJ3RydWUnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBkaXNwbGF5ZWQge0BsaW5rIFRleHRUcmFja31zLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0Rpc3BsYXkucHJvdG90eXBlLmNsZWFyRGlzcGxheSA9IGZ1bmN0aW9uIGNsZWFyRGlzcGxheSgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5XZWJWVFQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5XZWJWVFQucHJvY2Vzc0N1ZXMod2luZG93LCBbXSwgdGhpcy5lbF8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBkaXNwbGF5ZWQgVGV4dFRyYWNrIHdoZW4gYSBlaXRoZXIgYSB7QGxpbmsgUGxheWVyI3RleHR0cmFja2NoYW5nZX0gb3JcbiAgICogYSB7QGxpbmsgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2V9IGlzIGZpcmVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUudXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCk7XG5cbiAgICB0aGlzLmNsZWFyRGlzcGxheSgpO1xuXG4gICAgLy8gVHJhY2sgZGlzcGxheSBwcmlvcml0aXphdGlvbiBtb2RlbDogaWYgbXVsdGlwbGUgdHJhY2tzIGFyZSAnc2hvd2luZycsXG4gICAgLy8gIGRpc3BsYXkgdGhlIGZpcnN0ICdzdWJ0aXRsZXMnIG9yICdjYXB0aW9ucycgdHJhY2sgd2hpY2ggaXMgJ3Nob3dpbmcnLFxuICAgIC8vICBvdGhlcndpc2UgZGlzcGxheSB0aGUgZmlyc3QgJ2Rlc2NyaXB0aW9ucycgdHJhY2sgd2hpY2ggaXMgJ3Nob3dpbmcnXG5cbiAgICB2YXIgZGVzY3JpcHRpb25zVHJhY2sgPSBudWxsO1xuICAgIHZhciBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gbnVsbDtcbiAgICB2YXIgaSA9IHRyYWNrcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGlmICh0cmFjay5tb2RlID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09ICdkZXNjcmlwdGlvbnMnKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb25zVHJhY2sgPSB0cmFjaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gdHJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FwdGlvbnNTdWJ0aXRsZXNUcmFjaykge1xuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSAhPT0gJ29mZicpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdvZmYnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9yVHJhY2soY2FwdGlvbnNTdWJ0aXRsZXNUcmFjayk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbnNUcmFjaykge1xuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSAhPT0gJ2Fzc2VydGl2ZScpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9yVHJhY2soZGVzY3JpcHRpb25zVHJhY2spO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIGFuIHtAbGluayBUZXh0dHJhY2t9IHRvIHRvIHRoZSB7QGxpbmsgVGVjaH1zIHtAbGluayBUZXh0VHJhY2tMaXN0fS5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUZXh0IHRyYWNrIG9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG5cblxuICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVGb3JUcmFjayA9IGZ1bmN0aW9uIHVwZGF0ZUZvclRyYWNrKHRyYWNrKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuV2ViVlRUICE9PSAnZnVuY3Rpb24nIHx8ICF0cmFjay5hY3RpdmVDdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGN1ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0cmFjay5hY3RpdmVDdWVzLmxlbmd0aDsgX2krKykge1xuICAgICAgY3Vlcy5wdXNoKHRyYWNrLmFjdGl2ZUN1ZXNbX2ldKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuV2ViVlRULnByb2Nlc3NDdWVzKHdpbmRvdywgY3VlcywgdGhpcy5lbF8pO1xuXG4gICAgaWYgKCF0aGlzLnBsYXllcl8udGV4dFRyYWNrU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3ZlcnJpZGVzID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja1NldHRpbmdzLmdldFZhbHVlcygpO1xuXG4gICAgdmFyIGkgPSBjdWVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHZhciBjdWUgPSBjdWVzW2ldO1xuXG4gICAgICBpZiAoIWN1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1ZURpdiA9IGN1ZS5kaXNwbGF5U3RhdGU7XG5cbiAgICAgIGlmIChvdmVycmlkZXMuY29sb3IpIHtcbiAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUuY29sb3IgPSBvdmVycmlkZXMuY29sb3I7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLnRleHRPcGFjaXR5KSB7XG4gICAgICAgIHRyeVVwZGF0ZVN0eWxlKGN1ZURpdi5maXJzdENoaWxkLCAnY29sb3InLCBjb25zdHJ1Y3RDb2xvcihvdmVycmlkZXMuY29sb3IgfHwgJyNmZmYnLCBvdmVycmlkZXMudGV4dE9wYWNpdHkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChvdmVycmlkZXMuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG92ZXJyaWRlcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmJhY2tncm91bmRPcGFjaXR5KSB7XG4gICAgICAgIHRyeVVwZGF0ZVN0eWxlKGN1ZURpdi5maXJzdENoaWxkLCAnYmFja2dyb3VuZENvbG9yJywgY29uc3RydWN0Q29sb3Iob3ZlcnJpZGVzLmJhY2tncm91bmRDb2xvciB8fCAnIzAwMCcsIG92ZXJyaWRlcy5iYWNrZ3JvdW5kT3BhY2l0eSkpO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy53aW5kb3dDb2xvcikge1xuICAgICAgICBpZiAob3ZlcnJpZGVzLndpbmRvd09wYWNpdHkpIHtcbiAgICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYsICdiYWNrZ3JvdW5kQ29sb3InLCBjb25zdHJ1Y3RDb2xvcihvdmVycmlkZXMud2luZG93Q29sb3IsIG92ZXJyaWRlcy53aW5kb3dPcGFjaXR5KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VlRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG92ZXJyaWRlcy53aW5kb3dDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUpIHtcbiAgICAgICAgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUgPT09ICdkcm9wc2hhZG93Jykge1xuICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLnRleHRTaGFkb3cgPSAnMnB4IDJweCAzcHggJyArIGRhcmtHcmF5ICsgJywgMnB4IDJweCA0cHggJyArIGRhcmtHcmF5ICsgJywgMnB4IDJweCA1cHggJyArIGRhcmtHcmF5O1xuICAgICAgICB9IGVsc2UgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUgPT09ICdyYWlzZWQnKSB7XG4gICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9ICcxcHggMXB4ICcgKyBkYXJrR3JheSArICcsIDJweCAycHggJyArIGRhcmtHcmF5ICsgJywgM3B4IDNweCAnICsgZGFya0dyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAob3ZlcnJpZGVzLmVkZ2VTdHlsZSA9PT0gJ2RlcHJlc3NlZCcpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gJzFweCAxcHggJyArIGxpZ2h0R3JheSArICcsIDAgMXB4ICcgKyBsaWdodEdyYXkgKyAnLCAtMXB4IC0xcHggJyArIGRhcmtHcmF5ICsgJywgMCAtMXB4ICcgKyBkYXJrR3JheTtcbiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAndW5pZm9ybScpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gJzAgMCA0cHggJyArIGRhcmtHcmF5ICsgJywgMCAwIDRweCAnICsgZGFya0dyYXkgKyAnLCAwIDAgNHB4ICcgKyBkYXJrR3JheSArICcsIDAgMCA0cHggJyArIGRhcmtHcmF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmZvbnRQZXJjZW50ICYmIG92ZXJyaWRlcy5mb250UGVyY2VudCAhPT0gMSkge1xuICAgICAgICB2YXIgZm9udFNpemUgPSB3aW5kb3cucGFyc2VGbG9hdChjdWVEaXYuc3R5bGUuZm9udFNpemUpO1xuXG4gICAgICAgIGN1ZURpdi5zdHlsZS5mb250U2l6ZSA9IGZvbnRTaXplICogb3ZlcnJpZGVzLmZvbnRQZXJjZW50ICsgJ3B4JztcbiAgICAgICAgY3VlRGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgICAgY3VlRGl2LnN0eWxlLnRvcCA9ICdhdXRvJztcbiAgICAgICAgY3VlRGl2LnN0eWxlLmJvdHRvbSA9ICcycHgnO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy5mb250RmFtaWx5ICYmIG92ZXJyaWRlcy5mb250RmFtaWx5ICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgaWYgKG92ZXJyaWRlcy5mb250RmFtaWx5ID09PSAnc21hbGwtY2FwcycpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5mb250VmFyaWFudCA9ICdzbWFsbC1jYXBzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5mb250RmFtaWx5ID0gZm9udE1hcFtvdmVycmlkZXMuZm9udEZhbWlseV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFRleHRUcmFja0Rpc3BsYXk7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGV4dFRyYWNrRGlzcGxheScsIFRleHRUcmFja0Rpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIGxvYWRpbmctc3Bpbm5lci5qc1xuICovXG4vKipcbiAqIEEgbG9hZGluZyBzcGlubmVyIGZvciB1c2UgZHVyaW5nIHdhaXRpbmcvbG9hZGluZyBldmVudHMuXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIExvYWRpbmdTcGlubmVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTG9hZGluZ1NwaW5uZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExvYWRpbmdTcGlubmVyKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvYWRpbmdTcGlubmVyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYExvYWRpbmdTcGlubmVyYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGRvbSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cbiAgTG9hZGluZ1NwaW5uZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIGlzQXVkaW8gPSB0aGlzLnBsYXllcl8uaXNBdWRpbygpO1xuICAgIHZhciBwbGF5ZXJUeXBlID0gdGhpcy5sb2NhbGl6ZShpc0F1ZGlvID8gJ0F1ZGlvIFBsYXllcicgOiAnVmlkZW8gUGxheWVyJyk7XG4gICAgdmFyIGNvbnRyb2xUZXh0ID0gY3JlYXRlRWwoJ3NwYW4nLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JyxcbiAgICAgIGlubmVySFRNTDogdGhpcy5sb2NhbGl6ZSgnezF9IGlzIGxvYWRpbmcuJywgW3BsYXllclR5cGVdKVxuICAgIH0pO1xuXG4gICAgdmFyIGVsID0gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWxvYWRpbmctc3Bpbm5lcicsXG4gICAgICBkaXI6ICdsdHInXG4gICAgfSk7XG5cbiAgICBlbC5hcHBlbmRDaGlsZChjb250cm9sVGV4dCk7XG5cbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgcmV0dXJuIExvYWRpbmdTcGlubmVyO1xufShDb21wb25lbnQpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0xvYWRpbmdTcGlubmVyJywgTG9hZGluZ1NwaW5uZXIpO1xuXG4vKipcbiAqIEBmaWxlIGJ1dHRvbi5qc1xuICovXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBidXR0b25zLlxuICpcbiAqIEBleHRlbmRzIENsaWNrYWJsZUNvbXBvbmVudFxuICovXG5cbnZhciBCdXR0b24gPSBmdW5jdGlvbiAoX0NsaWNrYWJsZUNvbXBvbmVudCkge1xuICBpbmhlcml0cyhCdXR0b24sIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJ1dHRvbigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCdXR0b24pO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9DbGlja2FibGVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQnV0dG9uYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPVwiYnV0dG9uXCJdXG4gICAqICAgICAgICBUaGUgZWxlbWVudCdzIG5vZGUgdHlwZS4gVGhpcyBhcmd1bWVudCBpcyBJR05PUkVEOiBubyBtYXR0ZXIgd2hhdFxuICAgKiAgICAgICAgaXMgcGFzc2VkLCBpdCB3aWxsIGFsd2F5cyBjcmVhdGUgYSBgYnV0dG9uYCBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzPXt9XVxuICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuICBCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodGFnKSB7XG4gICAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICB0YWcgPSAnYnV0dG9uJztcblxuICAgIHByb3BzID0gYXNzaWduKHtcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmpzLWljb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+JyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKClcbiAgICB9LCBwcm9wcyk7XG5cbiAgICAvLyBBZGQgYXR0cmlidXRlcyBmb3IgYnV0dG9uIGVsZW1lbnRcbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHtcblxuICAgICAgLy8gTmVjZXNzYXJ5IHNpbmNlIHRoZSBkZWZhdWx0IGJ1dHRvbiB0eXBlIGlzIFwic3VibWl0XCJcbiAgICAgIHR5cGU6ICdidXR0b24nXG4gICAgfSwgYXR0cmlidXRlcyk7XG5cbiAgICB2YXIgZWwgPSBDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdGFnLCBwcm9wcywgYXR0cmlidXRlcyk7XG5cbiAgICB0aGlzLmNyZWF0ZUNvbnRyb2xUZXh0RWwoZWwpO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaGlsZCBgQ29tcG9uZW50YCBpbnNpZGUgb2YgdGhpcyBgQnV0dG9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29tcG9uZW50fSBjaGlsZFxuICAgKiAgICAgICAgVGhlIG5hbWUgb3IgaW5zdGFuY2Ugb2YgYSBjaGlsZCB0byBhZGQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2Ygb3B0aW9ucyB0aGF0IHdpbGwgZ2V0IHBhc3NlZCB0byBjaGlsZHJlbiBvZlxuICAgKiAgICAgICAgdGhlIGNoaWxkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgZ2V0cyBhZGRlZCBhcyBhIGNoaWxkLiBXaGVuIHVzaW5nIGEgc3RyaW5nIHRoZVxuICAgKiAgICAgICAgIGBDb21wb25lbnRgIHdpbGwgZ2V0IGNyZWF0ZWQgYnkgdGhpcyBwcm9jZXNzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDVcbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgbG9nJDEud2FybignQWRkaW5nIGFuIGFjdGlvbmFibGUgKHVzZXIgY29udHJvbGxhYmxlKSBjaGlsZCB0byBhIEJ1dHRvbiAoJyArIGNsYXNzTmFtZSArICcpIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIENsaWNrYWJsZUNvbXBvbmVudCBpbnN0ZWFkLicpO1xuXG4gICAgLy8gQXZvaWQgdGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IENsaWNrYWJsZUNvbXBvbmVudCdzIGFkZENoaWxkIG1ldGhvZFxuICAgIHJldHVybiBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkLmNhbGwodGhpcywgY2hpbGQsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGBCdXR0b25gIGVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgYWN0aXZhdGVkIG9yIGNsaWNrZWQuIFVzZSB0aGlzIHdpdGhcbiAgICoge0BsaW5rIEJ1dHRvbiNkaXNhYmxlfS5cbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5lbmFibGUuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmVsXy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIGBCdXR0b25gIGVsZW1lbnQgc28gdGhhdCBpdCBjYW5ub3QgYmUgYWN0aXZhdGVkIG9yIGNsaWNrZWQuIFVzZSB0aGlzIHdpdGhcbiAgICoge0BsaW5rIEJ1dHRvbiNlbmFibGV9LlxuICAgKi9cblxuXG4gIEJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgX0NsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgYEJ1dHRvbmAgaGFzIGZvY3VzIGFuZCBga2V5ZG93bmAgaXMgdHJpZ2dlcmVkIHZpYSBhIGtleVxuICAgKiBwcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIElnbm9yZSBTcGFjZSAoMzIpIG9yIEVudGVyICgxMykga2V5IG9wZXJhdGlvbiwgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgYnJvd3NlciBmb3IgYSBidXR0b24uXG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQYXNzIGtleXByZXNzIGhhbmRsaW5nIHVwIGZvciB1bnN1cHBvcnRlZCBrZXlzXG4gICAgX0NsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MuY2FsbCh0aGlzLCBldmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbjtcbn0oQ2xpY2thYmxlQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdCdXR0b24nLCBCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGJpZy1wbGF5LWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBpbml0aWFsIHBsYXkgYnV0dG9uIHRoYXQgc2hvd3MgYmVmb3JlIHRoZSB2aWRlbyBoYXMgcGxheWVkLiBUaGUgaGlkaW5nIG9mIHRoZVxuICogYEJpZ1BsYXlCdXR0b25gIGdldCBkb25lIHZpYSBDU1MgYW5kIGBQbGF5ZXJgIHN0YXRlcy5cbiAqXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqL1xuXG52YXIgQmlnUGxheUJ1dHRvbiA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKEJpZ1BsYXlCdXR0b24sIF9CdXR0b24pO1xuXG4gIGZ1bmN0aW9uIEJpZ1BsYXlCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQmlnUGxheUJ1dHRvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm1vdXNldXNlZF8gPSBmYWxzZTtcblxuICAgIF90aGlzLm9uKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuIEFsd2F5cyByZXR1cm5zICd2anMtYmlnLXBsYXktYnV0dG9uJy5cbiAgICovXG5cblxuICBCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1iaWctcGxheS1idXR0b24nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQmlnUGxheUJ1dHRvbmAgXCJjbGlja2VkXCIuIFNlZSB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fVxuICAgKiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIHBsYXlQcm9taXNlID0gdGhpcy5wbGF5ZXJfLnBsYXkoKTtcblxuICAgIC8vIGV4aXQgZWFybHkgaWYgY2xpY2tlZCB2aWEgdGhlIG1vdXNlXG4gICAgaWYgKHRoaXMubW91c2V1c2VkXyAmJiBldmVudC5jbGllbnRYICYmIGV2ZW50LmNsaWVudFkpIHtcbiAgICAgIHNpbGVuY2VQcm9taXNlKHBsYXlQcm9taXNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2IgPSB0aGlzLnBsYXllcl8uZ2V0Q2hpbGQoJ2NvbnRyb2xCYXInKTtcbiAgICB2YXIgcGxheVRvZ2dsZSA9IGNiICYmIGNiLmdldENoaWxkKCdwbGF5VG9nZ2xlJyk7XG5cbiAgICBpZiAoIXBsYXlUb2dnbGUpIHtcbiAgICAgIHRoaXMucGxheWVyXy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwbGF5Rm9jdXMgPSBmdW5jdGlvbiBwbGF5Rm9jdXMoKSB7XG4gICAgICByZXR1cm4gcGxheVRvZ2dsZS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBpZiAoaXNQcm9taXNlKHBsYXlQcm9taXNlKSkge1xuICAgICAgcGxheVByb21pc2UudGhlbihwbGF5Rm9jdXMsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRUaW1lb3V0KHBsYXlGb2N1cywgMSk7XG4gICAgfVxuICB9O1xuXG4gIEJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcbiAgICB0aGlzLm1vdXNldXNlZF8gPSBmYWxzZTtcblxuICAgIF9CdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzLmNhbGwodGhpcywgZXZlbnQpO1xuICB9O1xuXG4gIEJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bihldmVudCkge1xuICAgIHRoaXMubW91c2V1c2VkXyA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIEJpZ1BsYXlCdXR0b247XG59KEJ1dHRvbik7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQmlnUGxheUJ1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCB0byBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuQmlnUGxheUJ1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1BsYXkgVmlkZW8nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0JpZ1BsYXlCdXR0b24nLCBCaWdQbGF5QnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBjbG9zZS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYENsb3NlQnV0dG9uYCBpcyBhIGB7QGxpbmsgQnV0dG9ufWAgdGhhdCBmaXJlcyBhIGBjbG9zZWAgZXZlbnQgd2hlblxuICogaXQgZ2V0cyBjbGlja2VkLlxuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICovXG5cbnZhciBDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKENsb3NlQnV0dG9uLCBfQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2xvc2VCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xvc2VCdXR0b24pO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5jb250cm9sVGV4dChvcHRpb25zICYmIG9wdGlvbnMuY29udHJvbFRleHQgfHwgX3RoaXMubG9jYWxpemUoJ0Nsb3NlJykpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNsb3NlLWJ1dHRvbiAnICsgX0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQ2xvc2VCdXR0b25gIGdldHMgY2xpY2tlZC4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlQ2xpY2t9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoZW4gdGhpcyB3aWxsIGJlXG4gICAqIHRyaWdnZXJlZFxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICogQGZpcmVzIENsb3NlQnV0dG9uI2Nsb3NlXG4gICAqL1xuXG5cbiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBhIGBDbG9zZUJ1dHRvbmAgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBDbG9zZUJ1dHRvbiNjbG9zZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdXG4gICAgICogICAgICAgICAgIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZSBjbG9zZSBldmVudCBkb2VzIG5vdFxuICAgICAqICAgICAgICAgICBidWJibGUgdXAgdG8gcGFyZW50cyBpZiB0aGVyZSBpcyBubyBsaXN0ZW5lclxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICdjbG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pO1xuICB9O1xuXG4gIHJldHVybiBDbG9zZUJ1dHRvbjtcbn0oQnV0dG9uKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDbG9zZUJ1dHRvbicsIENsb3NlQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBwbGF5LXRvZ2dsZS5qc1xuICovXG4vKipcbiAqIEJ1dHRvbiB0byB0b2dnbGUgYmV0d2VlbiBwbGF5IGFuZCBwYXVzZS5cbiAqXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqL1xuXG52YXIgUGxheVRvZ2dsZSA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKFBsYXlUb2dnbGUsIF9CdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUGxheVRvZ2dsZShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5VG9nZ2xlKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMub24ocGxheWVyLCAncGxheScsIF90aGlzLmhhbmRsZVBsYXkpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ3BhdXNlJywgX3RoaXMuaGFuZGxlUGF1c2UpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ2VuZGVkJywgX3RoaXMuaGFuZGxlRW5kZWQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtcGxheS1jb250cm9sICcgKyBfQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgUGxheVRvZ2dsZWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIFBsYXlUb2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnBhdXNlZCgpKSB7XG4gICAgICB0aGlzLnBsYXllcl8ucGxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8ucGF1c2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgb25jZSBhZnRlciB0aGUgdmlkZW8gaGFzIGVuZGVkIGFuZCB0aGUgdXNlciBzZWVrcyBzbyB0aGF0XG4gICAqIHdlIGNhbiBjaGFuZ2UgdGhlIHJlcGxheSBidXR0b24gYmFjayB0byBhIHBsYXkgYnV0dG9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNzZWVrZWRcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVTZWVrZWQgPSBmdW5jdGlvbiBoYW5kbGVTZWVrZWQoZXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcblxuICAgIGlmICh0aGlzLnBsYXllcl8ucGF1c2VkKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGF1c2UoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZVBsYXkoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtcGxheWluZyBjbGFzcyB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gY2hhbmdlIGFwcGVhcmFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3BsYXlcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVQbGF5ID0gZnVuY3Rpb24gaGFuZGxlUGxheShldmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGxheWluZycpO1xuICAgIC8vIGNoYW5nZSB0aGUgYnV0dG9uIHRleHQgdG8gXCJQYXVzZVwiXG4gICAgdGhpcy5jb250cm9sVGV4dCgnUGF1c2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtcGF1c2VkIGNsYXNzIHRvIHRoZSBlbGVtZW50IHNvIGl0IGNhbiBjaGFuZ2UgYXBwZWFyYW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcGF1c2VcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVQYXVzZSA9IGZ1bmN0aW9uIGhhbmRsZVBhdXNlKGV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXBsYXlpbmcnKTtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgLy8gY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBcIlBsYXlcIlxuICAgIHRoaXMuY29udHJvbFRleHQoJ1BsYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtZW5kZWQgY2xhc3MgdG8gdGhlIGVsZW1lbnQgc28gaXQgY2FuIGNoYW5nZSBhcHBlYXJhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkXG4gICAqL1xuXG5cbiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wbGF5aW5nJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWVuZGVkJyk7XG4gICAgLy8gY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBcIlJlcGxheVwiXG4gICAgdGhpcy5jb250cm9sVGV4dCgnUmVwbGF5Jyk7XG5cbiAgICAvLyBvbiB0aGUgbmV4dCBzZWVrIHJlbW92ZSB0aGUgcmVwbGF5IGJ1dHRvblxuICAgIHRoaXMub25lKHRoaXMucGxheWVyXywgJ3NlZWtlZCcsIHRoaXMuaGFuZGxlU2Vla2VkKTtcbiAgfTtcblxuICByZXR1cm4gUGxheVRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBQbGF5VG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5VG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnUGxheSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUGxheVRvZ2dsZScsIFBsYXlUb2dnbGUpO1xuXG4vKipcbiAqIEBmaWxlIGZvcm1hdC10aW1lLmpzXG4gKiBAbW9kdWxlIGZvcm1hdC10aW1lXG4gKi9cblxuLyoqXG4qIEZvcm1hdCBzZWNvbmRzIGFzIGEgdGltZSBzdHJpbmcsIEg6TU06U1Mgb3IgTTpTUy4gU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpXG4qIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZS5cbipcbiogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHNcbiogICAgICAgIE51bWJlciBvZiBzZWNvbmRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgc3RyaW5nXG4qXG4qIEBwYXJhbSB7bnVtYmVyfSBndWlkZVxuKiAgICAgICAgTnVtYmVyIChpbiBzZWNvbmRzKSB0byBtb2RlbCB0aGUgc3RyaW5nIGFmdGVyXG4qXG4qIEByZXR1cm4ge3N0cmluZ31cbiogICAgICAgICBUaW1lIGZvcm1hdHRlZCBhcyBIOk1NOlNTIG9yIE06U1NcbiovXG52YXIgZGVmYXVsdEltcGxlbWVudGF0aW9uID0gZnVuY3Rpb24gZGVmYXVsdEltcGxlbWVudGF0aW9uKHNlY29uZHMsIGd1aWRlKSB7XG4gIHNlY29uZHMgPSBzZWNvbmRzIDwgMCA/IDAgOiBzZWNvbmRzO1xuICB2YXIgcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgdmFyIG0gPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCAlIDYwKTtcbiAgdmFyIGggPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgdmFyIGdtID0gTWF0aC5mbG9vcihndWlkZSAvIDYwICUgNjApO1xuICB2YXIgZ2ggPSBNYXRoLmZsb29yKGd1aWRlIC8gMzYwMCk7XG5cbiAgLy8gaGFuZGxlIGludmFsaWQgdGltZXNcbiAgaWYgKGlzTmFOKHNlY29uZHMpIHx8IHNlY29uZHMgPT09IEluZmluaXR5KSB7XG4gICAgLy8gJy0nIGlzIGZhbHNlIGZvciBhbGwgcmVsYXRpb25hbCBvcGVyYXRvcnMgKGUuZy4gPCwgPj0pIHNvIHRoaXMgc2V0dGluZ1xuICAgIC8vIHdpbGwgYWRkIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmaWVsZHMgc3BlY2lmaWVkIGJ5IHRoZSBndWlkZVxuICAgIGggPSBtID0gcyA9ICctJztcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyBob3Vyc1xuICBoID0gaCA+IDAgfHwgZ2ggPiAwID8gaCArICc6JyA6ICcnO1xuXG4gIC8vIElmIGhvdXJzIGFyZSBzaG93aW5nLCB3ZSBtYXkgbmVlZCB0byBhZGQgYSBsZWFkaW5nIHplcm8uXG4gIC8vIEFsd2F5cyBzaG93IGF0IGxlYXN0IG9uZSBkaWdpdCBvZiBtaW51dGVzLlxuICBtID0gKChoIHx8IGdtID49IDEwKSAmJiBtIDwgMTAgPyAnMCcgKyBtIDogbSkgKyAnOic7XG5cbiAgLy8gQ2hlY2sgaWYgbGVhZGluZyB6ZXJvIGlzIG5lZWQgZm9yIHNlY29uZHNcbiAgcyA9IHMgPCAxMCA/ICcwJyArIHMgOiBzO1xuXG4gIHJldHVybiBoICsgbSArIHM7XG59O1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSBkZWZhdWx0SW1wbGVtZW50YXRpb247XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgZm9ybWF0VGltZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbUltcGxlbWVudGF0aW9uXG4gKiAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgZm9ybWF0VGltZSBpbXBsZW1lbnRhdGlvbi5cbiAqICAgICAgICBXaWxsIHJlY2VpdmUgdGhlIGN1cnJlbnQgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgZ3VpZGUgKGluIHNlY29uZHMpIGFzIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2V0Rm9ybWF0VGltZShjdXN0b21JbXBsZW1lbnRhdGlvbikge1xuICBpbXBsZW1lbnRhdGlvbiA9IGN1c3RvbUltcGxlbWVudGF0aW9uO1xufVxuXG4vKipcbiAqIFJlc2V0cyBmb3JtYXRUaW1lIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNldEZvcm1hdFRpbWUoKSB7XG4gIGltcGxlbWVudGF0aW9uID0gZGVmYXVsdEltcGxlbWVudGF0aW9uO1xufVxuXG52YXIgZm9ybWF0VGltZSA9IGZ1bmN0aW9uIChzZWNvbmRzKSB7XG4gIHZhciBndWlkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc2Vjb25kcztcblxuICByZXR1cm4gaW1wbGVtZW50YXRpb24oc2Vjb25kcywgZ3VpZGUpO1xufTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLWRpc3BsYXkuanNcbiAqL1xuLyoqXG4gKiBEaXNwbGF5cyB0aGUgdGltZSBsZWZ0IGluIHRoZSB2aWRlb1xuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUaW1lRGlzcGxheSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFRpbWVEaXNwbGF5LCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudGhyb3R0bGVkVXBkYXRlQ29udGVudCA9IHRocm90dGxlKGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZUNvbnRlbnQpLCAyNSk7XG4gICAgX3RoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHBsYWluTmFtZSkge1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmJ1aWxkQ1NTQ2xhc3MoKTtcbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSArICcgdmpzLXRpbWUtY29udHJvbCB2anMtY29udHJvbCcsXG4gICAgICBpbm5lckhUTUw6ICc8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4nICsgdGhpcy5sb2NhbGl6ZSh0aGlzLmxhYmVsVGV4dF8pICsgJ1xceEEwPC9zcGFuPidcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGVudEVsXyA9IGNyZWF0ZUVsKCdzcGFuJywge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgKyAnLWRpc3BsYXknXG4gICAgfSwge1xuICAgICAgLy8gdGVsbCBzY3JlZW4gcmVhZGVycyBub3QgdG8gYXV0b21hdGljYWxseSByZWFkIHRoZSB0aW1lIGFzIGl0IGNoYW5nZXNcbiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJ1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVUZXh0Tm9kZV8oKTtcbiAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRFbF8pO1xuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBUaW1lRGlzcGxheS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5jb250ZW50RWxfID0gbnVsbDtcbiAgICB0aGlzLnRleHROb2RlXyA9IG51bGw7XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIFwicmVtYWluaW5nIHRpbWVcIiB0ZXh0IG5vZGUgd2l0aCBuZXcgY29udGVudCB1c2luZyB0aGVcbiAgICogY29udGVudHMgb2YgdGhlIGBmb3JtYXR0ZWRUaW1lX2AgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGltZURpc3BsYXkucHJvdG90eXBlLnVwZGF0ZVRleHROb2RlXyA9IGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlXygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudEVsXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLmNvbnRlbnRFbF8uZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5jb250ZW50RWxfLnJlbW92ZUNoaWxkKHRoaXMuY29udGVudEVsXy5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleHROb2RlXyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuZm9ybWF0dGVkVGltZV8gfHwgdGhpcy5mb3JtYXRUaW1lXygwKSk7XG4gICAgdGhpcy5jb250ZW50RWxfLmFwcGVuZENoaWxkKHRoaXMudGV4dE5vZGVfKTtcbiAgfTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgZm9ybWF0dGVkIHRpbWUgZm9yIHRoaXMgY29tcG9uZW50IHRvIHVzZSBpbiBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRpbWVcbiAgICogICAgICAgICBBIG51bWVyaWMgdGltZSwgaW4gc2Vjb25kcy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEEgZm9ybWF0dGVkIHRpbWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUaW1lRGlzcGxheS5wcm90b3R5cGUuZm9ybWF0VGltZV8gPSBmdW5jdGlvbiBmb3JtYXRUaW1lXyh0aW1lKSB7XG4gICAgcmV0dXJuIGZvcm1hdFRpbWUodGltZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHRpbWUgZGlzcGxheSB0ZXh0IG5vZGUgaWYgaXQgaGFzIHdoYXQgd2FzIHBhc3NlZCBpbiBjaGFuZ2VkXG4gICAqIHRoZSBmb3JtYXR0ZWQgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVcbiAgICogICAgICAgIFRoZSB0aW1lIHRvIHVwZGF0ZSB0b1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVGb3JtYXR0ZWRUaW1lXyA9IGZ1bmN0aW9uIHVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRpbWUpIHtcbiAgICB2YXIgZm9ybWF0dGVkVGltZSA9IHRoaXMuZm9ybWF0VGltZV8odGltZSk7XG5cbiAgICBpZiAoZm9ybWF0dGVkVGltZSA9PT0gdGhpcy5mb3JtYXR0ZWRUaW1lXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0dGVkVGltZV8gPSBmb3JtYXR0ZWRUaW1lO1xuICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlVGV4dE5vZGVfKTtcbiAgfTtcblxuICAvKipcbiAgICogVG8gYmUgZmlsbGVkIG91dCBpbiB0aGUgY2hpbGQgY2xhc3MsIHNob3VsZCB1cGRhdGUgdGhlIGRpc3BsYXllZCB0aW1lXG4gICAqIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaGFzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZVxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkge307XG5cbiAgcmV0dXJuIFRpbWVEaXNwbGF5O1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgaXMgYWRkZWQgdG8gdGhlIGBUaW1lRGlzcGxheWAgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5UaW1lRGlzcGxheS5wcm90b3R5cGUubGFiZWxUZXh0XyA9ICdUaW1lJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBUaW1lRGlzcGxheWBzIGNvbnRyb2xzLiBBZGRlZCB0byBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBkZXByZWNhdGVkIGluIHY3OyBjb250cm9sVGV4dF8gaXMgbm90IHVzZWQgaW4gbm9uLWFjdGl2ZSBkaXNwbGF5IENvbXBvbmVudHNcbiAqL1xuVGltZURpc3BsYXkucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdUaW1lJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUaW1lRGlzcGxheScsIFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBjdXJyZW50LXRpbWUtZGlzcGxheS5qc1xuICovXG4vKipcbiAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpbWVcbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgQ3VycmVudFRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9UaW1lRGlzcGxheSkge1xuICBpbmhlcml0cyhDdXJyZW50VGltZURpc3BsYXksIF9UaW1lRGlzcGxheSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBDdXJyZW50VGltZURpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3VycmVudFRpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdlbmRlZCcsIF90aGlzLmhhbmRsZUVuZGVkKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIEN1cnJlbnRUaW1lRGlzcGxheS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY3VycmVudC10aW1lJztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGN1cnJlbnQgdGltZSBkaXNwbGF5XG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgQ3VycmVudFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkge1xuICAgIC8vIEFsbG93cyBmb3Igc21vb3RoIHNjcnViYmluZywgd2hlbiBwbGF5ZXIgY2FuJ3Qga2VlcCB1cC5cbiAgICB2YXIgdGltZSA9IHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRpbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBwbGF5ZXIgZmlyZXMgZW5kZWQgdGhlcmUgc2hvdWxkIGJlIG5vIHRpbWUgbGVmdC4gU2FkbHlcbiAgICogdGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLCBsZXRzIG1ha2UgaXQgc2VlbSBsaWtlIHRoYXQgaXMgdGhlIGNhc2VcbiAgICogZm9yIHVzZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGVuZGVkYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkXG4gICAqL1xuXG5cbiAgQ3VycmVudFRpbWVEaXNwbGF5LnByb3RvdHlwZS5oYW5kbGVFbmRlZCA9IGZ1bmN0aW9uIGhhbmRsZUVuZGVkKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpKTtcbiAgfTtcblxuICByZXR1cm4gQ3VycmVudFRpbWVEaXNwbGF5O1xufShUaW1lRGlzcGxheSk7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBpcyBhZGRlZCB0byB0aGUgYEN1cnJlbnRUaW1lRGlzcGxheWAgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DdXJyZW50VGltZURpc3BsYXkucHJvdG90eXBlLmxhYmVsVGV4dF8gPSAnQ3VycmVudCBUaW1lJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBDdXJyZW50VGltZURpc3BsYXlgcyBjb250cm9scy4gQWRkZWQgdG8gZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqXG4gKiBAZGVwcmVjYXRlZCBpbiB2NzsgY29udHJvbFRleHRfIGlzIG5vdCB1c2VkIGluIG5vbi1hY3RpdmUgZGlzcGxheSBDb21wb25lbnRzXG4gKi9cbkN1cnJlbnRUaW1lRGlzcGxheS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0N1cnJlbnQgVGltZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ3VycmVudFRpbWVEaXNwbGF5JywgQ3VycmVudFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBkdXJhdGlvbi1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogRGlzcGxheXMgdGhlIGR1cmF0aW9uXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIER1cmF0aW9uRGlzcGxheSA9IGZ1bmN0aW9uIChfVGltZURpc3BsYXkpIHtcbiAgaW5oZXJpdHMoRHVyYXRpb25EaXNwbGF5LCBfVGltZURpc3BsYXkpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb25EaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIER1cmF0aW9uRGlzcGxheSk7XG5cbiAgICAvLyB3ZSBkbyBub3Qgd2FudCB0by9uZWVkIHRvIHRocm90dGxlIGR1cmF0aW9uIGNoYW5nZXMsXG4gICAgLy8gYXMgdGhleSBzaG91bGQgYWx3YXlzIGRpc3BsYXkgdGhlIGNoYW5nZWQgZHVyYXRpb24gYXNcbiAgICAvLyBpdCBoYXMgY2hhbmdlZFxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdkdXJhdGlvbmNoYW5nZScsIF90aGlzLnVwZGF0ZUNvbnRlbnQpO1xuXG4gICAgLy8gQWxzbyBsaXN0ZW4gZm9yIHRpbWV1cGRhdGUgKGluIHRoZSBwYXJlbnQpIGFuZCBsb2FkZWRtZXRhZGF0YSBiZWNhdXNlIHJlbW92aW5nIHRob3NlXG4gICAgLy8gbGlzdGVuZXJzIGNvdWxkIGhhdmUgYnJva2VuIGRlcGVuZGVudCBhcHBsaWNhdGlvbnMvbGlicmFyaWVzLiBUaGVzZVxuICAgIC8vIGNhbiBsaWtlbHkgYmUgcmVtb3ZlZCBmb3IgNy4wLlxuICAgIF90aGlzLm9uKHBsYXllciwgJ2xvYWRlZG1ldGFkYXRhJywgX3RoaXMudGhyb3R0bGVkVXBkYXRlQ29udGVudCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBEdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWR1cmF0aW9uJztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGR1cmF0aW9uIHRpbWUgZGlzcGxheS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBkdXJhdGlvbmNoYW5nZWAsIGB0aW1ldXBkYXRlYCwgb3IgYGxvYWRlZG1ldGFkYXRhYCBldmVudCB0aGF0IGNhdXNlZFxuICAgKiAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZVxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZGVkbWV0YWRhdGFcbiAgICovXG5cblxuICBEdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiB1cGRhdGVDb250ZW50KGV2ZW50KSB7XG4gICAgdmFyIGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICBpZiAoZHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbl8gIT09IGR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmR1cmF0aW9uXyA9IGR1cmF0aW9uO1xuICAgICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXyhkdXJhdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBEdXJhdGlvbkRpc3BsYXk7XG59KFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBgRHVyYXRpb25EaXNwbGF5YCBmb3Igc2NyZWVuIHJlYWRlciB1c2Vycy5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cbkR1cmF0aW9uRGlzcGxheS5wcm90b3R5cGUubGFiZWxUZXh0XyA9ICdEdXJhdGlvbic7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgRHVyYXRpb25EaXNwbGF5YHMgY29udHJvbHMuIEFkZGVkIHRvIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKlxuICogQGRlcHJlY2F0ZWQgaW4gdjc7IGNvbnRyb2xUZXh0XyBpcyBub3QgdXNlZCBpbiBub24tYWN0aXZlIGRpc3BsYXkgQ29tcG9uZW50c1xuICovXG5EdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdEdXJhdGlvbic7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRHVyYXRpb25EaXNwbGF5JywgRHVyYXRpb25EaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLWRpdmlkZXIuanNcbiAqL1xuLyoqXG4gKiBUaGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgZHVyYXRpb24uXG4gKiBDYW4gYmUgaGlkZGVuIGlmIGl0J3Mgbm90IG5lZWRlZCBpbiB0aGUgZGVzaWduLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUaW1lRGl2aWRlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFRpbWVEaXZpZGVyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUaW1lRGl2aWRlcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lRGl2aWRlcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFRpbWVEaXZpZGVyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdGltZS1jb250cm9sIHZqcy10aW1lLWRpdmlkZXInLFxuICAgICAgaW5uZXJIVE1MOiAnPGRpdj48c3Bhbj4vPC9zcGFuPjwvZGl2PidcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVGltZURpdmlkZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGltZURpdmlkZXInLCBUaW1lRGl2aWRlcik7XG5cbi8qKlxuICogQGZpbGUgcmVtYWluaW5nLXRpbWUtZGlzcGxheS5qc1xuICovXG4vKipcbiAqIERpc3BsYXlzIHRoZSB0aW1lIGxlZnQgaW4gdGhlIHZpZGVvXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFJlbWFpbmluZ1RpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9UaW1lRGlzcGxheSkge1xuICBpbmhlcml0cyhSZW1haW5pbmdUaW1lRGlzcGxheSwgX1RpbWVEaXNwbGF5KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFJlbWFpbmluZ1RpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbWFpbmluZ1RpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdkdXJhdGlvbmNoYW5nZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ2VuZGVkJywgX3RoaXMuaGFuZGxlRW5kZWQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXJlbWFpbmluZy10aW1lJztcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkgcHJlZml4ZXMgbnVtYmVycyB3aXRoIGEgXCJtaW51c1wiIGNoYXJhY3Rlci5cbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAqICAgICAgICAgQSBudW1lcmljIHRpbWUsIGluIHNlY29uZHMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBBIGZvcm1hdHRlZCB0aW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmZvcm1hdFRpbWVfID0gZnVuY3Rpb24gZm9ybWF0VGltZV8odGltZSkge1xuICAgIC8vIFRPRE86IFRoZSBcIi1cIiBzaG91bGQgYmUgZGVjb3JhdGl2ZSwgYW5kIG5vdCBhbm5vdW5jZWQgYnkgYSBzY3JlZW4gcmVhZGVyXG4gICAgcmV0dXJuICctJyArIF9UaW1lRGlzcGxheS5wcm90b3R5cGUuZm9ybWF0VGltZV8uY2FsbCh0aGlzLCB0aW1lKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGR1cmF0aW9uY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3RpbWV1cGRhdGVcbiAgICogQGxpc3RlbnMgUGxheWVyI2R1cmF0aW9uY2hhbmdlXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiB1cGRhdGVDb250ZW50KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEBkZXByZWNhdGVkIFdlIHNob3VsZCBvbmx5IHVzZSByZW1haW5pbmdUaW1lRGlzcGxheVxuICAgIC8vIGFzIG9mIHZpZGVvLmpzIDdcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnJlbWFpbmluZ1RpbWVEaXNwbGF5KSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5yZW1haW5pbmdUaW1lRGlzcGxheSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXyh0aGlzLnBsYXllcl8ucmVtYWluaW5nVGltZSgpKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHBsYXllciBmaXJlcyBlbmRlZCB0aGVyZSBzaG91bGQgYmUgbm8gdGltZSBsZWZ0LiBTYWRseVxuICAgKiB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UsIGxldHMgbWFrZSBpdCBzZWVtIGxpa2UgdGhhdCBpcyB0aGUgY2FzZVxuICAgKiBmb3IgdXNlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgZW5kZWRgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZW5kZWRcbiAgICovXG5cblxuICBSZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkge1xuICAgIGlmICghdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXygwKTtcbiAgfTtcblxuICByZXR1cm4gUmVtYWluaW5nVGltZURpc3BsYXk7XG59KFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBgUmVtYWluaW5nVGltZURpc3BsYXlgIGZvciBzY3JlZW4gcmVhZGVyIHVzZXJzLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmxhYmVsVGV4dF8gPSAnUmVtYWluaW5nIFRpbWUnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFJlbWFpbmluZ1RpbWVEaXNwbGF5YHMgY29udHJvbHMuIEFkZGVkIHRvIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKlxuICogQGRlcHJlY2F0ZWQgaW4gdjc7IGNvbnRyb2xUZXh0XyBpcyBub3QgdXNlZCBpbiBub24tYWN0aXZlIGRpc3BsYXkgQ29tcG9uZW50c1xuICovXG5SZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1JlbWFpbmluZyBUaW1lJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdSZW1haW5pbmdUaW1lRGlzcGxheScsIFJlbWFpbmluZ1RpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBsaXZlLWRpc3BsYXkuanNcbiAqL1xuLy8gVE9ETyAtIEZ1dHVyZSBtYWtlIGl0IGNsaWNrIHRvIHNuYXAgdG8gbGl2ZVxuXG4vKipcbiAqIERpc3BsYXlzIHRoZSBsaXZlIGluZGljYXRvciB3aGVuIGR1cmF0aW9uIGlzIEluZmluaXR5LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBMaXZlRGlzcGxheSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKExpdmVEaXNwbGF5LCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIExpdmVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExpdmVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudXBkYXRlU2hvd2luZygpO1xuICAgIF90aGlzLm9uKF90aGlzLnBsYXllcigpLCAnZHVyYXRpb25jaGFuZ2UnLCBfdGhpcy51cGRhdGVTaG93aW5nKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBMaXZlRGlzcGxheS5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbGl2ZS1jb250cm9sIHZqcy1jb250cm9sJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZW50RWxfID0gY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1saXZlLWRpc3BsYXknLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+JyArIHRoaXMubG9jYWxpemUoJ1N0cmVhbSBUeXBlJykgKyAnXFx4QTA8L3NwYW4+JyArIHRoaXMubG9jYWxpemUoJ0xJVkUnKVxuICAgIH0sIHtcbiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJ1xuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgTGl2ZURpc3BsYXkucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMuY29udGVudEVsXyA9IG51bGw7XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBkdXJhdGlvbiB0byBzZWUgaWYgdGhlIExpdmVEaXNwbGF5IHNob3VsZCBiZSBzaG93aW5nIG9yIG5vdC4gVGhlbiBzaG93L2hpZGVcbiAgICogaXQgYWNjb3JkaW5nbHlcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXIjZHVyYXRpb25jaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZHVyYXRpb25jaGFuZ2VcbiAgICovXG5cblxuICBMaXZlRGlzcGxheS5wcm90b3R5cGUudXBkYXRlU2hvd2luZyA9IGZ1bmN0aW9uIHVwZGF0ZVNob3dpbmcoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIoKS5kdXJhdGlvbigpID09PSBJbmZpbml0eSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTGl2ZURpc3BsYXk7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTGl2ZURpc3BsYXknLCBMaXZlRGlzcGxheSk7XG5cbi8qKlxuICogQGZpbGUgc2xpZGVyLmpzXG4gKi9cbi8qKlxuICogVGhlIGJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgYSBzbGlkZXIuIENhbiBiZSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsLlxuICogRm9yIGluc3RhbmNlIHRoZSB2b2x1bWUgYmFyIG9yIHRoZSBzZWVrIGJhciBvbiBhIHZpZGVvIGlzIGEgc2xpZGVyLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBTbGlkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhTbGlkZXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFNsaWRlcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTbGlkZXIpO1xuXG4gICAgLy8gU2V0IHByb3BlcnR5IG5hbWVzIHRvIGJhciB0byBtYXRjaCB3aXRoIHRoZSBjaGlsZCBTbGlkZXIgY2xhc3MgaXMgbG9va2luZyBmb3JcbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmJhciA9IF90aGlzLmdldENoaWxkKF90aGlzLm9wdGlvbnNfLmJhck5hbWUpO1xuXG4gICAgLy8gU2V0IGEgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBjbGFzcyBvbiB0aGUgc2xpZGVyIGRlcGVuZGluZyBvbiB0aGUgc2xpZGVyIHR5cGVcbiAgICBfdGhpcy52ZXJ0aWNhbCghIV90aGlzLm9wdGlvbnNfLnZlcnRpY2FsKTtcblxuICAgIF90aGlzLmVuYWJsZSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmUgY29udHJvbHMgYXJlIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIHNsaWRlciBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgdHJ1ZSBpZiBjb250cm9scyBhcmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5lbmFibGVkID0gZnVuY3Rpb24gZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkXztcbiAgfTtcblxuICAvKipcbiAgICogRW5hYmxlIGNvbnRyb2xzIGZvciB0aGlzIHNsaWRlciBpZiB0aGV5IGFyZSBkaXNhYmxlZFxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub24oJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICB0aGlzLm9uKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ2ZvY3VzJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgdGhpcy5vbignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCAnY29udHJvbHN2aXNpYmxlJywgdGhpcy51cGRhdGUpO1xuXG4gICAgaWYgKHRoaXMucGxheWVyRXZlbnQpIHtcbiAgICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCB0aGlzLnBsYXllckV2ZW50LCB0aGlzLnVwZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcblxuICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGNvbnRyb2xzIGZvciB0aGlzIHNsaWRlciBpZiB0aGV5IGFyZSBlbmFibGVkXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIHRoaXMub2ZmKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vZmYoJ2ZvY3VzJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgdGhpcy5vZmYoJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgIHRoaXMub2ZmKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgIHRoaXMub2ZmKHRoaXMucGxheWVyXywgJ2NvbnRyb2xzdmlzaWJsZScsIHRoaXMudXBkYXRlKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICBpZiAodGhpcy5wbGF5ZXJFdmVudCkge1xuICAgICAgdGhpcy5vZmYodGhpcy5wbGF5ZXJfLCB0aGlzLnBsYXllckV2ZW50LCB0aGlzLnVwZGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuZW5hYmxlZF8gPSBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQnV0dG9uYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqICAgICAgICBUeXBlIG9mIGVsZW1lbnQgdG8gY3JlYXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzPXt9XVxuICAgKiAgICAgICAgTGlzdCBvZiBwcm9wZXJ0aWVzIGluIE9iamVjdCBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXM9e31dXG4gICAqICAgICAgICBsaXN0IG9mIGF0dHJpYnV0ZXMgaW4gT2JqZWN0IGZvcm0uXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHR5cGUpIHtcbiAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIC8vIEFkZCB0aGUgc2xpZGVyIGVsZW1lbnQgY2xhc3MgdG8gYWxsIHN1YiBjbGFzc2VzXG4gICAgcHJvcHMuY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lICsgJyB2anMtc2xpZGVyJztcbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICB0YWJJbmRleDogMFxuICAgIH0sIHByb3BzKTtcblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe1xuICAgICAgJ3JvbGUnOiAnc2xpZGVyJyxcbiAgICAgICdhcmlhLXZhbHVlbm93JzogMCxcbiAgICAgICdhcmlhLXZhbHVlbWluJzogMCxcbiAgICAgICdhcmlhLXZhbHVlbWF4JzogMTAwLFxuICAgICAgJ3RhYkluZGV4JzogMFxuICAgIH0sIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdHlwZSwgcHJvcHMsIGF0dHJpYnV0ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50cyBvbiB0aGUgYFNsaWRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICogQGxpc3RlbnMgdG91Y2hzdGFydFxuICAgKiBAZmlyZXMgU2xpZGVyI3NsaWRlcmFjdGl2ZVxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdmFyIGRvYyA9IHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyBEbyBub3QgY2FsbCBwcmV2ZW50RGVmYXVsdCgpIG9uIHRvdWNoc3RhcnQgaW4gQ2hyb21lXG4gICAgLy8gdG8gYXZvaWQgY29uc29sZSB3YXJuaW5ncy4gVXNlIGEgJ3RvdWNoLWFjdGlvbjogbm9uZScgc3R5bGVcbiAgICAvLyBpbnN0ZWFkIHRvIHByZXZlbnQgdW5pbnRlbnRlZCBzY3JvbGxpbmcuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiAhSVNfQ0hST01FKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBibG9ja1RleHRTZWxlY3Rpb24oKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHNsaWRlciBpcyBpbiBhbiBhY3RpdmUgc3RhdGVcbiAgICAgKlxuICAgICAqIEBldmVudCBTbGlkZXIjc2xpZGVyYWN0aXZlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignc2xpZGVyYWN0aXZlJyk7XG5cbiAgICB0aGlzLm9uKGRvYywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLm9uKGRvYywgJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuXG4gICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUoZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGBtb3VzZW1vdmVgLCBgdG91Y2htb3ZlYCwgYW5kIGBtb3VzZWRvd25gIGV2ZW50cyBvbiB0aGlzIGBTbGlkZXJgLlxuICAgKiBUaGUgYG1vdXNlbW92ZWAgYW5kIGB0b3VjaG1vdmVgIGV2ZW50cyB3aWxsIG9ubHkgb25seSB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gZHVyaW5nXG4gICAqIGBtb3VzZWRvd25gIGFuZCBgdG91Y2hzdGFydGAuIFRoaXMgaXMgZHVlIHRvIHtAbGluayBTbGlkZXIjaGFuZGxlTW91c2VEb3dufSBhbmRcbiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVNb3VzZVVwfS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gLCBgbW91c2Vtb3ZlYCwgYHRvdWNoc3RhcnRgLCBvciBgdG91Y2htb3ZlYCBldmVudCB0aGF0IHRyaWdnZXJlZFxuICAgKiAgICAgICAgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZW1vdmVcbiAgICogQGxpc3RlbnMgdG91Y2htb3ZlXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHt9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNldXBgIG9yIGB0b3VjaGVuZGAgZXZlbnRzIG9uIHRoZSBgU2xpZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIG1vdXNldXBcbiAgICogQGZpcmVzIFNsaWRlciNzbGlkZXJpbmFjdGl2ZVxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoKSB7XG4gICAgdmFyIGRvYyA9IHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgdW5ibG9ja1RleHRTZWxlY3Rpb24oKTtcblxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHNsaWRlciBpcyBubyBsb25nZXIgaW4gYW4gYWN0aXZlIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV2ZW50IFNsaWRlciNzbGlkZXJpbmFjdGl2ZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7XG5cbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyIG9mIHRoZSBgU2xpZGVyYC5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogICAgICAgICAgVGhlIHBlcmNlbnRhZ2Ugb2YgcHJvZ3Jlc3MgdGhlIHByb2dyZXNzIGJhciByZXByZXNlbnRzIGFzIGFcbiAgICogICAgICAgICAgbnVtYmVyIGZyb20gMCB0byAxLlxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG4gICAgLy8gSW4gVm9sdW1lQmFyIGluaXQgd2UgaGF2ZSBhIHNldFRpbWVvdXQgZm9yIHVwZGF0ZSB0aGF0IHBvcHMgYW5kIHVwZGF0ZVxuICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBzdGFjay4gVGhlIHBsYXllciBpcyBkZXN0cm95ZWQgYmVmb3JlIHRoZW5cbiAgICAvLyB1cGRhdGUgd2lsbCBjYXVzZSBhbiBlcnJvclxuICAgIGlmICghdGhpcy5lbF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBzY3J1YmJpbmcsIHdlIGNvdWxkIHVzZSBhIGNhY2hlZCB2YWx1ZSB0byBtYWtlIHRoZSBoYW5kbGUga2VlcCB1cFxuICAgIC8vIHdpdGggdGhlIHVzZXIncyBtb3VzZS4gT24gSFRNTDUgYnJvd3NlcnMgc2NydWJiaW5nIGlzIHJlYWxseSBzbW9vdGgsIGJ1dFxuICAgIC8vIHNvbWUgZmxhc2ggcGxheWVycyBhcmUgc2xvdywgc28gd2UgbWlnaHQgd2FudCB0byB1dGlsaXplIHRoaXMgbGF0ZXIuXG4gICAgLy8gdmFyIHByb2dyZXNzID0gICh0aGlzLnBsYXllcl8uc2NydWJiaW5nKCkpID8gdGhpcy5wbGF5ZXJfLmdldENhY2hlKCkuY3VycmVudFRpbWUgLyB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSA6IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpIC8gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgdmFyIHByb2dyZXNzID0gdGhpcy5nZXRQZXJjZW50KCk7XG4gICAgdmFyIGJhciA9IHRoaXMuYmFyO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBiYXIuLi5cbiAgICBpZiAoIWJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb3RlY3QgYWdhaW5zdCBubyBkdXJhdGlvbiBhbmQgb3RoZXIgZGl2aXNpb24gaXNzdWVzXG4gICAgaWYgKHR5cGVvZiBwcm9ncmVzcyAhPT0gJ251bWJlcicgfHwgcHJvZ3Jlc3MgIT09IHByb2dyZXNzIHx8IHByb2dyZXNzIDwgMCB8fCBwcm9ncmVzcyA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHByb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIGEgcGVyY2VudGFnZSBmb3Igc2V0dGluZ1xuICAgIHZhciBwZXJjZW50YWdlID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpICsgJyUnO1xuICAgIHZhciBzdHlsZSA9IGJhci5lbCgpLnN0eWxlO1xuXG4gICAgLy8gU2V0IHRoZSBuZXcgYmFyIHdpZHRoIG9yIGhlaWdodFxuICAgIGlmICh0aGlzLnZlcnRpY2FsKCkpIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9IHBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLndpZHRoID0gcGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBkaXN0YW5jZSBmb3Igc2xpZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgU2xpZGVyLlxuICAgKiAgICAgICAgIC0gcG9zdGl0aW9uLnggZm9yIHZlcnRpY2FsIGBTbGlkZXJgc1xuICAgKiAgICAgICAgIC0gcG9zdGl0aW9uLnkgZm9yIGhvcml6b250YWwgYFNsaWRlcmBzXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5jYWxjdWxhdGVEaXN0YW5jZSA9IGZ1bmN0aW9uIGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9pbnRlclBvc2l0aW9uKHRoaXMuZWxfLCBldmVudCk7XG5cbiAgICBpZiAodGhpcy52ZXJ0aWNhbCgpKSB7XG4gICAgICByZXR1cm4gcG9zaXRpb24ueTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uLng7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBmb2N1c2AgZXZlbnQgb24gdGhpcyBgU2xpZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgZm9jdXNgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBmb2N1c1xuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICB0aGlzLm9uKHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gdGhlIGBTbGlkZXJgLiBXYXRjaGVzIGZvciBsZWZ0LCByaWd0aCwgdXAsIGFuZCBkb3duXG4gICAqIGFycm93IGtleXMuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBzbGlkZXIgaGFzIGZvY3VzLiBTZWVcbiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVGb2N1c30gYW5kIHtAbGluayBTbGlkZXIjaGFuZGxlQmx1cn0uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG4gICAgLy8gTGVmdCBhbmQgRG93biBBcnJvd3NcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM3IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEJhY2soKTtcblxuICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93c1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSAzOSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBibHVyYCBldmVudCBvbiB0aGlzIGBTbGlkZXJgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBibHVyYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgYmx1clxuICAgKi9cblxuICBTbGlkZXIucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgIHRoaXMub2ZmKHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW5lciBmb3IgY2xpY2sgZXZlbnRzIG9uIHNsaWRlciwgdXNlZCB0byBwcmV2ZW50IGNsaWNrc1xuICAgKiAgIGZyb20gYnViYmxpbmcgdXAgdG8gcGFyZW50IGVsZW1lbnRzIGxpa2UgYnV0dG9uIG1lbnVzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgb2JqZWN0IHRvIHJ1blxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgaWYgc2xpZGVyIGlzIGhvcml6b250YWwgZm9yIHZlcnRpY2FsXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Jvb2xdXG4gICAqICAgICAgICAtIHRydWUgaWYgc2xpZGVyIGlzIHZlcnRpY2FsLFxuICAgKiAgICAgICAgLSBmYWxzZSBpcyBob3Jpem9udGFsXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgLSB0cnVlIGlmIHNsaWRlciBpcyB2ZXJ0aWNhbCwgYW5kIGdldHRpbmdcbiAgICogICAgICAgICAtIGZhbHNlIGlmIHRoZSBzbGlkZXIgaXMgaG9yaXpvbnRhbCwgYW5kIGdldHRpbmdcbiAgICovXG5cblxuICBTbGlkZXIucHJvdG90eXBlLnZlcnRpY2FsID0gZnVuY3Rpb24gdmVydGljYWwoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsXyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcnRpY2FsXyA9ICEhYm9vbDtcblxuICAgIGlmICh0aGlzLnZlcnRpY2FsXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXNsaWRlci12ZXJ0aWNhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWhvcml6b250YWwnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNsaWRlcjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTbGlkZXInLCBTbGlkZXIpO1xuXG4vKipcbiAqIEBmaWxlIGxvYWQtcHJvZ3Jlc3MtYmFyLmpzXG4gKi9cbi8qKlxuICogU2hvd3MgbG9hZGluZyBwcm9ncmVzc1xuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBMb2FkUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhMb2FkUHJvZ3Jlc3NCYXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gTG9hZFByb2dyZXNzQmFyKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvYWRQcm9ncmVzc0Jhcik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnBhcnRFbHNfID0gW107XG4gICAgX3RoaXMub24ocGxheWVyLCAncHJvZ3Jlc3MnLCBfdGhpcy51cGRhdGUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIExvYWRQcm9ncmVzc0Jhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWxvYWQtcHJvZ3Jlc3MnLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+PHNwYW4+JyArIHRoaXMubG9jYWxpemUoJ0xvYWRlZCcpICsgJzwvc3Bhbj46IDAlPC9zcGFuPidcbiAgICB9KTtcbiAgfTtcblxuICBMb2FkUHJvZ3Jlc3NCYXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMucGFydEVsc18gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcHJvZ3Jlc3MgYmFyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgcHJvZ3Jlc3NgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcHJvZ3Jlc3NcbiAgICovXG5cblxuICBMb2FkUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuICAgIHZhciBidWZmZXJlZCA9IHRoaXMucGxheWVyXy5idWZmZXJlZCgpO1xuICAgIHZhciBkdXJhdGlvbiA9IHRoaXMucGxheWVyXy5kdXJhdGlvbigpO1xuICAgIHZhciBidWZmZXJlZEVuZCA9IHRoaXMucGxheWVyXy5idWZmZXJlZEVuZCgpO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucGFydEVsc187XG5cbiAgICAvLyBnZXQgdGhlIHBlcmNlbnQgd2lkdGggb2YgYSB0aW1lIGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBlbmRcbiAgICB2YXIgcGVyY2VudGlmeSA9IGZ1bmN0aW9uIHBlcmNlbnRpZnkodGltZSwgZW5kKSB7XG4gICAgICAvLyBubyBOYU5cbiAgICAgIHZhciBwZXJjZW50ID0gdGltZSAvIGVuZCB8fCAwO1xuXG4gICAgICByZXR1cm4gKHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50KSAqIDEwMCArICclJztcbiAgICB9O1xuXG4gICAgLy8gdXBkYXRlIHRoZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyXG4gICAgdGhpcy5lbF8uc3R5bGUud2lkdGggPSBwZXJjZW50aWZ5KGJ1ZmZlcmVkRW5kLCBkdXJhdGlvbik7XG5cbiAgICAvLyBhZGQgY2hpbGQgZWxlbWVudHMgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGJ1ZmZlcmVkIHRpbWUgcmFuZ2VzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXJ0ID0gYnVmZmVyZWQuc3RhcnQoaSk7XG4gICAgICB2YXIgZW5kID0gYnVmZmVyZWQuZW5kKGkpO1xuICAgICAgdmFyIHBhcnQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgIHBhcnQgPSB0aGlzLmVsXy5hcHBlbmRDaGlsZChjcmVhdGVFbCgpKTtcbiAgICAgICAgY2hpbGRyZW5baV0gPSBwYXJ0O1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIHBlcmNlbnQgYmFzZWQgb24gdGhlIHdpZHRoIG9mIHRoZSBwcm9ncmVzcyBiYXIgKGJ1ZmZlcmVkRW5kKVxuICAgICAgcGFydC5zdHlsZS5sZWZ0ID0gcGVyY2VudGlmeShzdGFydCwgYnVmZmVyZWRFbmQpO1xuICAgICAgcGFydC5zdHlsZS53aWR0aCA9IHBlcmNlbnRpZnkoZW5kIC0gc3RhcnQsIGJ1ZmZlcmVkRW5kKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdW51c2VkIGJ1ZmZlcmVkIHJhbmdlIGVsZW1lbnRzXG4gICAgZm9yICh2YXIgX2kgPSBjaGlsZHJlbi5sZW5ndGg7IF9pID4gYnVmZmVyZWQubGVuZ3RoOyBfaS0tKSB7XG4gICAgICB0aGlzLmVsXy5yZW1vdmVDaGlsZChjaGlsZHJlbltfaSAtIDFdKTtcbiAgICB9XG4gICAgY2hpbGRyZW4ubGVuZ3RoID0gYnVmZmVyZWQubGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBMb2FkUHJvZ3Jlc3NCYXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTG9hZFByb2dyZXNzQmFyJywgTG9hZFByb2dyZXNzQmFyKTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLXRvb2x0aXAuanNcbiAqL1xuLyoqXG4gKiBUaW1lIHRvb2x0aXBzIGRpc3BsYXkgYSB0aW1lIGFib3ZlIHRoZSBwcm9ncmVzcyBiYXIuXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFRpbWVUb29sdGlwID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGltZVRvb2x0aXAsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRpbWVUb29sdGlwKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVUb29sdGlwKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgdGltZSB0b29sdGlwIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFRpbWVUb29sdGlwLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdGltZS10b29sdGlwJ1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdGltZSB0b29sdGlwIHJlbGF0aXZlIHRvIHRoZSBgU2Vla0JhcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdFxuICAgKiAgICAgICAgVGhlIGBDbGllbnRSZWN0YCBmb3IgdGhlIHtAbGluayBTZWVrQmFyfSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50XG4gICAqICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSwgcmVwcmVzZW50aW5nIGEgaG9yaXpvbnRhbCByZWZlcmVuY2UgcG9pbnRcbiAgICogICAgICAgIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUge0BsaW5rIFNlZWtCYXJ9XG4gICAqL1xuXG5cbiAgVGltZVRvb2x0aXAucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KSB7XG4gICAgdmFyIHRvb2x0aXBSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMuZWxfKTtcbiAgICB2YXIgcGxheWVyUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLnBsYXllcl8uZWwoKSk7XG4gICAgdmFyIHNlZWtCYXJQb2ludFB4ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQ7XG5cbiAgICAvLyBkbyBub3RoaW5nIGlmIGVpdGhlciByZWN0IGlzbid0IGF2YWlsYWJsZVxuICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGUgcGxheWVyIGlzbid0IGluIHRoZSBET00gZm9yIHRlc3RpbmdcbiAgICBpZiAoIXBsYXllclJlY3QgfHwgIXRvb2x0aXBSZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc3BhY2UgbGVmdCBvZiB0aGUgYHNlZWtCYXJQb2ludGAgYXZhaWxhYmxlIHdpdGhpbiB0aGUgYm91bmRzXG4gICAgLy8gb2YgdGhlIHBsYXllci4gV2UgY2FsY3VsYXRlIGFueSBnYXAgYmV0d2VlbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBwbGF5ZXJcbiAgICAvLyBhbmQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgYFNlZWtCYXJgIGFuZCBhZGQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlXG4gICAgLy8gYFNlZWtCYXJgIGJlZm9yZSBoaXR0aW5nIHRoZSBgc2Vla0JhclBvaW50YFxuICAgIHZhciBzcGFjZUxlZnRPZlBvaW50ID0gc2Vla0JhclJlY3QubGVmdCAtIHBsYXllclJlY3QubGVmdCArIHNlZWtCYXJQb2ludFB4O1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgc3BhY2UgcmlnaHQgb2YgdGhlIGBzZWVrQmFyUG9pbnRgIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGJvdW5kc1xuICAgIC8vIG9mIHRoZSBwbGF5ZXIuIFdlIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSBgc2Vla0JhclBvaW50YFxuICAgIC8vIHRvIHRoZSByaWdodCBlZGdlIG9mIHRoZSBgU2Vla0JhcmAgYW5kIGFkZCB0byB0aGF0IGFueSBnYXAgYmV0d2VlbiB0aGVcbiAgICAvLyByaWdodCBlZGdlIG9mIHRoZSBgU2Vla0JhcmAgYW5kIHRoZSBwbGF5ZXIuXG4gICAgdmFyIHNwYWNlUmlnaHRPZlBvaW50ID0gc2Vla0JhclJlY3Qud2lkdGggLSBzZWVrQmFyUG9pbnRQeCArIChwbGF5ZXJSZWN0LnJpZ2h0IC0gc2Vla0JhclJlY3QucmlnaHQpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBieSB3aGljaCB0aGUgdG9vbHRpcCB3aWxsIG5lZWQgdG8gYmUgcHVsbGVkXG4gICAgLy8gZnVydGhlciB0byB0aGUgcmlnaHQgdG8gY2VudGVyIGl0IG92ZXIgdGhlIGBzZWVrQmFyUG9pbnRgLlxuICAgIHZhciBwdWxsVG9vbHRpcEJ5ID0gdG9vbHRpcFJlY3Qud2lkdGggLyAyO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBgcHVsbFRvb2x0aXBCeWAgZGlzdGFuY2UgdG8gdGhlIGxlZnQgb3IgcmlnaHQgZGVwZW5kaW5nIG9uXG4gICAgLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHNwYWNlIGNhbGN1bGF0aW9ucyBhYm92ZS5cbiAgICBpZiAoc3BhY2VMZWZ0T2ZQb2ludCA8IHB1bGxUb29sdGlwQnkpIHtcbiAgICAgIHB1bGxUb29sdGlwQnkgKz0gcHVsbFRvb2x0aXBCeSAtIHNwYWNlTGVmdE9mUG9pbnQ7XG4gICAgfSBlbHNlIGlmIChzcGFjZVJpZ2h0T2ZQb2ludCA8IHB1bGxUb29sdGlwQnkpIHtcbiAgICAgIHB1bGxUb29sdGlwQnkgPSBzcGFjZVJpZ2h0T2ZQb2ludDtcbiAgICB9XG5cbiAgICAvLyBEdWUgdG8gdGhlIGltcHJlY2lzaW9uIG9mIGRlY2ltYWwvcmF0aW8gYmFzZWQgY2FsY3VsYXRpb25zIGFuZCB2YXJ5aW5nXG4gICAgLy8gcm91bmRpbmcgYmVoYXZpb3JzLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHNwYWNpbmcgYWRqdXN0bWVudCBpcyBvZmZcbiAgICAvLyBieSBhIHBpeGVsIG9yIHR3by4gVGhpcyBhZGRzIGluc3VyYW5jZSB0byB0aGVzZSBjYWxjdWxhdGlvbnMuXG4gICAgaWYgKHB1bGxUb29sdGlwQnkgPCAwKSB7XG4gICAgICBwdWxsVG9vbHRpcEJ5ID0gMDtcbiAgICB9IGVsc2UgaWYgKHB1bGxUb29sdGlwQnkgPiB0b29sdGlwUmVjdC53aWR0aCkge1xuICAgICAgcHVsbFRvb2x0aXBCeSA9IHRvb2x0aXBSZWN0LndpZHRoO1xuICAgIH1cblxuICAgIHRoaXMuZWxfLnN0eWxlLnJpZ2h0ID0gJy0nICsgcHVsbFRvb2x0aXBCeSArICdweCc7XG4gICAgdGV4dENvbnRlbnQodGhpcy5lbF8sIGNvbnRlbnQpO1xuICB9O1xuXG4gIHJldHVybiBUaW1lVG9vbHRpcDtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUaW1lVG9vbHRpcCcsIFRpbWVUb29sdGlwKTtcblxuLyoqXG4gKiBAZmlsZSBwbGF5LXByb2dyZXNzLWJhci5qc1xuICovXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rIFNlZWtCYXJ9IHRvIGRpc3BsYXkgbWVkaWEgcGxheWJhY2sgcHJvZ3Jlc3MgYXMgcGFydCBvZiB0aGVcbiAqIHtAbGluayBQcm9ncmVzc0NvbnRyb2x9LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBQbGF5UHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhQbGF5UHJvZ3Jlc3NCYXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBsYXlQcm9ncmVzc0JhcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5UHJvZ3Jlc3NCYXIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFBsYXlQcm9ncmVzc0Jhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXBsYXktcHJvZ3Jlc3MgdmpzLXNsaWRlci1iYXInLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+PHNwYW4+JyArIHRoaXMubG9jYWxpemUoJ1Byb2dyZXNzJykgKyAnPC9zcGFuPjogMCU8L3NwYW4+J1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyB1cGRhdGVzIHRvIGl0cyBvd24gRE9NIGFzIHdlbGwgYXMgdGhlIERPTSBvZiBpdHNcbiAgICoge0BsaW5rIFRpbWVUb29sdGlwfSBjaGlsZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHNlZWtCYXJSZWN0XG4gICAqICAgICAgICBUaGUgYENsaWVudFJlY3RgIGZvciB0aGUge0BsaW5rIFNlZWtCYXJ9IGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWVrQmFyUG9pbnRcbiAgICogICAgICAgIEEgbnVtYmVyIGZyb20gMCB0byAxLCByZXByZXNlbnRpbmcgYSBob3Jpem9udGFsIHJlZmVyZW5jZSBwb2ludFxuICAgKiAgICAgICAgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSB7QGxpbmsgU2Vla0Jhcn1cbiAgICovXG5cblxuICBQbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyByQUYgSUQsIGNhbmNlbCBpdCBzbyB3ZSBkb24ndCBvdmVyLXF1ZXVlLlxuICAgIGlmICh0aGlzLnJhZklkXykge1xuICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJhZklkXyk7XG4gICAgfVxuXG4gICAgdGhpcy5yYWZJZF8gPSB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGltZSA9IF90aGlzMi5wbGF5ZXJfLnNjcnViYmluZygpID8gX3RoaXMyLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSA6IF90aGlzMi5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gZm9ybWF0VGltZSh0aW1lLCBfdGhpczIucGxheWVyXy5kdXJhdGlvbigpKTtcbiAgICAgIHZhciB0aW1lVG9vbHRpcCA9IF90aGlzMi5nZXRDaGlsZCgndGltZVRvb2x0aXAnKTtcblxuICAgICAgaWYgKHRpbWVUb29sdGlwKSB7XG4gICAgICAgIHRpbWVUb29sdGlwLnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUGxheVByb2dyZXNzQmFyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3Ige0BsaW5rIFBsYXlQcm9ncmVzc0Jhcn0uXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogW11cbn07XG5cbi8vIFRpbWUgdG9vbHRpcHMgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBhIHBsYXllciBvbiBtb2JpbGUgZGV2aWNlcyBvciBJRThcbmlmICgoIUlFX1ZFUlNJT04gfHwgSUVfVkVSU0lPTiA+IDgpICYmICFJU19JT1MgJiYgIUlTX0FORFJPSUQpIHtcbiAgUGxheVByb2dyZXNzQmFyLnByb3RvdHlwZS5vcHRpb25zXy5jaGlsZHJlbi5wdXNoKCd0aW1lVG9vbHRpcCcpO1xufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXlQcm9ncmVzc0JhcicsIFBsYXlQcm9ncmVzc0Jhcik7XG5cbi8qKlxuICogQGZpbGUgbW91c2UtdGltZS1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogVGhlIHtAbGluayBNb3VzZVRpbWVEaXNwbGF5fSBjb21wb25lbnQgdHJhY2tzIG1vdXNlIG1vdmVtZW50IG92ZXIgdGhlXG4gKiB7QGxpbmsgUHJvZ3Jlc3NDb250cm9sfS4gSXQgZGlzcGxheXMgYW4gaW5kaWNhdG9yIGFuZCBhIHtAbGluayBUaW1lVG9vbHRpcH1cbiAqIGluZGljYXRpbmcgdGhlIHRpbWUgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYSBnaXZlbiBwb2ludCBpbiB0aGVcbiAqIHtAbGluayBQcm9ncmVzc0NvbnRyb2x9LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBNb3VzZVRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTW91c2VUaW1lRGlzcGxheSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXJ9IHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBNb3VzZVRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vdXNlVGltZURpc3BsYXkpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy51cGRhdGUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy51cGRhdGUpLCAyNSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBNb3VzZVRpbWVEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbW91c2UtZGlzcGxheSdcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRW5xdWV1ZXMgdXBkYXRlcyB0byBpdHMgb3duIERPTSBhcyB3ZWxsIGFzIHRoZSBET00gb2YgaXRzXG4gICAqIHtAbGluayBUaW1lVG9vbHRpcH0gY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdFxuICAgKiAgICAgICAgVGhlIGBDbGllbnRSZWN0YCBmb3IgdGhlIHtAbGluayBTZWVrQmFyfSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50XG4gICAqICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSwgcmVwcmVzZW50aW5nIGEgaG9yaXpvbnRhbCByZWZlcmVuY2UgcG9pbnRcbiAgICogICAgICAgIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUge0BsaW5rIFNlZWtCYXJ9XG4gICAqL1xuXG5cbiAgTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWtCYXJSZWN0LCBzZWVrQmFyUG9pbnQpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIC8vIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHJBRiBJRCwgY2FuY2VsIGl0IHNvIHdlIGRvbid0IG92ZXItcXVldWUuXG4gICAgaWYgKHRoaXMucmFmSWRfKSB7XG4gICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWRfKTtcbiAgICB9XG5cbiAgICB0aGlzLnJhZklkXyA9IHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkdXJhdGlvbiA9IF90aGlzMi5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgICB2YXIgY29udGVudCA9IGZvcm1hdFRpbWUoc2Vla0JhclBvaW50ICogZHVyYXRpb24sIGR1cmF0aW9uKTtcblxuICAgICAgX3RoaXMyLmVsXy5zdHlsZS5sZWZ0ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQgKyAncHgnO1xuICAgICAgX3RoaXMyLmdldENoaWxkKCd0aW1lVG9vbHRpcCcpLnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gTW91c2VUaW1lRGlzcGxheTtcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBNb3VzZVRpbWVEaXNwbGF5YFxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUub3B0aW9uc18gPSB7XG4gIGNoaWxkcmVuOiBbJ3RpbWVUb29sdGlwJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTW91c2VUaW1lRGlzcGxheScsIE1vdXNlVGltZURpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIHNlZWstYmFyLmpzXG4gKi9cbi8vIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgYHN0ZXAqYCBmdW5jdGlvbnMgbW92ZSB0aGUgdGltZWxpbmUuXG52YXIgU1RFUF9TRUNPTkRTID0gNTtcblxuLy8gVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSBiYXIgc2hvdWxkIHVwZGF0ZSBhcyBpdCBwcm9ncmVzc2VzLlxudmFyIFVQREFURV9SRUZSRVNIX0lOVEVSVkFMID0gMzA7XG5cbi8qKlxuICogU2VlayBiYXIgYW5kIGNvbnRhaW5lciBmb3IgdGhlIHByb2dyZXNzIGJhcnMuIFVzZXMge0BsaW5rIFBsYXlQcm9ncmVzc0Jhcn1cbiAqIGFzIGl0cyBgYmFyYC5cbiAqXG4gKiBAZXh0ZW5kcyBTbGlkZXJcbiAqL1xuXG52YXIgU2Vla0JhciA9IGZ1bmN0aW9uIChfU2xpZGVyKSB7XG4gIGluaGVyaXRzKFNlZWtCYXIsIF9TbGlkZXIpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gU2Vla0JhcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTZWVrQmFyKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1NsaWRlci5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMuc2V0RXZlbnRIYW5kbGVyc18oKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5zZXRFdmVudEhhbmRsZXJzXyA9IGZ1bmN0aW9uIHNldEV2ZW50SGFuZGxlcnNfKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdGhpcy51cGRhdGUgPSB0aHJvdHRsZShiaW5kKHRoaXMsIHRoaXMudXBkYXRlKSwgVVBEQVRFX1JFRlJFU0hfSU5URVJWQUwpO1xuXG4gICAgdGhpcy5vbih0aGlzLnBsYXllcl8sICd0aW1ldXBkYXRlJywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCAnZW5kZWQnLCB0aGlzLmhhbmRsZUVuZGVkKTtcblxuICAgIC8vIHdoZW4gcGxheWluZywgbGV0J3MgZW5zdXJlIHdlIHNtb290aGx5IHVwZGF0ZSB0aGUgcGxheSBwcm9ncmVzcyBiYXJcbiAgICAvLyB2aWEgYW4gaW50ZXJ2YWxcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ3BsYXlpbmcnXSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLmNsZWFySW50ZXJ2YWwoX3RoaXMyLnVwZGF0ZUludGVydmFsKTtcblxuICAgICAgX3RoaXMyLnVwZGF0ZUludGVydmFsID0gX3RoaXMyLnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIFVQREFURV9SRUZSRVNIX0lOVEVSVkFMKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ2VuZGVkJywgJ3BhdXNlJywgJ3dhaXRpbmcnXSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLmNsZWFySW50ZXJ2YWwoX3RoaXMyLnVwZGF0ZUludGVydmFsKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ3RpbWV1cGRhdGUnLCAnZW5kZWQnXSwgdGhpcy51cGRhdGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgcmV0dXJuIF9TbGlkZXIucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wcm9ncmVzcy1ob2xkZXInXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGFiZWwnOiB0aGlzLmxvY2FsaXplKCdQcm9ncmVzcyBCYXInKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHBsYXkgcHJvZ3Jlc3MgYmFyIGFuZCBhY2Nlc3NpYmxpdHlcbiAgICogYXR0cmlidXRlcyB0byB3aGF0ZXZlciBpcyBwYXNzZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50VGltZVxuICAgKiAgICAgICAgVGhlIGN1cnJlbnRUaW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFjY2Vzc2libGl0eVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudFxuICAgKiAgICAgICAgVGhlIHBlcmNlbnRhZ2UgYXMgYSBkZWNpbWFsIHRoYXQgdGhlIGJhciBzaG91bGQgYmUgZmlsbGVkIGZyb20gMC0xLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnVwZGF0ZV8gPSBmdW5jdGlvbiB1cGRhdGVfKGN1cnJlbnRUaW1lLCBwZXJjZW50KSB7XG4gICAgdmFyIGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICAvLyBtYWNoaW5lIHJlYWRhYmxlIHZhbHVlIG9mIHByb2dyZXNzIGJhciAocGVyY2VudGFnZSBjb21wbGV0ZSlcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAocGVyY2VudCAqIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgICAvLyBodW1hbiByZWFkYWJsZSB2YWx1ZSBvZiBwcm9ncmVzcyBiYXIgKHRpbWUgY29tcGxldGUpXG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcsIHRoaXMubG9jYWxpemUoJ3Byb2dyZXNzIGJhciB0aW1pbmc6IGN1cnJlbnRUaW1lPXsxfSBkdXJhdGlvbj17Mn0nLCBbZm9ybWF0VGltZShjdXJyZW50VGltZSwgZHVyYXRpb24pLCBmb3JtYXRUaW1lKGR1cmF0aW9uLCBkdXJhdGlvbildLCAnezF9IG9mIHsyfScpKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYFBsYXlQcm9ncmVzc0JhcmAuXG4gICAgdGhpcy5iYXIudXBkYXRlKGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsXyksIHBlcmNlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHNlZWsgYmFyJ3MgVUkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGVuZGVkYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3RpbWV1cGRhdGVcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogICAgICAgICAgVGhlIGN1cnJlbnQgcGVyY2VudCBhdCBhIG51bWJlciBmcm9tIDAtMVxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuICAgIHZhciBwZXJjZW50ID0gX1NsaWRlci5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnVwZGF0ZV8odGhpcy5nZXRDdXJyZW50VGltZV8oKSwgcGVyY2VudCk7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgY3VycmVudCB0aW1lIGJ1dCBhbGxvd3MgZm9yIHNtb290aCBzY3J1YmJpbmcsXG4gICAqIHdoZW4gcGxheWVyIGNhbid0IGtlZXAgdXAuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB0aW1lIHZhbHVlIHRvIGRpc3BsYXlcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZV8gPSBmdW5jdGlvbiBnZXRDdXJyZW50VGltZV8oKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdlIHdhbnQgdGhlIHNlZWsgYmFyIHRvIGJlIGZ1bGwgb24gZW5kZWRcbiAgICogbm8gbWF0dGVyIHdoYXQgdGhlIGFjdHVhbCBpbnRlcm5hbCB2YWx1ZXMgYXJlLiBzbyB3ZSBmb3JjZSBpdC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGB0aW1ldXBkYXRlYCBvciBgZW5kZWRgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZW5kZWRcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVFbmRlZCA9IGZ1bmN0aW9uIGhhbmRsZUVuZGVkKGV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpLCAxKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBwZXJjZW50YWdlIG9mIG1lZGlhIHBsYXllZCBzbyBmYXIuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgcGVyY2VudGFnZSBvZiBtZWRpYSBwbGF5ZWQgc28gZmFyICgwIHRvIDEpLlxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmdldFBlcmNlbnQgPSBmdW5jdGlvbiBnZXRQZXJjZW50KCkge1xuICAgIHZhciBwZXJjZW50ID0gdGhpcy5nZXRDdXJyZW50VGltZV8oKSAvIHRoaXMucGxheWVyXy5kdXJhdGlvbigpO1xuXG4gICAgcmV0dXJuIHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgZG93biBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBtb3VzZWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICBpZiAoIWlzU2luZ2xlTGVmdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkb3VibGUgZmlyZSBpbiBwcm9ncmVzcy1jb250cm9sLmpzXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnNjcnViYmluZyh0cnVlKTtcblxuICAgIHRoaXMudmlkZW9XYXNQbGF5aW5nID0gIXRoaXMucGxheWVyXy5wYXVzZWQoKTtcbiAgICB0aGlzLnBsYXllcl8ucGF1c2UoKTtcblxuICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93bi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNlIG1vdmUgb24gc2VlayBiYXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgbW91c2Vtb3ZlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vtb3ZlXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKCFpc1NpbmdsZUxlZnRDbGljayhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV3VGltZSA9IHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpICogdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICAvLyBEb24ndCBsZXQgdmlkZW8gZW5kIHdoaWxlIHNjcnViYmluZy5cbiAgICBpZiAobmV3VGltZSA9PT0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHtcbiAgICAgIG5ld1RpbWUgPSBuZXdUaW1lIC0gMC4xO1xuICAgIH1cblxuICAgIC8vIFNldCBuZXcgdGltZSAodGVsbCBwbGF5ZXIgdG8gc2VlayB0byBuZXcgdGltZSlcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUobmV3VGltZSk7XG4gIH07XG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIF9TbGlkZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xuICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gdGhpcy5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpO1xuXG4gICAgaWYgKCFtb3VzZVRpbWVEaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW91c2VUaW1lRGlzcGxheS5zaG93KCk7XG4gIH07XG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgX1NsaWRlci5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xuICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gdGhpcy5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpO1xuXG4gICAgaWYgKCFtb3VzZVRpbWVEaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW91c2VUaW1lRGlzcGxheS5oaWRlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSB1cCBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBtb3VzZXVwYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2V1cFxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmhhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2ZW50KSB7XG4gICAgX1NsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VVcC5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkb3VibGUgZmlyZSBpbiBwcm9ncmVzcy1jb250cm9sLmpzXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5wbGF5ZXJfLnNjcnViYmluZyhmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIHRpbWV1cGRhdGUgYmVjYXVzZSB3ZSdyZSBkb25lIHNlZWtpbmcgYW5kIHRoZSB0aW1lIGhhcyBjaGFuZ2VkLlxuICAgICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaWYgdGhlIHBsYXllciBpcyBwYXVzZWQgdG8gdGltZSB0aGUgdGltZSBkaXNwbGF5cy5cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI3RpbWV1cGRhdGVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXJfLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gICAgaWYgKHRoaXMudmlkZW9XYXNQbGF5aW5nKSB7XG4gICAgICBzaWxlbmNlUHJvbWlzZSh0aGlzLnBsYXllcl8ucGxheSgpKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE1vdmUgbW9yZSBxdWlja2x5IGZhc3QgZm9yd2FyZCBmb3Iga2V5Ym9hcmQtb25seSB1c2Vyc1xuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnN0ZXBGb3J3YXJkID0gZnVuY3Rpb24gc3RlcEZvcndhcmQoKSB7XG4gICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpICsgU1RFUF9TRUNPTkRTKTtcbiAgfTtcblxuICAvKipcbiAgICogTW92ZSBtb3JlIHF1aWNrbHkgcmV3aW5kIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuc3RlcEJhY2sgPSBmdW5jdGlvbiBzdGVwQmFjaygpIHtcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUodGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCkgLSBTVEVQX1NFQ09ORFMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgcGxheWVyXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBlbnRlciBvciBzcGFjZSBpcyB1c2VkIG9uIHRoZSBzZWVrYmFyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gICAqXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlQWN0aW9uID0gZnVuY3Rpb24gaGFuZGxlQWN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBhdXNlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGlzIFNlZWtCYXIgaGFzIGZvY3VzIGFuZCBhIGtleSBnZXRzIHByZXNzZWQgZG93bi4gQnlcbiAgICogZGVmYXVsdCBpdCB3aWxsIGNhbGwgYHRoaXMuaGFuZGxlQWN0aW9uYCB3aGVuIHRoZSBrZXkgaXMgc3BhY2Ugb3IgZW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhldmVudCkge1xuXG4gICAgLy8gU3VwcG9ydCBTcGFjZSAoMzIpIG9yIEVudGVyICgxMykga2V5IG9wZXJhdGlvbiB0byBmaXJlIGEgY2xpY2sgZXZlbnRcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDMyIHx8IGV2ZW50LndoaWNoID09PSAxMykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZUtleVByZXNzKSB7XG5cbiAgICAgIC8vIFBhc3Mga2V5cHJlc3MgaGFuZGxpbmcgdXAgZm9yIHVuc3VwcG9ydGVkIGtleXNcbiAgICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZUtleVByZXNzLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU2Vla0Jhcjtcbn0oU2xpZGVyKTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBgU2Vla0JhcmBcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuXG5cblNlZWtCYXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogWydsb2FkUHJvZ3Jlc3NCYXInLCAncGxheVByb2dyZXNzQmFyJ10sXG4gIGJhck5hbWU6ICdwbGF5UHJvZ3Jlc3NCYXInXG59O1xuXG4vLyBNb3VzZVRpbWVEaXNwbGF5IHRvb2x0aXBzIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gYSBwbGF5ZXIgb24gbW9iaWxlIGRldmljZXMgb3IgSUU4XG5pZiAoKCFJRV9WRVJTSU9OIHx8IElFX1ZFUlNJT04gPiA4KSAmJiAhSVNfSU9TICYmICFJU19BTkRST0lEKSB7XG4gIFNlZWtCYXIucHJvdG90eXBlLm9wdGlvbnNfLmNoaWxkcmVuLnNwbGljZSgxLCAwLCAnbW91c2VUaW1lRGlzcGxheScpO1xufVxuXG4vKipcbiAqIENhbGwgdGhlIHVwZGF0ZSBldmVudCBmb3IgdGhpcyBTbGlkZXIgd2hlbiB0aGlzIGV2ZW50IGhhcHBlbnMgb24gdGhlIHBsYXllci5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5TZWVrQmFyLnByb3RvdHlwZS5wbGF5ZXJFdmVudCA9ICd0aW1ldXBkYXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTZWVrQmFyJywgU2Vla0Jhcik7XG5cbi8qKlxuICogQGZpbGUgcHJvZ3Jlc3MtY29udHJvbC5qc1xuICovXG4vKipcbiAqIFRoZSBQcm9ncmVzcyBDb250cm9sIGNvbXBvbmVudCBjb250YWlucyB0aGUgc2VlayBiYXIsIGxvYWQgcHJvZ3Jlc3MsXG4gKiBhbmQgcGxheSBwcm9ncmVzcy5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgUHJvZ3Jlc3NDb250cm9sID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoUHJvZ3Jlc3NDb250cm9sLCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFByb2dyZXNzQ29udHJvbChwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQcm9ncmVzc0NvbnRyb2wpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5oYW5kbGVNb3VzZU1vdmUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpLCAyNSk7XG4gICAgX3RoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrID0gdGhyb3R0bGUoYmluZChfdGhpcywgX3RoaXMuaGFuZGxlTW91c2VTZWVrKSwgMjUpO1xuXG4gICAgX3RoaXMuZW5hYmxlKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtcHJvZ3Jlc3MtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogV2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciB0aGUgYFByb2dyZXNzQ29udHJvbGAsIHRoZSBwb2ludGVyIHBvc2l0aW9uXG4gICAqIGdldHMgcGFzc2VkIGRvd24gdG8gdGhlIGBNb3VzZVRpbWVEaXNwbGF5YCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYG1vdXNlbW92ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW4gbW91c2Vtb3ZlXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICB2YXIgc2Vla0JhciA9IHRoaXMuZ2V0Q2hpbGQoJ3NlZWtCYXInKTtcblxuICAgIGlmIChzZWVrQmFyKSB7XG4gICAgICB2YXIgbW91c2VUaW1lRGlzcGxheSA9IHNlZWtCYXIuZ2V0Q2hpbGQoJ21vdXNlVGltZURpc3BsYXknKTtcbiAgICAgIHZhciBzZWVrQmFyRWwgPSBzZWVrQmFyLmVsKCk7XG4gICAgICB2YXIgc2Vla0JhclJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc2Vla0JhckVsKTtcbiAgICAgIHZhciBzZWVrQmFyUG9pbnQgPSBnZXRQb2ludGVyUG9zaXRpb24oc2Vla0JhckVsLCBldmVudCkueDtcblxuICAgICAgLy8gVGhlIGRlZmF1bHQgc2tpbiBoYXMgYSBnYXAgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGBTZWVrQmFyYC4gVGhpcyBtZWFuc1xuICAgICAgLy8gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHRyaWdnZXIgdGhpcyBiZWhhdmlvciBvdXRzaWRlIHRoZSBib3VuZGFyaWVzIG9mXG4gICAgICAvLyB0aGUgYFNlZWtCYXJgLiBUaGlzIGVuc3VyZXMgd2Ugc3RheSB3aXRoaW4gaXQgYXQgYWxsIHRpbWVzLlxuICAgICAgaWYgKHNlZWtCYXJQb2ludCA+IDEpIHtcbiAgICAgICAgc2Vla0JhclBvaW50ID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vla0JhclBvaW50IDwgMCkge1xuICAgICAgICBzZWVrQmFyUG9pbnQgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAobW91c2VUaW1lRGlzcGxheSkge1xuICAgICAgICBtb3VzZVRpbWVEaXNwbGF5LnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgdGhyb3R0bGVkIHZlcnNpb24gb2YgdGhlIHtAbGluayBQcm9ncmVzc0NvbnRyb2wjaGFuZGxlTW91c2VTZWVrfSBsaXN0ZW5lci5cbiAgICpcbiAgICogQG1ldGhvZCBQcm9ncmVzc0NvbnRyb2wjdGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYG1vdXNlbW92ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW4gbW91c2Vtb3ZlXG4gICAqIEBsaXN0ZW4gdG91Y2htb3ZlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlbW92ZWAgb3IgYHRvdWNobW92ZWAgZXZlbnRzIG9uIHRoZSBgUHJvZ3Jlc3NDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBsaXN0ZW5zIG1vdXNlbW92ZVxuICAgKiBAbGlzdGVucyB0b3VjaG1vdmVcbiAgICovXG5cblxuICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmhhbmRsZU1vdXNlU2VlayA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlU2VlayhldmVudCkge1xuICAgIHZhciBzZWVrQmFyID0gdGhpcy5nZXRDaGlsZCgnc2Vla0JhcicpO1xuXG4gICAgaWYgKHNlZWtCYXIpIHtcbiAgICAgIHNlZWtCYXIuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFyZSBjb250cm9scyBhcmUgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoaXMgcHJvZ3Jlc3MgY29udHJvbC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0cnVlIGlmIGNvbnRyb2xzIGFyZSBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG5cblxuICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmVuYWJsZWQgPSBmdW5jdGlvbiBlbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFsbCBjb250cm9scyBvbiB0aGUgcHJvZ3Jlc3MgY29udHJvbCBhbmQgaXRzIGNoaWxkcmVuXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICB0aGlzLmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC5kaXNhYmxlICYmIGNoaWxkLmRpc2FibGUoKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9mZihbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICB0aGlzLm9mZih0aGlzLmVsXywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLmhhbmRsZU1vdXNlVXAoKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhbGwgY29udHJvbHMgb24gdGhlIHByb2dyZXNzIGNvbnRyb2wgYW5kIGl0cyBjaGlsZHJlblxuICAgKi9cblxuXG4gIFByb2dyZXNzQ29udHJvbC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIHRoaXMuY2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLmVuYWJsZSAmJiBjaGlsZC5lbmFibGUoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub24oWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vbih0aGlzLmVsXywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuXG4gICAgdGhpcy5lbmFibGVkXyA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgUHJvZ3Jlc3NDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBsaXN0ZW5zIG1vdXNlZG93blxuICAgKiBAbGlzdGVucyB0b3VjaHN0YXJ0XG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgZG9jID0gdGhpcy5lbF8ub3duZXJEb2N1bWVudDtcbiAgICB2YXIgc2Vla0JhciA9IHRoaXMuZ2V0Q2hpbGQoJ3NlZWtCYXInKTtcblxuICAgIGlmIChzZWVrQmFyKSB7XG4gICAgICBzZWVrQmFyLmhhbmRsZU1vdXNlRG93bihldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlU2Vlayk7XG4gICAgdGhpcy5vbihkb2MsICd0b3VjaG1vdmUnLCB0aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlU2Vlayk7XG4gICAgdGhpcy5vbihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9uKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50cyBvbiB0aGUgYFByb2dyZXNzQ29udHJvbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAbGlzdGVucyB0b3VjaGVuZFxuICAgKiBAbGlzdGVucyBtb3VzZXVwXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldmVudCkge1xuICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50O1xuICAgIHZhciBzZWVrQmFyID0gdGhpcy5nZXRDaGlsZCgnc2Vla0JhcicpO1xuXG4gICAgaWYgKHNlZWtCYXIpIHtcbiAgICAgIHNlZWtCYXIuaGFuZGxlTW91c2VVcChldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWspO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgcmV0dXJuIFByb2dyZXNzQ29udHJvbDtcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBQcm9ncmVzc0NvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Qcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogWydzZWVrQmFyJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUHJvZ3Jlc3NDb250cm9sJywgUHJvZ3Jlc3NDb250cm9sKTtcblxuLyoqXG4gKiBAZmlsZSBmdWxsc2NyZWVuLXRvZ2dsZS5qc1xuICovXG4vKipcbiAqIFRvZ2dsZSBmdWxsc2NyZWVuIHZpZGVvXG4gKlxuICogQGV4dGVuZHMgQnV0dG9uXG4gKi9cblxudmFyIEZ1bGxzY3JlZW5Ub2dnbGUgPSBmdW5jdGlvbiAoX0J1dHRvbikge1xuICBpbmhlcml0cyhGdWxsc2NyZWVuVG9nZ2xlLCBfQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEZ1bGxzY3JlZW5Ub2dnbGUocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRnVsbHNjcmVlblRvZ2dsZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBfdGhpcy5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKTtcblxuICAgIGlmIChkb2N1bWVudFtGdWxsc2NyZWVuQXBpLmZ1bGxzY3JlZW5FbmFibGVkXSA9PT0gZmFsc2UpIHtcbiAgICAgIF90aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBGdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1mdWxsc2NyZWVuLWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBmdWxsc2NyZWVuY2hhbmdlIG9uIHRoZSBwbGF5ZXIgYW5kIGNoYW5nZSBjb250cm9sIHRleHQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSB7QGxpbmsgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBGdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlRnVsbHNjcmVlbkNoYW5nZShldmVudCkge1xuICAgIGlmICh0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgIHRoaXMuY29udHJvbFRleHQoJ05vbi1GdWxsc2NyZWVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbFRleHQoJ0Z1bGxzY3JlZW4nKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgRnVsbHNjcmVlblRvZ2dsZWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIEZ1bGxzY3JlZW5Ub2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMucGxheWVyXy5pc0Z1bGxzY3JlZW4oKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5leGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRnVsbHNjcmVlblRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBGdWxsc2NyZWVuVG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5GdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnRnVsbHNjcmVlbic7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRnVsbHNjcmVlblRvZ2dsZScsIEZ1bGxzY3JlZW5Ub2dnbGUpO1xuXG4vKipcbiAqIENoZWNrIGlmIHZvbHVtZSBjb250cm9sIGlzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXNuJ3QgaGlkZSB0aGVcbiAqIGBDb21wb25lbnRgIHRoYXQgd2FzIHBhc3NlZCAgdXNpbmcgdGhlIGB2anMtaGlkZGVuYCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gc2VsZlxuICogICAgICAgIFRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGlmIHZvbHVtZSBpcyB1bnN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGNoZWNrVm9sdW1lU3VwcG9ydCA9IGZ1bmN0aW9uIGNoZWNrVm9sdW1lU3VwcG9ydChzZWxmLCBwbGF5ZXIpIHtcbiAgLy8gaGlkZSB2b2x1bWUgY29udHJvbHMgd2hlbiB0aGV5J3JlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgdGVjaFxuICBpZiAocGxheWVyLnRlY2hfICYmICFwbGF5ZXIudGVjaF8uZmVhdHVyZXNWb2x1bWVDb250cm9sKSB7XG4gICAgc2VsZi5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICB9XG5cbiAgc2VsZi5vbihwbGF5ZXIsICdsb2Fkc3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwbGF5ZXIudGVjaF8uZmVhdHVyZXNWb2x1bWVDb250cm9sKSB7XG4gICAgICBzZWxmLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBAZmlsZSB2b2x1bWUtbGV2ZWwuanNcbiAqL1xuLyoqXG4gKiBTaG93cyB2b2x1bWUgbGV2ZWxcbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgVm9sdW1lTGV2ZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhWb2x1bWVMZXZlbCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVm9sdW1lTGV2ZWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVm9sdW1lTGV2ZWwpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFZvbHVtZUxldmVsLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdm9sdW1lLWxldmVsJyxcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPjwvc3Bhbj4nXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUxldmVsO1xufShDb21wb25lbnQpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZUxldmVsJywgVm9sdW1lTGV2ZWwpO1xuXG4vKipcbiAqIEBmaWxlIHZvbHVtZS1iYXIuanNcbiAqL1xuLy8gUmVxdWlyZWQgY2hpbGRyZW5cbi8qKlxuICogVGhlIGJhciB0aGF0IGNvbnRhaW5zIHRoZSB2b2x1bWUgbGV2ZWwgYW5kIGNhbiBiZSBjbGlja2VkIG9uIHRvIGFkanVzdCB0aGUgbGV2ZWxcbiAqXG4gKiBAZXh0ZW5kcyBTbGlkZXJcbiAqL1xuXG52YXIgVm9sdW1lQmFyID0gZnVuY3Rpb24gKF9TbGlkZXIpIHtcbiAgaW5oZXJpdHMoVm9sdW1lQmFyLCBfU2xpZGVyKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFZvbHVtZUJhcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVCYXIpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfU2xpZGVyLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbignc2xpZGVyYWN0aXZlJywgX3RoaXMudXBkYXRlTGFzdFZvbHVtZV8pO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ3ZvbHVtZWNoYW5nZScsIF90aGlzLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzKTtcbiAgICBwbGF5ZXIucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdm9sdW1lLWJhciB2anMtc2xpZGVyLWJhcidcbiAgICB9LCB7XG4gICAgICAnYXJpYS1sYWJlbCc6IHRoaXMubG9jYWxpemUoJ1ZvbHVtZSBMZXZlbCcpLFxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSBkb3duIG9uIHZvbHVtZSBiYXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgbW91c2Vkb3duYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vkb3duXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICBpZiAoIWlzU2luZ2xlTGVmdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93bi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIG1vdmVtZW50IGV2ZW50cyBvbiB0aGUge0BsaW5rIFZvbHVtZU1lbnVCdXR0b259LlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZW1vdmVcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLmhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja011dGVkKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLmNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgbXV0ZWQgdW5tdXRlIGl0LlxuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuY2hlY2tNdXRlZCA9IGZ1bmN0aW9uIGNoZWNrTXV0ZWQoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7XG4gICAgICB0aGlzLnBsYXllcl8ubXV0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHBlcmNlbnQgb2Ygdm9sdW1lIGxldmVsXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBWb2x1bWUgbGV2ZWwgcGVyY2VudCBhcyBhIGRlY2ltYWwgbnVtYmVyLlxuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuZ2V0UGVyY2VudCA9IGZ1bmN0aW9uIGdldFBlcmNlbnQoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxheWVyXy52b2x1bWUoKTtcbiAgfTtcblxuICAvKipcbiAgICogSW5jcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2Vyc1xuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuc3RlcEZvcndhcmQgPSBmdW5jdGlvbiBzdGVwRm9yd2FyZCgpIHtcbiAgICB0aGlzLmNoZWNrTXV0ZWQoKTtcbiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSArIDAuMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY3JlYXNlIHZvbHVtZSBsZXZlbCBmb3Iga2V5Ym9hcmQgdXNlcnNcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLnN0ZXBCYWNrID0gZnVuY3Rpb24gc3RlcEJhY2soKSB7XG4gICAgdGhpcy5jaGVja011dGVkKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLnBsYXllcl8udm9sdW1lKCkgLSAwLjEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgQVJJQSBhY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGB2b2x1bWVjaGFuZ2VgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdm9sdW1lY2hhbmdlXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS51cGRhdGVBUklBQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHVwZGF0ZUFSSUFBdHRyaWJ1dGVzKGV2ZW50KSB7XG4gICAgdmFyIGFyaWFWYWx1ZSA9IHRoaXMucGxheWVyXy5tdXRlZCgpID8gMCA6IHRoaXMudm9sdW1lQXNQZXJjZW50YWdlXygpO1xuXG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgYXJpYVZhbHVlKTtcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgYXJpYVZhbHVlICsgJyUnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGxheWVyIHZvbHVtZSBhcyBhIHBlcmNlbnRhZ2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLnZvbHVtZUFzUGVyY2VudGFnZV8gPSBmdW5jdGlvbiB2b2x1bWVBc1BlcmNlbnRhZ2VfKCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMucGxheWVyXy52b2x1bWUoKSAqIDEwMCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNlciBzdGFydHMgZHJhZ2dpbmcgdGhlIFZvbHVtZUJhciwgc3RvcmUgdGhlIHZvbHVtZSBhbmQgbGlzdGVuIGZvclxuICAgKiB0aGUgZW5kIG9mIHRoZSBkcmFnLiBXaGVuIHRoZSBkcmFnIGVuZHMsIGlmIHRoZSB2b2x1bWUgd2FzIHNldCB0byB6ZXJvLFxuICAgKiBzZXQgbGFzdFZvbHVtZSB0byB0aGUgc3RvcmVkIHZvbHVtZS5cbiAgICpcbiAgICogQGxpc3RlbnMgc2xpZGVyYWN0aXZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS51cGRhdGVMYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIHVwZGF0ZUxhc3RWb2x1bWVfKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHZvbHVtZUJlZm9yZURyYWcgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7XG5cbiAgICB0aGlzLm9uZSgnc2xpZGVyaW5hY3RpdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLnBsYXllcl8udm9sdW1lKCkgPT09IDApIHtcbiAgICAgICAgX3RoaXMyLnBsYXllcl8ubGFzdFZvbHVtZV8odm9sdW1lQmVmb3JlRHJhZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUJhcjtcbn0oU2xpZGVyKTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBgVm9sdW1lQmFyYFxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuVm9sdW1lQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsndm9sdW1lTGV2ZWwnXSxcbiAgYmFyTmFtZTogJ3ZvbHVtZUxldmVsJ1xufTtcblxuLyoqXG4gKiBDYWxsIHRoZSB1cGRhdGUgZXZlbnQgZm9yIHRoaXMgU2xpZGVyIHdoZW4gdGhpcyBldmVudCBoYXBwZW5zIG9uIHRoZSBwbGF5ZXIuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuVm9sdW1lQmFyLnByb3RvdHlwZS5wbGF5ZXJFdmVudCA9ICd2b2x1bWVjaGFuZ2UnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZUJhcicsIFZvbHVtZUJhcik7XG5cbi8qKlxuICogQGZpbGUgdm9sdW1lLWNvbnRyb2wuanNcbiAqL1xuLy8gUmVxdWlyZWQgY2hpbGRyZW5cbi8qKlxuICogVGhlIGNvbXBvbmVudCBmb3IgY29udHJvbGxpbmcgdGhlIHZvbHVtZSBsZXZlbFxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBWb2x1bWVDb250cm9sID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVm9sdW1lQ29udHJvbCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBWb2x1bWVDb250cm9sKHBsYXllcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVDb250cm9sKTtcblxuICAgIG9wdGlvbnMudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsIHx8IGZhbHNlO1xuXG4gICAgLy8gUGFzcyB0aGUgdmVydGljYWwgb3B0aW9uIGRvd24gdG8gdGhlIFZvbHVtZUJhciBpZlxuICAgIC8vIHRoZSBWb2x1bWVCYXIgaXMgdHVybmVkIG9uLlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy52b2x1bWVCYXIgPT09ICd1bmRlZmluZWQnIHx8IGlzUGxhaW4ob3B0aW9ucy52b2x1bWVCYXIpKSB7XG4gICAgICBvcHRpb25zLnZvbHVtZUJhciA9IG9wdGlvbnMudm9sdW1lQmFyIHx8IHt9O1xuICAgICAgb3B0aW9ucy52b2x1bWVCYXIudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsO1xuICAgIH1cblxuICAgIC8vIGhpZGUgdGhpcyBjb250cm9sIGlmIHZvbHVtZSBzdXBwb3J0IGlzIG1pc3NpbmdcbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIGNoZWNrVm9sdW1lU3VwcG9ydChfdGhpcywgcGxheWVyKTtcblxuICAgIF90aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlTW92ZSA9IHRocm90dGxlKGJpbmQoX3RoaXMsIF90aGlzLmhhbmRsZU1vdXNlTW92ZSksIDI1KTtcblxuICAgIF90aGlzLm9uKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIF90aGlzLm9uKCd0b3VjaHN0YXJ0JywgX3RoaXMuaGFuZGxlTW91c2VEb3duKTtcblxuICAgIC8vIHdoaWxlIHRoZSBzbGlkZXIgaXMgYWN0aXZlICh0aGUgbW91c2UgaGFzIGJlZW4gcHJlc3NlZCBkb3duIGFuZFxuICAgIC8vIGlzIGRyYWdnaW5nKSBvciBpbiBmb2N1cyB3ZSBkbyBub3Qgd2FudCB0byBoaWRlIHRoZSBWb2x1bWVCYXJcbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnZm9jdXMnLCAnc2xpZGVyYWN0aXZlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnZvbHVtZUJhci5hZGRDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTtcbiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICAgICAgX3RoaXMudHJpZ2dlcignc2xpZGVyYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnYmx1cicsICdzbGlkZXJpbmFjdGl2ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy52b2x1bWVCYXIucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7XG4gICAgICBfdGhpcy5yZW1vdmVDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTtcbiAgICAgIF90aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lQ29udHJvbC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICB2YXIgb3JpZW50YXRpb25DbGFzcyA9ICd2anMtdm9sdW1lLWhvcml6b250YWwnO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udmVydGljYWwpIHtcbiAgICAgIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS12ZXJ0aWNhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtY29udHJvbCB2anMtY29udHJvbCAnICsgb3JpZW50YXRpb25DbGFzc1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50cyBvbiB0aGUgYFZvbHVtZUNvbnRyb2xgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vkb3duXG4gICAqIEBsaXN0ZW5zIHRvdWNoc3RhcnRcbiAgICovXG5cblxuICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgZG9jID0gdGhpcy5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIHRoaXMub24oZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2htb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vbihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudHMgb24gdGhlIGBWb2x1bWVDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIG1vdXNldXBcbiAgICovXG5cblxuICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldmVudCkge1xuICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgVm9sdW1lQ29udHJvbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICogQGxpc3RlbnMgdG91Y2hzdGFydFxuICAgKi9cblxuXG4gIFZvbHVtZUNvbnRyb2wucHJvdG90eXBlLmhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgIHRoaXMudm9sdW1lQmFyLmhhbmRsZU1vdXNlTW92ZShldmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUNvbnRyb2w7XG59KENvbXBvbmVudCk7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Wb2x1bWVDb250cm9sLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsndm9sdW1lQmFyJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lQ29udHJvbCcsIFZvbHVtZUNvbnRyb2wpO1xuXG4vKipcbiAqIENoZWNrIGlmIG11dGluZyB2b2x1bWUgaXMgc3VwcG9ydGVkIGFuZCBpZiBpdCBpc24ndCBoaWRlIHRoZSBtdXRlIHRvZ2dsZVxuICogYnV0dG9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzZWxmXG4gKiAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIG11dGUgdG9nZ2xlIGJ1dHRvblxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGNoZWNrTXV0ZVN1cHBvcnQgPSBmdW5jdGlvbiBjaGVja011dGVTdXBwb3J0KHNlbGYsIHBsYXllcikge1xuICAvLyBoaWRlIG11dGUgdG9nZ2xlIGJ1dHRvbiBpZiBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgdGVjaFxuICBpZiAocGxheWVyLnRlY2hfICYmICFwbGF5ZXIudGVjaF8uZmVhdHVyZXNNdXRlQ29udHJvbCkge1xuICAgIHNlbGYuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfVxuXG4gIHNlbGYub24ocGxheWVyLCAnbG9hZHN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGxheWVyLnRlY2hfLmZlYXR1cmVzTXV0ZUNvbnRyb2wpIHtcbiAgICAgIHNlbGYuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEBmaWxlIG11dGUtdG9nZ2xlLmpzXG4gKi9cbi8qKlxuICogQSBidXR0b24gY29tcG9uZW50IGZvciBtdXRpbmcgdGhlIGF1ZGlvLlxuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICovXG5cbnZhciBNdXRlVG9nZ2xlID0gZnVuY3Rpb24gKF9CdXR0b24pIHtcbiAgaW5oZXJpdHMoTXV0ZVRvZ2dsZSwgX0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBNdXRlVG9nZ2xlKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE11dGVUb2dnbGUpO1xuXG4gICAgLy8gaGlkZSB0aGlzIGNvbnRyb2wgaWYgdm9sdW1lIHN1cHBvcnQgaXMgbWlzc2luZ1xuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgY2hlY2tNdXRlU3VwcG9ydChfdGhpcywgcGxheWVyKTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgWydsb2Fkc3RhcnQnLCAndm9sdW1lY2hhbmdlJ10sIF90aGlzLnVwZGF0ZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBNdXRlVG9nZ2xlLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1tdXRlLWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGFuIGBNdXRlVG9nZ2xlYCBpcyBcImNsaWNrZWRcIi4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTXV0ZVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHZhciB2b2wgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7XG4gICAgdmFyIGxhc3RWb2x1bWUgPSB0aGlzLnBsYXllcl8ubGFzdFZvbHVtZV8oKTtcblxuICAgIGlmICh2b2wgPT09IDApIHtcbiAgICAgIHZhciB2b2x1bWVUb1NldCA9IGxhc3RWb2x1bWUgPCAwLjEgPyAwLjEgOiBsYXN0Vm9sdW1lO1xuXG4gICAgICB0aGlzLnBsYXllcl8udm9sdW1lKHZvbHVtZVRvU2V0KTtcbiAgICAgIHRoaXMucGxheWVyXy5tdXRlZChmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5tdXRlZCh0aGlzLnBsYXllcl8ubXV0ZWQoKSA/IGZhbHNlIDogdHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGBNdXRlVG9nZ2xlYCBidXR0b24gYmFzZWQgb24gdGhlIHN0YXRlIG9mIGB2b2x1bWVgIGFuZCBgbXV0ZWRgXG4gICAqIG9uIHRoZSBwbGF5ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSB7QGxpbmsgUGxheWVyI2xvYWRzdGFydH0gZXZlbnQgaWYgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkXG4gICAqICAgICAgICB0aHJvdWdoIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqIEBsaXN0ZW5zIFBsYXllciN2b2x1bWVjaGFuZ2VcbiAgICovXG5cblxuICBNdXRlVG9nZ2xlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICB0aGlzLnVwZGF0ZUljb25fKCk7XG4gICAgdGhpcy51cGRhdGVDb250cm9sVGV4dF8oKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBgTXV0ZVRvZ2dsZWAgaWNvbi5cbiAgICpcbiAgICogUG9zc2libGUgc3RhdGVzIChnaXZlbiBgbGV2ZWxgIHZhcmlhYmxlIGJlbG93KTpcbiAgICogLSAwOiBjcm9zc2VkIG91dFxuICAgKiAtIDE6IHplcm8gYmFycyBvZiB2b2x1bWVcbiAgICogLSAyOiBvbmUgYmFyIG9mIHZvbHVtZVxuICAgKiAtIDM6IHR3byBiYXJzIG9mIHZvbHVtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIE11dGVUb2dnbGUucHJvdG90eXBlLnVwZGF0ZUljb25fID0gZnVuY3Rpb24gdXBkYXRlSWNvbl8oKSB7XG4gICAgdmFyIHZvbCA9IHRoaXMucGxheWVyXy52b2x1bWUoKTtcbiAgICB2YXIgbGV2ZWwgPSAzO1xuXG4gICAgLy8gaW4gaU9TIHdoZW4gYSBwbGF5ZXIgaXMgbG9hZGVkIHdpdGggbXV0ZWQgYXR0cmlidXRlXG4gICAgLy8gYW5kIHZvbHVtZSBpcyBjaGFuZ2VkIHdpdGggYSBuYXRpdmUgbXV0ZSBidXR0b25cbiAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBtdXRlZCBzdGF0ZSBpcyB1cGRhdGVkXG4gICAgaWYgKElTX0lPUykge1xuICAgICAgdGhpcy5wbGF5ZXJfLm11dGVkKHRoaXMucGxheWVyXy50ZWNoXy5lbF8ubXV0ZWQpO1xuICAgIH1cblxuICAgIGlmICh2b2wgPT09IDAgfHwgdGhpcy5wbGF5ZXJfLm11dGVkKCkpIHtcbiAgICAgIGxldmVsID0gMDtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuMzMpIHtcbiAgICAgIGxldmVsID0gMTtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuNjcpIHtcbiAgICAgIGxldmVsID0gMjtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGltcHJvdmUgbXV0ZWQgaWNvbiBjbGFzc2VzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIHJlbW92ZUNsYXNzKHRoaXMuZWxfLCAndmpzLXZvbC0nICsgaSk7XG4gICAgfVxuICAgIGFkZENsYXNzKHRoaXMuZWxfLCAndmpzLXZvbC0nICsgbGV2ZWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJZiBgbXV0ZWRgIGhhcyBjaGFuZ2VkIG9uIHRoZSBwbGF5ZXIsIHVwZGF0ZSB0aGUgY29udHJvbCB0ZXh0XG4gICAqIChgdGl0bGVgIGF0dHJpYnV0ZSBvbiBgdmpzLW11dGUtY29udHJvbGAgZWxlbWVudCBhbmQgY29udGVudCBvZlxuICAgKiBgdmpzLWNvbnRyb2wtdGV4dGAgZWxlbWVudCkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgTXV0ZVRvZ2dsZS5wcm90b3R5cGUudXBkYXRlQ29udHJvbFRleHRfID0gZnVuY3Rpb24gdXBkYXRlQ29udHJvbFRleHRfKCkge1xuICAgIHZhciBzb3VuZE9mZiA9IHRoaXMucGxheWVyXy5tdXRlZCgpIHx8IHRoaXMucGxheWVyXy52b2x1bWUoKSA9PT0gMDtcbiAgICB2YXIgdGV4dCA9IHNvdW5kT2ZmID8gJ1VubXV0ZScgOiAnTXV0ZSc7XG5cbiAgICBpZiAodGhpcy5jb250cm9sVGV4dCgpICE9PSB0ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRyb2xUZXh0KHRleHQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTXV0ZVRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBNdXRlVG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5NdXRlVG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnTXV0ZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTXV0ZVRvZ2dsZScsIE11dGVUb2dnbGUpO1xuXG4vKipcbiAqIEBmaWxlIHZvbHVtZS1jb250cm9sLmpzXG4gKi9cbi8vIFJlcXVpcmVkIGNoaWxkcmVuXG4vKipcbiAqIEEgQ29tcG9uZW50IHRvIGNvbnRhaW4gdGhlIE11dGVUb2dnbGUgYW5kIFZvbHVtZUNvbnRyb2wgc28gdGhhdFxuICogdGhleSBjYW4gd29yayB0b2dldGhlci5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgVm9sdW1lUGFuZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhWb2x1bWVQYW5lbCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBWb2x1bWVQYW5lbChwbGF5ZXIpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVm9sdW1lUGFuZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmlubGluZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuaW5saW5lID0gb3B0aW9ucy5pbmxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuaW5saW5lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwYXNzIHRoZSBpbmxpbmUgb3B0aW9uIGRvd24gdG8gdGhlIFZvbHVtZUNvbnRyb2wgYXMgdmVydGljYWwgaWZcbiAgICAvLyB0aGUgVm9sdW1lQ29udHJvbCBpcyBvbi5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudm9sdW1lQ29udHJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNQbGFpbihvcHRpb25zLnZvbHVtZUNvbnRyb2wpKSB7XG4gICAgICBvcHRpb25zLnZvbHVtZUNvbnRyb2wgPSBvcHRpb25zLnZvbHVtZUNvbnRyb2wgfHwge307XG4gICAgICBvcHRpb25zLnZvbHVtZUNvbnRyb2wudmVydGljYWwgPSAhb3B0aW9ucy5pbmxpbmU7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsIFsnbG9hZHN0YXJ0J10sIF90aGlzLnZvbHVtZVBhbmVsU3RhdGVfKTtcblxuICAgIC8vIHdoaWxlIHRoZSBzbGlkZXIgaXMgYWN0aXZlICh0aGUgbW91c2UgaGFzIGJlZW4gcHJlc3NlZCBkb3duIGFuZFxuICAgIC8vIGlzIGRyYWdnaW5nKSB3ZSBkbyBub3Qgd2FudCB0byBoaWRlIHRoZSBWb2x1bWVCYXJcbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVDb250cm9sLCBbJ3NsaWRlcmFjdGl2ZSddLCBfdGhpcy5zbGlkZXJBY3RpdmVfKTtcblxuICAgIF90aGlzLm9uKF90aGlzLnZvbHVtZUNvbnRyb2wsIFsnc2xpZGVyaW5hY3RpdmUnXSwgX3RoaXMuc2xpZGVySW5hY3RpdmVfKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHZqcy1zbGlkZXItYWN0aXZlIGNsYXNzIHRvIHRoZSBWb2x1bWVQYW5lbFxuICAgKlxuICAgKiBAbGlzdGVucyBWb2x1bWVDb250cm9sI3NsaWRlcmFjdGl2ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFZvbHVtZVBhbmVsLnByb3RvdHlwZS5zbGlkZXJBY3RpdmVfID0gZnVuY3Rpb24gc2xpZGVyQWN0aXZlXygpIHtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHZqcy1zbGlkZXItYWN0aXZlIGNsYXNzIHRvIHRoZSBWb2x1bWVQYW5lbFxuICAgKlxuICAgKiBAbGlzdGVucyBWb2x1bWVDb250cm9sI3NsaWRlcmluYWN0aXZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVm9sdW1lUGFuZWwucHJvdG90eXBlLnNsaWRlckluYWN0aXZlXyA9IGZ1bmN0aW9uIHNsaWRlckluYWN0aXZlXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIHZqcy1oaWRkZW4gb3IgdmpzLW11dGUtdG9nZ2xlLW9ubHkgdG8gdGhlIFZvbHVtZVBhbmVsXG4gICAqIGRlcGVuZGluZyBvbiBNdXRlVG9nZ2xlIGFuZCBWb2x1bWVDb250cm9sIHN0YXRlXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNsb2Fkc3RhcnRcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBWb2x1bWVQYW5lbC5wcm90b3R5cGUudm9sdW1lUGFuZWxTdGF0ZV8gPSBmdW5jdGlvbiB2b2x1bWVQYW5lbFN0YXRlXygpIHtcbiAgICAvLyBoaWRlIHZvbHVtZSBwYW5lbCBpZiBuZWl0aGVyIHZvbHVtZSBjb250cm9sIG9yIG11dGUgdG9nZ2xlXG4gICAgLy8gYXJlIGRpc3BsYXllZFxuICAgIGlmICh0aGlzLnZvbHVtZUNvbnRyb2wuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSAmJiB0aGlzLm11dGVUb2dnbGUuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH1cblxuICAgIC8vIGlmIG9ubHkgbXV0ZSB0b2dnbGUgaXMgdmlzaWJsZSB3ZSBkb24ndCB3YW50XG4gICAgLy8gdm9sdW1lIHBhbmVsIGV4cGFuZGluZyB3aGVuIGhvdmVyZWQgb3IgYWN0aXZlXG4gICAgaWYgKHRoaXMudm9sdW1lQ29udHJvbC5oYXNDbGFzcygndmpzLWhpZGRlbicpICYmICF0aGlzLm11dGVUb2dnbGUuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLW11dGUtdG9nZ2xlLW9ubHknKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lUGFuZWwucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgdmFyIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsJztcblxuICAgIGlmICghdGhpcy5vcHRpb25zXy5pbmxpbmUpIHtcbiAgICAgIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC12ZXJ0aWNhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtcGFuZWwgdmpzLWNvbnRyb2wgJyArIG9yaWVudGF0aW9uQ2xhc3NcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVm9sdW1lUGFuZWw7XG59KENvbXBvbmVudCk7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Wb2x1bWVQYW5lbC5wcm90b3R5cGUub3B0aW9uc18gPSB7XG4gIGNoaWxkcmVuOiBbJ211dGVUb2dnbGUnLCAndm9sdW1lQ29udHJvbCddXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZVBhbmVsJywgVm9sdW1lUGFuZWwpO1xuXG4vKipcbiAqIEBmaWxlIG1lbnUuanNcbiAqL1xuLyoqXG4gKiBUaGUgTWVudSBjb21wb25lbnQgaXMgdXNlZCB0byBidWlsZCBwb3B1cCBtZW51cywgaW5jbHVkaW5nIHN1YnRpdGxlIGFuZFxuICogY2FwdGlvbnMgc2VsZWN0aW9uIG1lbnVzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBNZW51ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTWVudSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICB0aGUgcGxheWVyIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIGF0dGFjaCB0b1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIE1lbnUocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBfdGhpcy5tZW51QnV0dG9uXyA9IG9wdGlvbnMubWVudUJ1dHRvbjtcbiAgICB9XG5cbiAgICBfdGhpcy5mb2N1c2VkQ2hpbGRfID0gLTE7XG5cbiAgICBfdGhpcy5vbigna2V5ZG93bicsIF90aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEge0BsaW5rIE1lbnVJdGVtfSB0byB0aGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBjb21wb25lbnRcbiAgICogICAgICAgIFRoZSBuYW1lIG9yIGluc3RhbmNlIG9mIHRoZSBgTWVudUl0ZW1gIHRvIGFkZC5cbiAgICpcbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5hZGRJdGVtID0gZnVuY3Rpb24gYWRkSXRlbShjb21wb25lbnQpIHtcbiAgICB0aGlzLmFkZENoaWxkKGNvbXBvbmVudCk7XG4gICAgY29tcG9uZW50Lm9uKCdjbGljaycsIGJpbmQodGhpcywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBVbnByZXNzIHRoZSBhc3NvY2lhdGVkIE1lbnVCdXR0b24sIGFuZCBtb3ZlIGZvY3VzIGJhY2sgdG8gaXRcbiAgICAgIGlmICh0aGlzLm1lbnVCdXR0b25fKSB7XG4gICAgICAgIHRoaXMubWVudUJ1dHRvbl8udW5wcmVzc0J1dHRvbigpO1xuXG4gICAgICAgIC8vIGRvbid0IGZvY3VzIG1lbnUgYnV0dG9uIGlmIGl0ZW0gaXMgYSBjYXB0aW9uIHNldHRpbmdzIGl0ZW1cbiAgICAgICAgLy8gYmVjYXVzZSBmb2N1cyB3aWxsIG1vdmUgZWxzZXdoZXJlIGFuZCBpdCBsb2dzIGFuIGVycm9yIG9uIElFOFxuICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUoKSAhPT0gJ0NhcHRpb25TZXR0aW5nc01lbnVJdGVtJykge1xuICAgICAgICAgIHRoaXMubWVudUJ1dHRvbl8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgTWVudWBzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIHRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBjb250ZW50RWxUeXBlID0gdGhpcy5vcHRpb25zXy5jb250ZW50RWxUeXBlIHx8ICd1bCc7XG5cbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbChjb250ZW50RWxUeXBlLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbWVudS1jb250ZW50J1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZW50RWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdtZW51Jyk7XG5cbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBhcHBlbmQ6IHRoaXMuY29udGVudEVsXyxcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tZW51J1xuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcblxuICAgIC8vIFByZXZlbnQgY2xpY2tzIGZyb20gYnViYmxpbmcgdXAuIE5lZWRlZCBmb3IgTWVudSBCdXR0b25zLFxuICAgIC8vIHdoZXJlIGEgY2xpY2sgb24gdGhlIHBhcmVudCBpcyBzaWduaWZpY2FudFxuICAgIG9uKGVsLCAnY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gdGhpcyBtZW51LiBUaGlzIGxpc3RlbmVyIGlzIGFkZGVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIEEgYGtleWRvd25gIGV2ZW50IHRoYXQgaGFwcGVuZWQgb24gdGhlIG1lbnUuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG4gICAgLy8gTGVmdCBhbmQgRG93biBBcnJvd3NcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM3IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTtcblxuICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93c1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSAzOSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEJhY2soKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gbmV4dCAobG93ZXIpIG1lbnUgaXRlbSBmb3Iga2V5Ym9hcmQgdXNlcnMuXG4gICAqL1xuXG5cbiAgTWVudS5wcm90b3R5cGUuc3RlcEZvcndhcmQgPSBmdW5jdGlvbiBzdGVwRm9yd2FyZCgpIHtcbiAgICB2YXIgc3RlcENoaWxkID0gMDtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfICsgMTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHByZXZpb3VzIChoaWdoZXIpIG1lbnUgaXRlbSBmb3Iga2V5Ym9hcmQgdXNlcnMuXG4gICAqL1xuXG5cbiAgTWVudS5wcm90b3R5cGUuc3RlcEJhY2sgPSBmdW5jdGlvbiBzdGVwQmFjaygpIHtcbiAgICB2YXIgc3RlcENoaWxkID0gMDtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfIC0gMTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgZm9jdXMgb24gYSB7QGxpbmsgTWVudUl0ZW19IGluIHRoZSBgTWVudWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gW2l0ZW09MF1cbiAgICogICAgICAgIEluZGV4IG9mIGNoaWxkIGl0ZW0gc2V0IGZvY3VzIG9uLlxuICAgKi9cblxuXG4gIE1lbnUucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgdmFyIGl0ZW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCkuc2xpY2UoKTtcbiAgICB2YXIgaGF2ZVRpdGxlID0gY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuWzBdLmNsYXNzTmFtZSAmJiAvdmpzLW1lbnUtdGl0bGUvLnRlc3QoY2hpbGRyZW5bMF0uY2xhc3NOYW1lKTtcblxuICAgIGlmIChoYXZlVGl0bGUpIHtcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChpdGVtIDwgMCkge1xuICAgICAgICBpdGVtID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSA+PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgaXRlbSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9jdXNlZENoaWxkXyA9IGl0ZW07XG5cbiAgICAgIGNoaWxkcmVuW2l0ZW1dLmVsXy5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWVudTtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51JywgTWVudSk7XG5cbi8qKlxuICogQGZpbGUgbWVudS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBBIGBNZW51QnV0dG9uYCBjbGFzcyBmb3IgYW55IHBvcHVwIHtAbGluayBNZW51fS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTWVudUJ1dHRvbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKE1lbnVCdXR0b24sIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gTWVudUJ1dHRvbihwbGF5ZXIpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudUJ1dHRvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm1lbnVCdXR0b25fID0gbmV3IEJ1dHRvbihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgX3RoaXMubWVudUJ1dHRvbl8uY29udHJvbFRleHQoX3RoaXMuY29udHJvbFRleHRfKTtcbiAgICBfdGhpcy5tZW51QnV0dG9uXy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWhhc3BvcHVwJywgJ3RydWUnKTtcblxuICAgIC8vIEFkZCBidWlsZENTU0NsYXNzIHZhbHVlcyB0byB0aGUgYnV0dG9uLCBub3QgdGhlIHdyYXBwZXJcbiAgICB2YXIgYnV0dG9uQ2xhc3MgPSBCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MoKTtcblxuICAgIF90aGlzLm1lbnVCdXR0b25fLmVsXy5jbGFzc05hbWUgPSBfdGhpcy5idWlsZENTU0NsYXNzKCkgKyAnICcgKyBidXR0b25DbGFzcztcbiAgICBfdGhpcy5tZW51QnV0dG9uXy5yZW1vdmVDbGFzcygndmpzLWNvbnRyb2wnKTtcblxuICAgIF90aGlzLmFkZENoaWxkKF90aGlzLm1lbnVCdXR0b25fKTtcblxuICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgX3RoaXMuZW5hYmxlZF8gPSB0cnVlO1xuXG4gICAgX3RoaXMub24oX3RoaXMubWVudUJ1dHRvbl8sICd0YXAnLCBfdGhpcy5oYW5kbGVDbGljayk7XG4gICAgX3RoaXMub24oX3RoaXMubWVudUJ1dHRvbl8sICdjbGljaycsIF90aGlzLmhhbmRsZUNsaWNrKTtcbiAgICBfdGhpcy5vbihfdGhpcy5tZW51QnV0dG9uXywgJ2ZvY3VzJywgX3RoaXMuaGFuZGxlRm9jdXMpO1xuICAgIF90aGlzLm9uKF90aGlzLm1lbnVCdXR0b25fLCAnYmx1cicsIF90aGlzLmhhbmRsZUJsdXIpO1xuXG4gICAgX3RoaXMub24oJ2tleWRvd24nLCBfdGhpcy5oYW5kbGVTdWJtZW51S2V5UHJlc3MpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1lbnUgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgaXRzIGl0ZW1zLlxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgbWVudSA9IHRoaXMuY3JlYXRlTWVudSgpO1xuXG4gICAgaWYgKHRoaXMubWVudSkge1xuICAgICAgdGhpcy5tZW51LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5tZW51KTtcbiAgICB9XG5cbiAgICB0aGlzLm1lbnUgPSBtZW51O1xuICAgIHRoaXMuYWRkQ2hpbGQobWVudSk7XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayB0aGUgc3RhdGUgb2YgdGhlIG1lbnUgYnV0dG9uXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuYnV0dG9uUHJlc3NlZF8gPSBmYWxzZTtcbiAgICB0aGlzLm1lbnVCdXR0b25fLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoIDw9IHRoaXMuaGlkZVRocmVzaG9sZF8pIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgbWVudSBhbmQgYWRkIGFsbCBpdGVtcyB0byBpdC5cbiAgICpcbiAgICogQHJldHVybiB7TWVudX1cbiAgICogICAgICAgICBUaGUgY29uc3RydWN0ZWQgbWVudVxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLmNyZWF0ZU1lbnUgPSBmdW5jdGlvbiBjcmVhdGVNZW51KCkge1xuICAgIHZhciBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXJfLCB7IG1lbnVCdXR0b246IHRoaXMgfSk7XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBtZW51IGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdGhyZXNob2xkLiBUaGlzIGRlZmF1bHRzXG4gICAgICogdG8gMCBhbmQgd2hlbmV2ZXIgd2UgYWRkIGl0ZW1zIHdoaWNoIGNhbiBiZSBoaWRkZW4gdG8gdGhlIG1lbnUgd2UnbGwgaW5jcmVtZW50IGl0LiBXZSBsaXN0XG4gICAgICogaXQgaGVyZSBiZWNhdXNlIGV2ZXJ5IHRpbWUgd2UgcnVuIGBjcmVhdGVNZW51YCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gPSAwO1xuXG4gICAgLy8gQWRkIGEgdGl0bGUgbGlzdCBpdGVtIHRvIHRoZSB0b3BcbiAgICBpZiAodGhpcy5vcHRpb25zXy50aXRsZSkge1xuICAgICAgdmFyIHRpdGxlID0gY3JlYXRlRWwoJ2xpJywge1xuICAgICAgICBjbGFzc05hbWU6ICd2anMtbWVudS10aXRsZScsXG4gICAgICAgIGlubmVySFRNTDogdG9UaXRsZUNhc2UodGhpcy5vcHRpb25zXy50aXRsZSksXG4gICAgICAgIHRhYkluZGV4OiAtMVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTtcblxuICAgICAgbWVudS5jaGlsZHJlbl8udW5zaGlmdCh0aXRsZSk7XG4gICAgICBwcmVwZW5kVG8odGl0bGUsIG1lbnUuY29udGVudEVsKCkpO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNyZWF0ZUl0ZW1zKCk7XG5cbiAgICBpZiAodGhpcy5pdGVtcykge1xuICAgICAgLy8gQWRkIG1lbnUgaXRlbXMgdG8gdGhlIG1lbnVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtZW51LmFkZEl0ZW0odGhpcy5pdGVtc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgbGlzdCBvZiBtZW51IGl0ZW1zLiBTcGVjaWZpYyB0byBlYWNoIHN1YmNsYXNzLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge307XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYE1lbnVCdXR0b25zYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkV3JhcHBlckNTU0NsYXNzKClcbiAgICB9LCB7fSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lcyBmb3IgdGhlIHdyYXBwZXIgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGNvbnN0cnVjdGVkIHdyYXBwZXIgRE9NIGBjbGFzc05hbWVgXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICB2YXIgbWVudUJ1dHRvbkNsYXNzID0gJ3Zqcy1tZW51LWJ1dHRvbic7XG5cbiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5pbmxpbmUgPT09IHRydWUpIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLWlubGluZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLXBvcHVwJztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaXggdGhlIENTUyBzbyB0aGF0IHRoaXMgaXNuJ3QgbmVjZXNzYXJ5XG4gICAgdmFyIGJ1dHRvbkNsYXNzID0gQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzKCk7XG5cbiAgICByZXR1cm4gJ3Zqcy1tZW51LWJ1dHRvbiAnICsgbWVudUJ1dHRvbkNsYXNzICsgJyAnICsgYnV0dG9uQ2xhc3MgKyAnICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICB2YXIgbWVudUJ1dHRvbkNsYXNzID0gJ3Zqcy1tZW51LWJ1dHRvbic7XG5cbiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5pbmxpbmUgPT09IHRydWUpIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLWlubGluZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLXBvcHVwJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3Zqcy1tZW51LWJ1dHRvbiAnICsgbWVudUJ1dHRvbkNsYXNzICsgJyAnICsgX0NvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBsb2NhbGl6ZWQgY29udHJvbCB0ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiA+IE5PVEU6IFRoaXMgd2lsbCBjb21lIGZyb20gdGhlIGludGVybmFsIGBtZW51QnV0dG9uX2AgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XVxuICAgKiAgICAgICAgQ29udHJvbCB0ZXh0IGZvciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLm1lbnVCdXR0b25fLmVsKCldXG4gICAqICAgICAgICBFbGVtZW50IHRvIHNldCB0aGUgdGl0bGUgb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAtIFRoZSBjb250cm9sIHRleHQgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHQgPSBmdW5jdGlvbiBjb250cm9sVGV4dCh0ZXh0KSB7XG4gICAgdmFyIGVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0aGlzLm1lbnVCdXR0b25fLmVsKCk7XG5cbiAgICByZXR1cm4gdGhpcy5tZW51QnV0dG9uXy5jb250cm9sVGV4dCh0ZXh0LCBlbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGNsaWNrIG9uIGEgYE1lbnVCdXR0b25gLlxuICAgKiBTZWUge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVDbGlja30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIC8vIFdoZW4geW91IGNsaWNrIHRoZSBidXR0b24gaXQgYWRkcyBmb2N1cywgd2hpY2ggd2lsbCBzaG93IHRoZSBtZW51LlxuICAgIC8vIFNvIHdlJ2xsIHJlbW92ZSBmb2N1cyB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGJ1dHRvbi4gRm9jdXMgaXMgbmVlZGVkXG4gICAgLy8gZm9yIHRhYiBuYXZpZ2F0aW9uLlxuXG4gICAgdGhpcy5vbmUodGhpcy5tZW51LmNvbnRlbnRFbCgpLCAnbW91c2VsZWF2ZScsIGJpbmQodGhpcywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpO1xuICAgICAgdGhpcy5lbF8uYmx1cigpO1xuICAgIH0pKTtcbiAgICBpZiAodGhpcy5idXR0b25QcmVzc2VkXykge1xuICAgICAgdGhpcy51bnByZXNzQnV0dG9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlc3NCdXR0b24oKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZm9jdXMgdG8gdGhlIGFjdHVhbCBidXR0b24sIG5vdCB0byB0aGlzIGVsZW1lbnRcbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgIHRoaXMubWVudUJ1dHRvbl8uZm9jdXMoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBmb2N1cyBmcm9tIHRoZSBhY3R1YWwgYnV0dG9uLCBub3QgdGhpcyBlbGVtZW50XG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgdGhpcy5tZW51QnV0dG9uXy5ibHVyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBNZW51QnV0dG9uYCBnYWlucyBmb2N1cyB2aWEgYSBgZm9jdXNgIGV2ZW50LlxuICAgKiBUdXJucyBvbiBsaXN0ZW5pbmcgZm9yIGBrZXlkb3duYCBldmVudHMuIFdoZW4gdGhleSBoYXBwZW4gaXRcbiAgICogY2FsbHMgYHRoaXMuaGFuZGxlS2V5UHJlc3NgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBmb2N1c2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGZvY3VzXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICBvbihkb2N1bWVudCwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBgTWVudUJ1dHRvbmAgbG9zZXMgZm9jdXMuIFR1cm5zIG9mZiB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIGBrZXlkb3duYCBldmVudHMuIFdoaWNoIFN0b3BzIGB0aGlzLmhhbmRsZUtleVByZXNzYCBmcm9tIGdldHRpbmcgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBibHVyYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgYmx1clxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIHRhYiwgZXNjYXBlLCBkb3duIGFycm93LCBhbmQgdXAgYXJyb3cga2V5cyBmb3IgYE1lbnVCdXR0b25gLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVLZXlQcmVzc30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG5cbiAgICAvLyBFc2NhcGUgKDI3KSBrZXkgb3IgVGFiICg5KSBrZXkgdW5wcmVzcyB0aGUgJ2J1dHRvbidcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDI3IHx8IGV2ZW50LndoaWNoID09PSA5KSB7XG4gICAgICBpZiAodGhpcy5idXR0b25QcmVzc2VkXykge1xuICAgICAgICB0aGlzLnVucHJlc3NCdXR0b24oKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHByZXZlbnREZWZhdWx0IGZvciBUYWIga2V5IC0gd2Ugc3RpbGwgd2FudCB0byBsb3NlIGZvY3VzXG4gICAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gU2V0IGZvY3VzIGJhY2sgdG8gdGhlIG1lbnUgYnV0dG9uJ3MgYnV0dG9uXG4gICAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICAvLyBVcCAoMzgpIGtleSBvciBEb3duICg0MCkga2V5IHByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgaWYgKCF0aGlzLmJ1dHRvblByZXNzZWRfKSB7XG4gICAgICAgIHRoaXMucHJlc3NCdXR0b24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBrZXlkb3duYCBldmVudCBvbiBhIHN1Yi1tZW51LiBUaGUgbGlzdGVuZXIgZm9yIHRoaXMgaXMgYWRkZWQgaW5cbiAgICogdGhlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgS2V5IHByZXNzIGV2ZW50XG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVTdWJtZW51S2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVTdWJtZW51S2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIEVzY2FwZSAoMjcpIGtleSBvciBUYWIgKDkpIGtleSB1bnByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMjcgfHwgZXZlbnQud2hpY2ggPT09IDkpIHtcbiAgICAgIGlmICh0aGlzLmJ1dHRvblByZXNzZWRfKSB7XG4gICAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcHJldmVudERlZmF1bHQgZm9yIFRhYiBrZXkgLSB3ZSBzdGlsbCB3YW50IHRvIGxvc2UgZm9jdXNcbiAgICAgIGlmIChldmVudC53aGljaCAhPT0gOSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBTZXQgZm9jdXMgYmFjayB0byB0aGUgbWVudSBidXR0b24ncyBidXR0b25cbiAgICAgICAgdGhpcy5tZW51QnV0dG9uXy5lbF8uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1dCB0aGUgY3VycmVudCBgTWVudUJ1dHRvbmAgaW50byBhIHByZXNzZWQgc3RhdGUuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUucHJlc3NCdXR0b24gPSBmdW5jdGlvbiBwcmVzc0J1dHRvbigpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkXykge1xuICAgICAgdGhpcy5idXR0b25QcmVzc2VkXyA9IHRydWU7XG4gICAgICB0aGlzLm1lbnUubG9ja1Nob3dpbmcoKTtcbiAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG5cbiAgICAgIC8vIHNldCB0aGUgZm9jdXMgaW50byB0aGUgc3VibWVudSwgZXhjZXB0IG9uIGlPUyB3aGVyZSBpdCBpcyByZXN1bHRpbmcgaW5cbiAgICAgIC8vIHVuZGVzaXJlZCBzY3JvbGxpbmcgYmVoYXZpb3Igd2hlbiB0aGUgcGxheWVyIGlzIGluIGFuIGlmcmFtZVxuICAgICAgaWYgKElTX0lPUyAmJiBpc0luRnJhbWUoKSkge1xuICAgICAgICAvLyBSZXR1cm4gZWFybHkgc28gdGhhdCB0aGUgbWVudSBpc24ndCBmb2N1c2VkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZW51LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBjdXJyZW50IGBNZW51QnV0dG9uYCBvdXQgb2YgYSBwcmVzc2VkIHN0YXRlLlxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLnVucHJlc3NCdXR0b24gPSBmdW5jdGlvbiB1bnByZXNzQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWRfKSB7XG4gICAgICB0aGlzLmJ1dHRvblByZXNzZWRfID0gZmFsc2U7XG4gICAgICB0aGlzLm1lbnUudW5sb2NrU2hvd2luZygpO1xuICAgICAgdGhpcy5tZW51QnV0dG9uXy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBgTWVudUJ1dHRvbmAuIERvbid0IGFsbG93IGl0IHRvIGJlIGNsaWNrZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgdGhpcy51bnByZXNzQnV0dG9uKCk7XG5cbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7XG5cbiAgICB0aGlzLm1lbnVCdXR0b25fLmRpc2FibGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBgTWVudUJ1dHRvbmAuIEFsbG93IGl0IHRvIGJlIGNsaWNrZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1kaXNhYmxlZCcpO1xuXG4gICAgdGhpcy5tZW51QnV0dG9uXy5lbmFibGUoKTtcbiAgfTtcblxuICByZXR1cm4gTWVudUJ1dHRvbjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51QnV0dG9uJywgTWVudUJ1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgdHJhY2stYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGJ1dHRvbnMgdGhhdCB0b2dnbGUgc3BlY2lmaWMgIHRyYWNrIHR5cGVzIChlLmcuIHN1YnRpdGxlcykuXG4gKlxuICogQGV4dGVuZHMgTWVudUJ1dHRvblxuICovXG5cbnZhciBUcmFja0J1dHRvbiA9IGZ1bmN0aW9uIChfTWVudUJ1dHRvbikge1xuICBpbmhlcml0cyhUcmFja0J1dHRvbiwgX01lbnVCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gVHJhY2tCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2tCdXR0b24pO1xuXG4gICAgdmFyIHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUJ1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgaWYgKF90aGlzLml0ZW1zLmxlbmd0aCA8PSAxKSB7XG4gICAgICBfdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0cmFja3MpIHtcbiAgICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlSGFuZGxlciA9IGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSk7XG5cbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB1cGRhdGVIYW5kbGVyKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB1cGRhdGVIYW5kbGVyKTtcbiAgICBfdGhpcy5wbGF5ZXJfLm9uKCdyZWFkeScsIHVwZGF0ZUhhbmRsZXIpO1xuXG4gICAgX3RoaXMucGxheWVyXy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHVwZGF0ZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdXBkYXRlSGFuZGxlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFRyYWNrQnV0dG9uO1xufShNZW51QnV0dG9uKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUcmFja0J1dHRvbicsIFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBtZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBUaGUgY29tcG9uZW50IGZvciBhIG1lbnUgaXRlbS4gYDxsaT5gXG4gKlxuICogQGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50XG4gKi9cblxudmFyIE1lbnVJdGVtID0gZnVuY3Rpb24gKF9DbGlja2FibGVDb21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTWVudUl0ZW0sIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIE1lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NsaWNrYWJsZUNvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMuc2VsZWN0YWJsZSA9IG9wdGlvbnMuc2VsZWN0YWJsZTtcbiAgICBfdGhpcy5pc1NlbGVjdGVkXyA9IG9wdGlvbnMuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgX3RoaXMubXVsdGlTZWxlY3RhYmxlID0gb3B0aW9ucy5tdWx0aVNlbGVjdGFibGU7XG5cbiAgICBfdGhpcy5zZWxlY3RlZChfdGhpcy5pc1NlbGVjdGVkXyk7XG5cbiAgICBpZiAoX3RoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgaWYgKF90aGlzLm11bHRpU2VsZWN0YWJsZSkge1xuICAgICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtY2hlY2tib3gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbWVudWl0ZW1yYWRpbycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtJyk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBNZW51SXRlbSdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1saV1cbiAgICogICAgICAgIEVsZW1lbnQncyBub2RlIHR5cGUsIG5vdCBhY3R1YWxseSB1c2VkLCBhbHdheXMgc2V0IHRvIGBsaWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFthdHRycz17fV1cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKHR5cGUsIHByb3BzLCBhdHRycykge1xuICAgIC8vIFRoZSBjb250cm9sIGlzIHRleHR1YWwsIG5vdCBqdXN0IGFuIGljb25cbiAgICB0aGlzLm5vbkljb25Db250cm9sID0gdHJ1ZTtcblxuICAgIHJldHVybiBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdsaScsIGFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbWVudS1pdGVtJyxcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPVwidmpzLW1lbnUtaXRlbS10ZXh0XCI+JyArIHRoaXMubG9jYWxpemUodGhpcy5vcHRpb25zXy5sYWJlbCkgKyAnPC9zcGFuPicsXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCBwcm9wcyksIGF0dHJzKTtcbiAgfTtcblxuICAvKipcbiAgICogQW55IGNsaWNrIG9uIGEgYE1lbnVJdGVtYCBwdXRzIGl0IGludG8gdGhlIHNlbGVjdGVkIHN0YXRlLlxuICAgKiBTZWUge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVDbGlja30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkKHRydWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXRlIGZvciB0aGlzIG1lbnUgaXRlbSBhcyBzZWxlY3RlZCBvciBub3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ZWRcbiAgICogICAgICAgIGlmIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQgb3Igbm90XG4gICAqL1xuXG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLnNlbGVjdGVkID0gZnVuY3Rpb24gc2VsZWN0ZWQoX3NlbGVjdGVkKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgaWYgKF9zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCAndHJ1ZScpO1xuICAgICAgICAvLyBhcmlhLWNoZWNrZWQgaXNuJ3QgZnVsbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzL3NjcmVlbiByZWFkZXJzLFxuICAgICAgICAvLyBzbyBpbmRpY2F0ZSBzZWxlY3RlZCBzdGF0ZSB0byBzY3JlZW4gcmVhZGVyIGluIHRoZSBjb250cm9sIHRleHQuXG4gICAgICAgIHRoaXMuY29udHJvbFRleHQoJywgc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgLy8gSW5kaWNhdGUgdW4tc2VsZWN0ZWQgc3RhdGUgdG8gc2NyZWVuIHJlYWRlclxuICAgICAgICB0aGlzLmNvbnRyb2xUZXh0KCcnKTtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkXyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWVudUl0ZW07XG59KENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudUl0ZW0nLCBNZW51SXRlbSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1tZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBUaGUgc3BlY2lmaWMgbWVudSBpdGVtIHR5cGUgZm9yIHNlbGVjdGluZyBhIGxhbmd1YWdlIHdpdGhpbiBhIHRleHQgdHJhY2sga2luZFxuICpcbiAqIEBleHRlbmRzIE1lbnVJdGVtXG4gKi9cblxudmFyIFRleHRUcmFja01lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhUZXh0VHJhY2tNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja01lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja01lbnVJdGVtKTtcblxuICAgIHZhciB0cmFjayA9IG9wdGlvbnMudHJhY2s7XG4gICAgdmFyIHRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7XG5cbiAgICAvLyBNb2RpZnkgb3B0aW9ucyBmb3IgcGFyZW50IE1lbnVJdGVtIGNsYXNzJ3MgaW5pdC5cbiAgICBvcHRpb25zLmxhYmVsID0gdHJhY2subGFiZWwgfHwgdHJhY2subGFuZ3VhZ2UgfHwgJ1Vua25vd24nO1xuICAgIG9wdGlvbnMuc2VsZWN0ZWQgPSB0cmFjay5tb2RlID09PSAnc2hvd2luZyc7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudHJhY2sgPSB0cmFjaztcbiAgICB2YXIgY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIGNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5oYW5kbGVUcmFja3NDaGFuZ2UuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgdmFyIHNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gc2VsZWN0ZWRMYW5ndWFnZUNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24oWydsb2Fkc3RhcnQnLCAndGV4dHRyYWNrY2hhbmdlJ10sIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0ZWRsYW5ndWFnZWNoYW5nZScsIHNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsYXllci5vZmYoWydsb2Fkc3RhcnQnLCAndGV4dHRyYWNrY2hhbmdlJ10sIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkbGFuZ3VhZ2VjaGFuZ2UnLCBzZWxlY3RlZExhbmd1YWdlQ2hhbmdlSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyBpT1M3IGRvZXNuJ3QgZGlzcGF0Y2ggY2hhbmdlIGV2ZW50cyB0byBUZXh0VHJhY2tMaXN0cyB3aGVuIGFuXG4gICAgLy8gYXNzb2NpYXRlZCB0cmFjaydzIG1vZGUgY2hhbmdlcy4gV2l0aG91dCBzb21ldGhpbmcgbGlrZVxuICAgIC8vIE9iamVjdC5vYnNlcnZlKCkgKGFsc28gbm90IHByZXNlbnQgb24gaU9TNyksIGl0J3Mgbm90XG4gICAgLy8gcG9zc2libGUgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlIG1vZGUgYXR0cmlidXRlIGFuZCBwb2x5ZmlsbFxuICAgIC8vIHRoZSBjaGFuZ2UgZXZlbnQuIEFzIGEgcG9vciBzdWJzdGl0dXRlLCB3ZSBtYW51YWxseSBkaXNwYXRjaFxuICAgIC8vIGNoYW5nZSBldmVudHMgd2hlbmV2ZXIgdGhlIGNvbnRyb2xzIG1vZGlmeSB0aGUgbW9kZS5cbiAgICBpZiAodHJhY2tzLm9uY2hhbmdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBldmVudCA9IHZvaWQgMDtcblxuICAgICAgX3RoaXMub24oWyd0YXAnLCAnY2xpY2snXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3R5cGVvZih3aW5kb3cuRXZlbnQpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vIEFuZHJvaWQgMi4zIHRocm93cyBhbiBJbGxlZ2FsIENvbnN0cnVjdG9yIGVycm9yIGZvciB3aW5kb3cuRXZlbnRcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgd2luZG93LkV2ZW50KCdjaGFuZ2UnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2tzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0IHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgdHJhY2tzXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgVGV4dFRyYWNrTWVudUl0ZW1gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB2YXIga2luZCA9IHRoaXMudHJhY2sua2luZDtcbiAgICB2YXIga2luZHMgPSB0aGlzLnRyYWNrLmtpbmRzO1xuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCFraW5kcykge1xuICAgICAga2luZHMgPSBba2luZF07XG4gICAgfVxuXG4gICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIGlmICghdHJhY2tzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrID09PSB0aGlzLnRyYWNrICYmIGtpbmRzLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkge1xuICAgICAgICBpZiAodHJhY2subW9kZSAhPT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgICAgdHJhY2subW9kZSA9ICdzaG93aW5nJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmFjay5tb2RlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgIHRyYWNrLm1vZGUgPSAnZGlzYWJsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgbGlzdCBjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBUZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlU2VsZWN0ZWQgPSB0aGlzLnRyYWNrLm1vZGUgPT09ICdzaG93aW5nJztcblxuICAgIC8vIFByZXZlbnQgcmVkdW5kYW50IHNlbGVjdGVkKCkgY2FsbHMgYmVjYXVzZSB0aGV5IG1heSBjYXVzZVxuICAgIC8vIHNjcmVlbiByZWFkZXJzIHRvIHJlYWQgdGhlIGFwcGVuZGVkIGNvbnRyb2wgdGV4dCB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKHNob3VsZEJlU2VsZWN0ZWQgIT09IHRoaXMuaXNTZWxlY3RlZF8pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQoc2hvdWxkQmVTZWxlY3RlZCk7XG4gICAgfVxuICB9O1xuXG4gIFRleHRUcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0ZWRMYW5ndWFnZUNoYW5nZShldmVudCkge1xuICAgIGlmICh0aGlzLnRyYWNrLm1vZGUgPT09ICdzaG93aW5nJykge1xuICAgICAgdmFyIHNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2U7XG5cbiAgICAgIC8vIERvbid0IHJlcGxhY2UgdGhlIGtpbmQgb2YgdHJhY2sgYWNyb3NzIHRoZSBzYW1lIGxhbmd1YWdlXG4gICAgICBpZiAoc2VsZWN0ZWRMYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmVuYWJsZWQgJiYgc2VsZWN0ZWRMYW5ndWFnZS5sYW5ndWFnZSA9PT0gdGhpcy50cmFjay5sYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmtpbmQgIT09IHRoaXMudHJhY2sua2luZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyXy5jYWNoZV8uc2VsZWN0ZWRMYW5ndWFnZSA9IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMudHJhY2subGFuZ3VhZ2UsXG4gICAgICAgIGtpbmQ6IHRoaXMudHJhY2sua2luZFxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdHJhY2sgb2JqZWN0IG9uIGRpc3Bvc2VcbiAgICB0aGlzLnRyYWNrID0gbnVsbDtcblxuICAgIF9NZW51SXRlbS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja01lbnVJdGVtJywgVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIG9mZi10ZXh0LXRyYWNrLW1lbnUtaXRlbS5qc1xuICovXG4vKipcbiAqIEEgc3BlY2lhbCBtZW51IGl0ZW0gZm9yIHR1cm5pbmcgb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHRleHQgdHJhY2tcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tNZW51SXRlbVxuICovXG5cbnZhciBPZmZUZXh0VHJhY2tNZW51SXRlbSA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrTWVudUl0ZW0pIHtcbiAgaW5oZXJpdHMoT2ZmVGV4dFRyYWNrTWVudUl0ZW0sIF9UZXh0VHJhY2tNZW51SXRlbSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBPZmZUZXh0VHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPZmZUZXh0VHJhY2tNZW51SXRlbSk7XG5cbiAgICAvLyBDcmVhdGUgcHNldWRvIHRyYWNrIGluZm9cbiAgICAvLyBSZXF1aXJlcyBvcHRpb25zWydraW5kJ11cbiAgICBvcHRpb25zLnRyYWNrID0ge1xuICAgICAgcGxheWVyOiBwbGF5ZXIsXG4gICAgICBraW5kOiBvcHRpb25zLmtpbmQsXG4gICAgICBraW5kczogb3B0aW9ucy5raW5kcyxcbiAgICAgICdkZWZhdWx0JzogZmFsc2UsXG4gICAgICBtb2RlOiAnZGlzYWJsZWQnXG4gICAgfTtcblxuICAgIGlmICghb3B0aW9ucy5raW5kcykge1xuICAgICAgb3B0aW9ucy5raW5kcyA9IFtvcHRpb25zLmtpbmRdO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmxhYmVsKSB7XG4gICAgICBvcHRpb25zLnRyYWNrLmxhYmVsID0gb3B0aW9ucy5sYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy50cmFjay5sYWJlbCA9IG9wdGlvbnMua2luZHMuam9pbignIGFuZCAnKSArICcgb2ZmJztcbiAgICB9XG5cbiAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAvLyBNZW51SXRlbSBpcyBOT1QgbXVsdGlTZWxlY3RhYmxlIChpLmUuIG9ubHkgb25lIGNhbiBiZSBtYXJrZWQgXCJzZWxlY3RlZFwiIGF0IGEgdGltZSlcbiAgICBvcHRpb25zLm11bHRpU2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja01lbnVJdGVtLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW5cbiAgICovXG5cblxuICBPZmZUZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpO1xuICAgIHZhciBzaG91bGRCZVNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdHJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zXy5raW5kcy5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIHNob3VsZEJlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCByZWR1bmRhbnQgc2VsZWN0ZWQoKSBjYWxscyBiZWNhdXNlIHRoZXkgbWF5IGNhdXNlXG4gICAgLy8gc2NyZWVuIHJlYWRlcnMgdG8gcmVhZCB0aGUgYXBwZW5kZWQgY29udHJvbCB0ZXh0IHVubmVjZXNzYXJpbHlcbiAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAhPT0gdGhpcy5pc1NlbGVjdGVkXykge1xuICAgICAgdGhpcy5zZWxlY3RlZChzaG91bGRCZVNlbGVjdGVkKTtcbiAgICB9XG4gIH07XG5cbiAgT2ZmVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpO1xuICAgIHZhciBhbGxIaWRkZW4gPSB0cnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0cmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGlmIChbJ2NhcHRpb25zJywgJ2Rlc2NyaXB0aW9ucycsICdzdWJ0aXRsZXMnXS5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIGFsbEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWxsSGlkZGVuKSB7XG4gICAgICB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2UgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gT2ZmVGV4dFRyYWNrTWVudUl0ZW07XG59KFRleHRUcmFja01lbnVJdGVtKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdPZmZUZXh0VHJhY2tNZW51SXRlbScsIE9mZlRleHRUcmFja01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBidXR0b25zIHRoYXQgdG9nZ2xlIHNwZWNpZmljIHRleHQgdHJhY2sgdHlwZXMgKGUuZy4gc3VidGl0bGVzKVxuICpcbiAqIEBleHRlbmRzIE1lbnVCdXR0b25cbiAqL1xuXG52YXIgVGV4dFRyYWNrQnV0dG9uID0gZnVuY3Rpb24gKF9UcmFja0J1dHRvbikge1xuICBpbmhlcml0cyhUZXh0VHJhY2tCdXR0b24sIF9UcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2tCdXR0b24ocGxheWVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja0J1dHRvbik7XG5cbiAgICBvcHRpb25zLnRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja01lbnVJdGVtW119IFtpdGVtcz1bXV1cbiAgICogICAgICAgIEV4aXN0aW5nIGFycmF5IG9mIGl0ZW1zIHRvIHVzZSBkdXJpbmcgY3JlYXRpb25cbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrTWVudUl0ZW1bXX1cbiAgICogICAgICAgICBBcnJheSBvZiBtZW51IGl0ZW1zIHRoYXQgd2VyZSBjcmVhdGVkXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge1xuICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgdmFyIFRyYWNrTWVudUl0ZW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFRleHRUcmFja01lbnVJdGVtO1xuXG5cbiAgICAvLyBMYWJlbCBpcyBhbiBvdmVyaWRlIGZvciB0aGUgW3RyYWNrXSBvZmYgbGFiZWxcbiAgICAvLyBVU2VkIHRvIGxvY2FsaXNlIGNhcHRpb25zL3N1YnRpdGxlc1xuICAgIHZhciBsYWJlbCA9IHZvaWQgMDtcblxuICAgIGlmICh0aGlzLmxhYmVsXykge1xuICAgICAgbGFiZWwgPSB0aGlzLmxhYmVsXyArICcgb2ZmJztcbiAgICB9XG4gICAgLy8gQWRkIGFuIE9GRiBtZW51IGl0ZW0gdG8gdHVybiBhbGwgdHJhY2tzIG9mZlxuICAgIGl0ZW1zLnB1c2gobmV3IE9mZlRleHRUcmFja01lbnVJdGVtKHRoaXMucGxheWVyXywge1xuICAgICAga2luZHM6IHRoaXMua2luZHNfLFxuICAgICAga2luZDogdGhpcy5raW5kXyxcbiAgICAgIGxhYmVsOiBsYWJlbFxuICAgIH0pKTtcblxuICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTtcblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMua2luZHNfKSkge1xuICAgICAgdGhpcy5raW5kc18gPSBbdGhpcy5raW5kX107XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgLy8gb25seSBhZGQgdHJhY2tzIHRoYXQgYXJlIG9mIGFuIGFwcHJvcHJpYXRlIGtpbmQgYW5kIGhhdmUgYSBsYWJlbFxuICAgICAgaWYgKHRoaXMua2luZHNfLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkge1xuXG4gICAgICAgIHZhciBpdGVtID0gbmV3IFRyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7XG4gICAgICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgICAgIC8vIE1lbnVJdGVtIGlzIHNlbGVjdGFibGVcbiAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIE1lbnVJdGVtIGlzIE5PVCBtdWx0aVNlbGVjdGFibGUgKGkuZS4gb25seSBvbmUgY2FuIGJlIG1hcmtlZCBcInNlbGVjdGVkXCIgYXQgYSB0aW1lKVxuICAgICAgICAgIG11bHRpU2VsZWN0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbS5hZGRDbGFzcygndmpzLScgKyB0cmFjay5raW5kICsgJy1tZW51LWl0ZW0nKTtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH07XG5cbiAgcmV0dXJuIFRleHRUcmFja0J1dHRvbjtcbn0oVHJhY2tCdXR0b24pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja0J1dHRvbicsIFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgY2hhcHRlcnMtdHJhY2stbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIGNoYXB0ZXIgdHJhY2sgbWVudSBpdGVtXG4gKlxuICogQGV4dGVuZHMgTWVudUl0ZW1cbiAqL1xuXG52YXIgQ2hhcHRlcnNUcmFja01lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhDaGFwdGVyc1RyYWNrTWVudUl0ZW0sIF9NZW51SXRlbSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBDaGFwdGVyc1RyYWNrTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcHRlcnNUcmFja01lbnVJdGVtKTtcblxuICAgIHZhciB0cmFjayA9IG9wdGlvbnMudHJhY2s7XG4gICAgdmFyIGN1ZSA9IG9wdGlvbnMuY3VlO1xuICAgIHZhciBjdXJyZW50VGltZSA9IHBsYXllci5jdXJyZW50VGltZSgpO1xuXG4gICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICBvcHRpb25zLm11bHRpU2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgIG9wdGlvbnMubGFiZWwgPSBjdWUudGV4dDtcbiAgICBvcHRpb25zLnNlbGVjdGVkID0gY3VlLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSAmJiBjdXJyZW50VGltZSA8IGN1ZS5lbmRUaW1lO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgX3RoaXMuY3VlID0gY3VlO1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSkpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYENoYXB0ZXJzVHJhY2tNZW51SXRlbWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIENoYXB0ZXJzVHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIF9NZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2suY2FsbCh0aGlzKTtcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUodGhpcy5jdWUuc3RhcnRUaW1lKTtcbiAgICB0aGlzLnVwZGF0ZSh0aGlzLmN1ZS5zdGFydFRpbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hhcHRlciBtZW51IGl0ZW1cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBjdWVjaGFuZ2VgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBUZXh0VHJhY2sjY3VlY2hhbmdlXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNUcmFja01lbnVJdGVtLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICB2YXIgY3VlID0gdGhpcy5jdWU7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICAvLyB2anMubG9nKGN1cnJlbnRUaW1lLCBjdWUuc3RhcnRUaW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkKGN1ZS5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBjdWUuZW5kVGltZSk7XG4gIH07XG5cbiAgcmV0dXJuIENoYXB0ZXJzVHJhY2tNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzVHJhY2tNZW51SXRlbScsIENoYXB0ZXJzVHJhY2tNZW51SXRlbSk7XG5cbi8qKlxuICogQGZpbGUgY2hhcHRlcnMtYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3RpbmcgY2hhcHRlcnNcbiAqIENoYXB0ZXJzIGFjdCBtdWNoIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgdGV4dCB0cmFja3NcbiAqIEN1ZXMgYXJlIG5hdmlnYXRpb24gdnMuIG90aGVyIHRyYWNrcyBvZiBhbHRlcm5hdGl2ZSBsYW5ndWFnZXNcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b25cbiAqL1xuXG52YXIgQ2hhcHRlcnNCdXR0b24gPSBmdW5jdGlvbiAoX1RleHRUcmFja0J1dHRvbikge1xuICBpbmhlcml0cyhDaGFwdGVyc0J1dHRvbiwgX1RleHRUcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIENoYXB0ZXJzQnV0dG9uKHBsYXllciwgb3B0aW9ucywgcmVhZHkpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDaGFwdGVyc0J1dHRvbik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNoYXB0ZXJzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNoYXB0ZXJzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtZW51IGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIGl0cyBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgQW4gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRleHRUcmFja0xpc3QjYWRkdHJhY2tcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNyZW1vdmV0cmFja1xuICAgKiBAbGlzdGVucyBUZXh0VHJhY2tMaXN0I2NoYW5nZVxuICAgKi9cblxuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudHJhY2tfIHx8IGV2ZW50ICYmIChldmVudC50eXBlID09PSAnYWRkdHJhY2snIHx8IGV2ZW50LnR5cGUgPT09ICdyZW1vdmV0cmFjaycpKSB7XG4gICAgICB0aGlzLnNldFRyYWNrKHRoaXMuZmluZENoYXB0ZXJzVHJhY2soKSk7XG4gICAgfVxuICAgIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmFjayBmb3IgdGhlIGNoYXB0ZXJzIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUaGUgbmV3IHRyYWNrIHRvIHNlbGVjdC4gTm90aGluZyB3aWxsIGNoYW5nZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWRcbiAgICogICAgICAgIHRyYWNrLlxuICAgKi9cblxuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5zZXRUcmFjayA9IGZ1bmN0aW9uIHNldFRyYWNrKHRyYWNrKSB7XG4gICAgaWYgKHRoaXMudHJhY2tfID09PSB0cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51cGRhdGVIYW5kbGVyXykge1xuICAgICAgdGhpcy51cGRhdGVIYW5kbGVyXyA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gaGVyZSB0aGlzLnRyYWNrXyByZWZlcnMgdG8gdGhlIG9sZCB0cmFjayBpbnN0YW5jZVxuICAgIGlmICh0aGlzLnRyYWNrXykge1xuICAgICAgdmFyIHJlbW90ZVRleHRUcmFja0VsID0gdGhpcy5wbGF5ZXJfLnJlbW90ZVRleHRUcmFja0VscygpLmdldFRyYWNrRWxlbWVudEJ5VHJhY2tfKHRoaXMudHJhY2tfKTtcblxuICAgICAgaWYgKHJlbW90ZVRleHRUcmFja0VsKSB7XG4gICAgICAgIHJlbW90ZVRleHRUcmFja0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLnVwZGF0ZUhhbmRsZXJfKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFja18gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudHJhY2tfID0gdHJhY2s7XG5cbiAgICAvLyBoZXJlIHRoaXMudHJhY2tfIHJlZmVycyB0byB0aGUgbmV3IHRyYWNrIGluc3RhbmNlXG4gICAgaWYgKHRoaXMudHJhY2tfKSB7XG4gICAgICB0aGlzLnRyYWNrXy5tb2RlID0gJ2hpZGRlbic7XG5cbiAgICAgIHZhciBfcmVtb3RlVGV4dFRyYWNrRWwgPSB0aGlzLnBsYXllcl8ucmVtb3RlVGV4dFRyYWNrRWxzKCkuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odGhpcy50cmFja18pO1xuXG4gICAgICBpZiAoX3JlbW90ZVRleHRUcmFja0VsKSB7XG4gICAgICAgIF9yZW1vdGVUZXh0VHJhY2tFbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpcy51cGRhdGVIYW5kbGVyXyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSB0cmFjayBvYmplY3QgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoaXMgQ2hhcHRlcnNCdXR0b25cbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrfHVuZGVmaW5lZH1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB0cmFjayBvciB1bmRlZmluZWQgaWYgbm9uZSB3YXMgZm91bmQuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmZpbmRDaGFwdGVyc1RyYWNrID0gZnVuY3Rpb24gZmluZENoYXB0ZXJzVHJhY2soKSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCkgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAvLyBXZSB3aWxsIGFsd2F5cyBjaG9vc2UgdGhlIGxhc3QgdHJhY2sgYXMgb3VyIGNoYXB0ZXJzVHJhY2tcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrLmtpbmQgPT09IHRoaXMua2luZF8pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjYXB0aW9uIGZvciB0aGUgQ2hhcHRlcnNCdXR0b24gYmFzZWQgb24gdGhlIHRyYWNrIGxhYmVsLiBUaGlzIHdpbGwgYWxzb1xuICAgKiB1c2UgdGhlIGN1cnJlbnQgdHJhY2tzIGxvY2FsaXplZCBraW5kIGFzIGEgZmFsbGJhY2sgaWYgYSBsYWJlbCBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSB0cmFja3MgY3VycmVudCBsYWJlbCBvciB0aGUgbG9jYWxpemVkIHRyYWNrIGtpbmQuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmdldE1lbnVDYXB0aW9uID0gZnVuY3Rpb24gZ2V0TWVudUNhcHRpb24oKSB7XG4gICAgaWYgKHRoaXMudHJhY2tfICYmIHRoaXMudHJhY2tfLmxhYmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja18ubGFiZWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvY2FsaXplKHRvVGl0bGVDYXNlKHRoaXMua2luZF8pKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIG1lbnUgZnJvbSBjaGFwdGVyIHRyYWNrXG4gICAqXG4gICAqIEByZXR1cm4ge01lbnV9XG4gICAqICAgICAgICAgTmV3IG1lbnUgZm9yIHRoZSBjaGFwdGVyIGJ1dHRvbnNcbiAgICovXG5cblxuICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbnUoKSB7XG4gICAgdGhpcy5vcHRpb25zXy50aXRsZSA9IHRoaXMuZ2V0TWVudUNhcHRpb24oKTtcbiAgICByZXR1cm4gX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tNZW51SXRlbVtdfVxuICAgKiAgICAgICAgIEFycmF5IG9mIG1lbnUgaXRlbXNcbiAgICovXG5cblxuICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcblxuICAgIGlmICghdGhpcy50cmFja18pIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICB2YXIgY3VlcyA9IHRoaXMudHJhY2tfLmN1ZXM7XG5cbiAgICBpZiAoIWN1ZXMpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGN1ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY3VlID0gY3Vlc1tpXTtcbiAgICAgIHZhciBtaSA9IG5ldyBDaGFwdGVyc1RyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7IHRyYWNrOiB0aGlzLnRyYWNrXywgY3VlOiBjdWUgfSk7XG5cbiAgICAgIGl0ZW1zLnB1c2gobWkpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfTtcblxuICByZXR1cm4gQ2hhcHRlcnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnY2hhcHRlcnMnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYENoYXB0ZXJzQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkNoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ2hhcHRlcnMnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzQnV0dG9uJywgQ2hhcHRlcnNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGRlc2NyaXB0aW9ucy1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b25cbiAqL1xuXG52YXIgRGVzY3JpcHRpb25zQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoRGVzY3JpcHRpb25zQnV0dG9uLCBfVGV4dFRyYWNrQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIERlc2NyaXB0aW9uc0J1dHRvbihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVzY3JpcHRpb25zQnV0dG9uKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIHZhciB0cmFja3MgPSBwbGF5ZXIudGV4dFRyYWNrcygpO1xuICAgIHZhciBjaGFuZ2VIYW5kbGVyID0gYmluZChfdGhpcywgX3RoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlKTtcblxuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW5cbiAgICpcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBEZXNjcmlwdGlvbnNCdXR0b24ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkge1xuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcigpLnRleHRUcmFja3MoKTtcbiAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgYSB0cmFjayBvZiBhIGRpZmZlcmVudCBraW5kIGlzIHNob3dpbmdcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRyYWNrcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrLmtpbmQgIT09IHRoaXMua2luZF8gJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYW5vdGhlciB0cmFjayBpcyBzaG93aW5nLCBkaXNhYmxlIHRoaXMgbWVudSBidXR0b25cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIERlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIERlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1kZXNjcmlwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBEZXNjcmlwdGlvbnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5EZXNjcmlwdGlvbnNCdXR0b24ucHJvdG90eXBlLmtpbmRfID0gJ2Rlc2NyaXB0aW9ucyc7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgRGVzY3JpcHRpb25zQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkRlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0Rlc2NyaXB0aW9ucyc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRGVzY3JpcHRpb25zQnV0dG9uJywgRGVzY3JpcHRpb25zQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBzdWJ0aXRsZXMtYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3Rpbmcgc3VidGl0bGVzXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIFN1YnRpdGxlc0J1dHRvbiA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrQnV0dG9uKSB7XG4gIGluaGVyaXRzKFN1YnRpdGxlc0J1dHRvbiwgX1RleHRUcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgcmVhZHkuXG4gICAqL1xuICBmdW5jdGlvbiBTdWJ0aXRsZXNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnRpdGxlc0J1dHRvbik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1zdWJ0aXRsZXMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXN1YnRpdGxlcy1idXR0b24gJyArIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIFN1YnRpdGxlc0J1dHRvbjtcbn0oVGV4dFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBga2luZGAgb2YgVGV4dFRyYWNrIHRvIGxvb2sgZm9yIHRvIGFzc29jaWF0ZSBpdCB3aXRoIHRoaXMgbWVudS5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cblN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnc3VidGl0bGVzJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBTdWJ0aXRsZXNCdXR0b25gcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnU3VidGl0bGVzJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTdWJ0aXRsZXNCdXR0b24nLCBTdWJ0aXRsZXNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGNhcHRpb24tc2V0dGluZ3MtbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIG1lbnUgaXRlbSBmb3IgY2FwdGlvbiB0cmFjayBzZXR0aW5ncyBtZW51XG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW1cbiAqL1xuXG52YXIgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0gPSBmdW5jdGlvbiAoX1RleHRUcmFja01lbnVJdGVtKSB7XG4gIGluaGVyaXRzKENhcHRpb25TZXR0aW5nc01lbnVJdGVtLCBfVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0pO1xuXG4gICAgb3B0aW9ucy50cmFjayA9IHtcbiAgICAgIHBsYXllcjogcGxheWVyLFxuICAgICAga2luZDogb3B0aW9ucy5raW5kLFxuICAgICAgbGFiZWw6IG9wdGlvbnMua2luZCArICcgc2V0dGluZ3MnLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAnZGVmYXVsdCc6IGZhbHNlLFxuICAgICAgbW9kZTogJ2Rpc2FibGVkJ1xuICAgIH07XG5cbiAgICAvLyBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSBoYXMgbm8gY29uY2VwdCBvZiAnc2VsZWN0ZWQnXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgICBvcHRpb25zLm5hbWUgPSAnQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0nO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGV4dFRyYWNrTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmFkZENsYXNzKCd2anMtdGV4dHRyYWNrLXNldHRpbmdzJyk7XG4gICAgX3RoaXMuY29udHJvbFRleHQoJywgb3BlbnMgJyArIG9wdGlvbnMua2luZCArICcgc2V0dGluZ3MgZGlhbG9nJyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW1gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHRoaXMucGxheWVyKCkuZ2V0Q2hpbGQoJ3RleHRUcmFja1NldHRpbmdzJykub3BlbigpO1xuICB9O1xuXG4gIHJldHVybiBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbTtcbn0oVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NhcHRpb25TZXR0aW5nc01lbnVJdGVtJywgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIGNhcHRpb25zLWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBidXR0b24gY29tcG9uZW50IGZvciB0b2dnbGluZyBhbmQgc2VsZWN0aW5nIGNhcHRpb25zXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIENhcHRpb25zQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoQ2FwdGlvbnNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldXG4gICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gQ2FwdGlvbnNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENhcHRpb25zQnV0dG9uKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGV4dFRyYWNrQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zLCByZWFkeSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY2FwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgQ2FwdGlvbnNCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY2FwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FwdGlvbiBtZW51IGl0ZW1zXG4gICAqXG4gICAqIEByZXR1cm4ge0NhcHRpb25TZXR0aW5nc01lbnVJdGVtW119XG4gICAqICAgICAgICAgVGhlIGFycmF5IG9mIGN1cnJlbnQgbWVudSBpdGVtcy5cbiAgICovXG5cblxuICBDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcblxuICAgIGlmICghKHRoaXMucGxheWVyKCkudGVjaF8gJiYgdGhpcy5wbGF5ZXIoKS50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpICYmIHRoaXMucGxheWVyKCkuZ2V0Q2hpbGQoJ3RleHRUcmFja1NldHRpbmdzJykpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV3IENhcHRpb25TZXR0aW5nc01lbnVJdGVtKHRoaXMucGxheWVyXywgeyBraW5kOiB0aGlzLmtpbmRfIH0pKTtcblxuICAgICAgdGhpcy5oaWRlVGhyZXNob2xkXyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcy5jYWxsKHRoaXMsIGl0ZW1zKTtcbiAgfTtcblxuICByZXR1cm4gQ2FwdGlvbnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnY2FwdGlvbnMnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYENhcHRpb25zQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkNhcHRpb25zQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ2FwdGlvbnMnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NhcHRpb25zQnV0dG9uJywgQ2FwdGlvbnNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIHN1YnMtY2Fwcy1tZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBTdWJzQ2Fwc01lbnVJdGVtIGhhcyBhbiBbY2NdIGljb24gdG8gZGlzdGluZ3Vpc2ggY2FwdGlvbnMgZnJvbSBzdWJ0aXRsZXNcbiAqIGluIHRoZSBTdWJzQ2Fwc01lbnUuXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW1cbiAqL1xuXG52YXIgU3Vic0NhcHNNZW51SXRlbSA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrTWVudUl0ZW0pIHtcbiAgaW5oZXJpdHMoU3Vic0NhcHNNZW51SXRlbSwgX1RleHRUcmFja01lbnVJdGVtKTtcblxuICBmdW5jdGlvbiBTdWJzQ2Fwc01lbnVJdGVtKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnNDYXBzTWVudUl0ZW0pO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UZXh0VHJhY2tNZW51SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFN1YnNDYXBzTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJzKSB7XG4gICAgdmFyIGlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInZqcy1tZW51LWl0ZW0tdGV4dFwiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udHJhY2sua2luZCA9PT0gJ2NhcHRpb25zJykge1xuICAgICAgaW5uZXJIVE1MICs9ICdcXG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmpzLWljb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4gJyArIHRoaXMubG9jYWxpemUoJ0NhcHRpb25zJykgKyAnPC9zcGFuPlxcbiAgICAgICc7XG4gICAgfVxuXG4gICAgaW5uZXJIVE1MICs9ICc8L3NwYW4+JztcblxuICAgIHZhciBlbCA9IF9UZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCB0eXBlLCBhc3NpZ24oe1xuICAgICAgaW5uZXJIVE1MOiBpbm5lckhUTUxcbiAgICB9LCBwcm9wcyksIGF0dHJzKTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICByZXR1cm4gU3Vic0NhcHNNZW51SXRlbTtcbn0oVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1N1YnNDYXBzTWVudUl0ZW0nLCBTdWJzQ2Fwc01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSBzdWItY2Fwcy1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBjYXB0aW9ucyBhbmQvb3Igc3VidGl0bGVzXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIFN1YnNDYXBzQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoU3Vic0NhcHNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pO1xuXG4gIGZ1bmN0aW9uIFN1YnNDYXBzQnV0dG9uKHBsYXllcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJzQ2Fwc0J1dHRvbik7XG5cbiAgICAvLyBBbHRob3VnaCBOb3J0aCBBbWVyaWNhIHVzZXMgXCJjYXB0aW9uc1wiIGluIG1vc3QgY2FzZXMgZm9yXG4gICAgLy8gXCJjYXB0aW9ucyBhbmQgc3VidGl0bGVzXCIgb3RoZXIgbG9jYWxlcyB1c2UgXCJzdWJ0aXRsZXNcIlxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMubGFiZWxfID0gJ3N1YnRpdGxlcyc7XG4gICAgaWYgKFsnZW4nLCAnZW4tdXMnLCAnZW4tY2EnLCAnZnItY2EnXS5pbmRleE9mKF90aGlzLnBsYXllcl8ubGFuZ3VhZ2VfKSA+IC0xKSB7XG4gICAgICBfdGhpcy5sYWJlbF8gPSAnY2FwdGlvbnMnO1xuICAgIH1cbiAgICBfdGhpcy5tZW51QnV0dG9uXy5jb250cm9sVGV4dCh0b1RpdGxlQ2FzZShfdGhpcy5sYWJlbF8pKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIFN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1zdWJzLWNhcHMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgU3Vic0NhcHNCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtc3Vicy1jYXBzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNhcHRpb24vc3VidGl0bGVzIG1lbnUgaXRlbXNcbiAgICpcbiAgICogQHJldHVybiB7Q2FwdGlvblNldHRpbmdzTWVudUl0ZW1bXX1cbiAgICogICAgICAgICBUaGUgYXJyYXkgb2YgY3VycmVudCBtZW51IGl0ZW1zLlxuICAgKi9cblxuXG4gIFN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuXG4gICAgaWYgKCEodGhpcy5wbGF5ZXIoKS50ZWNoXyAmJiB0aGlzLnBsYXllcigpLnRlY2hfLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykgJiYgdGhpcy5wbGF5ZXIoKS5nZXRDaGlsZCgndGV4dFRyYWNrU2V0dGluZ3MnKSkge1xuICAgICAgaXRlbXMucHVzaChuZXcgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7IGtpbmQ6IHRoaXMubGFiZWxfIH0pKTtcblxuICAgICAgdGhpcy5oaWRlVGhyZXNob2xkXyArPSAxO1xuICAgIH1cblxuICAgIGl0ZW1zID0gX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMuY2FsbCh0aGlzLCBpdGVtcywgU3Vic0NhcHNNZW51SXRlbSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9O1xuXG4gIHJldHVybiBTdWJzQ2Fwc0J1dHRvbjtcbn0oVGV4dFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBga2luZGBzIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge2FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuXG5cblN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5raW5kc18gPSBbJ2NhcHRpb25zJywgJ3N1YnRpdGxlcyddO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFN1YnNDYXBzQnV0dG9uYHMgY29udHJvbHMuXG4gKlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5TdWJzQ2Fwc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1N1YnRpdGxlcyc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnU3Vic0NhcHNCdXR0b24nLCBTdWJzQ2Fwc0J1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgYXVkaW8tdHJhY2stbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogQW4ge0BsaW5rIEF1ZGlvVHJhY2t9IHtAbGluayBNZW51SXRlbX1cbiAqXG4gKiBAZXh0ZW5kcyBNZW51SXRlbVxuICovXG5cbnZhciBBdWRpb1RyYWNrTWVudUl0ZW0gPSBmdW5jdGlvbiAoX01lbnVJdGVtKSB7XG4gIGluaGVyaXRzKEF1ZGlvVHJhY2tNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEF1ZGlvVHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrTWVudUl0ZW0pO1xuXG4gICAgdmFyIHRyYWNrID0gb3B0aW9ucy50cmFjaztcbiAgICB2YXIgdHJhY2tzID0gcGxheWVyLmF1ZGlvVHJhY2tzKCk7XG5cbiAgICAvLyBNb2RpZnkgb3B0aW9ucyBmb3IgcGFyZW50IE1lbnVJdGVtIGNsYXNzJ3MgaW5pdC5cbiAgICBvcHRpb25zLmxhYmVsID0gdHJhY2subGFiZWwgfHwgdHJhY2subGFuZ3VhZ2UgfHwgJ1Vua25vd24nO1xuICAgIG9wdGlvbnMuc2VsZWN0ZWQgPSB0cmFjay5lbmFibGVkO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnRyYWNrID0gdHJhY2s7XG5cbiAgICBfdGhpcy5hZGRDbGFzcygndmpzLScgKyB0cmFjay5raW5kICsgJy1tZW51LWl0ZW0nKTtcblxuICAgIHZhciBjaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gY2hhbmdlSGFuZGxlcigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZVRyYWNrc0NoYW5nZS5hcHBseShfdGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBBdWRpb1RyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJzKSB7XG4gICAgdmFyIGlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInZqcy1tZW51LWl0ZW0tdGV4dFwiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udHJhY2sua2luZCA9PT0gJ21haW4tZGVzYycpIHtcbiAgICAgIGlubmVySFRNTCArPSAnXFxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInZqcy1pY29uLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+ICcgKyB0aGlzLmxvY2FsaXplKCdEZXNjcmlwdGlvbnMnKSArICc8L3NwYW4+XFxuICAgICAgJztcbiAgICB9XG5cbiAgICBpbm5lckhUTUwgKz0gJzwvc3Bhbj4nO1xuXG4gICAgdmFyIGVsID0gX01lbnVJdGVtLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHR5cGUsIGFzc2lnbih7XG4gICAgICBpbm5lckhUTUw6IGlubmVySFRNTFxuICAgIH0sIHByb3BzKSwgYXR0cnMpO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYEF1ZGlvVHJhY2tNZW51SXRlbSBpcyBcImNsaWNrZWRcIi4gU2VlIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9XG4gICAqIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgQXVkaW9UcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy5hdWRpb1RyYWNrcygpO1xuXG4gICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIHRyYWNrLmVuYWJsZWQgPSB0cmFjayA9PT0gdGhpcy50cmFjaztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhbnkge0BsaW5rIEF1ZGlvVHJhY2t9IGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIHtAbGluayBBdWRpb1RyYWNrTGlzdCNjaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBBdWRpb1RyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkge1xuICAgIHRoaXMuc2VsZWN0ZWQodGhpcy50cmFjay5lbmFibGVkKTtcbiAgfTtcblxuICByZXR1cm4gQXVkaW9UcmFja01lbnVJdGVtO1xufShNZW51SXRlbSk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQXVkaW9UcmFja01lbnVJdGVtJywgQXVkaW9UcmFja01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSBhdWRpby10cmFjay1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYnV0dG9ucyB0aGF0IHRvZ2dsZSBzcGVjaWZpYyB7QGxpbmsgQXVkaW9UcmFja30gdHlwZXMuXG4gKlxuICogQGV4dGVuZHMgVHJhY2tCdXR0b25cbiAqL1xuXG52YXIgQXVkaW9UcmFja0J1dHRvbiA9IGZ1bmN0aW9uIChfVHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFja0J1dHRvbiwgX1RyYWNrQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEF1ZGlvVHJhY2tCdXR0b24ocGxheWVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEF1ZGlvVHJhY2tCdXR0b24pO1xuXG4gICAgb3B0aW9ucy50cmFja3MgPSBwbGF5ZXIuYXVkaW9UcmFja3MoKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBBdWRpb1RyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1hdWRpby1idXR0b24gJyArIF9UcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIEF1ZGlvVHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtYXVkaW8tYnV0dG9uICcgKyBfVHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lbnUgaXRlbSBmb3IgZWFjaCBhdWRpbyB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2tNZW51SXRlbVtdfSBbaXRlbXM9W11dXG4gICAqICAgICAgICBBbiBhcnJheSBvZiBleGlzdGluZyBtZW51IGl0ZW1zIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7QXVkaW9UcmFja01lbnVJdGVtW119XG4gICAqICAgICAgICAgQW4gYXJyYXkgb2YgbWVudSBpdGVtc1xuICAgKi9cblxuXG4gIEF1ZGlvVHJhY2tCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUl0ZW1zID0gZnVuY3Rpb24gY3JlYXRlSXRlbXMoKSB7XG4gICAgdmFyIGl0ZW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIC8vIGlmIHRoZXJlJ3Mgb25seSBvbmUgYXVkaW8gdHJhY2ssIHRoZXJlIG5vIHBvaW50IGluIHNob3dpbmcgaXRcbiAgICB0aGlzLmhpZGVUaHJlc2hvbGRfID0gMTtcblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8uYXVkaW9UcmFja3MoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGl0ZW1zLnB1c2gobmV3IEF1ZGlvVHJhY2tNZW51SXRlbSh0aGlzLnBsYXllcl8sIHtcbiAgICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIC8vIE1lbnVJdGVtIGlzIE5PVCBtdWx0aVNlbGVjdGFibGUgKGkuZS4gb25seSBvbmUgY2FuIGJlIG1hcmtlZCBcInNlbGVjdGVkXCIgYXQgYSB0aW1lKVxuICAgICAgICBtdWx0aVNlbGVjdGFibGU6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9O1xuXG4gIHJldHVybiBBdWRpb1RyYWNrQnV0dG9uO1xufShUcmFja0J1dHRvbik7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQXVkaW9UcmFja0J1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuQXVkaW9UcmFja0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0F1ZGlvIFRyYWNrJztcbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQXVkaW9UcmFja0J1dHRvbicsIEF1ZGlvVHJhY2tCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIHBsYXliYWNrLXJhdGUtbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIHNwZWNpZmljIG1lbnUgaXRlbSB0eXBlIGZvciBzZWxlY3RpbmcgYSBwbGF5YmFjayByYXRlLlxuICpcbiAqIEBleHRlbmRzIE1lbnVJdGVtXG4gKi9cblxudmFyIFBsYXliYWNrUmF0ZU1lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhQbGF5YmFja1JhdGVNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFBsYXliYWNrUmF0ZU1lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXliYWNrUmF0ZU1lbnVJdGVtKTtcblxuICAgIHZhciBsYWJlbCA9IG9wdGlvbnMucmF0ZTtcbiAgICB2YXIgcmF0ZSA9IHBhcnNlRmxvYXQobGFiZWwsIDEwKTtcblxuICAgIC8vIE1vZGlmeSBvcHRpb25zIGZvciBwYXJlbnQgTWVudUl0ZW0gY2xhc3MncyBpbml0LlxuICAgIG9wdGlvbnMubGFiZWwgPSBsYWJlbDtcbiAgICBvcHRpb25zLnNlbGVjdGVkID0gcmF0ZSA9PT0gMTtcbiAgICBvcHRpb25zLnNlbGVjdGFibGUgPSB0cnVlO1xuICAgIG9wdGlvbnMubXVsdGlTZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMubGFiZWwgPSBsYWJlbDtcbiAgICBfdGhpcy5yYXRlID0gcmF0ZTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgJ3JhdGVjaGFuZ2UnLCBfdGhpcy51cGRhdGUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXliYWNrUmF0ZU1lbnVJdGVtYCBpcyBcImNsaWNrZWRcIi4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgUGxheWJhY2tSYXRlTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBfTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrLmNhbGwodGhpcyk7XG4gICAgdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUodGhpcy5yYXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBQbGF5YmFja1JhdGVNZW51SXRlbSB3aGVuIHRoZSBwbGF5YmFja3JhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGByYXRlY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3JhdGVjaGFuZ2VcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51SXRlbS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZCh0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpID09PSB0aGlzLnJhdGUpO1xuICB9O1xuXG4gIHJldHVybiBQbGF5YmFja1JhdGVNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFBsYXliYWNrUmF0ZU1lbnVJdGVtYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5YmFja1JhdGVNZW51SXRlbS5wcm90b3R5cGUuY29udGVudEVsVHlwZSA9ICdidXR0b24nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXliYWNrUmF0ZU1lbnVJdGVtJywgUGxheWJhY2tSYXRlTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIHBsYXliYWNrLXJhdGUtbWVudS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgY29tcG9uZW50IGZvciBjb250cm9sbGluZyB0aGUgcGxheWJhY2sgcmF0ZS5cbiAqXG4gKiBAZXh0ZW5kcyBNZW51QnV0dG9uXG4gKi9cblxudmFyIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24gPSBmdW5jdGlvbiAoX01lbnVCdXR0b24pIHtcbiAgaW5oZXJpdHMoUGxheWJhY2tSYXRlTWVudUJ1dHRvbiwgX01lbnVCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUGxheWJhY2tSYXRlTWVudUJ1dHRvbihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5YmFja1JhdGVNZW51QnV0dG9uKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX01lbnVCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICBfdGhpcy51cGRhdGVMYWJlbCgpO1xuXG4gICAgX3RoaXMub24ocGxheWVyLCAnbG9hZHN0YXJ0JywgX3RoaXMudXBkYXRlVmlzaWJpbGl0eSk7XG4gICAgX3RoaXMub24ocGxheWVyLCAncmF0ZWNoYW5nZScsIF90aGlzLnVwZGF0ZUxhYmVsKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBlbCA9IF9NZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5sYWJlbEVsXyA9IGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtcGxheWJhY2stcmF0ZS12YWx1ZScsXG4gICAgICBpbm5lckhUTUw6ICcxeCdcbiAgICB9KTtcblxuICAgIGVsLmFwcGVuZENoaWxkKHRoaXMubGFiZWxFbF8pO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMubGFiZWxFbF8gPSBudWxsO1xuXG4gICAgX01lbnVCdXR0b24ucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXBsYXliYWNrLXJhdGUgJyArIF9NZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1wbGF5YmFjay1yYXRlICcgKyBfTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBwbGF5YmFjayByYXRlIG1lbnVcbiAgICpcbiAgICogQHJldHVybiB7TWVudX1cbiAgICogICAgICAgICBNZW51IG9iamVjdCBwb3B1bGF0ZWQgd2l0aCB7QGxpbmsgUGxheWJhY2tSYXRlTWVudUl0ZW19c1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNyZWF0ZU1lbnUgPSBmdW5jdGlvbiBjcmVhdGVNZW51KCkge1xuICAgIHZhciBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXIoKSk7XG4gICAgdmFyIHJhdGVzID0gdGhpcy5wbGF5YmFja1JhdGVzKCk7XG5cbiAgICBpZiAocmF0ZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSByYXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBtZW51LmFkZENoaWxkKG5ldyBQbGF5YmFja1JhdGVNZW51SXRlbSh0aGlzLnBsYXllcigpLCB7IHJhdGU6IHJhdGVzW2ldICsgJ3gnIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVudTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyBBUklBIGFjY2Vzc2liaWxpdHkgYXR0cmlidXRlc1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gdXBkYXRlQVJJQUF0dHJpYnV0ZXMoKSB7XG4gICAgLy8gQ3VycmVudCBwbGF5YmFjayByYXRlXG4gICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXliYWNrUmF0ZU1lbnVCdXR0b25gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgLy8gc2VsZWN0IG5leHQgcmF0ZSBvcHRpb25cbiAgICB2YXIgY3VycmVudFJhdGUgPSB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpO1xuICAgIHZhciByYXRlcyA9IHRoaXMucGxheWJhY2tSYXRlcygpO1xuXG4gICAgLy8gdGhpcyB3aWxsIHNlbGVjdCBmaXJzdCBvbmUgaWYgdGhlIGxhc3Qgb25lIGN1cnJlbnRseSBzZWxlY3RlZFxuICAgIHZhciBuZXdSYXRlID0gcmF0ZXNbMF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmF0ZXNbaV0gPiBjdXJyZW50UmF0ZSkge1xuICAgICAgICBuZXdSYXRlID0gcmF0ZXNbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZShuZXdSYXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHBsYXliYWNrIHJhdGVzXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKiAgICAgICAgIEFsbCBwb3NzaWJsZSBwbGF5YmFjayByYXRlc1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLnBsYXliYWNrUmF0ZXMgPSBmdW5jdGlvbiBwbGF5YmFja1JhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNfLnBsYXliYWNrUmF0ZXMgfHwgdGhpcy5vcHRpb25zXy5wbGF5ZXJPcHRpb25zICYmIHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy5wbGF5YmFja1JhdGVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciBwbGF5YmFjayByYXRlcyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRlY2hcbiAgICogYW5kIGFuIGFycmF5IG9mIHBsYXliYWNrIHJhdGVzIGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIFdoZXRoZXIgY2hhbmdpbmcgcGxheWJhY2sgcmF0ZSBpcyBzdXBwb3J0ZWRcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5wbGF5YmFja1JhdGVTdXBwb3J0ZWQgPSBmdW5jdGlvbiBwbGF5YmFja1JhdGVTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyKCkudGVjaF8gJiYgdGhpcy5wbGF5ZXIoKS50ZWNoXy5mZWF0dXJlc1BsYXliYWNrUmF0ZSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKS5sZW5ndGggPiAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWRlIHBsYXliYWNrIHJhdGUgY29udHJvbHMgd2hlbiB0aGV5J3JlIG5vIHBsYXliYWNrIHJhdGUgb3B0aW9ucyB0byBzZWxlY3RcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqL1xuXG5cbiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUudXBkYXRlVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIHVwZGF0ZVZpc2liaWxpdHkoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5YmFja1JhdGVTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgYnV0dG9uIGxhYmVsIHdoZW4gcmF0ZSBjaGFuZ2VkXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3JhdGVjaGFuZ2VcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS51cGRhdGVMYWJlbCA9IGZ1bmN0aW9uIHVwZGF0ZUxhYmVsKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucGxheWJhY2tSYXRlU3VwcG9ydGVkKCkpIHtcbiAgICAgIHRoaXMubGFiZWxFbF8uaW5uZXJIVE1MID0gdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUoKSArICd4JztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBsYXliYWNrUmF0ZU1lbnVCdXR0b247XG59KE1lbnVCdXR0b24pO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYEZ1bGxzY3JlZW5Ub2dnbGVgcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cblBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdQbGF5YmFjayBSYXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5YmFja1JhdGVNZW51QnV0dG9uJywgUGxheWJhY2tSYXRlTWVudUJ1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgc3BhY2VyLmpzXG4gKi9cbi8qKlxuICogSnVzdCBhbiBlbXB0eSBzcGFjZXIgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGFwcGVuZCBwb2ludCBmb3IgcGx1Z2lucywgZXRjLlxuICogQWxzbyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgU3BhY2VyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoU3BhY2VyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTcGFjZXIoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BhY2VyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG4gIFNwYWNlci5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtc3BhY2VyICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgU3BhY2VyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwYWNlcjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTcGFjZXInLCBTcGFjZXIpO1xuXG4vKipcbiAqIEBmaWxlIGN1c3RvbS1jb250cm9sLXNwYWNlci5qc1xuICovXG4vKipcbiAqIFNwYWNlciBzcGVjaWZpY2FsbHkgbWVhbnQgdG8gYmUgdXNlZCBhcyBhbiBpbnNlcnRpb24gcG9pbnQgZm9yIG5ldyBwbHVnaW5zLCBldGMuXG4gKlxuICogQGV4dGVuZHMgU3BhY2VyXG4gKi9cblxudmFyIEN1c3RvbUNvbnRyb2xTcGFjZXIgPSBmdW5jdGlvbiAoX1NwYWNlcikge1xuICBpbmhlcml0cyhDdXN0b21Db250cm9sU3BhY2VyLCBfU3BhY2VyKTtcblxuICBmdW5jdGlvbiBDdXN0b21Db250cm9sU3BhY2VyKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEN1c3RvbUNvbnRyb2xTcGFjZXIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9TcGFjZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgQ3VzdG9tQ29udHJvbFNwYWNlci5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyICcgKyBfU3BhY2VyLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgQ3VzdG9tQ29udHJvbFNwYWNlci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICB2YXIgZWwgPSBfU3BhY2VyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKClcbiAgICB9KTtcblxuICAgIC8vIE5vLWZsZXgvdGFibGUtY2VsbCBtb2RlIHJlcXVpcmVzIHRoZXJlIGJlIHNvbWUgY29udGVudFxuICAgIC8vIGluIHRoZSBjZWxsIHRvIGZpbGwgdGhlIHJlbWFpbmluZyBzcGFjZSBvZiB0aGUgdGFibGUuXG4gICAgZWwuaW5uZXJIVE1MID0gJ1xceEEwJztcbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgcmV0dXJuIEN1c3RvbUNvbnRyb2xTcGFjZXI7XG59KFNwYWNlcik7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ3VzdG9tQ29udHJvbFNwYWNlcicsIEN1c3RvbUNvbnRyb2xTcGFjZXIpO1xuXG4vKipcbiAqIEBmaWxlIGNvbnRyb2wtYmFyLmpzXG4gKi9cbi8vIFJlcXVpcmVkIGNoaWxkcmVuXG4vKipcbiAqIENvbnRhaW5lciBvZiBtYWluIGNvbnRyb2xzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBDb250cm9sQmFyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoQ29udHJvbEJhciwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29udHJvbEJhcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sQmFyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDb250cm9sQmFyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC1iYXInLFxuICAgICAgZGlyOiAnbHRyJ1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDb250cm9sQmFyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgYENvbnRyb2xCYXJgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Db250cm9sQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsncGxheVRvZ2dsZScsICd2b2x1bWVQYW5lbCcsICdjdXJyZW50VGltZURpc3BsYXknLCAndGltZURpdmlkZXInLCAnZHVyYXRpb25EaXNwbGF5JywgJ3Byb2dyZXNzQ29udHJvbCcsICdsaXZlRGlzcGxheScsICdyZW1haW5pbmdUaW1lRGlzcGxheScsICdjdXN0b21Db250cm9sU3BhY2VyJywgJ3BsYXliYWNrUmF0ZU1lbnVCdXR0b24nLCAnY2hhcHRlcnNCdXR0b24nLCAnZGVzY3JpcHRpb25zQnV0dG9uJywgJ3N1YnNDYXBzQnV0dG9uJywgJ2F1ZGlvVHJhY2tCdXR0b24nLCAnZnVsbHNjcmVlblRvZ2dsZSddXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NvbnRyb2xCYXInLCBDb250cm9sQmFyKTtcblxuLyoqXG4gKiBAZmlsZSBlcnJvci1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogQSBkaXNwbGF5IHRoYXQgaW5kaWNhdGVzIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSB2aWRlb1xuICogaXMgdW5wbGF5YWJsZS5cbiAqXG4gKiBAZXh0ZW5kcyBNb2RhbERpYWxvZ1xuICovXG5cbnZhciBFcnJvckRpc3BsYXkgPSBmdW5jdGlvbiAoX01vZGFsRGlhbG9nKSB7XG4gIGluaGVyaXRzKEVycm9yRGlzcGxheSwgX01vZGFsRGlhbG9nKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBFcnJvckRpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXJyb3JEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX01vZGFsRGlhbG9nLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdlcnJvcicsIF90aGlzLm9wZW4pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNS5cbiAgICovXG5cblxuICBFcnJvckRpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWVycm9yLWRpc3BsYXkgJyArIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiB0aGUgYFBsYXllcmBzIGVycm9yLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGBQbGF5ZXJgcyBlcnJvciBtZXNzYWdlIGxvY2FsaXplZCBvciBhbiBlbXB0eSBzdHJpbmcuXG4gICAqL1xuXG5cbiAgRXJyb3JEaXNwbGF5LnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gY29udGVudCgpIHtcbiAgICB2YXIgZXJyb3IgPSB0aGlzLnBsYXllcigpLmVycm9yKCk7XG5cbiAgICByZXR1cm4gZXJyb3IgPyB0aGlzLmxvY2FsaXplKGVycm9yLm1lc3NhZ2UpIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIEVycm9yRGlzcGxheTtcbn0oTW9kYWxEaWFsb2cpO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGFuIGBFcnJvckRpc3BsYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5FcnJvckRpc3BsYXkucHJvdG90eXBlLm9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcHRpb25zXywge1xuICBwYXVzZU9uT3BlbjogZmFsc2UsXG4gIGZpbGxBbHdheXM6IHRydWUsXG4gIHRlbXBvcmFyeTogZmFsc2UsXG4gIHVuY2xvc2VhYmxlOiB0cnVlXG59KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdFcnJvckRpc3BsYXknLCBFcnJvckRpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIHRleHQtdHJhY2stc2V0dGluZ3MuanNcbiAqL1xudmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gJ3Zqcy10ZXh0LXRyYWNrLXNldHRpbmdzJztcblxudmFyIENPTE9SX0JMQUNLID0gWycjMDAwJywgJ0JsYWNrJ107XG52YXIgQ09MT1JfQkxVRSA9IFsnIzAwRicsICdCbHVlJ107XG52YXIgQ09MT1JfQ1lBTiA9IFsnIzBGRicsICdDeWFuJ107XG52YXIgQ09MT1JfR1JFRU4gPSBbJyMwRjAnLCAnR3JlZW4nXTtcbnZhciBDT0xPUl9NQUdFTlRBID0gWycjRjBGJywgJ01hZ2VudGEnXTtcbnZhciBDT0xPUl9SRUQgPSBbJyNGMDAnLCAnUmVkJ107XG52YXIgQ09MT1JfV0hJVEUgPSBbJyNGRkYnLCAnV2hpdGUnXTtcbnZhciBDT0xPUl9ZRUxMT1cgPSBbJyNGRjAnLCAnWWVsbG93J107XG5cbnZhciBPUEFDSVRZX09QQVFVRSA9IFsnMScsICdPcGFxdWUnXTtcbnZhciBPUEFDSVRZX1NFTUkgPSBbJzAuNScsICdTZW1pLVRyYW5zcGFyZW50J107XG52YXIgT1BBQ0lUWV9UUkFOUyA9IFsnMCcsICdUcmFuc3BhcmVudCddO1xuXG4vLyBDb25maWd1cmF0aW9uIGZvciB0aGUgdmFyaW91cyA8c2VsZWN0PiBlbGVtZW50cyBpbiB0aGUgRE9NIG9mIHRoaXMgY29tcG9uZW50LlxuLy9cbi8vIFBvc3NpYmxlIGtleXMgaW5jbHVkZTpcbi8vXG4vLyBgZGVmYXVsdGA6XG4vLyAgIFRoZSBkZWZhdWx0IG9wdGlvbiBpbmRleC4gT25seSBuZWVkcyB0byBiZSBwcm92aWRlZCBpZiBub3QgemVyby5cbi8vIGBwYXJzZXJgOlxuLy8gICBBIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gcGFyc2UgdGhlIHZhbHVlIGZyb20gdGhlIHNlbGVjdGVkIG9wdGlvbiBpblxuLy8gICBhIGN1c3RvbWl6ZWQgd2F5LlxuLy8gYHNlbGVjdG9yYDpcbi8vICAgVGhlIHNlbGVjdG9yIHVzZWQgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCA8c2VsZWN0PiBlbGVtZW50LlxudmFyIHNlbGVjdENvbmZpZ3MgPSB7XG4gIGJhY2tncm91bmRDb2xvcjoge1xuICAgIHNlbGVjdG9yOiAnLnZqcy1iZy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLWNvbG9yLSVzJyxcbiAgICBsYWJlbDogJ0NvbG9yJyxcbiAgICBvcHRpb25zOiBbQ09MT1JfQkxBQ0ssIENPTE9SX1dISVRFLCBDT0xPUl9SRUQsIENPTE9SX0dSRUVOLCBDT0xPUl9CTFVFLCBDT0xPUl9ZRUxMT1csIENPTE9SX01BR0VOVEEsIENPTE9SX0NZQU5dXG4gIH0sXG5cbiAgYmFja2dyb3VuZE9wYWNpdHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtYmctb3BhY2l0eSA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLW9wYWNpdHktJXMnLFxuICAgIGxhYmVsOiAnVHJhbnNwYXJlbmN5JyxcbiAgICBvcHRpb25zOiBbT1BBQ0lUWV9PUEFRVUUsIE9QQUNJVFlfU0VNSSwgT1BBQ0lUWV9UUkFOU11cbiAgfSxcblxuICBjb2xvcjoge1xuICAgIHNlbGVjdG9yOiAnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1mb3JlZ3JvdW5kLWNvbG9yLSVzJyxcbiAgICBsYWJlbDogJ0NvbG9yJyxcbiAgICBvcHRpb25zOiBbQ09MT1JfV0hJVEUsIENPTE9SX0JMQUNLLCBDT0xPUl9SRUQsIENPTE9SX0dSRUVOLCBDT0xPUl9CTFVFLCBDT0xPUl9ZRUxMT1csIENPTE9SX01BR0VOVEEsIENPTE9SX0NZQU5dXG4gIH0sXG5cbiAgZWRnZVN0eWxlOiB7XG4gICAgc2VsZWN0b3I6ICcudmpzLWVkZ2Utc3R5bGUgPiBzZWxlY3QnLFxuICAgIGlkOiAnJXMnLFxuICAgIGxhYmVsOiAnVGV4dCBFZGdlIFN0eWxlJyxcbiAgICBvcHRpb25zOiBbWydub25lJywgJ05vbmUnXSwgWydyYWlzZWQnLCAnUmFpc2VkJ10sIFsnZGVwcmVzc2VkJywgJ0RlcHJlc3NlZCddLCBbJ3VuaWZvcm0nLCAnVW5pZm9ybSddLCBbJ2Ryb3BzaGFkb3cnLCAnRHJvcHNoYWRvdyddXVxuICB9LFxuXG4gIGZvbnRGYW1pbHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtZm9udC1mYW1pbHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtZm9udC1mYW1pbHktJXMnLFxuICAgIGxhYmVsOiAnRm9udCBGYW1pbHknLFxuICAgIG9wdGlvbnM6IFtbJ3Byb3BvcnRpb25hbFNhbnNTZXJpZicsICdQcm9wb3J0aW9uYWwgU2Fucy1TZXJpZiddLCBbJ21vbm9zcGFjZVNhbnNTZXJpZicsICdNb25vc3BhY2UgU2Fucy1TZXJpZiddLCBbJ3Byb3BvcnRpb25hbFNlcmlmJywgJ1Byb3BvcnRpb25hbCBTZXJpZiddLCBbJ21vbm9zcGFjZVNlcmlmJywgJ01vbm9zcGFjZSBTZXJpZiddLCBbJ2Nhc3VhbCcsICdDYXN1YWwnXSwgWydzY3JpcHQnLCAnU2NyaXB0J10sIFsnc21hbGwtY2FwcycsICdTbWFsbCBDYXBzJ11dXG4gIH0sXG5cbiAgZm9udFBlcmNlbnQ6IHtcbiAgICBzZWxlY3RvcjogJy52anMtZm9udC1wZXJjZW50ID4gc2VsZWN0JyxcbiAgICBpZDogJ2NhcHRpb25zLWZvbnQtc2l6ZS0lcycsXG4gICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgIG9wdGlvbnM6IFtbJzAuNTAnLCAnNTAlJ10sIFsnMC43NScsICc3NSUnXSwgWycxLjAwJywgJzEwMCUnXSwgWycxLjI1JywgJzEyNSUnXSwgWycxLjUwJywgJzE1MCUnXSwgWycxLjc1JywgJzE3NSUnXSwgWycyLjAwJywgJzIwMCUnXSwgWyczLjAwJywgJzMwMCUnXSwgWyc0LjAwJywgJzQwMCUnXV0sXG4gICAgJ2RlZmF1bHQnOiAyLFxuICAgIHBhcnNlcjogZnVuY3Rpb24gcGFyc2VyKHYpIHtcbiAgICAgIHJldHVybiB2ID09PSAnMS4wMCcgPyBudWxsIDogTnVtYmVyKHYpO1xuICAgIH1cbiAgfSxcblxuICB0ZXh0T3BhY2l0eToge1xuICAgIHNlbGVjdG9yOiAnLnZqcy10ZXh0LW9wYWNpdHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtZm9yZWdyb3VuZC1vcGFjaXR5LSVzJyxcbiAgICBsYWJlbDogJ1RyYW5zcGFyZW5jeScsXG4gICAgb3B0aW9uczogW09QQUNJVFlfT1BBUVVFLCBPUEFDSVRZX1NFTUldXG4gIH0sXG5cbiAgLy8gT3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYmVsb3cuXG4gIHdpbmRvd0NvbG9yOiB7XG4gICAgc2VsZWN0b3I6ICcudmpzLXdpbmRvdy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy13aW5kb3ctY29sb3ItJXMnLFxuICAgIGxhYmVsOiAnQ29sb3InXG4gIH0sXG5cbiAgLy8gT3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYmVsb3cuXG4gIHdpbmRvd09wYWNpdHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtd2luZG93LW9wYWNpdHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtd2luZG93LW9wYWNpdHktJXMnLFxuICAgIGxhYmVsOiAnVHJhbnNwYXJlbmN5JyxcbiAgICBvcHRpb25zOiBbT1BBQ0lUWV9UUkFOUywgT1BBQ0lUWV9TRU1JLCBPUEFDSVRZX09QQVFVRV1cbiAgfVxufTtcblxuc2VsZWN0Q29uZmlncy53aW5kb3dDb2xvci5vcHRpb25zID0gc2VsZWN0Q29uZmlncy5iYWNrZ3JvdW5kQ29sb3Iub3B0aW9ucztcblxuLyoqXG4gKiBHZXQgdGhlIGFjdHVhbCB2YWx1ZSBvZiBhbiBvcHRpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZVxuICogICAgICAgICBUaGUgdmFsdWUgdG8gZ2V0XG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IFtwYXJzZXJdXG4gKiAgICAgICAgIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgdmFsdWUuXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIC0gV2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSBleGlzdHNcbiAqICAgICAgICAgLSBXaWxsIGJlIGB1bmRlZmluZWRgIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBcIm5vbmVcIi5cbiAqICAgICAgICAgLSBXaWxsIGJlIHRoZSBhY3R1YWwgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uVmFsdWUodmFsdWUsIHBhcnNlcikge1xuICBpZiAocGFyc2VyKSB7XG4gICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpO1xuICB9XG5cbiAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAnbm9uZScpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgPG9wdGlvbj4gZWxlbWVudCB3aXRoaW4gYSA8c2VsZWN0PiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgIHRoZSBlbGVtZW50IHRvIGxvb2sgaW5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gW3BhcnNlcl1cbiAqICAgICAgICAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqICAgICAgICAgLSBXaWxsIGJlIGB1bmRlZmluZWRgIGlmIG5vIHZhbHVlIGV4aXN0c1xuICogICAgICAgICAtIFdpbGwgYmUgYHVuZGVmaW5lZGAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIFwibm9uZVwiLlxuICogICAgICAgICAtIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBvdGhlcndpc2UuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZShlbCwgcGFyc2VyKSB7XG4gIHZhciB2YWx1ZSA9IGVsLm9wdGlvbnNbZWwub3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcblxuICByZXR1cm4gcGFyc2VPcHRpb25WYWx1ZSh2YWx1ZSwgcGFyc2VyKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBzZWxlY3RlZCA8b3B0aW9uPiBlbGVtZW50IHdpdGhpbiBhIDxzZWxlY3Q+IGVsZW1lbnQgYmFzZWQgb24gYVxuICogZ2l2ZW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBlbGVtZW50IHRvIGxvb2sgaW4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgICAgICAgdGhlIHByb3BlcnR5IHRvIGxvb2sgb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3BhcnNlcl1cbiAqICAgICAgICBPcHRpb25hbCBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIHZhbHVlIGJlZm9yZSBjb21wYXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0ZWRPcHRpb24oZWwsIHZhbHVlLCBwYXJzZXIpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWwub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwYXJzZU9wdGlvblZhbHVlKGVsLm9wdGlvbnNbaV0udmFsdWUsIHBhcnNlcikgPT09IHZhbHVlKSB7XG4gICAgICBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1hbmlwdWxhdGUgVGV4dCBUcmFja3Mgc2V0dGluZ3MuXG4gKlxuICogQGV4dGVuZHMgTW9kYWxEaWFsb2dcbiAqL1xuXG52YXIgVGV4dFRyYWNrU2V0dGluZ3MgPSBmdW5jdGlvbiAoX01vZGFsRGlhbG9nKSB7XG4gIGluaGVyaXRzKFRleHRUcmFja1NldHRpbmdzLCBfTW9kYWxEaWFsb2cpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2tTZXR0aW5ncyhwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0VHJhY2tTZXR0aW5ncyk7XG5cbiAgICBvcHRpb25zLnRlbXBvcmFyeSA9IGZhbHNlO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTW9kYWxEaWFsb2cuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnVwZGF0ZURpc3BsYXkgPSBiaW5kKF90aGlzLCBfdGhpcy51cGRhdGVEaXNwbGF5KTtcblxuICAgIC8vIGZpbGwgdGhlIG1vZGFsIGFuZCBwcmV0ZW5kIHdlIGhhdmUgb3BlbmVkIGl0XG4gICAgX3RoaXMuZmlsbCgpO1xuICAgIF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSB0cnVlO1xuXG4gICAgX3RoaXMuZW5kRGlhbG9nID0gY3JlYXRlRWwoJ3AnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JyxcbiAgICAgIHRleHRDb250ZW50OiBfdGhpcy5sb2NhbGl6ZSgnRW5kIG9mIGRpYWxvZyB3aW5kb3cuJylcbiAgICB9KTtcbiAgICBfdGhpcy5lbCgpLmFwcGVuZENoaWxkKF90aGlzLmVuZERpYWxvZyk7XG5cbiAgICBfdGhpcy5zZXREZWZhdWx0cygpO1xuXG4gICAgLy8gR3JhYiBgcGVyc2lzdFRleHRUcmFja1NldHRpbmdzYCBmcm9tIHRoZSBwbGF5ZXIgb3B0aW9ucyBpZiBub3QgcGFzc2VkIGluIGNoaWxkIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX3RoaXMub3B0aW9uc18ucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID0gX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgX3RoaXMub24oX3RoaXMuJCgnLnZqcy1kb25lLWJ1dHRvbicpLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5vbihfdGhpcy4kKCcudmpzLWRlZmF1bHQtYnV0dG9uJyksICdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldERlZmF1bHRzKCk7XG4gICAgICBfdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG5cbiAgICBlYWNoKHNlbGVjdENvbmZpZ3MsIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIF90aGlzLm9uKF90aGlzLiQoY29uZmlnLnNlbGVjdG9yKSwgJ2NoYW5nZScsIF90aGlzLnVwZGF0ZURpc3BsYXkpO1xuICAgIH0pO1xuXG4gICAgaWYgKF90aGlzLm9wdGlvbnNfLnBlcnNpc3RUZXh0VHJhY2tTZXR0aW5ncykge1xuICAgICAgX3RoaXMucmVzdG9yZVNldHRpbmdzKCk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB0aGlzLmVuZERpYWxvZyA9IG51bGw7XG5cbiAgICBfTW9kYWxEaWFsb2cucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgPHNlbGVjdD4gZWxlbWVudCB3aXRoIGNvbmZpZ3VyZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiAgICAgICAgQ29uZmlndXJhdGlvbiBrZXkgdG8gdXNlIGR1cmluZyBjcmVhdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFNlbGVjdF8gPSBmdW5jdGlvbiBjcmVhdGVFbFNlbGVjdF8oa2V5KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgbGVnZW5kSWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgIHZhciB0eXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnbGFiZWwnO1xuXG4gICAgdmFyIGNvbmZpZyA9IHNlbGVjdENvbmZpZ3Nba2V5XTtcbiAgICB2YXIgaWQgPSBjb25maWcuaWQucmVwbGFjZSgnJXMnLCB0aGlzLmlkXyk7XG4gICAgdmFyIHNlbGVjdExhYmVsbGVkYnlJZHMgPSBbbGVnZW5kSWQsIGlkXS5qb2luKCcgJykudHJpbSgpO1xuXG4gICAgcmV0dXJuIFsnPCcgKyB0eXBlICsgJyBpZD1cIicgKyBpZCArICdcIiBjbGFzcz1cIicgKyAodHlwZSA9PT0gJ2xhYmVsJyA/ICd2anMtbGFiZWwnIDogJycpICsgJ1wiPicsIHRoaXMubG9jYWxpemUoY29uZmlnLmxhYmVsKSwgJzwvJyArIHR5cGUgKyAnPicsICc8c2VsZWN0IGFyaWEtbGFiZWxsZWRieT1cIicgKyBzZWxlY3RMYWJlbGxlZGJ5SWRzICsgJ1wiPiddLmNvbmNhdChjb25maWcub3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBvcHRpb25JZCA9IGlkICsgJy0nICsgb1sxXS5yZXBsYWNlKC9cXFcrL2csICcnKTtcblxuICAgICAgcmV0dXJuIFsnPG9wdGlvbiBpZD1cIicgKyBvcHRpb25JZCArICdcIiB2YWx1ZT1cIicgKyBvWzBdICsgJ1wiICcsICdhcmlhLWxhYmVsbGVkYnk9XCInICsgc2VsZWN0TGFiZWxsZWRieUlkcyArICcgJyArIG9wdGlvbklkICsgJ1wiPicsIF90aGlzMi5sb2NhbGl6ZShvWzFdKSwgJzwvb3B0aW9uPiddLmpvaW4oJycpO1xuICAgIH0pKS5jb25jYXQoJzwvc2VsZWN0PicpLmpvaW4oJycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgZm9yZWdyb3VuZCBjb2xvciBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBBbiBIVE1MIHN0cmluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY3JlYXRlRWxGZ0NvbG9yXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsRmdDb2xvcl8oKSB7XG4gICAgdmFyIGxlZ2VuZElkID0gJ2NhcHRpb25zLXRleHQtbGVnZW5kLScgKyB0aGlzLmlkXztcblxuICAgIHJldHVybiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mZy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1RleHQnKSwgJzwvbGVnZW5kPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdjb2xvcicsIGxlZ2VuZElkKSwgJzxzcGFuIGNsYXNzPVwidmpzLXRleHQtb3BhY2l0eSB2anMtb3BhY2l0eVwiPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCd0ZXh0T3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGJhY2tncm91bmQgY29sb3IgZWxlbWVudCBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgQW4gSFRNTCBzdHJpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsQmdDb2xvcl8gPSBmdW5jdGlvbiBjcmVhdGVFbEJnQ29sb3JfKCkge1xuICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLScgKyB0aGlzLmlkXztcblxuICAgIHJldHVybiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1iZy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ0JhY2tncm91bmQnKSwgJzwvbGVnZW5kPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdiYWNrZ3JvdW5kQ29sb3InLCBsZWdlbmRJZCksICc8c3BhbiBjbGFzcz1cInZqcy1iZy1vcGFjaXR5IHZqcy1vcGFjaXR5XCI+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ2JhY2tncm91bmRPcGFjaXR5JywgbGVnZW5kSWQpLCAnPC9zcGFuPicsICc8L2ZpZWxkc2V0PiddLmpvaW4oJycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgd2luZG93IGNvbG9yIGVsZW1lbnQgZm9yIHRoZSBjb21wb25lbnRcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFdpbkNvbG9yXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsV2luQ29sb3JfKCkge1xuICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy13aW5kb3ctJyArIHRoaXMuaWRfO1xuXG4gICAgcmV0dXJuIFsnPGZpZWxkc2V0IGNsYXNzPVwidmpzLXdpbmRvdy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1dpbmRvdycpLCAnPC9sZWdlbmQ+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ3dpbmRvd0NvbG9yJywgbGVnZW5kSWQpLCAnPHNwYW4gY2xhc3M9XCJ2anMtd2luZG93LW9wYWNpdHkgdmpzLW9wYWNpdHlcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0Xygnd2luZG93T3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNvbG9yIGVsZW1lbnRzIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbENvbG9yc18gPSBmdW5jdGlvbiBjcmVhdGVFbENvbG9yc18oKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdHJhY2stc2V0dGluZ3MtY29sb3JzJyxcbiAgICAgIGlubmVySFRNTDogW3RoaXMuY3JlYXRlRWxGZ0NvbG9yXygpLCB0aGlzLmNyZWF0ZUVsQmdDb2xvcl8oKSwgdGhpcy5jcmVhdGVFbFdpbkNvbG9yXygpXS5qb2luKCcnKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgZm9udCBlbGVtZW50cyBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsRm9udF8gPSBmdW5jdGlvbiBjcmVhdGVFbEZvbnRfKCkge1xuICAgIHJldHVybiBjcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXRyYWNrLXNldHRpbmdzLWZvbnQnLFxuICAgICAgaW5uZXJIVE1MOiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mb250LXBlcmNlbnQgdmpzLXRyYWNrLXNldHRpbmdcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnZm9udFBlcmNlbnQnLCAnJywgJ2xlZ2VuZCcpLCAnPC9maWVsZHNldD4nLCAnPGZpZWxkc2V0IGNsYXNzPVwidmpzLWVkZ2Utc3R5bGUgdmpzLXRyYWNrLXNldHRpbmdcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnZWRnZVN0eWxlJywgJycsICdsZWdlbmQnKSwgJzwvZmllbGRzZXQ+JywgJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mb250LWZhbWlseSB2anMtdHJhY2stc2V0dGluZ1wiPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdmb250RmFtaWx5JywgJycsICdsZWdlbmQnKSwgJzwvZmllbGRzZXQ+J10uam9pbignJylcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNvbnRyb2xzIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY3JlYXRlRWxDb250cm9sc18gPSBmdW5jdGlvbiBjcmVhdGVFbENvbnRyb2xzXygpIHtcbiAgICB2YXIgZGVmYXVsdHNEZXNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemUoJ3Jlc3RvcmUgYWxsIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcycpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMnLFxuICAgICAgaW5uZXJIVE1MOiBbJzxidXR0b24gY2xhc3M9XCJ2anMtZGVmYXVsdC1idXR0b25cIiB0aXRsZT1cIicgKyBkZWZhdWx0c0Rlc2NyaXB0aW9uICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1Jlc2V0JyksICc8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4gJyArIGRlZmF1bHRzRGVzY3JpcHRpb24gKyAnPC9zcGFuPicsICc8L2J1dHRvbj4nLCAnPGJ1dHRvbiBjbGFzcz1cInZqcy1kb25lLWJ1dHRvblwiPicgKyB0aGlzLmxvY2FsaXplKCdEb25lJykgKyAnPC9idXR0b24+J10uam9pbignJylcbiAgICB9KTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY29udGVudCA9IGZ1bmN0aW9uIGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmNyZWF0ZUVsQ29sb3JzXygpLCB0aGlzLmNyZWF0ZUVsRm9udF8oKSwgdGhpcy5jcmVhdGVFbENvbnRyb2xzXygpXTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSgnQ2FwdGlvbiBTZXR0aW5ncyBEaWFsb2cnKTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSgnQmVnaW5uaW5nIG9mIGRpYWxvZyB3aW5kb3cuIEVzY2FwZSB3aWxsIGNhbmNlbCBhbmQgY2xvc2UgdGhlIHdpbmRvdy4nKTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpICsgJyB2anMtdGV4dC10cmFjay1zZXR0aW5ncyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JqZWN0IG9mIHRleHQgdHJhY2sgc2V0dGluZ3MgKG9yIG51bGwpLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgQW4gb2JqZWN0IHdpdGggY29uZmlnIHZhbHVlcyBwYXJzZWQgZnJvbSB0aGUgRE9NIG9yIGxvY2FsU3RvcmFnZS5cbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gZ2V0VmFsdWVzKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHJlZHVjZShzZWxlY3RDb25maWdzLCBmdW5jdGlvbiAoYWNjdW0sIGNvbmZpZywga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKF90aGlzMy4kKGNvbmZpZy5zZWxlY3RvciksIGNvbmZpZy5wYXJzZXIpO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGV4dCB0cmFjayBzZXR0aW5ncyBmcm9tIGFuIG9iamVjdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXNcbiAgICogICAgICAgIEFuIG9iamVjdCB3aXRoIGNvbmZpZyB2YWx1ZXMgcGFyc2VkIGZyb20gdGhlIERPTSBvciBsb2NhbFN0b3JhZ2UuXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uIHNldFZhbHVlcyh2YWx1ZXMpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGVhY2goc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGNvbmZpZywga2V5KSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihfdGhpczQuJChjb25maWcuc2VsZWN0b3IpLCB2YWx1ZXNba2V5XSwgY29uZmlnLnBhcnNlcik7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgYWxsIGA8c2VsZWN0PmAgZWxlbWVudHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLnNldERlZmF1bHRzID0gZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICBlYWNoKHNlbGVjdENvbmZpZ3MsIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHZhciBpbmRleCA9IGNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gY29uZmlnWydkZWZhdWx0J10gOiAwO1xuXG4gICAgICBfdGhpczUuJChjb25maWcuc2VsZWN0b3IpLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzdG9yZSB0ZXh0dHJhY2sgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUucmVzdG9yZVNldHRpbmdzID0gZnVuY3Rpb24gcmVzdG9yZVNldHRpbmdzKCkge1xuICAgIHZhciB2YWx1ZXMgPSB2b2lkIDA7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWVzID0gSlNPTi5wYXJzZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVkpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyQxLndhcm4oZXJyKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzKSB7XG4gICAgICB0aGlzLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2F2ZSB0ZXh0IHRyYWNrIHNldHRpbmdzIHRvIGxvY2FsU3RvcmFnZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5zYXZlU2V0dGluZ3MgPSBmdW5jdGlvbiBzYXZlU2V0dGluZ3MoKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNfLnBlcnNpc3RUZXh0VHJhY2tTZXR0aW5ncykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyQxLndhcm4oZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaXNwbGF5IG9mIHRleHQgdHJhY2sgc2V0dGluZ3NcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUudXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgdmFyIHR0RGlzcGxheSA9IHRoaXMucGxheWVyXy5nZXRDaGlsZCgndGV4dFRyYWNrRGlzcGxheScpO1xuXG4gICAgaWYgKHR0RGlzcGxheSkge1xuICAgICAgdHREaXNwbGF5LnVwZGF0ZURpc3BsYXkoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbmRpdGlvbmFsbHkgYmx1ciB0aGUgZWxlbWVudCBhbmQgcmVmb2N1cyB0aGUgY2FwdGlvbnMgYnV0dG9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNvbmRpdGlvbmFsQmx1cl8gPSBmdW5jdGlvbiBjb25kaXRpb25hbEJsdXJfKCkge1xuICAgIHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXyA9IG51bGw7XG4gICAgdGhpcy5vZmYoZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcblxuICAgIHZhciBjYiA9IHRoaXMucGxheWVyXy5jb250cm9sQmFyO1xuICAgIHZhciBzdWJzQ2Fwc0J0biA9IGNiICYmIGNiLnN1YnNDYXBzQnV0dG9uO1xuICAgIHZhciBjY0J0biA9IGNiICYmIGNiLmNhcHRpb25zQnV0dG9uO1xuXG4gICAgaWYgKHN1YnNDYXBzQnRuKSB7XG4gICAgICBzdWJzQ2Fwc0J0bi5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoY2NCdG4pIHtcbiAgICAgIGNjQnRuLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tTZXR0aW5ncztcbn0oTW9kYWxEaWFsb2cpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja1NldHRpbmdzJywgVGV4dFRyYWNrU2V0dGluZ3MpO1xuXG4vKipcbiAqIEBmaWxlIHJlc2l6ZS1tYW5hZ2VyLmpzXG4gKi9cbi8qKlxuICogQSBSZXNpemUgTWFuYWdlci4gSXQgaXMgaW4gY2hhcmdlIG9mIHRyaWdnZXJpbmcgYHBsYXllcnJlc2l6ZWAgb24gdGhlIHBsYXllciBpbiB0aGUgcmlnaHQgY29uZGl0aW9ucy5cbiAqXG4gKiBJdCdsbCBlaXRoZXIgY3JlYXRlIGFuIGlmcmFtZSBhbmQgdXNlIGEgZGVib3VuY2VkIHJlc2l6ZSBoYW5kbGVyIG9uIGl0IG9yIHVzZSB0aGUgbmV3IHtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL1Jlc2l6ZU9ic2VydmVyL3xSZXNpemVPYnNlcnZlcn0uXG4gKlxuICogSWYgdGhlIFJlc2l6ZU9ic2VydmVyIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgaXQgd2lsbCBiZSB1c2VkLiBBIHBvbHlmaWxsIGNhbiBiZSBwYXNzZWQgaW4gYXMgYW4gb3B0aW9uLlxuICogSWYgYSBgcGxheWVycmVzaXplYCBldmVudCBpcyBub3QgbmVlZGVkLCB0aGUgUmVzaXplTWFuYWdlciBjb21wb25lbnQgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGxheWVyLCBzZWUgdGhlIGV4YW1wbGUgYmVsb3cuXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gZGlzYWJsZSB0aGUgcmVzaXplIG1hbmFnZXI8L2NhcHRpb24+XG4gKiBjb25zdCBwbGF5ZXIgPSB2aWRlb2pzKCcjdmlkJywge1xuICogICByZXNpemVNYW5hZ2VyOiBmYWxzZVxuICogfSk7XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9SZXNpemVPYnNlcnZlci98UmVzaXplT2JzZXJ2ZXIgc3BlY2lmaWNhdGlvbn1cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgUmVzaXplTWFuYWdlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFJlc2l6ZU1hbmFnZXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIFJlc2l6ZU1hbmFnZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIFJlc2l6ZU1hbmFnZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLlJlc2l6ZU9ic2VydmVyXVxuICAgKiAgICAgICAgQSBwb2x5ZmlsbCBmb3IgUmVzaXplT2JzZXJ2ZXIgY2FuIGJlIHBhc3NlZCBpbiBoZXJlLlxuICAgKiAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gbnVsbCBpdCB3aWxsIGlnbm9yZSB0aGUgbmF0aXZlIFJlc2l6ZU9ic2VydmVyIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGlmcmFtZSBmYWxsYmFjay5cbiAgICovXG4gIGZ1bmN0aW9uIFJlc2l6ZU1hbmFnZXIocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVzaXplTWFuYWdlcik7XG5cbiAgICB2YXIgUkVTSVpFX09CU0VSVkVSX0FWQUlMQUJMRSA9IG9wdGlvbnMuUmVzaXplT2JzZXJ2ZXIgfHwgd2luZG93LlJlc2l6ZU9ic2VydmVyO1xuXG4gICAgLy8gaWYgYG51bGxgIHdhcyBwYXNzZWQsIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGUgUmVzaXplT2JzZXJ2ZXJcbiAgICBpZiAob3B0aW9ucy5SZXNpemVPYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgUkVTSVpFX09CU0VSVkVSX0FWQUlMQUJMRSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY3JlYXRlIGFuIGVsZW1lbnQgd2hlbiBSZXNpemVPYnNlcnZlciBpc24ndCBhdmFpbGFibGVcbiAgICB2YXIgb3B0aW9uc18gPSBtZXJnZU9wdGlvbnMoeyBjcmVhdGVFbDogIVJFU0laRV9PQlNFUlZFUl9BVkFJTEFCTEUgfSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnNfKSk7XG5cbiAgICBfdGhpcy5SZXNpemVPYnNlcnZlciA9IG9wdGlvbnMuUmVzaXplT2JzZXJ2ZXIgfHwgd2luZG93LlJlc2l6ZU9ic2VydmVyO1xuICAgIF90aGlzLmxvYWRMaXN0ZW5lcl8gPSBudWxsO1xuICAgIF90aGlzLnJlc2l6ZU9ic2VydmVyXyA9IG51bGw7XG4gICAgX3RoaXMuZGVib3VuY2VkSGFuZGxlcl8gPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5yZXNpemVIYW5kbGVyKCk7XG4gICAgfSwgMTAwLCBmYWxzZSwgcGxheWVyKTtcblxuICAgIGlmIChSRVNJWkVfT0JTRVJWRVJfQVZBSUxBQkxFKSB7XG4gICAgICBfdGhpcy5yZXNpemVPYnNlcnZlcl8gPSBuZXcgX3RoaXMuUmVzaXplT2JzZXJ2ZXIoX3RoaXMuZGVib3VuY2VkSGFuZGxlcl8pO1xuICAgICAgX3RoaXMucmVzaXplT2JzZXJ2ZXJfLm9ic2VydmUocGxheWVyLmVsKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5sb2FkTGlzdGVuZXJfID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuZWxfLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICBvbihfdGhpcy5lbF8uY29udGVudFdpbmRvdywgJ3Jlc2l6ZScsIF90aGlzLmRlYm91bmNlZEhhbmRsZXJfKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5vZmYoJ2xvYWQnLCBfdGhpcy5sb2FkTGlzdGVuZXJfKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uKCdsb2FkJywgX3RoaXMubG9hZExpc3RlbmVyXyk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2lmcmFtZScsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1yZXNpemUtbWFuYWdlcidcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSByZXNpemUgaXMgdHJpZ2dlcmVkIG9uIHRoZSBpZnJhbWUgb3IgYSByZXNpemUgaXMgb2JzZXJ2ZWQgdmlhIHRoZSBSZXNpemVPYnNlcnZlclxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3BsYXllcnJlc2l6ZVxuICAgKi9cblxuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLnJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiByZXNpemVIYW5kbGVyKCkge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgc2l6ZSBoYXMgY2hhbmdlZFxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNwbGF5ZXJyZXNpemVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXJfLnRyaWdnZXIoJ3BsYXllcnJlc2l6ZScpO1xuICB9O1xuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyXykge1xuICAgICAgaWYgKHRoaXMucGxheWVyXy5lbCgpKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJfLnVub2JzZXJ2ZSh0aGlzLnBsYXllcl8uZWwoKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyXy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWxfICYmIHRoaXMuZWxfLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIG9mZih0aGlzLmVsXy5jb250ZW50V2luZG93LCAncmVzaXplJywgdGhpcy5kZWJvdW5jZWRIYW5kbGVyXyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9hZExpc3RlbmVyXykge1xuICAgICAgdGhpcy5vZmYoJ2xvYWQnLCB0aGlzLmxvYWRMaXN0ZW5lcl8pO1xuICAgIH1cblxuICAgIHRoaXMuUmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHRoaXMuZGVib3VuY2VkSGFuZGxlcl8gPSBudWxsO1xuICAgIHRoaXMubG9hZExpc3RlbmVyXyA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlc2l6ZU1hbmFnZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUmVzaXplTWFuYWdlcicsIFJlc2l6ZU1hbmFnZXIpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaXJlIGEgc291cmNlc2V0IHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nXG4gKiBzaW1pbGFyIHRvIGBtZWRpYUVsLmxvYWQoKWAgYmVpbmcgY2FsbGVkLiBJdCB3aWxsIHRyeSB0byBmaW5kIHRoZSBzb3VyY2UgdmlhXG4gKiB0aGUgYHNyY2AgYXR0cmlidXRlIGFuZCB0aGVuIHRoZSBgPHNvdXJjZT5gIGVsZW1lbnRzLiBJdCB3aWxsIHRoZW4gZmlyZSBgc291cmNlc2V0YFxuICogd2l0aCB0aGUgc291cmNlIHRoYXQgd2FzIGZvdW5kIG9yIGVtcHR5IHN0cmluZyBpZiB3ZSBjYW5ub3Qga25vdy4gSWYgaXQgY2Fubm90XG4gKiBmaW5kIGEgc291cmNlIHRoZW4gYHNvdXJjZXNldGAgd2lsbCBub3QgYmUgZmlyZWQuXG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSB0ZWNoIG9iamVjdCB0aGF0IHNvdXJjZXNldCB3YXMgc2V0dXAgb25cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICByZXR1cm5zIGZhbHNlIGlmIHRoZSBzb3VyY2VzZXQgd2FzIG5vdCBmaXJlZCBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKi9cbnZhciBzb3VyY2VzZXRMb2FkID0gZnVuY3Rpb24gc291cmNlc2V0TG9hZCh0ZWNoKSB7XG4gIHZhciBlbCA9IHRlY2guZWwoKTtcblxuICAvLyBpZiBgZWwuc3JjYCBpcyBzZXQsIHRoYXQgc291cmNlIHdpbGwgYmUgbG9hZGVkLlxuICBpZiAoZWwuaGFzQXR0cmlidXRlKCdzcmMnKSkge1xuICAgIHRlY2gudHJpZ2dlclNvdXJjZXNldChlbC5zcmMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHRoZXJlIGlzbid0IGEgc3JjIHByb3BlcnR5IG9uIHRoZSBtZWRpYSBlbGVtZW50LCBzb3VyY2UgZWxlbWVudHMgd2lsbCBiZSB1c2VkIGZvclxuICAgKiBpbXBsZW1lbnRpbmcgdGhlIHNvdXJjZSBzZWxlY3Rpb24gYWxnb3JpdGhtLiBUaGlzIGhhcHBlbnMgYXN5bmNocm9ub3VzbHkgYW5kXG4gICAqIGZvciBtb3N0IGNhc2VzIHdlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzb3VyY2Ugd2UgY2Fubm90IHRlbGwgd2hhdCBzb3VyY2Ugd2lsbFxuICAgKiBiZSBsb2FkZWQsIHdpdGhvdXQgcmUtaW1wbGVtZW50aW5nIHRoZSBzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobS4gQXQgdGhpcyB0aW1lIHdlIGFyZSBub3RcbiAgICogZ29pbmcgdG8gZG8gdGhhdC4gVGhlcmUgYXJlIHRocmVlIHNwZWNpYWwgY2FzZXMgdGhhdCB3ZSBkbyBoYW5kbGUgaGVyZSB0aG91Z2g6XG4gICAqXG4gICAqIDEuIElmIHRoZXJlIGFyZSBubyBzb3VyY2VzLCBkbyBub3QgZmlyZSBgc291cmNlc2V0YC5cbiAgICogMi4gSWYgdGhlcmUgaXMgb25seSBvbmUgYDxzb3VyY2U+YCB3aXRoIGEgYHNyY2AgcHJvcGVydHkvYXR0cmlidXRlIHRoYXQgaXMgb3VyIGBzcmNgXG4gICAqIDMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYDxzb3VyY2U+YCBidXQgYWxsIG9mIHRoZW0gaGF2ZSB0aGUgc2FtZSBgc3JjYCB1cmwuXG4gICAqICAgIFRoYXQgd2lsbCBiZSBvdXIgc3JjLlxuICAgKi9cbiAgdmFyIHNvdXJjZXMgPSB0ZWNoLiQkKCdzb3VyY2UnKTtcbiAgdmFyIHNyY1VybHMgPSBbXTtcbiAgdmFyIHNyYyA9ICcnO1xuXG4gIC8vIGlmIHRoZXJlIGFyZSBubyBzb3VyY2VzLCBkbyBub3QgZmlyZSBzb3VyY2VzZXRcbiAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgY291bnQgdmFsaWQvbm9uLWR1cGxpY2F0ZSBzb3VyY2UgZWxlbWVudHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHNvdXJjZXNbaV0uc3JjO1xuXG4gICAgaWYgKHVybCAmJiBzcmNVcmxzLmluZGV4T2YodXJsKSA9PT0gLTEpIHtcbiAgICAgIHNyY1VybHMucHVzaCh1cmwpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoZXJlIHdlcmUgbm8gdmFsaWQgc291cmNlc1xuICBpZiAoIXNyY1VybHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdGhlcmUgaXMgb25seSBvbmUgdmFsaWQgc291cmNlIGVsZW1lbnQgdXJsXG4gIC8vIHVzZSB0aGF0XG4gIGlmIChzcmNVcmxzLmxlbmd0aCA9PT0gMSkge1xuICAgIHNyYyA9IHNyY1VybHNbMF07XG4gIH1cblxuICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoc3JjKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBgaW5uZXJIVE1MYCBkZXNjcmlwdG9yIGZvciBicm93c2Vyc1xuICogdGhhdCBkbyBub3QgaGF2ZSBvbmUuXG4gKi9cbnZhciBpbm5lckhUTUxEZXNjcmlwdG9yUG9seWZpbGwgPSB7fTtcblxuaWYgKCFJU19JRTgpIHtcbiAgaW5uZXJIVE1MRGVzY3JpcHRvclBvbHlmaWxsID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnaW5uZXJIVE1MJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpLmlubmVySFRNTDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIC8vIG1ha2UgYSBkdW1teSBub2RlIHRvIHVzZSBpbm5lckhUTUwgb25cbiAgICAgIHZhciBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgLy8gc2V0IGlubmVySFRNTCB0byB0aGUgdmFsdWUgcHJvdmlkZWRcbiAgICAgIGR1bW15LmlubmVySFRNTCA9IHY7XG5cbiAgICAgIC8vIG1ha2UgYSBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBub2RlcyBmcm9tIGR1bW15XG4gICAgICB2YXIgZG9jRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgLy8gY29weSBhbGwgb2YgdGhlIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIGlubmVySFRNTCBvbiBkdW1teVxuICAgICAgLy8gdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50XG4gICAgICB3aGlsZSAoZHVtbXkuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgZG9jRnJhZy5hcHBlbmRDaGlsZChkdW1teS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVtb3ZlIGNvbnRlbnRcbiAgICAgIHRoaXMuaW5uZXJUZXh0ID0gJyc7XG5cbiAgICAgIC8vIG5vdyB3ZSBhZGQgYWxsIG9mIHRoYXQgaHRtbCBpbiBvbmUgYnkgYXBwZW5kaW5nIHRoZVxuICAgICAgLy8gZG9jdW1lbnQgZnJhZ21lbnQuIFRoaXMgaXMgaG93IGlubmVySFRNTCBkb2VzIGl0LlxuICAgICAgd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkLmNhbGwodGhpcywgZG9jRnJhZyk7XG5cbiAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgdGhhdCBpbm5lckhUTUwncyBzZXR0ZXIgd291bGRcbiAgICAgIHJldHVybiB0aGlzLmlubmVySFRNTDtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBHZXQgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGdpdmVuIGEgbGlzdCBvZiBwcmlvcml0aWVzIGFuZCB0aGVcbiAqIHByb3BlcnR5IHRvIGdldC5cbiAqL1xudmFyIGdldERlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXREZXNjcmlwdG9yKHByaW9yaXR5LCBwcm9wKSB7XG4gIHZhciBkZXNjcmlwdG9yID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmlvcml0eS5sZW5ndGg7IGkrKykge1xuICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByaW9yaXR5W2ldLCBwcm9wKTtcblxuICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3Iuc2V0ICYmIGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgZ2V0SW5uZXJIVE1MRGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldElubmVySFRNTERlc2NyaXB0b3IodGVjaCkge1xuICByZXR1cm4gZ2V0RGVzY3JpcHRvcihbdGVjaC5lbCgpLCB3aW5kb3cuSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsIHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSwgaW5uZXJIVE1MRGVzY3JpcHRvclBvbHlmaWxsXSwgJ2lubmVySFRNTCcpO1xufTtcblxuLyoqXG4gKiBQYXRjaGVzIGJyb3dzZXIgaW50ZXJuYWwgZnVuY3Rpb25zIHNvIHRoYXQgd2UgY2FuIHRlbGwgc3luY3Jvbm91c2x5XG4gKiBpZiBhIGA8c291cmNlPmAgd2FzIGFwcGVuZGVkIHRvIHRoZSBtZWRpYSBlbGVtZW50LiBGb3Igc29tZSByZWFzb24gdGhpc1xuICogY2F1c2VzIGEgYHNvdXJjZXNldGAgaWYgdGhlIHRoZSBtZWRpYSBlbGVtZW50IGlzIHJlYWR5IGFuZCBoYXMgbm8gc291cmNlLlxuICogVGhpcyBoYXBwZW5zIHdoZW46XG4gKiAtIFRoZSBwYWdlIGhhcyBqdXN0IGxvYWRlZCBhbmQgdGhlIG1lZGlhIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHNvdXJjZS5cbiAqIC0gVGhlIG1lZGlhIGVsZW1lbnQgd2FzIGVtcHRpZWQgb2YgYWxsIHNvdXJjZXMsIHRoZW4gYGxvYWQoKWAgd2FzIGNhbGxlZC5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgYnkgcGF0Y2hpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMvcHJvcGVydGllcyB3aGVuIHRoZXkgYXJlIHN1cHBvcnRlZDpcbiAqXG4gKiAtIGBhcHBlbmQoKWAgLSBjYW4gYmUgdXNlZCB0byBhZGQgYSBgPHNvdXJjZT5gIGVsZW1lbnQgdG8gdGhlIG1lZGlhIGVsZW1lbnRcbiAqIC0gYGFwcGVuZENoaWxkKClgIC0gY2FuIGJlIHVzZWQgdG8gYWRkIGEgYDxzb3VyY2U+YCBlbGVtZW50IHRvIHRoZSBtZWRpYSBlbGVtZW50XG4gKiAtIGBpbnNlcnRBZGphY2VudEhUTUwoKWAgLSAgY2FuIGJlIHVzZWQgdG8gYWRkIGEgYDxzb3VyY2U+YCBlbGVtZW50IHRvIHRoZSBtZWRpYSBlbGVtZW50XG4gKiAtIGBpbm5lckhUTUxgIC0gIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGA8c291cmNlPmAgZWxlbWVudCB0byB0aGUgbWVkaWEgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7SHRtbDV9IHRlY2hcbiAqICAgICAgICBUaGUgdGVjaCBvYmplY3QgdGhhdCBzb3VyY2VzZXQgaXMgYmVpbmcgc2V0dXAgb24uXG4gKi9cbnZhciBmaXJzdFNvdXJjZVdhdGNoID0gZnVuY3Rpb24gZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKSB7XG4gIHZhciBlbCA9IHRlY2guZWwoKTtcblxuICAvLyBtYWtlIHN1cmUgZmlyc3RTb3VyY2VXYXRjaCBpc24ndCBzZXR1cCB0d2ljZS5cbiAgaWYgKGVsLnJlc2V0U291cmNlV2F0Y2hfKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG9sZCA9IHt9O1xuICB2YXIgaW5uZXJEZXNjcmlwdG9yID0gZ2V0SW5uZXJIVE1MRGVzY3JpcHRvcih0ZWNoKTtcbiAgdmFyIGFwcGVuZFdyYXBwZXIgPSBmdW5jdGlvbiBhcHBlbmRXcmFwcGVyKGFwcGVuZEZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHZhciByZXR2YWwgPSBhcHBlbmRGbi5hcHBseShlbCwgYXJncyk7XG5cbiAgICAgIHNvdXJjZXNldExvYWQodGVjaCk7XG5cbiAgICAgIHJldHVybiByZXR2YWw7XG4gICAgfTtcbiAgfTtcblxuICBbJ2FwcGVuZCcsICdhcHBlbmRDaGlsZCcsICdpbnNlcnRBZGphY2VudEhUTUwnXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgaWYgKCFlbFtrXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0b3JlIHRoZSBvbGQgZnVuY3Rpb25cbiAgICBvbGRba10gPSBlbFtrXTtcblxuICAgIC8vIGNhbGwgdGhlIG9sZCBmdW5jdGlvbiB3aXRoIGEgc291cmNlc2V0IGlmIGEgc291cmNlXG4gICAgLy8gd2FzIGxvYWRlZFxuICAgIGVsW2tdID0gYXBwZW5kV3JhcHBlcihvbGRba10pO1xuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdpbm5lckhUTUwnLCBtZXJnZU9wdGlvbnMoaW5uZXJEZXNjcmlwdG9yLCB7XG4gICAgc2V0OiBhcHBlbmRXcmFwcGVyKGlubmVyRGVzY3JpcHRvci5zZXQpXG4gIH0pKTtcblxuICBlbC5yZXNldFNvdXJjZVdhdGNoXyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZXNldFNvdXJjZVdhdGNoXyA9IG51bGw7XG4gICAgT2JqZWN0LmtleXMob2xkKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBlbFtrXSA9IG9sZFtrXTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ2lubmVySFRNTCcsIGlubmVyRGVzY3JpcHRvcik7XG4gIH07XG5cbiAgLy8gb24gdGhlIGZpcnN0IHNvdXJjZXNldCwgd2UgbmVlZCB0byByZXZlcnQgb3VyIGNoYW5nZXNcbiAgdGVjaC5vbmUoJ3NvdXJjZXNldCcsIGVsLnJlc2V0U291cmNlV2F0Y2hfKTtcbn07XG5cbi8qKlxuICogb3VyIGltcGxlbWVudGF0aW9uIG9mIGEgYHNyY2AgZGVzY3JpcHRvciBmb3IgYnJvd3NlcnNcbiAqIHRoYXQgZG8gbm90IGhhdmUgb25lLlxuICovXG5cbnZhciBzcmNEZXNjcmlwdG9yUG9seWZpbGwgPSB7fTtcblxuaWYgKCFJU19JRTgpIHtcbiAgc3JjRGVzY3JpcHRvclBvbHlmaWxsID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnc3JjJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgICByZXR1cm4gZ2V0QWJzb2x1dGVVUkwod2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsICdzcmMnKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCAnc3JjJywgdik7XG5cbiAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBnZXRTcmNEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0U3JjRGVzY3JpcHRvcih0ZWNoKSB7XG4gIHJldHVybiBnZXREZXNjcmlwdG9yKFt0ZWNoLmVsKCksIHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgc3JjRGVzY3JpcHRvclBvbHlmaWxsXSwgJ3NyYycpO1xufTtcblxuLyoqXG4gKiBzZXR1cCBgc291cmNlc2V0YCBoYW5kbGluZyBvbiB0aGUgYEh0bWw1YCB0ZWNoLiBUaGlzIGZ1bmN0aW9uXG4gKiBwYXRjaGVzIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBwcm9wZXJ0aWVzL2Z1bmN0aW9uczpcbiAqXG4gKiAtIGBzcmNgIC0gdG8gZGV0ZXJtaW5lIHdoZW4gYHNyY2AgaXMgc2V0XG4gKiAtIGBzZXRBdHRyaWJ1dGUoKWAgLSB0byBkZXRlcm1pbmUgd2hlbiBgc3JjYCBpcyBzZXRcbiAqIC0gYGxvYWQoKWAgLSB0aGlzIHJlLXRyaWdnZXJzIHRoZSBzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobSwgYW5kIGNhblxuICogICAgICAgICAgICAgIGNhdXNlIGEgc291cmNlc2V0LlxuICpcbiAqIElmIHRoZXJlIGlzIG5vIHNvdXJjZSB3aGVuIHdlIGFyZSBhZGRpbmcgYHNvdXJjZXNldGAgc3VwcG9ydCBvciBkdXJpbmcgYSBgbG9hZCgpYFxuICogd2UgYWxzbyBwYXRjaCB0aGUgZnVuY3Rpb25zIGxpc3RlZCBpbiBgZmlyc3RTb3VyY2VXYXRjaGAuXG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSB0ZWNoIHRvIHBhdGNoXG4gKi9cbnZhciBzZXR1cFNvdXJjZXNldCA9IGZ1bmN0aW9uIHNldHVwU291cmNlc2V0KHRlY2gpIHtcbiAgaWYgKCF0ZWNoLmZlYXR1cmVzU291cmNlc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsID0gdGVjaC5lbCgpO1xuXG4gIC8vIG1ha2Ugc3VyZSBzb3VyY2VzZXQgaXNuJ3Qgc2V0dXAgdHdpY2UuXG4gIGlmIChlbC5yZXNldFNvdXJjZXNldF8pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc3JjRGVzY3JpcHRvciA9IGdldFNyY0Rlc2NyaXB0b3IodGVjaCk7XG4gIHZhciBvbGRTZXRBdHRyaWJ1dGUgPSBlbC5zZXRBdHRyaWJ1dGU7XG4gIHZhciBvbGRMb2FkID0gZWwubG9hZDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdzcmMnLCBtZXJnZU9wdGlvbnMoc3JjRGVzY3JpcHRvciwge1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIHZhciByZXR2YWwgPSBzcmNEZXNjcmlwdG9yLnNldC5jYWxsKGVsLCB2KTtcblxuICAgICAgLy8gd2UgdXNlIHRoZSBnZXR0ZXIgaGVyZSB0byBnZXQgdGhlIGFjdHVhbCB2YWx1ZSBzZXQgb24gc3JjXG4gICAgICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoZWwuc3JjKTtcblxuICAgICAgcmV0dXJuIHJldHZhbDtcbiAgICB9XG4gIH0pKTtcblxuICBlbC5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobiwgdikge1xuICAgIHZhciByZXR2YWwgPSBvbGRTZXRBdHRyaWJ1dGUuY2FsbChlbCwgbiwgdik7XG5cbiAgICBpZiAoL3NyYy9pLnRlc3QobikpIHtcbiAgICAgIHRlY2gudHJpZ2dlclNvdXJjZXNldChlbC5zcmMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXR2YWw7XG4gIH07XG5cbiAgZWwubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmV0dmFsID0gb2xkTG9hZC5jYWxsKGVsKTtcblxuICAgIC8vIGlmIGxvYWQgd2FzIGNhbGxlZCwgYnV0IHRoZXJlIHdhcyBubyBzb3VyY2UgdG8gZmlyZVxuICAgIC8vIHNvdXJjZXNldCBvbi4gV2UgaGF2ZSB0byB3YXRjaCBmb3IgYSBzb3VyY2UgYXBwZW5kXG4gICAgLy8gYXMgdGhhdCBjYW4gdHJpZ2dlciBhIGBzb3VyY2VzZXRgIHdoZW4gdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAvLyBoYXMgbm8gc291cmNlXG4gICAgaWYgKCFzb3VyY2VzZXRMb2FkKHRlY2gpKSB7XG4gICAgICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoJycpO1xuICAgICAgZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dmFsO1xuICB9O1xuXG4gIGlmIChlbC5jdXJyZW50U3JjKSB7XG4gICAgdGVjaC50cmlnZ2VyU291cmNlc2V0KGVsLmN1cnJlbnRTcmMpO1xuICB9IGVsc2UgaWYgKCFzb3VyY2VzZXRMb2FkKHRlY2gpKSB7XG4gICAgZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKTtcbiAgfVxuXG4gIGVsLnJlc2V0U291cmNlc2V0XyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZXNldFNvdXJjZXNldF8gPSBudWxsO1xuICAgIGVsLmxvYWQgPSBvbGRMb2FkO1xuICAgIGVsLnNldEF0dHJpYnV0ZSA9IG9sZFNldEF0dHJpYnV0ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdzcmMnLCBzcmNEZXNjcmlwdG9yKTtcbiAgICBpZiAoZWwucmVzZXRTb3VyY2VXYXRjaF8pIHtcbiAgICAgIGVsLnJlc2V0U291cmNlV2F0Y2hfKCk7XG4gICAgfVxuICB9O1xufTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQyID0gdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWydUZXh0IFRyYWNrcyBhcmUgYmVpbmcgbG9hZGVkIGZyb20gYW5vdGhlciBvcmlnaW4gYnV0IHRoZSBjcm9zc29yaWdpbiBhdHRyaWJ1dGUgaXNuXFwndCB1c2VkLlxcbiAgICAgICAgICAgIFRoaXMgbWF5IHByZXZlbnQgdGV4dCB0cmFja3MgZnJvbSBsb2FkaW5nLiddLCBbJ1RleHQgVHJhY2tzIGFyZSBiZWluZyBsb2FkZWQgZnJvbSBhbm90aGVyIG9yaWdpbiBidXQgdGhlIGNyb3Nzb3JpZ2luIGF0dHJpYnV0ZSBpc25cXCd0IHVzZWQuXFxuICAgICAgICAgICAgVGhpcyBtYXkgcHJldmVudCB0ZXh0IHRyYWNrcyBmcm9tIGxvYWRpbmcuJ10pO1xuXG4vKipcbiAqIEBmaWxlIGh0bWw1LmpzXG4gKi9cbi8qKlxuICogSFRNTDUgTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIEhUTUw1IE1lZGlhIEFQSVxuICpcbiAqIEBtaXhlcyBUZWNoflNvdWNlSGFuZGxlckFkZGl0aW9uc1xuICogQGV4dGVuZHMgVGVjaFxuICovXG5cbnZhciBIdG1sNSA9IGZ1bmN0aW9uIChfVGVjaCkge1xuICBpbmhlcml0cyhIdG1sNSwgX1RlY2gpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBUZWNoLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSByZWFkeVxuICAgKiAgICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBgSFRNTDVgIFRlY2ggaXMgcmVhZHkuXG4gICAqL1xuICBmdW5jdGlvbiBIdG1sNShvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEh0bWw1KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RlY2guY2FsbCh0aGlzLCBvcHRpb25zLCByZWFkeSkpO1xuXG4gICAgdmFyIHNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHZhciBjcm9zc29yaWdpblRyYWNrcyA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHRoZSBzb3VyY2UgaWYgb25lIGlzIHByb3ZpZGVkXG4gICAgLy8gMSkgQ2hlY2sgaWYgdGhlIHNvdXJjZSBpcyBuZXcgKGlmIG5vdCwgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBzbyBwbGF5YmFjayBpc24ndCBpbnRlcnJ1cHRlZClcbiAgICAvLyAyKSBDaGVjayB0byBzZWUgaWYgdGhlIG5ldHdvcmsgc3RhdGUgb2YgdGhlIHRhZyB3YXMgZmFpbGVkIGF0IGluaXQsIGFuZCBpZiBzbywgcmVzZXQgdGhlIHNvdXJjZVxuICAgIC8vIGFueXdheSBzbyB0aGUgZXJyb3IgZ2V0cyBmaXJlZC5cbiAgICBpZiAoc291cmNlICYmIChfdGhpcy5lbF8uY3VycmVudFNyYyAhPT0gc291cmNlLnNyYyB8fCBvcHRpb25zLnRhZyAmJiBvcHRpb25zLnRhZy5pbml0TmV0d29ya1N0YXRlXyA9PT0gMykpIHtcbiAgICAgIF90aGlzLnNldFNvdXJjZShzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5oYW5kbGVMYXRlSW5pdF8oX3RoaXMuZWxfKTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBzb3VyY2VzZXQgYWZ0ZXIgbGF0ZSBzb3VyY2VzZXQvaW5pdFxuICAgIGlmIChvcHRpb25zLmVuYWJsZVNvdXJjZXNldCkge1xuICAgICAgX3RoaXMuc2V0dXBTb3VyY2VzZXRIYW5kbGluZ18oKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuZWxfLmhhc0NoaWxkTm9kZXMoKSkge1xuXG4gICAgICB2YXIgbm9kZXMgPSBfdGhpcy5lbF8uY2hpbGROb2RlcztcbiAgICAgIHZhciBub2Rlc0xlbmd0aCA9IG5vZGVzLmxlbmd0aDtcbiAgICAgIHZhciByZW1vdmVOb2RlcyA9IFtdO1xuXG4gICAgICB3aGlsZSAobm9kZXNMZW5ndGgtLSkge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW25vZGVzTGVuZ3RoXTtcbiAgICAgICAgdmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RyYWNrJykge1xuICAgICAgICAgIGlmICghX3RoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSB2aWRlbyB0YWcgdHJhY2tzIHNvIHRoZSBidWlsdC1pbiBwbGF5ZXIgZG9lc24ndCB1c2UgdGhlbSBhbHNvLlxuICAgICAgICAgICAgLy8gVGhpcyBtYXkgbm90IGJlIGZhc3QgZW5vdWdoIHRvIHN0b3AgSFRNTDUgYnJvd3NlcnMgZnJvbSByZWFkaW5nIHRoZSB0YWdzXG4gICAgICAgICAgICAvLyBzbyB3ZSdsbCBuZWVkIHRvIHR1cm4gb2ZmIGFueSBkZWZhdWx0IHRyYWNrcyBpZiB3ZSdyZSBtYW51YWxseSBkb2luZ1xuICAgICAgICAgICAgLy8gY2FwdGlvbnMgYW5kIHN1YnRpdGxlcy4gdmlkZW9FbGVtZW50LnRleHRUcmFja3NcbiAgICAgICAgICAgIHJlbW92ZU5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3JlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayB0byByZW1vdGUgbGlzdFxuICAgICAgICAgICAgX3RoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuYWRkVHJhY2tFbGVtZW50Xyhub2RlKTtcbiAgICAgICAgICAgIF90aGlzLnJlbW90ZVRleHRUcmFja3MoKS5hZGRUcmFjayhub2RlLnRyYWNrKTtcbiAgICAgICAgICAgIF90aGlzLnRleHRUcmFja3MoKS5hZGRUcmFjayhub2RlLnRyYWNrKTtcbiAgICAgICAgICAgIGlmICghY3Jvc3NvcmlnaW5UcmFja3MgJiYgIV90aGlzLmVsXy5oYXNBdHRyaWJ1dGUoJ2Nyb3Nzb3JpZ2luJykgJiYgaXNDcm9zc09yaWdpbihub2RlLnNyYykpIHtcbiAgICAgICAgICAgICAgY3Jvc3NvcmlnaW5UcmFja3MgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW92ZU5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF90aGlzLmVsXy5yZW1vdmVDaGlsZChyZW1vdmVOb2Rlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMucHJveHlOYXRpdmVUcmFja3NfKCk7XG4gICAgaWYgKF90aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyAmJiBjcm9zc29yaWdpblRyYWNrcykge1xuICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCQyKSk7XG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBpT1MgU2FmYXJpIGZyb20gZGlzYWJsaW5nIG1ldGFkYXRhIHRleHQgdHJhY2tzIGR1cmluZyBuYXRpdmUgcGxheWJhY2tcbiAgICBfdGhpcy5yZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8oKTtcblxuICAgIC8vIERldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAvLyBPdXIgZ29hbCBzaG91bGQgYmUgdG8gZ2V0IHRoZSBjdXN0b20gY29udHJvbHMgb24gbW9iaWxlIHNvbGlkIGV2ZXJ5d2hlcmVcbiAgICAvLyBzbyB3ZSBjYW4gcmVtb3ZlIHRoaXMgYWxsIHRvZ2V0aGVyLiBSaWdodCBub3cgdGhpcyB3aWxsIGJsb2NrIGN1c3RvbVxuICAgIC8vIGNvbnRyb2xzIG9uIHRvdWNoIGVuYWJsZWQgbGFwdG9wcyBsaWtlIHRoZSBDaHJvbWUgUGl4ZWxcbiAgICBpZiAoKFRPVUNIX0VOQUJMRUQgfHwgSVNfSVBIT05FIHx8IElTX05BVElWRV9BTkRST0lEKSAmJiBvcHRpb25zLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggPT09IHRydWUpIHtcbiAgICAgIF90aGlzLnNldENvbnRyb2xzKHRydWUpO1xuICAgIH1cblxuICAgIC8vIG9uIGlPUywgd2Ugd2FudCB0byBwcm94eSBgd2Via2l0YmVnaW5mdWxsc2NyZWVuYCBhbmQgYHdlYmtpdGVuZGZ1bGxzY3JlZW5gXG4gICAgLy8gaW50byBhIGBmdWxsc2NyZWVuY2hhbmdlYCBldmVudFxuICAgIF90aGlzLnByb3h5V2Via2l0RnVsbHNjcmVlbl8oKTtcblxuICAgIF90aGlzLnRyaWdnZXJSZWFkeSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIGBIVE1MNWAgbWVkaWEgZWxlbWVudCBhbmQgcmVtb3ZlIGFsbCB0cmFja3MuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLmVsXyAmJiB0aGlzLmVsXy5yZXNldFNvdXJjZXNldF8pIHtcbiAgICAgIHRoaXMuZWxfLnJlc2V0U291cmNlc2V0XygpO1xuICAgIH1cbiAgICBIdG1sNS5kaXNwb3NlTWVkaWFFbGVtZW50KHRoaXMuZWxfKTtcbiAgICB0aGlzLm9wdGlvbnNfID0gbnVsbDtcblxuICAgIC8vIHRlY2ggd2lsbCBoYW5kbGUgY2xlYXJpbmcgb2YgdGhlIGVtdWxhdGVkIHRyYWNrIGxpc3RcbiAgICBfVGVjaC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNb2RpZnkgdGhlIG1lZGlhIGVsZW1lbnQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW5cbiAgICogdGhlIHNvdXJjZSBpcyBjaGFuZ2VkLiBGaXJlcyBgc291cmNlc2V0YCBqdXN0IGFmdGVyIHRoZSBzb3VyY2UgaGFzIGNoYW5nZWRcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuc2V0dXBTb3VyY2VzZXRIYW5kbGluZ18gPSBmdW5jdGlvbiBzZXR1cFNvdXJjZXNldEhhbmRsaW5nXygpIHtcbiAgICBzZXR1cFNvdXJjZXNldCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogV2hlbiBhIGNhcHRpb25zIHRyYWNrIGlzIGVuYWJsZWQgaW4gdGhlIGlPUyBTYWZhcmkgbmF0aXZlIHBsYXllciwgYWxsIG90aGVyXG4gICAqIHRyYWNrcyBhcmUgZGlzYWJsZWQgKGluY2x1ZGluZyBtZXRhZGF0YSB0cmFja3MpLCB3aGljaCBudWxscyBhbGwgb2YgdGhlaXJcbiAgICogYXNzb2NpYXRlZCBjdWUgcG9pbnRzLiBUaGlzIHdpbGwgcmVzdG9yZSBtZXRhZGF0YSB0cmFja3MgdG8gdGhlaXIgcHJlLWZ1bGxzY3JlZW5cbiAgICogc3RhdGUgaW4gdGhvc2UgY2FzZXMgc28gdGhhdCBjdWUgcG9pbnRzIGFyZSBub3QgbmVlZGxlc3NseSBsb3N0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5yZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8gPSBmdW5jdGlvbiByZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8oKSB7XG4gICAgdmFyIHRleHRUcmFja3MgPSB0aGlzLnRleHRUcmFja3MoKTtcbiAgICB2YXIgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUgPSB2b2lkIDA7XG5cbiAgICAvLyBjYXB0dXJlcyBhIHNuYXBzaG90IG9mIGV2ZXJ5IG1ldGFkYXRhIHRyYWNrJ3MgY3VycmVudCBzdGF0ZVxuICAgIHZhciB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90ID0gZnVuY3Rpb24gdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCgpIHtcbiAgICAgIG1ldGFkYXRhVHJhY2tzUHJlRnVsbHNjcmVlblN0YXRlID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdHJhY2sgPSB0ZXh0VHJhY2tzW2ldO1xuXG4gICAgICAgIGlmICh0cmFjay5raW5kID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUucHVzaCh7XG4gICAgICAgICAgICB0cmFjazogdHJhY2ssXG4gICAgICAgICAgICBzdG9yZWRNb2RlOiB0cmFjay5tb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc25hcHNob3QgZWFjaCBtZXRhZGF0YSB0cmFjaydzIGluaXRpYWwgc3RhdGUsIGFuZCB1cGRhdGUgdGhlIHNuYXBzaG90XG4gICAgLy8gZWFjaCB0aW1lIHRoZXJlIGlzIGEgdHJhY2sgJ2NoYW5nZScgZXZlbnRcbiAgICB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KCk7XG4gICAgdGV4dFRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcblxuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcbiAgICB9KTtcblxuICAgIHZhciByZXN0b3JlVHJhY2tNb2RlID0gZnVuY3Rpb24gcmVzdG9yZVRyYWNrTW9kZSgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0b3JlZFRyYWNrID0gbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGVbaV07XG5cbiAgICAgICAgaWYgKHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgPT09ICdkaXNhYmxlZCcgJiYgc3RvcmVkVHJhY2sudHJhY2subW9kZSAhPT0gc3RvcmVkVHJhY2suc3RvcmVkTW9kZSkge1xuICAgICAgICAgIHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgPSBzdG9yZWRUcmFjay5zdG9yZWRNb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB3ZSBvbmx5IHdhbnQgdGhpcyBoYW5kbGVyIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBmaXJzdCAnY2hhbmdlJyBldmVudFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICB9O1xuXG4gICAgLy8gd2hlbiB3ZSBlbnRlciBmdWxsc2NyZWVuIHBsYXliYWNrLCBzdG9wIHVwZGF0aW5nIHRoZSBzbmFwc2hvdCBhbmRcbiAgICAvLyByZXN0b3JlIGFsbCB0cmFjayBtb2RlcyB0byB0aGVpciBwcmUtZnVsbHNjcmVlbiBzdGF0ZVxuICAgIHRoaXMub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRleHRUcmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0aGUgbGlzdGVuZXIgYmVmb3JlIGFkZGluZyBpdCBqdXN0IGluIGNhc2UgaXQgd2Fzbid0IHByZXZpb3VzbHkgcmVtb3ZlZFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICAgIHRleHRUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgcmVzdG9yZVRyYWNrTW9kZSk7XG4gICAgfSk7XG5cbiAgICAvLyBzdGFydCB1cGRhdGluZyB0aGUgc25hcHNob3QgYWdhaW4gYWZ0ZXIgbGVhdmluZyBmdWxsc2NyZWVuXG4gICAgdGhpcy5vbignd2Via2l0ZW5kZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHJlbW92ZSB0aGUgbGlzdGVuZXIgYmVmb3JlIGFkZGluZyBpdCBqdXN0IGluIGNhc2UgaXQgd2Fzbid0IHByZXZpb3VzbHkgcmVtb3ZlZFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcbiAgICAgIHRleHRUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVzdG9yZVRyYWNrTW9kZSBoYW5kbGVyIGluIGNhc2UgaXQgd2Fzbid0IHRyaWdnZXJlZCBkdXJpbmcgZnVsbHNjcmVlbiBwbGF5YmFja1xuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUHJveHkgYWxsIG5hdGl2ZSB0cmFjayBsaXN0IGV2ZW50cyB0byBvdXIgdHJhY2sgbGlzdHMgaWYgdGhlIGJyb3dzZXIgd2UgYXJlIHBsYXlpbmdcbiAgICogaW4gc3VwcG9ydHMgdGhhdCB0eXBlIG9mIHRyYWNrIGxpc3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnByb3h5TmF0aXZlVHJhY2tzXyA9IGZ1bmN0aW9uIHByb3h5TmF0aXZlVHJhY2tzXygpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIE5PUk1BTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgcHJvcHMgPSBOT1JNQUxbbmFtZV07XG4gICAgICB2YXIgZWxUcmFja3MgPSBfdGhpczIuZWwoKVtwcm9wcy5nZXR0ZXJOYW1lXTtcbiAgICAgIHZhciB0ZWNoVHJhY2tzID0gX3RoaXMyW3Byb3BzLmdldHRlck5hbWVdKCk7XG5cbiAgICAgIGlmICghX3RoaXMyWydmZWF0dXJlc05hdGl2ZScgKyBwcm9wcy5jYXBpdGFsTmFtZSArICdUcmFja3MnXSB8fCAhZWxUcmFja3MgfHwgIWVsVHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGxpc3RlbmVycyA9IHtcbiAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiBjaGFuZ2UoZSkge1xuICAgICAgICAgIHRlY2hUcmFja3MudHJpZ2dlcih7XG4gICAgICAgICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgICAgICAgIHRhcmdldDogdGVjaFRyYWNrcyxcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IHRlY2hUcmFja3MsXG4gICAgICAgICAgICBzcmNFbGVtZW50OiB0ZWNoVHJhY2tzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZHRyYWNrOiBmdW5jdGlvbiBhZGR0cmFjayhlKSB7XG4gICAgICAgICAgdGVjaFRyYWNrcy5hZGRUcmFjayhlLnRyYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZldHJhY2s6IGZ1bmN0aW9uIHJlbW92ZXRyYWNrKGUpIHtcbiAgICAgICAgICB0ZWNoVHJhY2tzLnJlbW92ZVRyYWNrKGUudHJhY2spO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHJlbW92ZU9sZFRyYWNrcyA9IGZ1bmN0aW9uIHJlbW92ZU9sZFRyYWNrcygpIHtcbiAgICAgICAgdmFyIHJlbW92ZVRyYWNrcyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVjaFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbFRyYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGVsVHJhY2tzW2pdID09PSB0ZWNoVHJhY2tzW2ldKSB7XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmVtb3ZlVHJhY2tzLnB1c2godGVjaFRyYWNrc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlbW92ZVRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICB0ZWNoVHJhY2tzLnJlbW92ZVRyYWNrKHJlbW92ZVRyYWNrcy5zaGlmdCgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgT2JqZWN0LmtleXMobGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAgICAgZWxUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgX3RoaXMyLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxUcmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVtb3ZlIChuYXRpdmUpIHRyYWNrcyB0aGF0IGFyZSBub3QgdXNlZCBhbnltb3JlXG4gICAgICBfdGhpczIub24oJ2xvYWRzdGFydCcsIHJlbW92ZU9sZFRyYWNrcyk7XG4gICAgICBfdGhpczIub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLm9mZignbG9hZHN0YXJ0JywgcmVtb3ZlT2xkVHJhY2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBIdG1sNWAgVGVjaCdzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBlbCA9IHRoaXMub3B0aW9uc18udGFnO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBicm93c2VyIHN1cHBvcnRzIG1vdmluZyB0aGUgZWxlbWVudCBpbnRvIHRoZSBib3guXG4gICAgLy8gT24gdGhlIGlQaG9uZSB2aWRlbyB3aWxsIGJyZWFrIGlmIHlvdSBtb3ZlIHRoZSBlbGVtZW50LFxuICAgIC8vIFNvIHdlIGhhdmUgdG8gY3JlYXRlIGEgYnJhbmQgbmV3IGVsZW1lbnQuXG4gICAgLy8gSWYgd2UgaW5nZXN0ZWQgdGhlIHBsYXllciBkaXYsIHdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgdGhlIG1lZGlhIGVsZW1lbnQuXG4gICAgaWYgKCFlbCB8fCAhKHRoaXMub3B0aW9uc18ucGxheWVyRWxJbmdlc3QgfHwgdGhpcy5tb3ZpbmdNZWRpYUVsZW1lbnRJbkRPTSkpIHtcblxuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHRhZyBpcyBzdGlsbCB0aGVyZSwgY2xvbmUgYW5kIHJlbW92ZSBpdC5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgaWYgKGVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjbG9uZSwgZWwpO1xuICAgICAgICB9XG4gICAgICAgIEh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQoZWwpO1xuICAgICAgICBlbCA9IGNsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuXG4gICAgICAgIC8vIGRldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAgICAgdmFyIHRhZ0F0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnNfLnRhZyAmJiBnZXRBdHRyaWJ1dGVzKHRoaXMub3B0aW9uc18udGFnKTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBtZXJnZU9wdGlvbnMoe30sIHRhZ0F0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmICghVE9VQ0hfRU5BQkxFRCB8fCB0aGlzLm9wdGlvbnNfLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggIT09IHRydWUpIHtcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy5jb250cm9scztcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEF0dHJpYnV0ZXMoZWwsIGFzc2lnbihhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgaWQ6IHRoaXMub3B0aW9uc18udGVjaElkLFxuICAgICAgICAgICdjbGFzcyc6ICd2anMtdGVjaCdcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBlbC5wbGF5ZXJJZCA9IHRoaXMub3B0aW9uc18ucGxheWVySWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnByZWxvYWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoZWwsICdwcmVsb2FkJywgdGhpcy5vcHRpb25zXy5wcmVsb2FkKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lmaWMgdGFnIHNldHRpbmdzLCBpbiBjYXNlIHRoZXkgd2VyZSBvdmVycmlkZGVuXG4gICAgLy8gYGF1dG9wbGF5YCBoYXMgdG8gYmUgKmxhc3QqIHNvIHRoYXQgYG11dGVkYCBhbmQgYHBsYXlzaW5saW5lYCBhcmUgcHJlc2VudFxuICAgIC8vIHdoZW4gaU9TL1NhZmFyaSBvciBvdGhlciBicm93c2VycyBhdHRlbXB0IHRvIGF1dG9wbGF5LlxuICAgIHZhciBzZXR0aW5nc0F0dHJzID0gWydsb29wJywgJ211dGVkJywgJ3BsYXlzaW5saW5lJywgJ2F1dG9wbGF5J107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldHRpbmdzQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyID0gc2V0dGluZ3NBdHRyc1tpXTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMub3B0aW9uc19bYXR0cl07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgYXR0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBlbFthdHRyXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIHRyaWdnZXJlZCBpZiB0aGUgbG9hZHN0YXJ0IGV2ZW50IGhhcyBhbHJlYWR5IGZpcmVkLCBiZWZvcmUgdmlkZW9qcyB3YXNcbiAgICogcmVhZHkuIFR3byBrbm93biBleGFtcGxlcyBvZiB3aGVuIHRoaXMgY2FuIGhhcHBlbiBhcmU6XG4gICAqIDEuIElmIHdlJ3JlIGxvYWRpbmcgdGhlIHBsYXliYWNrIG9iamVjdCBhZnRlciBpdCBoYXMgc3RhcnRlZCBsb2FkaW5nXG4gICAqIDIuIFRoZSBtZWRpYSBpcyBhbHJlYWR5IHBsYXlpbmcgdGhlIChvZnRlbiB3aXRoIGF1dG9wbGF5IG9uKSB0aGVuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmaXJlIGFub3RoZXIgbG9hZHN0YXJ0IHNvIHRoYXQgdmlkZW9qcyBjYW4gY2F0Y2h1cC5cbiAgICpcbiAgICogQGZpcmVzIFRlY2gjbG9hZHN0YXJ0XG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICogICAgICAgICByZXR1cm5zIG5vdGhpbmcuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmhhbmRsZUxhdGVJbml0XyA9IGZ1bmN0aW9uIGhhbmRsZUxhdGVJbml0XyhlbCkge1xuICAgIGlmIChlbC5uZXR3b3JrU3RhdGUgPT09IDAgfHwgZWwubmV0d29ya1N0YXRlID09PSAzKSB7XG4gICAgICAvLyBUaGUgdmlkZW8gZWxlbWVudCBoYXNuJ3Qgc3RhcnRlZCBsb2FkaW5nIHRoZSBzb3VyY2UgeWV0XG4gICAgICAvLyBvciBkaWRuJ3QgZmluZCBhIHNvdXJjZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbC5yZWFkeVN0YXRlID09PSAwKSB7XG4gICAgICAvLyBOZXR3b3JrU3RhdGUgaXMgc2V0IHN5bmNocm9ub3VzbHkgQlVUIGxvYWRzdGFydCBpcyBmaXJlZCBhdCB0aGVcbiAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzdGFjaywgdXN1YWxseSBiZWZvcmUgc2V0SW50ZXJ2YWwoZm4sIDApLlxuICAgICAgLy8gU28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IGxvYWRzdGFydCBtYXkgaGF2ZSBhbHJlYWR5IGZpcmVkIG9yIGlzXG4gICAgICAvLyBhYm91dCB0byBmaXJlLCBhbmQgZWl0aGVyIHdheSB0aGUgcGxheWVyIGhhc24ndCBzZWVuIGl0IHlldC5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZmlyZSBsb2Fkc3RhcnQgcHJlbWF0dXJlbHkgaGVyZSBhbmQgY2F1c2UgYVxuICAgICAgLy8gZG91YmxlIGxvYWRzdGFydCBzbyB3ZSdsbCB3YWl0IGFuZCBzZWUgaWYgaXQgaGFwcGVucyBiZXR3ZWVuIG5vd1xuICAgICAgLy8gYW5kIHRoZSBuZXh0IGxvb3AsIGFuZCBmaXJlIGl0IGlmIG5vdC5cbiAgICAgIC8vIEhPV0VWRVIsIHdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgaXQgZmlyZXMgYmVmb3JlIGxvYWRlZG1ldGFkYXRhXG4gICAgICAvLyB3aGljaCBjb3VsZCBhbHNvIGhhcHBlbiBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgbG9vcCwgc28gd2UnbGxcbiAgICAgIC8vIHdhdGNoIGZvciB0aGF0IGFsc28uXG4gICAgICB2YXIgbG9hZHN0YXJ0RmlyZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzZXRMb2Fkc3RhcnRGaXJlZCA9IGZ1bmN0aW9uIHNldExvYWRzdGFydEZpcmVkKCkge1xuICAgICAgICBsb2Fkc3RhcnRGaXJlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uKCdsb2Fkc3RhcnQnLCBzZXRMb2Fkc3RhcnRGaXJlZCk7XG5cbiAgICAgIHZhciB0cmlnZ2VyTG9hZHN0YXJ0ID0gZnVuY3Rpb24gdHJpZ2dlckxvYWRzdGFydCgpIHtcbiAgICAgICAgLy8gV2UgZGlkIG1pc3MgdGhlIG9yaWdpbmFsIGxvYWRzdGFydC4gTWFrZSBzdXJlIHRoZSBwbGF5ZXJcbiAgICAgICAgLy8gc2VlcyBsb2Fkc3RhcnQgYmVmb3JlIGxvYWRlZG1ldGFkYXRhXG4gICAgICAgIGlmICghbG9hZHN0YXJ0RmlyZWQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uKCdsb2FkZWRtZXRhZGF0YScsIHRyaWdnZXJMb2Fkc3RhcnQpO1xuXG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vZmYoJ2xvYWRzdGFydCcsIHNldExvYWRzdGFydEZpcmVkKTtcbiAgICAgICAgdGhpcy5vZmYoJ2xvYWRlZG1ldGFkYXRhJywgdHJpZ2dlckxvYWRzdGFydCk7XG5cbiAgICAgICAgaWYgKCFsb2Fkc3RhcnRGaXJlZCkge1xuICAgICAgICAgIC8vIFdlIGRpZCBtaXNzIHRoZSBvcmlnaW5hbCBuYXRpdmUgbG9hZHN0YXJ0LiBGaXJlIGl0IG5vdy5cbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZyb20gaGVyZSBvbiB3ZSBrbm93IHRoYXQgbG9hZHN0YXJ0IGFscmVhZHkgZmlyZWQgYW5kIHdlIG1pc3NlZCBpdC5cbiAgICAvLyBUaGUgb3RoZXIgcmVhZHlTdGF0ZSBldmVudHMgYXJlbid0IGFzIG11Y2ggb2YgYSBwcm9ibGVtIGlmIHdlIGRvdWJsZVxuICAgIC8vIHRoZW0sIHNvIG5vdCBnb2luZyB0byBnbyB0byBhcyBtdWNoIHRyb3VibGUgYXMgbG9hZHN0YXJ0IHRvIHByZXZlbnRcbiAgICAvLyB0aGF0IHVubGVzcyB3ZSBmaW5kIHJlYXNvbiB0by5cbiAgICB2YXIgZXZlbnRzVG9UcmlnZ2VyID0gWydsb2Fkc3RhcnQnXTtcblxuICAgIC8vIGxvYWRlZG1ldGFkYXRhOiBuZXdseSBlcXVhbCB0byBIQVZFX01FVEFEQVRBICgxKSBvciBncmVhdGVyXG4gICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2xvYWRlZG1ldGFkYXRhJyk7XG5cbiAgICAvLyBsb2FkZWRkYXRhOiBuZXdseSBpbmNyZWFzZWQgdG8gSEFWRV9DVVJSRU5UX0RBVEEgKDIpIG9yIGdyZWF0ZXJcbiAgICBpZiAoZWwucmVhZHlTdGF0ZSA+PSAyKSB7XG4gICAgICBldmVudHNUb1RyaWdnZXIucHVzaCgnbG9hZGVkZGF0YScpO1xuICAgIH1cblxuICAgIC8vIGNhbnBsYXk6IG5ld2x5IGluY3JlYXNlZCB0byBIQVZFX0ZVVFVSRV9EQVRBICgzKSBvciBncmVhdGVyXG4gICAgaWYgKGVsLnJlYWR5U3RhdGUgPj0gMykge1xuICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2NhbnBsYXknKTtcbiAgICB9XG5cbiAgICAvLyBjYW5wbGF5dGhyb3VnaDogbmV3bHkgZXF1YWwgdG8gSEFWRV9FTk9VR0hfREFUQSAoNClcbiAgICBpZiAoZWwucmVhZHlTdGF0ZSA+PSA0KSB7XG4gICAgICBldmVudHNUb1RyaWdnZXIucHVzaCgnY2FucGxheXRocm91Z2gnKTtcbiAgICB9XG5cbiAgICAvLyBXZSBzdGlsbCBuZWVkIHRvIGdpdmUgdGhlIHBsYXllciB0aW1lIHRvIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGV2ZW50c1RvVHJpZ2dlci5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcih0eXBlKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCB0aW1lIGZvciB0aGUgYEhUTUw1YCB0ZWNoLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vjb25kc1xuICAgKiAgICAgICAgU2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIG1lZGlhIHRvIHRoaXMuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24gc2V0Q3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVsXy5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nJDEoZSwgJ1ZpZGVvIGlzIG5vdCByZWFkeS4gKFZpZGVvLmpzKScpO1xuICAgICAgLy8gdGhpcy53YXJuaW5nKFZpZGVvSlMud2FybmluZ3MudmlkZW9Ob3RSZWFkeSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZHVyYXRpb24gb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZHVyYXRpb24gb2YgdGhlIG1lZGlhIG9yIDAgaWYgdGhlcmUgaXMgbm8gZHVyYXRpb24uXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24gZHVyYXRpb24oKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAvLyBBbmRyb2lkIENocm9tZSB3aWxsIHJlcG9ydCBkdXJhdGlvbiBhcyBJbmZpbml0eSBmb3IgVk9EIEhMUyB1bnRpbCBhZnRlclxuICAgIC8vIHBsYXliYWNrIGhhcyBzdGFydGVkLCB3aGljaCB0cmlnZ2VycyB0aGUgbGl2ZSBkaXNwbGF5IGVycm9uZW91c2x5LlxuICAgIC8vIFJldHVybiBOYU4gaWYgcGxheWJhY2sgaGFzIG5vdCBzdGFydGVkIGFuZCB0cmlnZ2VyIGEgZHVyYXRpb251cGRhdGUgb25jZVxuICAgIC8vIHRoZSBkdXJhdGlvbiBjYW4gYmUgcmVsaWFibHkga25vd24uXG4gICAgaWYgKHRoaXMuZWxfLmR1cmF0aW9uID09PSBJbmZpbml0eSAmJiBJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiB0aGlzLmVsXy5jdXJyZW50VGltZSA9PT0gMCkge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIGZpcnN0IGB0aW1ldXBkYXRlYCB3aXRoIGN1cnJlbnRUaW1lID4gMCAtIHRoZXJlIG1heSBiZVxuICAgICAgLy8gc2V2ZXJhbCB3aXRoIDBcbiAgICAgIHZhciBjaGVja1Byb2dyZXNzID0gZnVuY3Rpb24gY2hlY2tQcm9ncmVzcygpIHtcbiAgICAgICAgaWYgKF90aGlzMy5lbF8uY3VycmVudFRpbWUgPiAwKSB7XG4gICAgICAgICAgLy8gVHJpZ2dlciBkdXJhdGlvbmNoYW5nZSBmb3IgZ2VudWluZWx5IGxpdmUgdmlkZW9cbiAgICAgICAgICBpZiAoX3RoaXMzLmVsXy5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIF90aGlzMy50cmlnZ2VyKCdkdXJhdGlvbmNoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfdGhpczMub2ZmKCd0aW1ldXBkYXRlJywgY2hlY2tQcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMub24oJ3RpbWV1cGRhdGUnLCBjaGVja1Byb2dyZXNzKTtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsXy5kdXJhdGlvbiB8fCBOYU47XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF8ub2Zmc2V0V2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgaGVpZ3RoIG9mIHRoZSBIVE1MNSBtZWRpYSBlbGVtZW50LlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxfLm9mZnNldEhlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICogUHJveHkgaU9TIGB3ZWJraXRiZWdpbmZ1bGxzY3JlZW5gIGFuZCBgd2Via2l0ZW5kZnVsbHNjcmVlbmAgaW50b1xuICAgKiBgZnVsbHNjcmVlbmNoYW5nZWAgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBmaXJlcyBmdWxsc2NyZWVuY2hhbmdlXG4gICAqIEBsaXN0ZW5zIHdlYmtpdGVuZGZ1bGxzY3JlZW5cbiAgICogQGxpc3RlbnMgd2Via2l0YmVnaW5mdWxsc2NyZWVuXG4gICAqIEBsaXN0ZW5zIHdlYmtpdGJlZ2luZnVsbHNjcmVlblxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5wcm94eVdlYmtpdEZ1bGxzY3JlZW5fID0gZnVuY3Rpb24gcHJveHlXZWJraXRGdWxsc2NyZWVuXygpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmICghKCd3ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbicgaW4gdGhpcy5lbF8pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVuZEZuID0gZnVuY3Rpb24gZW5kRm4oKSB7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB7IGlzRnVsbHNjcmVlbjogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHZhciBiZWdpbkZuID0gZnVuY3Rpb24gYmVnaW5GbigpIHtcbiAgICAgIGlmICgnd2Via2l0UHJlc2VudGF0aW9uTW9kZScgaW4gdGhpcy5lbF8gJiYgdGhpcy5lbF8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSAhPT0gJ3BpY3R1cmUtaW4tcGljdHVyZScpIHtcbiAgICAgICAgdGhpcy5vbmUoJ3dlYmtpdGVuZGZ1bGxzY3JlZW4nLCBlbmRGbik7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJywgeyBpc0Z1bGxzY3JlZW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGJlZ2luRm4pO1xuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczQub2ZmKCd3ZWJraXRiZWdpbmZ1bGxzY3JlZW4nLCBiZWdpbkZuKTtcbiAgICAgIF90aGlzNC5vZmYoJ3dlYmtpdGVuZGZ1bGxzY3JlZW4nLCBlbmRGbik7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGZ1bGxzY3JlZW4gaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHBsYXliYWNrIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgZnVsbHNjcmVlbiBpcyBzdXBwb3J0ZWQuXG4gICAqICAgICAgICAgLSBGYWxzZSBpZiBmdWxsc2NyZWVuIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnN1cHBvcnRzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uIHN1cHBvcnRzRnVsbFNjcmVlbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZWxfLndlYmtpdEVudGVyRnVsbFNjcmVlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG5cbiAgICAgIC8vIFNlZW1zIHRvIGJlIGJyb2tlbiBpbiBDaHJvbWl1bS9DaHJvbWUgJiYgU2FmYXJpIGluIExlb3BhcmRcbiAgICAgIGlmICgvQW5kcm9pZC8udGVzdCh1c2VyQWdlbnQpIHx8ICEvQ2hyb21lfE1hYyBPUyBYIDEwLjUvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBlbnRlciBmdWxsc2NyZWVuLlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5lbnRlckZ1bGxTY3JlZW4gPSBmdW5jdGlvbiBlbnRlckZ1bGxTY3JlZW4oKSB7XG4gICAgdmFyIHZpZGVvID0gdGhpcy5lbF87XG5cbiAgICBpZiAodmlkZW8ucGF1c2VkICYmIHZpZGVvLm5ldHdvcmtTdGF0ZSA8PSB2aWRlby5IQVZFX01FVEFEQVRBKSB7XG4gICAgICAvLyBhdHRlbXB0IHRvIHByaW1lIHRoZSB2aWRlbyBlbGVtZW50IGZvciBwcm9ncmFtbWF0aWMgYWNjZXNzXG4gICAgICAvLyB0aGlzIGlzbid0IG5lY2Vzc2FyeSBvbiB0aGUgZGVza3RvcCBidXQgc2hvdWxkbid0IGh1cnRcbiAgICAgIHRoaXMuZWxfLnBsYXkoKTtcblxuICAgICAgLy8gcGxheWluZyBhbmQgcGF1c2luZyBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byBmdWxsc2NyZWVuXG4gICAgICAvLyBjYW4gZ2V0IGlPUyB+Ni4xIGRldmljZXMgaW50byBhIHBsYXkvcGF1c2UgbG9vcFxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgICAgdmlkZW8ud2Via2l0RW50ZXJGdWxsU2NyZWVuKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlkZW8ud2Via2l0RW50ZXJGdWxsU2NyZWVuKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBleGl0IGZ1bGxzY3JlZW4uXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gZXhpdEZ1bGxTY3JlZW4oKSB7XG4gICAgdGhpcy5lbF8ud2Via2l0RXhpdEZ1bGxTY3JlZW4oKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYEh0bWw1YCBUZWNoJ3Mgc291cmNlIG9iamVjdC5cbiAgICogPiBOb3RlOiBQbGVhc2UgdXNlIHtAbGluayBIdG1sNSNzZXRTb3VyY2V9XG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IFtzcmNdXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB5b3Ugd2FudCB0byBzZXQgb24gdGhlIGBIVE1MNWAgdGVjaHMgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIC0gVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdCB3aGVuIGEgc291cmNlIGlzIG5vdCBwYXNzZWQgaW4uXG4gICAqICAgICAgICAgLSB1bmRlZmluZWQgd2hlbiBzZXR0aW5nXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNS5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuc3JjID0gZnVuY3Rpb24gc3JjKF9zcmMpIHtcbiAgICBpZiAoX3NyYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbF8uc3JjO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgc3JjIHRocm91Z2ggYHNyY2AgaW5zdGVhZCBvZiBgc2V0U3JjYCB3aWxsIGJlIGRlcHJlY2F0ZWRcbiAgICB0aGlzLnNldFNyYyhfc3JjKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRlY2ggYnkgcmVtb3ZpbmcgYWxsIHNvdXJjZXMgYW5kIHRoZW4gY2FsbGluZ1xuICAgKiB7QGxpbmsgSHRtbDUucmVzZXRNZWRpYUVsZW1lbnR9LlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIEh0bWw1LnJlc2V0TWVkaWFFbGVtZW50KHRoaXMuZWxfKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNvdXJjZSBvbiB0aGUgYEhUTUw1YCBUZWNoLiBGYWxscyBiYWNrIHRvIHJldHVybmluZyB0aGUgc291cmNlIGZyb21cbiAgICogdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge1RlY2h+U291cmNlT2JqZWN0fVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3QgZnJvbSB0aGUgSFRNTDUgdGVjaC4gV2l0aCBhIGZhbGxiYWNrIHRvIHRoZVxuICAgKiAgICAgICAgIGVsZW1lbnRzIHNvdXJjZS5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuY3VycmVudFNyYyA9IGZ1bmN0aW9uIGN1cnJlbnRTcmMoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFNvdXJjZV8pIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2VfLnNyYztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxfLmN1cnJlbnRTcmM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBjb250cm9scyBhdHRyaWJ1dGUgZm9yIHRoZSBIVE1MNSBtZWRpYSBFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gICAqICAgICAgICBWYWx1ZSB0byBzZXQgdGhlIGNvbnRyb2xzIGF0dHJpYnV0ZSB0b1xuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5zZXRDb250cm9scyA9IGZ1bmN0aW9uIHNldENvbnRyb2xzKHZhbCkge1xuICAgIHRoaXMuZWxfLmNvbnRyb2xzID0gISF2YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogICAgICAgIExhYmVsIHRvIGlkZW50aWZ5IHRoZSB0ZXh0IHRyYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2VdXG4gICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2t9XG4gICAqICAgICAgICAgVGhlIFRleHRUcmFjayB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuYWRkVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSkge1xuICAgIGlmICghdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgIHJldHVybiBfVGVjaC5wcm90b3R5cGUuYWRkVGV4dFRyYWNrLmNhbGwodGhpcywga2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZWl0aGVyIG5hdGl2ZSBUZXh0VHJhY2sgb3IgYW4gZW11bGF0ZWQgVGV4dFRyYWNrIGRlcGVuZGluZ1xuICAgKiBvbiB0aGUgdmFsdWUgb2YgYGZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrc2BcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gdGhlIG9wdGlvbnMgdG8gaW50aWFsaXplIHRoZSBUZXh0VHJhY2sgd2l0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtpbmRdXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0uXG4gICAqICAgICAgICBMYWJlbCB0byBpZGVudGlmeSB0aGUgdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2VdXG4gICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgRGVmYXVsdCB0aGlzIHRyYWNrIHRvIG9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWRdXG4gICAqICAgICAgICBUaGUgaW50ZXJuYWwgaWQgdG8gYXNzaWduIHRoaXMgdHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHNvdXJjZSB1cmwgZm9yIHRoZSB0cmFjay5cbiAgICpcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH1cbiAgICogICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuY3JlYXRlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gY3JlYXRlUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICByZXR1cm4gX1RlY2gucHJvdG90eXBlLmNyZWF0ZVJlbW90ZVRleHRUcmFjay5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG5cbiAgICBpZiAob3B0aW9ucy5raW5kKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmtpbmQgPSBvcHRpb25zLmtpbmQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmxhYmVsKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmxhYmVsID0gb3B0aW9ucy5sYWJlbDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5zcmNsYW5nKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LnNyY2xhbmcgPSBvcHRpb25zLmxhbmd1YWdlIHx8IG9wdGlvbnMuc3JjbGFuZztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnNbJ2RlZmF1bHQnXSkge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudFsnZGVmYXVsdCddID0gb3B0aW9uc1snZGVmYXVsdCddO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pZCkge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudC5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNyYykge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudC5zcmMgPSBvcHRpb25zLnNyYztcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gdmFsdWVzIGZvclxuICAgKiBraW5kLCBsYW5ndWFnZSwgbGFiZWwsIGFuZCBzcmMgKGxvY2F0aW9uIG9mIHRoZSBXZWJWVFQgZmlsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFudWFsQ2xlYW51cD10cnVlXSBpZiBzZXQgdG8gZmFsc2UsIHRoZSBUZXh0VHJhY2sgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuZXZlciB0aGUgc291cmNlIGNoYW5nZXNcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH0gQW4gSHRtbCBUcmFjayBFbGVtZW50LlxuICAgKiBUaGlzIGNhbiBiZSBhbiBlbXVsYXRlZCB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0gb3IgYSBuYXRpdmUgb25lLlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgXCJtYW51YWxDbGVhbnVwXCIgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdFxuICAgKiB0byBcImZhbHNlXCIgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgVmlkZW8uanNcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuYWRkUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMsIG1hbnVhbENsZWFudXApIHtcbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IF9UZWNoLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2suY2FsbCh0aGlzLCBvcHRpb25zLCBtYW51YWxDbGVhbnVwKTtcblxuICAgIGlmICh0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgdGhpcy5lbCgpLmFwcGVuZENoaWxkKGh0bWxUcmFja0VsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sVHJhY2tFbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgcmVtb3RlIGBUZXh0VHJhY2tgIGZyb20gYFRleHRUcmFja0xpc3RgIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja30gdHJhY2tcbiAgICogICAgICAgIGBUZXh0VHJhY2tgIG9iamVjdCB0byByZW1vdmVcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUucmVtb3ZlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKSB7XG4gICAgX1RlY2gucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjay5jYWxsKHRoaXMsIHRyYWNrKTtcblxuICAgIGlmICh0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgdmFyIHRyYWNrcyA9IHRoaXMuJCQoJ3RyYWNrJyk7XG5cbiAgICAgIHZhciBpID0gdHJhY2tzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAodHJhY2sgPT09IHRyYWNrc1tpXSB8fCB0cmFjayA9PT0gdHJhY2tzW2ldLnRyYWNrKSB7XG4gICAgICAgICAgdGhpcy5lbCgpLnJlbW92ZUNoaWxkKHRyYWNrc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYXZhaWxhYmxlIG1lZGlhIHBsYXliYWNrIHF1YWxpdHkgbWV0cmljcyBhcyBzcGVjaWZpZWQgYnkgdGhlIFczQydzIE1lZGlhXG4gICAqIFBsYXliYWNrIFF1YWxpdHkgQVBJLlxuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhLXBsYXliYWNrLXF1YWxpdHl9XG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogICAgICAgICBBbiBvYmplY3Qgd2l0aCBzdXBwb3J0ZWQgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5ID0gZnVuY3Rpb24gZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmVsKCkuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsKCkuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTtcbiAgICB9XG5cbiAgICB2YXIgdmlkZW9QbGF5YmFja1F1YWxpdHkgPSB7fTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERyb3BwZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERlY29kZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkuZHJvcHBlZFZpZGVvRnJhbWVzID0gdGhpcy5lbCgpLndlYmtpdERyb3BwZWRGcmFtZUNvdW50O1xuICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkudG90YWxWaWRlb0ZyYW1lcyA9IHRoaXMuZWwoKS53ZWJraXREZWNvZGVkRnJhbWVDb3VudDtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnBlcmZvcm1hbmNlICYmIHR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2aWRlb1BsYXliYWNrUXVhbGl0eS5jcmVhdGlvblRpbWUgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZyAmJiB0eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICB2aWRlb1BsYXliYWNrUXVhbGl0eS5jcmVhdGlvblRpbWUgPSB3aW5kb3cuRGF0ZS5ub3coKSAtIHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiB2aWRlb1BsYXliYWNrUXVhbGl0eTtcbiAgfTtcblxuICByZXR1cm4gSHRtbDU7XG59KFRlY2gpO1xuXG4vKiBIVE1MNSBTdXBwb3J0IFRlc3RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pZiAoaXNSZWFsKCkpIHtcblxuICAvKipcbiAgICogRWxlbWVudCBmb3IgdGVzdGluZyBicm93c2VyIEhUTUw1IG1lZGlhIGNhcGFiaWxpdGllc1xuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudH1cbiAgICogQGNvbnN0YW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBIdG1sNS5URVNUX1ZJRCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gIHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG5cbiAgdHJhY2sua2luZCA9ICdjYXB0aW9ucyc7XG4gIHRyYWNrLnNyY2xhbmcgPSAnZW4nO1xuICB0cmFjay5sYWJlbCA9ICdFbmdsaXNoJztcbiAgSHRtbDUuVEVTVF9WSUQuYXBwZW5kQ2hpbGQodHJhY2spO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUTUw1IG1lZGlhIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVHJ1ZSBpZiBIVE1MNSBtZWRpYSBpcyBzdXBwb3J0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaWYgSFRNTDUgbWVkaWEgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuSHRtbDUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIElFOSB3aXRoIG5vIE1lZGlhIFBsYXllciBpcyBhIExJQVIhICgjOTg0KVxuICB0cnkge1xuICAgIEh0bWw1LlRFU1RfVklELnZvbHVtZSA9IDAuNTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhIShIdG1sNS5URVNUX1ZJRCAmJiBIdG1sNS5URVNUX1ZJRC5jYW5QbGF5VHlwZSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiB0eXBlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAqIEByZXR1cm4ge3N0cmluZ30gJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuSHRtbDUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gSHRtbDUuVEVTVF9WSUQuY2FuUGxheVR5cGUodHlwZSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNPYmpcbiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgICAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHRlY2hcbiAqIEByZXR1cm4ge3N0cmluZ30gJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuSHRtbDUuY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uIChzcmNPYmosIG9wdGlvbnMpIHtcbiAgcmV0dXJuIEh0bWw1LmNhblBsYXlUeXBlKHNyY09iai50eXBlKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZvbHVtZSBjYW4gYmUgY2hhbmdlZCBpbiB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICogVm9sdW1lIGNhbm5vdCBiZSBjaGFuZ2VkIGluIGEgbG90IG9mIG1vYmlsZSBkZXZpY2VzLlxuICogU3BlY2lmaWNhbGx5LCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gMSBvbiBpT1MuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHZvbHVtZSBjYW4gYmUgY29udHJvbGxlZFxuICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZVxuICovXG5IdG1sNS5jYW5Db250cm9sVm9sdW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBJRSB3aWxsIGVycm9yIGlmIFdpbmRvd3MgTWVkaWEgUGxheWVyIG5vdCBpbnN0YWxsZWQgIzMzMTVcbiAgdHJ5IHtcbiAgICB2YXIgdm9sdW1lID0gSHRtbDUuVEVTVF9WSUQudm9sdW1lO1xuXG4gICAgSHRtbDUuVEVTVF9WSUQudm9sdW1lID0gdm9sdW1lIC8gMiArIDAuMTtcbiAgICByZXR1cm4gdm9sdW1lICE9PSBIdG1sNS5URVNUX1ZJRC52b2x1bWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZvbHVtZSBjYW4gYmUgbXV0ZWQgaW4gdGhpcyBicm93c2VyL2RldmljZS5cbiAqIFNvbWUgZGV2aWNlcywgZS5nLiBpT1MsIGRvbid0IGFsbG93IGNoYW5naW5nIHZvbHVtZVxuICogYnV0IHBlcm1pdHMgbXV0aW5nL3VubXV0aW5nLlxuICpcbiAqIEByZXR1cm4ge2JvbGVhbn1cbiAqICAgICAgLSBUcnVlIGlmIHZvbHVtZSBjYW4gYmUgbXV0ZWRcbiAqICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuY2FuTXV0ZVZvbHVtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbXV0ZWQgPSBIdG1sNS5URVNUX1ZJRC5tdXRlZDtcblxuICAgIC8vIGluIHNvbWUgdmVyc2lvbnMgb2YgaU9TIG11dGVkIHByb3BlcnR5IGRvZXNuJ3QgYWx3YXlzXG4gICAgLy8gd29yaywgc28gd2Ugd2FudCB0byBzZXQgYm90aCBwcm9wZXJ0eSBhbmQgYXR0cmlidXRlXG4gICAgSHRtbDUuVEVTVF9WSUQubXV0ZWQgPSAhbXV0ZWQ7XG4gICAgaWYgKEh0bWw1LlRFU1RfVklELm11dGVkKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoSHRtbDUuVEVTVF9WSUQsICdtdXRlZCcsICdtdXRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVBdHRyaWJ1dGUoSHRtbDUuVEVTVF9WSUQsICdtdXRlZCcsICdtdXRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbXV0ZWQgIT09IEh0bWw1LlRFU1RfVklELm11dGVkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBwbGF5YmFjayByYXRlIGNhbiBiZSBjaGFuZ2VkIGluIHRoaXMgYnJvd3Nlci9kZXZpY2UuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHBsYXliYWNrIHJhdGUgY2FuIGJlIGNvbnRyb2xsZWRcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUGxheWJhY2sgcmF0ZSBBUEkgaXMgaW1wbGVtZW50ZWQgaW4gQW5kcm9pZCBDaHJvbWUsIGJ1dCBkb2Vzbid0IGRvIGFueXRoaW5nXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy8zMTgwXG4gIGlmIChJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiBDSFJPTUVfVkVSU0lPTiA8IDU4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIElFIHdpbGwgZXJyb3IgaWYgV2luZG93cyBNZWRpYSBQbGF5ZXIgbm90IGluc3RhbGxlZCAjMzMxNVxuICB0cnkge1xuICAgIHZhciBwbGF5YmFja1JhdGUgPSBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGU7XG5cbiAgICBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGUgLyAyICsgMC4xO1xuICAgIHJldHVybiBwbGF5YmFja1JhdGUgIT09IEh0bWw1LlRFU1RfVklELnBsYXliYWNrUmF0ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBjYW4gb3ZlcnJpZGUgYSB2aWRlby9hdWRpbyBlbGVtZW50cyBhdHRyaWJ1dGVzLCB3aXRoXG4gKiBPYmplY3QuZGVmaW5lUHJvcGVydHkuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGJ1aWx0aW4gYXR0cmlidXRlcyBjYW4gYmUgb3ZlcnJpZGVuXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbkh0bWw1LmNhbk92ZXJyaWRlQXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKElTX0lFOCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiB3ZSBjYW5ub3Qgb3ZlcndyaXRlIHRoZSBzcmMvaW5uZXJIVE1MIHByb3BlcnR5LCB0aGVyZSBpcyBubyBzdXBwb3J0XG4gIC8vIGlPUyA3IHNhZmFyaSBmb3IgaW5zdGFuY2UgY2Fubm90IGRvIHRoaXMuXG4gIHRyeSB7XG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKSwgJ3NyYycsIHsgZ2V0OiBub29wLCBzZXQ6IG5vb3AgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJyksICdzcmMnLCB7IGdldDogbm9vcCwgc2V0OiBub29wIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpLCAnaW5uZXJIVE1MJywgeyBnZXQ6IG5vb3AsIHNldDogbm9vcCB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXVkaW8nKSwgJ2lubmVySFRNTCcsIHsgZ2V0OiBub29wLCBzZXQ6IG5vb3AgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgVGV4dFRyYWNrYHMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVHJ1ZSBpZiBuYXRpdmUgYFRleHRUcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbkh0bWw1LnN1cHBvcnRzTmF0aXZlVGV4dFRyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIElTX0FOWV9TQUZBUkkgfHwgSVNfSU9TICYmIElTX0NIUk9NRTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgVmlkZW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyL2RldmljZVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgLSBUcnVlIGlmIG5hdGl2ZSBgVmlkZW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVWaWRlb1RyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhKEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELnZpZGVvVHJhY2tzKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgQXVkaW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyL2RldmljZVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgLSBUcnVlIGlmIG5hdGl2ZSBgQXVkaW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVBdWRpb1RyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhKEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELmF1ZGlvVHJhY2tzKTtcbn07XG5cbi8qKlxuICogQW4gYXJyYXkgb2YgZXZlbnRzIGF2YWlsYWJsZSBvbiB0aGUgSHRtbDUgdGVjaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0FycmF5fVxuICovXG5IdG1sNS5FdmVudHMgPSBbJ2xvYWRzdGFydCcsICdzdXNwZW5kJywgJ2Fib3J0JywgJ2Vycm9yJywgJ2VtcHRpZWQnLCAnc3RhbGxlZCcsICdsb2FkZWRtZXRhZGF0YScsICdsb2FkZWRkYXRhJywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAncGxheWluZycsICd3YWl0aW5nJywgJ3NlZWtpbmcnLCAnc2Vla2VkJywgJ2VuZGVkJywgJ2R1cmF0aW9uY2hhbmdlJywgJ3RpbWV1cGRhdGUnLCAncHJvZ3Jlc3MnLCAncGxheScsICdwYXVzZScsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICd2b2x1bWVjaGFuZ2UnXTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHZvbHVtZSBjb250cm9sLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHQge0BsaW5rIEh0bWw1LmNhbkNvbnRyb2xWb2x1bWV9XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc1ZvbHVtZUNvbnRyb2wgPSBIdG1sNS5jYW5Db250cm9sVm9sdW1lKCk7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyBtdXRpbmcgdm9sdW1lLlxuICpcbiAqIEB0eXBlIHtib2xlYW59XG4gKiBAZGVmYXVsdCB7QGxpbmsgSHRtbDUuY2FuTXV0ZVZvbHVtZX1cbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzTXV0ZUNvbnRyb2wgPSBIdG1sNS5jYW5NdXRlVm9sdW1lKCk7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyBjaGFuZ2luZyB0aGUgc3BlZWQgYXQgd2hpY2ggdGhlIG1lZGlhXG4gKiBwbGF5cy4gRXhhbXBsZXM6XG4gKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDJ4ICh0d2ljZSkgYXMgZmFzdFxuICogICAtIFNldCBwbGF5ZXIgdG8gcGxheSAwLjV4IChoYWxmKSBhcyBmYXN0XG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCB7QGxpbmsgSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZX1cbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSgpO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyB0aGUgYHNvdXJjZXNldGAgZXZlbnQuXG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdFxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNTb3VyY2VzZXQgPSBIdG1sNS5jYW5PdmVycmlkZUF0dHJpYnV0ZXMoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgbWVkaWEgZWxlbWVudFxuICogbW92aW5nIGluIHRoZSBET00uIGlPUyBicmVha3MgaWYgeW91IG1vdmUgdGhlIG1lZGlhIGVsZW1lbnQsIHNvIHRoaXMgaXMgc2V0IHRoaXMgdG9cbiAqIGZhbHNlIHRoZXJlLiBFdmVyeXdoZXJlIGVsc2UgdGhpcyBzaG91bGQgYmUgdHJ1ZS5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5tb3ZpbmdNZWRpYUVsZW1lbnRJbkRPTSA9ICFJU19JT1M7XG5cbi8vIFRPRE86IFByZXZpb3VzIGNvbW1lbnQ6IE5vIGxvbmdlciBhcHBlYXJzIHRvIGJlIHVzZWQuIENhbiBwcm9iYWJseSBiZSByZW1vdmVkLlxuLy8gICAgICAgSXMgdGhpcyB0cnVlP1xuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBhdXRvbWF0aWMgbWVkaWEgcmVzaXplXG4gKiB3aGVuIGdvaW5nIGludG8gZnVsbHNjcmVlbi5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc0Z1bGxzY3JlZW5SZXNpemUgPSB0cnVlO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgSFRNTDVgIHRlY2ggY3VycmVudGx5IHN1cHBvcnRzIHRoZSBwcm9ncmVzcyBldmVudC5cbiAqIElmIHRoaXMgaXMgZmFsc2UsIG1hbnVhbCBgcHJvZ3Jlc3NgIGV2ZW50cyB3aWxsIGJlIHRyaWdncmVkIGluc3RlYWQuXG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdFxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cyA9IHRydWU7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIHRpbWV1cGRhdGUgZXZlbnQuXG4gKiBJZiB0aGlzIGlzIGZhbHNlLCBtYW51YWwgYHRpbWV1cGRhdGVgIGV2ZW50cyB3aWxsIGJlIHRyaWdncmVkIGluc3RlYWQuXG4gKlxuICogQGRlZmF1bHRcbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cyA9IHRydWU7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgbmF0aXZlIGBUZXh0VHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZVRleHRUcmFja3N9XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSBIdG1sNS5zdXBwb3J0c05hdGl2ZVRleHRUcmFja3MoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBuYXRpdmUgYFZpZGVvVHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZVZpZGVvVHJhY2tzfVxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVWaWRlb1RyYWNrcyA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlVmlkZW9UcmFja3MoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBuYXRpdmUgYEF1ZGlvVHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZUF1ZGlvVHJhY2tzfVxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVBdWRpb1RyYWNrcyA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlQXVkaW9UcmFja3MoKTtcblxuLy8gSFRNTDUgRmVhdHVyZSBkZXRlY3Rpb24gYW5kIERldmljZSBGaXhlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbnZhciBjYW5QbGF5VHlwZSA9IEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZTtcbnZhciBtcGVndXJsUkUgPSAvXmFwcGxpY2F0aW9uXFwvKD86eC18dm5kXFwuYXBwbGVcXC4pbXBlZ3VybC9pO1xudmFyIG1wNFJFID0gL152aWRlb1xcL21wNC9pO1xuXG5IdG1sNS5wYXRjaENhblBsYXlUeXBlID0gZnVuY3Rpb24gKCkge1xuXG4gIC8vIEFuZHJvaWQgNC4wIGFuZCBhYm92ZSBjYW4gcGxheSBITFMgdG8gc29tZSBleHRlbnQgYnV0IGl0IHJlcG9ydHMgYmVpbmcgdW5hYmxlIHRvIGRvIHNvXG4gIC8vIEZpcmVmb3ggYW5kIENocm9tZSByZXBvcnQgY29ycmVjdGx5XG4gIGlmIChBTkRST0lEX1ZFUlNJT04gPj0gNC4wICYmICFJU19GSVJFRk9YICYmICFJU19DSFJPTUUpIHtcbiAgICBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgaWYgKHR5cGUgJiYgbXBlZ3VybFJFLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuICdtYXliZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgQW5kcm9pZCAyLjIgYW5kIGxlc3MgY2FuUGxheVR5cGUgbWV0aG9kIHdoaWNoIGlzIGJyb2tlblxuICB9IGVsc2UgaWYgKElTX09MRF9BTkRST0lEKSB7XG4gICAgSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlICYmIG1wNFJFLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuICdtYXliZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICB9O1xuICB9XG59O1xuXG5IdG1sNS51bnBhdGNoQ2FuUGxheVR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlO1xuXG4gIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZSA9IGNhblBsYXlUeXBlO1xuICByZXR1cm4gcjtcbn07XG5cbi8vIGJ5IGRlZmF1bHQsIHBhdGNoIHRoZSBtZWRpYSBlbGVtZW50XG5IdG1sNS5wYXRjaENhblBsYXlUeXBlKCk7XG5cbkh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKCFlbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlbC5wYXJlbnROb2RlKSB7XG4gICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gIH1cblxuICAvLyByZW1vdmUgYW55IGNoaWxkIHRyYWNrIG9yIHNvdXJjZSBub2RlcyB0byBwcmV2ZW50IHRoZWlyIGxvYWRpbmdcbiAgd2hpbGUgKGVsLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFueSBzcmMgcmVmZXJlbmNlLiBub3Qgc2V0dGluZyBgc3JjPScnYCBiZWNhdXNlIHRoYXQgY2F1c2VzIGEgd2FybmluZ1xuICAvLyBpbiBmaXJlZm94XG4gIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgLy8gZm9yY2UgdGhlIG1lZGlhIGVsZW1lbnQgdG8gdXBkYXRlIGl0cyBsb2FkaW5nIHN0YXRlIGJ5IGNhbGxpbmcgbG9hZCgpXG4gIC8vIGhvd2V2ZXIgSUUgb24gV2luZG93cyA3TiBoYXMgYSBidWcgdGhhdCB0aHJvd3MgYW4gZXJyb3Igc28gbmVlZCBhIHRyeS9jYXRjaCAoIzc5MylcbiAgaWYgKHR5cGVvZiBlbC5sb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gd3JhcHBpbmcgaW4gYW4gaWlmZSBzbyBpdCdzIG5vdCBkZW9wdGltaXplZCAoIzEwNjAjZGlzY3Vzc2lvbl9yMTAzMjQ0NzMpXG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVsLmxvYWQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cbn07XG5cbkh0bWw1LnJlc2V0TWVkaWFFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gIGlmICghZWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc291cmNlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NvdXJjZScpO1xuICB2YXIgaSA9IHNvdXJjZXMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBlbC5yZW1vdmVDaGlsZChzb3VyY2VzW2ldKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgc3JjIHJlZmVyZW5jZS5cbiAgLy8gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IHRocm93cyBhbiBlcnJvclxuICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuXG4gIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHdyYXBwaW5nIGluIGFuIGlpZmUgc28gaXQncyBub3QgZGVvcHRpbWl6ZWQgKCMxMDYwI2Rpc2N1c3Npb25fcjEwMzI0NDczKVxuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5sb2FkKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNhdGlzZnkgbGludGVyXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxufTtcblxuLyogTmF0aXZlIEhUTUw1IGVsZW1lbnQgcHJvcGVydHkgd3JhcHBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFdyYXAgbmF0aXZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGdldHRlcnMgdGhhdCBjaGVjayBib3RoIHByb3BlcnR5IGFuZCBhdHRyaWJ1dGVcbi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd2VkOlxuLy8gbXV0ZWQsIGRlZmF1bHRNdXRlZCwgYXV0b3BsYXksIGNvbnRyb2xzLCBsb29wLCBwbGF5c2lubGluZVxuW1xuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBtdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYG11dGVkYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIHZvbHVtZSBmb3IgdGhlIG1lZGlhIHNob3VsZCBiZSBzZXQgdG8gc2lsZW50LiBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGNoYW5nZVxuICogdGhlIGB2b2x1bWVgIGF0dHJpYnV0ZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I211dGVkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgdGhlIHZhbHVlIG9mIGB2b2x1bWVgIHNob3VsZCBiZSBpZ25vcmVkIGFuZCB0aGUgYXVkaW8gc2V0IHRvIHNpbGVudC5cbiAqICAgICAgICAgLSBGYWxzZSBpZiB0aGUgdmFsdWUgb2YgYHZvbHVtZWAgc2hvdWxkIGJlIHVzZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1tdXRlZH1cbiAqL1xuJ211dGVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBkZWZhdWx0TXV0ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBkZWZhdWx0TXV0ZWRgIGluZGljYXRlc1xuICogd2hldGhlciB0aGUgbWVkaWEgc2hvdWxkIHN0YXJ0IG11dGVkIG9yIG5vdC4gT25seSBjaGFuZ2VzIHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZVxuICogbWVkaWEuIGBtdXRlZGAgYW5kIGBkZWZhdWx0TXV0ZWRgIGNhbiBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuIHtAbGluayBIdG1sNSNtdXRlZH0gaW5kaWNhdGVzIHRoZVxuICogY3VycmVudCBzdGF0ZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2RlZmF1bHRNdXRlZFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgYGRlZmF1bHRNdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgbXV0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3Qgc3RhcnQgbXV0ZWRcbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRtdXRlZH1cbiAqL1xuJ2RlZmF1bHRNdXRlZCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgYXV0b3BsYXlgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBhdXRvcGxheWAgaW5kaWNhdGVzXG4gKiB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgdG8gcGxheSBhcyBzb29uIGFzIHRoZSBwYWdlIGlzIHJlYWR5LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjYXV0b3BsYXlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBhdXRvcGxheWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgYXMgc29vbiBhcyB0aGUgcGFnZSBsb2Fkcy5cbiAqICAgICAgICAgLSBGYWxzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2hvdWxkIG5vdCBzdGFydCBhcyBzb29uIGFzIHRoZSBwYWdlIGxvYWRzLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWF1dG9wbGF5fVxuICovXG4nYXV0b3BsYXknLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGNvbnRyb2xzYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgY29udHJvbHNgIGluZGljYXRlc1xuICogd2hldGhlciB0aGUgbmF0aXZlIG1lZGlhIGNvbnRyb2xzIHNob3VsZCBiZSBzaG93biBvciBoaWRkZW4uXG4gKlxuICogQG1ldGhvZCBIdG1sNSNjb250cm9sc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgYGNvbnRyb2xzYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LlxuICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgbmF0aXZlIGNvbnRyb2xzIHNob3VsZCBiZSBzaG93aW5nLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IG5hdGl2ZSBjb250cm9scyBzaG91bGQgYmUgaGlkZGVuLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWNvbnRyb2xzfVxuICovXG4nY29udHJvbHMnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGxvb3BgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBsb29wYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCByZXR1cm4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZWRpYSBhbmQgY29udGludWUgcGxheWluZyBvbmNlXG4gKiBpdCByZWFjaGVzIHRoZSBlbmQuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNsb29wXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgbG9vcGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBzZWVrIGJhY2sgdG8gc3RhcnQgb25jZVxuICogICAgICAgICAgIHRoZSBlbmQgb2YgYSBtZWRpYSBpcyByZWFjaGVkLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBub3QgbG9vcCBiYWNrIHRvIHRoZSBzdGFydCB3aGVuIHRoZVxuICogICAgICAgICAgIGVuZCBvZiB0aGUgbWVkaWEgaXMgcmVhY2hlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1sb29wfVxuICovXG4nbG9vcCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgcGxheXNpbmxpbmVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5c2lubGluZWAgaW5kaWNhdGVzXG4gKiB0byB0aGUgYnJvd3NlciB0aGF0IG5vbi1mdWxsc2NyZWVuIHBsYXliYWNrIGlzIHByZWZlcnJlZCB3aGVuIGZ1bGxzY3JlZW5cbiAqIHBsYXliYWNrIGlzIHRoZSBuYXRpdmUgZGVmYXVsdCwgc3VjaCBhcyBpbiBpT1MgU2FmYXJpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjcGxheXNpbmxpbmVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBwbGF5c2lubGluZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgcGxheSBpbmxpbmUuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3QgcGxheSBpbmxpbmUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0ci12aWRlby1wbGF5c2lubGluZX1cbiAqL1xuJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbcHJvcF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxfW3Byb3BdIHx8IHRoaXMuZWxfLmhhc0F0dHJpYnV0ZShwcm9wKTtcbiAgfTtcbn0pO1xuXG4vLyBXcmFwIG5hdGl2ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2l0aCBzZXR0ZXJzIHRoYXQgc2V0IGJvdGggcHJvcGVydHkgYW5kIGF0dHJpYnV0ZVxuLy8gVGhlIGxpc3QgaXMgYXMgZm9sbG93ZWQ6XG4vLyBzZXRNdXRlZCwgc2V0RGVmYXVsdE11dGVkLCBzZXRBdXRvcGxheSwgc2V0TG9vcCwgc2V0UGxheXNpbmxpbmVcbi8vIHNldENvbnRyb2xzIGlzIHNwZWNpYWwtY2FzZWQgYWJvdmVcbltcbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgbXV0ZWRgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgbXV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBzaG91bGQgYmUgc2lsZW50LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0TXV0ZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXV0ZWRcbiAqICAgICAgICAtIFRydWUgaWYgdGhlIGF1ZGlvIHNob3VsZCBiZSBzZXQgdG8gc2lsZW50XG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLW11dGVkfVxuICovXG4nbXV0ZWQnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGRlZmF1bHRNdXRlZGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBkZWZhdWx0TXV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBzaG91bGQgYmUgc2lsZW50LCBidXQgd2lsbCBvbmx5IGVmZmVjdCB0aGUgbXV0ZWQgbGV2ZWwgb24gaW50aWFsIHBsYXliYWNrLi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1LnByb3RvdHlwZS5zZXREZWZhdWx0TXV0ZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVmYXVsdE11dGVkXG4gKiAgICAgICAgLSBUcnVlIGlmIHRoZSBhdWRpbyBzaG91bGQgYmUgc2V0IHRvIHNpbGVudFxuICogICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1kZWZhdWx0bXV0ZWR9XG4gKi9cbidkZWZhdWx0TXV0ZWQnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGF1dG9wbGF5YCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYGF1dG9wbGF5YCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCB0byBwbGF5IGFzIHNvb24gYXMgdGhlIHBhZ2UgaXMgcmVhZHkuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZXRBdXRvcGxheVxuICogQHBhcmFtIHtib29sZWFufSBhdXRvcGxheVxuICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCBhcyBzb29uIGFzIHRoZSBwYWdlIGxvYWRzLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHN0YXJ0IGFzIHNvb24gYXMgdGhlIHBhZ2UgbG9hZHMuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtYXV0b3BsYXl9XG4gKi9cbidhdXRvcGxheScsXG5cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgbG9vcGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBsb29wYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCByZXR1cm4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZWRpYSBhbmQgY29udGludWUgcGxheWluZyBvbmNlXG4gKiBpdCByZWFjaGVzIHRoZSBlbmQuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZXRMb29wXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBzZWVrIGJhY2sgdG8gc3RhcnQgb25jZVxuICogICAgICAgICAgIHRoZSBlbmQgb2YgYSBtZWRpYSBpcyByZWFjaGVkLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBub3QgbG9vcCBiYWNrIHRvIHRoZSBzdGFydCB3aGVuIHRoZVxuICogICAgICAgICAgIGVuZCBvZiB0aGUgbWVkaWEgaXMgcmVhY2hlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1sb29wfVxuICovXG4nbG9vcCcsXG5cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgcGxheXNpbmxpbmVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5c2lubGluZWAgaW5kaWNhdGVzXG4gKiB0byB0aGUgYnJvd3NlciB0aGF0IG5vbi1mdWxsc2NyZWVuIHBsYXliYWNrIGlzIHByZWZlcnJlZCB3aGVuIGZ1bGxzY3JlZW5cbiAqIHBsYXliYWNrIGlzIHRoZSBuYXRpdmUgZGVmYXVsdCwgc3VjaCBhcyBpbiBpT1MgU2FmYXJpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0UGxheXNpbmxpbmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGxheXNpbmxpbmVcbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgcGxheSBpbmxpbmUuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3QgcGxheSBpbmxpbmUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0ci12aWRlby1wbGF5c2lubGluZX1cbiAqL1xuJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbJ3NldCcgKyB0b1RpdGxlQ2FzZShwcm9wKV0gPSBmdW5jdGlvbiAodikge1xuICAgIHRoaXMuZWxfW3Byb3BdID0gdjtcblxuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUocHJvcCwgcHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxfLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICB9XG4gIH07XG59KTtcblxuLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgZ2V0dGVyXG4vLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dlZFxuLy8gcGF1c2VkLCBjdXJyZW50VGltZSwgYnVmZmVyZWQsIHZvbHVtZSwgcG9zdGVyLCBwcmVsb2FkLCBlcnJvciwgc2Vla2luZ1xuLy8gc2Vla2FibGUsIGVuZGVkLCBwbGF5YmFja1JhdGUsIGRlZmF1bHRQbGF5YmFja1JhdGUsIHBsYXllZCwgbmV0d29ya1N0YXRlXG4vLyByZWFkeVN0YXRlLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodFxuW1xuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwYXVzZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwYXVzZWRgIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZWRpYSBlbGVtZW50XG4gKiBpcyBjdXJyZW50bHkgcGF1c2VkIG9yIG5vdC5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BhdXNlZFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwYXVzZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wYXVzZWR9XG4gKi9cbidwYXVzZWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGN1cnJlbnRUaW1lYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgY3VycmVudFRpbWVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgc2Vjb25kIHRoYXQgdGhlIG1lZGlhIGlzIGF0IGluIHBsYXliYWNrLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjY3VycmVudFRpbWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBjdXJyZW50VGltZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWN1cnJlbnR0aW1lfVxuICovXG4nY3VycmVudFRpbWUnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGJ1ZmZlcmVkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgYnVmZmVyZWRgIGlzIGEgYFRpbWVSYW5nZWBcbiAqIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnRzIG9mIHRoZSBtZWRpYSB0aGF0IGFyZSBhbHJlYWR5IGRvd25sb2FkZWQgYW5kXG4gKiBhdmFpbGFibGUgZm9yIHBsYXliYWNrLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjYnVmZmVyZWRcbiAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBidWZmZXJlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWJ1ZmZlcmVkfVxuICovXG4nYnVmZmVyZWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHZvbHVtZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHZvbHVtZWAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCBwbGF5YmFjayB2b2x1bWUgb2YgYXVkaW8gZm9yIGEgbWVkaWEuIGB2b2x1bWVgIHdpbGwgYmUgYSB2YWx1ZSBmcm9tIDBcbiAqIChzaWxlbnQpIHRvIDEgKGxvdWRlc3QgYW5kIGRlZmF1bHQpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjdm9sdW1lXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBWYWx1ZSB3aWxsIGJlIGJldHdlZW4gMC0xLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tYS12b2x1bWV9XG4gKi9cbid2b2x1bWUnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHBvc3RlcmAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHBvc3RlcmAgaW5kaWNhdGVzXG4gKiB0aGF0IHRoZSB1cmwgb2YgYW4gaW1hZ2UgZmlsZSB0aGF0IGNhbi93aWxsIGJlIHNob3duIHdoZW4gbm8gbWVkaWEgZGF0YSBpcyBhdmFpbGFibGUuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNwb3N0ZXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwb3N0ZXJgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFZhbHVlIHdpbGwgYmUgYSB1cmwgdG8gYW5cbiAqICAgICAgICAgaW1hZ2UuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItdmlkZW8tcG9zdGVyfVxuICovXG4ncG9zdGVyJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwcmVsb2FkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgcHJlbG9hZGAgaW5kaWNhdGVzXG4gKiB3aGF0IHNob3VsZCBkb3dubG9hZCBiZWZvcmUgdGhlIG1lZGlhIGlzIGludGVyYWN0ZWQgd2l0aC4gSXQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZ1xuICogdmFsdWVzOlxuICogLSBub25lOiBub3RoaW5nIHNob3VsZCBiZSBkb3dubG9hZGVkXG4gKiAtIG1ldGFkYXRhOiBwb3N0ZXIgYW5kIHRoZSBmaXJzdCBmZXcgZnJhbWVzIG9mIHRoZSBtZWRpYSBtYXkgYmUgZG93bmxvYWRlZCB0byBnZXRcbiAqICAgbWVkaWEgZGltZW5zaW9ucyBhbmQgb3RoZXIgbWV0YWRhdGFcbiAqIC0gYXV0bzogYWxsb3cgdGhlIG1lZGlhIGFuZCBtZXRhZGF0YSBmb3IgdGhlIG1lZGlhIHRvIGJlIGRvd25sb2FkZWQgYmVmb3JlXG4gKiAgICBpbnRlcmFjdGlvblxuICpcbiAqIEBtZXRob2QgSHRtbDUjcHJlbG9hZFxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHByZWxvYWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFdpbGwgYmUgJ25vbmUnLCAnbWV0YWRhdGEnLFxuICogICAgICAgICBvciAnYXV0bycuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcHJlbG9hZH1cbiAqL1xuJ3ByZWxvYWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGBlcnJvcmAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGVycm9yYCBpbmRpY2F0ZXMgYW55XG4gKiBNZWRpYUVycm9yIHRoYXQgbWF5IGhhdmUgb2NjdXJlZCBkdXJpbmcgcGxheWJhY2suIElmIGVycm9yIHJldHVybnMgbnVsbCB0aGVyZSBpcyBub1xuICogY3VycmVudCBlcnJvci5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2Vycm9yXG4gKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgZXJyb3JgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFdpbGwgYmUgYE1lZGlhRXJyb3JgIGlmIHRoZXJlXG4gKiAgICAgICAgIGlzIGEgY3VycmVudCBlcnJvciBhbmQgbnVsbCBvdGhlcndpc2UuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1lcnJvcn1cbiAqL1xuJ2Vycm9yJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBzZWVraW5nYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgc2Vla2luZ2AgaW5kaWNhdGVzIHdoZXRoZXIgdGhlXG4gKiBtZWRpYSBpcyBjdXJyZW50bHkgc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbiBvciBub3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZWVraW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgc2Vla2luZ2AgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpcyBjdXJyZW50bHkgc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi5cbiAqICAgICAgICAgLSBGbGFzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXMgbm90IHNlZWtpbmcgdG8gYSBuZXcgcG9zaXRpb24gYXQgdGhpcyB0aW1lLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtc2Vla2luZ31cbiAqL1xuJ3NlZWtpbmcnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHNlZWthYmxlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgc2Vla2FibGVgIHJldHVybnMgYVxuICogYFRpbWVSYW5nZWAgb2JqZWN0IGluZGljYXRpbmcgcmFuZ2VzIG9mIHRpbWUgdGhhdCBjYW4gY3VycmVudGx5IGJlIGBzZWVrZWRgIHRvLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2Vla2FibGVcbiAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBzZWVrYWJsZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBgVGltZVJhbmdlYCBvYmplY3RcbiAqICAgICAgICAgaW5kaWNhdGluZyB0aGUgY3VycmVudCByYW5nZXMgb2YgdGltZSB0aGF0IGNhbiBiZSBzZWVrZWQgdG8uXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1zZWVrYWJsZX1cbiAqL1xuJ3NlZWthYmxlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBlbmRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGVuZGVkYCBpbmRpY2F0ZXMgd2hldGhlclxuICogdGhlIG1lZGlhIGhhcyByZWFjaGVkIHRoZSBlbmQgb3Igbm90LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjZW5kZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBlbmRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBoYXMgZW5kZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGhhcyBub3QgZW5kZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1lbmRlZH1cbiAqL1xuJ2VuZGVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5YmFja1JhdGVgIGluZGljYXRlc1xuICogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBwbGF5aW5nIGJhY2suIEV4YW1wbGVzOlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNwbGF5YmFja1JhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmdcbiAqICAgICAgICAgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIG1lZGlhLCB3aGVyZSAxIGlzIG5vcm1hbCBzcGVlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZX1cbiAqL1xuJ3BsYXliYWNrUmF0ZScsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGRlZmF1bHRQbGF5YmFja1JhdGVgIGluZGljYXRlc1xuICogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBwbGF5aW5nIGJhY2suIFRoaXMgdmFsdWUgd2lsbCBub3QgaW5kaWNhdGUgdGhlIGN1cnJlbnRcbiAqIGBwbGF5YmFja1JhdGVgIGFmdGVyIHBsYXliYWNrIGhhcyBzdGFydGVkLCB1c2Uge0BsaW5rIEh0bWw1I3BsYXliYWNrUmF0ZX0gZm9yIHRoYXQuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIC0gaWYgZGVmYXVsdFBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgZGVmYXVsdFBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LlxuICpcbiAqIEBtZXRob2QgSHRtbDUucHJvdG90eXBlLmRlZmF1bHRQbGF5YmFja1JhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBkZWZhdWx0UGxheWJhY2tSYXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBBIG51bWJlciBpbmRpY2F0aW5nXG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wbGF5YmFja3JhdGV9XG4gKi9cbidkZWZhdWx0UGxheWJhY2tSYXRlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5ZWRgIHJldHVybnMgYSBgVGltZVJhbmdlYFxuICogb2JqZWN0IHJlcHJlc2VudGluZyBwb2ludHMgaW4gdGhlIG1lZGlhIHRpbWVsaW5lIHRoYXQgaGF2ZSBiZWVuIHBsYXllZC5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BsYXllZFxuICogQHJldHVybiB7VGltZVJhbmdlfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHBsYXllZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBgVGltZVJhbmdlYCBvYmplY3QgaW5kaWNhdGluZ1xuICogICAgICAgICB0aGUgcmFuZ2VzIG9mIHRpbWUgdGhhdCBoYXZlIGJlZW4gcGxheWVkLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheWVkfVxuICovXG4ncGxheWVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBuZXR3b3JrU3RhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBuZXR3b3JrU3RhdGVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgbmV0d29yayBzdGF0ZS4gSXQgcmV0dXJucyBhbiBlbnVtZXJhdGlvbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAqIC0gMDogTkVUV09SS19FTVBUWVxuICogLSAxOiBORVdPUktfSURMRVxuICogLSAyOiBORVRXT1JLX0xPQURJTkdcbiAqIC0gMzogTkVUV09SS19OT19TT1VSQ0VcbiAqXG4gKiBAbWV0aG9kIEh0bWw1I25ldHdvcmtTdGF0ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYG5ldHdvcmtTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gVGhpcyB3aWxsIGJlIGEgbnVtYmVyXG4gKiAgICAgICAgIGZyb20gdGhlIGxpc3QgaW4gdGhlIGRlc2NyaXB0aW9uLlxuICpcbiAqIEBzZWUgW1NwZWNdIHtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLW5ldHdvcmtzdGF0ZX1cbiAqL1xuJ25ldHdvcmtTdGF0ZScsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgcmVhZHlTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHJlYWR5U3RhdGVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1lZGlhIGVsZW1lbnQuIEl0IHJldHVybnMgYW4gZW51bWVyYXRpb24gZnJvbSB0aGVcbiAqIGZvbGxvd2luZyBsaXN0OlxuICogLSAwOiBIQVZFX05PVEhJTkdcbiAqIC0gMTogSEFWRV9NRVRBREFUQVxuICogLSAyOiBIQVZFX0NVUlJFTlRfREFUQVxuICogLSAzOiBIQVZFX0ZVVFVSRV9EQVRBXG4gKiAtIDQ6IEhBVkVfRU5PVUdIX0RBVEFcbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3JlYWR5U3RhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGByZWFkeVN0YXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgZnJvbSB0aGUgbGlzdCBpbiB0aGUgZGVzY3JpcHRpb24uXG4gKlxuICogQHNlZSBbU3BlY10ge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNyZWFkeS1zdGF0ZXN9XG4gKi9cbidyZWFkeVN0YXRlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGB2aWRlb1dpZHRoYCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBgdmlkZW9XaWR0aGAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgdmlkZW8gaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3ZpZGVvV2lkdGhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGB2aWRlb1dpZHRoYCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAc2VlIFtTcGVjXSB7QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS12aWRlby12aWRlb3dpZHRofVxuICovXG4ndmlkZW9XaWR0aCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgdmlkZW9IZWlnaHRgIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQuIGB2aWRlb0hlaWd0aGAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIHZpZGVvIGluIGNzcyBwaXhlbHMuXG4gKlxuICogQG1ldGhvZCBIdG1sNSN2aWRlb0hlaWdodFxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHZpZGVvSGVpZ2h0YCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAc2VlIFtTcGVjXSB7QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS12aWRlby12aWRlb3dpZHRofVxuICovXG4ndmlkZW9IZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF9bcHJvcF07XG4gIH07XG59KTtcblxuLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgc2V0dGVyIGluIHRoaXMgZm9ybWF0OlxuLy8gc2V0ICsgdG9UaXRsZUNhc2UobmFtZSlcbi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd3M6XG4vLyBzZXRWb2x1bWUsIHNldFNyYywgc2V0UG9zdGVyLCBzZXRQcmVsb2FkLCBzZXRQbGF5YmFja1JhdGUsIHNldERlZmF1bHRQbGF5YmFja1JhdGVcbltcbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHZvbHVtZWAgaW5kaWNhdGVzIHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBhcyBhIHBlcmNlbnRhZ2UgaW4gZGVjaW1hbCBmb3JtLiBUaGlzIG1lYW5zIHRoYXQgMSBpcyAxMDAlLCAwLjUgaXMgNTAlLCBhbmRcbiAqIHNvIG9uLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0Vm9sdW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudEFzRGVjaW1hbFxuICogICAgICAgIFRoZSB2b2x1bWUgcGVyY2VudCBhcyBhIGRlY2ltYWwuIFZhbGlkIHJhbmdlIGlzIGZyb20gMC0xLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tYS12b2x1bWV9XG4gKi9cbid2b2x1bWUnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYHNyY2Agb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBzcmNgIGluZGljYXRlcyB0aGUgY3VycmVudFxuICoge0BsaW5rIFRlY2h+U291cmNlT2JqZWN0fSBmb3IgdGhlIG1lZGlhLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0U3JjXG4gKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzcmNcbiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGN1cnJlbnQgc291cmNlLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtc3JjfVxuICovXG4nc3JjJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwb3N0ZXJgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgcG9zdGVyYCBpcyB0aGUgdXJsIHRvXG4gKiBhbiBpbWFnZSBmaWxlIHRoYXQgY2FuL3dpbGwgYmUgc2hvd24gd2hlbiBubyBtZWRpYSBkYXRhIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3NldFBvc3RlclxuICogQHBhcmFtIHtzdHJpbmd9IHBvc3RlclxuICogICAgICAgIFRoZSB1cmwgdG8gYW4gaW1hZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYHBvc3RlcmAgZm9yIHRoZSBtZWRpYVxuICogICAgICAgIGVsZW1lbnQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcG9zdGVyfVxuICovXG4ncG9zdGVyJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwcmVsb2FkYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHByZWxvYWRgIGluZGljYXRlc1xuICogd2hhdCBzaG91bGQgZG93bmxvYWQgYmVmb3JlIHRoZSBtZWRpYSBpcyBpbnRlcmFjdGVkIHdpdGguIEl0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmdcbiAqIHZhbHVlczpcbiAqIC0gbm9uZTogbm90aGluZyBzaG91bGQgYmUgZG93bmxvYWRlZFxuICogLSBtZXRhZGF0YTogcG9zdGVyIGFuZCB0aGUgZmlyc3QgZmV3IGZyYW1lcyBvZiB0aGUgbWVkaWEgbWF5IGJlIGRvd25sb2FkZWQgdG8gZ2V0XG4gKiAgIG1lZGlhIGRpbWVuc2lvbnMgYW5kIG90aGVyIG1ldGFkYXRhXG4gKiAtIGF1dG86IGFsbG93IHRoZSBtZWRpYSBhbmQgbWV0YWRhdGEgZm9yIHRoZSBtZWRpYSB0byBiZSBkb3dubG9hZGVkIGJlZm9yZVxuICogICAgaW50ZXJhY3Rpb25cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3NldFByZWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVsb2FkXG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcHJlbG9hZGAgdG8gc2V0IG9uIHRoZSBtZWRpYSBlbGVtZW50LiBNdXN0IGJlICdub25lJywgJ21ldGFkYXRhJyxcbiAqICAgICAgICAgb3IgJ2F1dG8nLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLXByZWxvYWR9XG4gKi9cbidwcmVsb2FkJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgcGxheWJhY2tSYXRlYCBpbmRpY2F0ZXNcbiAqIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBtZWRpYSBzaG91bGQgcGxheSBiYWNrLiBFeGFtcGxlczpcbiAqICAgLSBpZiBwbGF5YmFja1JhdGUgaXMgc2V0IHRvIDIsIG1lZGlhIHdpbGwgcGxheSB0d2ljZSBhcyBmYXN0LlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0UGxheWJhY2tSYXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcGxheWJhY2tSYXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBBIG51bWJlciBpbmRpY2F0aW5nXG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wbGF5YmFja3JhdGV9XG4gKi9cbidwbGF5YmFja1JhdGUnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgaW5kaWNhdGVzXG4gKiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgc2hvdWxkIHBsYXkgYmFjayB1cG9uIGluaXRpYWwgc3RhcnR1cC4gQ2hhbmdpbmcgdGhpcyB2YWx1ZVxuICogYWZ0ZXIgYSB2aWRlbyBoYXMgc3RhcnRlZCB3aWxsIGRvIG5vdGhpbmcuIEluc3RlYWQgeW91IHNob3VsZCB1c2VkIHtAbGluayBIdG1sNSNzZXRQbGF5YmFja1JhdGV9LlxuICpcbiAqIEV4YW1wbGUgVmFsdWVzOlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNS5wcm90b3R5cGUuc2V0RGVmYXVsdFBsYXliYWNrUmF0ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmdcbiAqICAgICAgICAgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIG1lZGlhLCB3aGVyZSAxIGlzIG5vcm1hbCBzcGVlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRwbGF5YmFja3JhdGV9XG4gKi9cbidkZWZhdWx0UGxheWJhY2tSYXRlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbJ3NldCcgKyB0b1RpdGxlQ2FzZShwcm9wKV0gPSBmdW5jdGlvbiAodikge1xuICAgIHRoaXMuZWxfW3Byb3BdID0gdjtcbiAgfTtcbn0pO1xuXG4vLyB3cmFwIG5hdGl2ZSBmdW5jdGlvbnMgd2l0aCBhIGZ1bmN0aW9uXG4vLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dzOlxuLy8gcGF1c2UsIGxvYWQgcGxheVxuW1xuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBtZWRpYSBlbGVtZW50cyBgcGF1c2VgIGZ1bmN0aW9uLiBUaGlzIHdpbGwgY2FsbCB0aGUgYEhUTUw1YFxuICogbWVkaWEgZWxlbWVudHMgYHBhdXNlYCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BhdXNlXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBhdXNlfVxuICovXG4ncGF1c2UnLFxuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIG1lZGlhIGVsZW1lbnRzIGBsb2FkYCBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhbGwgdGhlIGBIVE1MNWBzXG4gKiBtZWRpYSBlbGVtZW50IGBsb2FkYCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2xvYWRcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtbG9hZH1cbiAqL1xuJ2xvYWQnLFxuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIG1lZGlhIGVsZW1lbnRzIGBwbGF5YCBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhbGwgdGhlIGBIVE1MNWBzXG4gKiBtZWRpYSBlbGVtZW50IGBwbGF5YCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BsYXlcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheX1cbiAqL1xuJ3BsYXknXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF9bcHJvcF0oKTtcbiAgfTtcbn0pO1xuXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyhIdG1sNSk7XG5cbi8qKlxuICogTmF0aXZlIHNvdXJjZSBoYW5kbGVyIGZvciBIdG1sNSwgc2ltcGx5IHBhc3NlcyB0aGUgc291cmNlIHRvIHRoZSBtZWRpYSBlbGVtZW50LlxuICpcbiAqIEBwcm9wcmV0eSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKlxuICogQHByb3ByZXR5IHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSFRNTDUgdGVjaC5cbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlciA9IHt9O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBtZWRpYSBlbGVtZW50IGNhbiBwbGF5IHRoZSBnaXZlbiBtaW1lIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gKi9cbkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAvLyBJRTkgb24gV2luZG93cyA3IHdpdGhvdXQgTWVkaWFQbGF5ZXIgdGhyb3dzIGFuIGVycm9yIGhlcmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzUxOVxuICB0cnkge1xuICAgIHJldHVybiBIdG1sNS5URVNUX1ZJRC5jYW5QbGF5VHlwZSh0eXBlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbWVkaWEgZWxlbWVudCBjYW4gaGFuZGxlIGEgc291cmNlIG5hdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICAgT3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIHRlY2guXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKS5cbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5jYW5IYW5kbGVTb3VyY2UgPSBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG5cbiAgLy8gSWYgYSB0eXBlIHdhcyBwcm92aWRlZCB3ZSBzaG91bGQgcmVseSBvbiB0aGF0XG4gIGlmIChzb3VyY2UudHlwZSkge1xuICAgIHJldHVybiBIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhblBsYXlUeXBlKHNvdXJjZS50eXBlKTtcblxuICAgIC8vIElmIG5vIHR5cGUsIGZhbGwgYmFjayB0byBjaGVja2luZyAndmlkZW8vW0VYVEVOU0lPTl0nXG4gIH0gZWxzZSBpZiAoc291cmNlLnNyYykge1xuICAgIHZhciBleHQgPSBnZXRGaWxlRXh0ZW5zaW9uKHNvdXJjZS5zcmMpO1xuXG4gICAgcmV0dXJuIEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUoJ3ZpZGVvLycgKyBleHQpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBQYXNzIHRoZSBzb3VyY2UgdG8gdGhlIG5hdGl2ZSBtZWRpYSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSHRtbDUgdGVjaFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzb3VyY2VcbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5oYW5kbGVTb3VyY2UgPSBmdW5jdGlvbiAoc291cmNlLCB0ZWNoLCBvcHRpb25zKSB7XG4gIHRlY2guc2V0U3JjKHNvdXJjZS5zcmMpO1xufTtcblxuLyoqXG4gKiBBIG5vb3AgZm9yIHRoZSBuYXRpdmUgZGlzcG9zZSBmdW5jdGlvbiwgYXMgY2xlYW51cCBpcyBub3QgbmVlZGVkLlxuICovXG5IdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gUmVnaXN0ZXIgdGhlIG5hdGl2ZSBzb3VyY2UgaGFuZGxlclxuSHRtbDUucmVnaXN0ZXJTb3VyY2VIYW5kbGVyKEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIpO1xuXG5UZWNoLnJlZ2lzdGVyVGVjaCgnSHRtbDUnLCBIdG1sNSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMSA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgICAgICBVc2luZyB0aGUgdGVjaCBkaXJlY3RseSBjYW4gYmUgZGFuZ2Vyb3VzLiBJIGhvcGUgeW91IGtub3cgd2hhdCB5b3VcXCdyZSBkb2luZy5cXG4gICAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMjYxNyBmb3IgbW9yZSBpbmZvLlxcbiAgICAgICddLCBbJ1xcbiAgICAgICAgVXNpbmcgdGhlIHRlY2ggZGlyZWN0bHkgY2FuIGJlIGRhbmdlcm91cy4gSSBob3BlIHlvdSBrbm93IHdoYXQgeW91XFwncmUgZG9pbmcuXFxuICAgICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzI2MTcgZm9yIG1vcmUgaW5mby5cXG4gICAgICAnXSk7XG5cbi8qKlxuICogQGZpbGUgcGxheWVyLmpzXG4gKi9cbi8vIFN1YmNsYXNzZXMgQ29tcG9uZW50XG4vLyBUaGUgZm9sbG93aW5nIGltcG9ydHMgYXJlIHVzZWQgb25seSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGVzXG4vLyBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSB2aWRlby5qcyBwYWNrYWdlLiBJbXBvcnRpbmcgdGhlIG1vZHVsZXMgd2lsbFxuLy8gZXhlY3V0ZSB0aGVtIGFuZCB0aGV5IHdpbGwgcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIHZpZGVvLmpzLlxuLy8gSW1wb3J0IEh0bWw1IHRlY2gsIGF0IGxlYXN0IGZvciBkaXNwb3NpbmcgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZy5cbi8vIFRoZSBmb2xsb3dpbmcgdGVjaCBldmVudHMgYXJlIHNpbXBseSByZS10cmlnZ2VyZWRcbi8vIG9uIHRoZSBwbGF5ZXIgd2hlbiB0aGV5IGhhcHBlblxudmFyIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUiA9IFtcbi8qKlxuICogRmlyZWQgd2hpbGUgdGhlIHVzZXIgYWdlbnQgaXMgZG93bmxvYWRpbmcgbWVkaWEgZGF0YS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI3Byb2dyZXNzXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUHJvZ3Jlc3NfXG4gKiBAZmlyZXMgUGxheWVyI3Byb2dyZXNzXG4gKiBAbGlzdGVucyBUZWNoI3Byb2dyZXNzXG4gKi9cbidwcm9ncmVzcycsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgbG9hZGluZyBvZiBhbiBhdWRpby92aWRlbyBpcyBhYm9ydGVkLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjYWJvcnRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBhYm9ydGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hBYm9ydF9cbiAqIEBmaXJlcyBQbGF5ZXIjYWJvcnRcbiAqIEBsaXN0ZW5zIFRlY2gjYWJvcnRcbiAqL1xuJ2Fib3J0JyxcblxuLyoqXG4gKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGlzIGludGVudGlvbmFsbHkgbm90IGdldHRpbmcgbWVkaWEgZGF0YS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI3N1c3BlbmRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBzdXNwZW5kYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFN1c3BlbmRfXG4gKiBAZmlyZXMgUGxheWVyI3N1c3BlbmRcbiAqIEBsaXN0ZW5zIFRlY2gjc3VzcGVuZFxuICovXG4nc3VzcGVuZCcsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgY3VycmVudCBwbGF5bGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI2VtcHRpZWRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBlbXB0aWVkYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaEVtcHRpZWRfXG4gKiBAZmlyZXMgUGxheWVyI2VtcHRpZWRcbiAqIEBsaXN0ZW5zIFRlY2gjZW1wdGllZFxuICovXG4nZW1wdGllZCcsXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGdldCBtZWRpYSBkYXRhLCBidXQgZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjc3RhbGxlZFxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG4vKipcbiAqIFJldHJpZ2dlciB0aGUgYHN0YWxsZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoU3RhbGxlZF9cbiAqIEBmaXJlcyBQbGF5ZXIjc3RhbGxlZFxuICogQGxpc3RlbnMgVGVjaCNzdGFsbGVkXG4gKi9cbidzdGFsbGVkJyxcblxuLyoqXG4gKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGhhcyBsb2FkZWQgbWV0YSBkYXRhIGZvciB0aGUgYXVkaW8vdmlkZW8uXG4gKlxuICogQGV2ZW50IFBsYXllciNsb2FkZWRtZXRhZGF0YVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG4vKipcbiAqIFJldHJpZ2dlciB0aGUgYHN0YWxsZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoTG9hZGVkbWV0YWRhdGFfXG4gKiBAZmlyZXMgUGxheWVyI2xvYWRlZG1ldGFkYXRhXG4gKiBAbGlzdGVucyBUZWNoI2xvYWRlZG1ldGFkYXRhXG4gKi9cbidsb2FkZWRtZXRhZGF0YScsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgYnJvd3NlciBoYXMgbG9hZGVkIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBhdWRpby92aWRlby5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI2xvYWRlZGRhdGFcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBsb2FkZWRkYXRhYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaExvYWRkZWRkYXRhX1xuICogQGZpcmVzIFBsYXllciNsb2FkZWRkYXRhXG4gKiBAbGlzdGVucyBUZWNoI2xvYWRlZGRhdGFcbiAqL1xuJ2xvYWRlZGRhdGEnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaGFzIGNoYW5nZWQuXG4gKlxuICogQGV2ZW50IFBsYXllciN0aW1ldXBkYXRlXG4gKiBAdHlwZSB7ZXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgdGltZXVwZGF0ZWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hUaW1lVXBkYXRlX1xuICogQGZpcmVzIFBsYXllciN0aW1ldXBkYXRlXG4gKiBAbGlzdGVucyBUZWNoI3RpbWV1cGRhdGVcbiAqL1xuJ3RpbWV1cGRhdGUnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHZpZGVvJ3MgaW50cmluc2ljIGRpbWVuc2lvbnMgY2hhbmdlXG4gKlxuICogQGV2ZW50IFBsYXllciNyZXNpemVcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGByZXNpemVgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUmVzaXplX1xuICogQGZpcmVzIFBsYXllciNyZXNpemVcbiAqIEBsaXN0ZW5zIFRlY2gjcmVzaXplXG4gKi9cbidyZXNpemUnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkXG4gKlxuICogQGV2ZW50IFBsYXllciN2b2x1bWVjaGFuZ2VcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGB2b2x1bWVjaGFuZ2VgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoVm9sdW1lY2hhbmdlX1xuICogQGZpcmVzIFBsYXllciN2b2x1bWVjaGFuZ2VcbiAqIEBsaXN0ZW5zIFRlY2gjdm9sdW1lY2hhbmdlXG4gKi9cbid2b2x1bWVjaGFuZ2UnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHRleHQgdHJhY2sgaGFzIGJlZW4gY2hhbmdlZFxuICpcbiAqIEBldmVudCBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gKiBAdHlwZSB7ZXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgdGV4dHRyYWNrY2hhbmdlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFRleHR0cmFja2NoYW5nZV9cbiAqIEBmaXJlcyBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gKiBAbGlzdGVucyBUZWNoI3RleHR0cmFja2NoYW5nZVxuICovXG4ndGV4dHRyYWNrY2hhbmdlJ107XG5cbi8vIGV2ZW50cyB0byBxdWV1ZSB3aGVuIHBsYXliYWNrIHJhdGUgaXMgemVyb1xuLy8gdGhpcyBpcyBhIGhhc2ggZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgbWFwcGluZyBub24tY2FtZWwtY2FzZWQgZXZlbnQgbmFtZXNcbi8vIHRvIGNhbWVsLWNhc2VkIGZ1bmN0aW9uIG5hbWVzXG52YXIgVEVDSF9FVkVOVFNfUVVFVUUgPSB7XG4gIGNhbnBsYXk6ICdDYW5QbGF5JyxcbiAgY2FucGxheXRocm91Z2g6ICdDYW5QbGF5VGhyb3VnaCcsXG4gIHBsYXlpbmc6ICdQbGF5aW5nJyxcbiAgc2Vla2VkOiAnU2Vla2VkJ1xufTtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgYFBsYXllcmAgY2xhc3MgaXMgY3JlYXRlZCB3aGVuIGFueSBvZiB0aGUgVmlkZW8uanMgc2V0dXAgbWV0aG9kc1xuICogYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIHZpZGVvLlxuICpcbiAqIEFmdGVyIGFuIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgaXQgY2FuIGJlIGFjY2Vzc2VkIGdsb2JhbGx5IGluIHR3byB3YXlzOlxuICogMS4gQnkgY2FsbGluZyBgdmlkZW9qcygnZXhhbXBsZV92aWRlb18xJyk7YFxuICogMi4gQnkgdXNpbmcgaXQgZGlyZWN0bHkgdmlhICBgdmlkZW9qcy5wbGF5ZXJzLmV4YW1wbGVfdmlkZW9fMTtgXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFBsYXllciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFBsYXllciwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhZ1xuICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHZpZGVvIERPTSBlbGVtZW50IHVzZWQgZm9yIGNvbmZpZ3VyaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICAgKiAgICAgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBQbGF5ZXIodGFnLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXllcik7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGFnIElEIGV4aXN0c1xuICAgIHRhZy5pZCA9IHRhZy5pZCB8fCBvcHRpb25zLmlkIHx8ICd2anNfdmlkZW9fJyArIG5ld0dVSUQoKTtcblxuICAgIC8vIFNldCBPcHRpb25zXG4gICAgLy8gVGhlIG9wdGlvbnMgYXJndW1lbnQgb3ZlcnJpZGVzIG9wdGlvbnMgc2V0IGluIHRoZSB2aWRlbyB0YWdcbiAgICAvLyB3aGljaCBvdmVycmlkZXMgZ2xvYmFsbHkgc2V0IG9wdGlvbnMuXG4gICAgLy8gVGhpcyBsYXR0ZXIgcGFydCBjb2luY2lkZXMgd2l0aCB0aGUgbG9hZCBvcmRlclxuICAgIC8vICh0YWcgbXVzdCBleGlzdCBiZWZvcmUgUGxheWVyKVxuICAgIG9wdGlvbnMgPSBhc3NpZ24oUGxheWVyLmdldFRhZ1NldHRpbmdzKHRhZyksIG9wdGlvbnMpO1xuXG4gICAgLy8gRGVsYXkgdGhlIGluaXRpYWxpemF0aW9uIG9mIGNoaWxkcmVuIGJlY2F1c2Ugd2UgbmVlZCB0byBzZXQgdXBcbiAgICAvLyBwbGF5ZXIgcHJvcGVydGllcyBmaXJzdCwgYW5kIGNhbid0IHVzZSBgdGhpc2AgYmVmb3JlIGBzdXBlcigpYFxuICAgIG9wdGlvbnMuaW5pdENoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAvLyBTYW1lIHdpdGggY3JlYXRpbmcgdGhlIGVsZW1lbnRcbiAgICBvcHRpb25zLmNyZWF0ZUVsID0gZmFsc2U7XG5cbiAgICAvLyBkb24ndCBhdXRvIG1peGluIHRoZSBldmVudGVkIG1peGluXG4gICAgb3B0aW9ucy5ldmVudGVkID0gZmFsc2U7XG5cbiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBwbGF5ZXIgdG8gcmVwb3J0IHRvdWNoIGFjdGl2aXR5IG9uIGl0c2VsZlxuICAgIC8vIHNlZSBlbmFibGVUb3VjaEFjdGl2aXR5IGluIENvbXBvbmVudFxuICAgIG9wdGlvbnMucmVwb3J0VG91Y2hBY3Rpdml0eSA9IGZhbHNlO1xuXG4gICAgLy8gSWYgbGFuZ3VhZ2UgaXMgbm90IHNldCwgZ2V0IHRoZSBjbG9zZXN0IGxhbmcgYXR0cmlidXRlXG4gICAgaWYgKCFvcHRpb25zLmxhbmd1YWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHRhZy5jbG9zZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBjbG9zZXN0ID0gdGFnLmNsb3Nlc3QoJ1tsYW5nXScpO1xuXG4gICAgICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3QuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9IGNsb3Nlc3QuZ2V0QXR0cmlidXRlKCdsYW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGFnO1xuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlcyhlbGVtZW50KS5oYXNPd25Qcm9wZXJ0eSgnbGFuZycpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmxhbmd1YWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGJhc2UgY29tcG9uZW50IGluaXRpYWxpemluZyB3aXRoIG5ldyBvcHRpb25zXG5cbiAgICAvLyBUcmFja3Mgd2hlbiBhIHRlY2ggY2hhbmdlcyB0aGUgcG9zdGVyXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIF90aGlzLmlzUG9zdGVyRnJvbVRlY2hfID0gZmFsc2U7XG5cbiAgICAvLyBIb2xkcyBjYWxsYmFjayBpbmZvIHRoYXQgZ2V0cyBxdWV1ZWQgd2hlbiBwbGF5YmFjayByYXRlIGlzIHplcm9cbiAgICAvLyBhbmQgYSBzZWVrIGlzIGhhcHBlbmluZ1xuICAgIF90aGlzLnF1ZXVlZENhbGxiYWNrc18gPSBbXTtcblxuICAgIC8vIFR1cm4gb2ZmIEFQSSBhY2Nlc3MgYmVjYXVzZSB3ZSdyZSBsb2FkaW5nIGEgbmV3IHRlY2ggdGhhdCBtaWdodCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgX3RoaXMuaXNSZWFkeV8gPSBmYWxzZTtcblxuICAgIC8vIEluaXQgc3RhdGUgaGFzU3RhcnRlZF9cbiAgICBfdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuXG4gICAgLy8gSW5pdCBzdGF0ZSB1c2VyQWN0aXZlX1xuICAgIF90aGlzLnVzZXJBY3RpdmVfID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGUgZ2xvYmFsIG9wdGlvbiBvYmplY3Qgd2FzIGFjY2lkZW50YWxseSBibG93biBhd2F5IGJ5XG4gICAgLy8gc29tZW9uZSwgYmFpbCBlYXJseSB3aXRoIGFuIGluZm9ybWF0aXZlIGVycm9yXG4gICAgaWYgKCFfdGhpcy5vcHRpb25zXyB8fCAhX3RoaXMub3B0aW9uc18udGVjaE9yZGVyIHx8ICFfdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRlY2hPcmRlciBzcGVjaWZpZWQuIERpZCB5b3Ugb3ZlcndyaXRlICcgKyAndmlkZW9qcy5vcHRpb25zIGluc3RlYWQgb2YganVzdCBjaGFuZ2luZyB0aGUgJyArICdwcm9wZXJ0aWVzIHlvdSB3YW50IHRvIG92ZXJyaWRlPycpO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCB0YWcgdXNlZCB0byBzZXQgb3B0aW9uc1xuICAgIF90aGlzLnRhZyA9IHRhZztcblxuICAgIC8vIFN0b3JlIHRoZSB0YWcgYXR0cmlidXRlcyB1c2VkIHRvIHJlc3RvcmUgaHRtbDUgZWxlbWVudFxuICAgIF90aGlzLnRhZ0F0dHJpYnV0ZXMgPSB0YWcgJiYgZ2V0QXR0cmlidXRlcyh0YWcpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICBfdGhpcy5sYW5ndWFnZShfdGhpcy5vcHRpb25zXy5sYW5ndWFnZSk7XG5cbiAgICAvLyBVcGRhdGUgU3VwcG9ydGVkIExhbmd1YWdlc1xuICAgIGlmIChvcHRpb25zLmxhbmd1YWdlcykge1xuICAgICAgLy8gTm9ybWFsaXNlIHBsYXllciBvcHRpb24gbGFuZ3VhZ2VzIHRvIGxvd2VyY2FzZVxuICAgICAgdmFyIGxhbmd1YWdlc1RvTG93ZXIgPSB7fTtcblxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob3B0aW9ucy5sYW5ndWFnZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUkJDEpIHtcbiAgICAgICAgbGFuZ3VhZ2VzVG9Mb3dlcltuYW1lJCQxLnRvTG93ZXJDYXNlKCldID0gb3B0aW9ucy5sYW5ndWFnZXNbbmFtZSQkMV07XG4gICAgICB9KTtcbiAgICAgIF90aGlzLmxhbmd1YWdlc18gPSBsYW5ndWFnZXNUb0xvd2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5sYW5ndWFnZXNfID0gUGxheWVyLnByb3RvdHlwZS5vcHRpb25zXy5sYW5ndWFnZXM7XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgZm9yIHZpZGVvIHByb3BlcnR5IHZhbHVlcy5cbiAgICBfdGhpcy5jYWNoZV8gPSB7fTtcblxuICAgIC8vIFNldCBwb3N0ZXJcbiAgICBfdGhpcy5wb3N0ZXJfID0gb3B0aW9ucy5wb3N0ZXIgfHwgJyc7XG5cbiAgICAvLyBTZXQgY29udHJvbHNcbiAgICBfdGhpcy5jb250cm9sc18gPSAhIW9wdGlvbnMuY29udHJvbHM7XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGxhc3RWb2x1bWVcbiAgICBfdGhpcy5jYWNoZV8ubGFzdFZvbHVtZSA9IDE7XG5cbiAgICAvLyBPcmlnaW5hbCB0YWcgc2V0dGluZ3Mgc3RvcmVkIGluIG9wdGlvbnNcbiAgICAvLyBub3cgcmVtb3ZlIGltbWVkaWF0ZWx5IHNvIG5hdGl2ZSBjb250cm9scyBkb24ndCBmbGFzaC5cbiAgICAvLyBNYXkgYmUgdHVybmVkIGJhY2sgb24gYnkgSFRNTDUgdGVjaCBpZiBuYXRpdmVDb250cm9sc0ZvclRvdWNoIGlzIHRydWVcbiAgICB0YWcuY29udHJvbHMgPSBmYWxzZTtcbiAgICB0YWcucmVtb3ZlQXR0cmlidXRlKCdjb250cm9scycpO1xuXG4gICAgLy8gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMgdGhlIG9wdGlvblxuICAgIGlmICh0YWcuaGFzQXR0cmlidXRlKCdhdXRvcGxheScpKSB7XG4gICAgICBfdGhpcy5vcHRpb25zXy5hdXRvcGxheSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHNldHRlciB0byB2YWxpZGF0ZSBhbmRcbiAgICAgIC8vIHNldCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIF90aGlzLmF1dG9wbGF5KF90aGlzLm9wdGlvbnNfLmF1dG9wbGF5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBzY3J1YmJpbmdcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdXNlciBpcyBzY3J1YmJpbmdcbiAgICAgKi9cbiAgICBfdGhpcy5zY3J1YmJpbmdfID0gZmFsc2U7XG5cbiAgICBfdGhpcy5lbF8gPSBfdGhpcy5jcmVhdGVFbCgpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWUgZm9yIGxhc3RQbGF5YmFja1JhdGVcbiAgICBfdGhpcy5jYWNoZV8ubGFzdFBsYXliYWNrUmF0ZSA9IF90aGlzLmRlZmF1bHRQbGF5YmFja1JhdGUoKTtcblxuICAgIC8vIE1ha2UgdGhpcyBhbiBldmVudGVkIG9iamVjdCBhbmQgdXNlIGBlbF9gIGFzIGl0cyBldmVudCBidXMuXG4gICAgZXZlbnRlZChfdGhpcywgeyBldmVudEJ1c0tleTogJ2VsXycgfSk7XG5cbiAgICAvLyBXZSBhbHNvIHdhbnQgdG8gcGFzcyB0aGUgb3JpZ2luYWwgcGxheWVyIG9wdGlvbnMgdG8gZWFjaCBjb21wb25lbnQgYW5kIHBsdWdpblxuICAgIC8vIGFzIHdlbGwgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlYWNoIGJhY2sgaW50byB0aGUgcGxheWVyIGZvciBvcHRpb25zIGxhdGVyLlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBkbyBhbm90aGVyIGNvcHkgb2YgdGhpcy5vcHRpb25zXyBzbyB3ZSBkb24ndCBlbmQgdXAgd2l0aFxuICAgIC8vIGFuIGluZmluaXRlIGxvb3AuXG4gICAgdmFyIHBsYXllck9wdGlvbnNDb3B5ID0gbWVyZ2VPcHRpb25zKF90aGlzLm9wdGlvbnNfKTtcblxuICAgIC8vIExvYWQgcGx1Z2luc1xuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHtcbiAgICAgIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zO1xuXG4gICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1tuYW1lJCQxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXNbbmFtZSQkMV0ocGx1Z2luc1tuYW1lJCQxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwbHVnaW4gXCInICsgbmFtZSQkMSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICAgICAgICB9XG4gICAgICB9LCBfdGhpcyk7XG4gICAgfVxuXG4gICAgX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucyA9IHBsYXllck9wdGlvbnNDb3B5O1xuXG4gICAgX3RoaXMubWlkZGxld2FyZV8gPSBbXTtcblxuICAgIF90aGlzLmluaXRDaGlsZHJlbigpO1xuXG4gICAgLy8gU2V0IGlzQXVkaW8gYmFzZWQgb24gd2hldGhlciBvciBub3QgYW4gYXVkaW8gdGFnIHdhcyB1c2VkXG4gICAgX3RoaXMuaXNBdWRpbyh0YWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1ZGlvJyk7XG5cbiAgICAvLyBVcGRhdGUgY29udHJvbHMgY2xhc3NOYW1lLiBDYW4ndCBkbyB0aGlzIHdoZW4gdGhlIGNvbnRyb2xzIGFyZSBpbml0aWFsbHlcbiAgICAvLyBzZXQgYmVjYXVzZSB0aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0IHlldC5cbiAgICBpZiAoX3RoaXMuY29udHJvbHMoKSkge1xuICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgQVJJQSBsYWJlbCBhbmQgcmVnaW9uIHJvbGUgZGVwZW5kaW5nIG9uIHBsYXllciB0eXBlXG4gICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdyZWdpb24nKTtcbiAgICBpZiAoX3RoaXMuaXNBdWRpbygpKSB7XG4gICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgX3RoaXMubG9jYWxpemUoJ0F1ZGlvIFBsYXllcicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIF90aGlzLmxvY2FsaXplKCdWaWRlbyBQbGF5ZXInKSk7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLmlzQXVkaW8oKSkge1xuICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1hdWRpbycpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5mbGV4Tm90U3VwcG9ydGVkXygpKSB7XG4gICAgICBfdGhpcy5hZGRDbGFzcygndmpzLW5vLWZsZXgnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgc21hcnRlci4gVG9nZ2xlIHVzZXIgc3RhdGUgYmV0d2VlbiB0b3VjaGluZy9tb3VzaW5nXG4gICAgLy8gdXNpbmcgZXZlbnRzLCBzaW5jZSBkZXZpY2VzIGNhbiBoYXZlIGJvdGggdG91Y2ggYW5kIG1vdXNlIGV2ZW50cy5cbiAgICAvLyBpZiAoYnJvd3Nlci5UT1VDSF9FTkFCTEVEKSB7XG4gICAgLy8gICB0aGlzLmFkZENsYXNzKCd2anMtdG91Y2gtZW5hYmxlZCcpO1xuICAgIC8vIH1cblxuICAgIC8vIGlPUyBTYWZhcmkgaGFzIGJyb2tlbiBob3ZlciBoYW5kbGluZ1xuICAgIGlmICghSVNfSU9TKSB7XG4gICAgICBfdGhpcy5hZGRDbGFzcygndmpzLXdvcmtpbmdob3ZlcicpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgcGxheWVyIGVhc2lseSBmaW5kYWJsZSBieSBJRFxuICAgIFBsYXllci5wbGF5ZXJzW190aGlzLmlkX10gPSBfdGhpcztcblxuICAgIC8vIEFkZCBhIG1ham9yIHZlcnNpb24gY2xhc3MgdG8gYWlkIGNzcyBpbiBwbHVnaW5zXG4gICAgdmFyIG1ham9yVmVyc2lvbiA9IHZlcnNpb24uc3BsaXQoJy4nKVswXTtcblxuICAgIF90aGlzLmFkZENsYXNzKCd2anMtdicgKyBtYWpvclZlcnNpb24pO1xuXG4gICAgLy8gV2hlbiB0aGUgcGxheWVyIGlzIGZpcnN0IGluaXRpYWxpemVkLCB0cmlnZ2VyIGFjdGl2aXR5IHNvIGNvbXBvbmVudHNcbiAgICAvLyBsaWtlIHRoZSBjb250cm9sIGJhciBzaG93IHRoZW1zZWx2ZXMgaWYgbmVlZGVkXG4gICAgX3RoaXMudXNlckFjdGl2ZSh0cnVlKTtcbiAgICBfdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkoKTtcblxuICAgIF90aGlzLm9uZSgncGxheScsIF90aGlzLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8pO1xuICAgIF90aGlzLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgX3RoaXMuaGFuZGxlRnVsbHNjcmVlbkNoYW5nZV8pO1xuICAgIF90aGlzLm9uKCdzdGFnZWNsaWNrJywgX3RoaXMuaGFuZGxlU3RhZ2VDbGlja18pO1xuXG4gICAgX3RoaXMuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG4gICAgX3RoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTtcbiAgICBfdGhpcy5wbGF5T25Mb2Fkc3RhcnRfID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIHZpZGVvIHBsYXllciBhbmQgZG9lcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuXG4gICAqXG4gICAqIFRoaXMgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGlmIHlvdSBhcmUgZHluYW1pY2FsbHkgYWRkaW5nIGFuZCByZW1vdmluZyB2aWRlb3NcbiAgICogdG8vZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Rpc3Bvc2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgaXMgYmVpbmcgZGlzcG9zZWQgb2YuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI2Rpc3Bvc2VcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdkaXNwb3NlJyk7XG4gICAgLy8gcHJldmVudCBkaXNwb3NlIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnKTtcblxuICAgIGlmICh0aGlzLnN0eWxlRWxfICYmIHRoaXMuc3R5bGVFbF8ucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5zdHlsZUVsXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3R5bGVFbF8pO1xuICAgICAgdGhpcy5zdHlsZUVsXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gS2lsbCByZWZlcmVuY2UgdG8gdGhpcyBwbGF5ZXJcbiAgICBQbGF5ZXIucGxheWVyc1t0aGlzLmlkX10gPSBudWxsO1xuXG4gICAgaWYgKHRoaXMudGFnICYmIHRoaXMudGFnLnBsYXllcikge1xuICAgICAgdGhpcy50YWcucGxheWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbF8gJiYgdGhpcy5lbF8ucGxheWVyKSB7XG4gICAgICB0aGlzLmVsXy5wbGF5ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hfLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcbiAgICAgIHRoaXMucG9zdGVyXyA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYXllckVsSW5nZXN0Xykge1xuICAgICAgdGhpcy5wbGF5ZXJFbEluZ2VzdF8gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZykge1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cblxuICAgIGNsZWFyQ2FjaGVGb3JQbGF5ZXIodGhpcyk7XG5cbiAgICAvLyB0aGUgYWN0dWFsIC5lbF8gaXMgcmVtb3ZlZCBoZXJlXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBQbGF5ZXJgJ3MgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIERPTSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICB2YXIgdGFnID0gdGhpcy50YWc7XG4gICAgdmFyIGVsID0gdm9pZCAwO1xuICAgIHZhciBwbGF5ZXJFbEluZ2VzdCA9IHRoaXMucGxheWVyRWxJbmdlc3RfID0gdGFnLnBhcmVudE5vZGUgJiYgdGFnLnBhcmVudE5vZGUuaGFzQXR0cmlidXRlICYmIHRhZy5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnZGF0YS12anMtcGxheWVyJyk7XG4gICAgdmFyIGRpdkVtYmVkID0gdGhpcy50YWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndmlkZW8tanMnO1xuXG4gICAgaWYgKHBsYXllckVsSW5nZXN0KSB7XG4gICAgICBlbCA9IHRoaXMuZWxfID0gdGFnLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIGlmICghZGl2RW1iZWQpIHtcbiAgICAgIGVsID0gdGhpcy5lbF8gPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHRhZywgaW5jbHVkaW5nIElEIGFuZCBjbGFzc1xuICAgIC8vIElEIHdpbGwgbm93IHJlZmVyZW5jZSBwbGF5ZXIgYm94LCBub3QgdGhlIHZpZGVvIHRhZ1xuICAgIHZhciBhdHRycyA9IGdldEF0dHJpYnV0ZXModGFnKTtcblxuICAgIGlmIChkaXZFbWJlZCkge1xuICAgICAgZWwgPSB0aGlzLmVsXyA9IHRhZztcbiAgICAgIHRhZyA9IHRoaXMudGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgIHdoaWxlIChlbC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdGFnLmFwcGVuZENoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc0NsYXNzKGVsLCAndmlkZW8tanMnKSkge1xuICAgICAgICBhZGRDbGFzcyhlbCwgJ3ZpZGVvLWpzJyk7XG4gICAgICB9XG5cbiAgICAgIGVsLmFwcGVuZENoaWxkKHRhZyk7XG5cbiAgICAgIHBsYXllckVsSW5nZXN0ID0gdGhpcy5wbGF5ZXJFbEluZ2VzdF8gPSBlbDtcblxuICAgICAgLy8gY29weSBvdmVyIHByb3BlcnRpZXMgZnJvbSB0aGUgdmlkZW8tanMgZWxlbWVudFxuICAgICAgLy8gaWU4IGRvZXNuJ3Qgc3VwcG9ydCBPYmplY3Qua2V5cyBub3IgaGFzT3duUHJvcGVydHlcbiAgICAgIC8vIG9uIGRvbSBlbGVtZW50cyBzbyB3ZSBoYXZlIHRvIHNwZWNpZnkgcHJvcGVydGllcyBpbmRpdmlkdWFsbHlcbiAgICAgIFsnYXV0b3BsYXknLCAnY29udHJvbHMnLCAnY3Jvc3NPcmlnaW4nLCAnZGVmYXVsdE11dGVkJywgJ2RlZmF1bHRQbGF5YmFja1JhdGUnLCAnbG9vcCcsICdtdXRlZCcsICdwbGF5YmFja1JhdGUnLCAnc3JjJywgJ3ZvbHVtZSddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbFtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0YWdbcHJvcF0gPSBlbFtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHRhYmluZGV4IHRvIC0xIHRvIHJlbW92ZSB0aGUgdmlkZW8gZWxlbWVudCBmcm9tIHRoZSBmb2N1cyBvcmRlclxuICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgIzQ1ODMgKEpBV1MrSUUgZG9lc24ndCBhbm5vdW5jZSBCUEIgb3IgcGxheSBidXR0b24pXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmVlZG9tU2NpZW50aWZpYy9WRk8tc3RhbmRhcmRzLXN1cHBvcnQvaXNzdWVzLzc4XG4gICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGRldGVjdCBpZiBKQVdTIGlzIGJlaW5nIHVzZWQsIGJ1dCB0aGlzIEFSSUEgYXR0cmlidXRlXG4gICAgLy8gIGRvZXNuJ3QgY2hhbmdlIGJlaGF2aW9yIG9mIElFMTEgaWYgSkFXUyBpcyBub3QgYmVpbmcgdXNlZFxuICAgIGlmIChJRV9WRVJTSU9OKSB7XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FwcGxpY2F0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHdpZHRoL2hlaWdodCBhdHRycyBmcm9tIHRhZyBzbyBDU1MgY2FuIG1ha2UgaXQgMTAwJSB3aWR0aC9oZWlnaHRcbiAgICB0YWcucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIHRhZy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgIC8vIHdvcmthcm91bmQgc28gd2UgZG9uJ3QgdG90YWxseSBicmVhayBJRTdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY1MzQ0NC9jc3Mtc3R5bGVzLW5vdC1hcHBsaWVkLW9uLWR5bmFtaWMtZWxlbWVudHMtaW4taW50ZXJuZXQtZXhwbG9yZXItN1xuICAgICAgaWYgKGF0dHIgPT09ICdjbGFzcycpIHtcbiAgICAgICAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGF0dHJzW2F0dHJdO1xuXG4gICAgICAgIGlmIChkaXZFbWJlZCkge1xuICAgICAgICAgIHRhZy5jbGFzc05hbWUgKz0gJyAnICsgYXR0cnNbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7XG5cbiAgICAgICAgaWYgKGRpdkVtYmVkKSB7XG4gICAgICAgICAgdGFnLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0YWcgaWQvY2xhc3MgZm9yIHVzZSBhcyBIVE1MNSBwbGF5YmFjayB0ZWNoXG4gICAgLy8gTWlnaHQgdGhpbmsgd2Ugc2hvdWxkIGRvIHRoaXMgYWZ0ZXIgZW1iZWRkaW5nIGluIGNvbnRhaW5lciBzbyAudmpzLXRlY2ggY2xhc3NcbiAgICAvLyBkb2Vzbid0IGZsYXNoIDEwMCUgd2lkdGgvaGVpZ2h0LCBidXQgY2xhc3Mgb25seSBhcHBsaWVzIHdpdGggLnZpZGVvLWpzIHBhcmVudFxuICAgIHRhZy5wbGF5ZXJJZCA9IHRhZy5pZDtcbiAgICB0YWcuaWQgKz0gJ19odG1sNV9hcGknO1xuICAgIHRhZy5jbGFzc05hbWUgPSAndmpzLXRlY2gnO1xuXG4gICAgLy8gTWFrZSBwbGF5ZXIgZmluZGFibGUgb24gZWxlbWVudHNcbiAgICB0YWcucGxheWVyID0gZWwucGxheWVyID0gdGhpcztcbiAgICAvLyBEZWZhdWx0IHN0YXRlIG9mIHZpZGVvIGlzIHBhdXNlZFxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcblxuICAgIC8vIEFkZCBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHBsYXllciB0aGF0IHdlJ2xsIHVzZSB0byBzZXQgdGhlIHdpZHRoL2hlaWdodFxuICAgIC8vIG9mIHRoZSBwbGF5ZXIgaW4gYSB3YXkgdGhhdCdzIHN0aWxsIG92ZXJyaWRlYWJsZSBieSBDU1MsIGp1c3QgbGlrZSB0aGVcbiAgICAvLyB2aWRlbyBlbGVtZW50XG4gICAgaWYgKHdpbmRvdy5WSURFT0pTX05PX0RZTkFNSUNfU1RZTEUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc3R5bGVFbF8gPSBjcmVhdGVTdHlsZUVsZW1lbnQoJ3Zqcy1zdHlsZXMtZGltZW5zaW9ucycpO1xuICAgICAgdmFyIGRlZmF1bHRzU3R5bGVFbCA9ICQoJy52anMtc3R5bGVzLWRlZmF1bHRzJyk7XG4gICAgICB2YXIgaGVhZCA9ICQoJ2hlYWQnKTtcblxuICAgICAgaGVhZC5pbnNlcnRCZWZvcmUodGhpcy5zdHlsZUVsXywgZGVmYXVsdHNTdHlsZUVsID8gZGVmYXVsdHNTdHlsZUVsLm5leHRTaWJsaW5nIDogaGVhZC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBQYXNzIGluIHRoZSB3aWR0aC9oZWlnaHQvYXNwZWN0UmF0aW8gb3B0aW9ucyB3aGljaCB3aWxsIHVwZGF0ZSB0aGUgc3R5bGUgZWxcbiAgICB0aGlzLndpZHRoKHRoaXMub3B0aW9uc18ud2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0KHRoaXMub3B0aW9uc18uaGVpZ2h0KTtcbiAgICB0aGlzLmZsdWlkKHRoaXMub3B0aW9uc18uZmx1aWQpO1xuICAgIHRoaXMuYXNwZWN0UmF0aW8odGhpcy5vcHRpb25zXy5hc3BlY3RSYXRpbyk7XG5cbiAgICAvLyBIaWRlIGFueSBsaW5rcyB3aXRoaW4gdGhlIHZpZGVvL2F1ZGlvIHRhZywgYmVjYXVzZSBJRSBkb2Vzbid0IGhpZGUgdGhlbSBjb21wbGV0ZWx5LlxuICAgIHZhciBsaW5rcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmtFbCA9IGxpbmtzLml0ZW0oaSk7XG5cbiAgICAgIGFkZENsYXNzKGxpbmtFbCwgJ3Zqcy1oaWRkZW4nKTtcbiAgICAgIGxpbmtFbC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvLyBpbnNlcnRFbEZpcnN0IHNlZW1zIHRvIGNhdXNlIHRoZSBuZXR3b3JrU3RhdGUgdG8gZmxpY2tlciBmcm9tIDMgdG8gMiwgc29cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBmb3IgbGF0ZXIgc28gd2UgY2FuIGtub3cgaWYgdGhlIHNvdXJjZSBvcmlnaW5hbGx5IGZhaWxlZFxuICAgIHRhZy5pbml0TmV0d29ya1N0YXRlXyA9IHRhZy5uZXR3b3JrU3RhdGU7XG5cbiAgICAvLyBXcmFwIHZpZGVvIHRhZyBpbiBkaXYgKGVsL2JveCkgY29udGFpbmVyXG4gICAgaWYgKHRhZy5wYXJlbnROb2RlICYmICFwbGF5ZXJFbEluZ2VzdCkge1xuICAgICAgdGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLCB0YWcpO1xuICAgIH1cblxuICAgIC8vIGluc2VydCB0aGUgdGFnIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgcGxheWVyIGVsZW1lbnRcbiAgICAvLyB0aGVuIG1hbnVhbGx5IGFkZCBpdCB0byB0aGUgY2hpbGRyZW4gYXJyYXkgc28gdGhhdCB0aGlzLmFkZENoaWxkXG4gICAgLy8gd2lsbCB3b3JrIHByb3Blcmx5IGZvciBvdGhlciBjb21wb25lbnRzXG4gICAgLy9cbiAgICAvLyBCcmVha3MgaVBob25lLCBmaXhlZCBpbiBIVE1MNSBzZXR1cC5cbiAgICBwcmVwZW5kVG8odGFnLCBlbCk7XG4gICAgdGhpcy5jaGlsZHJlbl8udW5zaGlmdCh0YWcpO1xuXG4gICAgLy8gU2V0IGxhbmcgYXR0ciBvbiBwbGF5ZXIgdG8gZW5zdXJlIENTUyA6bGFuZygpIGluIGNvbnNpc3RlbnQgd2l0aCBwbGF5ZXJcbiAgICAvLyBpZiBpdCdzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdG8gdGhlIGRvY1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnbGFuZycsIHRoaXMubGFuZ3VhZ2VfKTtcblxuICAgIHRoaXMuZWxfID0gZWw7XG5cbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3Mgd2lkdGguIFJldHVybnMgdGhlIHBsYXllcidzIGNvbmZpZ3VyZWQgdmFsdWUuXG4gICAqIFRvIGdldCB0aGUgY3VycmVudCB3aWR0aCB1c2UgYGN1cnJlbnRXaWR0aCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV1cbiAgICogICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIGBQbGF5ZXJgJ3Mgd2lkdGggdG8uXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignd2lkdGgnLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgaGVpZ2h0LiBSZXR1cm5zIHRoZSBwbGF5ZXIncyBjb25maWd1cmVkIHZhbHVlLlxuICAgKiBUbyBnZXQgdGhlIGN1cnJlbnQgaGVpZ2h0IHVzZSBgY3VycmVudGhlaWdodCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV1cbiAgICogICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIGBQbGF5ZXJgJ3MgaGVpZ3RoIHRvLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBgUGxheWVyYCB3aGVuIGdldHRpbmcuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ2hlaWdodCcsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYFBsYXllcmAncyB3aWR0aCAmIGhlaWdodC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpbWVuc2lvblxuICAgKiAgICAgICAgVGhpcyBzdHJpbmcgY2FuIGJlOlxuICAgKiAgICAgICAgLSAnd2lkdGgnXG4gICAqICAgICAgICAtICdoZWlnaHQnXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWVdXG4gICAqICAgICAgICBWYWx1ZSBmb3IgZGltZW5zaW9uIHNwZWNpZmllZCBpbiB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZGltZW5zaW9uIGFyZ3VtZW50cyB2YWx1ZSB3aGVuIGdldHRpbmcgKHdpZHRoL2hlaWdodCkuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiBkaW1lbnNpb24oX2RpbWVuc2lvbiwgdmFsdWUpIHtcbiAgICB2YXIgcHJpdkRpbWVuc2lvbiA9IF9kaW1lbnNpb24gKyAnXyc7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXNbcHJpdkRpbWVuc2lvbl0gfHwgMDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAvLyBJZiBhbiBlbXB0eSBzdHJpbmcgaXMgZ2l2ZW4sIHJlc2V0IHRoZSBkaW1lbnNpb24gdG8gYmUgYXV0b21hdGljXG4gICAgICB0aGlzW3ByaXZEaW1lbnNpb25dID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUVsXygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwYXJzZWRWYWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIGlmIChpc05hTihwYXJzZWRWYWwpKSB7XG4gICAgICBsb2ckMS5lcnJvcignSW1wcm9wZXIgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgc3VwcGxpZWQgZm9yIGZvciAnICsgX2RpbWVuc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpc1twcml2RGltZW5zaW9uXSA9IHBhcnNlZFZhbDtcbiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlci90b2dnbGVyIGZvciB0aGUgdmpzLWZsdWlkIGBjbGFzc05hbWVgIG9uIHRoZSBgUGxheWVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gQSB2YWx1ZSBvZiB0cnVlIGFkZHMgdGhlIGNsYXNzLlxuICAgKiAgICAgICAgLSBBIHZhbHVlIG9mIGZhbHNlIHJlbW92ZXMgdGhlIGNsYXNzLlxuICAgKiAgICAgICAgLSBObyB2YWx1ZSB3aWxsIHRvZ2dsZSB0aGUgZmx1aWQgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGZsdWlkIHdoZW4gZ2V0dGluZy5cbiAgICogICAgICAgICAtIGB1bmRlZmluZWRgIHdoZW4gc2V0dGluZy5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmZsdWlkID0gZnVuY3Rpb24gZmx1aWQoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmx1aWRfO1xuICAgIH1cblxuICAgIHRoaXMuZmx1aWRfID0gISFib29sO1xuXG4gICAgaWYgKGJvb2wpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1mbHVpZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZmx1aWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9TZXQgdGhlIGFzcGVjdCByYXRpb1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JhdGlvXVxuICAgKiAgICAgICAgQXNwZWN0IHJhdGlvIGZvciBwbGF5ZXJcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICByZXR1cm5zIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyB3aGVuIGdldHRpbmdcbiAgICovXG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgYXNwZWN0IHJhdGlvLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JhdGlvXVxuICAgKiAgICAgICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgYFBsYXllcidzIGFzcGVjdCByYXRpbyB0by5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICAtIFRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLlxuICAgKiAgICAgICAgIC0gdW5kZWZpbmVkIHdoZW4gc2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYXNwZWN0UmF0aW8gPSBmdW5jdGlvbiBhc3BlY3RSYXRpbyhyYXRpbykge1xuICAgIGlmIChyYXRpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hc3BlY3RSYXRpb187XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHdpZHRoOmhlaWdodCBmb3JtYXRcbiAgICBpZiAoIS9eXFxkK1xcOlxcZCskLy50ZXN0KHJhdGlvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciB2YWx1ZSBzdXBwbGllZCBmb3IgYXNwZWN0IHJhdGlvLiBUaGUgZm9ybWF0IHNob3VsZCBiZSB3aWR0aDpoZWlnaHQsIGZvciBleGFtcGxlIDE2OjkuJyk7XG4gICAgfVxuICAgIHRoaXMuYXNwZWN0UmF0aW9fID0gcmF0aW87XG5cbiAgICAvLyBXZSdyZSBhc3N1bWluZyBpZiB5b3Ugc2V0IGFuIGFzcGVjdCByYXRpbyB5b3Ugd2FudCBmbHVpZCBtb2RlLFxuICAgIC8vIGJlY2F1c2UgaW4gZml4ZWQgbW9kZSB5b3UgY291bGQgY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQgeW91cnNlbGYuXG4gICAgdGhpcy5mbHVpZCh0cnVlKTtcblxuICAgIHRoaXMudXBkYXRlU3R5bGVFbF8oKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHN0eWxlcyBvZiB0aGUgYFBsYXllcmAgZWxlbWVudCAoaGVpZ2h0LCB3aWR0aCBhbmQgYXNwZWN0IHJhdGlvKS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQGxpc3RlbnMgVGVjaCNsb2FkZWRtZXRhZGF0YVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudXBkYXRlU3R5bGVFbF8gPSBmdW5jdGlvbiB1cGRhdGVTdHlsZUVsXygpIHtcbiAgICBpZiAod2luZG93LlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSA9PT0gdHJ1ZSkge1xuICAgICAgdmFyIF93aWR0aCA9IHR5cGVvZiB0aGlzLndpZHRoXyA9PT0gJ251bWJlcicgPyB0aGlzLndpZHRoXyA6IHRoaXMub3B0aW9uc18ud2lkdGg7XG4gICAgICB2YXIgX2hlaWdodCA9IHR5cGVvZiB0aGlzLmhlaWdodF8gPT09ICdudW1iZXInID8gdGhpcy5oZWlnaHRfIDogdGhpcy5vcHRpb25zXy5oZWlnaHQ7XG4gICAgICB2YXIgdGVjaEVsID0gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmVsKCk7XG5cbiAgICAgIGlmICh0ZWNoRWwpIHtcbiAgICAgICAgaWYgKF93aWR0aCA+PSAwKSB7XG4gICAgICAgICAgdGVjaEVsLndpZHRoID0gX3dpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaGVpZ2h0ID49IDApIHtcbiAgICAgICAgICB0ZWNoRWwuaGVpZ2h0ID0gX2hlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gdm9pZCAwO1xuICAgIHZhciBoZWlnaHQgPSB2b2lkIDA7XG4gICAgdmFyIGFzcGVjdFJhdGlvID0gdm9pZCAwO1xuICAgIHZhciBpZENsYXNzID0gdm9pZCAwO1xuXG4gICAgLy8gVGhlIGFzcGVjdCByYXRpbyBpcyBlaXRoZXIgdXNlZCBkaXJlY3RseSBvciB0byBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICBpZiAodGhpcy5hc3BlY3RSYXRpb18gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFzcGVjdFJhdGlvXyAhPT0gJ2F1dG8nKSB7XG4gICAgICAvLyBVc2UgYW55IGFzcGVjdFJhdGlvIHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXRcbiAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpb187XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvV2lkdGgoKSA+IDApIHtcbiAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gZ2V0IHRoZSBhc3BlY3QgcmF0aW8gZnJvbSB0aGUgdmlkZW8gbWV0YWRhdGFcbiAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy52aWRlb1dpZHRoKCkgKyAnOicgKyB0aGlzLnZpZGVvSGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9yIHVzZSBhIGRlZmF1bHQuIFRoZSB2aWRlbyBlbGVtZW50J3MgaXMgMjoxLCBidXQgMTY6OSBpcyBtb3JlIGNvbW1vbi5cbiAgICAgIGFzcGVjdFJhdGlvID0gJzE2OjknO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcmF0aW8gYXMgYSBkZWNpbWFsIHdlIGNhbiB1c2UgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbnNcbiAgICB2YXIgcmF0aW9QYXJ0cyA9IGFzcGVjdFJhdGlvLnNwbGl0KCc6Jyk7XG4gICAgdmFyIHJhdGlvTXVsdGlwbGllciA9IHJhdGlvUGFydHNbMV0gLyByYXRpb1BhcnRzWzBdO1xuXG4gICAgaWYgKHRoaXMud2lkdGhfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBhbnkgd2lkdGggdGhhdCdzIGJlZW4gc3BlY2lmaWNhbGx5IHNldFxuICAgICAgd2lkdGggPSB0aGlzLndpZHRoXztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGVpZ2h0XyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPciBjYWx1bGF0ZSB0aGUgd2lkdGggZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGlmIGEgaGVpZ2h0IGhhcyBiZWVuIHNldFxuICAgICAgd2lkdGggPSB0aGlzLmhlaWdodF8gLyByYXRpb011bHRpcGxpZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9yIHVzZSB0aGUgdmlkZW8ncyBtZXRhZGF0YSwgb3IgdXNlIHRoZSB2aWRlbyBlbCdzIGRlZmF1bHQgb2YgMzAwXG4gICAgICB3aWR0aCA9IHRoaXMudmlkZW9XaWR0aCgpIHx8IDMwMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZWlnaHRfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBhbnkgaGVpZ2h0IHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXRcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0XztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IGZyb20gdGhlIHJhdGlvIGFuZCB0aGUgd2lkdGhcbiAgICAgIGhlaWdodCA9IHdpZHRoICogcmF0aW9NdWx0aXBsaWVyO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgQ1NTIGNsYXNzIGlzIHZhbGlkIGJ5IHN0YXJ0aW5nIHdpdGggYW4gYWxwaGEgY2hhcmFjdGVyXG4gICAgaWYgKC9eW15hLXpBLVpdLy50ZXN0KHRoaXMuaWQoKSkpIHtcbiAgICAgIGlkQ2xhc3MgPSAnZGltZW5zaW9ucy0nICsgdGhpcy5pZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZENsYXNzID0gdGhpcy5pZCgpICsgJy1kaW1lbnNpb25zJztcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHJpZ2h0IGNsYXNzIGlzIHN0aWxsIG9uIHRoZSBwbGF5ZXIgZm9yIHRoZSBzdHlsZSBlbGVtZW50XG4gICAgdGhpcy5hZGRDbGFzcyhpZENsYXNzKTtcblxuICAgIHNldFRleHRDb250ZW50KHRoaXMuc3R5bGVFbF8sICdcXG4gICAgICAuJyArIGlkQ2xhc3MgKyAnIHtcXG4gICAgICAgIHdpZHRoOiAnICsgd2lkdGggKyAncHg7XFxuICAgICAgICBoZWlnaHQ6ICcgKyBoZWlnaHQgKyAncHg7XFxuICAgICAgfVxcblxcbiAgICAgIC4nICsgaWRDbGFzcyArICcudmpzLWZsdWlkIHtcXG4gICAgICAgIHBhZGRpbmctdG9wOiAnICsgcmF0aW9NdWx0aXBsaWVyICogMTAwICsgJyU7XFxuICAgICAgfVxcbiAgICAnKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9hZC9DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgcGxheWJhY2sge0BsaW5rIFRlY2h9IGluY2x1ZGluZyBlbGVtZW50XG4gICAqIGFuZCBBUEkgbWV0aG9kcy4gVGhlbiBhcHBlbmQgdGhlIGBUZWNoYCBlbGVtZW50IGluIGBQbGF5ZXJgIGFzIGEgY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZWNoTmFtZVxuICAgKiAgICAgICAgbmFtZSBvZiB0aGUgcGxheWJhY2sgdGVjaG5vbG9neVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gICAqICAgICAgICB2aWRlbyBzb3VyY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmxvYWRUZWNoXyA9IGZ1bmN0aW9uIGxvYWRUZWNoXyh0ZWNoTmFtZSwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAvLyBQYXVzZSBhbmQgcmVtb3ZlIGN1cnJlbnQgcGxheWJhY2sgdGVjaG5vbG9neVxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnVubG9hZFRlY2hfKCk7XG4gICAgfVxuXG4gICAgdmFyIHRpdGxlVGVjaE5hbWUgPSB0b1RpdGxlQ2FzZSh0ZWNoTmFtZSk7XG4gICAgdmFyIGNhbWVsVGVjaE5hbWUgPSB0ZWNoTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHRlY2hOYW1lLnNsaWNlKDEpO1xuXG4gICAgLy8gZ2V0IHJpZCBvZiB0aGUgSFRNTDUgdmlkZW8gdGFnIGFzIHNvb24gYXMgd2UgYXJlIHVzaW5nIGFub3RoZXIgdGVjaFxuICAgIGlmICh0aXRsZVRlY2hOYW1lICE9PSAnSHRtbDUnICYmIHRoaXMudGFnKSB7XG4gICAgICBUZWNoLmdldFRlY2goJ0h0bWw1JykuZGlzcG9zZU1lZGlhRWxlbWVudCh0aGlzLnRhZyk7XG4gICAgICB0aGlzLnRhZy5wbGF5ZXIgPSBudWxsO1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudGVjaE5hbWVfID0gdGl0bGVUZWNoTmFtZTtcblxuICAgIC8vIFR1cm4gb2ZmIEFQSSBhY2Nlc3MgYmVjYXVzZSB3ZSdyZSBsb2FkaW5nIGEgbmV3IHRlY2ggdGhhdCBtaWdodCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgdGhpcy5pc1JlYWR5XyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgYXV0b3BsYXkgaXMgYSBzdHJpbmcgd2UgcGFzcyBmYWxzZSB0byB0aGUgdGVjaFxuICAgIC8vIGJlY2F1c2UgdGhlIHBsYXllciBpcyBnb2luZyB0byBoYW5kbGUgYXV0b3BsYXkgb24gYGxvYWRzdGFydGBcbiAgICB2YXIgYXV0b3BsYXkgPSB0eXBlb2YgdGhpcy5hdXRvcGxheSgpID09PSAnc3RyaW5nJyA/IGZhbHNlIDogdGhpcy5hdXRvcGxheSgpO1xuXG4gICAgLy8gR3JhYiB0ZWNoLXNwZWNpZmljIG9wdGlvbnMgZnJvbSBwbGF5ZXIgb3B0aW9ucyBhbmQgYWRkIHNvdXJjZSBhbmQgcGFyZW50IGVsZW1lbnQgdG8gdXNlLlxuICAgIHZhciB0ZWNoT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgYXV0b3BsYXk6IGF1dG9wbGF5LFxuICAgICAgJ25hdGl2ZUNvbnRyb2xzRm9yVG91Y2gnOiB0aGlzLm9wdGlvbnNfLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2gsXG4gICAgICAncGxheWVySWQnOiB0aGlzLmlkKCksXG4gICAgICAndGVjaElkJzogdGhpcy5pZCgpICsgJ18nICsgdGl0bGVUZWNoTmFtZSArICdfYXBpJyxcbiAgICAgICdwbGF5c2lubGluZSc6IHRoaXMub3B0aW9uc18ucGxheXNpbmxpbmUsXG4gICAgICAncHJlbG9hZCc6IHRoaXMub3B0aW9uc18ucHJlbG9hZCxcbiAgICAgICdsb29wJzogdGhpcy5vcHRpb25zXy5sb29wLFxuICAgICAgJ211dGVkJzogdGhpcy5vcHRpb25zXy5tdXRlZCxcbiAgICAgICdwb3N0ZXInOiB0aGlzLnBvc3RlcigpLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSgpLFxuICAgICAgJ3BsYXllckVsSW5nZXN0JzogdGhpcy5wbGF5ZXJFbEluZ2VzdF8gfHwgZmFsc2UsXG4gICAgICAndnR0LmpzJzogdGhpcy5vcHRpb25zX1sndnR0LmpzJ10sXG4gICAgICAnY2FuT3ZlcnJpZGVQb3N0ZXInOiAhIXRoaXMub3B0aW9uc18udGVjaENhbk92ZXJyaWRlUG9zdGVyLFxuICAgICAgJ2VuYWJsZVNvdXJjZXNldCc6IHRoaXMub3B0aW9uc18uZW5hYmxlU291cmNlc2V0XG4gICAgfTtcblxuICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICB2YXIgcHJvcHMgPSBBTExbbmFtZSQkMV07XG5cbiAgICAgIHRlY2hPcHRpb25zW3Byb3BzLmdldHRlck5hbWVdID0gX3RoaXMyW3Byb3BzLnByaXZhdGVOYW1lXTtcbiAgICB9KTtcblxuICAgIGFzc2lnbih0ZWNoT3B0aW9ucywgdGhpcy5vcHRpb25zX1t0aXRsZVRlY2hOYW1lXSk7XG4gICAgYXNzaWduKHRlY2hPcHRpb25zLCB0aGlzLm9wdGlvbnNfW2NhbWVsVGVjaE5hbWVdKTtcbiAgICBhc3NpZ24odGVjaE9wdGlvbnMsIHRoaXMub3B0aW9uc19bdGVjaE5hbWUudG9Mb3dlckNhc2UoKV0pO1xuXG4gICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICB0ZWNoT3B0aW9ucy50YWcgPSB0aGlzLnRhZztcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5zcmMgPT09IHRoaXMuY2FjaGVfLnNyYyAmJiB0aGlzLmNhY2hlXy5jdXJyZW50VGltZSA+IDApIHtcbiAgICAgIHRlY2hPcHRpb25zLnN0YXJ0VGltZSA9IHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgdGVjaCBpbnN0YW5jZVxuICAgIHZhciBUZWNoQ2xhc3MgPSBUZWNoLmdldFRlY2godGVjaE5hbWUpO1xuXG4gICAgaWYgKCFUZWNoQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gVGVjaCBuYW1lZCBcXCcnICsgdGl0bGVUZWNoTmFtZSArICdcXCcgZXhpc3RzISBcXCcnICsgdGl0bGVUZWNoTmFtZSArICdcXCcgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdmlkZW9qcy5yZWdpc3RlclRlY2goKVxcJycpO1xuICAgIH1cblxuICAgIHRoaXMudGVjaF8gPSBuZXcgVGVjaENsYXNzKHRlY2hPcHRpb25zKTtcblxuICAgIC8vIHBsYXllci50cmlnZ2VyUmVhZHkgaXMgYWx3YXlzIGFzeW5jLCBzbyBkb24ndCBuZWVkIHRoaXMgdG8gYmUgYXN5bmNcbiAgICB0aGlzLnRlY2hfLnJlYWR5KGJpbmQodGhpcywgdGhpcy5oYW5kbGVUZWNoUmVhZHlfKSwgdHJ1ZSk7XG5cbiAgICB0ZXh0VHJhY2tDb252ZXJ0ZXIuanNvblRvVGV4dFRyYWNrcyh0aGlzLnRleHRUcmFja3NKc29uXyB8fCBbXSwgdGhpcy50ZWNoXyk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gYWxsIEhUTUw1LWRlZmluZWQgZXZlbnRzIGFuZCB0cmlnZ2VyIHRoZW0gb24gdGhlIHBsYXllclxuICAgIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMyLm9uKF90aGlzMi50ZWNoXywgZXZlbnQsIF90aGlzMlsnaGFuZGxlVGVjaCcgKyB0b1RpdGxlQ2FzZShldmVudCkgKyAnXyddKTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5rZXlzKFRFQ0hfRVZFTlRTX1FVRVVFKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMyLm9uKF90aGlzMi50ZWNoXywgZXZlbnQsIGZ1bmN0aW9uIChldmVudE9iaikge1xuICAgICAgICBpZiAoX3RoaXMyLnRlY2hfLnBsYXliYWNrUmF0ZSgpID09PSAwICYmIF90aGlzMi50ZWNoXy5zZWVraW5nKCkpIHtcbiAgICAgICAgICBfdGhpczIucXVldWVkQ2FsbGJhY2tzXy5wdXNoKHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBfdGhpczJbJ2hhbmRsZVRlY2gnICsgVEVDSF9FVkVOVFNfUVVFVUVbZXZlbnRdICsgJ18nXS5iaW5kKF90aGlzMiksXG4gICAgICAgICAgICBldmVudDogZXZlbnRPYmpcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMyWydoYW5kbGVUZWNoJyArIFRFQ0hfRVZFTlRTX1FVRVVFW2V2ZW50XSArICdfJ10oZXZlbnRPYmopO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2Fkc3RhcnQnLCB0aGlzLmhhbmRsZVRlY2hMb2FkU3RhcnRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzb3VyY2VzZXQnLCB0aGlzLmhhbmRsZVRlY2hTb3VyY2VzZXRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd3YWl0aW5nJywgdGhpcy5oYW5kbGVUZWNoV2FpdGluZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2VuZGVkJywgdGhpcy5oYW5kbGVUZWNoRW5kZWRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzZWVraW5nJywgdGhpcy5oYW5kbGVUZWNoU2Vla2luZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3BsYXknLCB0aGlzLmhhbmRsZVRlY2hQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnZmlyc3RwbGF5JywgdGhpcy5oYW5kbGVUZWNoRmlyc3RQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncGF1c2UnLCB0aGlzLmhhbmRsZVRlY2hQYXVzZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2Vycm9yJywgdGhpcy5oYW5kbGVUZWNoRXJyb3JfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2FkZWRtZXRhZGF0YScsIHRoaXMudXBkYXRlU3R5bGVFbF8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3Bvc3RlcmNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3RleHRkYXRhJywgdGhpcy5oYW5kbGVUZWNoVGV4dERhdGFfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdyYXRlY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoUmF0ZUNoYW5nZV8pO1xuXG4gICAgdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKHRoaXMudGVjaEdldF8oJ2NvbnRyb2xzJykpO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbHMoKSAmJiAhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHtcbiAgICAgIHRoaXMuYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdGVjaCBlbGVtZW50IGluIHRoZSBET00gaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHRoZXJlXG4gICAgLy8gTWFrZSBzdXJlIHRvIG5vdCBpbnNlcnQgdGhlIG9yaWdpbmFsIHZpZGVvIGVsZW1lbnQgaWYgdXNpbmcgSHRtbDVcbiAgICBpZiAodGhpcy50ZWNoXy5lbCgpLnBhcmVudE5vZGUgIT09IHRoaXMuZWwoKSAmJiAodGl0bGVUZWNoTmFtZSAhPT0gJ0h0bWw1JyB8fCAhdGhpcy50YWcpKSB7XG4gICAgICBwcmVwZW5kVG8odGhpcy50ZWNoXy5lbCgpLCB0aGlzLmVsKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCByaWQgb2YgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZyByZWZlcmVuY2UgYWZ0ZXIgdGhlIGZpcnN0IHRlY2ggaXMgbG9hZGVkXG4gICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICB0aGlzLnRhZy5wbGF5ZXIgPSBudWxsO1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVW5sb2FkIGFuZCBkaXNwb3NlIG9mIHRoZSBjdXJyZW50IHBsYXliYWNrIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnVubG9hZFRlY2hfID0gZnVuY3Rpb24gdW5sb2FkVGVjaF8oKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHRleHQgdHJhY2tzIHNvIHRoYXQgd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRleHQgdHJhY2tzIHdpdGggdGhlIG5leHQgdGVjaFxuICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICB2YXIgcHJvcHMgPSBBTExbbmFtZSQkMV07XG5cbiAgICAgIF90aGlzM1twcm9wcy5wcml2YXRlTmFtZV0gPSBfdGhpczNbcHJvcHMuZ2V0dGVyTmFtZV0oKTtcbiAgICB9KTtcbiAgICB0aGlzLnRleHRUcmFja3NKc29uXyA9IHRleHRUcmFja0NvbnZlcnRlci50ZXh0VHJhY2tzVG9Kc29uKHRoaXMudGVjaF8pO1xuXG4gICAgdGhpcy5pc1JlYWR5XyA9IGZhbHNlO1xuXG4gICAgdGhpcy50ZWNoXy5kaXNwb3NlKCk7XG5cbiAgICB0aGlzLnRlY2hfID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc1Bvc3RlckZyb21UZWNoXykge1xuICAgICAgdGhpcy5wb3N0ZXJfID0gJyc7XG4gICAgICB0aGlzLnRyaWdnZXIoJ3Bvc3RlcmNoYW5nZScpO1xuICAgIH1cblxuICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHtAbGluayBUZWNofS5cbiAgICogSXQgd2lsbCBwcmludCBhIHdhcm5pbmcgYnkgZGVmYXVsdCBhYm91dCB0aGUgZGFuZ2VyIG9mIHVzaW5nIHRoZSB0ZWNoIGRpcmVjdGx5XG4gICAqIGJ1dCBhbnkgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgaW4gd2lsbCBzaWxlbmNlIHRoZSB3YXJuaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtzYWZldHldXG4gICAqICAgICAgICBBbnl0aGluZyBwYXNzZWQgaW4gdG8gc2lsZW5jZSB0aGUgd2FybmluZ1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZWNofVxuICAgKiAgICAgICAgIFRoZSBUZWNoXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50ZWNoID0gZnVuY3Rpb24gdGVjaChzYWZldHkpIHtcbiAgICBpZiAoc2FmZXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvZyQxLndhcm4odHNtbChfdGVtcGxhdGVPYmplY3QkMSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRlY2hfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdXAgY2xpY2sgYW5kIHRvdWNoIGxpc3RlbmVycyBmb3IgdGhlIHBsYXliYWNrIGVsZW1lbnRcbiAgICpcbiAgICogLSBPbiBkZXNrdG9wczogYSBjbGljayBvbiB0aGUgdmlkZW8gaXRzZWxmIHdpbGwgdG9nZ2xlIHBsYXliYWNrXG4gICAqIC0gT24gbW9iaWxlIGRldmljZXM6IGEgY2xpY2sgb24gdGhlIHZpZGVvIHRvZ2dsZXMgY29udHJvbHNcbiAgICogICB3aGljaCBpcyBkb25lIGJ5IHRvZ2dsaW5nIHRoZSB1c2VyIHN0YXRlIGJldHdlZW4gYWN0aXZlIGFuZFxuICAgKiAgIGluYWN0aXZlXG4gICAqIC0gQSB0YXAgY2FuIHNpZ25hbCB0aGF0IGEgdXNlciBoYXMgYmVjb21lIGFjdGl2ZSBvciBoYXMgYmVjb21lIGluYWN0aXZlXG4gICAqICAgZS5nLiBhIHF1aWNrIHRhcCBvbiBhbiBpUGhvbmUgbW92aWUgc2hvdWxkIHJldmVhbCB0aGUgY29udHJvbHMuIEFub3RoZXJcbiAgICogICBxdWljayB0YXAgc2hvdWxkIGhpZGUgdGhlbSBhZ2FpbiAoc2lnbmFsaW5nIHRoZSB1c2VyIGlzIGluIGFuIGluYWN0aXZlXG4gICAqICAgdmlld2luZyBzdGF0ZSlcbiAgICogLSBJbiBhZGRpdGlvbiB0byB0aGlzLCB3ZSBzdGlsbCB3YW50IHRoZSB1c2VyIHRvIGJlIGNvbnNpZGVyZWQgaW5hY3RpdmUgYWZ0ZXJcbiAgICogICBhIGZldyBzZWNvbmRzIG9mIGluYWN0aXZpdHkuXG4gICAqXG4gICAqID4gTm90ZTogdGhlIG9ubHkgcGFydCBvZiBpT1MgaW50ZXJhY3Rpb24gd2UgY2FuJ3QgbWltaWMgd2l0aCB0aGlzIHNldHVwXG4gICAqIGlzIGEgdG91Y2ggYW5kIGhvbGQgb24gdGhlIHZpZGVvIGVsZW1lbnQgY291bnRpbmcgYXMgYWN0aXZpdHkgaW4gb3JkZXIgdG9cbiAgICoga2VlcCB0aGUgY29udHJvbHMgc2hvd2luZywgYnV0IHRoYXQgc2hvdWxkbid0IGJlIGFuIGlzc3VlLiBBIHRvdWNoIGFuZCBob2xkXG4gICAqIG9uIGFueSBjb250cm9scyB3aWxsIHN0aWxsIGtlZXAgdGhlIHVzZXIgYWN0aXZlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfID0gZnVuY3Rpb24gYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIGFsbCB0aGUgcHJldmlvdXMgbGlzdGVuZXJzIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICB0aGlzLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcblxuICAgIC8vIFNvbWUgYnJvd3NlcnMgKENocm9tZSAmIElFKSBkb24ndCB0cmlnZ2VyIGEgY2xpY2sgb24gYSBmbGFzaCBzd2YsIGJ1dCBkb1xuICAgIC8vIHRyaWdnZXIgbW91c2Vkb3duL3VwLlxuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ0NDU2Mi9qYXZhc2NyaXB0LW9uY2xpY2stZXZlbnQtb3Zlci1mbGFzaC1vYmplY3RcbiAgICAvLyBBbnkgdG91Y2ggZXZlbnRzIGFyZSBzZXQgdG8gYmxvY2sgdGhlIG1vdXNlZG93biBldmVudCBmcm9tIGhhcHBlbmluZ1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVGVjaENsaWNrXyk7XG5cbiAgICAvLyBJZiB0aGUgY29udHJvbHMgd2VyZSBoaWRkZW4gd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGNoYW5nZSB3aXRob3V0IGEgdGFwIGV2ZW50XG4gICAgLy8gc28gd2UnbGwgY2hlY2sgaWYgdGhlIGNvbnRyb2xzIHdlcmUgYWxyZWFkeSBzaG93aW5nIGJlZm9yZSByZXBvcnRpbmcgdXNlclxuICAgIC8vIGFjdGl2aXR5XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVGVjaFRvdWNoU3RhcnRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaE1vdmVfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVGVjaFRvdWNoRW5kXyk7XG5cbiAgICAvLyBUaGUgdGFwIGxpc3RlbmVyIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgdGhlIHRvdWNoZW5kIGxpc3RlbmVyIGJlY2F1c2UgdGhlIHRhcFxuICAgIC8vIGxpc3RlbmVyIGNhbmNlbHMgb3V0IGFueSByZXBvcnRlZFVzZXJBY3Rpdml0eSB3aGVuIHNldHRpbmcgdXNlckFjdGl2ZShmYWxzZSlcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0YXAnLCB0aGlzLmhhbmRsZVRlY2hUYXBfKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdXNlZCBmb3IgY2xpY2sgYW5kIHRhcCBjb250cm9scy4gVGhpcyBpcyBuZWVkZWQgZm9yXG4gICAqIHRvZ2dsaW5nIHRvIGNvbnRyb2xzIGRpc2FibGVkLCB3aGVyZSBhIHRhcC90b3VjaCBzaG91bGQgZG8gbm90aGluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18gPSBmdW5jdGlvbiByZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCkge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ganVzdCB1c2UgYHRoaXMub2ZmKClgIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbmVlZGVkXG4gICAgLy8gbGlzdGVuZXJzIGFkZGVkIGJ5IHRlY2hzIHRoYXQgZXh0ZW5kIHRoaXMuXG4gICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ3RhcCcsIHRoaXMuaGFuZGxlVGVjaFRhcF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUZWNoVG91Y2hTdGFydF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaE1vdmVfKTtcbiAgICB0aGlzLm9mZih0aGlzLnRlY2hfLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaEVuZF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRlY2hDbGlja18pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQbGF5ZXIgd2FpdHMgZm9yIHRoZSB0ZWNoIHRvIGJlIHJlYWR5XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUmVhZHlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFJlYWR5XygpIHtcbiAgICB0aGlzLnRyaWdnZXJSZWFkeSgpO1xuXG4gICAgLy8gS2VlcCB0aGUgc2FtZSB2b2x1bWUgYXMgYmVmb3JlXG4gICAgaWYgKHRoaXMuY2FjaGVfLnZvbHVtZSkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFZvbHVtZScsIHRoaXMuY2FjaGVfLnZvbHVtZSk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBpZiB0aGUgdGVjaCBmb3VuZCBhIGhpZ2hlciByZXNvbHV0aW9uIHBvc3RlciB3aGlsZSBsb2FkaW5nXG4gICAgdGhpcy5oYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkdXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICB0aGlzLmhhbmRsZVRlY2hEdXJhdGlvbkNoYW5nZV8oKTtcblxuICAgIC8vIENocm9tZSBhbmQgU2FmYXJpIGJvdGggaGF2ZSBpc3N1ZXMgd2l0aCBhdXRvcGxheS5cbiAgICAvLyBJbiBTYWZhcmkgKDUuMS4xKSwgd2hlbiB3ZSBtb3ZlIHRoZSB2aWRlbyBlbGVtZW50IGludG8gdGhlIGNvbnRhaW5lciBkaXYsIGF1dG9wbGF5IGRvZXNuJ3Qgd29yay5cbiAgICAvLyBJbiBDaHJvbWUgKDE1KSwgaWYgeW91IGhhdmUgYXV0b3BsYXkgKyBhIHBvc3RlciArIG5vIGNvbnRyb2xzLCB0aGUgdmlkZW8gZ2V0cyBoaWRkZW4gKGJ1dCBhdWRpbyBwbGF5cylcbiAgICAvLyBUaGlzIGZpeGVzIGJvdGggaXNzdWVzLiBOZWVkIHRvIHdhaXQgZm9yIEFQSSwgc28gaXQgdXBkYXRlcyBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICBpZiAoKHRoaXMuc3JjKCkgfHwgdGhpcy5jdXJyZW50U3JjKCkpICYmIHRoaXMudGFnICYmIHRoaXMub3B0aW9uc18uYXV0b3BsYXkgJiYgdGhpcy5wYXVzZWQoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hyb21lIEZpeC4gRml4ZWQgaW4gQ2hyb21lIHYxNi5cbiAgICAgICAgZGVsZXRlIHRoaXMudGFnLnBvc3RlcjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nJDEoJ2RlbGV0aW5nIHRhZy5wb3N0ZXIgdGhyb3dzIGluIHNvbWUgYnJvd3NlcnMnLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYGxvYWRzdGFydGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uIFRoaXNcbiAgICogZnVuY3Rpb24gd2lsbCBhbHNvIHRyaWdnZXIge0BsaW5rIFBsYXllciNmaXJzdHBsYXl9IGlmIGl0IGlzIHRoZSBmaXJzdCBsb2Fkc3RhcnRcbiAgICogZm9yIGEgdmlkZW8uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqIEBmaXJlcyBQbGF5ZXIjZmlyc3RwbGF5XG4gICAqIEBsaXN0ZW5zIFRlY2gjbG9hZHN0YXJ0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoTG9hZFN0YXJ0XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hMb2FkU3RhcnRfKCkge1xuICAgIC8vIFRPRE86IFVwZGF0ZSB0byB1c2UgYGVtcHRpZWRgIGV2ZW50IGluc3RlYWQuIFNlZSAjMTI3Ny5cblxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zZWVraW5nJyk7XG5cbiAgICAvLyByZXNldCB0aGUgZXJyb3Igc3RhdGVcbiAgICB0aGlzLmVycm9yKG51bGwpO1xuXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IHBsYXlpbmcgd2Ugd2FudCB0byB0cmlnZ2VyIGEgZmlyc3RwbGF5IGV2ZW50IG5vdy5cbiAgICAvLyBUaGUgZmlyc3RwbGF5IGV2ZW50IHJlbGllcyBvbiBib3RoIHRoZSBwbGF5IGFuZCBsb2Fkc3RhcnQgZXZlbnRzXG4gICAgLy8gd2hpY2ggY2FuIGhhcHBlbiBpbiBhbnkgb3JkZXIgZm9yIGEgbmV3IHNvdXJjZVxuICAgIGlmICghdGhpcy5wYXVzZWQoKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBGaXJlZCB3aGVuIHRoZSB1c2VyIGFnZW50IGJlZ2lucyBsb29raW5nIGZvciBtZWRpYSBkYXRhXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFBsYXllciNsb2Fkc3RhcnRcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTtcbiAgICAgIHRoaXMudHJpZ2dlcignZmlyc3RwbGF5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2V0IHRoZSBoYXNTdGFydGVkIHN0YXRlXG4gICAgICB0aGlzLmhhc1N0YXJ0ZWQoZmFsc2UpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTtcbiAgICB9XG5cbiAgICAvLyBhdXRvcGxheSBoYXBwZW5zIGFmdGVyIGxvYWRzdGFydCBmb3IgdGhlIGJyb3dzZXIsXG4gICAgLy8gc28gd2UgbWltaWMgdGhhdCBiZWhhdmlvclxuICAgIHRoaXMubWFudWFsQXV0b3BsYXlfKHRoaXMuYXV0b3BsYXkoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhdXRvcGxheSBzdHJpbmcgdmFsdWVzLCByYXRoZXIgdGhhbiB0aGUgdHlwaWNhbCBib29sZWFuXG4gICAqIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB0ZWNoLiBOb3RlIHRoYXQgdGhpcyBpcyBub3RcbiAgICogcGFydCBvZiBhbnkgc3BlY2lmaWNhdGlvbi4gVmFsaWQgdmFsdWVzIGFuZCB3aGF0IHRoZXkgZG8gY2FuIGJlXG4gICAqIGZvdW5kIG9uIHRoZSBhdXRvcGxheSBnZXR0ZXIgYXQgUGxheWVyI2F1dG9wbGF5KClcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLm1hbnVhbEF1dG9wbGF5XyA9IGZ1bmN0aW9uIG1hbnVhbEF1dG9wbGF5Xyh0eXBlKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMudGVjaF8gfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG11dGVkID0gZnVuY3Rpb24gbXV0ZWQoKSB7XG4gICAgICB2YXIgcHJldmlvdXNseU11dGVkID0gX3RoaXM0Lm11dGVkKCk7XG5cbiAgICAgIF90aGlzNC5tdXRlZCh0cnVlKTtcblxuICAgICAgdmFyIHBsYXlQcm9taXNlID0gX3RoaXM0LnBsYXkoKTtcblxuICAgICAgaWYgKCFwbGF5UHJvbWlzZSB8fCAhcGxheVByb21pc2UudGhlbiB8fCAhcGxheVByb21pc2VbJ2NhdGNoJ10pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGxheVByb21pc2VbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gcmVzdG9yZSBvbGQgdmFsdWUgb2YgbXV0ZWQgb24gZmFpbHVyZVxuICAgICAgICBfdGhpczQubXV0ZWQocHJldmlvdXNseU11dGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgcHJvbWlzZSA9IHZvaWQgMDtcblxuICAgIGlmICh0eXBlID09PSAnYW55Jykge1xuICAgICAgcHJvbWlzZSA9IHRoaXMucGxheSgpO1xuXG4gICAgICBpZiAocHJvbWlzZSAmJiBwcm9taXNlLnRoZW4gJiYgcHJvbWlzZVsnY2F0Y2gnXSkge1xuICAgICAgICBwcm9taXNlWydjYXRjaCddKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbXV0ZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbXV0ZWQnKSB7XG4gICAgICBwcm9taXNlID0gbXV0ZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZSA9IHRoaXMucGxheSgpO1xuICAgIH1cblxuICAgIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuIHx8ICFwcm9taXNlWydjYXRjaCddKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczQudHJpZ2dlcih7IHR5cGU6ICdhdXRvcGxheS1zdWNjZXNzJywgYXV0b3BsYXk6IHR5cGUgfSk7XG4gICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzNC50cmlnZ2VyKHsgdHlwZTogJ2F1dG9wbGF5LWZhaWx1cmUnLCBhdXRvcGxheTogdHlwZSB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBpbnRlcm5hbCBzb3VyY2UgY2FjaGVzIHNvIHRoYXQgd2UgcmV0dXJuIHRoZSBjb3JyZWN0IHNvdXJjZSBmcm9tXG4gICAqIGBzcmMoKWAsIGBjdXJyZW50U291cmNlKClgLCBhbmQgYGN1cnJlbnRTb3VyY2VzKClgLlxuICAgKlxuICAgKiA+IE5vdGU6IGBjdXJyZW50U291cmNlc2Agd2lsbCBub3QgYmUgdXBkYXRlZCBpZiB0aGUgc291cmNlIHRoYXQgaXMgcGFzc2VkIGluIGV4aXN0c1xuICAgKiAgICAgICAgIGluIHRoZSBjdXJyZW50IGBjdXJyZW50U291cmNlc2AgY2FjaGUuXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNyY09ialxuICAgKiAgICAgICAgQSBzdHJpbmcgb3Igb2JqZWN0IHNvdXJjZSB0byB1cGRhdGUgb3VyIGNhY2hlcyB0by5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnVwZGF0ZVNvdXJjZUNhY2hlc18gPSBmdW5jdGlvbiB1cGRhdGVTb3VyY2VDYWNoZXNfKCkge1xuICAgIHZhciBzcmNPYmogPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG5cbiAgICB2YXIgc3JjID0gc3JjT2JqO1xuICAgIHZhciB0eXBlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHNyYyA9IHNyY09iai5zcmM7XG4gICAgICB0eXBlID0gc3JjT2JqLnR5cGU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGEgYmxvYiB1cmwsIGRvbid0IHVwZGF0ZSB0aGUgc291cmNlIGNhY2hlXG4gICAgLy8gYmxvYiB1cmxzIGNhbiBhcmlzZSB3aGVuIHBsYXliYWNrIGlzIGRvbmUgdmlhIE1lZGlhIFNvdXJjZSBFeHRlbnNpb24gKE1TRSlcbiAgICAvLyBzdWNoIGFzIG0zdTggc291cmNlcyB3aXRoIEB2aWRlb2pzL2h0dHAtc3RyZWFtaW5nIChWSFMpXG4gICAgaWYgKC9eYmxvYjovLnRlc3Qoc3JjKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBhbGwgdGhlIGNhY2hlcyBhcmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgLy8gdG8gcHJldmVudCBudWxsIGNoZWNraW5nXG4gICAgdGhpcy5jYWNoZV8uc291cmNlID0gdGhpcy5jYWNoZV8uc291cmNlIHx8IHt9O1xuICAgIHRoaXMuY2FjaGVfLnNvdXJjZXMgPSB0aGlzLmNhY2hlXy5zb3VyY2VzIHx8IFtdO1xuXG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgdHlwZSBvZiB0aGUgc3JjIHRoYXQgd2FzIHBhc3NlZCBpblxuICAgIGlmIChzcmMgJiYgIXR5cGUpIHtcbiAgICAgIHR5cGUgPSBmaW5kTWltZXR5cGUodGhpcywgc3JjKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYGN1cnJlbnRTb3VyY2VgIGNhY2hlIGFsd2F5c1xuICAgIHRoaXMuY2FjaGVfLnNvdXJjZSA9IG1lcmdlT3B0aW9ucyh7fSwgc3JjT2JqLCB7IHNyYzogc3JjLCB0eXBlOiB0eXBlIH0pO1xuXG4gICAgdmFyIG1hdGNoaW5nU291cmNlcyA9IHRoaXMuY2FjaGVfLnNvdXJjZXMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5zcmMgJiYgcy5zcmMgPT09IHNyYztcbiAgICB9KTtcbiAgICB2YXIgc291cmNlRWxTb3VyY2VzID0gW107XG4gICAgdmFyIHNvdXJjZUVscyA9IHRoaXMuJCQoJ3NvdXJjZScpO1xuICAgIHZhciBtYXRjaGluZ1NvdXJjZUVscyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2VPYmogPSBnZXRBdHRyaWJ1dGVzKHNvdXJjZUVsc1tpXSk7XG5cbiAgICAgIHNvdXJjZUVsU291cmNlcy5wdXNoKHNvdXJjZU9iaik7XG5cbiAgICAgIGlmIChzb3VyY2VPYmouc3JjICYmIHNvdXJjZU9iai5zcmMgPT09IHNyYykge1xuICAgICAgICBtYXRjaGluZ1NvdXJjZUVscy5wdXNoKHNvdXJjZU9iai5zcmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbWF0Y2hpbmcgc291cmNlIGVscyBidXQgbm90IG1hdGNoaW5nIHNvdXJjZXNcbiAgICAvLyB0aGUgY3VycmVudCBzb3VyY2UgY2FjaGUgaXMgbm90IHVwIHRvIGRhdGVcbiAgICBpZiAobWF0Y2hpbmdTb3VyY2VFbHMubGVuZ3RoICYmICFtYXRjaGluZ1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gc291cmNlRWxTb3VyY2VzO1xuICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBtYXRjaGluZyBzb3VyY2Ugb3Igc291cmNlIGVscyBzZXQgdGhlXG4gICAgICAvLyBzb3VyY2VzIGNhY2hlIHRvIHRoZSBgY3VycmVudFNvdXJjZWAgY2FjaGVcbiAgICB9IGVsc2UgaWYgKCFtYXRjaGluZ1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gW3RoaXMuY2FjaGVfLnNvdXJjZV07XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSB0ZWNoIGBzcmNgIGNhY2hlXG4gICAgdGhpcy5jYWNoZV8uc3JjID0gc3JjO1xuICB9O1xuXG4gIC8qKlxuICAgKiAqRVhQRVJJTUVOVEFMKiBGaXJlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2V0IG9yIGNoYW5nZWQgb24gdGhlIHtAbGluayBUZWNofVxuICAgKiBjYXVzaW5nIHRoZSBtZWRpYSBlbGVtZW50IHRvIHJlbG9hZC5cbiAgICpcbiAgICogSXQgd2lsbCBmaXJlIGZvciB0aGUgaW5pdGlhbCBzb3VyY2UgYW5kIGVhY2ggc3Vic2VxdWVudCBzb3VyY2UuXG4gICAqIFRoaXMgZXZlbnQgaXMgYSBjdXN0b20gZXZlbnQgZnJvbSBWaWRlby5qcyBhbmQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIFRoZSBldmVudCBvYmplY3QgZm9yIHRoaXMgZXZlbnQgY29udGFpbnMgYSBgc3JjYCBwcm9wZXJ0eSB0aGF0IHdpbGwgY29udGFpbiB0aGUgc291cmNlXG4gICAqIHRoYXQgd2FzIGF2YWlsYWJsZSB3aGVuIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkLiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IG5lY2Vzc2FyeSBpZiBWaWRlby5qc1xuICAgKiBpcyBzd2l0Y2hpbmcgdGVjaHMgd2hpbGUgdGhlIHNvdXJjZSB3YXMgYmVpbmcgY2hhbmdlZC5cbiAgICpcbiAgICogSXQgaXMgYWxzbyBmaXJlZCB3aGVuIGBsb2FkYCBpcyBjYWxsZWQgb24gdGhlIHBsYXllciAob3IgbWVkaWEgZWxlbWVudClcbiAgICogYmVjYXVzZSB0aGUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL21lZGlhLmh0bWwjZG9tLW1lZGlhLWxvYWR8c3BlY2lmaWNhdGlvbiBmb3IgYGxvYWRgfVxuICAgKiBzYXlzIHRoYXQgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gbmVlZHMgdG8gYmUgYWJvcnRlZCBhbmQgcmVzdGFydGVkLlxuICAgKiBJbiB0aGlzIGNhc2UsIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhlIGBzcmNgIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIHRoZVxuICAgKiBlbXB0eSBzdHJpbmcgYFwiXCJgIHRvIGluZGljYXRlIHdlIGRvIG5vdCBrbm93IHdoYXQgdGhlIHNvdXJjZSB3aWxsIGJlIGJ1dFxuICAgKiB0aGF0IGl0IGlzIGNoYW5naW5nLlxuICAgKlxuICAgKiAqVGhpcyBldmVudCBpcyBjdXJyZW50bHkgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIG1pbm9yIHJlbGVhc2VzLipcbiAgICogX19UbyB1c2UgdGhpcywgcGFzcyBgZW5hYmxlU291cmNlc2V0YCBvcHRpb24gdG8gdGhlIHBsYXllci5fX1xuICAgKlxuICAgKiBAZXZlbnQgUGxheWVyI3NvdXJjZXNldFxuICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAqIEBwcm9wIHtzdHJpbmd9IHNyY1xuICAgKiAgICAgICAgICAgICAgICBUaGUgc291cmNlIHVybCBhdmFpbGFibGUgd2hlbiB0aGUgYHNvdXJjZXNldGAgd2FzIHRyaWdnZXJlZC5cbiAgICogICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgd2UgY2Fubm90IGtub3cgd2hhdCB0aGUgc291cmNlIGlzXG4gICAqICAgICAgICAgICAgICAgIGJ1dCBrbm93IHRoYXQgdGhlIHNvdXJjZSB3aWxsIGNoYW5nZS5cbiAgICovXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBzb3VyY2VzZXRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NvdXJjZXNldFxuICAgKiBAbGlzdGVucyBUZWNoI3NvdXJjZXNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFNvdXJjZXNldF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU291cmNlc2V0XyhldmVudCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgLy8gb25seSB1cGRhdGUgdGhlIHNvdXJjZSBjYWNoZSB3aGVuIHRoZSBzb3VyY2VcbiAgICAvLyB3YXMgbm90IHVwZGF0ZWQgdXNpbmcgdGhlIHBsYXllciBhcGlcbiAgICBpZiAoIXRoaXMuY2hhbmdpbmdTcmNfKSB7XG4gICAgICAvLyB1cGRhdGUgdGhlIHNvdXJjZSB0byB0aGUgaW50aWFsIHNvdXJjZSByaWdodCBhd2F5XG4gICAgICAvLyBpbiBzb21lIGNhc2VzIHRoaXMgd2lsbCBiZSBlbXB0eSBzdHJpbmdcbiAgICAgIHRoaXMudXBkYXRlU291cmNlQ2FjaGVzXyhldmVudC5zcmMpO1xuXG4gICAgICAvLyBpZiB0aGUgYHNvdXJjZXNldGAgYHNyY2Agd2FzIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgLy8gd2FpdCBmb3IgYSBgbG9hZHN0YXJ0YCB0byB1cGRhdGUgdGhlIGNhY2hlIHRvIGBjdXJyZW50U3JjYC5cbiAgICAgIC8vIElmIGEgc291cmNlc2V0IGhhcHBlbnMgYmVmb3JlIGEgYGxvYWRzdGFydGAsIHdlIHJlc2V0IHRoZSBzdGF0ZVxuICAgICAgLy8gYXMgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICAgIGlmICghZXZlbnQuc3JjKSB7XG4gICAgICAgIHZhciB1cGRhdGVDYWNoZSA9IGZ1bmN0aW9uIHVwZGF0ZUNhY2hlKGUpIHtcbiAgICAgICAgICBpZiAoZS50eXBlICE9PSAnc291cmNlc2V0Jykge1xuICAgICAgICAgICAgX3RoaXM1LnVwZGF0ZVNvdXJjZUNhY2hlc18oX3RoaXM1LnRlY2hHZXRfKCdjdXJyZW50U3JjJykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzNS50ZWNoXy5vZmYoWydzb3VyY2VzZXQnLCAnbG9hZHN0YXJ0J10sIHVwZGF0ZUNhY2hlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnRlY2hfLm9uZShbJ3NvdXJjZXNldCcsICdsb2Fkc3RhcnQnXSwgdXBkYXRlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlcih7XG4gICAgICBzcmM6IGV2ZW50LnNyYyxcbiAgICAgIHR5cGU6ICdzb3VyY2VzZXQnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZC9yZW1vdmUgdGhlIHZqcy1oYXMtc3RhcnRlZCBjbGFzc1xuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2ZpcnN0cGxheVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVlc3RcbiAgICogICAgICAgIC0gdHJ1ZTogYWRkcyB0aGUgY2xhc3NcbiAgICogICAgICAgIC0gZmFsc2U6IHJlbW92ZSB0aGUgY2xhc3NcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBoYXNTdGFydGVkX1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFzU3RhcnRlZCA9IGZ1bmN0aW9uIGhhc1N0YXJ0ZWQocmVxdWVzdCkge1xuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFjdCBhcyBnZXR0ZXIsIGlmIHdlIGhhdmUgbm8gcmVxdWVzdCB0byBjaGFuZ2VcbiAgICAgIHJldHVybiB0aGlzLmhhc1N0YXJ0ZWRfO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLmhhc1N0YXJ0ZWRfKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTdGFydGVkXyA9IHJlcXVlc3Q7XG5cbiAgICBpZiAodGhpcy5oYXNTdGFydGVkXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhhcy1zdGFydGVkJyk7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtaGFzLXN0YXJ0ZWQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBiZWdpbnMgb3IgcmVzdW1lcyBwbGF5YmFja1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXBsYXl9XG4gICAqIEBmaXJlcyBQbGF5ZXIjcGxheVxuICAgKiBAbGlzdGVucyBUZWNoI3BsYXlcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hQbGF5XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hQbGF5XygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBsYXlpbmcnKTtcblxuICAgIC8vIGhpZGUgdGhlIHBvc3RlciB3aGVuIHRoZSB1c2VyIGhpdHMgcGxheVxuICAgIHRoaXMuaGFzU3RhcnRlZCh0cnVlKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbmV2ZXIgYW4ge0BsaW5rIFRlY2gjcGxheX0gZXZlbnQgaGFwcGVucy4gSW5kaWNhdGVzIHRoYXRcbiAgICAgKiBwbGF5YmFjayBoYXMgc3RhcnRlZCBvciByZXN1bWVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNwbGF5XG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncGxheScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGByYXRlY2hhbmdlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogSWYgdGhlcmUgd2VyZSBhbnkgZXZlbnRzIHF1ZXVlZCB3aGlsZSB0aGUgcGxheWJhY2sgcmF0ZSB3YXMgemVybywgZmlyZVxuICAgKiB0aG9zZSBldmVudHMgbm93LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUmF0ZUNoYW5nZV9cbiAgICogQGZpcmVzIFBsYXllciNyYXRlY2hhbmdlXG4gICAqIEBsaXN0ZW5zIFRlY2gjcmF0ZWNoYW5nZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFJhdGVDaGFuZ2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFJhdGVDaGFuZ2VfKCkge1xuICAgIGlmICh0aGlzLnRlY2hfLnBsYXliYWNrUmF0ZSgpID4gMCAmJiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlID09PSAwKSB7XG4gICAgICB0aGlzLnF1ZXVlZENhbGxiYWNrc18uZm9yRWFjaChmdW5jdGlvbiAocXVldWVkKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZWQuY2FsbGJhY2socXVldWVkLmV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZWRDYWxsYmFja3NfID0gW107XG4gICAgfVxuICAgIHRoaXMuY2FjaGVfLmxhc3RQbGF5YmFja1JhdGUgPSB0aGlzLnRlY2hfLnBsYXliYWNrUmF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHBsYXlpbmcgc3BlZWQgb2YgdGhlIGF1ZGlvL3ZpZGVvIGlzIGNoYW5nZWRcbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjcmF0ZWNoYW5nZVxuICAgICAqIEB0eXBlIHtldmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3JhdGVjaGFuZ2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgd2FpdGluZ2AgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjd2FpdGluZ1xuICAgKiBAbGlzdGVucyBUZWNoI3dhaXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hXYWl0aW5nXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hXYWl0aW5nXygpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgLyoqXG4gICAgICogQSByZWFkeVN0YXRlIGNoYW5nZSBvbiB0aGUgRE9NIGVsZW1lbnQgaGFzIGNhdXNlZCBwbGF5YmFjayB0byBzdG9wLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciN3YWl0aW5nXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignd2FpdGluZycpO1xuICAgIHRoaXMub25lKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzNi5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgY2FucGxheWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqID4gTm90ZTogVGhpcyBpcyBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJyb3dzZXJzLiBTZWUgIzEzNTFcbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNjYW5wbGF5XG4gICAqIEBsaXN0ZW5zIFRlY2gjY2FucGxheVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaENhblBsYXlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaENhblBsYXlfKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgLyoqXG4gICAgICogVGhlIG1lZGlhIGhhcyBhIHJlYWR5U3RhdGUgb2YgSEFWRV9GVVRVUkVfREFUQSBvciBncmVhdGVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNjYW5wbGF5XG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignY2FucGxheScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBjYW5wbGF5dGhyb3VnaGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjY2FucGxheXRocm91Z2hcbiAgICogQGxpc3RlbnMgVGVjaCNjYW5wbGF5dGhyb3VnaFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaENhblBsYXlUaHJvdWdoXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hDYW5QbGF5VGhyb3VnaF8oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVkaWEgaGFzIGEgcmVhZHlTdGF0ZSBvZiBIQVZFX0VOT1VHSF9EQVRBIG9yIGdyZWF0ZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbiAgICAgKiBlbnRpcmUgbWVkaWEgZmlsZSBjYW4gYmUgcGxheWVkIHdpdGhvdXQgYnVmZmVyaW5nLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNjYW5wbGF5dGhyb3VnaFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2NhbnBsYXl0aHJvdWdoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHBsYXlpbmdgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3BsYXlpbmdcbiAgICogQGxpc3RlbnMgVGVjaCNwbGF5aW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUGxheWluZ18gPSBmdW5jdGlvbiBoYW5kbGVUZWNoUGxheWluZ18oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVkaWEgaXMgbm8gbG9uZ2VyIGJsb2NrZWQgZnJvbSBwbGF5YmFjaywgYW5kIGhhcyBzdGFydGVkIHBsYXlpbmcuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3BsYXlpbmdcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdwbGF5aW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHNlZWtpbmdgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NlZWtpbmdcbiAgICogQGxpc3RlbnMgVGVjaCNzZWVraW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoU2Vla2luZ18gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU2Vla2luZ18oKSB7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXNlZWtpbmcnKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgcGxheWVyIGlzIGp1bXBpbmcgdG8gYSBuZXcgdGltZVxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNzZWVraW5nXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignc2Vla2luZycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBzZWVrZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NlZWtlZFxuICAgKiBAbGlzdGVucyBUZWNoI3NlZWtlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFNlZWtlZF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU2Vla2VkXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2Vla2luZycpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBoYXMgZmluaXNoZWQganVtcGluZyB0byBhIG5ldyB0aW1lXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3NlZWtlZFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3NlZWtlZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBmaXJzdHBsYXlgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2ZpcnN0cGxheVxuICAgKiBAbGlzdGVucyBUZWNoI2ZpcnN0cGxheVxuICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuXG4gICAqICAgICAgICAgICAgIEFzIG9mIDYuMCBwYXNzaW5nIHRoZSBgc3RhcnR0aW1lYCBvcHRpb24gdG8gdGhlIHBsYXllciBhbmQgdGhlIGZpcnN0cGxheSBldmVudCBhcmUgZGVwcmVjYXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hGaXJzdFBsYXlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaEZpcnN0UGxheV8oKSB7XG4gICAgLy8gSWYgdGhlIGZpcnN0IHN0YXJ0dGltZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkXG4gICAgLy8gdGhlbiB3ZSB3aWxsIHN0YXJ0IGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4gc2Vjb25kc1xuICAgIGlmICh0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSkge1xuICAgICAgbG9nJDEud2FybignUGFzc2luZyB0aGUgYHN0YXJ0dGltZWAgb3B0aW9uIHRvIHRoZSBwbGF5ZXIgd2lsbCBiZSBkZXByZWNhdGVkIGluIDYuMCcpO1xuICAgICAgdGhpcy5jdXJyZW50VGltZSh0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWhhcy1zdGFydGVkJyk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgdGhlIGZpcnN0IHRpbWUgYSB2aWRlbyBpcyBwbGF5ZWQuIE5vdCBwYXJ0IG9mIHRoZSBITFMgc3BlYywgYW5kIHRoaXMgaXNcbiAgICAgKiBwcm9iYWJseSBub3QgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24geWV0LCBzbyB1c2Ugc3BhcmluZ2x5LiBJZiB5b3UgZG9uJ3QgaGF2ZSBhXG4gICAgICogcmVhc29uIHRvIHByZXZlbnQgcGxheWJhY2ssIHVzZSBgbXlQbGF5ZXIub25lKCdwbGF5Jyk7YCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNmaXJzdHBsYXlcbiAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignZmlyc3RwbGF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHBhdXNlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNwYXVzZVxuICAgKiBAbGlzdGVucyBUZWNoI3BhdXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUGF1c2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFBhdXNlXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGxheWluZycpO1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWVkaWEgaGFzIGJlZW4gcGF1c2VkXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3BhdXNlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncGF1c2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgZW5kZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2VuZGVkXG4gICAqIEBsaXN0ZW5zIFRlY2gjZW5kZWRcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hFbmRlZF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRW5kZWRfKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIGlmICh0aGlzLm9wdGlvbnNfLmxvb3ApIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUoMCk7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnBhdXNlZCgpKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBtZWRpYSByZXNvdXJjZSBpcyByZWFjaGVkIChjdXJyZW50VGltZSA9PSBkdXJhdGlvbilcbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZW5kZWRcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlbmRlZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgZmlyc3Qga25vd24gb3IgY2hhbmdlZFxuICAgKlxuICAgKiBAbGlzdGVucyBUZWNoI2R1cmF0aW9uY2hhbmdlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlXygpIHtcbiAgICB0aGlzLmR1cmF0aW9uKHRoaXMudGVjaEdldF8oJ2R1cmF0aW9uJykpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBjbGljayBvbiB0aGUgbWVkaWEgZWxlbWVudCB0byBwbGF5L3BhdXNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byB0cmlnZ2VyXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjbW91c2Vkb3duXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoQ2xpY2tfID0gZnVuY3Rpb24gaGFuZGxlVGVjaENsaWNrXyhldmVudCkge1xuICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2hlbiBjb250cm9scyBhcmUgZGlzYWJsZWQgYSBjbGljayBzaG91bGQgbm90IHRvZ2dsZSBwbGF5YmFjayBiZWNhdXNlXG4gICAgLy8gdGhlIGNsaWNrIGlzIGNvbnNpZGVyZWQgYSBjb250cm9sXG4gICAgaWYgKCF0aGlzLmNvbnRyb2xzXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdXNlZCgpKSB7XG4gICAgICBzaWxlbmNlUHJvbWlzZSh0aGlzLnBsYXkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHRhcCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gSXQgd2lsbCB0b2dnbGUgdGhlIHVzZXJcbiAgICogYWN0aXZpdHkgc3RhdGUsIHdoaWNoIGhpZGVzIGFuZCBzaG93cyB0aGUgY29udHJvbHMuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjdGFwXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVGFwXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUYXBfKCkge1xuICAgIHRoaXMudXNlckFjdGl2ZSghdGhpcy51c2VyQWN0aXZlKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggdG8gc3RhcnRcbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCN0b3VjaHN0YXJ0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hTdGFydF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoVG91Y2hTdGFydF8oKSB7XG4gICAgdGhpcy51c2VyV2FzQWN0aXZlID0gdGhpcy51c2VyQWN0aXZlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaCB0byBtb3ZlXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjdG91Y2htb3ZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hNb3ZlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaE1vdmVfKCkge1xuICAgIGlmICh0aGlzLnVzZXJXYXNBY3RpdmUpIHtcbiAgICAgIHRoaXMucmVwb3J0VXNlckFjdGl2aXR5KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggdG8gZW5kXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgdG91Y2hlbmQgZXZlbnQgdGhhdCB0cmlnZ2VyZWRcbiAgICogICAgICAgIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCN0b3VjaGVuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFRvdWNoRW5kXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaEVuZF8oZXZlbnQpIHtcbiAgICAvLyBTdG9wIHRoZSBtb3VzZSBldmVudHMgZnJvbSBhbHNvIGhhcHBlbmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBzd2l0Y2hlcyBpbiBvciBvdXQgb2YgZnVsbHNjcmVlbiBtb2RlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlXyA9IGZ1bmN0aW9uIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2VfKCkge1xuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbigpKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtZnVsbHNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZnVsbHNjcmVlbicpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogbmF0aXZlIGNsaWNrIGV2ZW50cyBvbiB0aGUgU1dGIGFyZW4ndCB0cmlnZ2VyZWQgb24gSUUxMSwgV2luOC4xUlRcbiAgICogdXNlIHN0YWdlY2xpY2sgZXZlbnRzIHRyaWdnZXJlZCBmcm9tIGluc2lkZSB0aGUgU1dGIGluc3RlYWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQGxpc3RlbnMgc3RhZ2VjbGlja1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlU3RhZ2VDbGlja18gPSBmdW5jdGlvbiBoYW5kbGVTdGFnZUNsaWNrXygpIHtcbiAgICB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgVGVjaCBGdWxsc2NyZWVuIENoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgdGhlIGZ1bGxzY3JlZW5jaGFuZ2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiAgICAgICAgdGhlIGRhdGEgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbGlzdGVucyBUZWNoI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICogQGZpcmVzIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8oZXZlbnQsIGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4oZGF0YS5pc0Z1bGxzY3JlZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGdvaW5nIGluIGFuZCBvdXQgb2YgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgYW4gYXVkaW8vdmlkZW8uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBsaXN0ZW5zIFRlY2gjZXJyb3JcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hFcnJvcl8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRXJyb3JfKCkge1xuICAgIHZhciBlcnJvciA9IHRoaXMudGVjaF8uZXJyb3IoKTtcblxuICAgIHRoaXMuZXJyb3IoZXJyb3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGB0ZXh0ZGF0YWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjdGV4dGRhdGFcbiAgICogQGxpc3RlbnMgVGVjaCN0ZXh0ZGF0YVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFRleHREYXRhXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUZXh0RGF0YV8oKSB7XG4gICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBkYXRhID0gYXJndW1lbnRzWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gd2UgZ2V0IGEgdGV4dGRhdGEgZXZlbnQgZnJvbSB0ZWNoXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3RleHRkYXRhXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigndGV4dGRhdGEnLCBkYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9iamVjdCBmb3IgY2FjaGVkIHZhbHVlcy5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiAgICAgICAgIGdldCB0aGUgY3VycmVudCBvYmplY3QgY2FjaGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmdldENhY2hlID0gZnVuY3Rpb24gZ2V0Q2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXNzIHZhbHVlcyB0byB0aGUgcGxheWJhY2sgdGVjaFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZF1cbiAgICogICAgICAgIHRoZSBtZXRob2QgdG8gY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXJnXG4gICAqICAgICAgICB0aGUgYXJndW1lbnQgdG8gcGFzc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudGVjaENhbGxfID0gZnVuY3Rpb24gdGVjaENhbGxfKG1ldGhvZCwgYXJnKSB7XG4gICAgLy8gSWYgaXQncyBub3QgcmVhZHkgeWV0LCBjYWxsIG1ldGhvZCB3aGVuIGl0IGlzXG5cbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtZXRob2QgaW4gYWxsb3dlZFNldHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHNldCQxKHRoaXMubWlkZGxld2FyZV8sIHRoaXMudGVjaF8sIG1ldGhvZCwgYXJnKTtcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kIGluIGFsbG93ZWRNZWRpYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIG1lZGlhdGUodGhpcy5taWRkbGV3YXJlXywgdGhpcy50ZWNoXywgbWV0aG9kLCBhcmcpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgICAgIHRoaXMudGVjaF9bbWV0aG9kXShhcmcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZyQxKGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sIHRydWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FsbHMgY2FuJ3Qgd2FpdCBmb3IgdGhlIHRlY2gsIGFuZCBzb21ldGltZXMgZG9uJ3QgbmVlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICAgKiAgICAgICAgVGVjaCBtZXRob2RcbiAgICpcbiAgICogQHJldHVybiB7RnVuY3Rpb258dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIHRoZSBtZXRob2Qgb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50ZWNoR2V0XyA9IGZ1bmN0aW9uIHRlY2hHZXRfKG1ldGhvZCkge1xuICAgIGlmICghdGhpcy50ZWNoXyB8fCAhdGhpcy50ZWNoXy5pc1JlYWR5Xykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgaW4gYWxsb3dlZEdldHRlcnMpIHtcbiAgICAgIHJldHVybiBnZXQkMSh0aGlzLm1pZGRsZXdhcmVfLCB0aGlzLnRlY2hfLCBtZXRob2QpO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kIGluIGFsbG93ZWRNZWRpYXRvcnMpIHtcbiAgICAgIHJldHVybiBtZWRpYXRlKHRoaXMubWlkZGxld2FyZV8sIHRoaXMudGVjaF8sIG1ldGhvZCk7XG4gICAgfVxuXG4gICAgLy8gRmxhc2ggbGlrZXMgdG8gZGllIGFuZCByZWxvYWQgd2hlbiB5b3UgaGlkZSBvciByZXBvc2l0aW9uIGl0LlxuICAgIC8vIEluIHRoZXNlIGNhc2VzIHRoZSBvYmplY3QgbWV0aG9kcyBnbyBhd2F5IGFuZCB3ZSBnZXQgZXJyb3JzLlxuICAgIC8vIFdoZW4gdGhhdCBoYXBwZW5zIHdlJ2xsIGNhdGNoIHRoZSBlcnJvcnMgYW5kIGluZm9ybSB0ZWNoIHRoYXQgaXQncyBub3QgcmVhZHkgYW55IG1vcmUuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfW21ldGhvZF0oKTtcbiAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgIC8vIFdoZW4gYnVpbGRpbmcgYWRkaXRpb25hbCB0ZWNoIGxpYnMsIGFuIGV4cGVjdGVkIG1ldGhvZCBtYXkgbm90IGJlIGRlZmluZWQgeWV0XG4gICAgICBpZiAodGhpcy50ZWNoX1ttZXRob2RdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9nJDEoJ1ZpZGVvLmpzOiAnICsgbWV0aG9kICsgJyBtZXRob2Qgbm90IGRlZmluZWQgZm9yICcgKyB0aGlzLnRlY2hOYW1lXyArICcgcGxheWJhY2sgdGVjaG5vbG9neS4nLCBlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBhIG1ldGhvZCBpc24ndCBhdmFpbGFibGUgb24gdGhlIG9iamVjdCBpdCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAgICAgIGlmIChlLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgIGxvZyQxKCdWaWRlby5qczogJyArIG1ldGhvZCArICcgdW5hdmFpbGFibGUgb24gJyArIHRoaXMudGVjaE5hbWVfICsgJyBwbGF5YmFjayB0ZWNobm9sb2d5IGVsZW1lbnQuJywgZSk7XG4gICAgICAgIHRoaXMudGVjaF8uaXNSZWFkeV8gPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZXJyb3IgdW5rbm93biwganVzdCBsb2cgYW5kIHRocm93XG4gICAgICBsb2ckMShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIGJlZ2luIHBsYXliYWNrIGF0IHRoZSBmaXJzdCBvcHBvcnR1bml0eS5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZXx1bmRlZmluZWR9XG4gICAqICAgICAgICAgUmV0dXJucyBhIHByb21pc2UgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgUHJvbWlzZXMgKG9yIG9uZVxuICAgKiAgICAgICAgIHdhcyBwYXNzZWQgaW4gYXMgYW4gb3B0aW9uKS4gVGhpcyBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgb25cbiAgICogICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIG9mIHBsYXkuIElmIHRoaXMgaXMgdW5kZWZpbmVkIGl0IHdpbGwgZnVsZmlsbCB0aGVcbiAgICogICAgICAgICBwcm9taXNlIGNoYWluIG90aGVyd2lzZSB0aGUgcHJvbWlzZSBjaGFpbiB3aWxsIGJlIGZ1bGZpbGxlZCB3aGVuXG4gICAqICAgICAgICAgdGhlIHByb21pc2UgZnJvbSBwbGF5IGlzIGZ1bGZpbGxlZC5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbiBwbGF5KCkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgdmFyIFByb21pc2VDbGFzcyA9IHRoaXMub3B0aW9uc18uUHJvbWlzZSB8fCB3aW5kb3cuUHJvbWlzZTtcblxuICAgIGlmIChQcm9taXNlQ2xhc3MpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNsYXNzKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzNy5wbGF5XyhyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBsYXlfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbG9naWMgZm9yIHBsYXksIHRha2VzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZVxuICAgKiByZXR1cm4gdmFsdWUgb2YgcGxheS4gVGhpcyBhbGxvd3MgdXMgdG8gcmVzb2x2ZSB0byB0aGUgcGxheSBwcm9taXNlIGlmIHRoZXJlXG4gICAqIGlzIG9uZSBvbiBtb2Rlcm4gYnJvd3NlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja11cbiAgICogICAgICAgIFRoZSBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGVjaHMgcGxheSBpcyBhY3R1YWxseSBjYWxsZWRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnBsYXlfID0gZnVuY3Rpb24gcGxheV8oKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHNpbGVuY2VQcm9taXNlO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBjYWxsZWQgd2hpbGUgd2UgaGF2ZSBhIHBsYXkgcXVldWVkIHVwIG9uIGEgbG9hZHN0YXJ0LCByZW1vdmVcbiAgICAvLyB0aGF0IGxpc3RlbmVyIHRvIGF2b2lkIGdldHRpbmcgaW4gYSBwb3RlbnRpYWxseSBiYWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucGxheU9uTG9hZHN0YXJ0Xykge1xuICAgICAgdGhpcy5vZmYoJ2xvYWRzdGFydCcsIHRoaXMucGxheU9uTG9hZHN0YXJ0Xyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHBsYXllci90ZWNoIGlzIG5vdCByZWFkeSwgcXVldWUgdXAgYW5vdGhlciBjYWxsIHRvIGBwbGF5KClgIGZvclxuICAgIC8vIHdoZW4gaXQgaXMuIFRoaXMgd2lsbCBsb29wIGJhY2sgaW50byB0aGlzIG1ldGhvZCBmb3IgYW5vdGhlciBhdHRlbXB0IGF0XG4gICAgLy8gcGxheWJhY2sgd2hlbiB0aGUgdGVjaCBpcyByZWFkeS5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeV8pIHtcblxuICAgICAgLy8gQmFpbCBvdXQgaWYgd2UncmUgYWxyZWFkeSB3YWl0aW5nIGZvciBgcmVhZHlgIVxuICAgICAgaWYgKHRoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBsYXlXYWl0aW5nRm9yUmVhZHlfID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczgucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTtcbiAgICAgICAgY2FsbGJhY2soX3RoaXM4LnBsYXkoKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlIHBsYXllci90ZWNoIGlzIHJlYWR5IGFuZCB3ZSBoYXZlIGEgc291cmNlLCB3ZSBjYW4gYXR0ZW1wdCBwbGF5YmFjay5cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNoYW5naW5nU3JjXyAmJiAodGhpcy5zcmMoKSB8fCB0aGlzLmN1cnJlbnRTcmMoKSkpIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMudGVjaEdldF8oJ3BsYXknKSk7XG4gICAgICByZXR1cm47XG5cbiAgICAgIC8vIElmIHRoZSB0ZWNoIGlzIHJlYWR5LCBidXQgd2UgZG8gbm90IGhhdmUgYSBzb3VyY2UsIHdlJ2xsIG5lZWQgdG8gd2FpdFxuICAgICAgLy8gZm9yIGJvdGggdGhlIGByZWFkeWAgYW5kIGEgYGxvYWRzdGFydGAgd2hlbiB0aGUgc291cmNlIGlzIGZpbmFsbHlcbiAgICAgIC8vIHJlc29sdmVkIGJ5IG1pZGRsZXdhcmUgYW5kIHNldCBvbiB0aGUgcGxheWVyLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGxheSgpYCBpcyBjYWxsZWQgd2hpbGUgY2hhbmdpbmcgc291cmNlcyBvciBiZWZvcmVcbiAgICAgIC8vIG9uZSBoYXMgYmVlbiBzZXQgb24gdGhlIHBsYXllci5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLnBsYXlPbkxvYWRzdGFydF8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzOC5wbGF5T25Mb2Fkc3RhcnRfID0gbnVsbDtcbiAgICAgICAgY2FsbGJhY2soX3RoaXM4LnBsYXkoKSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uZSgnbG9hZHN0YXJ0JywgdGhpcy5wbGF5T25Mb2Fkc3RhcnRfKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhdXNlIHRoZSB2aWRlbyBwbGF5YmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9XG4gICAqICAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHBsYXllciBvYmplY3QgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIG9uXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHRoaXMudGVjaENhbGxfKCdwYXVzZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHBhdXNlZCBvciBoYXMgeWV0IHRvIHBsYXlcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIGZhbHNlOiBpZiB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICogICAgICAgICAtIHRydWU6IGlmIG1lZGlhIGlzIG5vdCBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGF1c2VkID0gZnVuY3Rpb24gcGF1c2VkKCkge1xuICAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIG9mIHBhdXNlZCBzaG91bGQgYmUgdHJ1ZSAoaW4gU2FmYXJpIGl0J3MgYWN0dWFsbHkgZmFsc2UpXG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BhdXNlZCcpID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcmFuZ2VzIG9mIHRpbWUgdGhhdCB0aGUgdXNlclxuICAgKiBoYXMgcGxheWVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2V9XG4gICAqICAgICAgICAgQSB0aW1lIHJhbmdlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYWxsIHRoZSBpbmNyZW1lbnRzIG9mIHRpbWUgdGhhdCBoYXZlXG4gICAqICAgICAgICAgYmVlbiBwbGF5ZWQuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wbGF5ZWQgPSBmdW5jdGlvbiBwbGF5ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BsYXllZCcpIHx8IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgXCJzY3J1YmJpbmdcIi4gU2NydWJiaW5nIGlzXG4gICAqIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgdGhlIHByb2dyZXNzIGJhciBoYW5kbGUgYW5kIGlzXG4gICAqIGRyYWdnaW5nIGl0IGFsb25nIHRoZSBwcm9ncmVzcyBiYXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2NydWJiaW5nXVxuICAgKiAgICAgICAgd2V0aGVyIHRoZSB1c2VyIGlzIG9yIGlzIG5vdCBzY3J1YmJpbmdcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgdmFsdWUgb2Ygc2NydWJiaW5nIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc2NydWJiaW5nID0gZnVuY3Rpb24gc2NydWJiaW5nKGlzU2NydWJiaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBpc1NjcnViYmluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcnViYmluZ187XG4gICAgfVxuICAgIHRoaXMuc2NydWJiaW5nXyA9ICEhaXNTY3J1YmJpbmc7XG5cbiAgICBpZiAoaXNTY3J1YmJpbmcpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNjcnViYmluZycpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgY3VycmVudCB0aW1lIChpbiBzZWNvbmRzKVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtzZWNvbmRzXVxuICAgKiAgICAgICAgVGhlIHRpbWUgdG8gc2VlayB0byBpbiBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICAtIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRUaW1lID0gZnVuY3Rpb24gY3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzZWNvbmRzIDwgMCkge1xuICAgICAgICBzZWNvbmRzID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVjaENhbGxfKCdzZXRDdXJyZW50VGltZScsIHNlY29uZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNhY2hlIGxhc3QgY3VycmVudFRpbWUgYW5kIHJldHVybi4gZGVmYXVsdCB0byAwIHNlY29uZHNcbiAgICAvL1xuICAgIC8vIENhY2hpbmcgdGhlIGN1cnJlbnRUaW1lIGlzIG1lYW50IHRvIHByZXZlbnQgYSBtYXNzaXZlIGFtb3VudCBvZiByZWFkcyBvbiB0aGUgdGVjaCdzXG4gICAgLy8gY3VycmVudFRpbWUgd2hlbiBzY3J1YmJpbmcsIGJ1dCBtYXkgbm90IHByb3ZpZGUgbXVjaCBwZXJmb3JtYW5jZSBiZW5lZml0IGFmdGVyYWxsLlxuICAgIC8vIFNob3VsZCBiZSB0ZXN0ZWQuIEFsc28gc29tZXRoaW5nIGhhcyB0byByZWFkIHRoZSBhY3R1YWwgY3VycmVudCB0aW1lIG9yIHRoZSBjYWNoZSB3aWxsXG4gICAgLy8gbmV2ZXIgZ2V0IHVwZGF0ZWQuXG4gICAgdGhpcy5jYWNoZV8uY3VycmVudFRpbWUgPSB0aGlzLnRlY2hHZXRfKCdjdXJyZW50VGltZScpIHx8IDA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lO1xuICB9O1xuXG4gIC8qKlxuICAgKiBOb3JtYWxseSBnZXRzIHRoZSBsZW5ndGggaW4gdGltZSBvZiB0aGUgdmlkZW8gaW4gc2Vjb25kcztcbiAgICogaW4gYWxsIGJ1dCB0aGUgcmFyZXN0IHVzZSBjYXNlcyBhbiBhcmd1bWVudCB3aWxsIE5PVCBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZFxuICAgKlxuICAgKiA+ICoqTk9URSoqOiBUaGUgdmlkZW8gbXVzdCBoYXZlIHN0YXJ0ZWQgbG9hZGluZyBiZWZvcmUgdGhlIGR1cmF0aW9uIGNhbiBiZVxuICAgKiBrbm93biwgYW5kIGluIHRoZSBjYXNlIG9mIEZsYXNoLCBtYXkgbm90IGJlIGtub3duIHVudGlsIHRoZSB2aWRlbyBzdGFydHNcbiAgICogcGxheWluZy5cbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZHNdXG4gICAqICAgICAgICBUaGUgZHVyYXRpb24gb2YgdGhlIHZpZGVvIHRvIHNldCBpbiBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8gaW4gc2Vjb25kcyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24gZHVyYXRpb24oc2Vjb25kcykge1xuICAgIGlmIChzZWNvbmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJldHVybiBOYU4gaWYgdGhlIGR1cmF0aW9uIGlzIG5vdCBrbm93blxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVfLmR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmNhY2hlXy5kdXJhdGlvbiA6IE5hTjtcbiAgICB9XG5cbiAgICBzZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcblxuICAgIC8vIFN0YW5kYXJkaXplIG9uIEluaWZpdHkgZm9yIHNpZ25hbGluZyB2aWRlbyBpcyBsaXZlXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgICBzZWNvbmRzID0gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZHMgIT09IHRoaXMuY2FjaGVfLmR1cmF0aW9uKSB7XG4gICAgICAvLyBDYWNoZSB0aGUgbGFzdCBzZXQgdmFsdWUgZm9yIG9wdGltaXplZCBzY3J1YmJpbmcgKGVzcC4gRmxhc2gpXG4gICAgICB0aGlzLmNhY2hlXy5kdXJhdGlvbiA9IHNlY29uZHM7XG5cbiAgICAgIGlmIChzZWNvbmRzID09PSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtbGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWxpdmUnKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ2R1cmF0aW9uY2hhbmdlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGhvdyBtdWNoIHRpbWUgaXMgbGVmdCBpbiB0aGUgdmlkZW8uIE5vdCBwYXJ0XG4gICAqIG9mIHRoZSBuYXRpdmUgdmlkZW8gQVBJLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIHRpbWUgcmVtYWluaW5nIGluIHNlY29uZHNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbWFpbmluZ1RpbWUgPSBmdW5jdGlvbiByZW1haW5pbmdUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uKCkgLSB0aGlzLmN1cnJlbnRUaW1lKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVtYWluaW5nIHRpbWUgZnVuY3Rpb24gdGhhdCBpcyBpbnRlbnRlZCB0byBiZSB1c2VkIHdoZW5cbiAgICogdGhlIHRpbWUgaXMgdG8gYmUgZGlzcGxheWVkIGRpcmVjdGx5IHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIHJvdW5kZWQgdGltZSByZW1haW5pbmcgaW4gc2Vjb25kc1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucmVtYWluaW5nVGltZURpc3BsYXkgPSBmdW5jdGlvbiByZW1haW5pbmdUaW1lRGlzcGxheSgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLmR1cmF0aW9uKCkpIC0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKCkpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEtpbmQgb2YgbGlrZSBhbiBhcnJheSBvZiBwb3J0aW9ucyBvZiB0aGUgdmlkZW8gdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC5cblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCB3aXRoIGFuIGFycmF5IG9mIHRoZSB0aW1lcyBvZiB0aGUgdmlkZW9cbiAgICogdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC4gSWYgeW91IGp1c3Qgd2FudCB0aGUgcGVyY2VudCBvZiB0aGVcbiAgICogdmlkZW8gdGhhdCdzIGJlZW4gZG93bmxvYWRlZCwgdXNlIGJ1ZmZlcmVkUGVyY2VudC5cbiAgICpcbiAgICogQHNlZSBbQnVmZmVyZWQgU3BlY117QGxpbmsgaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy92aWRlby5odG1sI2RvbS1tZWRpYS1idWZmZXJlZH1cbiAgICpcbiAgICogQHJldHVybiB7VGltZVJhbmdlfVxuICAgKiAgICAgICAgIEEgbW9jayBUaW1lUmFuZ2Ugb2JqZWN0IChmb2xsb3dpbmcgSFRNTCBzcGVjKVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYnVmZmVyZWQgPSBmdW5jdGlvbiBidWZmZXJlZCgpIHtcbiAgICB2YXIgYnVmZmVyZWQgPSB0aGlzLnRlY2hHZXRfKCdidWZmZXJlZCcpO1xuXG4gICAgaWYgKCFidWZmZXJlZCB8fCAhYnVmZmVyZWQubGVuZ3RoKSB7XG4gICAgICBidWZmZXJlZCA9IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcmVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcmNlbnQgKGFzIGEgZGVjaW1hbCkgb2YgdGhlIHZpZGVvIHRoYXQncyBiZWVuIGRvd25sb2FkZWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhIHBhcnQgb2YgdGhlIG5hdGl2ZSBIVE1MIHZpZGVvIEFQSS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIEEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBwZXJjZW50XG4gICAqICAgICAgICAgdGhhdCBpcyBidWZmZXJyZWQgMCBiZWluZyAwJSBhbmQgMSBiZWluZyAxMDAlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5idWZmZXJlZFBlcmNlbnQgPSBmdW5jdGlvbiBidWZmZXJlZFBlcmNlbnQkJDEoKSB7XG4gICAgcmV0dXJuIGJ1ZmZlcmVkUGVyY2VudCh0aGlzLmJ1ZmZlcmVkKCksIHRoaXMuZHVyYXRpb24oKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW5kaW5nIHRpbWUgb2YgdGhlIGxhc3QgYnVmZmVyZWQgdGltZSByYW5nZVxuICAgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIHByb2dyZXNzIGJhciB0byBlbmNhcHN1bGF0ZSBhbGwgdGltZSByYW5nZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZW5kIG9mIHRoZSBsYXN0IGJ1ZmZlcmVkIHRpbWUgcmFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmJ1ZmZlcmVkRW5kID0gZnVuY3Rpb24gYnVmZmVyZWRFbmQoKSB7XG4gICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5idWZmZXJlZCgpO1xuICAgIHZhciBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24oKTtcbiAgICB2YXIgZW5kID0gYnVmZmVyZWQuZW5kKGJ1ZmZlcmVkLmxlbmd0aCAtIDEpO1xuXG4gICAgaWYgKGVuZCA+IGR1cmF0aW9uKSB7XG4gICAgICBlbmQgPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHZvbHVtZSBvZiB0aGUgbWVkaWFcbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfSBbcGVyY2VudEFzRGVjaW1hbF1cbiAgICogICAgICAgICBUaGUgbmV3IHZvbHVtZSBhcyBhIGRlY2ltYWwgcGVyY2VudDpcbiAgICogICAgICAgICAtIDAgaXMgbXV0ZWQvMCUvb2ZmXG4gICAqICAgICAgICAgLSAxLjAgaXMgMTAwJS9mdWxsXG4gICAqICAgICAgICAgLSAwLjUgaXMgaGFsZiB2b2x1bWUgb3IgNTAlXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2b2x1bWUgYXMgYSBwZXJjZW50IHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudm9sdW1lID0gZnVuY3Rpb24gdm9sdW1lKHBlcmNlbnRBc0RlY2ltYWwpIHtcbiAgICB2YXIgdm9sID0gdm9pZCAwO1xuXG4gICAgaWYgKHBlcmNlbnRBc0RlY2ltYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRm9yY2UgdmFsdWUgdG8gYmV0d2VlbiAwIGFuZCAxXG4gICAgICB2b2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHBlcmNlbnRBc0RlY2ltYWwpKSk7XG4gICAgICB0aGlzLmNhY2hlXy52b2x1bWUgPSB2b2w7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Vm9sdW1lJywgdm9sKTtcblxuICAgICAgaWYgKHZvbCA+IDApIHtcbiAgICAgICAgdGhpcy5sYXN0Vm9sdW1lXyh2b2wpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byAxIHdoZW4gcmV0dXJuaW5nIGN1cnJlbnQgdm9sdW1lLlxuICAgIHZvbCA9IHBhcnNlRmxvYXQodGhpcy50ZWNoR2V0Xygndm9sdW1lJykpO1xuICAgIHJldHVybiBpc05hTih2b2wpID8gMSA6IHZvbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IG11dGVkIHN0YXRlLCBvciB0dXJuIG11dGUgb24gb3Igb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW211dGVkXVxuICAgKiAgICAgICAgLSB0cnVlIHRvIG11dGVcbiAgICogICAgICAgIC0gZmFsc2UgdG8gdW5tdXRlXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgLSB0cnVlIGlmIG11dGUgaXMgb24gYW5kIGdldHRpbmdcbiAgICogICAgICAgICAtIGZhbHNlIGlmIG11dGUgaXMgb2ZmIGFuZCBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5tdXRlZCA9IGZ1bmN0aW9uIG11dGVkKF9tdXRlZCkge1xuICAgIGlmIChfbXV0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldE11dGVkJywgX211dGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ211dGVkJykgfHwgZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0TXV0ZWQgc3RhdGUsIG9yIHR1cm4gZGVmYXVsdE11dGVkIG9uIG9yIG9mZi4gZGVmYXVsdE11dGVkXG4gICAqIGluZGljYXRlcyB0aGUgc3RhdGUgb2YgbXV0ZWQgb24gaW50aWFsIHBsYXliYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgIHZhciBteVBsYXllciA9IHZpZGVvanMoJ3NvbWUtcGxheWVyLWlkJyk7XG4gICAqXG4gICAqICAgbXlQbGF5ZXIuc3JjKFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYXRoL3RvL3ZpZGVvLm1wNFwiKTtcbiAgICpcbiAgICogICAvLyBnZXQsIHNob3VsZCBiZSBmYWxzZVxuICAgKiAgIGNvbnNvbGUubG9nKG15UGxheWVyLmRlZmF1bHRNdXRlZCgpKTtcbiAgICogICAvLyBzZXQgdG8gdHJ1ZVxuICAgKiAgIG15UGxheWVyLmRlZmF1bHRNdXRlZCh0cnVlKTtcbiAgICogICAvLyBnZXQgc2hvdWxkIGJlIHRydWVcbiAgICogICBjb25zb2xlLmxvZyhteVBsYXllci5kZWZhdWx0TXV0ZWQoKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWZhdWx0TXV0ZWRdXG4gICAqICAgICAgICAtIHRydWUgdG8gbXV0ZVxuICAgKiAgICAgICAgLSBmYWxzZSB0byB1bm11dGVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbnxQbGF5ZXJ9XG4gICAqICAgICAgICAgLSB0cnVlIGlmIGRlZmF1bHRNdXRlZCBpcyBvbiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZGVmYXVsdE11dGVkIGlzIG9mZiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcGxheWVyIHdoZW4gc2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZGVmYXVsdE11dGVkID0gZnVuY3Rpb24gZGVmYXVsdE11dGVkKF9kZWZhdWx0TXV0ZWQpIHtcbiAgICBpZiAoX2RlZmF1bHRNdXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3NldERlZmF1bHRNdXRlZCcsIF9kZWZhdWx0TXV0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZGVmYXVsdE11dGVkJykgfHwgZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCB2b2x1bWUsIG9yIHNldCBpdFxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IFtwZXJjZW50QXNEZWNpbWFsXVxuICAgKiAgICAgICAgIFRoZSBuZXcgbGFzdCB2b2x1bWUgYXMgYSBkZWNpbWFsIHBlcmNlbnQ6XG4gICAqICAgICAgICAgLSAwIGlzIG11dGVkLzAlL29mZlxuICAgKiAgICAgICAgIC0gMS4wIGlzIDEwMCUvZnVsbFxuICAgKiAgICAgICAgIC0gMC41IGlzIGhhbGYgdm9sdW1lIG9yIDUwJVxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgbGFzdFZvbHVtZSBhcyBhIHBlcmNlbnQgd2hlbiBnZXR0aW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIGxhc3RWb2x1bWVfKHBlcmNlbnRBc0RlY2ltYWwpIHtcbiAgICBpZiAocGVyY2VudEFzRGVjaW1hbCAhPT0gdW5kZWZpbmVkICYmIHBlcmNlbnRBc0RlY2ltYWwgIT09IDApIHtcbiAgICAgIHRoaXMuY2FjaGVfLmxhc3RWb2x1bWUgPSBwZXJjZW50QXNEZWNpbWFsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZV8ubGFzdFZvbHVtZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCB0ZWNoIGNhbiBzdXBwb3J0IG5hdGl2ZSBmdWxsc2NyZWVuXG4gICAqIChlLmcuIHdpdGggYnVpbHQgaW4gY29udHJvbHMgbGlrZSBpT1MsIHNvIG5vdCBvdXIgZmxhc2ggc3dmKVxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIGlmIG5hdGl2ZSBmdWxsc2NyZWVuIGlzIHN1cHBvcnRlZFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc3VwcG9ydHNGdWxsU2NyZWVuID0gZnVuY3Rpb24gc3VwcG9ydHNGdWxsU2NyZWVuKCkge1xuICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdzdXBwb3J0c0Z1bGxTY3JlZW4nKSB8fCBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiBmdWxsc2NyZWVuIG1vZGUgb3IgdGVsbCB0aGUgcGxheWVyIHRoYXQgaXRcbiAgICogaXMgb3IgaXMgbm90IGluIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICpcbiAgICogPiBOT1RFOiBBcyBvZiB0aGUgbGF0ZXN0IEhUTUw1IHNwZWMsIGlzRnVsbHNjcmVlbiBpcyBubyBsb25nZXIgYW4gb2ZmaWNpYWxcbiAgICogcHJvcGVydHkgYW5kIGluc3RlYWQgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgaXMgdXNlZC4gQnV0IGlzRnVsbHNjcmVlbiBpc1xuICAgKiBzdGlsbCBhIHZhbHVhYmxlIHByb3BlcnR5IGZvciBpbnRlcm5hbCBwbGF5ZXIgd29ya2luZ3MuXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFtpc0ZTXVxuICAgKiAgICAgICAgIFNldCB0aGUgcGxheWVycyBjdXJyZW50IGZ1bGxzY3JlZW4gc3RhdGVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIHRydWUgaWYgZnVsbHNjcmVlbiBpcyBvbiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZnVsbHNjcmVlbiBpcyBvZmYgYW5kIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmlzRnVsbHNjcmVlbiA9IGZ1bmN0aW9uIGlzRnVsbHNjcmVlbihpc0ZTKSB7XG4gICAgaWYgKGlzRlMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW5fID0gISFpc0ZTO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLmlzRnVsbHNjcmVlbl87XG4gIH07XG5cbiAgLyoqXG4gICAqIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSB2aWRlbyB0byBmdWxsIHNjcmVlblxuICAgKiBJbiBzb21lIGJyb3dzZXJzLCBmdWxsIHNjcmVlbiBpcyBub3Qgc3VwcG9ydGVkIG5hdGl2ZWx5LCBzbyBpdCBlbnRlcnNcbiAgICogXCJmdWxsIHdpbmRvdyBtb2RlXCIsIHdoZXJlIHRoZSB2aWRlbyBmaWxscyB0aGUgYnJvd3NlciB3aW5kb3cuXG4gICAqIEluIGJyb3dzZXJzIGFuZCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBuYXRpdmUgZnVsbCBzY3JlZW4sIHNvbWV0aW1lcyB0aGVcbiAgICogYnJvd3NlcidzIGRlZmF1bHQgY29udHJvbHMgd2lsbCBiZSBzaG93biwgYW5kIG5vdCB0aGUgVmlkZW8uanMgY3VzdG9tIHNraW4uXG4gICAqIFRoaXMgaW5jbHVkZXMgbW9zdCBtb2JpbGUgZGV2aWNlcyAoaU9TLCBBbmRyb2lkKSBhbmQgb2xkZXIgdmVyc2lvbnMgb2ZcbiAgICogU2FmYXJpLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlcXVlc3RGdWxsc2NyZWVuID0gZnVuY3Rpb24gcmVxdWVzdEZ1bGxzY3JlZW4oKSB7XG4gICAgdmFyIGZzQXBpID0gRnVsbHNjcmVlbkFwaTtcblxuICAgIHRoaXMuaXNGdWxsc2NyZWVuKHRydWUpO1xuXG4gICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAvLyB0aGUgYnJvd3NlciBzdXBwb3J0cyBnb2luZyBmdWxsc2NyZWVuIGF0IHRoZSBlbGVtZW50IGxldmVsIHNvIHdlIGNhblxuICAgICAgLy8gdGFrZSB0aGUgY29udHJvbHMgZnVsbHNjcmVlbiBhcyB3ZWxsIGFzIHRoZSB2aWRlb1xuXG4gICAgICAvLyBUcmlnZ2VyIGZ1bGxzY3JlZW5jaGFuZ2UgZXZlbnQgYWZ0ZXIgY2hhbmdlXG4gICAgICAvLyBXZSBoYXZlIHRvIHNwZWNpZmljYWxseSBhZGQgdGhpcyBlYWNoIHRpbWUsIGFuZCByZW1vdmVcbiAgICAgIC8vIHdoZW4gY2FuY2VsaW5nIGZ1bGxzY3JlZW4uIE90aGVyd2lzZSBpZiB0aGVyZSdzIG11bHRpcGxlXG4gICAgICAvLyBwbGF5ZXJzIG9uIGEgcGFnZSwgdGhleSB3b3VsZCBhbGwgYmUgcmVhY3RpbmcgdG8gdGhlIHNhbWUgZnVsbHNjcmVlblxuICAgICAgLy8gZXZlbnRzXG4gICAgICBvbihkb2N1bWVudCwgZnNBcGkuZnVsbHNjcmVlbmNoYW5nZSwgYmluZCh0aGlzLCBmdW5jdGlvbiBkb2N1bWVudEZ1bGxzY3JlZW5DaGFuZ2UoZSkge1xuICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbihkb2N1bWVudFtmc0FwaS5mdWxsc2NyZWVuRWxlbWVudF0pO1xuXG4gICAgICAgIC8vIElmIGNhbmNlbGxpbmcgZnVsbHNjcmVlbiwgcmVtb3ZlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4oKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvZmYoZG9jdW1lbnQsIGZzQXBpLmZ1bGxzY3JlZW5jaGFuZ2UsIGRvY3VtZW50RnVsbHNjcmVlbkNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5lbF9bZnNBcGkucmVxdWVzdEZ1bGxzY3JlZW5dKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRlY2hfLnN1cHBvcnRzRnVsbFNjcmVlbigpKSB7XG4gICAgICAvLyB3ZSBjYW4ndCB0YWtlIHRoZSB2aWRlby5qcyBjb250cm9scyBmdWxsc2NyZWVuIGJ1dCB3ZSBjYW4gZ28gZnVsbHNjcmVlblxuICAgICAgLy8gd2l0aCBuYXRpdmUgY29udHJvbHNcbiAgICAgIHRoaXMudGVjaENhbGxfKCdlbnRlckZ1bGxTY3JlZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZnVsbHNjcmVlbiBpc24ndCBzdXBwb3J0ZWQgc28gd2UnbGwganVzdCBzdHJldGNoIHRoZSB2aWRlbyBlbGVtZW50IHRvXG4gICAgICAvLyBmaWxsIHRoZSB2aWV3cG9ydFxuICAgICAgdGhpcy5lbnRlckZ1bGxXaW5kb3coKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignZnVsbHNjcmVlbmNoYW5nZScpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB2aWRlbyB0byBpdHMgbm9ybWFsIHNpemUgYWZ0ZXIgaGF2aW5nIGJlZW4gaW4gZnVsbCBzY3JlZW4gbW9kZVxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuID0gZnVuY3Rpb24gZXhpdEZ1bGxzY3JlZW4oKSB7XG4gICAgdmFyIGZzQXBpID0gRnVsbHNjcmVlbkFwaTtcblxuICAgIHRoaXMuaXNGdWxsc2NyZWVuKGZhbHNlKTtcblxuICAgIC8vIENoZWNrIGZvciBicm93c2VyIGVsZW1lbnQgZnVsbHNjcmVlbiBzdXBwb3J0XG4gICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudFtmc0FwaS5leGl0RnVsbHNjcmVlbl0oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGVjaF8uc3VwcG9ydHNGdWxsU2NyZWVuKCkpIHtcbiAgICAgIHRoaXMudGVjaENhbGxfKCdleGl0RnVsbFNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4aXRGdWxsV2luZG93KCk7XG4gICAgICAvKipcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gZnVsbHNjcmVlbiBpc24ndCBzdXBwb3J0ZWQgd2UgY2FuIHN0cmV0Y2ggdGhlXG4gICAqIHZpZGVvIGNvbnRhaW5lciB0byBhcyB3aWRlIGFzIHRoZSBicm93c2VyIHdpbGwgbGV0IHVzLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2VudGVyRnVsbFdpbmRvd1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZW50ZXJGdWxsV2luZG93ID0gZnVuY3Rpb24gZW50ZXJGdWxsV2luZG93KCkge1xuICAgIHRoaXMuaXNGdWxsV2luZG93ID0gdHJ1ZTtcblxuICAgIC8vIFN0b3Jpbmcgb3JpZ2luYWwgZG9jIG92ZXJmbG93IHZhbHVlIHRvIHJldHVybiB0byB3aGVuIGZ1bGxzY3JlZW4gaXMgb2ZmXG4gICAgdGhpcy5kb2NPcmlnT3ZlcmZsb3cgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7XG5cbiAgICAvLyBBZGQgbGlzdGVuZXIgZm9yIGVzYyBrZXkgdG8gZXhpdCBmdWxsc2NyZWVuXG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmZ1bGxXaW5kb3dPbkVzY0tleSkpO1xuXG4gICAgLy8gSGlkZSBhbnkgc2Nyb2xsIGJhcnNcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIEFwcGx5IGZ1bGxzY3JlZW4gc3R5bGVzXG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ3Zqcy1mdWxsLXdpbmRvdycpO1xuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IFBsYXllciNlbnRlckZ1bGxXaW5kb3dcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlbnRlckZ1bGxXaW5kb3cnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNhbGwgdG8gZWl0aGVyIGV4aXQgZnVsbCB3aW5kb3cgb3JcbiAgICogZnVsbCBzY3JlZW4gb24gRVNDIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IHRvIGNoZWNrIGZvciBrZXkgcHJlc3NcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmZ1bGxXaW5kb3dPbkVzY0tleSA9IGZ1bmN0aW9uIGZ1bGxXaW5kb3dPbkVzY0tleShldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbFdpbmRvdygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRXhpdCBmdWxsIHdpbmRvd1xuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2V4aXRGdWxsV2luZG93XG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5leGl0RnVsbFdpbmRvdyA9IGZ1bmN0aW9uIGV4aXRGdWxsV2luZG93KCkge1xuICAgIHRoaXMuaXNGdWxsV2luZG93ID0gZmFsc2U7XG4gICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuZnVsbFdpbmRvd09uRXNjS2V5KTtcblxuICAgIC8vIFVuaGlkZSBzY3JvbGwgYmFycy5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLmRvY09yaWdPdmVyZmxvdztcblxuICAgIC8vIFJlbW92ZSBmdWxsc2NyZWVuIHN0eWxlc1xuICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksICd2anMtZnVsbC13aW5kb3cnKTtcblxuICAgIC8vIFJlc2l6ZSB0aGUgYm94LCBjb250cm9sbGVyLCBhbmQgcG9zdGVyIHRvIG9yaWdpbmFsIHNpemVzXG4gICAgLy8gdGhpcy5wb3NpdGlvbkFsbCgpO1xuICAgIC8qKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZXhpdEZ1bGxXaW5kb3dcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdleGl0RnVsbFdpbmRvdycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBwbGF5ZXIgY2FuIHBsYXkgYSBnaXZlbiBtaW1ldHlwZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwMTEzL3ZpZGVvLmh0bWwjZG9tLW5hdmlnYXRvci1jYW5wbGF5dHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiAgICAgICAgVGhlIG1pbWV0eXBlIHRvIGNoZWNrXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSh0eXBlKSB7XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHBsYXliYWNrIHRlY2hub2xvZ3kgaW4gdGhlIG9wdGlvbnMgb3JkZXJcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IHRoaXMub3B0aW9uc18udGVjaE9yZGVyOyBpIDwgai5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRlY2hOYW1lID0galtpXTtcbiAgICAgIHZhciB0ZWNoID0gVGVjaC5nZXRUZWNoKHRlY2hOYW1lKTtcblxuICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgLy8gUmVtb3ZlIG9uY2UgdGhhdCBkZXByZWNhdGVkIGJlaGF2aW9yIGlzIHJlbW92ZWQuXG4gICAgICBpZiAoIXRlY2gpIHtcbiAgICAgICAgdGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQodGVjaE5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgIGlmICghdGVjaCkge1xuICAgICAgICBsb2ckMS5lcnJvcignVGhlIFwiJyArIHRlY2hOYW1lICsgJ1wiIHRlY2ggaXMgdW5kZWZpbmVkLiBTa2lwcGVkIGJyb3dzZXIgc3VwcG9ydCBjaGVjayBmb3IgdGhhdCB0ZWNoLicpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyB0ZWNobm9sb2d5XG4gICAgICBpZiAodGVjaC5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgIGNhbiA9IHRlY2guY2FuUGxheVR5cGUodHlwZSk7XG5cbiAgICAgICAgaWYgKGNhbikge1xuICAgICAgICAgIHJldHVybiBjYW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBzb3VyY2UgYmFzZWQgb24gdGVjaC1vcmRlciBvciBzb3VyY2Utb3JkZXJcbiAgICogVXNlcyBzb3VyY2Utb3JkZXIgc2VsZWN0aW9uIGlmIGBvcHRpb25zLnNvdXJjZU9yZGVyYCBpcyB0cnV0aHkuIE90aGVyd2lzZSxcbiAgICogZGVmYXVsdHMgdG8gdGVjaC1vcmRlciBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gc291cmNlc1xuICAgKiAgICAgICAgVGhlIHNvdXJjZXMgZm9yIGEgbWVkaWEgYXNzZXRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fGJvb2xlYW59XG4gICAqICAgICAgICAgT2JqZWN0IG9mIHNvdXJjZSBhbmQgdGVjaCBvcmRlciBvciBmYWxzZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc2VsZWN0U291cmNlID0gZnVuY3Rpb24gc2VsZWN0U291cmNlKHNvdXJjZXMpIHtcbiAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgIC8vIEdldCBvbmx5IHRoZSB0ZWNocyBzcGVjaWZpZWQgaW4gYHRlY2hPcmRlcmAgdGhhdCBleGlzdCBhbmQgYXJlIHN1cHBvcnRlZCBieSB0aGVcbiAgICAvLyBjdXJyZW50IHBsYXRmb3JtXG4gICAgdmFyIHRlY2hzID0gdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIubWFwKGZ1bmN0aW9uICh0ZWNoTmFtZSkge1xuICAgICAgcmV0dXJuIFt0ZWNoTmFtZSwgVGVjaC5nZXRUZWNoKHRlY2hOYW1lKV07XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgdGVjaE5hbWUgPSBfcmVmWzBdLFxuICAgICAgICAgIHRlY2ggPSBfcmVmWzFdO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgIGlmICh0ZWNoKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICByZXR1cm4gdGVjaC5pc1N1cHBvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBsb2ckMS5lcnJvcignVGhlIFwiJyArIHRlY2hOYW1lICsgJ1wiIHRlY2ggaXMgdW5kZWZpbmVkLiBTa2lwcGVkIGJyb3dzZXIgc3VwcG9ydCBjaGVjayBmb3IgdGhhdCB0ZWNoLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggYGlubmVyQXJyYXlgIGVsZW1lbnQgb25jZSBwZXIgYG91dGVyQXJyYXlgIGVsZW1lbnQgYW5kIGV4ZWN1dGVcbiAgICAvLyBgdGVzdGVyYCB3aXRoIGJvdGguIElmIGB0ZXN0ZXJgIHJldHVybnMgYSBub24tZmFsc3kgdmFsdWUsIGV4aXQgZWFybHkgYW5kIHJldHVyblxuICAgIC8vIHRoYXQgdmFsdWUuXG4gICAgdmFyIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpciA9IGZ1bmN0aW9uIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpcihvdXRlckFycmF5LCBpbm5lckFycmF5LCB0ZXN0ZXIpIHtcbiAgICAgIHZhciBmb3VuZCA9IHZvaWQgMDtcblxuICAgICAgb3V0ZXJBcnJheS5zb21lKGZ1bmN0aW9uIChvdXRlckNob2ljZSkge1xuICAgICAgICByZXR1cm4gaW5uZXJBcnJheS5zb21lKGZ1bmN0aW9uIChpbm5lckNob2ljZSkge1xuICAgICAgICAgIGZvdW5kID0gdGVzdGVyKG91dGVyQ2hvaWNlLCBpbm5lckNob2ljZSk7XG5cbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH07XG5cbiAgICB2YXIgZm91bmRTb3VyY2VBbmRUZWNoID0gdm9pZCAwO1xuICAgIHZhciBmbGlwID0gZnVuY3Rpb24gZmxpcChmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBmbihiLCBhKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgZmluZGVyID0gZnVuY3Rpb24gZmluZGVyKF9yZWYyLCBzb3VyY2UpIHtcbiAgICAgIHZhciB0ZWNoTmFtZSA9IF9yZWYyWzBdLFxuICAgICAgICAgIHRlY2ggPSBfcmVmMlsxXTtcblxuICAgICAgaWYgKHRlY2guY2FuUGxheVNvdXJjZShzb3VyY2UsIF90aGlzOS5vcHRpb25zX1t0ZWNoTmFtZS50b0xvd2VyQ2FzZSgpXSkpIHtcbiAgICAgICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UsIHRlY2g6IHRlY2hOYW1lIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdHJ1dGhpbmVzcyBvZiBgb3B0aW9ucy5zb3VyY2VPcmRlcmAsIHdlIHN3YXAgdGhlIG9yZGVyIG9mIHRlY2hzIGFuZCBzb3VyY2VzXG4gICAgLy8gdG8gc2VsZWN0IGZyb20gdGhlbSBiYXNlZCBvbiB0aGVpciBwcmlvcml0eS5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5zb3VyY2VPcmRlcikge1xuICAgICAgLy8gU291cmNlLWZpcnN0IG9yZGVyaW5nXG4gICAgICBmb3VuZFNvdXJjZUFuZFRlY2ggPSBmaW5kRmlyc3RQYXNzaW5nVGVjaFNvdXJjZVBhaXIoc291cmNlcywgdGVjaHMsIGZsaXAoZmluZGVyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRlY2gtZmlyc3Qgb3JkZXJpbmdcbiAgICAgIGZvdW5kU291cmNlQW5kVGVjaCA9IGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpcih0ZWNocywgc291cmNlcywgZmluZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmRTb3VyY2VBbmRUZWNoIHx8IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSB2aWRlbyBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R8VGVjaH5Tb3VyY2VPYmplY3RbXXxzdHJpbmd9IFtzb3VyY2VdXG4gICAqICAgICAgICBBIFNvdXJjZU9iamVjdCwgYW4gYXJyYXkgb2YgU291cmNlT2JqZWN0cywgb3IgYSBzdHJpbmcgcmVmZXJlbmNpbmdcbiAgICogICAgICAgIGEgVVJMIHRvIGEgbWVkaWEgc291cmNlLiBJdCBpcyBfaGlnaGx5IHJlY29tbWVuZGVkXyB0aGF0IGFuIG9iamVjdFxuICAgKiAgICAgICAgb3IgYXJyYXkgb2Ygb2JqZWN0cyBpcyB1c2VkIGhlcmUsIHNvIHRoYXQgc291cmNlIHNlbGVjdGlvblxuICAgKiAgICAgICAgYWxnb3JpdGhtcyBjYW4gdGFrZSB0aGUgYHR5cGVgIGludG8gYWNjb3VudC5cbiAgICpcbiAgICogICAgICAgIElmIG5vdCBwcm92aWRlZCwgdGhpcyBtZXRob2QgYWN0cyBhcyBhIGdldHRlci5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICBJZiB0aGUgYHNvdXJjZWAgYXJndW1lbnQgaXMgbWlzc2luZywgcmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2VcbiAgICogICAgICAgICBVUkwuIE90aGVyd2lzZSwgcmV0dXJucyBub3RoaW5nL3VuZGVmaW5lZC5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnNyYyA9IGZ1bmN0aW9uIHNyYyhzb3VyY2UpIHtcbiAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAvLyBnZXR0ZXIgdXNhZ2VcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlXy5zcmMgfHwgJyc7XG4gICAgfVxuICAgIC8vIGZpbHRlciBvdXQgaW52YWxpZCBzb3VyY2VzIGFuZCB0dXJuIG91ciBzb3VyY2UgaW50b1xuICAgIC8vIGFuIGFycmF5IG9mIHNvdXJjZSBvYmplY3RzXG4gICAgdmFyIHNvdXJjZXMgPSBmaWx0ZXJTb3VyY2Uoc291cmNlKTtcblxuICAgIC8vIGlmIGEgc291cmNlIHdhcyBwYXNzZWQgaW4gdGhlbiBpdCBpcyBpbnZhbGlkIGJlY2F1c2VcbiAgICAvLyBpdCB3YXMgZmlsdGVyZWQgdG8gYSB6ZXJvIGxlbmd0aCBBcnJheS4gU28gd2UgaGF2ZSB0b1xuICAgIC8vIHNob3cgYW4gZXJyb3JcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVycm9yKHsgY29kZTogNCwgbWVzc2FnZTogdGhpcy5sb2NhbGl6ZSh0aGlzLm9wdGlvbnNfLm5vdFN1cHBvcnRlZE1lc3NhZ2UpIH0pO1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaW50aWFsIHNvdXJjZXNcbiAgICB0aGlzLmNoYW5naW5nU3JjXyA9IHRydWU7XG5cbiAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gc291cmNlcztcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZUNhY2hlc18oc291cmNlc1swXSk7XG5cbiAgICAvLyBtaWRkbGV3YXJlU291cmNlIGlzIHRoZSBzb3VyY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY2hhbmdlZCBieSBtaWRkbGV3YXJlXG4gICAgc2V0U291cmNlKHRoaXMsIHNvdXJjZXNbMF0sIGZ1bmN0aW9uIChtaWRkbGV3YXJlU291cmNlLCBtd3MpIHtcbiAgICAgIF90aGlzMTAubWlkZGxld2FyZV8gPSBtd3M7XG5cbiAgICAgIC8vIHNpbmNlIHNvdXJjZVNldCBpcyBhc3luYyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYWdhaW4gYWZ0ZXIgd2Ugc2VsZWN0IGEgc291cmNlIHNpbmNlXG4gICAgICAvLyB0aGUgc291cmNlIHRoYXQgaXMgc2VsZWN0ZWQgY291bGQgYmUgb3V0IG9mIG9yZGVyIGZyb20gdGhlIGNhY2hlIHVwZGF0ZSBhYm92ZSB0aGlzIGNhbGxiYWNrLlxuICAgICAgX3RoaXMxMC5jYWNoZV8uc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICBfdGhpczEwLnVwZGF0ZVNvdXJjZUNhY2hlc18obWlkZGxld2FyZVNvdXJjZSk7XG5cbiAgICAgIHZhciBlcnIgPSBfdGhpczEwLnNyY18obWlkZGxld2FyZVNvdXJjZSk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHNvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczEwLnNyYyhzb3VyY2VzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTAuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gYSB0aW1lb3V0IHRvIGdpdmUgZm9sa3MgYSBjaGFuY2UgdG8gYWRkIGVycm9yIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIF90aGlzMTAuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcih7IGNvZGU6IDQsIG1lc3NhZ2U6IHRoaXMubG9jYWxpemUodGhpcy5vcHRpb25zXy5ub3RTdXBwb3J0ZWRNZXNzYWdlKSB9KTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gd2UgY291bGQgbm90IGZpbmQgYW4gYXBwcm9wcmlhdGUgdGVjaCwgYnV0IGxldCdzIHN0aWxsIG5vdGlmeSB0aGUgZGVsZWdhdGUgdGhhdCB0aGlzIGlzIGl0XG4gICAgICAgIC8vIHRoaXMgbmVlZHMgYSBiZXR0ZXIgY29tbWVudCBhYm91dCB3aHkgdGhpcyBpcyBuZWVkZWRcbiAgICAgICAgX3RoaXMxMC50cmlnZ2VyUmVhZHkoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldFRlY2gobXdzLCBfdGhpczEwLnRlY2hfKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IG9uIHRoZSB0ZWNoLCByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3ZXRoZXJcbiAgICogdGhlcmUgaXMgYSB0ZWNoIHRoYXQgY2FuIHBsYXkgdGhlIHNvdXJjZSBvciBub3RcbiAgICpcbiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB0byBzZXQgb24gdGhlIFRlY2hcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgdGhlcmUgaXMgbm8gVGVjaCB0byBwbGF5YmFjayB0aGlzIHNvdXJjZVxuICAgKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5zcmNfID0gZnVuY3Rpb24gc3JjXyhzb3VyY2UpIHtcbiAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICB2YXIgc291cmNlVGVjaCA9IHRoaXMuc2VsZWN0U291cmNlKFtzb3VyY2VdKTtcblxuICAgIGlmICghc291cmNlVGVjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aXRsZUNhc2VFcXVhbHMoc291cmNlVGVjaC50ZWNoLCB0aGlzLnRlY2hOYW1lXykpIHtcbiAgICAgIHRoaXMuY2hhbmdpbmdTcmNfID0gdHJ1ZTtcbiAgICAgIC8vIGxvYWQgdGhpcyB0ZWNobm9sb2d5IHdpdGggdGhlIGNob3NlbiBzb3VyY2VcbiAgICAgIHRoaXMubG9hZFRlY2hfKHNvdXJjZVRlY2gudGVjaCwgc291cmNlVGVjaC5zb3VyY2UpO1xuICAgICAgdGhpcy50ZWNoXy5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTEuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyB3YWl0IHVudGlsIHRoZSB0ZWNoIGlzIHJlYWR5IHRvIHNldCB0aGUgc291cmNlXG4gICAgLy8gYW5kIHNldCBpdCBzeW5jaHJvbm91c2x5IGlmIHBvc3NpYmxlICgjMjMyNilcbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcblxuICAgICAgLy8gVGhlIHNldFNvdXJjZSB0ZWNoIG1ldGhvZCB3YXMgYWRkZWQgd2l0aCBzb3VyY2UgaGFuZGxlcnNcbiAgICAgIC8vIHNvIG9sZGVyIHRlY2hzIHdvbid0IHN1cHBvcnQgaXRcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdGhlIGRpcmVjdCBwcm90b3R5cGUgZm9yIHRoZSBjYXNlIHdoZXJlIHN1YmNsYXNzZXNcbiAgICAgIC8vIG9mIHRoZSB0ZWNoIGRvIG5vdCBzdXBwb3J0IHNvdXJjZSBoYW5kbGVyc1xuICAgICAgaWYgKHRoaXMudGVjaF8uY29uc3RydWN0b3IucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdzZXRTb3VyY2UnKSkge1xuICAgICAgICB0aGlzLnRlY2hDYWxsXygnc2V0U291cmNlJywgc291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGVjaENhbGxfKCdzcmMnLCBzb3VyY2Uuc3JjKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFuZ2luZ1NyY18gPSBmYWxzZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQmVnaW4gbG9hZGluZyB0aGUgc3JjIGRhdGEuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gbG9hZCgpIHtcbiAgICB0aGlzLnRlY2hDYWxsXygnbG9hZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgcGxheWVyLiBMb2FkcyB0aGUgZmlyc3QgdGVjaCBpbiB0aGUgdGVjaE9yZGVyLFxuICAgKiBhbmQgY2FsbHMgYHJlc2V0YCBvbiB0aGUgdGVjaGAuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hfLmNsZWFyVHJhY2tzKCd0ZXh0Jyk7XG4gICAgfVxuICAgIHRoaXMubG9hZFRlY2hfKHRoaXMub3B0aW9uc18udGVjaE9yZGVyWzBdLCBudWxsKTtcbiAgICB0aGlzLnRlY2hDYWxsXygncmVzZXQnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgb2YgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm4ge1RlY2h+U291cmNlT2JqZWN0W119XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdHNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRTb3VyY2VzID0gZnVuY3Rpb24gY3VycmVudFNvdXJjZXMoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMuY3VycmVudFNvdXJjZSgpO1xuICAgIHZhciBzb3VyY2VzID0gW107XG5cbiAgICAvLyBhc3N1bWUgYHt9YCBvciBgeyBzcmMgfWBcbiAgICBpZiAoT2JqZWN0LmtleXMoc291cmNlKS5sZW5ndGggIT09IDApIHtcbiAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlXy5zb3VyY2VzIHx8IHNvdXJjZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3VycmVudFNvdXJjZSA9IGZ1bmN0aW9uIGN1cnJlbnRTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfLnNvdXJjZSB8fCB7fTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIFVSTCBvZiB0aGUgY3VycmVudCBzb3VyY2UgdmFsdWUgZS5nLiBodHRwOi8vbXlzaXRlLmNvbS92aWRlby5tcDRcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIGBjdXJyZW50VHlwZWAgdG8gYXNzaXN0IGluIHJlYnVpbGRpbmcgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHNvdXJjZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3VycmVudFNyYyA9IGZ1bmN0aW9uIGN1cnJlbnRTcmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvdXJjZSgpICYmIHRoaXMuY3VycmVudFNvdXJjZSgpLnNyYyB8fCAnJztcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNvdXJjZSB0eXBlIGUuZy4gdmlkZW8vbXA0XG4gICAqIFRoaXMgY2FuIGFsbG93IHlvdSByZWJ1aWxkIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3Qgc28gdGhhdCB5b3UgY291bGQgbG9hZCB0aGUgc2FtZVxuICAgKiBzb3VyY2UgYW5kIHRlY2ggbGF0ZXJcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBzb3VyY2UgTUlNRSB0eXBlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5jdXJyZW50VHlwZSA9IGZ1bmN0aW9uIGN1cnJlbnRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2UoKSAmJiB0aGlzLmN1cnJlbnRTb3VyY2UoKS50eXBlIHx8ICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCBwcmVsb2FkXG4gICAqICAgICAgICAtIGZhbHNlIG1hZW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCBwcmVsb2FkXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgcHJlbG9hZCBhdHRyaWJ1dGUgdmFsdWUgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gcHJlbG9hZCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UHJlbG9hZCcsIHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc18ucHJlbG9hZCA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncHJlbG9hZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBhdXRvcGxheSBvcHRpb24uIFdoZW4gdGhpcyBpcyBhIGJvb2xlYW4gaXQgd2lsbFxuICAgKiBtb2RpZnkgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgdGVjaC4gV2hlbiB0aGlzIGlzIGEgc3RyaW5nIHRoZSBhdHRyaWJ1dGUgb25cbiAgICogdGhlIHRlY2ggd2lsbCBiZSByZW1vdmVkIGFuZCBgUGxheWVyYCB3aWxsIGhhbmRsZSBhdXRvcGxheSBvbiBsb2Fkc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBbdmFsdWVdXG4gICAqICAgICAgICAtIHRydWU6IGF1dG9wbGF5IHVzaW5nIHRoZSBicm93c2VyIGJlaGF2aW9yXG4gICAqICAgICAgICAtIGZhbHNlOiBkbyBub3QgYXV0b3BsYXlcbiAgICogICAgICAgIC0gJ3BsYXknOiBjYWxsIHBsYXkoKSBvbiBldmVyeSBsb2Fkc3RhcnRcbiAgICogICAgICAgIC0gJ211dGVkJzogY2FsbCBtdXRlZCgpIHRoZW4gcGxheSgpIG9uIGV2ZXJ5IGxvYWRzdGFydFxuICAgKiAgICAgICAgLSAnYW55JzogY2FsbCBwbGF5KCkgb24gZXZlcnkgbG9hZHN0YXJ0LiBpZiB0aGF0IGZhaWxzIGNhbGwgbXV0ZWQoKSB0aGVuIHBsYXkoKS5cbiAgICogICAgICAgIC0gKjogdmFsdWVzIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkIGhlcmUgd2lsbCBiZSBzZXQgYGF1dG9wbGF5YCB0byB0cnVlXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGF1dG9wbGF5IHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYXV0b3BsYXkgPSBmdW5jdGlvbiBhdXRvcGxheSh2YWx1ZSkge1xuICAgIC8vIGdldHRlciB1c2FnZVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXy5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGVjaEF1dG9wbGF5ID0gdm9pZCAwO1xuXG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgc3RyaW5nIHNldCBpdCB0byB0aGF0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgLyhhbnl8cGxheXxtdXRlZCkvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ID0gdmFsdWU7XG4gICAgICB0aGlzLm1hbnVhbEF1dG9wbGF5Xyh2YWx1ZSk7XG4gICAgICB0ZWNoQXV0b3BsYXkgPSBmYWxzZTtcblxuICAgICAgLy8gYW55IGZhbHN5IHZhbHVlIHNldHMgYXV0b3BsYXkgdG8gZmFsc2UgaW4gdGhlIGJyb3dzZXIsXG4gICAgICAvLyBsZXRzIGRvIHRoZSBzYW1lXG4gICAgfSBlbHNlIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMub3B0aW9uc18uYXV0b3BsYXkgPSBmYWxzZTtcblxuICAgICAgLy8gYW55IG90aGVyIHZhbHVlIChpZSB0cnV0aHkpIHNldHMgYXV0b3BsYXkgdG8gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0ZWNoQXV0b3BsYXkgPSB0ZWNoQXV0b3BsYXkgfHwgdGhpcy5vcHRpb25zXy5hdXRvcGxheTtcblxuICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSB0ZWNoIHRoZW4gd2UgZG8gbm90IHF1ZXVlIHVwXG4gICAgLy8gYSBzZXRBdXRvcGxheSBjYWxsIG9uIHRlY2ggcmVhZHkuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGVcbiAgICAvLyBhdXRvcGxheSBvcHRpb24gd2lsbCBiZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3ZVxuICAgIC8vIGRvIG5vdCBuZWVkIHRvIHNldCBpdCB0d2ljZVxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0QXV0b3BsYXknLCB0ZWNoQXV0b3BsYXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0IG9yIHVuc2V0IHRoZSBwbGF5c2lubGluZSBhdHRyaWJ1dGUuXG4gICAqIFBsYXlzaW5saW5lIHRlbGxzIHRoZSBicm93c2VyIHRoYXQgbm9uLWZ1bGxzY3JlZW4gcGxheWJhY2sgaXMgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCB0cnkgdG8gcGxheSBpbmxpbmUgYnkgZGVmYXVsdFxuICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCB1c2UgdGhlIGJyb3dzZXIncyBkZWZhdWx0IHBsYXliYWNrIG1vZGUsXG4gICAqICAgICAgICAgIHdoaWNoIGluIG1vc3QgY2FzZXMgaXMgaW5saW5lLiBpT1MgU2FmYXJpIGlzIGEgbm90YWJsZSBleGNlcHRpb25cbiAgICogICAgICAgICAgYW5kIHBsYXlzIGZ1bGxzY3JlZW4gYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfFBsYXllcn1cbiAgICogICAgICAgICAtIHRoZSBjdXJyZW50IHZhbHVlIG9mIHBsYXlzaW5saW5lXG4gICAqICAgICAgICAgLSB0aGUgcGxheWVyIHdoZW4gc2V0dGluZ1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyLXZpZGVvLXBsYXlzaW5saW5lfVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGxheXNpbmxpbmUgPSBmdW5jdGlvbiBwbGF5c2lubGluZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UGxheXNpbmxpbmUnLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9wdGlvbnNfLnBsYXlzaW5saW5lID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BsYXlzaW5saW5lJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIGxvb3AgYXR0cmlidXRlIG9uIHRoZSB2aWRlbyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCBsb29wIHRoZSB2aWRlb1xuICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbG9vcCB0aGUgdmlkZW9cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGxvb3Agd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sb29wID0gZnVuY3Rpb24gbG9vcCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TG9vcCcsIHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc18ubG9vcCA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnbG9vcCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwb3N0ZXIgaW1hZ2Ugc291cmNlIHVybFxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3Bvc3RlcmNoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NyY11cbiAgICogICAgICAgIFBvc3RlciBpbWFnZSBzb3VyY2UgVVJMXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBwb3N0ZXIgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wb3N0ZXIgPSBmdW5jdGlvbiBwb3N0ZXIoc3JjKSB7XG4gICAgaWYgKHNyYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0ZXJfO1xuICAgIH1cblxuICAgIC8vIFRoZSBjb3JyZWN0IHdheSB0byByZW1vdmUgYSBwb3N0ZXIgaXMgdG8gc2V0IGFzIGFuIGVtcHR5IHN0cmluZ1xuICAgIC8vIG90aGVyIGZhbHNleSB2YWx1ZXMgd2lsbCB0aHJvdyBlcnJvcnNcbiAgICBpZiAoIXNyYykge1xuICAgICAgc3JjID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHNyYyA9PT0gdGhpcy5wb3N0ZXJfKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBpbnRlcm5hbCBwb3N0ZXIgdmFyaWFibGVcbiAgICB0aGlzLnBvc3Rlcl8gPSBzcmM7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHRlY2gncyBwb3N0ZXJcbiAgICB0aGlzLnRlY2hDYWxsXygnc2V0UG9zdGVyJywgc3JjKTtcblxuICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcblxuICAgIC8vIGFsZXJ0IGNvbXBvbmVudHMgdGhhdCB0aGUgcG9zdGVyIGhhcyBiZWVuIHNldFxuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgcG9zdGVyIGltYWdlIGlzIGNoYW5nZWQgb24gdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjcG9zdGVyY2hhbmdlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncG9zdGVyY2hhbmdlJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvbWUgdGVjaHMgKGUuZy4gWW91VHViZSkgY2FuIHByb3ZpZGUgYSBwb3N0ZXIgc291cmNlIGluIGFuXG4gICAqIGFzeW5jaHJvbm91cyB3YXkuIFdlIHdhbnQgdGhlIHBvc3RlciBjb21wb25lbnQgdG8gdXNlIHRoaXNcbiAgICogcG9zdGVyIHNvdXJjZSBzbyB0aGF0IGl0IGNvdmVycyB1cCB0aGUgdGVjaCdzIGNvbnRyb2xzLlxuICAgKiAoWW91VHViZSdzIHBsYXkgYnV0dG9uKS4gSG93ZXZlciB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXNcbiAgICogc291cmNlIGlmIHRoZSBwbGF5ZXIgdXNlciBoYXNuJ3Qgc2V0IGEgcG9zdGVyIHRocm91Z2hcbiAgICogdGhlIG5vcm1hbCBBUElzLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3Bvc3RlcmNoYW5nZVxuICAgKiBAbGlzdGVucyBUZWNoI3Bvc3RlcmNoYW5nZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpIHtcbiAgICBpZiAoKCF0aGlzLnBvc3Rlcl8gfHwgdGhpcy5vcHRpb25zXy50ZWNoQ2FuT3ZlcnJpZGVQb3N0ZXIpICYmIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy5wb3N0ZXIpIHtcbiAgICAgIHZhciBuZXdQb3N0ZXIgPSB0aGlzLnRlY2hfLnBvc3RlcigpIHx8ICcnO1xuXG4gICAgICBpZiAobmV3UG9zdGVyICE9PSB0aGlzLnBvc3Rlcl8pIHtcbiAgICAgICAgdGhpcy5wb3N0ZXJfID0gbmV3UG9zdGVyO1xuICAgICAgICB0aGlzLmlzUG9zdGVyRnJvbVRlY2hfID0gdHJ1ZTtcblxuICAgICAgICAvLyBMZXQgY29tcG9uZW50cyBrbm93IHRoZSBwb3N0ZXIgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdwb3N0ZXJjaGFuZ2UnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgd2hldGhlciBvciBub3QgdGhlIGNvbnRyb2xzIGFyZSBzaG93aW5nLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2NvbnRyb2xzZW5hYmxlZFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtib29sXVxuICAgKiAgICAgICAgLSB0cnVlIHRvIHR1cm4gY29udHJvbHMgb25cbiAgICogICAgICAgIC0gZmFsc2UgdG8gdHVybiBjb250cm9scyBvZmZcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBjb250cm9scyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmNvbnRyb2xzID0gZnVuY3Rpb24gY29udHJvbHMoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuY29udHJvbHNfO1xuICAgIH1cblxuICAgIGJvb2wgPSAhIWJvb2w7XG5cbiAgICAvLyBEb24ndCB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50IHVubGVzcyBpdCBhY3R1YWxseSBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuY29udHJvbHNfID09PSBib29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sc18gPSBib29sO1xuXG4gICAgaWYgKHRoaXMudXNpbmdOYXRpdmVDb250cm9scygpKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Q29udHJvbHMnLCBib29sKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250cm9sc18pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1kaXNhYmxlZCcpO1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWNvbnRyb2xzLWVuYWJsZWQnKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNjb250cm9sc2VuYWJsZWRcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdjb250cm9sc2VuYWJsZWQnKTtcbiAgICAgIGlmICghdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHtcbiAgICAgICAgdGhpcy5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZGlzYWJsZWQnKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNjb250cm9sc2Rpc2FibGVkXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignY29udHJvbHNkaXNhYmxlZCcpO1xuICAgICAgaWYgKCF0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHMoKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBuYXRpdmUgY29udHJvbHMgb24vb2ZmLiBOYXRpdmUgY29udHJvbHMgYXJlIHRoZSBjb250cm9scyBidWlsdCBpbnRvXG4gICAqIGRldmljZXMgKGUuZy4gZGVmYXVsdCBpUGhvbmUgY29udHJvbHMpLCBGbGFzaCwgb3Igb3RoZXIgdGVjaHNcbiAgICogKGUuZy4gVmltZW8gQ29udHJvbHMpXG4gICAqICoqVGhpcyBzaG91bGQgb25seSBiZSBzZXQgYnkgdGhlIGN1cnJlbnQgdGVjaCwgYmVjYXVzZSBvbmx5IHRoZSB0ZWNoIGtub3dzXG4gICAqIGlmIGl0IGNhbiBzdXBwb3J0IG5hdGl2ZSBjb250cm9scyoqXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjdXNpbmduYXRpdmVjb250cm9sc1xuICAgKiBAZmlyZXMgUGxheWVyI3VzaW5nY3VzdG9tY29udHJvbHNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gdHJ1ZSB0byB0dXJuIG5hdGl2ZSBjb250cm9scyBvblxuICAgKiAgICAgICAgLSBmYWxzZSB0byB0dXJuIG5hdGl2ZSBjb250cm9scyBvZmZcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBuYXRpdmUgY29udHJvbHMgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS51c2luZ05hdGl2ZUNvbnRyb2xzID0gZnVuY3Rpb24gdXNpbmdOYXRpdmVDb250cm9scyhib29sKSB7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICEhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXztcbiAgICB9XG5cbiAgICBib29sID0gISFib29sO1xuXG4gICAgLy8gRG9uJ3QgdHJpZ2dlciBhIGNoYW5nZSBldmVudCB1bmxlc3MgaXQgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGlmICh0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHNfID09PSBib29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXyA9IGJvb2w7XG5cbiAgICBpZiAodGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scycpO1xuXG4gICAgICAvKipcbiAgICAgICAqIHBsYXllciBpcyB1c2luZyB0aGUgbmF0aXZlIGRldmljZSBjb250cm9sc1xuICAgICAgICpcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNpbmduYXRpdmVjb250cm9sc1xuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VzaW5nbmF0aXZlY29udHJvbHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scycpO1xuXG4gICAgICAvKipcbiAgICAgICAqIHBsYXllciBpcyB1c2luZyB0aGUgY3VzdG9tIEhUTUwgY29udHJvbHNcbiAgICAgICAqXG4gICAgICAgKiBAZXZlbnQgUGxheWVyI3VzaW5nY3VzdG9tY29udHJvbHNcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCd1c2luZ2N1c3RvbWNvbnRyb2xzJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgb3IgZ2V0IHRoZSBjdXJyZW50IE1lZGlhRXJyb3JcbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNlcnJvclxuICAgKlxuICAgKiBAcGFyYW0gIHtNZWRpYUVycm9yfHN0cmluZ3xudW1iZXJ9IFtlcnJdXG4gICAqICAgICAgICAgQSBNZWRpYUVycm9yIG9yIGEgc3RyaW5nL251bWJlciB0byBiZSB0dXJuZWRcbiAgICogICAgICAgICBpbnRvIGEgTWVkaWFFcnJvclxuICAgKlxuICAgKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgTWVkaWFFcnJvciB3aGVuIGdldHRpbmcgKG9yIG51bGwpXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGVycikge1xuICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JfIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yaW5nIHRvIGRlZmF1bHRcbiAgICBpZiAoZXJyID09PSBudWxsKSB7XG4gICAgICB0aGlzLmVycm9yXyA9IGVycjtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lcnJvcicpO1xuICAgICAgaWYgKHRoaXMuZXJyb3JEaXNwbGF5KSB7XG4gICAgICAgIHRoaXMuZXJyb3JEaXNwbGF5LmNsb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvcl8gPSBuZXcgTWVkaWFFcnJvcihlcnIpO1xuXG4gICAgLy8gYWRkIHRoZSB2anMtZXJyb3IgY2xhc3NuYW1lIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtZXJyb3InKTtcblxuICAgIC8vIGxvZyB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgdHlwZSBhbmQgYW55IG1lc3NhZ2VcbiAgICAvLyBpZTgganVzdCBsb2dzIFwiW29iamVjdCBvYmplY3RdXCIgaWYgeW91IGp1c3QgbG9nIHRoZSBlcnJvciBvYmplY3RcbiAgICBsb2ckMS5lcnJvcignKENPREU6JyArIHRoaXMuZXJyb3JfLmNvZGUgKyAnICcgKyBNZWRpYUVycm9yLmVycm9yVHlwZXNbdGhpcy5lcnJvcl8uY29kZV0gKyAnKScsIHRoaXMuZXJyb3JfLm1lc3NhZ2UsIHRoaXMuZXJyb3JfKTtcblxuICAgIC8qKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZXJyb3JcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlcnJvcicpO1xuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgdXNlciBhY3Rpdml0eVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IG9iamVjdFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucmVwb3J0VXNlckFjdGl2aXR5ID0gZnVuY3Rpb24gcmVwb3J0VXNlckFjdGl2aXR5KGV2ZW50KSB7XG4gICAgdGhpcy51c2VyQWN0aXZpdHlfID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCBpZiB1c2VyIGlzIGFjdGl2ZVxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3VzZXJhY3RpdmVcbiAgICogQGZpcmVzIFBsYXllciN1c2VyaW5hY3RpdmVcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gdHJ1ZSBpZiB0aGUgdXNlciBpcyBhY3RpdmVcbiAgICogICAgICAgIC0gZmFsc2UgaWYgdGhlIHVzZXIgaXMgaW5hY3RpdmVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiB1c2VyQWN0aXZlIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudXNlckFjdGl2ZSA9IGZ1bmN0aW9uIHVzZXJBY3RpdmUoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnVzZXJBY3RpdmVfO1xuICAgIH1cblxuICAgIGJvb2wgPSAhIWJvb2w7XG5cbiAgICBpZiAoYm9vbCA9PT0gdGhpcy51c2VyQWN0aXZlXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXNlckFjdGl2ZV8gPSBib29sO1xuXG4gICAgaWYgKHRoaXMudXNlckFjdGl2ZV8pIHtcbiAgICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IHRydWU7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdXNlci1pbmFjdGl2ZScpO1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzZXItYWN0aXZlJyk7XG4gICAgICAvKipcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNlcmFjdGl2ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VzZXJhY3RpdmUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaHJvbWUvU2FmYXJpL0lFIGhhdmUgYnVncyB3aGVyZSB3aGVuIHlvdSBjaGFuZ2UgdGhlIGN1cnNvciBpdCBjYW5cbiAgICAvLyB0cmlnZ2VyIGEgbW91c2Vtb3ZlIGV2ZW50LiBUaGlzIGNhdXNlcyBhbiBpc3N1ZSB3aGVuIHlvdSdyZSBoaWRpbmdcbiAgICAvLyB0aGUgY3Vyc29yIHdoZW4gdGhlIHVzZXIgaXMgaW5hY3RpdmUsIGFuZCBhIG1vdXNlbW92ZSBzaWduYWxzIHVzZXJcbiAgICAvLyBhY3Rpdml0eS4gTWFraW5nIGl0IGltcG9zc2libGUgdG8gZ28gaW50byBpbmFjdGl2ZSBtb2RlLiBTcGVjaWZpY2FsbHlcbiAgICAvLyB0aGlzIGhhcHBlbnMgaW4gZnVsbHNjcmVlbiB3aGVuIHdlIHJlYWxseSBuZWVkIHRvIGhpZGUgdGhlIGN1cnNvci5cbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBnZXRzIHJlc29sdmVkIGluIEFMTCBicm93c2VycyBpdCBjYW4gYmUgcmVtb3ZlZFxuICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDMwNDFcbiAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgdGhpcy50ZWNoXy5vbmUoJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy11c2VyLWFjdGl2ZScpO1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy11c2VyLWluYWN0aXZlJyk7XG4gICAgLyoqXG4gICAgICogQGV2ZW50IFBsYXllciN1c2VyaW5hY3RpdmVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCd1c2VyaW5hY3RpdmUnKTtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciB1c2VyIGFjdGl2aXR5IGJhc2VkIG9uIHRpbWVvdXQgdmFsdWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8gPSBmdW5jdGlvbiBsaXN0ZW5Gb3JVc2VyQWN0aXZpdHlfKCkge1xuICAgIHZhciBtb3VzZUluUHJvZ3Jlc3MgPSB2b2lkIDA7XG4gICAgdmFyIGxhc3RNb3ZlWCA9IHZvaWQgMDtcbiAgICB2YXIgbGFzdE1vdmVZID0gdm9pZCAwO1xuICAgIHZhciBoYW5kbGVBY3Rpdml0eSA9IGJpbmQodGhpcywgdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkpO1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShlKSB7XG4gICAgICAvLyAjMTA2OCAtIFByZXZlbnQgbW91c2Vtb3ZlIHNwYW1taW5nXG4gICAgICAvLyBDaHJvbWUgQnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY2OTcwXG4gICAgICBpZiAoZS5zY3JlZW5YICE9PSBsYXN0TW92ZVggfHwgZS5zY3JlZW5ZICE9PSBsYXN0TW92ZVkpIHtcbiAgICAgICAgbGFzdE1vdmVYID0gZS5zY3JlZW5YO1xuICAgICAgICBsYXN0TW92ZVkgPSBlLnNjcmVlblk7XG4gICAgICAgIGhhbmRsZUFjdGl2aXR5KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oKSB7XG4gICAgICBoYW5kbGVBY3Rpdml0eSgpO1xuICAgICAgLy8gRm9yIGFzIGxvbmcgYXMgdGhlIHRoZXkgYXJlIHRvdWNoaW5nIHRoZSBkZXZpY2Ugb3IgaGF2ZSB0aGVpciBtb3VzZSBkb3duLFxuICAgICAgLy8gd2UgY29uc2lkZXIgdGhlbSBhY3RpdmUgZXZlbiBpZiB0aGV5J3JlIG5vdCBtb3ZpbmcgdGhlaXIgZmluZ2VyIG9yIG1vdXNlLlxuICAgICAgLy8gU28gd2Ugd2FudCB0byBjb250aW51ZSB0byB1cGRhdGUgdGhhdCB0aGV5IGFyZSBhY3RpdmVcbiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpO1xuICAgICAgLy8gU2V0dGluZyB1c2VyQWN0aXZpdHk9dHJ1ZSBub3cgYW5kIHNldHRpbmcgdGhlIGludGVydmFsIHRvIHRoZSBzYW1lIHRpbWVcbiAgICAgIC8vIGFzIHRoZSBhY3Rpdml0eUNoZWNrIGludGVydmFsICgyNTApIHNob3VsZCBlbnN1cmUgd2UgbmV2ZXIgbWlzcyB0aGVcbiAgICAgIC8vIG5leHQgYWN0aXZpdHlDaGVja1xuICAgICAgbW91c2VJblByb2dyZXNzID0gdGhpcy5zZXRJbnRlcnZhbChoYW5kbGVBY3Rpdml0eSwgMjUwKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2ZW50KSB7XG4gICAgICBoYW5kbGVBY3Rpdml0eSgpO1xuICAgICAgLy8gU3RvcCB0aGUgaW50ZXJ2YWwgdGhhdCBtYWludGFpbnMgYWN0aXZpdHkgaWYgdGhlIG1vdXNlL3RvdWNoIGlzIGRvd25cbiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpO1xuICAgIH07XG5cbiAgICAvLyBBbnkgbW91c2UgbW92ZW1lbnQgd2lsbCBiZSBjb25zaWRlcmVkIHVzZXIgYWN0aXZpdHlcbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCBoYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vbignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgLy8gU2hvdWxkbid0IG5lZWQgdG8gdXNlIGluUHJvZ3Jlc3MgaW50ZXJ2YWwgYmVjYXVzZSBvZiBrZXkgcmVwZWF0XG4gICAgdGhpcy5vbigna2V5ZG93bicsIGhhbmRsZUFjdGl2aXR5KTtcbiAgICB0aGlzLm9uKCdrZXl1cCcsIGhhbmRsZUFjdGl2aXR5KTtcblxuICAgIC8vIFJ1biBhbiBpbnRlcnZhbCBldmVyeSAyNTAgbWlsbGlzZWNvbmRzIGluc3RlYWQgb2Ygc3R1ZmZpbmcgZXZlcnl0aGluZyBpbnRvXG4gICAgLy8gdGhlIG1vdXNlbW92ZS90b3VjaG1vdmUgZnVuY3Rpb24gaXRzZWxmLCB0byBwcmV2ZW50IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgIC8vIGB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eWAgc2ltcGx5IHNldHMgdGhpcy51c2VyQWN0aXZpdHlfIHRvIHRydWUsIHdoaWNoXG4gICAgLy8gdGhlbiBnZXRzIHBpY2tlZCB1cCBieSB0aGlzIGxvb3BcbiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvbGVhcm5pbmctZnJvbS10d2l0dGVyL1xuICAgIHZhciBpbmFjdGl2aXR5VGltZW91dCA9IHZvaWQgMDtcblxuICAgIHRoaXMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG1vdXNlL3RvdWNoIGFjdGl2aXR5IGhhcyBoYXBwZW5lZFxuICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCB0aGUgYWN0aXZpdHkgdHJhY2tlclxuICAgICAgdGhpcy51c2VyQWN0aXZpdHlfID0gZmFsc2U7XG5cbiAgICAgIC8vIElmIHRoZSB1c2VyIHN0YXRlIHdhcyBpbmFjdGl2ZSwgc2V0IHRoZSBzdGF0ZSB0byBhY3RpdmVcbiAgICAgIHRoaXMudXNlckFjdGl2ZSh0cnVlKTtcblxuICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGluYWN0aXZpdHkgdGltZW91dCB0byBzdGFydCB0aGUgdGltZXIgb3ZlclxuICAgICAgdGhpcy5jbGVhclRpbWVvdXQoaW5hY3Rpdml0eVRpbWVvdXQpO1xuXG4gICAgICB2YXIgdGltZW91dCA9IHRoaXMub3B0aW9uc18uaW5hY3Rpdml0eVRpbWVvdXQ7XG5cbiAgICAgIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiA8dGltZW91dD4gbWlsbGlzZWNvbmRzLCBpZiBubyBtb3JlIGFjdGl2aXR5IGhhcyBvY2N1cnJlZCB0aGVcbiAgICAgIC8vIHVzZXIgd2lsbCBiZSBjb25zaWRlcmVkIGluYWN0aXZlXG4gICAgICBpbmFjdGl2aXR5VGltZW91dCA9IHRoaXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSB0aGUgaW5hY3Rpdml0eVRpbWVvdXQgY2FuIHRyaWdnZXIganVzdFxuICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgdXNlciBhY3Rpdml0eSBpcyBwaWNrZWQgdXAgYnkgdGhlIGFjdGl2aXR5IGNoZWNrIGxvb3BcbiAgICAgICAgLy8gY2F1c2luZyBhIGZsaWNrZXJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHtcbiAgICAgICAgICB0aGlzLnVzZXJBY3RpdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9LCAyNTApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS4gQSBwbGF5YmFjayByYXRlIG9mXG4gICAqIDEuMCByZXByZXNlbnRzIG5vcm1hbCBzcGVlZCBhbmQgMC41IHdvdWxkIGluZGljYXRlIGhhbGYtc3BlZWRcbiAgICogcGxheWJhY2ssIGZvciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhdGVdXG4gICAqICAgICAgIE5ldyBwbGF5YmFjayByYXRlIHRvIHNldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUgd2hlbiBnZXR0aW5nIG9yIDEuMFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGxheWJhY2tSYXRlID0gZnVuY3Rpb24gcGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBOT1RFOiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlIGlzIHNldCBmcm9tIHRoZSB0ZWNoIGhhbmRsZXJcbiAgICAgIC8vIHRoYXQgaXMgcmVnaXN0ZXJlZCBhYm92ZVxuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlY2hfICYmIHRoaXMudGVjaF8uZmVhdHVyZXNQbGF5YmFja1JhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlIHx8IHRoaXMudGVjaEdldF8oJ3BsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICByZXR1cm4gMS4wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBwbGF5YmFjayByYXRlLiBBIGRlZmF1bHQgcGxheWJhY2sgcmF0ZSBvZlxuICAgKiAxLjAgcmVwcmVzZW50cyBub3JtYWwgc3BlZWQgYW5kIDAuNSB3b3VsZCBpbmRpY2F0ZSBoYWxmLXNwZWVkIHBsYXliYWNrLCBmb3IgaW5zdGFuY2UuXG4gICAqIGRlZmF1bHRQbGF5YmFja1JhdGUgd2lsbCBvbmx5IHJlcHJlc2VudCB3aGF0IHRoZSBpbnRpYWwgcGxheWJhY2tSYXRlIG9mIGEgdmlkZW8gd2FzLCBub3RcbiAgICogbm90IHRoZSBjdXJyZW50IHBsYXliYWNrUmF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRwbGF5YmFja3JhdGVcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYXRlXVxuICAgKiAgICAgICBOZXcgZGVmYXVsdCBwbGF5YmFjayByYXRlIHRvIHNldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfFBsYXllcn1cbiAgICogICAgICAgICAtIFRoZSBkZWZhdWx0IHBsYXliYWNrIHJhdGUgd2hlbiBnZXR0aW5nIG9yIDEuMFxuICAgKiAgICAgICAgIC0gdGhlIHBsYXllciB3aGVuIHNldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmRlZmF1bHRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbiBkZWZhdWx0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3NldERlZmF1bHRQbGF5YmFja1JhdGUnLCByYXRlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmZlYXR1cmVzUGxheWJhY2tSYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZGVmYXVsdFBsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICByZXR1cm4gMS4wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGF1ZGlvIGZsYWdcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBib29sXG4gICAqICAgICAgICAtIHRydWUgc2lnbmFscyB0aGF0IHRoaXMgaXMgYW4gYXVkaW8gcGxheWVyXG4gICAqICAgICAgICAtIGZhbHNlIHNpZ25hbHMgdGhhdCB0aGlzIGlzIG5vdCBhbiBhdWRpbyBwbGF5ZXJcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBpc0F1ZGlvIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaXNBdWRpbyA9IGZ1bmN0aW9uIGlzQXVkaW8oYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNBdWRpb18gPSAhIWJvb2w7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuICEhdGhpcy5pc0F1ZGlvXztcbiAgfTtcblxuICAvKipcbiAgICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYSB7QGxpbmsgVGV4dFRyYWNrfSB0byBvdXJcbiAgICoge0BsaW5rIFRleHRUcmFja0xpc3R9LlxuICAgKlxuICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgVzNDIHNldHRpbmdzIHdlIGFsbG93IGFkZGluZyBhZGRpdGlvbmFsIGluZm8gdGhyb3VnaCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1hZGR0ZXh0dHJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtraW5kXVxuICAgKiAgICAgICAgdGhlIGtpbmQgb2YgVGV4dFRyYWNrIHlvdSBhcmUgYWRkaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gICAqICAgICAgICB0aGUgbGFiZWwgdG8gZ2l2ZSB0aGUgVGV4dFRyYWNrIGxhYmVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2VdXG4gICAqICAgICAgICB0aGUgbGFuZ3VhZ2UgdG8gc2V0IG9uIHRoZSBUZXh0VHJhY2tcbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrfHVuZGVmaW5lZH1cbiAgICogICAgICAgICB0aGUgVGV4dFRyYWNrIHRoYXQgd2FzIGFkZGVkIG9yIHVuZGVmaW5lZFxuICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIHRlY2hcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmFkZFRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFRleHRUcmFjayhraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgcmV0dXJuIHRoaXMudGVjaF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZW1vdGUge0BsaW5rIFRleHRUcmFja30gYW5kIGFuIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fS4gSXQgd2lsbFxuICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuZXZlciB0aGUgc291cmNlIGNoYW5nZXMsIHVubGVzc1xuICAgKiBtYW51YWxDbGVhbnVwIGlzIHNldCB0byBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIE9wdGlvbnMgdG8gcGFzcyB0byB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0gZHVyaW5nIGNyZWF0aW9uLiBTZWVcbiAgICogICAgICAgIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fSBmb3Igb2JqZWN0IHByb3BlcnRpZXMgdGhhdCB5b3Ugc2hvdWxkIHVzZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbWFudWFsQ2xlYW51cD10cnVlXSBpZiBzZXQgdG8gZmFsc2UsIHRoZSBUZXh0VHJhY2sgd2lsbCBiZVxuICAgKlxuICAgKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50fVxuICAgKiAgICAgICAgIHRoZSBIVE1MVHJhY2tFbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQgYW5kIGFkZGVkXG4gICAqICAgICAgICAgdG8gdGhlIEh0bWxUcmFja0VsZW1lbnRMaXN0IGFuZCB0aGUgcmVtb3RlXG4gICAqICAgICAgICAgVGV4dFRyYWNrTGlzdFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgXCJtYW51YWxDbGVhbnVwXCIgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdFxuICAgKiAgICAgICAgICAgICB0byBcImZhbHNlXCIgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgVmlkZW8uanNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmFkZFJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zLCBtYW51YWxDbGVhbnVwKSB7XG4gICAgaWYgKHRoaXMudGVjaF8pIHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfLmFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zLCBtYW51YWxDbGVhbnVwKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBmcm9tIHRoZSByZXNwZWN0aXZlXG4gICAqIHtAbGluayBUZXh0VHJhY2tMaXN0fSBhbmQge0BsaW5rIEh0bWxUcmFja0VsZW1lbnRMaXN0fS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRyYWNrXG4gICAqICAgICAgICBSZW1vdGUge0BsaW5rIFRleHRUcmFja30gdG8gcmVtb3ZlXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICogICAgICAgICBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRleHRUcmFjaygpIHtcbiAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBfcmVmMyR0cmFjayA9IF9yZWYzLnRyYWNrLFxuICAgICAgICB0cmFjayA9IF9yZWYzJHRyYWNrID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBfcmVmMyR0cmFjaztcblxuICAgIC8vIGRlc3RydWN0dXJlIHRoZSBpbnB1dCBpbnRvIGFuIG9iamVjdCB3aXRoIGEgdHJhY2sgYXJndW1lbnQsIGRlZmF1bHRpbmcgdG8gYXJndW1lbnRzWzBdXG4gICAgLy8gZGVmYXVsdCB0aGUgd2hvbGUgYXJndW1lbnQgdG8gYW4gZW1wdHkgb2JqZWN0IGlmIG5vdGhpbmcgd2FzIHBhc3NlZCBpblxuXG4gICAgaWYgKHRoaXMudGVjaF8pIHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfLnJlbW92ZVJlbW90ZVRleHRUcmFjayh0cmFjayk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGF2YWlsYWJsZSBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBXM0MncyBNZWRpYVxuICAgKiBQbGF5YmFjayBRdWFsaXR5IEFQSS5cbiAgICpcbiAgICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9tZWRpYS1wbGF5YmFjay1xdWFsaXR5fVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIEFuIG9iamVjdCB3aXRoIHN1cHBvcnRlZCBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3Mgb3IgdW5kZWZpbmVkIGlmIHRoZXJlXG4gICAqICAgICAgICAgaXMgbm8gdGVjaCBvciB0aGUgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPSBmdW5jdGlvbiBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHknKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHZpZGVvIHdpZHRoXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBjdXJyZW50IHZpZGVvIHdpZHRoXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS52aWRlb1dpZHRoID0gZnVuY3Rpb24gdmlkZW9XaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLnZpZGVvV2lkdGggJiYgdGhpcy50ZWNoXy52aWRlb1dpZHRoKCkgfHwgMDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHZpZGVvIGhlaWdodFxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgY3VycmVudCB2aWRlbyBoZWlnaHRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnZpZGVvSGVpZ2h0ID0gZnVuY3Rpb24gdmlkZW9IZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy52aWRlb0hlaWdodCAmJiB0aGlzLnRlY2hfLnZpZGVvSGVpZ2h0KCkgfHwgMDtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGxhbmd1YWdlIGNvZGVcbiAgICogTk9URTogVGhlIGxhbmd1YWdlIHNob3VsZCBiZSBzZXQgaW4gdGhlIHBsYXllciBvcHRpb25zIGlmIHlvdSB3YW50IHRoZVxuICAgKiB0aGUgY29udHJvbHMgdG8gYmUgYnVpbHQgd2l0aCBhIHNwZWNpZmljIGxhbmd1YWdlLiBDaGFuZ2luZyB0aGUgbGFudWdhZ2VcbiAgICogbGF0ZXIgd2lsbCBub3QgdXBkYXRlIGNvbnRyb2xzIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV1cbiAgICogICAgICAgIHRoZSBsYW5ndWFnZSBjb2RlIHRvIHNldCB0aGUgcGxheWVyIHRvXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgY3VycmVudCBsYW5ndWFnZSBjb2RlIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUubGFuZ3VhZ2UgPSBmdW5jdGlvbiBsYW5ndWFnZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VfO1xuICAgIH1cblxuICAgIHRoaXMubGFuZ3VhZ2VfID0gU3RyaW5nKGNvZGUpLnRvTG93ZXJDYXNlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGxheWVyJ3MgbGFuZ3VhZ2UgZGljdGlvbmFyeVxuICAgKiBNZXJnZSBldmVyeSB0aW1lLCBiZWNhdXNlIGEgbmV3bHkgYWRkZWQgcGx1Z2luIG1pZ2h0IGNhbGwgdmlkZW9qcy5hZGRMYW5ndWFnZSgpIGF0IGFueSB0aW1lXG4gICAqIExhbmd1YWdlcyBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlIHBsYXllciBvcHRpb25zIGhhdmUgcHJlY2VkZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICogICAgICAgICBBbiBhcnJheSBvZiBvZiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sYW5ndWFnZXMgPSBmdW5jdGlvbiBsYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIG1lcmdlT3B0aW9ucyhQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfLmxhbmd1YWdlcywgdGhpcy5sYW5ndWFnZXNfKTtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHJlcGVyZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHJhY2tcbiAgICogaW5mb3JtYXRpb24uICoqRE9FUyBub3QgcmV0dXJuIGl0IGFzIEpTT04qKlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBvZiB0cmFjayBpbmZvXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXyk7XG4gICAgdmFyIHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzO1xuXG4gICAgb3B0aW9ucy50cmFja3MgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIC8vIGRlZXAgbWVyZ2UgdHJhY2tzIGFuZCBudWxsIG91dCBwbGF5ZXIgc28gbm8gY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgICAgdHJhY2sgPSBtZXJnZU9wdGlvbnModHJhY2spO1xuICAgICAgdHJhY2sucGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgb3B0aW9ucy50cmFja3NbaV0gPSB0cmFjaztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpbXBsZSBtb2RhbCBkaWFsb2cgKGFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTW9kYWxEaWFsb2d9XG4gICAqIGNvbXBvbmVudCkgdGhhdCBpbW1lZGlhdGVseSBvdmVybGF5cyB0aGUgcGxheWVyIHdpdGggYXJiaXRyYXJ5XG4gICAqIGNvbnRlbnQgYW5kIHJlbW92ZXMgaXRzZWxmIHdoZW4gY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbnxFbGVtZW50fEFycmF5fG51bGx9IGNvbnRlbnRcbiAgICogICAgICAgIFNhbWUgYXMge0BsaW5rIE1vZGFsRGlhbG9nI2NvbnRlbnR9J3MgcGFyYW0gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICogICAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0LWZvcndhcmQgdXNhZ2UgaXMgdG8gcHJvdmlkZSBhIHN0cmluZyBvciBET01cbiAgICogICAgICAgIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIEV4dHJhIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIHtAbGluayBNb2RhbERpYWxvZ30uXG4gICAqXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKiAgICAgICAgIHRoZSB7QGxpbmsgTW9kYWxEaWFsb2d9IHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmNyZWF0ZU1vZGFsID0gZnVuY3Rpb24gY3JlYXRlTW9kYWwoY29udGVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpczEyID0gdGhpcztcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQgfHwgJyc7XG5cbiAgICB2YXIgbW9kYWwgPSBuZXcgTW9kYWxEaWFsb2codGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmFkZENoaWxkKG1vZGFsKTtcbiAgICBtb2RhbC5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMTIucmVtb3ZlQ2hpbGQobW9kYWwpO1xuICAgIH0pO1xuXG4gICAgbW9kYWwub3BlbigpO1xuICAgIHJldHVybiBtb2RhbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0YWcgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWdcbiAgICogICAgICAgIFRoZSBwbGF5ZXIgdGFnXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHNldHRpbmdzXG4gICAqICAgICAgICAgZm9yIGEgcGxheWVyIHRhZ1xuICAgKi9cblxuXG4gIFBsYXllci5nZXRUYWdTZXR0aW5ncyA9IGZ1bmN0aW9uIGdldFRhZ1NldHRpbmdzKHRhZykge1xuICAgIHZhciBiYXNlT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZXM6IFtdLFxuICAgICAgdHJhY2tzOiBbXVxuICAgIH07XG5cbiAgICB2YXIgdGFnT3B0aW9ucyA9IGdldEF0dHJpYnV0ZXModGFnKTtcbiAgICB2YXIgZGF0YVNldHVwID0gdGFnT3B0aW9uc1snZGF0YS1zZXR1cCddO1xuXG4gICAgaWYgKGhhc0NsYXNzKHRhZywgJ3Zqcy1mbHVpZCcpKSB7XG4gICAgICB0YWdPcHRpb25zLmZsdWlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkYXRhLXNldHVwIGF0dHIgZXhpc3RzLlxuICAgIGlmIChkYXRhU2V0dXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFBhcnNlIG9wdGlvbnMgSlNPTlxuICAgICAgLy8gSWYgZW1wdHkgc3RyaW5nLCBtYWtlIGl0IGEgcGFyc2FibGUganNvbiBvYmplY3QuXG4gICAgICB2YXIgX3NhZmVQYXJzZVR1cGxlID0gc2FmZVBhcnNlVHVwbGUoZGF0YVNldHVwIHx8ICd7fScpLFxuICAgICAgICAgIGVyciA9IF9zYWZlUGFyc2VUdXBsZVswXSxcbiAgICAgICAgICBkYXRhID0gX3NhZmVQYXJzZVR1cGxlWzFdO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGxvZyQxLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgICBhc3NpZ24odGFnT3B0aW9ucywgZGF0YSk7XG4gICAgfVxuXG4gICAgYXNzaWduKGJhc2VPcHRpb25zLCB0YWdPcHRpb25zKTtcblxuICAgIC8vIEdldCB0YWcgY2hpbGRyZW4gc2V0dGluZ3NcbiAgICBpZiAodGFnLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGFnLmNoaWxkTm9kZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBDaGFuZ2UgY2FzZSBuZWVkZWQ6IGh0dHA6Ly9lam9obi5vcmcvYmxvZy9ub2RlbmFtZS1jYXNlLXNlbnNpdGl2aXR5L1xuICAgICAgICB2YXIgY2hpbGROYW1lID0gY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoY2hpbGROYW1lID09PSAnc291cmNlJykge1xuICAgICAgICAgIGJhc2VPcHRpb25zLnNvdXJjZXMucHVzaChnZXRBdHRyaWJ1dGVzKGNoaWxkKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGROYW1lID09PSAndHJhY2snKSB7XG4gICAgICAgICAgYmFzZU9wdGlvbnMudHJhY2tzLnB1c2goZ2V0QXR0cmlidXRlcyhjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2V0aGVyIG9yIG5vdCBmbGV4Ym94IGlzIHN1cHBvcnRlZFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIC0gdHJ1ZSBpZiBmbGV4Ym94IGlzIHN1cHBvcnRlZFxuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZmxleGJveCBpcyBub3Qgc3VwcG9ydGVkXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5mbGV4Tm90U3VwcG9ydGVkXyA9IGZ1bmN0aW9uIGZsZXhOb3RTdXBwb3J0ZWRfKCkge1xuICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuXG4gICAgLy8gTm90ZTogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIGZsZXhCYXNpcyAob3IgZmxleE9yZGVyKSwgYnV0IGl0J3Mgb25lIG9mIHRoZSBtb3JlXG4gICAgLy8gY29tbW9uIGZsZXggZmVhdHVyZXMgdGhhdCB3ZSBjYW4gcmVseSBvbiB3aGVuIGNoZWNraW5nIGZvciBmbGV4IHN1cHBvcnQuXG4gICAgcmV0dXJuICEoJ2ZsZXhCYXNpcycgaW4gZWxlbS5zdHlsZSB8fCAnd2Via2l0RmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8ICdtb3pGbGV4QmFzaXMnIGluIGVsZW0uc3R5bGUgfHwgJ21zRmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8XG4gICAgLy8gSUUxMC1zcGVjaWZpYyAoMjAxMiBmbGV4IHNwZWMpXG4gICAgJ21zRmxleE9yZGVyJyBpbiBlbGVtLnN0eWxlKTtcbiAgfTtcblxuICByZXR1cm4gUGxheWVyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0XG4gKlxuICogQHJldHVybiB7VmlkZW9UcmFja0xpc3R9XG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHZpZGVvIHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudmlkZW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0fVxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0XG4gKlxuICogQHJldHVybiB7QXVkaW9UcmFja0xpc3R9XG4gKiAgICAgICAgIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUuYXVkaW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQGxpbmsgaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy9kcmFmdHMvaHRtbC9tYXN0ZXIvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXRleHR0cmFja3NcbiAqXG4gKiBAcmV0dXJuIHtUZXh0VHJhY2tMaXN0fVxuICogICAgICAgICB0aGUgY3VycmVudCB0ZXh0IHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudGV4dFRyYWNrc1xuICovXG5cbi8qKlxuICogR2V0IHRoZSByZW1vdGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybiB7VGV4dFRyYWNrTGlzdH1cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgcmVtb3RlIHRleHQgdHJhY2sgbGlzdFxuICpcbiAqIEBtZXRob2QgUGxheWVyLnByb3RvdHlwZS5yZW1vdGVUZXh0VHJhY2tzXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIHJlbW90ZSB7QGxpbmsgSHRtbFRyYWNrRWxlbWVudExpc3R9IHRyYWNrcy5cbiAqXG4gKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50TGlzdH1cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgcmVtb3RlIHRleHQgdHJhY2sgZWxlbWVudCBsaXN0XG4gKlxuICogQG1ldGhvZCBQbGF5ZXIucHJvdG90eXBlLnJlbW90ZVRleHRUcmFja0Vsc1xuICovXG5cbkFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gIHZhciBwcm9wcyA9IEFMTFtuYW1lJCQxXTtcblxuICBQbGF5ZXIucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoX1twcm9wcy5nZXR0ZXJOYW1lXSgpO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbm90IHlldCBsb2FkVGVjaF8sIHdlIGNyZWF0ZSB7dmlkZW8sYXVkaW8sdGV4dH1UcmFja3NfXG4gICAgLy8gdGhlc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlY2ggZHVyaW5nIGxvYWRpbmdcbiAgICB0aGlzW3Byb3BzLnByaXZhdGVOYW1lXSA9IHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdIHx8IG5ldyBwcm9wcy5MaXN0Q2xhc3MoKTtcbiAgICByZXR1cm4gdGhpc1twcm9wcy5wcml2YXRlTmFtZV07XG4gIH07XG59KTtcblxuLyoqXG4gKiBHbG9iYWwgcGxheWVyIGxpc3RcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5QbGF5ZXIucGxheWVycyA9IHt9O1xuXG52YXIgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcblxuLypcbiAqIFBsYXllciBpbnN0YW5jZSBvcHRpb25zLCBzdXJmYWNlZCB1c2luZyBvcHRpb25zXG4gKiBvcHRpb25zID0gUGxheWVyLnByb3RvdHlwZS5vcHRpb25zX1xuICogTWFrZSBjaGFuZ2VzIGluIG9wdGlvbnMsIG5vdCBoZXJlLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5QbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICAvLyBEZWZhdWx0IG9yZGVyIG9mIGZhbGxiYWNrIHRlY2hub2xvZ3lcbiAgdGVjaE9yZGVyOiBUZWNoLmRlZmF1bHRUZWNoT3JkZXJfLFxuXG4gIGh0bWw1OiB7fSxcbiAgZmxhc2g6IHt9LFxuXG4gIC8vIGRlZmF1bHQgaW5hY3Rpdml0eSB0aW1lb3V0XG4gIGluYWN0aXZpdHlUaW1lb3V0OiAyMDAwLFxuXG4gIC8vIGRlZmF1bHQgcGxheWJhY2sgcmF0ZXNcbiAgcGxheWJhY2tSYXRlczogW10sXG4gIC8vIEFkZCBwbGF5YmFjayByYXRlIHNlbGVjdGlvbiBieSBhZGRpbmcgcmF0ZXNcbiAgLy8gJ3BsYXliYWNrUmF0ZXMnOiBbMC41LCAxLCAxLjUsIDJdLFxuXG4gIC8vIEluY2x1ZGVkIGNvbnRyb2wgc2V0c1xuICBjaGlsZHJlbjogWydtZWRpYUxvYWRlcicsICdwb3N0ZXJJbWFnZScsICd0ZXh0VHJhY2tEaXNwbGF5JywgJ2xvYWRpbmdTcGlubmVyJywgJ2JpZ1BsYXlCdXR0b24nLCAnY29udHJvbEJhcicsICdlcnJvckRpc3BsYXknLCAndGV4dFRyYWNrU2V0dGluZ3MnXSxcblxuICBsYW5ndWFnZTogbmF2aWdhdG9yICYmIChuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UpIHx8ICdlbicsXG5cbiAgLy8gbG9jYWxlcyBhbmQgdGhlaXIgbGFuZ3VhZ2UgdHJhbnNsYXRpb25zXG4gIGxhbmd1YWdlczoge30sXG5cbiAgLy8gRGVmYXVsdCBtZXNzYWdlIHRvIHNob3cgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuXG4gIG5vdFN1cHBvcnRlZE1lc3NhZ2U6ICdObyBjb21wYXRpYmxlIHNvdXJjZSB3YXMgZm91bmQgZm9yIHRoaXMgbWVkaWEuJ1xufTtcblxuaWYgKCFJU19JRTgpIHtcbiAgUGxheWVyLnByb3RvdHlwZS5vcHRpb25zXy5jaGlsZHJlbi5wdXNoKCdyZXNpemVNYW5hZ2VyJyk7XG59XG5cbltcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSBcImVuZGVkXCIgc3RhdGUuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGxheWVyIGlzIGluIHRoZSBlbmRlZCBzdGF0ZSwgZmFsc2UgaWYgbm90LlxuICogQG1ldGhvZCBQbGF5ZXIjZW5kZWRcbiAqL1xuJ2VuZGVkJyxcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSBcInNlZWtpbmdcIiBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBwbGF5ZXIgaXMgaW4gdGhlIHNlZWtpbmcgc3RhdGUsIGZhbHNlIGlmIG5vdC5cbiAqIEBtZXRob2QgUGxheWVyI3NlZWtpbmdcbiAqL1xuJ3NlZWtpbmcnLFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBUaW1lUmFuZ2VzIG9mIHRoZSBtZWRpYSB0aGF0IGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlXG4gKiBmb3Igc2Vla2luZyB0by5cbiAqXG4gKiBAcmV0dXJuIHtUaW1lUmFuZ2VzfSB0aGUgc2Vla2FibGUgaW50ZXJ2YWxzIG9mIHRoZSBtZWRpYSB0aW1lbGluZVxuICogQG1ldGhvZCBQbGF5ZXIjc2Vla2FibGVcbiAqL1xuJ3NlZWthYmxlJyxcbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXR3b3JrIGFjdGl2aXR5IGZvciB0aGUgZWxlbWVudCwgZnJvbVxuICogdGhlIGNvZGVzIGluIHRoZSBsaXN0IGJlbG93LlxuICogLSBORVRXT1JLX0VNUFRZIChudW1lcmljIHZhbHVlIDApXG4gKiAgIFRoZSBlbGVtZW50IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGlzZWQuIEFsbCBhdHRyaWJ1dGVzIGFyZSBpblxuICogICB0aGVpciBpbml0aWFsIHN0YXRlcy5cbiAqIC0gTkVUV09SS19JRExFIChudW1lcmljIHZhbHVlIDEpXG4gKiAgIFRoZSBlbGVtZW50J3MgcmVzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobSBpcyBhY3RpdmUgYW5kIGhhc1xuICogICBzZWxlY3RlZCBhIHJlc291cmNlLCBidXQgaXQgaXMgbm90IGFjdHVhbGx5IHVzaW5nIHRoZSBuZXR3b3JrIGF0XG4gKiAgIHRoaXMgdGltZS5cbiAqIC0gTkVUV09SS19MT0FESU5HIChudW1lcmljIHZhbHVlIDIpXG4gKiAgIFRoZSB1c2VyIGFnZW50IGlzIGFjdGl2ZWx5IHRyeWluZyB0byBkb3dubG9hZCBkYXRhLlxuICogLSBORVRXT1JLX05PX1NPVVJDRSAobnVtZXJpYyB2YWx1ZSAzKVxuICogICBUaGUgZWxlbWVudCdzIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gaXMgYWN0aXZlLCBidXQgaXQgaGFzXG4gKiAgIG5vdCB5ZXQgZm91bmQgYSByZXNvdXJjZSB0byB1c2UuXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjbmV0d29yay1zdGF0ZXNcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgbmV0d29yayBhY3Rpdml0eSBzdGF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjbmV0d29ya1N0YXRlXG4gKi9cbiduZXR3b3JrU3RhdGUnLFxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgdGhhdCBleHByZXNzZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVsZW1lbnRcbiAqIHdpdGggcmVzcGVjdCB0byByZW5kZXJpbmcgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sIGZyb20gdGhlXG4gKiBjb2RlcyBpbiB0aGUgbGlzdCBiZWxvdy5cbiAqIC0gSEFWRV9OT1RISU5HIChudW1lcmljIHZhbHVlIDApXG4gKiAgIE5vIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLlxuICogLSBIQVZFX01FVEFEQVRBIChudW1lcmljIHZhbHVlIDEpXG4gKiAgIEVub3VnaCBvZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gb2J0YWluZWQgdGhhdCB0aGUgZHVyYXRpb24gb2YgdGhlXG4gKiAgIHJlc291cmNlIGlzIGF2YWlsYWJsZS5cbiAqIC0gSEFWRV9DVVJSRU5UX0RBVEEgKG51bWVyaWMgdmFsdWUgMilcbiAqICAgRGF0YSBmb3IgdGhlIGltbWVkaWF0ZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGlzIGF2YWlsYWJsZS5cbiAqIC0gSEFWRV9GVVRVUkVfREFUQSAobnVtZXJpYyB2YWx1ZSAzKVxuICogICBEYXRhIGZvciB0aGUgaW1tZWRpYXRlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCBhc1xuICogICB3ZWxsIGFzIGVub3VnaCBkYXRhIGZvciB0aGUgdXNlciBhZ2VudCB0byBhZHZhbmNlIHRoZSBjdXJyZW50XG4gKiAgIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBkaXJlY3Rpb24gb2YgcGxheWJhY2suXG4gKiAtIEhBVkVfRU5PVUdIX0RBVEEgKG51bWVyaWMgdmFsdWUgNClcbiAqICAgVGhlIHVzZXIgYWdlbnQgZXN0aW1hdGVzIHRoYXQgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIGZvclxuICogICBwbGF5YmFjayB0byBwcm9jZWVkIHVuaW50ZXJydXB0ZWQuXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXJlYWR5c3RhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgcGxheWJhY2sgcmVuZGVyaW5nIHN0YXRlXG4gKiBAbWV0aG9kIFBsYXllciNyZWFkeVN0YXRlXG4gKi9cbidyZWFkeVN0YXRlJ10uZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgUGxheWVyLnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oZm4pO1xuICB9O1xufSk7XG5cblRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICBQbGF5ZXIucHJvdG90eXBlWydoYW5kbGVUZWNoJyArIHRvVGl0bGVDYXNlKGV2ZW50KSArICdfJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihldmVudCk7XG4gIH07XG59KTtcblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBwbGF5ZXIgaGFzIGluaXRpYWwgZHVyYXRpb24gYW5kIGRpbWVuc2lvbiBpbmZvcm1hdGlvblxuICpcbiAqIEBldmVudCBQbGF5ZXIjbG9hZGVkbWV0YWRhdGFcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBoYXMgZG93bmxvYWRlZCBkYXRhIGF0IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uXG4gKlxuICogQGV2ZW50IFBsYXllciNsb2FkZWRkYXRhXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcyBjaGFuZ2VkICpcbiAqIER1cmluZyBwbGF5YmFjayB0aGlzIGlzIGZpcmVkIGV2ZXJ5IDE1LTI1MCBtaWxsaXNlY29uZHMsIGRlcGVuZGluZyBvbiB0aGVcbiAqIHBsYXliYWNrIHRlY2hub2xvZ3kgaW4gdXNlLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjdGltZXVwZGF0ZVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgdm9sdW1lIGNoYW5nZXNcbiAqXG4gKiBAZXZlbnQgUGxheWVyI3ZvbHVtZWNoYW5nZVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9yIG5vdCBhIHBsYXllciBoYXMgYSBwbHVnaW4gYXZhaWxhYmxlLlxuICpcbiAqIFRoaXMgZG9lcyBub3QgcmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaGFzIGV2ZXIgYmVlbiBpbml0aWFsaXplZFxuICogb24gdGhpcyBwbGF5ZXIuIEZvciB0aGF0LCBbdXNpbmdQbHVnaW5de0BsaW5rIFBsYXllciN1c2luZ1BsdWdpbn0uXG4gKlxuICogQG1ldGhvZCBQbGF5ZXIjaGFzUGx1Z2luXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoaXMgcGxheWVyIGhhcyB0aGUgcmVxdWVzdGVkIHBsdWdpbiBhdmFpbGFibGUuXG4gKi9cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgb3Igbm90IGEgcGxheWVyIGlzIHVzaW5nIGEgcGx1Z2luIGJ5IG5hbWUuXG4gKlxuICogRm9yIGJhc2ljIHBsdWdpbnMsIHRoaXMgb25seSByZXBvcnRzIHdoZXRoZXIgdGhlIHBsdWdpbiBoYXMgX2V2ZXJfIGJlZW5cbiAqIGluaXRpYWxpemVkIG9uIHRoaXMgcGxheWVyLlxuICpcbiAqIEBtZXRob2QgUGxheWVyI3VzaW5nUGx1Z2luXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhpcyBwbGF5ZXIgaXMgdXNpbmcgdGhlIHJlcXVlc3RlZCBwbHVnaW4uXG4gKi9cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5ZXInLCBQbGF5ZXIpO1xuXG4vKipcbiAqIEBmaWxlIHBsdWdpbi5qc1xuICovXG4vKipcbiAqIFRoZSBiYXNlIHBsdWdpbiBuYW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbnZhciBCQVNFX1BMVUdJTl9OQU1FID0gJ3BsdWdpbic7XG5cbi8qKlxuICogVGhlIGtleSBvbiB3aGljaCBhIHBsYXllcidzIGFjdGl2ZSBwbHVnaW5zIGNhY2hlIGlzIHN0b3JlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0YW50XG4gKiBAdHlwZSAgICAge3N0cmluZ31cbiAqL1xudmFyIFBMVUdJTl9DQUNIRV9LRVkgPSAnYWN0aXZlUGx1Z2luc18nO1xuXG4vKipcbiAqIFN0b3JlcyByZWdpc3RlcmVkIHBsdWdpbnMgaW4gYSBwcml2YXRlIHNwYWNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSAgICB7T2JqZWN0fVxuICovXG52YXIgcGx1Z2luU3RvcmFnZSA9IHt9O1xuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBvciBub3QgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG4gKi9cbnZhciBwbHVnaW5FeGlzdHMgPSBmdW5jdGlvbiBwbHVnaW5FeGlzdHMobmFtZSkge1xuICByZXR1cm4gcGx1Z2luU3RvcmFnZS5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbn07XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIHJlZ2lzdGVyZWQgcGx1Z2luIGJ5IG5hbWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnx1bmRlZmluZWR9XG4gKiAgICAgICAgICBUaGUgcGx1Z2luIChvciB1bmRlZmluZWQpLlxuICovXG52YXIgZ2V0UGx1Z2luID0gZnVuY3Rpb24gZ2V0UGx1Z2luKG5hbWUpIHtcbiAgcmV0dXJuIHBsdWdpbkV4aXN0cyhuYW1lKSA/IHBsdWdpblN0b3JhZ2VbbmFtZV0gOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIE1hcmtzIGEgcGx1Z2luIGFzIFwiYWN0aXZlXCIgb24gYSBwbGF5ZXIuXG4gKlxuICogQWxzbywgZW5zdXJlcyB0aGF0IHRoZSBwbGF5ZXIgaGFzIGFuIG9iamVjdCBmb3IgdHJhY2tpbmcgYWN0aXZlIHBsdWdpbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtQbGF5ZXJ9IHBsYXllclxuICogICAgICAgICAgQSBWaWRlby5qcyBwbGF5ZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKi9cbnZhciBtYXJrUGx1Z2luQXNBY3RpdmUgPSBmdW5jdGlvbiBtYXJrUGx1Z2luQXNBY3RpdmUocGxheWVyLCBuYW1lKSB7XG4gIHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSA9IHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSB8fCB7fTtcbiAgcGxheWVyW1BMVUdJTl9DQUNIRV9LRVldW25hbWVdID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlcnMgYSBwYWlyIG9mIHBsdWdpbiBzZXR1cCBldmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1BsYXllcn0gcGxheWVyXG4gKiAgICAgICAgIEEgVmlkZW8uanMgcGxheWVyIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSAge1BsdWdpbn5QbHVnaW5FdmVudEhhc2h9IGhhc2hcbiAqICAgICAgICAgQSBwbHVnaW4gZXZlbnQgaGFzaC5cbiAqXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbYmVmb3JlXVxuICogICAgICAgICBJZiB0cnVlLCBwcmVmaXhlcyB0aGUgZXZlbnQgbmFtZSB3aXRoIFwiYmVmb3JlXCIuIEluIG90aGVyIHdvcmRzLFxuICogICAgICAgICB1c2UgdGhpcyB0byB0cmlnZ2VyIFwiYmVmb3JlcGx1Z2luc2V0dXBcIiBpbnN0ZWFkIG9mIFwicGx1Z2luc2V0dXBcIi5cbiAqL1xudmFyIHRyaWdnZXJTZXR1cEV2ZW50ID0gZnVuY3Rpb24gdHJpZ2dlclNldHVwRXZlbnQocGxheWVyLCBoYXNoLCBiZWZvcmUpIHtcbiAgdmFyIGV2ZW50TmFtZSA9IChiZWZvcmUgPyAnYmVmb3JlJyA6ICcnKSArICdwbHVnaW5zZXR1cCc7XG5cbiAgcGxheWVyLnRyaWdnZXIoZXZlbnROYW1lLCBoYXNoKTtcbiAgcGxheWVyLnRyaWdnZXIoZXZlbnROYW1lICsgJzonICsgaGFzaC5uYW1lLCBoYXNoKTtcbn07XG5cbi8qKlxuICogVGFrZXMgYSBiYXNpYyBwbHVnaW4gZnVuY3Rpb24gYW5kIHJldHVybnMgYSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIG1hcmtzXG4gKiBvbiB0aGUgcGxheWVyIHRoYXQgdGhlIHBsdWdpbiBoYXMgYmVlbiBhY3RpdmF0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW5cbiAqICAgICAgICAgIFRoZSBiYXNpYyBwbHVnaW4uXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICogICAgICAgICAgQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gcGx1Z2luLlxuICovXG52YXIgY3JlYXRlQmFzaWNQbHVnaW4gPSBmdW5jdGlvbiBjcmVhdGVCYXNpY1BsdWdpbihuYW1lLCBwbHVnaW4pIHtcbiAgdmFyIGJhc2ljUGx1Z2luV3JhcHBlciA9IGZ1bmN0aW9uIGJhc2ljUGx1Z2luV3JhcHBlcigpIHtcblxuICAgIC8vIFdlIHRyaWdnZXIgdGhlIFwiYmVmb3JlcGx1Z2luc2V0dXBcIiBhbmQgXCJwbHVnaW5zZXR1cFwiIGV2ZW50cyBvbiB0aGUgcGxheWVyXG4gICAgLy8gcmVnYXJkbGVzcywgYnV0IHdlIHdhbnQgdGhlIGhhc2ggdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBoYXNoIHByb3ZpZGVkXG4gICAgLy8gZm9yIGFkdmFuY2VkIHBsdWdpbnMuXG4gICAgLy9cbiAgICAvLyBUaGUgb25seSBwb3RlbnRpYWxseSBjb3VudGVyLWludHVpdGl2ZSB0aGluZyBoZXJlIGlzIHRoZSBgaW5zdGFuY2VgIGluXG4gICAgLy8gdGhlIFwicGx1Z2luc2V0dXBcIiBldmVudCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGBwbHVnaW5gIGZ1bmN0aW9uLlxuICAgIHRyaWdnZXJTZXR1cEV2ZW50KHRoaXMsIHsgbmFtZTogbmFtZSwgcGx1Z2luOiBwbHVnaW4sIGluc3RhbmNlOiBudWxsIH0sIHRydWUpO1xuXG4gICAgdmFyIGluc3RhbmNlID0gcGx1Z2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBtYXJrUGx1Z2luQXNBY3RpdmUodGhpcywgbmFtZSk7XG4gICAgdHJpZ2dlclNldHVwRXZlbnQodGhpcywgeyBuYW1lOiBuYW1lLCBwbHVnaW46IHBsdWdpbiwgaW5zdGFuY2U6IGluc3RhbmNlIH0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuXG4gIE9iamVjdC5rZXlzKHBsdWdpbikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIGJhc2ljUGx1Z2luV3JhcHBlcltwcm9wXSA9IHBsdWdpbltwcm9wXTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJhc2ljUGx1Z2luV3JhcHBlcjtcbn07XG5cbi8qKlxuICogVGFrZXMgYSBwbHVnaW4gc3ViLWNsYXNzIGFuZCByZXR1cm5zIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZ1xuICogaW5zdGFuY2VzIG9mIGl0LlxuICpcbiAqIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiB3aWxsIHJlcGxhY2UgaXRzZWxmIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZFxuICogc3ViLWNsYXNzIG9mIFBsdWdpbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gICB7UGx1Z2lufSBQbHVnaW5TdWJDbGFzc1xuICogICAgICAgICAgVGhlIGFkdmFuY2VkIHBsdWdpbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbnZhciBjcmVhdGVQbHVnaW5GYWN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBQbHVnaW5TdWJDbGFzcykge1xuXG4gIC8vIEFkZCBhIGBuYW1lYCBwcm9wZXJ0eSB0byB0aGUgcGx1Z2luIHByb3RvdHlwZSBzbyB0aGF0IGVhY2ggcGx1Z2luIGNhblxuICAvLyByZWZlciB0byBpdHNlbGYgYnkgbmFtZS5cbiAgUGx1Z2luU3ViQ2xhc3MucHJvdG90eXBlLm5hbWUgPSBuYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdHJpZ2dlclNldHVwRXZlbnQodGhpcywgeyBuYW1lOiBuYW1lLCBwbHVnaW46IFBsdWdpblN1YkNsYXNzLCBpbnN0YW5jZTogbnVsbCB9LCB0cnVlKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBpbnN0YW5jZSA9IG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoUGx1Z2luU3ViQ2xhc3MsIFtudWxsXS5jb25jYXQoW3RoaXNdLmNvbmNhdChhcmdzKSkpKSgpO1xuXG4gICAgLy8gVGhlIHBsdWdpbiBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICB0aGlzW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG5cbiAgICB0cmlnZ2VyU2V0dXBFdmVudCh0aGlzLCBpbnN0YW5jZS5nZXRFdmVudEhhc2goKSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59O1xuXG4vKipcbiAqIFBhcmVudCBjbGFzcyBmb3IgYWxsIGFkdmFuY2VkIHBsdWdpbnMuXG4gKlxuICogQG1peGVzICAgbW9kdWxlOmV2ZW50ZWR+RXZlbnRlZE1peGluXG4gKiBAbWl4ZXMgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpblxuICogQGZpcmVzICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwXG4gKiBAZmlyZXMgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXA6JG5hbWVcbiAqIEBmaXJlcyAgIFBsYXllciNwbHVnaW5zZXR1cFxuICogQGZpcmVzICAgUGxheWVyI3BsdWdpbnNldHVwOiRuYW1lXG4gKiBAbGlzdGVucyBQbGF5ZXIjZGlzcG9zZVxuICogQHRocm93cyAge0Vycm9yfVxuICogICAgICAgICAgSWYgYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSB0aGUgYmFzZSB7QGxpbmsgUGx1Z2lufSBjbGFzc1xuICogICAgICAgICAgZGlyZWN0bHkgaW5zdGVhZCBvZiB2aWEgYSBzdWItY2xhc3MuXG4gKi9cblxudmFyIFBsdWdpbiA9IGZ1bmN0aW9uICgpIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBTdWItY2xhc3NlcyBzaG91bGQgY2FsbCBgc3VwZXJgIHRvIGVuc3VyZSBwbHVnaW5zIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgQSBWaWRlby5qcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBmdW5jdGlvbiBQbHVnaW4ocGxheWVyKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGx1Z2luKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luIG11c3QgYmUgc3ViLWNsYXNzZWQ7IG5vdCBkaXJlY3RseSBpbnN0YW50aWF0ZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvLyBNYWtlIHRoaXMgb2JqZWN0IGV2ZW50ZWQsIGJ1dCByZW1vdmUgdGhlIGFkZGVkIGB0cmlnZ2VyYCBtZXRob2Qgc28gd2VcbiAgICAvLyB1c2UgdGhlIHByb3RvdHlwZSB2ZXJzaW9uIGluc3RlYWQuXG4gICAgZXZlbnRlZCh0aGlzKTtcbiAgICBkZWxldGUgdGhpcy50cmlnZ2VyO1xuXG4gICAgc3RhdGVmdWwodGhpcywgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0U3RhdGUpO1xuICAgIG1hcmtQbHVnaW5Bc0FjdGl2ZShwbGF5ZXIsIHRoaXMubmFtZSk7XG5cbiAgICAvLyBBdXRvLWJpbmQgdGhlIGRpc3Bvc2UgbWV0aG9kIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBsaXN0ZW5lciBhbmQgdW5iaW5kXG4gICAgLy8gaXQgbGF0ZXIgZWFzaWx5LlxuICAgIHRoaXMuZGlzcG9zZSA9IGJpbmQodGhpcywgdGhpcy5kaXNwb3NlKTtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgZGlzcG9zZWQsIGRpc3Bvc2UgdGhlIHBsdWdpbi5cbiAgICBwbGF5ZXIub24oJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHRoYXQgd2FzIHNldCBvbiA8cGx1Z2luTmFtZT4uVkVSU0lPTlxuICAgKi9cblxuXG4gIFBsdWdpbi5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uIHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuVkVSU0lPTjtcbiAgfTtcblxuICAvKipcbiAgICogRWFjaCBldmVudCB0cmlnZ2VyZWQgYnkgcGx1Z2lucyBpbmNsdWRlcyBhIGhhc2ggb2YgYWRkaXRpb25hbCBkYXRhIHdpdGhcbiAgICogY29udmVudGlvbmFsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIFRoaXMgcmV0dXJucyB0aGF0IG9iamVjdCBvciBtdXRhdGVzIGFuIGV4aXN0aW5nIGhhc2guXG4gICAqXG4gICAqIEBwYXJhbSAgIHtPYmplY3R9IFtoYXNoPXt9XVxuICAgKiAgICAgICAgICBBbiBvYmplY3QgdG8gYmUgdXNlZCBhcyBldmVudCBhbiBldmVudCBoYXNoLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH1cbiAgICogICAgICAgICAgQW4gZXZlbnQgaGFzaCBvYmplY3Qgd2l0aCBwcm92aWRlZCBwcm9wZXJ0aWVzIG1peGVkLWluLlxuICAgKi9cblxuXG4gIFBsdWdpbi5wcm90b3R5cGUuZ2V0RXZlbnRIYXNoID0gZnVuY3Rpb24gZ2V0RXZlbnRIYXNoKCkge1xuICAgIHZhciBoYXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGhhc2gubmFtZSA9IHRoaXMubmFtZTtcbiAgICBoYXNoLnBsdWdpbiA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgaGFzaC5pbnN0YW5jZSA9IHRoaXM7XG4gICAgcmV0dXJuIGhhc2g7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGFuIGV2ZW50IG9uIHRoZSBwbHVnaW4gb2JqZWN0IGFuZCBvdmVycmlkZXNcbiAgICoge0BsaW5rIG1vZHVsZTpldmVudGVkfkV2ZW50ZWRNaXhpbi50cmlnZ2VyfEV2ZW50ZWRNaXhpbi50cmlnZ2VyfS5cbiAgICpcbiAgICogQHBhcmFtICAge3N0cmluZ3xPYmplY3R9IGV2ZW50XG4gICAqICAgICAgICAgIEFuIGV2ZW50IHR5cGUgb3IgYW4gb2JqZWN0IHdpdGggYSB0eXBlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0gICB7T2JqZWN0fSBbaGFzaD17fV1cbiAgICogICAgICAgICAgQWRkaXRpb25hbCBkYXRhIGhhc2ggdG8gbWVyZ2Ugd2l0aCBhXG4gICAqICAgICAgICAgIHtAbGluayBQbHVnaW5+UGx1Z2luRXZlbnRIYXNofFBsdWdpbkV2ZW50SGFzaH0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IHdhcyBwcmV2ZW50ZWQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gdHJpZ2dlciQkMShldmVudCkge1xuICAgIHZhciBoYXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0cmlnZ2VyKHRoaXMuZXZlbnRCdXNFbF8sIGV2ZW50LCB0aGlzLmdldEV2ZW50SGFzaChoYXNoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgXCJzdGF0ZWNoYW5nZWRcIiBldmVudHMgb24gdGhlIHBsdWdpbi4gTm8tb3AgYnkgZGVmYXVsdCwgb3ZlcnJpZGUgYnlcbiAgICogc3ViY2xhc3NpbmcuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0gICAge0V2ZW50fSBlXG4gICAqICAgICAgICAgICBBbiBldmVudCBvYmplY3QgcHJvdmlkZWQgYnkgYSBcInN0YXRlY2hhbmdlZFwiIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gICAge09iamVjdH0gZS5jaGFuZ2VzXG4gICAqICAgICAgICAgICBBbiBvYmplY3QgZGVzY3JpYmluZyBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgd2l0aCB0aGUgXCJzdGF0ZWNoYW5nZWRcIlxuICAgKiAgICAgICAgICAgZXZlbnQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLnByb3RvdHlwZS5oYW5kbGVTdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbiBoYW5kbGVTdGF0ZUNoYW5nZWQoZSkge307XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGEgcGx1Z2luLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCwgYnV0IGZvciB0aGUgc2FrZSBvZiBzYWZldHksXG4gICAqIGl0J3MgcHJvYmFibHkgYmVzdCB0byBzdWJzY3JpYmUgdGhlIFwiZGlzcG9zZVwiIGV2ZW50LlxuICAgKlxuICAgKiBAZmlyZXMgUGx1Z2luI2Rpc3Bvc2VcbiAgICovXG5cblxuICBQbHVnaW4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lLFxuICAgICAgICBwbGF5ZXIgPSB0aGlzLnBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhhdCBhIGFkdmFuY2VkIHBsdWdpbiBpcyBhYm91dCB0byBiZSBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbHVnaW4jZGlzcG9zZVxuICAgICAqIEB0eXBlICB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG5cbiAgICB0aGlzLnRyaWdnZXIoJ2Rpc3Bvc2UnKTtcbiAgICB0aGlzLm9mZigpO1xuICAgIHBsYXllci5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2UpO1xuXG4gICAgLy8gRWxpbWluYXRlIGFueSBwb3NzaWJsZSBzb3VyY2VzIG9mIGxlYWtpbmcgbWVtb3J5IGJ5IGNsZWFyaW5nIHVwXG4gICAgLy8gcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIHRoZSBwbHVnaW4gaW5zdGFuY2UgYW5kIG51bGxpbmcgb3V0XG4gICAgLy8gdGhlIHBsdWdpbidzIHN0YXRlIGFuZCByZXBsYWNpbmcgbWV0aG9kcyB3aXRoIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MuXG4gICAgcGxheWVyW1BMVUdJTl9DQUNIRV9LRVldW25hbWVdID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5ZXIgPSB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgIC8vIEZpbmFsbHksIHJlcGxhY2UgdGhlIHBsdWdpbiBuYW1lIG9uIHRoZSBwbGF5ZXIgd2l0aCBhIG5ldyBmYWN0b3J5XG4gICAgLy8gZnVuY3Rpb24sIHNvIHRoYXQgdGhlIHBsdWdpbiBpcyByZWFkeSB0byBiZSBzZXQgdXAgYWdhaW4uXG4gICAgcGxheWVyW25hbWVdID0gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBwbHVnaW5TdG9yYWdlW25hbWVdKTtcbiAgfTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHBsdWdpbiBpcyBhIGJhc2ljIHBsdWdpbiAoaS5lLiBub3QgYSBzdWItY2xhc3Mgb2YgYFBsdWdpbmApLlxuICAgKlxuICAgKiBAcGFyYW0gICB7c3RyaW5nfEZ1bmN0aW9ufSBwbHVnaW5cbiAgICogICAgICAgICAgSWYgYSBzdHJpbmcsIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwbHVnaW4uIElmIGEgZnVuY3Rpb24sIHdpbGwgYmVcbiAgICogICAgICAgICAgdGVzdGVkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogICAgICAgICAgV2hldGhlciBvciBub3QgYSBwbHVnaW4gaXMgYSBiYXNpYyBwbHVnaW4uXG4gICAqL1xuXG5cbiAgUGx1Z2luLmlzQmFzaWMgPSBmdW5jdGlvbiBpc0Jhc2ljKHBsdWdpbikge1xuICAgIHZhciBwID0gdHlwZW9mIHBsdWdpbiA9PT0gJ3N0cmluZycgPyBnZXRQbHVnaW4ocGx1Z2luKSA6IHBsdWdpbjtcblxuICAgIHJldHVybiB0eXBlb2YgcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhUGx1Z2luLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHAucHJvdG90eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBWaWRlby5qcyBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSByZWdpc3RlcmVkLiBNdXN0IGJlIGEgc3RyaW5nIGFuZFxuICAgKiAgICAgICAgICBtdXN0IG5vdCBtYXRjaCBhbiBleGlzdGluZyBwbHVnaW4gb3IgYSBtZXRob2Qgb24gdGhlIGBQbGF5ZXJgXG4gICAqICAgICAgICAgIHByb3RvdHlwZS5cbiAgICpcbiAgICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW5cbiAgICogICAgICAgICAgQSBzdWItY2xhc3Mgb2YgYFBsdWdpbmAgb3IgYSBmdW5jdGlvbiBmb3IgYmFzaWMgcGx1Z2lucy5cbiAgICpcbiAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgKiAgICAgICAgICBGb3IgYWR2YW5jZWQgcGx1Z2lucywgYSBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGF0IHBsdWdpbi4gRm9yXG4gICAqICAgICAgICAgIGJhc2ljIHBsdWdpbnMsIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBwbHVnaW4uXG4gICAqL1xuXG5cbiAgUGx1Z2luLnJlZ2lzdGVyUGx1Z2luID0gZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIHBsdWdpbiBuYW1lLCBcIicgKyBuYW1lICsgJ1wiLCBtdXN0IGJlIGEgc3RyaW5nLCB3YXMgJyArICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmFtZSkpICsgJy4nKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luRXhpc3RzKG5hbWUpKSB7XG4gICAgICBsb2ckMS53YXJuKCdBIHBsdWdpbiBuYW1lZCBcIicgKyBuYW1lICsgJ1wiIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IHdhbnQgdG8gYXZvaWQgcmUtcmVnaXN0ZXJpbmcgcGx1Z2lucyEnKTtcbiAgICB9IGVsc2UgaWYgKFBsYXllci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gbmFtZSwgXCInICsgbmFtZSArICdcIiwgY2Fubm90IHNoYXJlIGEgbmFtZSB3aXRoIGFuIGV4aXN0aW5nIHBsYXllciBtZXRob2QhJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gZm9yIFwiJyArIG5hbWUgKyAnXCIsIG11c3QgYmUgYSBmdW5jdGlvbiwgd2FzICcgKyAodHlwZW9mIHBsdWdpbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGx1Z2luKSkgKyAnLicpO1xuICAgIH1cblxuICAgIHBsdWdpblN0b3JhZ2VbbmFtZV0gPSBwbHVnaW47XG5cbiAgICAvLyBBZGQgYSBwbGF5ZXIgcHJvdG90eXBlIG1ldGhvZCBmb3IgYWxsIHN1Yi1jbGFzc2VkIHBsdWdpbnMgKGJ1dCBub3QgZm9yXG4gICAgLy8gdGhlIGJhc2UgUGx1Z2luIGNsYXNzKS5cbiAgICBpZiAobmFtZSAhPT0gQkFTRV9QTFVHSU5fTkFNRSkge1xuICAgICAgaWYgKFBsdWdpbi5pc0Jhc2ljKHBsdWdpbikpIHtcbiAgICAgICAgUGxheWVyLnByb3RvdHlwZVtuYW1lXSA9IGNyZWF0ZUJhc2ljUGx1Z2luKG5hbWUsIHBsdWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQbGF5ZXIucHJvdG90eXBlW25hbWVdID0gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBwbHVnaW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbHVnaW47XG4gIH07XG5cbiAgLyoqXG4gICAqIERlLXJlZ2lzdGVyIGEgVmlkZW8uanMgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSBkZXJlZ2lzdGVyZWQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLmRlcmVnaXN0ZXJQbHVnaW4gPSBmdW5jdGlvbiBkZXJlZ2lzdGVyUGx1Z2luKG5hbWUpIHtcbiAgICBpZiAobmFtZSA9PT0gQkFTRV9QTFVHSU5fTkFNRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGUtcmVnaXN0ZXIgYmFzZSBwbHVnaW4uJyk7XG4gICAgfVxuICAgIGlmIChwbHVnaW5FeGlzdHMobmFtZSkpIHtcbiAgICAgIGRlbGV0ZSBwbHVnaW5TdG9yYWdlW25hbWVdO1xuICAgICAgZGVsZXRlIFBsYXllci5wcm90b3R5cGVbbmFtZV07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBjb250YWluaW5nIG11bHRpcGxlIFZpZGVvLmpzIHBsdWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtBcnJheX0gW25hbWVzXVxuICAgKiAgICAgICAgICBJZiBwcm92aWRlZCwgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHBsdWdpbiBuYW1lcy4gRGVmYXVsdHMgdG8gX2FsbF9cbiAgICogICAgICAgICAgcGx1Z2luIG5hbWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fHVuZGVmaW5lZH1cbiAgICogICAgICAgICAgQW4gb2JqZWN0IGNvbnRhaW5pbmcgcGx1Z2luKHMpIGFzc29jaWF0ZWQgd2l0aCB0aGVpciBuYW1lKHMpIG9yXG4gICAqICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vIG1hdGNoaW5nIHBsdWdpbnMgZXhpc3QpLlxuICAgKi9cblxuXG4gIFBsdWdpbi5nZXRQbHVnaW5zID0gZnVuY3Rpb24gZ2V0UGx1Z2lucygpIHtcbiAgICB2YXIgbmFtZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IE9iamVjdC5rZXlzKHBsdWdpblN0b3JhZ2UpO1xuXG4gICAgdmFyIHJlc3VsdCA9IHZvaWQgMDtcblxuICAgIG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBwbHVnaW4gPSBnZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHRbbmFtZV0gPSBwbHVnaW47XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgcGx1Z2luJ3MgdmVyc2lvbiwgaWYgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqICAgICAgICAgIFRoZSBwbHVnaW4ncyB2ZXJzaW9uIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAgICovXG5cblxuICBQbHVnaW4uZ2V0UGx1Z2luVmVyc2lvbiA9IGZ1bmN0aW9uIGdldFBsdWdpblZlcnNpb24obmFtZSkge1xuICAgIHZhciBwbHVnaW4gPSBnZXRQbHVnaW4obmFtZSk7XG5cbiAgICByZXR1cm4gcGx1Z2luICYmIHBsdWdpbi5WRVJTSU9OIHx8ICcnO1xuICB9O1xuXG4gIHJldHVybiBQbHVnaW47XG59KCk7XG5cbi8qKlxuICogR2V0cyBhIHBsdWdpbiBieSBuYW1lIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWV0aG9kICAgZ2V0UGx1Z2luXG4gKiBAbWVtYmVyT2YgUGx1Z2luXG4gKiBAcGFyYW0gICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm5zICB7RnVuY3Rpb258dW5kZWZpbmVkfVxuICogICAgICAgICAgIFRoZSBwbHVnaW4gKG9yIGB1bmRlZmluZWRgKS5cbiAqL1xuXG5cblBsdWdpbi5nZXRQbHVnaW4gPSBnZXRQbHVnaW47XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGJhc2UgcGx1Z2luIGNsYXNzIGFzIGl0IGlzIHJlZ2lzdGVyZWQuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuUGx1Z2luLkJBU0VfUExVR0lOX05BTUUgPSBCQVNFX1BMVUdJTl9OQU1FO1xuXG5QbHVnaW4ucmVnaXN0ZXJQbHVnaW4oQkFTRV9QTFVHSU5fTkFNRSwgUGx1Z2luKTtcblxuLyoqXG4gKiBEb2N1bWVudGVkIGluIHBsYXllci5qc1xuICpcbiAqIEBpZ25vcmVcbiAqL1xuUGxheWVyLnByb3RvdHlwZS51c2luZ1BsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAhIXRoaXNbUExVR0lOX0NBQ0hFX0tFWV0gJiYgdGhpc1tQTFVHSU5fQ0FDSEVfS0VZXVtuYW1lXSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnRlZCBpbiBwbGF5ZXIuanNcbiAqXG4gKiBAaWdub3JlXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFzUGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICEhcGx1Z2luRXhpc3RzKG5hbWUpO1xufTtcblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaXMgYWJvdXQgdG8gYmUgc2V0IHVwIG9uIGEgcGxheWVyLlxuICpcbiAqIEBldmVudCAgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXBcbiAqIEB0eXBlICAgICB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH1cbiAqL1xuXG4vKipcbiAqIFNpZ25hbHMgdGhhdCBhIHBsdWdpbiBpcyBhYm91dCB0byBiZSBzZXQgdXAgb24gYSBwbGF5ZXIgLSBieSBuYW1lLiBUaGUgbmFtZVxuICogaXMgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cbiAqXG4gKiBAZXZlbnQgICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwOiRuYW1lXG4gKiBAdHlwZSAgICAge1BsdWdpbn5QbHVnaW5FdmVudEhhc2h9XG4gKi9cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaGFzIGp1c3QgYmVlbiBzZXQgdXAgb24gYSBwbGF5ZXIuXG4gKlxuICogQGV2ZW50ICAgIFBsYXllciNwbHVnaW5zZXR1cFxuICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofVxuICovXG5cbi8qKlxuICogU2lnbmFscyB0aGF0IGEgcGx1Z2luIGhhcyBqdXN0IGJlZW4gc2V0IHVwIG9uIGEgcGxheWVyIC0gYnkgbmFtZS4gVGhlIG5hbWVcbiAqIGlzIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQGV2ZW50ICAgIFBsYXllciNwbHVnaW5zZXR1cDokbmFtZVxuICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgIHtPYmplY3R9IFBsdWdpbn5QbHVnaW5FdmVudEhhc2hcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFuY2VcbiAqICAgICAgICAgICBGb3IgYmFzaWMgcGx1Z2lucywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGx1Z2luIGZ1bmN0aW9uLiBGb3JcbiAqICAgICAgICAgICBhZHZhbmNlZCBwbHVnaW5zLCB0aGUgcGx1Z2luIGluc3RhbmNlIG9uIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsdWdpblxuICogICAgICAgICAgIEZvciBiYXNpYyBwbHVnaW5zLCB0aGUgcGx1Z2luIGZ1bmN0aW9uLiBGb3IgYWR2YW5jZWQgcGx1Z2lucywgdGhlXG4gKiAgICAgICAgICAgcGx1Z2luIGNsYXNzL2NvbnN0cnVjdG9yLlxuICovXG5cbi8qKlxuICogQGZpbGUgZXh0ZW5kLmpzXG4gKiBAbW9kdWxlIGV4dGVuZFxuICovXG5cbi8qKlxuICogQSBjb21iaW5hdGlvbiBvZiBub2RlIGluaGVyaXRzIGFuZCBiYWJlbCdzIGluaGVyaXRzIChhZnRlciB0cmFuc3BpbGUpLlxuICogQm90aCB3b3JrIHRoZSBzYW1lIGJ1dCBub2RlIGFkZHMgYHN1cGVyX2AgdG8gdGhlIHN1YkNsYXNzXG4gKiBhbmQgQmFibGUgYWRkcyB0aGUgc3VwZXJDbGFzcyBhcyBfX3Byb3RvX18uIEJvdGggc2VlbSB1c2VmdWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN1YkNsYXNzXG4gKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgdG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3VwZXJDbGFzc1xuICogICAgICAgIFRoZSBjbGFzcyB0byBpbmhlcml0IGZyb21cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgKHR5cGVvZiBzdXBlckNsYXNzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdXBlckNsYXNzKSkpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgLy8gbm9kZVxuICAgIHN1YkNsYXNzLnN1cGVyXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gZm9yIHN1YmNsYXNzaW5nIHVzaW5nIHRoZSBzYW1lIGluaGVyaXRhbmNlIHRoYXRcbiAqIHZpZGVvanMgdXNlcyBpbnRlcm5hbGx5XG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN1cGVyQ2xhc3NcbiAqICAgICAgICBUaGUgY2xhc3MgdG8gaW5oZXJpdCBmcm9tXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtzdWJDbGFzc01ldGhvZHM9e31dXG4gKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgdG9cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiAgICAgICAgIFRoZSBuZXcgb2JqZWN0IHdpdGggc3ViQ2xhc3NNZXRob2RzIHRoYXQgaW5oZXJpdGVkIHN1cGVyQ2xhc3MuXG4gKi9cbnZhciBleHRlbmRGbiA9IGZ1bmN0aW9uIGV4dGVuZEZuKHN1cGVyQ2xhc3MpIHtcbiAgdmFyIHN1YkNsYXNzTWV0aG9kcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgdmFyIHN1YkNsYXNzID0gZnVuY3Rpb24gc3ViQ2xhc3MoKSB7XG4gICAgc3VwZXJDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBtZXRob2RzID0ge307XG5cbiAgaWYgKCh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdWJDbGFzc01ldGhvZHMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yICE9PSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzdWJDbGFzcyA9IHN1YkNsYXNzTWV0aG9kcy5jb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgbWV0aG9kcyA9IHN1YkNsYXNzTWV0aG9kcztcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3ViQ2xhc3MgPSBzdWJDbGFzc01ldGhvZHM7XG4gIH1cblxuICBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xuXG4gIC8vIEV4dGVuZCBzdWJPYmoncyBwcm90b3R5cGUgd2l0aCBmdW5jdGlvbnMgYW5kIG90aGVyIHByb3BlcnRpZXMgZnJvbSBwcm9wc1xuICBmb3IgKHZhciBuYW1lIGluIG1ldGhvZHMpIHtcbiAgICBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgc3ViQ2xhc3MucHJvdG90eXBlW25hbWVdID0gbWV0aG9kc1tuYW1lXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ViQ2xhc3M7XG59O1xuXG4vKipcbiAqIEBmaWxlIHZpZGVvLmpzXG4gKiBAbW9kdWxlIHZpZGVvanNcbiAqL1xuLy8gSW5jbHVkZSB0aGUgYnVpbHQtaW4gdGVjaHNcbi8vIEhUTUw1IEVsZW1lbnQgU2hpbSBmb3IgSUU4XG5pZiAodHlwZW9mIEhUTUxWaWRlb0VsZW1lbnQgPT09ICd1bmRlZmluZWQnICYmIGlzUmVhbCgpKSB7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvLWpzJyk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGBpZGAgdmFsdWUgYnkgdHJpbW1pbmcgb2ZmIGEgbGVhZGluZyBgI2BcbiAqXG4gKiBAcGFyYW0gICB7c3RyaW5nfSBpZFxuICogICAgICAgICAgQSBzdHJpbmcsIG1heWJlIHdpdGggYSBsZWFkaW5nIGAjYC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogICAgICAgICAgVGhlIHN0cmluZywgd2l0aG91dCBhbnkgbGVhZGluZyBgI2AuXG4gKi9cbnZhciBub3JtYWxpemVJZCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUlkKGlkKSB7XG4gIHJldHVybiBpZC5pbmRleE9mKCcjJykgPT09IDAgPyBpZC5zbGljZSgxKSA6IGlkO1xufTtcblxuLyoqXG4gKiBEb3VibGVzIGFzIHRoZSBtYWluIGZ1bmN0aW9uIGZvciB1c2VycyB0byBjcmVhdGUgYSBwbGF5ZXIgaW5zdGFuY2UgYW5kIGFsc29cbiAqIHRoZSBtYWluIGxpYnJhcnkgb2JqZWN0LlxuICogVGhlIGB2aWRlb2pzYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIG9yIHJldHJpZXZlIGEgcGxheWVyLlxuICAqXG4gKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSBpZFxuICogICAgICAgIFZpZGVvIGVsZW1lbnQgb3IgdmlkZW8gZWxlbWVudCBJRFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICBPcHRpb25hbCBvcHRpb25zIG9iamVjdCBmb3IgY29uZmlnL3NldHRpbmdzXG4gKlxuICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICogICAgICAgIE9wdGlvbmFsIHJlYWR5IGNhbGxiYWNrXG4gKlxuICogQHJldHVybiB7UGxheWVyfVxuICogICAgICAgICBBIHBsYXllciBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiB2aWRlb2pzKGlkLCBvcHRpb25zLCByZWFkeSkge1xuICB2YXIgcGxheWVyID0gdmlkZW9qcy5nZXRQbGF5ZXIoaWQpO1xuXG4gIGlmIChwbGF5ZXIpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgbG9nJDEud2FybignUGxheWVyIFwiJyArIGlkICsgJ1wiIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuIE9wdGlvbnMgd2lsbCBub3QgYmUgYXBwbGllZC4nKTtcbiAgICB9XG4gICAgaWYgKHJlYWR5KSB7XG4gICAgICBwbGF5ZXIucmVhZHkocmVhZHkpO1xuICAgIH1cbiAgICByZXR1cm4gcGxheWVyO1xuICB9XG5cbiAgdmFyIGVsID0gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/ICQoJyMnICsgbm9ybWFsaXplSWQoaWQpKSA6IGlkO1xuXG4gIGlmICghaXNFbChlbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZWxlbWVudCBvciBJRCBzdXBwbGllZCBpcyBub3QgdmFsaWQuICh2aWRlb2pzKScpO1xuICB9XG5cbiAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKSkge1xuICAgIGxvZyQxLndhcm4oJ1RoZSBlbGVtZW50IHN1cHBsaWVkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRE9NJyk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2aWRlb2pzLmhvb2tzKCdiZWZvcmVzZXR1cCcpLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGdW5jdGlvbikge1xuICAgIHZhciBvcHRzID0gaG9va0Z1bmN0aW9uKGVsLCBtZXJnZU9wdGlvbnMob3B0aW9ucykpO1xuXG4gICAgaWYgKCFpc09iamVjdChvcHRzKSB8fCBBcnJheS5pc0FycmF5KG9wdHMpKSB7XG4gICAgICBsb2ckMS5lcnJvcigncGxlYXNlIHJldHVybiBhbiBvYmplY3QgaW4gYmVmb3Jlc2V0dXAgaG9va3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIG9wdHMpO1xuICB9KTtcblxuICAvLyBXZSBnZXQgdGhlIGN1cnJlbnQgXCJQbGF5ZXJcIiBjb21wb25lbnQgaGVyZSBpbiBjYXNlIGFuIGludGVncmF0aW9uIGhhc1xuICAvLyByZXBsYWNlZCBpdCB3aXRoIGEgY3VzdG9tIHBsYXllci5cbiAgdmFyIFBsYXllckNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoJ1BsYXllcicpO1xuXG4gIHBsYXllciA9IG5ldyBQbGF5ZXJDb21wb25lbnQoZWwsIG9wdGlvbnMsIHJlYWR5KTtcblxuICB2aWRlb2pzLmhvb2tzKCdzZXR1cCcpLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGdW5jdGlvbikge1xuICAgIHJldHVybiBob29rRnVuY3Rpb24ocGxheWVyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn1cblxuLyoqXG4gKiBBbiBPYmplY3QgdGhhdCBjb250YWlucyBsaWZlY3ljbGUgaG9va3MgYXMga2V5cyB3aGljaCBwb2ludCB0byBhbiBhcnJheVxuICogb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biB3aGVuIGEgbGlmZWN5Y2xlIGlzIHRyaWdnZXJlZFxuICovXG52aWRlb2pzLmhvb2tzXyA9IHt9O1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgaG9va3MgZm9yIGEgc3BlY2lmaWMgbGlmZWN5Y2xlXG4gKiBAZnVuY3Rpb24gdmlkZW9qcy5ob29rc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgdGhlIGxpZmVjeWxlIHRvIGdldCBob29rcyBmcm9tXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbZm5dXG4gKiAgICAgICAgT3B0aW9uYWxseSBhZGQgYSBob29rIChvciBob29rcykgdG8gdGhlIGxpZmVjeWNsZSB0aGF0IHlvdXIgYXJlIGdldHRpbmcuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiAgICAgICAgIGFuIGFycmF5IG9mIGhvb2tzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm9uZS5cbiAqL1xudmlkZW9qcy5ob29rcyA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICB2aWRlb2pzLmhvb2tzX1t0eXBlXSA9IHZpZGVvanMuaG9va3NfW3R5cGVdIHx8IFtdO1xuICBpZiAoZm4pIHtcbiAgICB2aWRlb2pzLmhvb2tzX1t0eXBlXSA9IHZpZGVvanMuaG9va3NfW3R5cGVdLmNvbmNhdChmbik7XG4gIH1cbiAgcmV0dXJuIHZpZGVvanMuaG9va3NfW3R5cGVdO1xufTtcblxuLyoqXG4gKiBBZGQgYSBmdW5jdGlvbiBob29rIHRvIGEgc3BlY2lmaWMgdmlkZW9qcyBsaWZlY3ljbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICB0aGUgbGlmZWN5Y2xlIHRvIGhvb2sgdGhlIGZ1bmN0aW9uIHRvLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258RnVuY3Rpb25bXX1cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGF0dGFjaC5cbiAqL1xudmlkZW9qcy5ob29rID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIHZpZGVvanMuaG9va3ModHlwZSwgZm4pO1xufTtcblxuLyoqXG4gKiBBZGQgYSBmdW5jdGlvbiBob29rIHRoYXQgd2lsbCBvbmx5IHJ1biBvbmNlIHRvIGEgc3BlY2lmaWMgdmlkZW9qcyBsaWZlY3ljbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICB0aGUgbGlmZWN5Y2xlIHRvIGhvb2sgdGhlIGZ1bmN0aW9uIHRvLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258RnVuY3Rpb25bXX1cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGF0dGFjaC5cbiAqL1xudmlkZW9qcy5ob29rT25jZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICB2aWRlb2pzLmhvb2tzKHR5cGUsIFtdLmNvbmNhdChmbikubWFwKGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgIHZpZGVvanMucmVtb3ZlSG9vayh0eXBlLCB3cmFwcGVyKTtcbiAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGhvb2sgZnJvbSBhIHNwZWNpZmljIHZpZGVvanMgbGlmZWN5Y2xlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgdGhlIGxpZmVjeWNsZSB0aGF0IHRoZSBmdW5jdGlvbiBob29rZWQgdG9cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogICAgICAgIFRoZSBob29rZWQgZnVuY3Rpb24gdG8gcmVtb3ZlXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHJlbW92ZWQgb3IgdW5kZWZcbiAqL1xudmlkZW9qcy5yZW1vdmVIb29rID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIHZhciBpbmRleCA9IHZpZGVvanMuaG9va3ModHlwZSkuaW5kZXhPZihmbik7XG5cbiAgaWYgKGluZGV4IDw9IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmlkZW9qcy5ob29rc19bdHlwZV0gPSB2aWRlb2pzLmhvb2tzX1t0eXBlXS5zbGljZSgpO1xuICB2aWRlb2pzLmhvb2tzX1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gQWRkIGRlZmF1bHQgc3R5bGVzXG5pZiAod2luZG93LlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSAhPT0gdHJ1ZSAmJiBpc1JlYWwoKSkge1xuICB2YXIgc3R5bGUgPSAkKCcudmpzLXN0eWxlcy1kZWZhdWx0cycpO1xuXG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudCgndmpzLXN0eWxlcy1kZWZhdWx0cycpO1xuICAgIHZhciBoZWFkID0gJCgnaGVhZCcpO1xuXG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzZXRUZXh0Q29udGVudChzdHlsZSwgJ1xcbiAgICAgIC52aWRlby1qcyB7XFxuICAgICAgICB3aWR0aDogMzAwcHg7XFxuICAgICAgICBoZWlnaHQ6IDE1MHB4O1xcbiAgICAgIH1cXG5cXG4gICAgICAudmpzLWZsdWlkIHtcXG4gICAgICAgIHBhZGRpbmctdG9wOiA1Ni4yNSVcXG4gICAgICB9XFxuICAgICcpO1xuICB9XG59XG5cbi8vIFJ1biBBdXRvLWxvYWQgcGxheWVyc1xuLy8gWW91IGhhdmUgdG8gd2FpdCBhdCBsZWFzdCBvbmNlIGluIGNhc2UgdGhpcyBzY3JpcHQgaXMgbG9hZGVkIGFmdGVyIHlvdXJcbi8vIHZpZGVvIGluIHRoZSBET00gKHdlaXJkIGJlaGF2aW9yIG9ubHkgd2l0aCBtaW5pZmllZCB2ZXJzaW9uKVxuYXV0b1NldHVwVGltZW91dCgxLCB2aWRlb2pzKTtcblxuLyoqXG4gKiBDdXJyZW50IHNvZnR3YXJlIHZlcnNpb24uIEZvbGxvd3Mgc2VtdmVyLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbnZpZGVvanMuVkVSU0lPTiA9IHZlcnNpb247XG5cbi8qKlxuICogVGhlIGdsb2JhbCBvcHRpb25zIG9iamVjdC4gVGhlc2UgYXJlIHRoZSBzZXR0aW5ncyB0aGF0IHRha2UgZWZmZWN0XG4gKiBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3aGVuIHRoZSBwbGF5ZXIgaXMgY3JlYXRlZC5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG52aWRlb2pzLm9wdGlvbnMgPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfO1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudGx5IGNyZWF0ZWQgcGxheWVycywga2V5ZWQgYnkgcGxheWVyIElEXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBUaGUgY3JlYXRlZCBwbGF5ZXJzXG4gKi9cbnZpZGVvanMuZ2V0UGxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFBsYXllci5wbGF5ZXJzO1xufTtcblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgcGxheWVyIGJhc2VkIG9uIGFuIElEIG9yIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIGlmIGFuIGVsZW1lbnQgb3IgSUQgaGFzIGFuIGFzc29jaWF0ZWRcbiAqIFZpZGVvLmpzIHBsYXllciwgYnV0IG5vdCBjcmVhdGUgb25lIGlmIGl0IGRvZXNuJ3QuXG4gKlxuICogQHBhcmFtICAge3N0cmluZ3xFbGVtZW50fSBpZFxuICogICAgICAgICAgQW4gSFRNTCBlbGVtZW50IC0gYDx2aWRlbz5gLCBgPGF1ZGlvPmAsIG9yIGA8dmlkZW8tanM+YCAtXG4gKiAgICAgICAgICBvciBhIHN0cmluZyBtYXRjaGluZyB0aGUgYGlkYCBvZiBzdWNoIGFuIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge1BsYXllcnx1bmRlZmluZWR9XG4gKiAgICAgICAgICBBIHBsYXllciBpbnN0YW5jZSBvciBgdW5kZWZpbmVkYCBpZiB0aGVyZSBpcyBubyBwbGF5ZXIgaW5zdGFuY2VcbiAqICAgICAgICAgIG1hdGNoaW5nIHRoZSBhcmd1bWVudC5cbiAqL1xudmlkZW9qcy5nZXRQbGF5ZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgdmFyIHBsYXllcnMgPSBQbGF5ZXIucGxheWVycztcbiAgdmFyIHRhZyA9IHZvaWQgMDtcblxuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIHZhciBuSWQgPSBub3JtYWxpemVJZChpZCk7XG4gICAgdmFyIHBsYXllciA9IHBsYXllcnNbbklkXTtcblxuICAgIGlmIChwbGF5ZXIpIHtcbiAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuXG4gICAgdGFnID0gJCgnIycgKyBuSWQpO1xuICB9IGVsc2Uge1xuICAgIHRhZyA9IGlkO1xuICB9XG5cbiAgaWYgKGlzRWwodGFnKSkge1xuICAgIHZhciBfdGFnID0gdGFnLFxuICAgICAgICBfcGxheWVyID0gX3RhZy5wbGF5ZXIsXG4gICAgICAgIHBsYXllcklkID0gX3RhZy5wbGF5ZXJJZDtcblxuICAgIC8vIEVsZW1lbnQgbWF5IGhhdmUgYSBgcGxheWVyYCBwcm9wZXJ0eSByZWZlcnJpbmcgdG8gYW4gYWxyZWFkeSBjcmVhdGVkXG4gICAgLy8gcGxheWVyIGluc3RhbmNlLiBJZiBzbywgcmV0dXJuIHRoYXQuXG5cbiAgICBpZiAoX3BsYXllciB8fCBwbGF5ZXJzW3BsYXllcklkXSkge1xuICAgICAgcmV0dXJuIF9wbGF5ZXIgfHwgcGxheWVyc1twbGF5ZXJJZF07XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnQgcGxheWVycy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqICAgICAgICAgQW4gYXJyYXkgb2YgYWxsIHBsYXllcnMuIFRoZSBhcnJheSB3aWxsIGJlIGluIHRoZSBvcmRlciB0aGF0XG4gKiAgICAgICAgIGBPYmplY3Qua2V5c2AgcHJvdmlkZXMsIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IHZhcnkgYmV0d2VlblxuICogICAgICAgICBKYXZhU2NyaXB0IGVuZ2luZXMuXG4gKlxuICovXG52aWRlb2pzLmdldEFsbFBsYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoXG5cbiAgICAvLyBEaXNwb3NlZCBwbGF5ZXJzIGxlYXZlIGEga2V5IHdpdGggYSBgbnVsbGAgdmFsdWUsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlXG4gICAgLy8gd2UgZmlsdGVyIHRob3NlIG91dC5cbiAgICBPYmplY3Qua2V5cyhQbGF5ZXIucGxheWVycykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gUGxheWVyLnBsYXllcnNba107XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBwbGF5ZXJzIG9iamVjdC5cbiAqXG4gKiBAbWVtYmVyT2YgdmlkZW9qc1xuICogQHByb3BlcnR5IHtPYmplY3R9IHBsYXllcnNcbiAqL1xudmlkZW9qcy5wbGF5ZXJzID0gUGxheWVyLnBsYXllcnM7XG5cbi8qKlxuICogR2V0IGEgY29tcG9uZW50IGNsYXNzIG9iamVjdCBieSBuYW1lXG4gKlxuICogQGJvcnJvd3MgQ29tcG9uZW50LmdldENvbXBvbmVudCBhcyB2aWRlb2pzLmdldENvbXBvbmVudFxuICovXG52aWRlb2pzLmdldENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjb21wb25lbnQgc28gaXQgY2FuIHJlZmVycmVkIHRvIGJ5IG5hbWUuIFVzZWQgd2hlbiBhZGRpbmcgdG8gb3RoZXJcbiAqIGNvbXBvbmVudHMsIGVpdGhlciB0aHJvdWdoIGFkZENoaWxkIGBjb21wb25lbnQuYWRkQ2hpbGQoJ215Q29tcG9uZW50JylgIG9yIHRocm91Z2hcbiAqIGRlZmF1bHQgY2hpbGRyZW4gb3B0aW9ucyAgYHsgY2hpbGRyZW46IFsnbXlDb21wb25lbnQnXSB9YC5cbiAqXG4gKiA+IE5PVEU6IFlvdSBjb3VsZCBhbHNvIGp1c3QgaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGJlZm9yZSBhZGRpbmcuXG4gKiBgY29tcG9uZW50LmFkZENoaWxkKG5ldyBNeUNvbXBvbmVudCgpKTtgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBcbiAqICAgICAgICBUaGUgY29tcG9uZW50IGNsYXNzXG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICogICAgICAgICBUaGUgbmV3bHkgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqL1xudmlkZW9qcy5yZWdpc3RlckNvbXBvbmVudCA9IGZ1bmN0aW9uIChuYW1lJCQxLCBjb21wKSB7XG4gIGlmIChUZWNoLmlzVGVjaChjb21wKSkge1xuICAgIGxvZyQxLndhcm4oJ1RoZSAnICsgbmFtZSQkMSArICcgdGVjaCB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbXBvbmVudC4gSXQgc2hvdWxkIGluc3RlYWQgYmUgcmVnaXN0ZXJlZCB1c2luZyB2aWRlb2pzLnJlZ2lzdGVyVGVjaChuYW1lLCB0ZWNoKScpO1xuICB9XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50LmNhbGwoQ29tcG9uZW50LCBuYW1lJCQxLCBjb21wKTtcbn07XG5cbi8qKlxuICogR2V0IGEgVGVjaCBjbGFzcyBvYmplY3QgYnkgbmFtZVxuICpcbiAqIEBib3Jyb3dzIFRlY2guZ2V0VGVjaCBhcyB2aWRlb2pzLmdldFRlY2hcbiAqL1xudmlkZW9qcy5nZXRUZWNoID0gVGVjaC5nZXRUZWNoO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgVGVjaCBzbyBpdCBjYW4gcmVmZXJyZWQgdG8gYnkgbmFtZS5cbiAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgdGVjaCBvcmRlciBmb3IgdGhlIHBsYXllci5cbiAqXG4gKiBAYm9ycm93cyBUZWNoLnJlZ2lzdGVyVGVjaCBhcyB2aWRlb2pzLnJlZ2lzdGVyVGVjaFxuICovXG52aWRlb2pzLnJlZ2lzdGVyVGVjaCA9IFRlY2gucmVnaXN0ZXJUZWNoO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbWlkZGxld2FyZSB0byBhIHNvdXJjZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIE1JTUUgdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ocGxheWVyKTpvYmplY3R9IG1pZGRsZXdhcmUgQSBtaWRkbGV3YXJlIGZhY3RvcnkgdGhhdCB0YWtlcyBhIHBsYXllci5cbiAqL1xudmlkZW9qcy51c2UgPSB1c2U7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IGEgbWlkZGxld2FyZSB0byBzaWduaWZ5XG4gKiB0aGF0IHRoZSBtaWRkbGV3YXJlIGlzIGJlaW5nIHRlcm1pbmF0ZWQuXG4gKlxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJPZiB7dmlkZW9qc31cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtaWRkbGV3YXJlLlRFUk1JTkFUT1JcbiAqL1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgaW4gSUU4XG5pZiAoIUlTX0lFOCAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZGVvanMsICdtaWRkbGV3YXJlJywge1xuICAgIHZhbHVlOiB7fSxcbiAgICB3cml0ZWFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZGVvanMubWlkZGxld2FyZSwgJ1RFUk1JTkFUT1InLCB7XG4gICAgdmFsdWU6IFRFUk1JTkFUT1IsXG4gICAgd3JpdGVhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufSBlbHNlIHtcbiAgdmlkZW9qcy5taWRkbGV3YXJlID0geyBURVJNSU5BVE9SOiBURVJNSU5BVE9SIH07XG59XG5cbi8qKlxuICogQSBzdWl0ZSBvZiBicm93c2VyIGFuZCBkZXZpY2UgdGVzdHMgZnJvbSB7QGxpbmsgYnJvd3Nlcn0uXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbnZpZGVvanMuYnJvd3NlciA9IGJyb3dzZXI7XG5cbi8qKlxuICogV2hldGhlciBvciBub3QgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdG91Y2ggZXZlbnRzLiBJbmNsdWRlZCBmb3IgYmFja3dhcmRcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCA0LngsIGJ1dCBkZXByZWNhdGVkLiBVc2UgYHZpZGVvanMuYnJvd3Nlci5UT1VDSF9FTkFCTEVEYFxuICogaW5zdGVhZCBnb2luZyBmb3J3YXJkLlxuICpcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gNS4wXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqL1xudmlkZW9qcy5UT1VDSF9FTkFCTEVEID0gVE9VQ0hfRU5BQkxFRDtcblxuLyoqXG4gKiBTdWJjbGFzcyBhbiBleGlzdGluZyBjbGFzc1xuICogTWltaWNzIEVTNiBzdWJjbGFzc2luZyB3aXRoIHRoZSBgZXh0ZW5kYCBrZXl3b3JkXG4gKlxuICogQGJvcnJvd3MgZXh0ZW5kOmV4dGVuZEZuIGFzIHZpZGVvanMuZXh0ZW5kXG4gKi9cbnZpZGVvanMuZXh0ZW5kID0gZXh0ZW5kRm47XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbnMgb2JqZWN0cyByZWN1cnNpdmVseVxuICogUGVyZm9ybXMgYSBkZWVwIG1lcmdlIGxpa2UgbG9kYXNoLm1lcmdlIGJ1dCAqKm9ubHkgbWVyZ2VzIHBsYWluIG9iamVjdHMqKlxuICogKG5vdCBhcnJheXMsIGVsZW1lbnRzLCBhbnl0aGluZyBlbHNlKVxuICogT3RoZXIgdmFsdWVzIHdpbGwgYmUgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIHNlY29uZCBvYmplY3QuXG4gKlxuICogQGJvcnJvd3MgbWVyZ2Utb3B0aW9uczptZXJnZU9wdGlvbnMgYXMgdmlkZW9qcy5tZXJnZU9wdGlvbnNcbiAqL1xudmlkZW9qcy5tZXJnZU9wdGlvbnMgPSBtZXJnZU9wdGlvbnM7XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBjb250ZXh0ICh0aGlzKSBvZiBhIGZ1bmN0aW9uXG4gKlxuICogPiBOT1RFOiBhcyBvZiB2NS4wIHdlIHJlcXVpcmUgYW4gRVM1IHNoaW0sIHNvIHlvdSBzaG91bGQgdXNlIHRoZSBuYXRpdmVcbiAqIGBmdW5jdGlvbigpIHt9LmJpbmQobmV3Q29udGV4dCk7YCBpbnN0ZWFkIG9mIHRoaXMuXG4gKlxuICogQGJvcnJvd3MgZm46YmluZCBhcyB2aWRlb2pzLmJpbmRcbiAqL1xudmlkZW9qcy5iaW5kID0gYmluZDtcblxuLyoqXG4gKiBSZWdpc3RlciBhIFZpZGVvLmpzIHBsdWdpbi5cbiAqXG4gKiBAYm9ycm93cyBwbHVnaW46cmVnaXN0ZXJQbHVnaW4gYXMgdmlkZW9qcy5yZWdpc3RlclBsdWdpblxuICogQG1ldGhvZCByZWdpc3RlclBsdWdpblxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRvIGJlIHJlZ2lzdGVyZWQuIE11c3QgYmUgYSBzdHJpbmcgYW5kXG4gKiAgICAgICAgIG11c3Qgbm90IG1hdGNoIGFuIGV4aXN0aW5nIHBsdWdpbiBvciBhIG1ldGhvZCBvbiB0aGUgYFBsYXllcmBcbiAqICAgICAgICAgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBwbHVnaW5cbiAqICAgICAgICAgQSBzdWItY2xhc3Mgb2YgYFBsdWdpbmAgb3IgYSBmdW5jdGlvbiBmb3IgYmFzaWMgcGx1Z2lucy5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgRm9yIGFkdmFuY2VkIHBsdWdpbnMsIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhhdCBwbHVnaW4uIEZvclxuICogICAgICAgICBiYXNpYyBwbHVnaW5zLCBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgcGx1Z2luLlxuICovXG52aWRlb2pzLnJlZ2lzdGVyUGx1Z2luID0gUGx1Z2luLnJlZ2lzdGVyUGx1Z2luO1xuXG4vKipcbiAqIERlcmVnaXN0ZXIgYSBWaWRlby5qcyBwbHVnaW4uXG4gKlxuICogQGJvcnJvd3MgcGx1Z2luOmRlcmVnaXN0ZXJQbHVnaW4gYXMgdmlkZW9qcy5kZXJlZ2lzdGVyUGx1Z2luXG4gKiBAbWV0aG9kIGRlcmVnaXN0ZXJQbHVnaW5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSBkZXJlZ2lzdGVyZWQuIE11c3QgYmUgYSBzdHJpbmcgYW5kXG4gKiAgICAgICAgIG11c3QgbWF0Y2ggYW4gZXhpc3RpbmcgcGx1Z2luIG9yIGEgbWV0aG9kIG9uIHRoZSBgUGxheWVyYFxuICogICAgICAgICBwcm90b3R5cGUuXG4gKlxuICovXG52aWRlb2pzLmRlcmVnaXN0ZXJQbHVnaW4gPSBQbHVnaW4uZGVyZWdpc3RlclBsdWdpbjtcblxuLyoqXG4gKiBEZXByZWNhdGVkIG1ldGhvZCB0byByZWdpc3RlciBhIHBsdWdpbiB3aXRoIFZpZGVvLmpzXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqICAgICAgICB2aWRlb2pzLnBsdWdpbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLnJlZ2lzdGVyUGx1Z2luKCkgaW5zdGVhZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiAgICAgICAgVGhlIHBsdWdpbiBuYW1lXG4gKlxuICogQHBhcmFtIHtQbHVnaW58RnVuY3Rpb259IHBsdWdpblxuICogICAgICAgICBUaGUgcGx1Z2luIHN1Yi1jbGFzcyBvciBmdW5jdGlvblxuICovXG52aWRlb2pzLnBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lJCQxLCBwbHVnaW4pIHtcbiAgbG9nJDEud2FybigndmlkZW9qcy5wbHVnaW4oKSBpcyBkZXByZWNhdGVkOyB1c2UgdmlkZW9qcy5yZWdpc3RlclBsdWdpbigpIGluc3RlYWQnKTtcbiAgcmV0dXJuIFBsdWdpbi5yZWdpc3RlclBsdWdpbihuYW1lJCQxLCBwbHVnaW4pO1xufTtcblxuLyoqXG4gKiBHZXRzIGFuIG9iamVjdCBjb250YWluaW5nIG11bHRpcGxlIFZpZGVvLmpzIHBsdWdpbnMuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IFtuYW1lc11cbiAqICAgICAgICAgSWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhbiBhcnJheSBvZiBwbHVnaW4gbmFtZXMuIERlZmF1bHRzIHRvIF9hbGxfXG4gKiAgICAgICAgIHBsdWdpbiBuYW1lcy5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBwbHVnaW4ocykgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIG5hbWUocykgb3JcbiAqICAgICAgICAgYHVuZGVmaW5lZGAgaWYgbm8gbWF0Y2hpbmcgcGx1Z2lucyBleGlzdCkuXG4gKi9cbnZpZGVvanMuZ2V0UGx1Z2lucyA9IFBsdWdpbi5nZXRQbHVnaW5zO1xuXG4vKipcbiAqIEdldHMgYSBwbHVnaW4gYnkgbmFtZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufHVuZGVmaW5lZH1cbiAqICAgICAgICAgVGhlIHBsdWdpbiAob3IgYHVuZGVmaW5lZGApLlxuICovXG52aWRlb2pzLmdldFBsdWdpbiA9IFBsdWdpbi5nZXRQbHVnaW47XG5cbi8qKlxuICogR2V0cyBhIHBsdWdpbidzIHZlcnNpb24sIGlmIGF2YWlsYWJsZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgIFRoZSBwbHVnaW4ncyB2ZXJzaW9uIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xudmlkZW9qcy5nZXRQbHVnaW5WZXJzaW9uID0gUGx1Z2luLmdldFBsdWdpblZlcnNpb247XG5cbi8qKlxuICogQWRkaW5nIGxhbmd1YWdlcyBzbyB0aGF0IHRoZXkncmUgYXZhaWxhYmxlIHRvIGFsbCBwbGF5ZXJzLlxuICogRXhhbXBsZTogYHZpZGVvanMuYWRkTGFuZ3VhZ2UoJ2VzJywgeyAnSGVsbG8nOiAnSG9sYScgfSk7YFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gKiAgICAgICAgVGhlIGxhbmd1YWdlIGNvZGUgb3IgZGljdGlvbmFyeSBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKiAgICAgICAgVGhlIGRhdGEgdmFsdWVzIHRvIGJlIHRyYW5zbGF0ZWRcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiAgICAgICAgIFRoZSByZXN1bHRpbmcgbGFuZ3VhZ2UgZGljdGlvbmFyeSBvYmplY3RcbiAqL1xudmlkZW9qcy5hZGRMYW5ndWFnZSA9IGZ1bmN0aW9uIChjb2RlLCBkYXRhKSB7XG4gIHZhciBfbWVyZ2VPcHRpb25zO1xuXG4gIGNvZGUgPSAoJycgKyBjb2RlKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHZpZGVvanMub3B0aW9ucy5sYW5ndWFnZXMgPSBtZXJnZU9wdGlvbnModmlkZW9qcy5vcHRpb25zLmxhbmd1YWdlcywgKF9tZXJnZU9wdGlvbnMgPSB7fSwgX21lcmdlT3B0aW9uc1tjb2RlXSA9IGRhdGEsIF9tZXJnZU9wdGlvbnMpKTtcblxuICByZXR1cm4gdmlkZW9qcy5vcHRpb25zLmxhbmd1YWdlc1tjb2RlXTtcbn07XG5cbi8qKlxuICogTG9nIG1lc3NhZ2VzXG4gKlxuICogQGJvcnJvd3MgbG9nOmxvZyBhcyB2aWRlb2pzLmxvZ1xuICovXG52aWRlb2pzLmxvZyA9IGxvZyQxO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW11bGF0ZWQgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAYm9ycm93cyB0aW1lLXJhbmdlczpjcmVhdGVUaW1lUmFuZ2VzIGFzIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlXG4gKi9cbi8qKlxuICogQGJvcnJvd3MgdGltZS1yYW5nZXM6Y3JlYXRlVGltZVJhbmdlcyBhcyB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZXNcbiAqL1xudmlkZW9qcy5jcmVhdGVUaW1lUmFuZ2UgPSB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZXMgPSBjcmVhdGVUaW1lUmFuZ2VzO1xuXG4vKipcbiAqIEZvcm1hdCBzZWNvbmRzIGFzIGEgdGltZSBzdHJpbmcsIEg6TU06U1Mgb3IgTTpTU1xuICogU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvc1xuICogdG8gY292ZXIgdGhlIGxlbmd0aCBvZiB0aGUgZ3VpZGVcbiAqXG4gKiBAYm9ycm93cyBmb3JtYXQtdGltZTpmb3JtYXRUaW1lIGFzIHZpZGVvanMuZm9ybWF0VGltZVxuICovXG52aWRlb2pzLmZvcm1hdFRpbWUgPSBmb3JtYXRUaW1lO1xuXG4vKipcbiAqIFJlcGxhY2VzIGZvcm1hdC10aW1lIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24sIHRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQuXG4gKlxuICogQGJvcnJvd3MgZm9ybWF0LXRpbWU6c2V0Rm9ybWF0VGltZSBhcyB2aWRlb2pzLnNldEZvcm1hdFRpbWVcbiAqXG4gKiBAbWV0aG9kIHNldEZvcm1hdFRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21GblxuICogICAgICAgIEEgY3VzdG9tIGZvcm1hdC10aW1lIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZSBhbmQgZ3VpZGUgKGluIHNlY29uZHMpIGFzIGFyZ3VtZW50cy5cbiAqICAgICAgICBQYXNzZWQgZm4gc2hvdWxkIHJldHVybiBhIHN0cmluZy5cbiAqL1xudmlkZW9qcy5zZXRGb3JtYXRUaW1lID0gc2V0Rm9ybWF0VGltZTtcblxuLyoqXG4gKiBSZXNldHMgZm9ybWF0LXRpbWUgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGJvcnJvd3MgZm9ybWF0LXRpbWU6cmVzZXRGb3JtYXRUaW1lIGFzIHZpZGVvanMucmVzZXRGb3JtYXRUaW1lXG4gKlxuICogQG1ldGhvZCByZXNldEZvcm1hdFRpbWVcbiAqL1xudmlkZW9qcy5yZXNldEZvcm1hdFRpbWUgPSByZXNldEZvcm1hdFRpbWU7XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgcGFyc2UgdGhlIGVsZW1lbnRzIG9mIGEgVVJMXG4gKlxuICogQGJvcnJvd3MgdXJsOnBhcnNlVXJsIGFzIHZpZGVvanMucGFyc2VVcmxcbiAqXG4gKi9cbnZpZGVvanMucGFyc2VVcmwgPSBwYXJzZVVybDtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVybCBwYXNzZWQgaXMgYSBjcm9zcyBkb21haW4gcmVxdWVzdCBvciBub3QuXG4gKlxuICogQGJvcnJvd3MgdXJsOmlzQ3Jvc3NPcmlnaW4gYXMgdmlkZW9qcy5pc0Nyb3NzT3JpZ2luXG4gKi9cbnZpZGVvanMuaXNDcm9zc09yaWdpbiA9IGlzQ3Jvc3NPcmlnaW47XG5cbi8qKlxuICogRXZlbnQgdGFyZ2V0IGNsYXNzLlxuICpcbiAqIEBib3Jyb3dzIEV2ZW50VGFyZ2V0IGFzIHZpZGVvanMuRXZlbnRUYXJnZXRcbiAqL1xudmlkZW9qcy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBlbGVtZW50XG4gKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3RcbiAqIGFuZCBhZGRzIGEgZ2VuZXJpYyBoYW5kbGVyIHRvIHRoZSBlbGVtZW50J3MgZXZlbnQsXG4gKiBhbG9uZyB3aXRoIGEgdW5pcXVlIGlkIChndWlkKSB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBldmVudHM6b24gYXMgdmlkZW9qcy5vblxuICovXG52aWRlb2pzLm9uID0gb247XG5cbi8qKlxuICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnRcbiAqXG4gKiBAYm9ycm93cyBldmVudHM6b25lIGFzIHZpZGVvanMub25lXG4gKi9cbnZpZGVvanMub25lID0gb25lO1xuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZyb20gYW4gZWxlbWVudFxuICpcbiAqIEBib3Jyb3dzIGV2ZW50czpvZmYgYXMgdmlkZW9qcy5vZmZcbiAqL1xudmlkZW9qcy5vZmYgPSBvZmY7XG5cbi8qKlxuICogVHJpZ2dlciBhbiBldmVudCBmb3IgYW4gZWxlbWVudFxuICpcbiAqIEBib3Jyb3dzIGV2ZW50czp0cmlnZ2VyIGFzIHZpZGVvanMudHJpZ2dlclxuICovXG52aWRlb2pzLnRyaWdnZXIgPSB0cmlnZ2VyO1xuXG4vKipcbiAqIEEgY3Jvc3MtYnJvd3NlciBYTUxIdHRwUmVxdWVzdCB3cmFwcGVyLiBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZTpcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIHNldHRpbmdzIGZvciB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJuIHtYTUxIdHRwUmVxdWVzdHxYRG9tYWluUmVxdWVzdH1cbiAqICAgICAgICAgVGhlIHJlcXVlc3Qgb2JqZWN0LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JheW5vcy94aHJcbiAqL1xudmlkZW9qcy54aHIgPSB4aHI7XG5cbi8qKlxuICogVGV4dFRyYWNrIGNsYXNzXG4gKlxuICogQGJvcnJvd3MgVGV4dFRyYWNrIGFzIHZpZGVvanMuVGV4dFRyYWNrXG4gKi9cbnZpZGVvanMuVGV4dFRyYWNrID0gVGV4dFRyYWNrO1xuXG4vKipcbiAqIGV4cG9ydCB0aGUgQXVkaW9UcmFjayBjbGFzcyBzbyB0aGF0IHNvdXJjZSBoYW5kbGVycyBjYW4gY3JlYXRlXG4gKiBBdWRpb1RyYWNrcyBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgcGxheWVycyBBdWRpb1RyYWNrTGlzdFxuICpcbiAqIEBib3Jyb3dzIEF1ZGlvVHJhY2sgYXMgdmlkZW9qcy5BdWRpb1RyYWNrXG4gKi9cbnZpZGVvanMuQXVkaW9UcmFjayA9IEF1ZGlvVHJhY2s7XG5cbi8qKlxuICogZXhwb3J0IHRoZSBWaWRlb1RyYWNrIGNsYXNzIHNvIHRoYXQgc291cmNlIGhhbmRsZXJzIGNhbiBjcmVhdGVcbiAqIFZpZGVvVHJhY2tzIGFuZCB0aGVuIGFkZCB0aGVtIHRvIHRoZSBwbGF5ZXJzIFZpZGVvVHJhY2tMaXN0XG4gKlxuICogQGJvcnJvd3MgVmlkZW9UcmFjayBhcyB2aWRlb2pzLlZpZGVvVHJhY2tcbiAqL1xudmlkZW9qcy5WaWRlb1RyYWNrID0gVmlkZW9UcmFjaztcblxuLyoqXG4gKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSBET00gZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBkb206aXNFbCBhcyB2aWRlb2pzLmlzRWxcbiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5pc0VsKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcywgdmlhIGR1Y2sgdHlwaW5nLCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIGlzIGEgdGV4dCBub2RlLlxuICpcbiAqIEBib3Jyb3dzIGRvbTppc1RleHROb2RlIGFzIHZpZGVvanMuaXNUZXh0Tm9kZVxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmlzVGV4dE5vZGUoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYW5kIGFwcGxpZXMgcHJvcGVydGllcy5cbiAqXG4gKiBAYm9ycm93cyBkb206Y3JlYXRlRWwgYXMgdmlkZW9qcy5jcmVhdGVFbFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmNyZWF0ZUVsKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqXG4gKiBAYm9ycm93cyBkb206aGFzRWxDbGFzcyBhcyB2aWRlb2pzLmhhc0NsYXNzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uaGFzQ2xhc3MoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byBhbiBlbGVtZW50XG4gKlxuICogQGJvcnJvd3MgZG9tOmFkZEVsQ2xhc3MgYXMgdmlkZW9qcy5hZGRDbGFzc1xuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmFkZENsYXNzKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG5hbWUgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQGJvcnJvd3MgZG9tOnJlbW92ZUVsQ2xhc3MgYXMgdmlkZW9qcy5yZW1vdmVDbGFzc1xuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLnJlbW92ZUNsYXNzKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWxcbiAqIGNvbmRpdGlvbiBvciB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBAYm9ycm93cyBkb206dG9nZ2xlRWxDbGFzcyBhcyB2aWRlb2pzLnRvZ2dsZUNsYXNzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20udG9nZ2xlQ2xhc3MoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBBcHBseSBhdHRyaWJ1dGVzIHRvIGFuIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBkb206c2V0RWxBdHRyaWJ1dGVzIGFzIHZpZGVvanMuc2V0QXR0cmlidXRlXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uc2V0QXR0cmlidXRlcygpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEdldCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHZhbHVlcywgYXMgZGVmaW5lZCBvbiB0aGUgSFRNTCB0YWdcbiAqIEF0dHJpYnV0ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBwcm9wZXJ0aWVzLiBUaGV5J3JlIGRlZmluZWQgb24gdGhlIHRhZ1xuICogb3Igd2l0aCBzZXRBdHRyaWJ1dGUgKHdoaWNoIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggSFRNTClcbiAqIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBvciBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBib3Jyb3dzIGRvbTpnZXRFbEF0dHJpYnV0ZXMgYXMgdmlkZW9qcy5nZXRBdHRyaWJ1dGVzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uZ2V0QXR0cmlidXRlcygpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogQGJvcnJvd3MgZG9tOmVtcHR5RWwgYXMgdmlkZW9qcy5lbXB0eUVsXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uZW1wdHlFbCgpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIGFwcGVuZHMgY29udGVudCB0byBhbiBlbGVtZW50LlxuICpcbiAqIFRoZSBjb250ZW50IGZvciBhbiBlbGVtZW50IGNhbiBiZSBwYXNzZWQgaW4gbXVsdGlwbGUgdHlwZXMgYW5kXG4gKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogLSBTdHJpbmdcbiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICpcbiAqIC0gRWxlbWVudCwgVGV4dE5vZGVcbiAqICAgUGFzc2VkIHRocm91Z2guXG4gKlxuICogLSBBcnJheVxuICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2hcbiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLlxuICpcbiAqIC0gRnVuY3Rpb25cbiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgIG5vZGUsIG9yIGFycmF5LlxuICpcbiAqIEBib3Jyb3dzIGRvbTphcHBlbmRDb250ZW50cyBhcyB2aWRlb2pzLmFwcGVuZENvbnRldFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmFwcGVuZENvbnRlbnQoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuZCBpbnNlcnRzIGNvbnRlbnQgaW50byBhbiBlbGVtZW50OyB0aGlzIGlzIGlkZW50aWNhbCB0b1xuICogYGFwcGVuZENvbnRlbnQoKWAsIGV4Y2VwdCBpdCBlbXB0aWVzIHRoZSBlbGVtZW50IGZpcnN0LlxuICpcbiAqIFRoZSBjb250ZW50IGZvciBhbiBlbGVtZW50IGNhbiBiZSBwYXNzZWQgaW4gbXVsdGlwbGUgdHlwZXMgYW5kXG4gKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogLSBTdHJpbmdcbiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICpcbiAqIC0gRWxlbWVudCwgVGV4dE5vZGVcbiAqICAgUGFzc2VkIHRocm91Z2guXG4gKlxuICogLSBBcnJheVxuICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2hcbiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLlxuICpcbiAqIC0gRnVuY3Rpb25cbiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgIG5vZGUsIG9yIGFycmF5LlxuICpcbiAqIEBib3Jyb3dzIGRvbTppbnNlcnRDb250ZW50IGFzIHZpZGVvanMuaW5zZXJ0Q29udGVudFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmluc2VydENvbnRlbnQoKSBpbnN0ZWFkXG4gKi9cblsnaXNFbCcsICdpc1RleHROb2RlJywgJ2NyZWF0ZUVsJywgJ2hhc0NsYXNzJywgJ2FkZENsYXNzJywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ3NldEF0dHJpYnV0ZXMnLCAnZ2V0QXR0cmlidXRlcycsICdlbXB0eUVsJywgJ2FwcGVuZENvbnRlbnQnLCAnaW5zZXJ0Q29udGVudCddLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgdmlkZW9qc1trXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2ckMS53YXJuKCd2aWRlb2pzLicgKyBrICsgJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLmRvbS4nICsgayArICcoKSBpbnN0ZWFkJyk7XG4gICAgcmV0dXJuIERvbVtrXS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5cbi8qKlxuICogQSBzYWZlIGdldENvbXB1dGVkU3R5bGUgd2l0aCBhbiBJRTggZmFsbGJhY2suXG4gKlxuICogVGhpcyBpcyBiZWNhdXNlIGluIEZpcmVmb3gsIGlmIHRoZSBwbGF5ZXIgaXMgbG9hZGVkIGluIGFuIGlmcmFtZSB3aXRoIGBkaXNwbGF5Om5vbmVgLFxuICogdGhlbiBgZ2V0Q29tcHV0ZWRTdHlsZWAgcmV0dXJucyBgbnVsbGAsIHNvLCB3ZSBkbyBhIG51bGwtY2hlY2sgdG8gbWFrZSBzdXJlXG4gKiB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBicmVhayBpbiB0aGVzZSBjYXNlcy5cbiAqIFNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTcgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAYm9ycm93cyBjb21wdXRlZC1zdHlsZTpjb21wdXRlZFN0eWxlIGFzIHZpZGVvanMuY29tcHV0ZWRTdHlsZVxuICovXG52aWRlb2pzLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlO1xuXG4vKipcbiAqIEV4cG9ydCB0aGUgRG9tIHV0aWxpdGllcyBmb3IgdXNlIGluIGV4dGVybmFsIHBsdWdpbnNcbiAqIGFuZCBUZWNoJ3NcbiAqL1xudmlkZW9qcy5kb20gPSBEb207XG5cbi8qKlxuICogRXhwb3J0IHRoZSBVcmwgdXRpbGl0aWVzIGZvciB1c2UgaW4gZXh0ZXJuYWwgcGx1Z2luc1xuICogYW5kIFRlY2gnc1xuICovXG52aWRlb2pzLnVybCA9IFVybDtcblxubW9kdWxlLmV4cG9ydHMgPSB2aWRlb2pzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js\n");
/***/ }),
/***/ "./node_modules/_video.js@7.6.6@video.js/dist/video-js.css":
/*!*****************************************************************!*\
!*** ./node_modules/_video.js@7.6.6@video.js/dist/video-js.css ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"6f2289d7\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\", function() {\n var newContent = __webpack_require__(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDcuNi42QHZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlby5qc0A3LjYuNkB2aWRlby5qcy9kaXN0L3ZpZGVvLWpzLmNzcz9jMWRmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi92aWRlby1qcy5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI2ZjIyODlkN1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3ZpZGVvLWpzLmNzc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi92aWRlby1qcy5jc3NcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\n");
/***/ }),
/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js":
/*!*********************************************************************************!*\
!*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Default exports for Node. Export the extended versions of VTTCue and\n// VTTRegion in Node since we likely want the capability to convert back and\n// forth between JSON. If we don't then it's not that big of a deal since we're\n// off browser.\n\nvar window = __webpack_require__(/*! global/window */ \"./node_modules/_global@4.4.0@global/window.js\");\n\nvar vttjs = module.exports = {\n WebVTT: __webpack_require__(/*! ./vtt.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js\"),\n VTTCue: __webpack_require__(/*! ./vttcue.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js\"),\n VTTRegion: __webpack_require__(/*! ./vttregion.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js\")\n};\n\nwindow.vttjs = vttjs;\nwindow.WebVTT = vttjs.WebVTT;\n\nvar cueShim = vttjs.VTTCue;\nvar regionShim = vttjs.VTTRegion;\nvar nativeVTTCue = window.VTTCue;\nvar nativeVTTRegion = window.VTTRegion;\n\nvttjs.shim = function() {\n window.VTTCue = cueShim;\n window.VTTRegion = regionShim;\n};\n\nvttjs.restore = function() {\n window.VTTCue = nativeVTTCue;\n window.VTTRegion = nativeVTTRegion;\n};\n\nif (!window.VTTCue) {\n vttjs.shim();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvYnJvd3Nlci1pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmlkZW9qcy12dHQuanNAMC4xMi42QHZpZGVvanMtdnR0LmpzL2xpYi9icm93c2VyLWluZGV4LmpzP2VkY2IiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMyB2dHQuanMgQ29udHJpYnV0b3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBEZWZhdWx0IGV4cG9ydHMgZm9yIE5vZGUuIEV4cG9ydCB0aGUgZXh0ZW5kZWQgdmVyc2lvbnMgb2YgVlRUQ3VlIGFuZFxuLy8gVlRUUmVnaW9uIGluIE5vZGUgc2luY2Ugd2UgbGlrZWx5IHdhbnQgdGhlIGNhcGFiaWxpdHkgdG8gY29udmVydCBiYWNrIGFuZFxuLy8gZm9ydGggYmV0d2VlbiBKU09OLiBJZiB3ZSBkb24ndCB0aGVuIGl0J3Mgbm90IHRoYXQgYmlnIG9mIGEgZGVhbCBzaW5jZSB3ZSdyZVxuLy8gb2ZmIGJyb3dzZXIuXG5cbnZhciB3aW5kb3cgPSByZXF1aXJlKCdnbG9iYWwvd2luZG93Jyk7XG5cbnZhciB2dHRqcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJWVFQ6IHJlcXVpcmUoXCIuL3Z0dC5qc1wiKSxcbiAgVlRUQ3VlOiByZXF1aXJlKFwiLi92dHRjdWUuanNcIiksXG4gIFZUVFJlZ2lvbjogcmVxdWlyZShcIi4vdnR0cmVnaW9uLmpzXCIpXG59O1xuXG53aW5kb3cudnR0anMgPSB2dHRqcztcbndpbmRvdy5XZWJWVFQgPSB2dHRqcy5XZWJWVFQ7XG5cbnZhciBjdWVTaGltID0gdnR0anMuVlRUQ3VlO1xudmFyIHJlZ2lvblNoaW0gPSB2dHRqcy5WVFRSZWdpb247XG52YXIgbmF0aXZlVlRUQ3VlID0gd2luZG93LlZUVEN1ZTtcbnZhciBuYXRpdmVWVFRSZWdpb24gPSB3aW5kb3cuVlRUUmVnaW9uO1xuXG52dHRqcy5zaGltID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5WVFRDdWUgPSBjdWVTaGltO1xuICB3aW5kb3cuVlRUUmVnaW9uID0gcmVnaW9uU2hpbTtcbn07XG5cbnZ0dGpzLnJlc3RvcmUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LlZUVEN1ZSA9IG5hdGl2ZVZUVEN1ZTtcbiAgd2luZG93LlZUVFJlZ2lvbiA9IG5hdGl2ZVZUVFJlZ2lvbjtcbn07XG5cbmlmICghd2luZG93LlZUVEN1ZSkge1xuICB2dHRqcy5zaGltKCk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js\n");
/***/ }),
/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js":
/*!***********************************************************************!*\
!*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\nvar _objCreate = Object.create || (function() {\n function F() {}\n return function(o) {\n if (arguments.length !== 1) {\n throw new Error('Object.create shim only accepts one parameter.');\n }\n F.prototype = o;\n return new F();\n };\n})();\n\n// Creates a new ParserError object from an errorData object. The errorData\n// object should have default code and message properties. The default message\n// property can be overriden by passing in a message parameter.\n// See ParsingError.Errors below for acceptable errors.\nfunction ParsingError(errorData, message) {\n this.name = \"ParsingError\";\n this.code = errorData.code;\n this.message = message || errorData.message;\n}\nParsingError.prototype = _objCreate(Error.prototype);\nParsingError.prototype.constructor = ParsingError;\n\n// ParsingError metadata for acceptable ParsingErrors.\nParsingError.Errors = {\n BadSignature: {\n code: 0,\n message: \"Malformed WebVTT signature.\"\n },\n BadTimeStamp: {\n code: 1,\n message: \"Malformed time stamp.\"\n }\n};\n\n// Try to parse input as a time stamp.\nfunction parseTimeStamp(input) {\n\n function computeSeconds(h, m, s, f) {\n return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;\n }\n\n var m = input.match(/^(\\d+):(\\d{2})(:\\d{2})?\\.(\\d{3})/);\n if (!m) {\n return null;\n }\n\n if (m[3]) {\n // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]\n return computeSeconds(m[1], m[2], m[3].replace(\":\", \"\"), m[4]);\n } else if (m[1] > 59) {\n // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n // First position is hours as it's over 59.\n return computeSeconds(m[1], m[2], 0, m[4]);\n } else {\n // Timestamp takes the form of [minutes]:[seconds].[milliseconds]\n return computeSeconds(0, m[1], m[2], m[4]);\n }\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nfunction Settings() {\n this.values = _objCreate(null);\n}\n\nSettings.prototype = {\n // Only accept the first assignment to any key.\n set: function(k, v) {\n if (!this.get(k) && v !== \"\") {\n this.values[k] = v;\n }\n },\n // Return the value for a key, or a default value.\n // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n // a number of possible default values as properties where 'defaultKey' is\n // the key of the property that will be chosen; otherwise it's assumed to be\n // a single value.\n get: function(k, dflt, defaultKey) {\n if (defaultKey) {\n return this.has(k) ? this.values[k] : dflt[defaultKey];\n }\n return this.has(k) ? this.values[k] : dflt;\n },\n // Check whether we have a value for a key.\n has: function(k) {\n return k in this.values;\n },\n // Accept a setting if its one of the given alternatives.\n alt: function(k, v, a) {\n for (var n = 0; n < a.length; ++n) {\n if (v === a[n]) {\n this.set(k, v);\n break;\n }\n }\n },\n // Accept a setting if its a valid (signed) integer.\n integer: function(k, v) {\n if (/^-?\\d+$/.test(v)) { // integer\n this.set(k, parseInt(v, 10));\n }\n },\n // Accept a setting if its a valid percentage.\n percent: function(k, v) {\n var m;\n if ((m = v.match(/^([\\d]{1,3})(\\.[\\d]*)?%$/))) {\n v = parseFloat(v);\n if (v >= 0 && v <= 100) {\n this.set(k, v);\n return true;\n }\n }\n return false;\n }\n};\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interprete each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n var groups = groupDelim ? input.split(groupDelim) : [input];\n for (var i in groups) {\n if (typeof groups[i] !== \"string\") {\n continue;\n }\n var kv = groups[i].split(keyValueDelim);\n if (kv.length !== 2) {\n continue;\n }\n var k = kv[0];\n var v = kv[1];\n callback(k, v);\n }\n}\n\nfunction parseCue(input, cue, regionList) {\n // Remember the original input if we need to throw an error.\n var oInput = input;\n // 4.1 WebVTT timestamp\n function consumeTimeStamp() {\n var ts = parseTimeStamp(input);\n if (ts === null) {\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed timestamp: \" + oInput);\n }\n // Remove time stamp from input.\n input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n return ts;\n }\n\n // 4.4.2 WebVTT cue settings\n function consumeCueSettings(input, cue) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"region\":\n // Find the last region we parsed with the same region id.\n for (var i = regionList.length - 1; i >= 0; i--) {\n if (regionList[i].id === v) {\n settings.set(k, regionList[i].region);\n break;\n }\n }\n break;\n case \"vertical\":\n settings.alt(k, v, [\"rl\", \"lr\"]);\n break;\n case \"line\":\n var vals = v.split(\",\"),\n vals0 = vals[0];\n settings.integer(k, vals0);\n settings.percent(k, vals0) ? settings.set(\"snapToLines\", false) : null;\n settings.alt(k, vals0, [\"auto\"]);\n if (vals.length === 2) {\n settings.alt(\"lineAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n }\n break;\n case \"position\":\n vals = v.split(\",\");\n settings.percent(k, vals[0]);\n if (vals.length === 2) {\n settings.alt(\"positionAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n }\n break;\n case \"size\":\n settings.percent(k, v);\n break;\n case \"align\":\n settings.alt(k, v, [\"start\", \"middle\", \"end\", \"left\", \"right\"]);\n break;\n }\n }, /:/, /\\s/);\n\n // Apply default values for any missing fields.\n cue.region = settings.get(\"region\", null);\n cue.vertical = settings.get(\"vertical\", \"\");\n cue.line = settings.get(\"line\", \"auto\");\n cue.lineAlign = settings.get(\"lineAlign\", \"start\");\n cue.snapToLines = settings.get(\"snapToLines\", true);\n cue.size = settings.get(\"size\", 100);\n cue.align = settings.get(\"align\", \"middle\");\n cue.position = settings.get(\"position\", {\n start: 0,\n left: 0,\n middle: 50,\n end: 100,\n right: 100\n }, cue.align);\n cue.positionAlign = settings.get(\"positionAlign\", {\n start: \"start\",\n left: \"start\",\n middle: \"middle\",\n end: \"end\",\n right: \"end\"\n }, cue.align);\n }\n\n function skipWhitespace() {\n input = input.replace(/^\\s+/, \"\");\n }\n\n // 4.1 WebVTT cue timings.\n skipWhitespace();\n cue.startTime = consumeTimeStamp(); // (1) collect cue start time\n skipWhitespace();\n if (input.substr(0, 3) !== \"-->\") { // (3) next characters must match \"-->\"\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n oInput);\n }\n input = input.substr(3);\n skipWhitespace();\n cue.endTime = consumeTimeStamp(); // (5) collect cue end time\n\n // 4.1 WebVTT cue settings list.\n skipWhitespace();\n consumeCueSettings(input, cue);\n}\n\nvar ESCAPE = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \"‎\": \"\\u200e\",\n \"‏\": \"\\u200f\",\n \" \": \"\\u00a0\"\n};\n\nvar TAG_NAME = {\n c: \"span\",\n i: \"i\",\n b: \"b\",\n u: \"u\",\n ruby: \"ruby\",\n rt: \"rt\",\n v: \"span\",\n lang: \"span\"\n};\n\nvar TAG_ANNOTATION = {\n v: \"title\",\n lang: \"lang\"\n};\n\nvar NEEDS_PARENT = {\n rt: \"ruby\"\n};\n\n// Parse content into a document fragment.\nfunction parseContent(window, input) {\n function nextToken() {\n // Check for end-of-string.\n if (!input) {\n return null;\n }\n\n // Consume 'n' characters from the input.\n function consume(result) {\n input = input.substr(result.length);\n return result;\n }\n\n var m = input.match(/^([^<]*)(<[^>]*>?)?/);\n // If there is some text before the next tag, return it, otherwise return\n // the tag.\n return consume(m[1] ? m[1] : m[2]);\n }\n\n // Unescape a string 's'.\n function unescape1(e) {\n return ESCAPE[e];\n }\n function unescape(s) {\n while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {\n s = s.replace(m[0], unescape1);\n }\n return s;\n }\n\n function shouldAdd(current, element) {\n return !NEEDS_PARENT[element.localName] ||\n NEEDS_PARENT[element.localName] === current.localName;\n }\n\n // Create an element for this tag.\n function createElement(type, annotation) {\n var tagName = TAG_NAME[type];\n if (!tagName) {\n return null;\n }\n var element = window.document.createElement(tagName);\n element.localName = tagName;\n var name = TAG_ANNOTATION[type];\n if (name && annotation) {\n element[name] = annotation.trim();\n }\n return element;\n }\n\n var rootDiv = window.document.createElement(\"div\"),\n current = rootDiv,\n t,\n tagStack = [];\n\n while ((t = nextToken()) !== null) {\n if (t[0] === '<') {\n if (t[1] === \"/\") {\n // If the closing tag matches, move back up to the parent node.\n if (tagStack.length &&\n tagStack[tagStack.length - 1] === t.substr(2).replace(\">\", \"\")) {\n tagStack.pop();\n current = current.parentNode;\n }\n // Otherwise just ignore the end tag.\n continue;\n }\n var ts = parseTimeStamp(t.substr(1, t.length - 2));\n var node;\n if (ts) {\n // Timestamps are lead nodes as well.\n node = window.document.createProcessingInstruction(\"timestamp\", ts);\n current.appendChild(node);\n continue;\n }\n var m = t.match(/^<([^.\\s/0-9>]+)(\\.[^\\s\\\\>]+)?([^>\\\\]+)?(\\\\?)>?$/);\n // If we can't parse the tag, skip to the next tag.\n if (!m) {\n continue;\n }\n // Try to construct an element, and ignore the tag if we couldn't.\n node = createElement(m[1], m[3]);\n if (!node) {\n continue;\n }\n // Determine if the tag should be added based on the context of where it\n // is placed in the cuetext.\n if (!shouldAdd(current, node)) {\n continue;\n }\n // Set the class list (as a list of classes, separated by space).\n if (m[2]) {\n node.className = m[2].substr(1).replace('.', ' ');\n }\n // Append the node to the current node, and enter the scope of the new\n // node.\n tagStack.push(m[1]);\n current.appendChild(node);\n current = node;\n continue;\n }\n\n // Text nodes are leaf nodes.\n current.appendChild(window.document.createTextNode(unescape(t)));\n }\n\n return rootDiv;\n}\n\n// This is a list of all the Unicode characters that have a strong\n// right-to-left category. What this means is that these characters are\n// written right-to-left for sure. It was generated by pulling all the strong\n// right-to-left characters out of the Unicode data table. That table can\n// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],\n [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],\n [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],\n [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],\n [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],\n [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],\n [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],\n [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],\n [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],\n [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],\n [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],\n [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],\n [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],\n [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],\n [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],\n [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],\n [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],\n [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],\n [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],\n [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],\n [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],\n [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],\n [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],\n [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],\n [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];\n\nfunction isStrongRTLChar(charCode) {\n for (var i = 0; i < strongRTLRanges.length; i++) {\n var currentRange = strongRTLRanges[i];\n if (charCode >= currentRange[0] && charCode <= currentRange[1]) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction determineBidi(cueDiv) {\n var nodeStack = [],\n text = \"\",\n charCode;\n\n if (!cueDiv || !cueDiv.childNodes) {\n return \"ltr\";\n }\n\n function pushNodes(nodeStack, node) {\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n\n function nextTextNode(nodeStack) {\n if (!nodeStack || !nodeStack.length) {\n return null;\n }\n\n var node = nodeStack.pop(),\n text = node.textContent || node.innerText;\n if (text) {\n // TODO: This should match all unicode type B characters (paragraph\n // separator characters). See issue #115.\n var m = text.match(/^.*(\\n|\\r)/);\n if (m) {\n nodeStack.length = 0;\n return m[0];\n }\n return text;\n }\n if (node.tagName === \"ruby\") {\n return nextTextNode(nodeStack);\n }\n if (node.childNodes) {\n pushNodes(nodeStack, node);\n return nextTextNode(nodeStack);\n }\n }\n\n pushNodes(nodeStack, cueDiv);\n while ((text = nextTextNode(nodeStack))) {\n for (var i = 0; i < text.length; i++) {\n charCode = text.charCodeAt(i);\n if (isStrongRTLChar(charCode)) {\n return \"rtl\";\n }\n }\n }\n return \"ltr\";\n}\n\nfunction computeLinePos(cue) {\n if (typeof cue.line === \"number\" &&\n (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {\n return cue.line;\n }\n if (!cue.track || !cue.track.textTrackList ||\n !cue.track.textTrackList.mediaElement) {\n return -1;\n }\n var track = cue.track,\n trackList = track.textTrackList,\n count = 0;\n for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {\n if (trackList[i].mode === \"showing\") {\n count++;\n }\n }\n return ++count * -1;\n}\n\nfunction StyleBox() {\n}\n\n// Apply styles to a div. If there is no div passed then it defaults to the\n// div on 'this'.\nStyleBox.prototype.applyStyles = function(styles, div) {\n div = div || this.div;\n for (var prop in styles) {\n if (styles.hasOwnProperty(prop)) {\n div.style[prop] = styles[prop];\n }\n }\n};\n\nStyleBox.prototype.formatStyle = function(val, unit) {\n return val === 0 ? 0 : val + unit;\n};\n\n// Constructs the computed display state of the cue (a div). Places the div\n// into the overlay which should be a block level element (usually a div).\nfunction CueStyleBox(window, cue, styleOptions) {\n var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n var color = \"rgba(255, 255, 255, 1)\";\n var backgroundColor = \"rgba(0, 0, 0, 0.8)\";\n\n if (isIE8) {\n color = \"rgb(255, 255, 255)\";\n backgroundColor = \"rgb(0, 0, 0)\";\n }\n\n StyleBox.call(this);\n this.cue = cue;\n\n // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will\n // have inline positioning and will function as the cue background box.\n this.cueDiv = parseContent(window, cue.text);\n var styles = {\n color: color,\n backgroundColor: backgroundColor,\n position: \"relative\",\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n display: \"inline\"\n };\n\n if (!isIE8) {\n styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\";\n styles.unicodeBidi = \"plaintext\";\n }\n this.applyStyles(styles, this.cueDiv);\n\n // Create an absolutely positioned div that will be used to position the cue\n // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS\n // mirrors of them except \"middle\" which is \"center\" in CSS.\n this.div = window.document.createElement(\"div\");\n styles = {\n textAlign: cue.align === \"middle\" ? \"center\" : cue.align,\n font: styleOptions.font,\n whiteSpace: \"pre-line\",\n position: \"absolute\"\n };\n\n if (!isIE8) {\n styles.direction = determineBidi(this.cueDiv);\n styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\".\n stylesunicodeBidi = \"plaintext\";\n }\n\n this.applyStyles(styles);\n\n this.div.appendChild(this.cueDiv);\n\n // Calculate the distance from the reference edge of the viewport to the text\n // position of the cue box. The reference edge will be resolved later when\n // the box orientation styles are applied.\n var textPos = 0;\n switch (cue.positionAlign) {\n case \"start\":\n textPos = cue.position;\n break;\n case \"middle\":\n textPos = cue.position - (cue.size / 2);\n break;\n case \"end\":\n textPos = cue.position - cue.size;\n break;\n }\n\n // Horizontal box orientation; textPos is the distance from the left edge of the\n // area to the left edge of the box and cue.size is the distance extending to\n // the right from there.\n if (cue.vertical === \"\") {\n this.applyStyles({\n left: this.formatStyle(textPos, \"%\"),\n width: this.formatStyle(cue.size, \"%\")\n });\n // Vertical box orientation; textPos is the distance from the top edge of the\n // area to the top edge of the box and cue.size is the height extending\n // downwards from there.\n } else {\n this.applyStyles({\n top: this.formatStyle(textPos, \"%\"),\n height: this.formatStyle(cue.size, \"%\")\n });\n }\n\n this.move = function(box) {\n this.applyStyles({\n top: this.formatStyle(box.top, \"px\"),\n bottom: this.formatStyle(box.bottom, \"px\"),\n left: this.formatStyle(box.left, \"px\"),\n right: this.formatStyle(box.right, \"px\"),\n height: this.formatStyle(box.height, \"px\"),\n width: this.formatStyle(box.width, \"px\")\n });\n };\n}\nCueStyleBox.prototype = _objCreate(StyleBox.prototype);\nCueStyleBox.prototype.constructor = CueStyleBox;\n\n// Represents the co-ordinates of an Element in a way that we can easily\n// compute things with such as if it overlaps or intersects with another Element.\n// Can initialize it with either a StyleBox or another BoxPosition.\nfunction BoxPosition(obj) {\n var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n\n // Either a BoxPosition was passed in and we need to copy it, or a StyleBox\n // was passed in and we need to copy the results of 'getBoundingClientRect'\n // as the object returned is readonly. All co-ordinate values are in reference\n // to the viewport origin (top left).\n var lh, height, width, top;\n if (obj.div) {\n height = obj.div.offsetHeight;\n width = obj.div.offsetWidth;\n top = obj.div.offsetTop;\n\n var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&\n rects.getClientRects && rects.getClientRects();\n obj = obj.div.getBoundingClientRect();\n // In certain cases the outter div will be slightly larger then the sum of\n // the inner div's lines. This could be due to bold text, etc, on some platforms.\n // In this case we should get the average line height and use that. This will\n // result in the desired behaviour.\n lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)\n : 0;\n\n }\n this.left = obj.left;\n this.right = obj.right;\n this.top = obj.top || top;\n this.height = obj.height || height;\n this.bottom = obj.bottom || (top + (obj.height || height));\n this.width = obj.width || width;\n this.lineHeight = lh !== undefined ? lh : obj.lineHeight;\n\n if (isIE8 && !this.lineHeight) {\n this.lineHeight = 13;\n }\n}\n\n// Move the box along a particular axis. Optionally pass in an amount to move\n// the box. If no amount is passed then the default is the line height of the\n// box.\nBoxPosition.prototype.move = function(axis, toMove) {\n toMove = toMove !== undefined ? toMove : this.lineHeight;\n switch (axis) {\n case \"+x\":\n this.left += toMove;\n this.right += toMove;\n break;\n case \"-x\":\n this.left -= toMove;\n this.right -= toMove;\n break;\n case \"+y\":\n this.top += toMove;\n this.bottom += toMove;\n break;\n case \"-y\":\n this.top -= toMove;\n this.bottom -= toMove;\n break;\n }\n};\n\n// Check if this box overlaps another box, b2.\nBoxPosition.prototype.overlaps = function(b2) {\n return this.left < b2.right &&\n this.right > b2.left &&\n this.top < b2.bottom &&\n this.bottom > b2.top;\n};\n\n// Check if this box overlaps any other boxes in boxes.\nBoxPosition.prototype.overlapsAny = function(boxes) {\n for (var i = 0; i < boxes.length; i++) {\n if (this.overlaps(boxes[i])) {\n return true;\n }\n }\n return false;\n};\n\n// Check if this box is within another box.\nBoxPosition.prototype.within = function(container) {\n return this.top >= container.top &&\n this.bottom <= container.bottom &&\n this.left >= container.left &&\n this.right <= container.right;\n};\n\n// Check if this box is entirely within the container or it is overlapping\n// on the edge opposite of the axis direction passed. For example, if \"+x\" is\n// passed and the box is overlapping on the left edge of the container, then\n// return true.\nBoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {\n switch (axis) {\n case \"+x\":\n return this.left < container.left;\n case \"-x\":\n return this.right > container.right;\n case \"+y\":\n return this.top < container.top;\n case \"-y\":\n return this.bottom > container.bottom;\n }\n};\n\n// Find the percentage of the area that this box is overlapping with another\n// box.\nBoxPosition.prototype.intersectPercentage = function(b2) {\n var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),\n y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),\n intersectArea = x * y;\n return intersectArea / (this.height * this.width);\n};\n\n// Convert the positions from this box to CSS compatible positions using\n// the reference container's positions. This has to be done because this\n// box's positions are in reference to the viewport origin, whereas, CSS\n// values are in referecne to their respective edges.\nBoxPosition.prototype.toCSSCompatValues = function(reference) {\n return {\n top: this.top - reference.top,\n bottom: reference.bottom - this.bottom,\n left: this.left - reference.left,\n right: reference.right - this.right,\n height: this.height,\n width: this.width\n };\n};\n\n// Get an object that represents the box's position without anything extra.\n// Can pass a StyleBox, HTMLElement, or another BoxPositon.\nBoxPosition.getSimpleBoxPosition = function(obj) {\n var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;\n var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;\n var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;\n\n obj = obj.div ? obj.div.getBoundingClientRect() :\n obj.tagName ? obj.getBoundingClientRect() : obj;\n var ret = {\n left: obj.left,\n right: obj.right,\n top: obj.top || top,\n height: obj.height || height,\n bottom: obj.bottom || (top + (obj.height || height)),\n width: obj.width || width\n };\n return ret;\n};\n\n// Move a StyleBox to its specified, or next best, position. The containerBox\n// is the box that contains the StyleBox, such as a div. boxPositions are\n// a list of other boxes that the styleBox can't overlap with.\nfunction moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {\n\n // Find the best position for a cue box, b, on the video. The axis parameter\n // is a list of axis, the order of which, it will move the box along. For example:\n // Passing [\"+x\", \"-x\"] will move the box first along the x axis in the positive\n // direction. If it doesn't find a good position for it there it will then move\n // it along the x axis in the negative direction.\n function findBestPosition(b, axis) {\n var bestPosition,\n specifiedPosition = new BoxPosition(b),\n percentage = 1; // Highest possible so the first thing we get is better.\n\n for (var i = 0; i < axis.length; i++) {\n while (b.overlapsOppositeAxis(containerBox, axis[i]) ||\n (b.within(containerBox) && b.overlapsAny(boxPositions))) {\n b.move(axis[i]);\n }\n // We found a spot where we aren't overlapping anything. This is our\n // best position.\n if (b.within(containerBox)) {\n return b;\n }\n var p = b.intersectPercentage(containerBox);\n // If we're outside the container box less then we were on our last try\n // then remember this position as the best position.\n if (percentage > p) {\n bestPosition = new BoxPosition(b);\n percentage = p;\n }\n // Reset the box position to the specified position.\n b = new BoxPosition(specifiedPosition);\n }\n return bestPosition || specifiedPosition;\n }\n\n var boxPosition = new BoxPosition(styleBox),\n cue = styleBox.cue,\n linePos = computeLinePos(cue),\n axis = [];\n\n // If we have a line number to align the cue to.\n if (cue.snapToLines) {\n var size;\n switch (cue.vertical) {\n case \"\":\n axis = [ \"+y\", \"-y\" ];\n size = \"height\";\n break;\n case \"rl\":\n axis = [ \"+x\", \"-x\" ];\n size = \"width\";\n break;\n case \"lr\":\n axis = [ \"-x\", \"+x\" ];\n size = \"width\";\n break;\n }\n\n var step = boxPosition.lineHeight,\n position = step * Math.round(linePos),\n maxPosition = containerBox[size] + step,\n initialAxis = axis[0];\n\n // If the specified intial position is greater then the max position then\n // clamp the box to the amount of steps it would take for the box to\n // reach the max position.\n if (Math.abs(position) > maxPosition) {\n position = position < 0 ? -1 : 1;\n position *= Math.ceil(maxPosition / step) * step;\n }\n\n // If computed line position returns negative then line numbers are\n // relative to the bottom of the video instead of the top. Therefore, we\n // need to increase our initial position by the length or width of the\n // video, depending on the writing direction, and reverse our axis directions.\n if (linePos < 0) {\n position += cue.vertical === \"\" ? containerBox.height : containerBox.width;\n axis = axis.reverse();\n }\n\n // Move the box to the specified position. This may not be its best\n // position.\n boxPosition.move(initialAxis, position);\n\n } else {\n // If we have a percentage line value for the cue.\n var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;\n\n switch (cue.lineAlign) {\n case \"middle\":\n linePos -= (calculatedPercentage / 2);\n break;\n case \"end\":\n linePos -= calculatedPercentage;\n break;\n }\n\n // Apply initial line position to the cue box.\n switch (cue.vertical) {\n case \"\":\n styleBox.applyStyles({\n top: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"rl\":\n styleBox.applyStyles({\n left: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"lr\":\n styleBox.applyStyles({\n right: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n }\n\n axis = [ \"+y\", \"-x\", \"+x\", \"-y\" ];\n\n // Get the box position again after we've applied the specified positioning\n // to it.\n boxPosition = new BoxPosition(styleBox);\n }\n\n var bestPosition = findBestPosition(boxPosition, axis);\n styleBox.move(bestPosition.toCSSCompatValues(containerBox));\n}\n\nfunction WebVTT() {\n // Nothing\n}\n\n// Helper to allow strings to be decoded instead of the default binary utf8 data.\nWebVTT.StringDecoder = function() {\n return {\n decode: function(data) {\n if (!data) {\n return \"\";\n }\n if (typeof data !== \"string\") {\n throw new Error(\"Error - expected string data.\");\n }\n return decodeURIComponent(encodeURIComponent(data));\n }\n };\n};\n\nWebVTT.convertCueToDOMTree = function(window, cuetext) {\n if (!window || !cuetext) {\n return null;\n }\n return parseContent(window, cuetext);\n};\n\nvar FONT_SIZE_PERCENT = 0.05;\nvar FONT_STYLE = \"sans-serif\";\nvar CUE_BACKGROUND_PADDING = \"1.5%\";\n\n// Runs the processing model over the cues and regions passed to it.\n// @param overlay A block level element (usually a div) that the computed cues\n// and regions will be placed into.\nWebVTT.processCues = function(window, cues, overlay) {\n if (!window || !cues || !overlay) {\n return null;\n }\n\n // Remove all previous children.\n while (overlay.firstChild) {\n overlay.removeChild(overlay.firstChild);\n }\n\n var paddedOverlay = window.document.createElement(\"div\");\n paddedOverlay.style.position = \"absolute\";\n paddedOverlay.style.left = \"0\";\n paddedOverlay.style.right = \"0\";\n paddedOverlay.style.top = \"0\";\n paddedOverlay.style.bottom = \"0\";\n paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;\n overlay.appendChild(paddedOverlay);\n\n // Determine if we need to compute the display states of the cues. This could\n // be the case if a cue's state has been changed since the last computation or\n // if it has not been computed yet.\n function shouldCompute(cues) {\n for (var i = 0; i < cues.length; i++) {\n if (cues[i].hasBeenReset || !cues[i].displayState) {\n return true;\n }\n }\n return false;\n }\n\n // We don't need to recompute the cues' display states. Just reuse them.\n if (!shouldCompute(cues)) {\n for (var i = 0; i < cues.length; i++) {\n paddedOverlay.appendChild(cues[i].displayState);\n }\n return;\n }\n\n var boxPositions = [],\n containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),\n fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;\n var styleOptions = {\n font: fontSize + \"px \" + FONT_STYLE\n };\n\n (function() {\n var styleBox, cue;\n\n for (var i = 0; i < cues.length; i++) {\n cue = cues[i];\n\n // Compute the intial position and styles of the cue div.\n styleBox = new CueStyleBox(window, cue, styleOptions);\n paddedOverlay.appendChild(styleBox.div);\n\n // Move the cue div to it's correct line position.\n moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);\n\n // Remember the computed div so that we don't have to recompute it later\n // if we don't have too.\n cue.displayState = styleBox.div;\n\n boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));\n }\n })();\n};\n\nWebVTT.Parser = function(window, vttjs, decoder) {\n if (!decoder) {\n decoder = vttjs;\n vttjs = {};\n }\n if (!vttjs) {\n vttjs = {};\n }\n\n this.window = window;\n this.vttjs = vttjs;\n this.state = \"INITIAL\";\n this.buffer = \"\";\n this.decoder = decoder || new TextDecoder(\"utf8\");\n this.regionList = [];\n};\n\nWebVTT.Parser.prototype = {\n // If the error is a ParsingError then report it to the consumer if\n // possible. If it's not a ParsingError then throw it like normal.\n reportOrThrowError: function(e) {\n if (e instanceof ParsingError) {\n this.onparsingerror && this.onparsingerror(e);\n } else {\n throw e;\n }\n },\n parse: function (data) {\n var self = this;\n\n // If there is no data then we won't decode it, but will just try to parse\n // whatever is in buffer already. This may occur in circumstances, for\n // example when flush() is called.\n if (data) {\n // Try to decode the data that we received.\n self.buffer += self.decoder.decode(data, {stream: true});\n }\n\n function collectNextLine() {\n var buffer = self.buffer;\n var pos = 0;\n while (pos < buffer.length && buffer[pos] !== '\\r' && buffer[pos] !== '\\n') {\n ++pos;\n }\n var line = buffer.substr(0, pos);\n // Advance the buffer early in case we fail below.\n if (buffer[pos] === '\\r') {\n ++pos;\n }\n if (buffer[pos] === '\\n') {\n ++pos;\n }\n self.buffer = buffer.substr(pos);\n return line;\n }\n\n // 3.4 WebVTT region and WebVTT region settings syntax\n function parseRegion(input) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"id\":\n settings.set(k, v);\n break;\n case \"width\":\n settings.percent(k, v);\n break;\n case \"lines\":\n settings.integer(k, v);\n break;\n case \"regionanchor\":\n case \"viewportanchor\":\n var xy = v.split(',');\n if (xy.length !== 2) {\n break;\n }\n // We have to make sure both x and y parse, so use a temporary\n // settings object here.\n var anchor = new Settings();\n anchor.percent(\"x\", xy[0]);\n anchor.percent(\"y\", xy[1]);\n if (!anchor.has(\"x\") || !anchor.has(\"y\")) {\n break;\n }\n settings.set(k + \"X\", anchor.get(\"x\"));\n settings.set(k + \"Y\", anchor.get(\"y\"));\n break;\n case \"scroll\":\n settings.alt(k, v, [\"up\"]);\n break;\n }\n }, /=/, /\\s/);\n\n // Create the region, using default values for any values that were not\n // specified.\n if (settings.has(\"id\")) {\n var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();\n region.width = settings.get(\"width\", 100);\n region.lines = settings.get(\"lines\", 3);\n region.regionAnchorX = settings.get(\"regionanchorX\", 0);\n region.regionAnchorY = settings.get(\"regionanchorY\", 100);\n region.viewportAnchorX = settings.get(\"viewportanchorX\", 0);\n region.viewportAnchorY = settings.get(\"viewportanchorY\", 100);\n region.scroll = settings.get(\"scroll\", \"\");\n // Register the region.\n self.onregion && self.onregion(region);\n // Remember the VTTRegion for later in case we parse any VTTCues that\n // reference it.\n self.regionList.push({\n id: settings.get(\"id\"),\n region: region\n });\n }\n }\n\n // draft-pantos-http-live-streaming-20\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5\n // 3.5 WebVTT\n function parseTimestampMap(input) {\n var settings = new Settings();\n\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"MPEGT\":\n settings.integer(k + 'S', v);\n break;\n case \"LOCA\":\n settings.set(k + 'L', parseTimeStamp(v));\n break;\n }\n }, /[^\\d]:/, /,/);\n\n self.ontimestampmap && self.ontimestampmap({\n \"MPEGTS\": settings.get(\"MPEGTS\"),\n \"LOCAL\": settings.get(\"LOCAL\")\n });\n }\n\n // 3.2 WebVTT metadata header syntax\n function parseHeader(input) {\n if (input.match(/X-TIMESTAMP-MAP/)) {\n // This line contains HLS X-TIMESTAMP-MAP metadata\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"X-TIMESTAMP-MAP\":\n parseTimestampMap(v);\n break;\n }\n }, /=/);\n } else {\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"Region\":\n // 3.3 WebVTT region metadata header syntax\n parseRegion(v);\n break;\n }\n }, /:/);\n }\n\n }\n\n // 5.1 WebVTT file parsing.\n try {\n var line;\n if (self.state === \"INITIAL\") {\n // We can't start parsing until we have the first line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n line = collectNextLine();\n\n var m = line.match(/^WEBVTT([ \\t].*)?$/);\n if (!m || !m[0]) {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n\n self.state = \"HEADER\";\n }\n\n var alreadyCollectedLine = false;\n while (self.buffer) {\n // We can't parse a line until we have the full line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n if (!alreadyCollectedLine) {\n line = collectNextLine();\n } else {\n alreadyCollectedLine = false;\n }\n\n switch (self.state) {\n case \"HEADER\":\n // 13-18 - Allow a header (metadata) under the WEBVTT line.\n if (/:/.test(line)) {\n parseHeader(line);\n } else if (!line) {\n // An empty line terminates the header and starts the body (cues).\n self.state = \"ID\";\n }\n continue;\n case \"NOTE\":\n // Ignore NOTE blocks.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n case \"ID\":\n // Check for the start of NOTE blocks.\n if (/^NOTE($|[ \\t])/.test(line)) {\n self.state = \"NOTE\";\n break;\n }\n // 19-29 - Allow any number of line terminators, then initialize new cue values.\n if (!line) {\n continue;\n }\n self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, \"\");\n self.state = \"CUE\";\n // 30-39 - Check if self line contains an optional identifier or timing data.\n if (line.indexOf(\"-->\") === -1) {\n self.cue.id = line;\n continue;\n }\n // Process line as start of a cue.\n /*falls through*/\n case \"CUE\":\n // 40 - Collect cue timings and settings.\n try {\n parseCue(line, self.cue, self.regionList);\n } catch (e) {\n self.reportOrThrowError(e);\n // In case of an error ignore rest of the cue.\n self.cue = null;\n self.state = \"BADCUE\";\n continue;\n }\n self.state = \"CUETEXT\";\n continue;\n case \"CUETEXT\":\n var hasSubstring = line.indexOf(\"-->\") !== -1;\n // 34 - If we have an empty line then report the cue.\n // 35 - If we have the special substring '-->' then report the cue,\n // but do not collect the line as we need to process the current\n // one as a new cue.\n if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n // We are done parsing self cue.\n self.oncue && self.oncue(self.cue);\n self.cue = null;\n self.state = \"ID\";\n continue;\n }\n if (self.cue.text) {\n self.cue.text += \"\\n\";\n }\n self.cue.text += line;\n continue;\n case \"BADCUE\": // BADCUE\n // 54-62 - Collect and discard the remaining cue.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n }\n }\n } catch (e) {\n self.reportOrThrowError(e);\n\n // If we are currently parsing a cue, report what we have.\n if (self.state === \"CUETEXT\" && self.cue && self.oncue) {\n self.oncue(self.cue);\n }\n self.cue = null;\n // Enter BADWEBVTT state if header was not parsed correctly otherwise\n // another exception occurred so enter BADCUE state.\n self.state = self.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n }\n return this;\n },\n flush: function () {\n var self = this;\n try {\n // Finish decoding the stream.\n self.buffer += self.decoder.decode();\n // Synthesize the end of the current cue or region.\n if (self.cue || self.state === \"HEADER\") {\n self.buffer += \"\\n\\n\";\n self.parse();\n }\n // If we've flushed, parsed, and we're still on the INITIAL state then\n // that means we don't have enough of the stream to parse the first\n // line.\n if (self.state === \"INITIAL\") {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n } catch(e) {\n self.reportOrThrowError(e);\n }\n self.onflush && self.onflush();\n return this;\n }\n};\n\nmodule.exports = WebVTT;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dC5qcz83MTYxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogLSotIE1vZGU6IEphdmE7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjLWJhc2ljLW9mZnNldDogMiAtKi0gKi9cbi8qIHZpbTogc2V0IHNoaWZ0d2lkdGg9MiB0YWJzdG9wPTIgYXV0b2luZGVudCBjaW5kZW50IGV4cGFuZHRhYjogKi9cbnZhciBfb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEYoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24obykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgc2hpbSBvbmx5IGFjY2VwdHMgb25lIHBhcmFtZXRlci4nKTtcbiAgICB9XG4gICAgRi5wcm90b3R5cGUgPSBvO1xuICAgIHJldHVybiBuZXcgRigpO1xuICB9O1xufSkoKTtcblxuLy8gQ3JlYXRlcyBhIG5ldyBQYXJzZXJFcnJvciBvYmplY3QgZnJvbSBhbiBlcnJvckRhdGEgb2JqZWN0LiBUaGUgZXJyb3JEYXRhXG4vLyBvYmplY3Qgc2hvdWxkIGhhdmUgZGVmYXVsdCBjb2RlIGFuZCBtZXNzYWdlIHByb3BlcnRpZXMuIFRoZSBkZWZhdWx0IG1lc3NhZ2Vcbi8vIHByb3BlcnR5IGNhbiBiZSBvdmVycmlkZW4gYnkgcGFzc2luZyBpbiBhIG1lc3NhZ2UgcGFyYW1ldGVyLlxuLy8gU2VlIFBhcnNpbmdFcnJvci5FcnJvcnMgYmVsb3cgZm9yIGFjY2VwdGFibGUgZXJyb3JzLlxuZnVuY3Rpb24gUGFyc2luZ0Vycm9yKGVycm9yRGF0YSwgbWVzc2FnZSkge1xuICB0aGlzLm5hbWUgPSBcIlBhcnNpbmdFcnJvclwiO1xuICB0aGlzLmNvZGUgPSBlcnJvckRhdGEuY29kZTtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCBlcnJvckRhdGEubWVzc2FnZTtcbn1cblBhcnNpbmdFcnJvci5wcm90b3R5cGUgPSBfb2JqQ3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5QYXJzaW5nRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyc2luZ0Vycm9yO1xuXG4vLyBQYXJzaW5nRXJyb3IgbWV0YWRhdGEgZm9yIGFjY2VwdGFibGUgUGFyc2luZ0Vycm9ycy5cblBhcnNpbmdFcnJvci5FcnJvcnMgPSB7XG4gIEJhZFNpZ25hdHVyZToge1xuICAgIGNvZGU6IDAsXG4gICAgbWVzc2FnZTogXCJNYWxmb3JtZWQgV2ViVlRUIHNpZ25hdHVyZS5cIlxuICB9LFxuICBCYWRUaW1lU3RhbXA6IHtcbiAgICBjb2RlOiAxLFxuICAgIG1lc3NhZ2U6IFwiTWFsZm9ybWVkIHRpbWUgc3RhbXAuXCJcbiAgfVxufTtcblxuLy8gVHJ5IHRvIHBhcnNlIGlucHV0IGFzIGEgdGltZSBzdGFtcC5cbmZ1bmN0aW9uIHBhcnNlVGltZVN0YW1wKGlucHV0KSB7XG5cbiAgZnVuY3Rpb24gY29tcHV0ZVNlY29uZHMoaCwgbSwgcywgZikge1xuICAgIHJldHVybiAoaCB8IDApICogMzYwMCArIChtIHwgMCkgKiA2MCArIChzIHwgMCkgKyAoZiB8IDApIC8gMTAwMDtcbiAgfVxuXG4gIHZhciBtID0gaW5wdXQubWF0Y2goL14oXFxkKyk6KFxcZHsyfSkoOlxcZHsyfSk/XFwuKFxcZHszfSkvKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobVszXSkge1xuICAgIC8vIFRpbWVzdGFtcCB0YWtlcyB0aGUgZm9ybSBvZiBbaG91cnNdOlttaW51dGVzXTpbc2Vjb25kc10uW21pbGxpc2Vjb25kc11cbiAgICByZXR1cm4gY29tcHV0ZVNlY29uZHMobVsxXSwgbVsyXSwgbVszXS5yZXBsYWNlKFwiOlwiLCBcIlwiKSwgbVs0XSk7XG4gIH0gZWxzZSBpZiAobVsxXSA+IDU5KSB7XG4gICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFtob3Vyc106W21pbnV0ZXNdLlttaWxsaXNlY29uZHNdXG4gICAgLy8gRmlyc3QgcG9zaXRpb24gaXMgaG91cnMgYXMgaXQncyBvdmVyIDU5LlxuICAgIHJldHVybiBjb21wdXRlU2Vjb25kcyhtWzFdLCBtWzJdLCAwLCAgbVs0XSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFttaW51dGVzXTpbc2Vjb25kc10uW21pbGxpc2Vjb25kc11cbiAgICByZXR1cm4gY29tcHV0ZVNlY29uZHMoMCwgbVsxXSwgbVsyXSwgbVs0XSk7XG4gIH1cbn1cblxuLy8gQSBzZXR0aW5ncyBvYmplY3QgaG9sZHMga2V5L3ZhbHVlIHBhaXJzIGFuZCB3aWxsIGlnbm9yZSBhbnl0aGluZyBidXQgdGhlIGZpcnN0XG4vLyBhc3NpZ25tZW50IHRvIGEgc3BlY2lmaWMga2V5LlxuZnVuY3Rpb24gU2V0dGluZ3MoKSB7XG4gIHRoaXMudmFsdWVzID0gX29iakNyZWF0ZShudWxsKTtcbn1cblxuU2V0dGluZ3MucHJvdG90eXBlID0ge1xuICAvLyBPbmx5IGFjY2VwdCB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhbnkga2V5LlxuICBzZXQ6IGZ1bmN0aW9uKGssIHYpIHtcbiAgICBpZiAoIXRoaXMuZ2V0KGspICYmIHYgIT09IFwiXCIpIHtcbiAgICAgIHRoaXMudmFsdWVzW2tdID0gdjtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybiB0aGUgdmFsdWUgZm9yIGEga2V5LCBvciBhIGRlZmF1bHQgdmFsdWUuXG4gIC8vIElmICdkZWZhdWx0S2V5JyBpcyBwYXNzZWQgdGhlbiAnZGZsdCcgaXMgYXNzdW1lZCB0byBiZSBhbiBvYmplY3Qgd2l0aFxuICAvLyBhIG51bWJlciBvZiBwb3NzaWJsZSBkZWZhdWx0IHZhbHVlcyBhcyBwcm9wZXJ0aWVzIHdoZXJlICdkZWZhdWx0S2V5JyBpc1xuICAvLyB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgY2hvc2VuOyBvdGhlcndpc2UgaXQncyBhc3N1bWVkIHRvIGJlXG4gIC8vIGEgc2luZ2xlIHZhbHVlLlxuICBnZXQ6IGZ1bmN0aW9uKGssIGRmbHQsIGRlZmF1bHRLZXkpIHtcbiAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKGspID8gdGhpcy52YWx1ZXNba10gOiBkZmx0W2RlZmF1bHRLZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXMoaykgPyB0aGlzLnZhbHVlc1trXSA6IGRmbHQ7XG4gIH0sXG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHZhbHVlIGZvciBhIGtleS5cbiAgaGFzOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgaW4gdGhpcy52YWx1ZXM7XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIG9uZSBvZiB0aGUgZ2l2ZW4gYWx0ZXJuYXRpdmVzLlxuICBhbHQ6IGZ1bmN0aW9uKGssIHYsIGEpIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IGEubGVuZ3RoOyArK24pIHtcbiAgICAgIGlmICh2ID09PSBhW25dKSB7XG4gICAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgKHNpZ25lZCkgaW50ZWdlci5cbiAgaW50ZWdlcjogZnVuY3Rpb24oaywgdikge1xuICAgIGlmICgvXi0/XFxkKyQvLnRlc3QodikpIHsgLy8gaW50ZWdlclxuICAgICAgdGhpcy5zZXQoaywgcGFyc2VJbnQodiwgMTApKTtcbiAgICB9XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgcGVyY2VudGFnZS5cbiAgcGVyY2VudDogZnVuY3Rpb24oaywgdikge1xuICAgIHZhciBtO1xuICAgIGlmICgobSA9IHYubWF0Y2goL14oW1xcZF17MSwzfSkoXFwuW1xcZF0qKT8lJC8pKSkge1xuICAgICAgdiA9IHBhcnNlRmxvYXQodik7XG4gICAgICBpZiAodiA+PSAwICYmIHYgPD0gMTAwKSB7XG4gICAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcGFyc2UgaW5wdXQgaW50byBncm91cHMgc2VwYXJhdGVkIGJ5ICdncm91cERlbGltJywgYW5kXG4vLyBpbnRlcnByZXRlIGVhY2ggZ3JvdXAgYXMgYSBrZXkvdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgJ2tleVZhbHVlRGVsaW0nLlxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKGlucHV0LCBjYWxsYmFjaywga2V5VmFsdWVEZWxpbSwgZ3JvdXBEZWxpbSkge1xuICB2YXIgZ3JvdXBzID0gZ3JvdXBEZWxpbSA/IGlucHV0LnNwbGl0KGdyb3VwRGVsaW0pIDogW2lucHV0XTtcbiAgZm9yICh2YXIgaSBpbiBncm91cHMpIHtcbiAgICBpZiAodHlwZW9mIGdyb3Vwc1tpXSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBrdiA9IGdyb3Vwc1tpXS5zcGxpdChrZXlWYWx1ZURlbGltKTtcbiAgICBpZiAoa3YubGVuZ3RoICE9PSAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGsgPSBrdlswXTtcbiAgICB2YXIgdiA9IGt2WzFdO1xuICAgIGNhbGxiYWNrKGssIHYpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3VlKGlucHV0LCBjdWUsIHJlZ2lvbkxpc3QpIHtcbiAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIGlucHV0IGlmIHdlIG5lZWQgdG8gdGhyb3cgYW4gZXJyb3IuXG4gIHZhciBvSW5wdXQgPSBpbnB1dDtcbiAgLy8gNC4xIFdlYlZUVCB0aW1lc3RhbXBcbiAgZnVuY3Rpb24gY29uc3VtZVRpbWVTdGFtcCgpIHtcbiAgICB2YXIgdHMgPSBwYXJzZVRpbWVTdGFtcChpbnB1dCk7XG4gICAgaWYgKHRzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2luZ0Vycm9yKFBhcnNpbmdFcnJvci5FcnJvcnMuQmFkVGltZVN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTWFsZm9ybWVkIHRpbWVzdGFtcDogXCIgKyBvSW5wdXQpO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgdGltZSBzdGFtcCBmcm9tIGlucHV0LlxuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXlteXFxzYS16QS1aLV0rLywgXCJcIik7XG4gICAgcmV0dXJuIHRzO1xuICB9XG5cbiAgLy8gNC40LjIgV2ViVlRUIGN1ZSBzZXR0aW5nc1xuICBmdW5jdGlvbiBjb25zdW1lQ3VlU2V0dGluZ3MoaW5wdXQsIGN1ZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncygpO1xuXG4gICAgcGFyc2VPcHRpb25zKGlucHV0LCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgc3dpdGNoIChrKSB7XG4gICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgcmVnaW9uIHdlIHBhcnNlZCB3aXRoIHRoZSBzYW1lIHJlZ2lvbiBpZC5cbiAgICAgICAgZm9yICh2YXIgaSA9IHJlZ2lvbkxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAocmVnaW9uTGlzdFtpXS5pZCA9PT0gdikge1xuICAgICAgICAgICAgc2V0dGluZ3Muc2V0KGssIHJlZ2lvbkxpc3RbaV0ucmVnaW9uKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ2ZXJ0aWNhbFwiOlxuICAgICAgICBzZXR0aW5ncy5hbHQoaywgdiwgW1wicmxcIiwgXCJsclwiXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgdmFyIHZhbHMgPSB2LnNwbGl0KFwiLFwiKSxcbiAgICAgICAgICAgIHZhbHMwID0gdmFsc1swXTtcbiAgICAgICAgc2V0dGluZ3MuaW50ZWdlcihrLCB2YWxzMCk7XG4gICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdmFsczApID8gc2V0dGluZ3Muc2V0KFwic25hcFRvTGluZXNcIiwgZmFsc2UpIDogbnVsbDtcbiAgICAgICAgc2V0dGluZ3MuYWx0KGssIHZhbHMwLCBbXCJhdXRvXCJdKTtcbiAgICAgICAgaWYgKHZhbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgc2V0dGluZ3MuYWx0KFwibGluZUFsaWduXCIsIHZhbHNbMV0sIFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwb3NpdGlvblwiOlxuICAgICAgICB2YWxzID0gdi5zcGxpdChcIixcIik7XG4gICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdmFsc1swXSk7XG4gICAgICAgIGlmICh2YWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHNldHRpbmdzLmFsdChcInBvc2l0aW9uQWxpZ25cIiwgdmFsc1sxXSwgW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNpemVcIjpcbiAgICAgICAgc2V0dGluZ3MucGVyY2VudChrLCB2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYWxpZ25cIjpcbiAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSwgLzovLCAvXFxzLyk7XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmb3IgYW55IG1pc3NpbmcgZmllbGRzLlxuICAgIGN1ZS5yZWdpb24gPSBzZXR0aW5ncy5nZXQoXCJyZWdpb25cIiwgbnVsbCk7XG4gICAgY3VlLnZlcnRpY2FsID0gc2V0dGluZ3MuZ2V0KFwidmVydGljYWxcIiwgXCJcIik7XG4gICAgY3VlLmxpbmUgPSBzZXR0aW5ncy5nZXQoXCJsaW5lXCIsIFwiYXV0b1wiKTtcbiAgICBjdWUubGluZUFsaWduID0gc2V0dGluZ3MuZ2V0KFwibGluZUFsaWduXCIsIFwic3RhcnRcIik7XG4gICAgY3VlLnNuYXBUb0xpbmVzID0gc2V0dGluZ3MuZ2V0KFwic25hcFRvTGluZXNcIiwgdHJ1ZSk7XG4gICAgY3VlLnNpemUgPSBzZXR0aW5ncy5nZXQoXCJzaXplXCIsIDEwMCk7XG4gICAgY3VlLmFsaWduID0gc2V0dGluZ3MuZ2V0KFwiYWxpZ25cIiwgXCJtaWRkbGVcIik7XG4gICAgY3VlLnBvc2l0aW9uID0gc2V0dGluZ3MuZ2V0KFwicG9zaXRpb25cIiwge1xuICAgICAgc3RhcnQ6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgbWlkZGxlOiA1MCxcbiAgICAgIGVuZDogMTAwLFxuICAgICAgcmlnaHQ6IDEwMFxuICAgIH0sIGN1ZS5hbGlnbik7XG4gICAgY3VlLnBvc2l0aW9uQWxpZ24gPSBzZXR0aW5ncy5nZXQoXCJwb3NpdGlvbkFsaWduXCIsIHtcbiAgICAgIHN0YXJ0OiBcInN0YXJ0XCIsXG4gICAgICBsZWZ0OiBcInN0YXJ0XCIsXG4gICAgICBtaWRkbGU6IFwibWlkZGxlXCIsXG4gICAgICBlbmQ6IFwiZW5kXCIsXG4gICAgICByaWdodDogXCJlbmRcIlxuICAgIH0sIGN1ZS5hbGlnbik7XG4gIH1cblxuICBmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL15cXHMrLywgXCJcIik7XG4gIH1cblxuICAvLyA0LjEgV2ViVlRUIGN1ZSB0aW1pbmdzLlxuICBza2lwV2hpdGVzcGFjZSgpO1xuICBjdWUuc3RhcnRUaW1lID0gY29uc3VtZVRpbWVTdGFtcCgpOyAgIC8vICgxKSBjb2xsZWN0IGN1ZSBzdGFydCB0aW1lXG4gIHNraXBXaGl0ZXNwYWNlKCk7XG4gIGlmIChpbnB1dC5zdWJzdHIoMCwgMykgIT09IFwiLS0+XCIpIHsgICAgIC8vICgzKSBuZXh0IGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBcIi0tPlwiXG4gICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFRpbWVTdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTWFsZm9ybWVkIHRpbWUgc3RhbXAgKHRpbWUgc3RhbXBzIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICctLT4nKTogXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgb0lucHV0KTtcbiAgfVxuICBpbnB1dCA9IGlucHV0LnN1YnN0cigzKTtcbiAgc2tpcFdoaXRlc3BhY2UoKTtcbiAgY3VlLmVuZFRpbWUgPSBjb25zdW1lVGltZVN0YW1wKCk7ICAgICAvLyAoNSkgY29sbGVjdCBjdWUgZW5kIHRpbWVcblxuICAvLyA0LjEgV2ViVlRUIGN1ZSBzZXR0aW5ncyBsaXN0LlxuICBza2lwV2hpdGVzcGFjZSgpO1xuICBjb25zdW1lQ3VlU2V0dGluZ3MoaW5wdXQsIGN1ZSk7XG59XG5cbnZhciBFU0NBUEUgPSB7XG4gIFwiJmFtcDtcIjogXCImXCIsXG4gIFwiJmx0O1wiOiBcIjxcIixcbiAgXCImZ3Q7XCI6IFwiPlwiLFxuICBcIiZscm07XCI6IFwiXFx1MjAwZVwiLFxuICBcIiZybG07XCI6IFwiXFx1MjAwZlwiLFxuICBcIiZuYnNwO1wiOiBcIlxcdTAwYTBcIlxufTtcblxudmFyIFRBR19OQU1FID0ge1xuICBjOiBcInNwYW5cIixcbiAgaTogXCJpXCIsXG4gIGI6IFwiYlwiLFxuICB1OiBcInVcIixcbiAgcnVieTogXCJydWJ5XCIsXG4gIHJ0OiBcInJ0XCIsXG4gIHY6IFwic3BhblwiLFxuICBsYW5nOiBcInNwYW5cIlxufTtcblxudmFyIFRBR19BTk5PVEFUSU9OID0ge1xuICB2OiBcInRpdGxlXCIsXG4gIGxhbmc6IFwibGFuZ1wiXG59O1xuXG52YXIgTkVFRFNfUEFSRU5UID0ge1xuICBydDogXCJydWJ5XCJcbn07XG5cbi8vIFBhcnNlIGNvbnRlbnQgaW50byBhIGRvY3VtZW50IGZyYWdtZW50LlxuZnVuY3Rpb24gcGFyc2VDb250ZW50KHdpbmRvdywgaW5wdXQpIHtcbiAgZnVuY3Rpb24gbmV4dFRva2VuKCkge1xuICAgIC8vIENoZWNrIGZvciBlbmQtb2Ytc3RyaW5nLlxuICAgIGlmICghaW5wdXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgJ24nIGNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQuXG4gICAgZnVuY3Rpb24gY29uc3VtZShyZXN1bHQpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKHJlc3VsdC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbSA9IGlucHV0Lm1hdGNoKC9eKFtePF0qKSg8W14+XSo+Pyk/Lyk7XG4gICAgLy8gSWYgdGhlcmUgaXMgc29tZSB0ZXh0IGJlZm9yZSB0aGUgbmV4dCB0YWcsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVyblxuICAgIC8vIHRoZSB0YWcuXG4gICAgcmV0dXJuIGNvbnN1bWUobVsxXSA/IG1bMV0gOiBtWzJdKTtcbiAgfVxuXG4gIC8vIFVuZXNjYXBlIGEgc3RyaW5nICdzJy5cbiAgZnVuY3Rpb24gdW5lc2NhcGUxKGUpIHtcbiAgICByZXR1cm4gRVNDQVBFW2VdO1xuICB9XG4gIGZ1bmN0aW9uIHVuZXNjYXBlKHMpIHtcbiAgICB3aGlsZSAoKG0gPSBzLm1hdGNoKC8mKGFtcHxsdHxndHxscm18cmxtfG5ic3ApOy8pKSkge1xuICAgICAgcyA9IHMucmVwbGFjZShtWzBdLCB1bmVzY2FwZTEpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEFkZChjdXJyZW50LCBlbGVtZW50KSB7XG4gICAgcmV0dXJuICFORUVEU19QQVJFTlRbZWxlbWVudC5sb2NhbE5hbWVdIHx8XG4gICAgICAgICAgIE5FRURTX1BBUkVOVFtlbGVtZW50LmxvY2FsTmFtZV0gPT09IGN1cnJlbnQubG9jYWxOYW1lO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGFuIGVsZW1lbnQgZm9yIHRoaXMgdGFnLlxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGFubm90YXRpb24pIHtcbiAgICB2YXIgdGFnTmFtZSA9IFRBR19OQU1FW3R5cGVdO1xuICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgZWxlbWVudC5sb2NhbE5hbWUgPSB0YWdOYW1lO1xuICAgIHZhciBuYW1lID0gVEFHX0FOTk9UQVRJT05bdHlwZV07XG4gICAgaWYgKG5hbWUgJiYgYW5ub3RhdGlvbikge1xuICAgICAgZWxlbWVudFtuYW1lXSA9IGFubm90YXRpb24udHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHZhciByb290RGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICBjdXJyZW50ID0gcm9vdERpdixcbiAgICAgIHQsXG4gICAgICB0YWdTdGFjayA9IFtdO1xuXG4gIHdoaWxlICgodCA9IG5leHRUb2tlbigpKSAhPT0gbnVsbCkge1xuICAgIGlmICh0WzBdID09PSAnPCcpIHtcbiAgICAgIGlmICh0WzFdID09PSBcIi9cIikge1xuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyB0YWcgbWF0Y2hlcywgbW92ZSBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKHRhZ1N0YWNrLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGFnU3RhY2tbdGFnU3RhY2subGVuZ3RoIC0gMV0gPT09IHQuc3Vic3RyKDIpLnJlcGxhY2UoXCI+XCIsIFwiXCIpKSB7XG4gICAgICAgICAgdGFnU3RhY2sucG9wKCk7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UganVzdCBpZ25vcmUgdGhlIGVuZCB0YWcuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHRzID0gcGFyc2VUaW1lU3RhbXAodC5zdWJzdHIoMSwgdC5sZW5ndGggLSAyKSk7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIGlmICh0cykge1xuICAgICAgICAvLyBUaW1lc3RhbXBzIGFyZSBsZWFkIG5vZGVzIGFzIHdlbGwuXG4gICAgICAgIG5vZGUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFwidGltZXN0YW1wXCIsIHRzKTtcbiAgICAgICAgY3VycmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbSA9IHQubWF0Y2goL148KFteLlxccy8wLTk+XSspKFxcLlteXFxzXFxcXD5dKyk/KFtePlxcXFxdKyk/KFxcXFw/KT4/JC8pO1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgdGhlIHRhZywgc2tpcCB0byB0aGUgbmV4dCB0YWcuXG4gICAgICBpZiAoIW0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUcnkgdG8gY29uc3RydWN0IGFuIGVsZW1lbnQsIGFuZCBpZ25vcmUgdGhlIHRhZyBpZiB3ZSBjb3VsZG4ndC5cbiAgICAgIG5vZGUgPSBjcmVhdGVFbGVtZW50KG1bMV0sIG1bM10pO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSB0YWcgc2hvdWxkIGJlIGFkZGVkIGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHdoZXJlIGl0XG4gICAgICAvLyBpcyBwbGFjZWQgaW4gdGhlIGN1ZXRleHQuXG4gICAgICBpZiAoIXNob3VsZEFkZChjdXJyZW50LCBub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCB0aGUgY2xhc3MgbGlzdCAoYXMgYSBsaXN0IG9mIGNsYXNzZXMsIHNlcGFyYXRlZCBieSBzcGFjZSkuXG4gICAgICBpZiAobVsyXSkge1xuICAgICAgICBub2RlLmNsYXNzTmFtZSA9IG1bMl0uc3Vic3RyKDEpLnJlcGxhY2UoJy4nLCAnICcpO1xuICAgICAgfVxuICAgICAgLy8gQXBwZW5kIHRoZSBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUsIGFuZCBlbnRlciB0aGUgc2NvcGUgb2YgdGhlIG5ld1xuICAgICAgLy8gbm9kZS5cbiAgICAgIHRhZ1N0YWNrLnB1c2gobVsxXSk7XG4gICAgICBjdXJyZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgY3VycmVudCA9IG5vZGU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUZXh0IG5vZGVzIGFyZSBsZWFmIG5vZGVzLlxuICAgIGN1cnJlbnQuYXBwZW5kQ2hpbGQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHVuZXNjYXBlKHQpKSk7XG4gIH1cblxuICByZXR1cm4gcm9vdERpdjtcbn1cblxuLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIHRoZSBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGEgc3Ryb25nXG4vLyByaWdodC10by1sZWZ0IGNhdGVnb3J5LiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB0aGVzZSBjaGFyYWN0ZXJzIGFyZVxuLy8gd3JpdHRlbiByaWdodC10by1sZWZ0IGZvciBzdXJlLiBJdCB3YXMgZ2VuZXJhdGVkIGJ5IHB1bGxpbmcgYWxsIHRoZSBzdHJvbmdcbi8vIHJpZ2h0LXRvLWxlZnQgY2hhcmFjdGVycyBvdXQgb2YgdGhlIFVuaWNvZGUgZGF0YSB0YWJsZS4gVGhhdCB0YWJsZSBjYW5cbi8vIGZvdW5kIGF0OiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxudmFyIHN0cm9uZ1JUTFJhbmdlcyA9IFtbMHg1YmUsIDB4NWJlXSwgWzB4NWMwLCAweDVjMF0sIFsweDVjMywgMHg1YzNdLCBbMHg1YzYsIDB4NWM2XSxcbiBbMHg1ZDAsIDB4NWVhXSwgWzB4NWYwLCAweDVmNF0sIFsweDYwOCwgMHg2MDhdLCBbMHg2MGIsIDB4NjBiXSwgWzB4NjBkLCAweDYwZF0sXG4gWzB4NjFiLCAweDYxYl0sIFsweDYxZSwgMHg2NGFdLCBbMHg2NmQsIDB4NjZmXSwgWzB4NjcxLCAweDZkNV0sIFsweDZlNSwgMHg2ZTZdLFxuIFsweDZlZSwgMHg2ZWZdLCBbMHg2ZmEsIDB4NzBkXSwgWzB4NzBmLCAweDcxMF0sIFsweDcxMiwgMHg3MmZdLCBbMHg3NGQsIDB4N2E1XSxcbiBbMHg3YjEsIDB4N2IxXSwgWzB4N2MwLCAweDdlYV0sIFsweDdmNCwgMHg3ZjVdLCBbMHg3ZmEsIDB4N2ZhXSwgWzB4ODAwLCAweDgxNV0sXG4gWzB4ODFhLCAweDgxYV0sIFsweDgyNCwgMHg4MjRdLCBbMHg4MjgsIDB4ODI4XSwgWzB4ODMwLCAweDgzZV0sIFsweDg0MCwgMHg4NThdLFxuIFsweDg1ZSwgMHg4NWVdLCBbMHg4YTAsIDB4OGEwXSwgWzB4OGEyLCAweDhhY10sIFsweDIwMGYsIDB4MjAwZl0sXG4gWzB4ZmIxZCwgMHhmYjFkXSwgWzB4ZmIxZiwgMHhmYjI4XSwgWzB4ZmIyYSwgMHhmYjM2XSwgWzB4ZmIzOCwgMHhmYjNjXSxcbiBbMHhmYjNlLCAweGZiM2VdLCBbMHhmYjQwLCAweGZiNDFdLCBbMHhmYjQzLCAweGZiNDRdLCBbMHhmYjQ2LCAweGZiYzFdLFxuIFsweGZiZDMsIDB4ZmQzZF0sIFsweGZkNTAsIDB4ZmQ4Zl0sIFsweGZkOTIsIDB4ZmRjN10sIFsweGZkZjAsIDB4ZmRmY10sXG4gWzB4ZmU3MCwgMHhmZTc0XSwgWzB4ZmU3NiwgMHhmZWZjXSwgWzB4MTA4MDAsIDB4MTA4MDVdLCBbMHgxMDgwOCwgMHgxMDgwOF0sXG4gWzB4MTA4MGEsIDB4MTA4MzVdLCBbMHgxMDgzNywgMHgxMDgzOF0sIFsweDEwODNjLCAweDEwODNjXSwgWzB4MTA4M2YsIDB4MTA4NTVdLFxuIFsweDEwODU3LCAweDEwODVmXSwgWzB4MTA5MDAsIDB4MTA5MWJdLCBbMHgxMDkyMCwgMHgxMDkzOV0sIFsweDEwOTNmLCAweDEwOTNmXSxcbiBbMHgxMDk4MCwgMHgxMDliN10sIFsweDEwOWJlLCAweDEwOWJmXSwgWzB4MTBhMDAsIDB4MTBhMDBdLCBbMHgxMGExMCwgMHgxMGExM10sXG4gWzB4MTBhMTUsIDB4MTBhMTddLCBbMHgxMGExOSwgMHgxMGEzM10sIFsweDEwYTQwLCAweDEwYTQ3XSwgWzB4MTBhNTAsIDB4MTBhNThdLFxuIFsweDEwYTYwLCAweDEwYTdmXSwgWzB4MTBiMDAsIDB4MTBiMzVdLCBbMHgxMGI0MCwgMHgxMGI1NV0sIFsweDEwYjU4LCAweDEwYjcyXSxcbiBbMHgxMGI3OCwgMHgxMGI3Zl0sIFsweDEwYzAwLCAweDEwYzQ4XSwgWzB4MWVlMDAsIDB4MWVlMDNdLCBbMHgxZWUwNSwgMHgxZWUxZl0sXG4gWzB4MWVlMjEsIDB4MWVlMjJdLCBbMHgxZWUyNCwgMHgxZWUyNF0sIFsweDFlZTI3LCAweDFlZTI3XSwgWzB4MWVlMjksIDB4MWVlMzJdLFxuIFsweDFlZTM0LCAweDFlZTM3XSwgWzB4MWVlMzksIDB4MWVlMzldLCBbMHgxZWUzYiwgMHgxZWUzYl0sIFsweDFlZTQyLCAweDFlZTQyXSxcbiBbMHgxZWU0NywgMHgxZWU0N10sIFsweDFlZTQ5LCAweDFlZTQ5XSwgWzB4MWVlNGIsIDB4MWVlNGJdLCBbMHgxZWU0ZCwgMHgxZWU0Zl0sXG4gWzB4MWVlNTEsIDB4MWVlNTJdLCBbMHgxZWU1NCwgMHgxZWU1NF0sIFsweDFlZTU3LCAweDFlZTU3XSwgWzB4MWVlNTksIDB4MWVlNTldLFxuIFsweDFlZTViLCAweDFlZTViXSwgWzB4MWVlNWQsIDB4MWVlNWRdLCBbMHgxZWU1ZiwgMHgxZWU1Zl0sIFsweDFlZTYxLCAweDFlZTYyXSxcbiBbMHgxZWU2NCwgMHgxZWU2NF0sIFsweDFlZTY3LCAweDFlZTZhXSwgWzB4MWVlNmMsIDB4MWVlNzJdLCBbMHgxZWU3NCwgMHgxZWU3N10sXG4gWzB4MWVlNzksIDB4MWVlN2NdLCBbMHgxZWU3ZSwgMHgxZWU3ZV0sIFsweDFlZTgwLCAweDFlZTg5XSwgWzB4MWVlOGIsIDB4MWVlOWJdLFxuIFsweDFlZWExLCAweDFlZWEzXSwgWzB4MWVlYTUsIDB4MWVlYTldLCBbMHgxZWVhYiwgMHgxZWViYl0sIFsweDEwZmZmZCwgMHgxMGZmZmRdXTtcblxuZnVuY3Rpb24gaXNTdHJvbmdSVExDaGFyKGNoYXJDb2RlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Ryb25nUlRMUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRSYW5nZSA9IHN0cm9uZ1JUTFJhbmdlc1tpXTtcbiAgICBpZiAoY2hhckNvZGUgPj0gY3VycmVudFJhbmdlWzBdICYmIGNoYXJDb2RlIDw9IGN1cnJlbnRSYW5nZVsxXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVCaWRpKGN1ZURpdikge1xuICB2YXIgbm9kZVN0YWNrID0gW10sXG4gICAgICB0ZXh0ID0gXCJcIixcbiAgICAgIGNoYXJDb2RlO1xuXG4gIGlmICghY3VlRGl2IHx8ICFjdWVEaXYuY2hpbGROb2Rlcykge1xuICAgIHJldHVybiBcImx0clwiO1xuICB9XG5cbiAgZnVuY3Rpb24gcHVzaE5vZGVzKG5vZGVTdGFjaywgbm9kZSkge1xuICAgIGZvciAodmFyIGkgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIG5vZGVTdGFjay5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFRleHROb2RlKG5vZGVTdGFjaykge1xuICAgIGlmICghbm9kZVN0YWNrIHx8ICFub2RlU3RhY2subGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IG5vZGVTdGFjay5wb3AoKSxcbiAgICAgICAgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lclRleHQ7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIG1hdGNoIGFsbCB1bmljb2RlIHR5cGUgQiBjaGFyYWN0ZXJzIChwYXJhZ3JhcGhcbiAgICAgIC8vIHNlcGFyYXRvciBjaGFyYWN0ZXJzKS4gU2VlIGlzc3VlICMxMTUuXG4gICAgICB2YXIgbSA9IHRleHQubWF0Y2goL14uKihcXG58XFxyKS8pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgbm9kZVN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGlmIChub2RlLnRhZ05hbWUgPT09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFRleHROb2RlKG5vZGVTdGFjayk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgIHB1c2hOb2Rlcyhub2RlU3RhY2ssIG5vZGUpO1xuICAgICAgcmV0dXJuIG5leHRUZXh0Tm9kZShub2RlU3RhY2spO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hOb2Rlcyhub2RlU3RhY2ssIGN1ZURpdik7XG4gIHdoaWxlICgodGV4dCA9IG5leHRUZXh0Tm9kZShub2RlU3RhY2spKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoaXNTdHJvbmdSVExDaGFyKGNoYXJDb2RlKSkge1xuICAgICAgICByZXR1cm4gXCJydGxcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwibHRyXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lUG9zKGN1ZSkge1xuICBpZiAodHlwZW9mIGN1ZS5saW5lID09PSBcIm51bWJlclwiICYmXG4gICAgICAoY3VlLnNuYXBUb0xpbmVzIHx8IChjdWUubGluZSA+PSAwICYmIGN1ZS5saW5lIDw9IDEwMCkpKSB7XG4gICAgcmV0dXJuIGN1ZS5saW5lO1xuICB9XG4gIGlmICghY3VlLnRyYWNrIHx8ICFjdWUudHJhY2sudGV4dFRyYWNrTGlzdCB8fFxuICAgICAgIWN1ZS50cmFjay50ZXh0VHJhY2tMaXN0Lm1lZGlhRWxlbWVudCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgdHJhY2sgPSBjdWUudHJhY2ssXG4gICAgICB0cmFja0xpc3QgPSB0cmFjay50ZXh0VHJhY2tMaXN0LFxuICAgICAgY291bnQgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGggJiYgdHJhY2tMaXN0W2ldICE9PSB0cmFjazsgaSsrKSB7XG4gICAgaWYgKHRyYWNrTGlzdFtpXS5tb2RlID09PSBcInNob3dpbmdcIikge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICsrY291bnQgKiAtMTtcbn1cblxuZnVuY3Rpb24gU3R5bGVCb3goKSB7XG59XG5cbi8vIEFwcGx5IHN0eWxlcyB0byBhIGRpdi4gSWYgdGhlcmUgaXMgbm8gZGl2IHBhc3NlZCB0aGVuIGl0IGRlZmF1bHRzIHRvIHRoZVxuLy8gZGl2IG9uICd0aGlzJy5cblN0eWxlQm94LnByb3RvdHlwZS5hcHBseVN0eWxlcyA9IGZ1bmN0aW9uKHN0eWxlcywgZGl2KSB7XG4gIGRpdiA9IGRpdiB8fCB0aGlzLmRpdjtcbiAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICBkaXYuc3R5bGVbcHJvcF0gPSBzdHlsZXNbcHJvcF07XG4gICAgfVxuICB9XG59O1xuXG5TdHlsZUJveC5wcm90b3R5cGUuZm9ybWF0U3R5bGUgPSBmdW5jdGlvbih2YWwsIHVuaXQpIHtcbiAgcmV0dXJuIHZhbCA9PT0gMCA/IDAgOiB2YWwgKyB1bml0O1xufTtcblxuLy8gQ29uc3RydWN0cyB0aGUgY29tcHV0ZWQgZGlzcGxheSBzdGF0ZSBvZiB0aGUgY3VlIChhIGRpdikuIFBsYWNlcyB0aGUgZGl2XG4vLyBpbnRvIHRoZSBvdmVybGF5IHdoaWNoIHNob3VsZCBiZSBhIGJsb2NrIGxldmVsIGVsZW1lbnQgKHVzdWFsbHkgYSBkaXYpLlxuZnVuY3Rpb24gQ3VlU3R5bGVCb3god2luZG93LCBjdWUsIHN0eWxlT3B0aW9ucykge1xuICB2YXIgaXNJRTggPSAoL01TSUVcXHM4XFwuMC8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBjb2xvciA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAxKVwiO1xuICB2YXIgYmFja2dyb3VuZENvbG9yID0gXCJyZ2JhKDAsIDAsIDAsIDAuOClcIjtcblxuICBpZiAoaXNJRTgpIHtcbiAgICBjb2xvciA9IFwicmdiKDI1NSwgMjU1LCAyNTUpXCI7XG4gICAgYmFja2dyb3VuZENvbG9yID0gXCJyZ2IoMCwgMCwgMClcIjtcbiAgfVxuXG4gIFN0eWxlQm94LmNhbGwodGhpcyk7XG4gIHRoaXMuY3VlID0gY3VlO1xuXG4gIC8vIFBhcnNlIG91ciBjdWUncyB0ZXh0IGludG8gYSBET00gdHJlZSByb290ZWQgYXQgJ2N1ZURpdicuIFRoaXMgZGl2IHdpbGxcbiAgLy8gaGF2ZSBpbmxpbmUgcG9zaXRpb25pbmcgYW5kIHdpbGwgZnVuY3Rpb24gYXMgdGhlIGN1ZSBiYWNrZ3JvdW5kIGJveC5cbiAgdGhpcy5jdWVEaXYgPSBwYXJzZUNvbnRlbnQod2luZG93LCBjdWUudGV4dCk7XG4gIHZhciBzdHlsZXMgPSB7XG4gICAgY29sb3I6IGNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lXCJcbiAgfTtcblxuICBpZiAoIWlzSUU4KSB7XG4gICAgc3R5bGVzLndyaXRpbmdNb2RlID0gY3VlLnZlcnRpY2FsID09PSBcIlwiID8gXCJob3Jpem9udGFsLXRiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VlLnZlcnRpY2FsID09PSBcImxyXCIgPyBcInZlcnRpY2FsLWxyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ2ZXJ0aWNhbC1ybFwiO1xuICAgIHN0eWxlcy51bmljb2RlQmlkaSA9IFwicGxhaW50ZXh0XCI7XG4gIH1cbiAgdGhpcy5hcHBseVN0eWxlcyhzdHlsZXMsIHRoaXMuY3VlRGl2KTtcblxuICAvLyBDcmVhdGUgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRpdiB0aGF0IHdpbGwgYmUgdXNlZCB0byBwb3NpdGlvbiB0aGUgY3VlXG4gIC8vIGRpdi4gTm90ZSwgYWxsIFdlYlZUVCBjdWUtc2V0dGluZyBhbGlnbm1lbnRzIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBDU1NcbiAgLy8gbWlycm9ycyBvZiB0aGVtIGV4Y2VwdCBcIm1pZGRsZVwiIHdoaWNoIGlzIFwiY2VudGVyXCIgaW4gQ1NTLlxuICB0aGlzLmRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBzdHlsZXMgPSB7XG4gICAgdGV4dEFsaWduOiBjdWUuYWxpZ24gPT09IFwibWlkZGxlXCIgPyBcImNlbnRlclwiIDogY3VlLmFsaWduLFxuICAgIGZvbnQ6IHN0eWxlT3B0aW9ucy5mb250LFxuICAgIHdoaXRlU3BhY2U6IFwicHJlLWxpbmVcIixcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gIH07XG5cbiAgaWYgKCFpc0lFOCkge1xuICAgIHN0eWxlcy5kaXJlY3Rpb24gPSBkZXRlcm1pbmVCaWRpKHRoaXMuY3VlRGl2KTtcbiAgICBzdHlsZXMud3JpdGluZ01vZGUgPSBjdWUudmVydGljYWwgPT09IFwiXCIgPyBcImhvcml6b250YWwtdGJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdWUudmVydGljYWwgPT09IFwibHJcIiA/IFwidmVydGljYWwtbHJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInZlcnRpY2FsLXJsXCIuXG4gICAgc3R5bGVzdW5pY29kZUJpZGkgPSAgXCJwbGFpbnRleHRcIjtcbiAgfVxuXG4gIHRoaXMuYXBwbHlTdHlsZXMoc3R5bGVzKTtcblxuICB0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLmN1ZURpdik7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZWZlcmVuY2UgZWRnZSBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHRleHRcbiAgLy8gcG9zaXRpb24gb2YgdGhlIGN1ZSBib3guIFRoZSByZWZlcmVuY2UgZWRnZSB3aWxsIGJlIHJlc29sdmVkIGxhdGVyIHdoZW5cbiAgLy8gdGhlIGJveCBvcmllbnRhdGlvbiBzdHlsZXMgYXJlIGFwcGxpZWQuXG4gIHZhciB0ZXh0UG9zID0gMDtcbiAgc3dpdGNoIChjdWUucG9zaXRpb25BbGlnbikge1xuICBjYXNlIFwic3RhcnRcIjpcbiAgICB0ZXh0UG9zID0gY3VlLnBvc2l0aW9uO1xuICAgIGJyZWFrO1xuICBjYXNlIFwibWlkZGxlXCI6XG4gICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbiAtIChjdWUuc2l6ZSAvIDIpO1xuICAgIGJyZWFrO1xuICBjYXNlIFwiZW5kXCI6XG4gICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbiAtIGN1ZS5zaXplO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gSG9yaXpvbnRhbCBib3ggb3JpZW50YXRpb247IHRleHRQb3MgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGVcbiAgLy8gYXJlYSB0byB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3ggYW5kIGN1ZS5zaXplIGlzIHRoZSBkaXN0YW5jZSBleHRlbmRpbmcgdG9cbiAgLy8gdGhlIHJpZ2h0IGZyb20gdGhlcmUuXG4gIGlmIChjdWUudmVydGljYWwgPT09IFwiXCIpIHtcbiAgICB0aGlzLmFwcGx5U3R5bGVzKHtcbiAgICAgIGxlZnQ6ICB0aGlzLmZvcm1hdFN0eWxlKHRleHRQb3MsIFwiJVwiKSxcbiAgICAgIHdpZHRoOiB0aGlzLmZvcm1hdFN0eWxlKGN1ZS5zaXplLCBcIiVcIilcbiAgICB9KTtcbiAgLy8gVmVydGljYWwgYm94IG9yaWVudGF0aW9uOyB0ZXh0UG9zIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGVcbiAgLy8gYXJlYSB0byB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveCBhbmQgY3VlLnNpemUgaXMgdGhlIGhlaWdodCBleHRlbmRpbmdcbiAgLy8gZG93bndhcmRzIGZyb20gdGhlcmUuXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hcHBseVN0eWxlcyh7XG4gICAgICB0b3A6IHRoaXMuZm9ybWF0U3R5bGUodGV4dFBvcywgXCIlXCIpLFxuICAgICAgaGVpZ2h0OiB0aGlzLmZvcm1hdFN0eWxlKGN1ZS5zaXplLCBcIiVcIilcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMubW92ZSA9IGZ1bmN0aW9uKGJveCkge1xuICAgIHRoaXMuYXBwbHlTdHlsZXMoe1xuICAgICAgdG9wOiB0aGlzLmZvcm1hdFN0eWxlKGJveC50b3AsIFwicHhcIiksXG4gICAgICBib3R0b206IHRoaXMuZm9ybWF0U3R5bGUoYm94LmJvdHRvbSwgXCJweFwiKSxcbiAgICAgIGxlZnQ6IHRoaXMuZm9ybWF0U3R5bGUoYm94LmxlZnQsIFwicHhcIiksXG4gICAgICByaWdodDogdGhpcy5mb3JtYXRTdHlsZShib3gucmlnaHQsIFwicHhcIiksXG4gICAgICBoZWlnaHQ6IHRoaXMuZm9ybWF0U3R5bGUoYm94LmhlaWdodCwgXCJweFwiKSxcbiAgICAgIHdpZHRoOiB0aGlzLmZvcm1hdFN0eWxlKGJveC53aWR0aCwgXCJweFwiKVxuICAgIH0pO1xuICB9O1xufVxuQ3VlU3R5bGVCb3gucHJvdG90eXBlID0gX29iakNyZWF0ZShTdHlsZUJveC5wcm90b3R5cGUpO1xuQ3VlU3R5bGVCb3gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3VlU3R5bGVCb3g7XG5cbi8vIFJlcHJlc2VudHMgdGhlIGNvLW9yZGluYXRlcyBvZiBhbiBFbGVtZW50IGluIGEgd2F5IHRoYXQgd2UgY2FuIGVhc2lseVxuLy8gY29tcHV0ZSB0aGluZ3Mgd2l0aCBzdWNoIGFzIGlmIGl0IG92ZXJsYXBzIG9yIGludGVyc2VjdHMgd2l0aCBhbm90aGVyIEVsZW1lbnQuXG4vLyBDYW4gaW5pdGlhbGl6ZSBpdCB3aXRoIGVpdGhlciBhIFN0eWxlQm94IG9yIGFub3RoZXIgQm94UG9zaXRpb24uXG5mdW5jdGlvbiBCb3hQb3NpdGlvbihvYmopIHtcbiAgdmFyIGlzSUU4ID0gKC9NU0lFXFxzOFxcLjAvKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4gIC8vIEVpdGhlciBhIEJveFBvc2l0aW9uIHdhcyBwYXNzZWQgaW4gYW5kIHdlIG5lZWQgdG8gY29weSBpdCwgb3IgYSBTdHlsZUJveFxuICAvLyB3YXMgcGFzc2VkIGluIGFuZCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlc3VsdHMgb2YgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCdcbiAgLy8gYXMgdGhlIG9iamVjdCByZXR1cm5lZCBpcyByZWFkb25seS4gQWxsIGNvLW9yZGluYXRlIHZhbHVlcyBhcmUgaW4gcmVmZXJlbmNlXG4gIC8vIHRvIHRoZSB2aWV3cG9ydCBvcmlnaW4gKHRvcCBsZWZ0KS5cbiAgdmFyIGxoLCBoZWlnaHQsIHdpZHRoLCB0b3A7XG4gIGlmIChvYmouZGl2KSB7XG4gICAgaGVpZ2h0ID0gb2JqLmRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgd2lkdGggPSBvYmouZGl2Lm9mZnNldFdpZHRoO1xuICAgIHRvcCA9IG9iai5kaXYub2Zmc2V0VG9wO1xuXG4gICAgdmFyIHJlY3RzID0gKHJlY3RzID0gb2JqLmRpdi5jaGlsZE5vZGVzKSAmJiAocmVjdHMgPSByZWN0c1swXSkgJiZcbiAgICAgICAgICAgICAgICByZWN0cy5nZXRDbGllbnRSZWN0cyAmJiByZWN0cy5nZXRDbGllbnRSZWN0cygpO1xuICAgIG9iaiA9IG9iai5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gSW4gY2VydGFpbiBjYXNlcyB0aGUgb3V0dGVyIGRpdiB3aWxsIGJlIHNsaWdodGx5IGxhcmdlciB0aGVuIHRoZSBzdW0gb2ZcbiAgICAvLyB0aGUgaW5uZXIgZGl2J3MgbGluZXMuIFRoaXMgY291bGQgYmUgZHVlIHRvIGJvbGQgdGV4dCwgZXRjLCBvbiBzb21lIHBsYXRmb3Jtcy5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGdldCB0aGUgYXZlcmFnZSBsaW5lIGhlaWdodCBhbmQgdXNlIHRoYXQuIFRoaXMgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZGVzaXJlZCBiZWhhdmlvdXIuXG4gICAgbGggPSByZWN0cyA/IE1hdGgubWF4KChyZWN0c1swXSAmJiByZWN0c1swXS5oZWlnaHQpIHx8IDAsIG9iai5oZWlnaHQgLyByZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICAgICA6IDA7XG5cbiAgfVxuICB0aGlzLmxlZnQgPSBvYmoubGVmdDtcbiAgdGhpcy5yaWdodCA9IG9iai5yaWdodDtcbiAgdGhpcy50b3AgPSBvYmoudG9wIHx8IHRvcDtcbiAgdGhpcy5oZWlnaHQgPSBvYmouaGVpZ2h0IHx8IGhlaWdodDtcbiAgdGhpcy5ib3R0b20gPSBvYmouYm90dG9tIHx8ICh0b3AgKyAob2JqLmhlaWdodCB8fCBoZWlnaHQpKTtcbiAgdGhpcy53aWR0aCA9IG9iai53aWR0aCB8fCB3aWR0aDtcbiAgdGhpcy5saW5lSGVpZ2h0ID0gbGggIT09IHVuZGVmaW5lZCA/IGxoIDogb2JqLmxpbmVIZWlnaHQ7XG5cbiAgaWYgKGlzSUU4ICYmICF0aGlzLmxpbmVIZWlnaHQpIHtcbiAgICB0aGlzLmxpbmVIZWlnaHQgPSAxMztcbiAgfVxufVxuXG4vLyBNb3ZlIHRoZSBib3ggYWxvbmcgYSBwYXJ0aWN1bGFyIGF4aXMuIE9wdGlvbmFsbHkgcGFzcyBpbiBhbiBhbW91bnQgdG8gbW92ZVxuLy8gdGhlIGJveC4gSWYgbm8gYW1vdW50IGlzIHBhc3NlZCB0aGVuIHRoZSBkZWZhdWx0IGlzIHRoZSBsaW5lIGhlaWdodCBvZiB0aGVcbi8vIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24oYXhpcywgdG9Nb3ZlKSB7XG4gIHRvTW92ZSA9IHRvTW92ZSAhPT0gdW5kZWZpbmVkID8gdG9Nb3ZlIDogdGhpcy5saW5lSGVpZ2h0O1xuICBzd2l0Y2ggKGF4aXMpIHtcbiAgY2FzZSBcIit4XCI6XG4gICAgdGhpcy5sZWZ0ICs9IHRvTW92ZTtcbiAgICB0aGlzLnJpZ2h0ICs9IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIi14XCI6XG4gICAgdGhpcy5sZWZ0IC09IHRvTW92ZTtcbiAgICB0aGlzLnJpZ2h0IC09IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIit5XCI6XG4gICAgdGhpcy50b3AgKz0gdG9Nb3ZlO1xuICAgIHRoaXMuYm90dG9tICs9IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIi15XCI6XG4gICAgdGhpcy50b3AgLT0gdG9Nb3ZlO1xuICAgIHRoaXMuYm90dG9tIC09IHRvTW92ZTtcbiAgICBicmVhaztcbiAgfVxufTtcblxuLy8gQ2hlY2sgaWYgdGhpcyBib3ggb3ZlcmxhcHMgYW5vdGhlciBib3gsIGIyLlxuQm94UG9zaXRpb24ucHJvdG90eXBlLm92ZXJsYXBzID0gZnVuY3Rpb24oYjIpIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8IGIyLnJpZ2h0ICYmXG4gICAgICAgICB0aGlzLnJpZ2h0ID4gYjIubGVmdCAmJlxuICAgICAgICAgdGhpcy50b3AgPCBiMi5ib3R0b20gJiZcbiAgICAgICAgIHRoaXMuYm90dG9tID4gYjIudG9wO1xufTtcblxuLy8gQ2hlY2sgaWYgdGhpcyBib3ggb3ZlcmxhcHMgYW55IG90aGVyIGJveGVzIGluIGJveGVzLlxuQm94UG9zaXRpb24ucHJvdG90eXBlLm92ZXJsYXBzQW55ID0gZnVuY3Rpb24oYm94ZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aGlzLm92ZXJsYXBzKGJveGVzW2ldKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIENoZWNrIGlmIHRoaXMgYm94IGlzIHdpdGhpbiBhbm90aGVyIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS53aXRoaW4gPSBmdW5jdGlvbihjb250YWluZXIpIHtcbiAgcmV0dXJuIHRoaXMudG9wID49IGNvbnRhaW5lci50b3AgJiZcbiAgICAgICAgIHRoaXMuYm90dG9tIDw9IGNvbnRhaW5lci5ib3R0b20gJiZcbiAgICAgICAgIHRoaXMubGVmdCA+PSBjb250YWluZXIubGVmdCAmJlxuICAgICAgICAgdGhpcy5yaWdodCA8PSBjb250YWluZXIucmlnaHQ7XG59O1xuXG4vLyBDaGVjayBpZiB0aGlzIGJveCBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGNvbnRhaW5lciBvciBpdCBpcyBvdmVybGFwcGluZ1xuLy8gb24gdGhlIGVkZ2Ugb3Bwb3NpdGUgb2YgdGhlIGF4aXMgZGlyZWN0aW9uIHBhc3NlZC4gRm9yIGV4YW1wbGUsIGlmIFwiK3hcIiBpc1xuLy8gcGFzc2VkIGFuZCB0aGUgYm94IGlzIG92ZXJsYXBwaW5nIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5lciwgdGhlblxuLy8gcmV0dXJuIHRydWUuXG5Cb3hQb3NpdGlvbi5wcm90b3R5cGUub3ZlcmxhcHNPcHBvc2l0ZUF4aXMgPSBmdW5jdGlvbihjb250YWluZXIsIGF4aXMpIHtcbiAgc3dpdGNoIChheGlzKSB7XG4gIGNhc2UgXCIreFwiOlxuICAgIHJldHVybiB0aGlzLmxlZnQgPCBjb250YWluZXIubGVmdDtcbiAgY2FzZSBcIi14XCI6XG4gICAgcmV0dXJuIHRoaXMucmlnaHQgPiBjb250YWluZXIucmlnaHQ7XG4gIGNhc2UgXCIreVwiOlxuICAgIHJldHVybiB0aGlzLnRvcCA8IGNvbnRhaW5lci50b3A7XG4gIGNhc2UgXCIteVwiOlxuICAgIHJldHVybiB0aGlzLmJvdHRvbSA+IGNvbnRhaW5lci5ib3R0b207XG4gIH1cbn07XG5cbi8vIEZpbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFyZWEgdGhhdCB0aGlzIGJveCBpcyBvdmVybGFwcGluZyB3aXRoIGFub3RoZXJcbi8vIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS5pbnRlcnNlY3RQZXJjZW50YWdlID0gZnVuY3Rpb24oYjIpIHtcbiAgdmFyIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnJpZ2h0LCBiMi5yaWdodCkgLSBNYXRoLm1heCh0aGlzLmxlZnQsIGIyLmxlZnQpKSxcbiAgICAgIHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmJvdHRvbSwgYjIuYm90dG9tKSAtIE1hdGgubWF4KHRoaXMudG9wLCBiMi50b3ApKSxcbiAgICAgIGludGVyc2VjdEFyZWEgPSB4ICogeTtcbiAgcmV0dXJuIGludGVyc2VjdEFyZWEgLyAodGhpcy5oZWlnaHQgKiB0aGlzLndpZHRoKTtcbn07XG5cbi8vIENvbnZlcnQgdGhlIHBvc2l0aW9ucyBmcm9tIHRoaXMgYm94IHRvIENTUyBjb21wYXRpYmxlIHBvc2l0aW9ucyB1c2luZ1xuLy8gdGhlIHJlZmVyZW5jZSBjb250YWluZXIncyBwb3NpdGlvbnMuIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVjYXVzZSB0aGlzXG4vLyBib3gncyBwb3NpdGlvbnMgYXJlIGluIHJlZmVyZW5jZSB0byB0aGUgdmlld3BvcnQgb3JpZ2luLCB3aGVyZWFzLCBDU1Ncbi8vIHZhbHVlcyBhcmUgaW4gcmVmZXJlY25lIHRvIHRoZWlyIHJlc3BlY3RpdmUgZWRnZXMuXG5Cb3hQb3NpdGlvbi5wcm90b3R5cGUudG9DU1NDb21wYXRWYWx1ZXMgPSBmdW5jdGlvbihyZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRoaXMudG9wIC0gcmVmZXJlbmNlLnRvcCxcbiAgICBib3R0b206IHJlZmVyZW5jZS5ib3R0b20gLSB0aGlzLmJvdHRvbSxcbiAgICBsZWZ0OiB0aGlzLmxlZnQgLSByZWZlcmVuY2UubGVmdCxcbiAgICByaWdodDogcmVmZXJlbmNlLnJpZ2h0IC0gdGhpcy5yaWdodCxcbiAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgIHdpZHRoOiB0aGlzLndpZHRoXG4gIH07XG59O1xuXG4vLyBHZXQgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYm94J3MgcG9zaXRpb24gd2l0aG91dCBhbnl0aGluZyBleHRyYS5cbi8vIENhbiBwYXNzIGEgU3R5bGVCb3gsIEhUTUxFbGVtZW50LCBvciBhbm90aGVyIEJveFBvc2l0b24uXG5Cb3hQb3NpdGlvbi5nZXRTaW1wbGVCb3hQb3NpdGlvbiA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgaGVpZ2h0ID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0SGVpZ2h0IDogb2JqLnRhZ05hbWUgPyBvYmoub2Zmc2V0SGVpZ2h0IDogMDtcbiAgdmFyIHdpZHRoID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0V2lkdGggOiBvYmoudGFnTmFtZSA/IG9iai5vZmZzZXRXaWR0aCA6IDA7XG4gIHZhciB0b3AgPSBvYmouZGl2ID8gb2JqLmRpdi5vZmZzZXRUb3AgOiBvYmoudGFnTmFtZSA/IG9iai5vZmZzZXRUb3AgOiAwO1xuXG4gIG9iaiA9IG9iai5kaXYgPyBvYmouZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDpcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA/IG9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG9iajtcbiAgdmFyIHJldCA9IHtcbiAgICBsZWZ0OiBvYmoubGVmdCxcbiAgICByaWdodDogb2JqLnJpZ2h0LFxuICAgIHRvcDogb2JqLnRvcCB8fCB0b3AsXG4gICAgaGVpZ2h0OiBvYmouaGVpZ2h0IHx8IGhlaWdodCxcbiAgICBib3R0b206IG9iai5ib3R0b20gfHwgKHRvcCArIChvYmouaGVpZ2h0IHx8IGhlaWdodCkpLFxuICAgIHdpZHRoOiBvYmoud2lkdGggfHwgd2lkdGhcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIE1vdmUgYSBTdHlsZUJveCB0byBpdHMgc3BlY2lmaWVkLCBvciBuZXh0IGJlc3QsIHBvc2l0aW9uLiBUaGUgY29udGFpbmVyQm94XG4vLyBpcyB0aGUgYm94IHRoYXQgY29udGFpbnMgdGhlIFN0eWxlQm94LCBzdWNoIGFzIGEgZGl2LiBib3hQb3NpdGlvbnMgYXJlXG4vLyBhIGxpc3Qgb2Ygb3RoZXIgYm94ZXMgdGhhdCB0aGUgc3R5bGVCb3ggY2FuJ3Qgb3ZlcmxhcCB3aXRoLlxuZnVuY3Rpb24gbW92ZUJveFRvTGluZVBvc2l0aW9uKHdpbmRvdywgc3R5bGVCb3gsIGNvbnRhaW5lckJveCwgYm94UG9zaXRpb25zKSB7XG5cbiAgLy8gRmluZCB0aGUgYmVzdCBwb3NpdGlvbiBmb3IgYSBjdWUgYm94LCBiLCBvbiB0aGUgdmlkZW8uIFRoZSBheGlzIHBhcmFtZXRlclxuICAvLyBpcyBhIGxpc3Qgb2YgYXhpcywgdGhlIG9yZGVyIG9mIHdoaWNoLCBpdCB3aWxsIG1vdmUgdGhlIGJveCBhbG9uZy4gRm9yIGV4YW1wbGU6XG4gIC8vIFBhc3NpbmcgW1wiK3hcIiwgXCIteFwiXSB3aWxsIG1vdmUgdGhlIGJveCBmaXJzdCBhbG9uZyB0aGUgeCBheGlzIGluIHRoZSBwb3NpdGl2ZVxuICAvLyBkaXJlY3Rpb24uIElmIGl0IGRvZXNuJ3QgZmluZCBhIGdvb2QgcG9zaXRpb24gZm9yIGl0IHRoZXJlIGl0IHdpbGwgdGhlbiBtb3ZlXG4gIC8vIGl0IGFsb25nIHRoZSB4IGF4aXMgaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi5cbiAgZnVuY3Rpb24gZmluZEJlc3RQb3NpdGlvbihiLCBheGlzKSB7XG4gICAgdmFyIGJlc3RQb3NpdGlvbixcbiAgICAgICAgc3BlY2lmaWVkUG9zaXRpb24gPSBuZXcgQm94UG9zaXRpb24oYiksXG4gICAgICAgIHBlcmNlbnRhZ2UgPSAxOyAvLyBIaWdoZXN0IHBvc3NpYmxlIHNvIHRoZSBmaXJzdCB0aGluZyB3ZSBnZXQgaXMgYmV0dGVyLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3aGlsZSAoYi5vdmVybGFwc09wcG9zaXRlQXhpcyhjb250YWluZXJCb3gsIGF4aXNbaV0pIHx8XG4gICAgICAgICAgICAgKGIud2l0aGluKGNvbnRhaW5lckJveCkgJiYgYi5vdmVybGFwc0FueShib3hQb3NpdGlvbnMpKSkge1xuICAgICAgICBiLm1vdmUoYXhpc1tpXSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBmb3VuZCBhIHNwb3Qgd2hlcmUgd2UgYXJlbid0IG92ZXJsYXBwaW5nIGFueXRoaW5nLiBUaGlzIGlzIG91clxuICAgICAgLy8gYmVzdCBwb3NpdGlvbi5cbiAgICAgIGlmIChiLndpdGhpbihjb250YWluZXJCb3gpKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfVxuICAgICAgdmFyIHAgPSBiLmludGVyc2VjdFBlcmNlbnRhZ2UoY29udGFpbmVyQm94KTtcbiAgICAgIC8vIElmIHdlJ3JlIG91dHNpZGUgdGhlIGNvbnRhaW5lciBib3ggbGVzcyB0aGVuIHdlIHdlcmUgb24gb3VyIGxhc3QgdHJ5XG4gICAgICAvLyB0aGVuIHJlbWVtYmVyIHRoaXMgcG9zaXRpb24gYXMgdGhlIGJlc3QgcG9zaXRpb24uXG4gICAgICBpZiAocGVyY2VudGFnZSA+IHApIHtcbiAgICAgICAgYmVzdFBvc2l0aW9uID0gbmV3IEJveFBvc2l0aW9uKGIpO1xuICAgICAgICBwZXJjZW50YWdlID0gcDtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IHRoZSBib3ggcG9zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICAgIGIgPSBuZXcgQm94UG9zaXRpb24oc3BlY2lmaWVkUG9zaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdFBvc2l0aW9uIHx8IHNwZWNpZmllZFBvc2l0aW9uO1xuICB9XG5cbiAgdmFyIGJveFBvc2l0aW9uID0gbmV3IEJveFBvc2l0aW9uKHN0eWxlQm94KSxcbiAgICAgIGN1ZSA9IHN0eWxlQm94LmN1ZSxcbiAgICAgIGxpbmVQb3MgPSBjb21wdXRlTGluZVBvcyhjdWUpLFxuICAgICAgYXhpcyA9IFtdO1xuXG4gIC8vIElmIHdlIGhhdmUgYSBsaW5lIG51bWJlciB0byBhbGlnbiB0aGUgY3VlIHRvLlxuICBpZiAoY3VlLnNuYXBUb0xpbmVzKSB7XG4gICAgdmFyIHNpemU7XG4gICAgc3dpdGNoIChjdWUudmVydGljYWwpIHtcbiAgICBjYXNlIFwiXCI6XG4gICAgICBheGlzID0gWyBcIit5XCIsIFwiLXlcIiBdO1xuICAgICAgc2l6ZSA9IFwiaGVpZ2h0XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicmxcIjpcbiAgICAgIGF4aXMgPSBbIFwiK3hcIiwgXCIteFwiIF07XG4gICAgICBzaXplID0gXCJ3aWR0aFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxyXCI6XG4gICAgICBheGlzID0gWyBcIi14XCIsIFwiK3hcIiBdO1xuICAgICAgc2l6ZSA9IFwid2lkdGhcIjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBzdGVwID0gYm94UG9zaXRpb24ubGluZUhlaWdodCxcbiAgICAgICAgcG9zaXRpb24gPSBzdGVwICogTWF0aC5yb3VuZChsaW5lUG9zKSxcbiAgICAgICAgbWF4UG9zaXRpb24gPSBjb250YWluZXJCb3hbc2l6ZV0gKyBzdGVwLFxuICAgICAgICBpbml0aWFsQXhpcyA9IGF4aXNbMF07XG5cbiAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIGludGlhbCBwb3NpdGlvbiBpcyBncmVhdGVyIHRoZW4gdGhlIG1heCBwb3NpdGlvbiB0aGVuXG4gICAgLy8gY2xhbXAgdGhlIGJveCB0byB0aGUgYW1vdW50IG9mIHN0ZXBzIGl0IHdvdWxkIHRha2UgZm9yIHRoZSBib3ggdG9cbiAgICAvLyByZWFjaCB0aGUgbWF4IHBvc2l0aW9uLlxuICAgIGlmIChNYXRoLmFicyhwb3NpdGlvbikgPiBtYXhQb3NpdGlvbikge1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA8IDAgPyAtMSA6IDE7XG4gICAgICBwb3NpdGlvbiAqPSBNYXRoLmNlaWwobWF4UG9zaXRpb24gLyBzdGVwKSAqIHN0ZXA7XG4gICAgfVxuXG4gICAgLy8gSWYgY29tcHV0ZWQgbGluZSBwb3NpdGlvbiByZXR1cm5zIG5lZ2F0aXZlIHRoZW4gbGluZSBudW1iZXJzIGFyZVxuICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHZpZGVvIGluc3RlYWQgb2YgdGhlIHRvcC4gVGhlcmVmb3JlLCB3ZVxuICAgIC8vIG5lZWQgdG8gaW5jcmVhc2Ugb3VyIGluaXRpYWwgcG9zaXRpb24gYnkgdGhlIGxlbmd0aCBvciB3aWR0aCBvZiB0aGVcbiAgICAvLyB2aWRlbywgZGVwZW5kaW5nIG9uIHRoZSB3cml0aW5nIGRpcmVjdGlvbiwgYW5kIHJldmVyc2Ugb3VyIGF4aXMgZGlyZWN0aW9ucy5cbiAgICBpZiAobGluZVBvcyA8IDApIHtcbiAgICAgIHBvc2l0aW9uICs9IGN1ZS52ZXJ0aWNhbCA9PT0gXCJcIiA/IGNvbnRhaW5lckJveC5oZWlnaHQgOiBjb250YWluZXJCb3gud2lkdGg7XG4gICAgICBheGlzID0gYXhpcy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoaXMgbWF5IG5vdCBiZSBpdHMgYmVzdFxuICAgIC8vIHBvc2l0aW9uLlxuICAgIGJveFBvc2l0aW9uLm1vdmUoaW5pdGlhbEF4aXMsIHBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwZXJjZW50YWdlIGxpbmUgdmFsdWUgZm9yIHRoZSBjdWUuXG4gICAgdmFyIGNhbGN1bGF0ZWRQZXJjZW50YWdlID0gKGJveFBvc2l0aW9uLmxpbmVIZWlnaHQgLyBjb250YWluZXJCb3guaGVpZ2h0KSAqIDEwMDtcblxuICAgIHN3aXRjaCAoY3VlLmxpbmVBbGlnbikge1xuICAgIGNhc2UgXCJtaWRkbGVcIjpcbiAgICAgIGxpbmVQb3MgLT0gKGNhbGN1bGF0ZWRQZXJjZW50YWdlIC8gMik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZW5kXCI6XG4gICAgICBsaW5lUG9zIC09IGNhbGN1bGF0ZWRQZXJjZW50YWdlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgaW5pdGlhbCBsaW5lIHBvc2l0aW9uIHRvIHRoZSBjdWUgYm94LlxuICAgIHN3aXRjaCAoY3VlLnZlcnRpY2FsKSB7XG4gICAgY2FzZSBcIlwiOlxuICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoe1xuICAgICAgICB0b3A6IHN0eWxlQm94LmZvcm1hdFN0eWxlKGxpbmVQb3MsIFwiJVwiKVxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicmxcIjpcbiAgICAgIHN0eWxlQm94LmFwcGx5U3R5bGVzKHtcbiAgICAgICAgbGVmdDogc3R5bGVCb3guZm9ybWF0U3R5bGUobGluZVBvcywgXCIlXCIpXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsclwiOlxuICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoe1xuICAgICAgICByaWdodDogc3R5bGVCb3guZm9ybWF0U3R5bGUobGluZVBvcywgXCIlXCIpXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF4aXMgPSBbIFwiK3lcIiwgXCIteFwiLCBcIit4XCIsIFwiLXlcIiBdO1xuXG4gICAgLy8gR2V0IHRoZSBib3ggcG9zaXRpb24gYWdhaW4gYWZ0ZXIgd2UndmUgYXBwbGllZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uaW5nXG4gICAgLy8gdG8gaXQuXG4gICAgYm94UG9zaXRpb24gPSBuZXcgQm94UG9zaXRpb24oc3R5bGVCb3gpO1xuICB9XG5cbiAgdmFyIGJlc3RQb3NpdGlvbiA9IGZpbmRCZXN0UG9zaXRpb24oYm94UG9zaXRpb24sIGF4aXMpO1xuICBzdHlsZUJveC5tb3ZlKGJlc3RQb3NpdGlvbi50b0NTU0NvbXBhdFZhbHVlcyhjb250YWluZXJCb3gpKTtcbn1cblxuZnVuY3Rpb24gV2ViVlRUKCkge1xuICAvLyBOb3RoaW5nXG59XG5cbi8vIEhlbHBlciB0byBhbGxvdyBzdHJpbmdzIHRvIGJlIGRlY29kZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBiaW5hcnkgdXRmOCBkYXRhLlxuV2ViVlRULlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNvZGU6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIGV4cGVjdGVkIHN0cmluZyBkYXRhLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpKTtcbiAgICB9XG4gIH07XG59O1xuXG5XZWJWVFQuY29udmVydEN1ZVRvRE9NVHJlZSA9IGZ1bmN0aW9uKHdpbmRvdywgY3VldGV4dCkge1xuICBpZiAoIXdpbmRvdyB8fCAhY3VldGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBwYXJzZUNvbnRlbnQod2luZG93LCBjdWV0ZXh0KTtcbn07XG5cbnZhciBGT05UX1NJWkVfUEVSQ0VOVCA9IDAuMDU7XG52YXIgRk9OVF9TVFlMRSA9IFwic2Fucy1zZXJpZlwiO1xudmFyIENVRV9CQUNLR1JPVU5EX1BBRERJTkcgPSBcIjEuNSVcIjtcblxuLy8gUnVucyB0aGUgcHJvY2Vzc2luZyBtb2RlbCBvdmVyIHRoZSBjdWVzIGFuZCByZWdpb25zIHBhc3NlZCB0byBpdC5cbi8vIEBwYXJhbSBvdmVybGF5IEEgYmxvY2sgbGV2ZWwgZWxlbWVudCAodXN1YWxseSBhIGRpdikgdGhhdCB0aGUgY29tcHV0ZWQgY3Vlc1xuLy8gICAgICAgICAgICAgICAgYW5kIHJlZ2lvbnMgd2lsbCBiZSBwbGFjZWQgaW50by5cbldlYlZUVC5wcm9jZXNzQ3VlcyA9IGZ1bmN0aW9uKHdpbmRvdywgY3Vlcywgb3ZlcmxheSkge1xuICBpZiAoIXdpbmRvdyB8fCAhY3VlcyB8fCAhb3ZlcmxheSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgd2hpbGUgKG92ZXJsYXkuZmlyc3RDaGlsZCkge1xuICAgIG92ZXJsYXkucmVtb3ZlQ2hpbGQob3ZlcmxheS5maXJzdENoaWxkKTtcbiAgfVxuXG4gIHZhciBwYWRkZWRPdmVybGF5ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUubGVmdCA9IFwiMFwiO1xuICBwYWRkZWRPdmVybGF5LnN0eWxlLnJpZ2h0ID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUudG9wID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUuYm90dG9tID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUubWFyZ2luID0gQ1VFX0JBQ0tHUk9VTkRfUEFERElORztcbiAgb3ZlcmxheS5hcHBlbmRDaGlsZChwYWRkZWRPdmVybGF5KTtcblxuICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXNwbGF5IHN0YXRlcyBvZiB0aGUgY3Vlcy4gVGhpcyBjb3VsZFxuICAvLyBiZSB0aGUgY2FzZSBpZiBhIGN1ZSdzIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY29tcHV0YXRpb24gb3JcbiAgLy8gaWYgaXQgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5cbiAgZnVuY3Rpb24gc2hvdWxkQ29tcHV0ZShjdWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY3Vlc1tpXS5oYXNCZWVuUmVzZXQgfHwgIWN1ZXNbaV0uZGlzcGxheVN0YXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY3VlcycgZGlzcGxheSBzdGF0ZXMuIEp1c3QgcmV1c2UgdGhlbS5cbiAgaWYgKCFzaG91bGRDb21wdXRlKGN1ZXMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWRkZWRPdmVybGF5LmFwcGVuZENoaWxkKGN1ZXNbaV0uZGlzcGxheVN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJveFBvc2l0aW9ucyA9IFtdLFxuICAgICAgY29udGFpbmVyQm94ID0gQm94UG9zaXRpb24uZ2V0U2ltcGxlQm94UG9zaXRpb24ocGFkZGVkT3ZlcmxheSksXG4gICAgICBmb250U2l6ZSA9IE1hdGgucm91bmQoY29udGFpbmVyQm94LmhlaWdodCAqIEZPTlRfU0laRV9QRVJDRU5UICogMTAwKSAvIDEwMDtcbiAgdmFyIHN0eWxlT3B0aW9ucyA9IHtcbiAgICBmb250OiBmb250U2l6ZSArIFwicHggXCIgKyBGT05UX1NUWUxFXG4gIH07XG5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHlsZUJveCwgY3VlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdWUgPSBjdWVzW2ldO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBpbnRpYWwgcG9zaXRpb24gYW5kIHN0eWxlcyBvZiB0aGUgY3VlIGRpdi5cbiAgICAgIHN0eWxlQm94ID0gbmV3IEN1ZVN0eWxlQm94KHdpbmRvdywgY3VlLCBzdHlsZU9wdGlvbnMpO1xuICAgICAgcGFkZGVkT3ZlcmxheS5hcHBlbmRDaGlsZChzdHlsZUJveC5kaXYpO1xuXG4gICAgICAvLyBNb3ZlIHRoZSBjdWUgZGl2IHRvIGl0J3MgY29ycmVjdCBsaW5lIHBvc2l0aW9uLlxuICAgICAgbW92ZUJveFRvTGluZVBvc2l0aW9uKHdpbmRvdywgc3R5bGVCb3gsIGNvbnRhaW5lckJveCwgYm94UG9zaXRpb25zKTtcblxuICAgICAgLy8gUmVtZW1iZXIgdGhlIGNvbXB1dGVkIGRpdiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIGl0IGxhdGVyXG4gICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIHRvby5cbiAgICAgIGN1ZS5kaXNwbGF5U3RhdGUgPSBzdHlsZUJveC5kaXY7XG5cbiAgICAgIGJveFBvc2l0aW9ucy5wdXNoKEJveFBvc2l0aW9uLmdldFNpbXBsZUJveFBvc2l0aW9uKHN0eWxlQm94KSk7XG4gICAgfVxuICB9KSgpO1xufTtcblxuV2ViVlRULlBhcnNlciA9IGZ1bmN0aW9uKHdpbmRvdywgdnR0anMsIGRlY29kZXIpIHtcbiAgaWYgKCFkZWNvZGVyKSB7XG4gICAgZGVjb2RlciA9IHZ0dGpzO1xuICAgIHZ0dGpzID0ge307XG4gIH1cbiAgaWYgKCF2dHRqcykge1xuICAgIHZ0dGpzID0ge307XG4gIH1cblxuICB0aGlzLndpbmRvdyA9IHdpbmRvdztcbiAgdGhpcy52dHRqcyA9IHZ0dGpzO1xuICB0aGlzLnN0YXRlID0gXCJJTklUSUFMXCI7XG4gIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgdGhpcy5kZWNvZGVyID0gZGVjb2RlciB8fCBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuICB0aGlzLnJlZ2lvbkxpc3QgPSBbXTtcbn07XG5cbldlYlZUVC5QYXJzZXIucHJvdG90eXBlID0ge1xuICAvLyBJZiB0aGUgZXJyb3IgaXMgYSBQYXJzaW5nRXJyb3IgdGhlbiByZXBvcnQgaXQgdG8gdGhlIGNvbnN1bWVyIGlmXG4gIC8vIHBvc3NpYmxlLiBJZiBpdCdzIG5vdCBhIFBhcnNpbmdFcnJvciB0aGVuIHRocm93IGl0IGxpa2Ugbm9ybWFsLlxuICByZXBvcnRPclRocm93RXJyb3I6IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgdGhpcy5vbnBhcnNpbmdlcnJvciAmJiB0aGlzLm9ucGFyc2luZ2Vycm9yKGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSxcbiAgcGFyc2U6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB0aGVuIHdlIHdvbid0IGRlY29kZSBpdCwgYnV0IHdpbGwganVzdCB0cnkgdG8gcGFyc2VcbiAgICAvLyB3aGF0ZXZlciBpcyBpbiBidWZmZXIgYWxyZWFkeS4gVGhpcyBtYXkgb2NjdXIgaW4gY2lyY3Vtc3RhbmNlcywgZm9yXG4gICAgLy8gZXhhbXBsZSB3aGVuIGZsdXNoKCkgaXMgY2FsbGVkLlxuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyBUcnkgdG8gZGVjb2RlIHRoZSBkYXRhIHRoYXQgd2UgcmVjZWl2ZWQuXG4gICAgICBzZWxmLmJ1ZmZlciArPSBzZWxmLmRlY29kZXIuZGVjb2RlKGRhdGEsIHtzdHJlYW06IHRydWV9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0TmV4dExpbmUoKSB7XG4gICAgICB2YXIgYnVmZmVyID0gc2VsZi5idWZmZXI7XG4gICAgICB2YXIgcG9zID0gMDtcbiAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlcltwb3NdICE9PSAnXFxyJyAmJiBidWZmZXJbcG9zXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgKytwb3M7XG4gICAgICB9XG4gICAgICB2YXIgbGluZSA9IGJ1ZmZlci5zdWJzdHIoMCwgcG9zKTtcbiAgICAgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlciBlYXJseSBpbiBjYXNlIHdlIGZhaWwgYmVsb3cuXG4gICAgICBpZiAoYnVmZmVyW3Bvc10gPT09ICdcXHInKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlcltwb3NdID09PSAnXFxuJykge1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICAgIHNlbGYuYnVmZmVyID0gYnVmZmVyLnN1YnN0cihwb3MpO1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuXG4gICAgLy8gMy40IFdlYlZUVCByZWdpb24gYW5kIFdlYlZUVCByZWdpb24gc2V0dGluZ3Mgc3ludGF4XG4gICAgZnVuY3Rpb24gcGFyc2VSZWdpb24oaW5wdXQpIHtcbiAgICAgIHZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncygpO1xuXG4gICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICBzZXR0aW5ncy5zZXQoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ3aWR0aFwiOlxuICAgICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsaW5lc1wiOlxuICAgICAgICAgIHNldHRpbmdzLmludGVnZXIoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWdpb25hbmNob3JcIjpcbiAgICAgICAgY2FzZSBcInZpZXdwb3J0YW5jaG9yXCI6XG4gICAgICAgICAgdmFyIHh5ID0gdi5zcGxpdCgnLCcpO1xuICAgICAgICAgIGlmICh4eS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSBib3RoIHggYW5kIHkgcGFyc2UsIHNvIHVzZSBhIHRlbXBvcmFyeVxuICAgICAgICAgIC8vIHNldHRpbmdzIG9iamVjdCBoZXJlLlxuICAgICAgICAgIHZhciBhbmNob3IgPSBuZXcgU2V0dGluZ3MoKTtcbiAgICAgICAgICBhbmNob3IucGVyY2VudChcInhcIiwgeHlbMF0pO1xuICAgICAgICAgIGFuY2hvci5wZXJjZW50KFwieVwiLCB4eVsxXSk7XG4gICAgICAgICAgaWYgKCFhbmNob3IuaGFzKFwieFwiKSB8fCAhYW5jaG9yLmhhcyhcInlcIikpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXR0aW5ncy5zZXQoayArIFwiWFwiLCBhbmNob3IuZ2V0KFwieFwiKSk7XG4gICAgICAgICAgc2V0dGluZ3Muc2V0KGsgKyBcIllcIiwgYW5jaG9yLmdldChcInlcIikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2Nyb2xsXCI6XG4gICAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFtcInVwXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSwgLz0vLCAvXFxzLyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcmVnaW9uLCB1c2luZyBkZWZhdWx0IHZhbHVlcyBmb3IgYW55IHZhbHVlcyB0aGF0IHdlcmUgbm90XG4gICAgICAvLyBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2V0dGluZ3MuaGFzKFwiaWRcIikpIHtcbiAgICAgICAgdmFyIHJlZ2lvbiA9IG5ldyAoc2VsZi52dHRqcy5WVFRSZWdpb24gfHwgc2VsZi53aW5kb3cuVlRUUmVnaW9uKSgpO1xuICAgICAgICByZWdpb24ud2lkdGggPSBzZXR0aW5ncy5nZXQoXCJ3aWR0aFwiLCAxMDApO1xuICAgICAgICByZWdpb24ubGluZXMgPSBzZXR0aW5ncy5nZXQoXCJsaW5lc1wiLCAzKTtcbiAgICAgICAgcmVnaW9uLnJlZ2lvbkFuY2hvclggPSBzZXR0aW5ncy5nZXQoXCJyZWdpb25hbmNob3JYXCIsIDApO1xuICAgICAgICByZWdpb24ucmVnaW9uQW5jaG9yWSA9IHNldHRpbmdzLmdldChcInJlZ2lvbmFuY2hvcllcIiwgMTAwKTtcbiAgICAgICAgcmVnaW9uLnZpZXdwb3J0QW5jaG9yWCA9IHNldHRpbmdzLmdldChcInZpZXdwb3J0YW5jaG9yWFwiLCAwKTtcbiAgICAgICAgcmVnaW9uLnZpZXdwb3J0QW5jaG9yWSA9IHNldHRpbmdzLmdldChcInZpZXdwb3J0YW5jaG9yWVwiLCAxMDApO1xuICAgICAgICByZWdpb24uc2Nyb2xsID0gc2V0dGluZ3MuZ2V0KFwic2Nyb2xsXCIsIFwiXCIpO1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVnaW9uLlxuICAgICAgICBzZWxmLm9ucmVnaW9uICYmIHNlbGYub25yZWdpb24ocmVnaW9uKTtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIFZUVFJlZ2lvbiBmb3IgbGF0ZXIgaW4gY2FzZSB3ZSBwYXJzZSBhbnkgVlRUQ3VlcyB0aGF0XG4gICAgICAgIC8vIHJlZmVyZW5jZSBpdC5cbiAgICAgICAgc2VsZi5yZWdpb25MaXN0LnB1c2goe1xuICAgICAgICAgIGlkOiBzZXR0aW5ncy5nZXQoXCJpZFwiKSxcbiAgICAgICAgICByZWdpb246IHJlZ2lvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZy0yMFxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZy0yMCNzZWN0aW9uLTMuNVxuICAgIC8vIDMuNSBXZWJWVFRcbiAgICBmdW5jdGlvbiBwYXJzZVRpbWVzdGFtcE1hcChpbnB1dCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKCk7XG5cbiAgICAgIHBhcnNlT3B0aW9ucyhpbnB1dCwgZnVuY3Rpb24oaywgdikge1xuICAgICAgICBzd2l0Y2goaykge1xuICAgICAgICBjYXNlIFwiTVBFR1RcIjpcbiAgICAgICAgICBzZXR0aW5ncy5pbnRlZ2VyKGsgKyAnUycsIHYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9DQVwiOlxuICAgICAgICAgIHNldHRpbmdzLnNldChrICsgJ0wnLCBwYXJzZVRpbWVTdGFtcCh2KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sIC9bXlxcZF06LywgLywvKTtcblxuICAgICAgc2VsZi5vbnRpbWVzdGFtcG1hcCAmJiBzZWxmLm9udGltZXN0YW1wbWFwKHtcbiAgICAgICAgXCJNUEVHVFNcIjogc2V0dGluZ3MuZ2V0KFwiTVBFR1RTXCIpLFxuICAgICAgICBcIkxPQ0FMXCI6IHNldHRpbmdzLmdldChcIkxPQ0FMXCIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLjIgV2ViVlRUIG1ldGFkYXRhIGhlYWRlciBzeW50YXhcbiAgICBmdW5jdGlvbiBwYXJzZUhlYWRlcihpbnB1dCkge1xuICAgICAgaWYgKGlucHV0Lm1hdGNoKC9YLVRJTUVTVEFNUC1NQVAvKSkge1xuICAgICAgICAvLyBUaGlzIGxpbmUgY29udGFpbnMgSExTIFgtVElNRVNUQU1QLU1BUCBtZXRhZGF0YVxuICAgICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgICAgICBzd2l0Y2goaykge1xuICAgICAgICAgIGNhc2UgXCJYLVRJTUVTVEFNUC1NQVBcIjpcbiAgICAgICAgICAgIHBhcnNlVGltZXN0YW1wTWFwKHYpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAvPS8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VPcHRpb25zKGlucHV0LCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICAgIGNhc2UgXCJSZWdpb25cIjpcbiAgICAgICAgICAgIC8vIDMuMyBXZWJWVFQgcmVnaW9uIG1ldGFkYXRhIGhlYWRlciBzeW50YXhcbiAgICAgICAgICAgIHBhcnNlUmVnaW9uKHYpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAvOi8pO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gNS4xIFdlYlZUVCBmaWxlIHBhcnNpbmcuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBsaW5lO1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiSU5JVElBTFwiKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IHN0YXJ0IHBhcnNpbmcgdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgbGluZS5cbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdChzZWxmLmJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUgPSBjb2xsZWN0TmV4dExpbmUoKTtcblxuICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2goL15XRUJWVFQoWyBcXHRdLiopPyQvKTtcbiAgICAgICAgaWYgKCFtIHx8ICFtWzBdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFNpZ25hdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLnN0YXRlID0gXCJIRUFERVJcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gZmFsc2U7XG4gICAgICB3aGlsZSAoc2VsZi5idWZmZXIpIHtcbiAgICAgICAgLy8gV2UgY2FuJ3QgcGFyc2UgYSBsaW5lIHVudGlsIHdlIGhhdmUgdGhlIGZ1bGwgbGluZS5cbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdChzZWxmLmJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWxyZWFkeUNvbGxlY3RlZExpbmUpIHtcbiAgICAgICAgICBsaW5lID0gY29sbGVjdE5leHRMaW5lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWxyZWFkeUNvbGxlY3RlZExpbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2VsZi5zdGF0ZSkge1xuICAgICAgICBjYXNlIFwiSEVBREVSXCI6XG4gICAgICAgICAgLy8gMTMtMTggLSBBbGxvdyBhIGhlYWRlciAobWV0YWRhdGEpIHVuZGVyIHRoZSBXRUJWVFQgbGluZS5cbiAgICAgICAgICBpZiAoLzovLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUpIHtcbiAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgdGVybWluYXRlcyB0aGUgaGVhZGVyIGFuZCBzdGFydHMgdGhlIGJvZHkgKGN1ZXMpLlxuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJOT1RFXCI6XG4gICAgICAgICAgLy8gSWdub3JlIE5PVEUgYmxvY2tzLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJJRFwiOlxuICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc3RhcnQgb2YgTk9URSBibG9ja3MuXG4gICAgICAgICAgaWYgKC9eTk9URSgkfFsgXFx0XSkvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBcIk5PVEVcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAxOS0yOSAtIEFsbG93IGFueSBudW1iZXIgb2YgbGluZSB0ZXJtaW5hdG9ycywgdGhlbiBpbml0aWFsaXplIG5ldyBjdWUgdmFsdWVzLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuY3VlID0gbmV3IChzZWxmLnZ0dGpzLlZUVEN1ZSB8fCBzZWxmLndpbmRvdy5WVFRDdWUpKDAsIDAsIFwiXCIpO1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSBcIkNVRVwiO1xuICAgICAgICAgIC8vIDMwLTM5IC0gQ2hlY2sgaWYgc2VsZiBsaW5lIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb3IgdGltaW5nIGRhdGEuXG4gICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZihcIi0tPlwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNlbGYuY3VlLmlkID0gbGluZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBQcm9jZXNzIGxpbmUgYXMgc3RhcnQgb2YgYSBjdWUuXG4gICAgICAgICAgLypmYWxscyB0aHJvdWdoKi9cbiAgICAgICAgY2FzZSBcIkNVRVwiOlxuICAgICAgICAgIC8vIDQwIC0gQ29sbGVjdCBjdWUgdGltaW5ncyBhbmQgc2V0dGluZ3MuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlQ3VlKGxpbmUsIHNlbGYuY3VlLCBzZWxmLnJlZ2lvbkxpc3QpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNlbGYucmVwb3J0T3JUaHJvd0Vycm9yKGUpO1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciBpZ25vcmUgcmVzdCBvZiB0aGUgY3VlLlxuICAgICAgICAgICAgc2VsZi5jdWUgPSBudWxsO1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiQkFEQ1VFXCI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiQ1VFVEVYVFwiO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIFwiQ1VFVEVYVFwiOlxuICAgICAgICAgIHZhciBoYXNTdWJzdHJpbmcgPSBsaW5lLmluZGV4T2YoXCItLT5cIikgIT09IC0xO1xuICAgICAgICAgIC8vIDM0IC0gSWYgd2UgaGF2ZSBhbiBlbXB0eSBsaW5lIHRoZW4gcmVwb3J0IHRoZSBjdWUuXG4gICAgICAgICAgLy8gMzUgLSBJZiB3ZSBoYXZlIHRoZSBzcGVjaWFsIHN1YnN0cmluZyAnLS0+JyB0aGVuIHJlcG9ydCB0aGUgY3VlLFxuICAgICAgICAgIC8vIGJ1dCBkbyBub3QgY29sbGVjdCB0aGUgbGluZSBhcyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnRcbiAgICAgICAgICAvLyBvbmUgYXMgYSBuZXcgY3VlLlxuICAgICAgICAgIGlmICghbGluZSB8fCBoYXNTdWJzdHJpbmcgJiYgKGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIHBhcnNpbmcgc2VsZiBjdWUuXG4gICAgICAgICAgICBzZWxmLm9uY3VlICYmIHNlbGYub25jdWUoc2VsZi5jdWUpO1xuICAgICAgICAgICAgc2VsZi5jdWUgPSBudWxsO1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2VsZi5jdWUudGV4dCkge1xuICAgICAgICAgICAgc2VsZi5jdWUudGV4dCArPSBcIlxcblwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmN1ZS50ZXh0ICs9IGxpbmU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJCQURDVUVcIjogLy8gQkFEQ1VFXG4gICAgICAgICAgLy8gNTQtNjIgLSBDb2xsZWN0IGFuZCBkaXNjYXJkIHRoZSByZW1haW5pbmcgY3VlLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLnJlcG9ydE9yVGhyb3dFcnJvcihlKTtcblxuICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGEgY3VlLCByZXBvcnQgd2hhdCB3ZSBoYXZlLlxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiQ1VFVEVYVFwiICYmIHNlbGYuY3VlICYmIHNlbGYub25jdWUpIHtcbiAgICAgICAgc2VsZi5vbmN1ZShzZWxmLmN1ZSk7XG4gICAgICB9XG4gICAgICBzZWxmLmN1ZSA9IG51bGw7XG4gICAgICAvLyBFbnRlciBCQURXRUJWVFQgc3RhdGUgaWYgaGVhZGVyIHdhcyBub3QgcGFyc2VkIGNvcnJlY3RseSBvdGhlcndpc2VcbiAgICAgIC8vIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkIHNvIGVudGVyIEJBRENVRSBzdGF0ZS5cbiAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlID09PSBcIklOSVRJQUxcIiA/IFwiQkFEV0VCVlRUXCIgOiBcIkJBRENVRVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpbmlzaCBkZWNvZGluZyB0aGUgc3RyZWFtLlxuICAgICAgc2VsZi5idWZmZXIgKz0gc2VsZi5kZWNvZGVyLmRlY29kZSgpO1xuICAgICAgLy8gU3ludGhlc2l6ZSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGN1ZSBvciByZWdpb24uXG4gICAgICBpZiAoc2VsZi5jdWUgfHwgc2VsZi5zdGF0ZSA9PT0gXCJIRUFERVJcIikge1xuICAgICAgICBzZWxmLmJ1ZmZlciArPSBcIlxcblxcblwiO1xuICAgICAgICBzZWxmLnBhcnNlKCk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSd2ZSBmbHVzaGVkLCBwYXJzZWQsIGFuZCB3ZSdyZSBzdGlsbCBvbiB0aGUgSU5JVElBTCBzdGF0ZSB0aGVuXG4gICAgICAvLyB0aGF0IG1lYW5zIHdlIGRvbid0IGhhdmUgZW5vdWdoIG9mIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGZpcnN0XG4gICAgICAvLyBsaW5lLlxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiSU5JVElBTFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzaW5nRXJyb3IoUGFyc2luZ0Vycm9yLkVycm9ycy5CYWRTaWduYXR1cmUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgc2VsZi5yZXBvcnRPclRocm93RXJyb3IoZSk7XG4gICAgfVxuICAgIHNlbGYub25mbHVzaCAmJiBzZWxmLm9uZmx1c2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWJWVFQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js\n");
/***/ }),
/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js":
/*!**************************************************************************!*\
!*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar autoKeyword = \"auto\";\nvar directionSetting = {\n \"\": true,\n \"lr\": true,\n \"rl\": true\n};\nvar alignSetting = {\n \"start\": true,\n \"middle\": true,\n \"end\": true,\n \"left\": true,\n \"right\": true\n};\n\nfunction findDirectionSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var dir = directionSetting[value.toLowerCase()];\n return dir ? value.toLowerCase() : false;\n}\n\nfunction findAlignSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var align = alignSetting[value.toLowerCase()];\n return align ? value.toLowerCase() : false;\n}\n\nfunction extend(obj) {\n var i = 1;\n for (; i < arguments.length; i++) {\n var cobj = arguments[i];\n for (var p in cobj) {\n obj[p] = cobj[p];\n }\n }\n\n return obj;\n}\n\nfunction VTTCue(startTime, endTime, text) {\n var cue = this;\n var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n var baseObj = {};\n\n if (isIE8) {\n cue = document.createElement('custom');\n } else {\n baseObj.enumerable = true;\n }\n\n /**\n * Shim implementation specific properties. These properties are not in\n * the spec.\n */\n\n // Lets us know when the VTTCue's data has changed in such a way that we need\n // to recompute its display state. This lets us compute its display state\n // lazily.\n cue.hasBeenReset = false;\n\n /**\n * VTTCue and TextTrackCue properties\n * http://dev.w3.org/html5/webvtt/#vttcue-interface\n */\n\n var _id = \"\";\n var _pauseOnExit = false;\n var _startTime = startTime;\n var _endTime = endTime;\n var _text = text;\n var _region = null;\n var _vertical = \"\";\n var _snapToLines = true;\n var _line = \"auto\";\n var _lineAlign = \"start\";\n var _position = 50;\n var _positionAlign = \"middle\";\n var _size = 50;\n var _align = \"middle\";\n\n Object.defineProperty(cue,\n \"id\", extend({}, baseObj, {\n get: function() {\n return _id;\n },\n set: function(value) {\n _id = \"\" + value;\n }\n }));\n\n Object.defineProperty(cue,\n \"pauseOnExit\", extend({}, baseObj, {\n get: function() {\n return _pauseOnExit;\n },\n set: function(value) {\n _pauseOnExit = !!value;\n }\n }));\n\n Object.defineProperty(cue,\n \"startTime\", extend({}, baseObj, {\n get: function() {\n return _startTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Start time must be set to a number.\");\n }\n _startTime = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"endTime\", extend({}, baseObj, {\n get: function() {\n return _endTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"End time must be set to a number.\");\n }\n _endTime = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"text\", extend({}, baseObj, {\n get: function() {\n return _text;\n },\n set: function(value) {\n _text = \"\" + value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"region\", extend({}, baseObj, {\n get: function() {\n return _region;\n },\n set: function(value) {\n _region = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"vertical\", extend({}, baseObj, {\n get: function() {\n return _vertical;\n },\n set: function(value) {\n var setting = findDirectionSetting(value);\n // Have to check for false because the setting an be an empty string.\n if (setting === false) {\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n }\n _vertical = setting;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"snapToLines\", extend({}, baseObj, {\n get: function() {\n return _snapToLines;\n },\n set: function(value) {\n _snapToLines = !!value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"line\", extend({}, baseObj, {\n get: function() {\n return _line;\n },\n set: function(value) {\n if (typeof value !== \"number\" && value !== autoKeyword) {\n throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n }\n _line = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"lineAlign\", extend({}, baseObj, {\n get: function() {\n return _lineAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n }\n _lineAlign = setting;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"position\", extend({}, baseObj, {\n get: function() {\n return _position;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Position must be between 0 and 100.\");\n }\n _position = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"positionAlign\", extend({}, baseObj, {\n get: function() {\n return _positionAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n }\n _positionAlign = setting;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"size\", extend({}, baseObj, {\n get: function() {\n return _size;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Size must be between 0 and 100.\");\n }\n _size = value;\n this.hasBeenReset = true;\n }\n }));\n\n Object.defineProperty(cue,\n \"align\", extend({}, baseObj, {\n get: function() {\n return _align;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n }\n _align = setting;\n this.hasBeenReset = true;\n }\n }));\n\n /**\n * Other <track> spec defined properties\n */\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n cue.displayState = undefined;\n\n if (isIE8) {\n return cue;\n }\n}\n\n/**\n * VTTCue methods\n */\n\nVTTCue.prototype.getCueAsHTML = function() {\n // Assume WebVTT.convertCueToDOMTree is on the global.\n return WebVTT.convertCueToDOMTree(window, this.text);\n};\n\nmodule.exports = VTTCue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0Y3VlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dGN1ZS5qcz84YWFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIGF1dG9LZXl3b3JkID0gXCJhdXRvXCI7XG52YXIgZGlyZWN0aW9uU2V0dGluZyA9IHtcbiAgXCJcIjogdHJ1ZSxcbiAgXCJsclwiOiB0cnVlLFxuICBcInJsXCI6IHRydWVcbn07XG52YXIgYWxpZ25TZXR0aW5nID0ge1xuICBcInN0YXJ0XCI6IHRydWUsXG4gIFwibWlkZGxlXCI6IHRydWUsXG4gIFwiZW5kXCI6IHRydWUsXG4gIFwibGVmdFwiOiB0cnVlLFxuICBcInJpZ2h0XCI6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGZpbmREaXJlY3Rpb25TZXR0aW5nKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGRpciA9IGRpcmVjdGlvblNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBkaXIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRBbGlnblNldHRpbmcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgYWxpZ24gPSBhbGlnblNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBhbGlnbiA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaikge1xuICB2YXIgaSA9IDE7XG4gIGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvYmogPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIgcCBpbiBjb2JqKSB7XG4gICAgICBvYmpbcF0gPSBjb2JqW3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIFZUVEN1ZShzdGFydFRpbWUsIGVuZFRpbWUsIHRleHQpIHtcbiAgdmFyIGN1ZSA9IHRoaXM7XG4gIHZhciBpc0lFOCA9ICgvTVNJRVxcczhcXC4wLykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgdmFyIGJhc2VPYmogPSB7fTtcblxuICBpZiAoaXNJRTgpIHtcbiAgICBjdWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcbiAgfSBlbHNlIHtcbiAgICBiYXNlT2JqLmVudW1lcmFibGUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoaW0gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgcHJvcGVydGllcy4gVGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGluXG4gICAqIHRoZSBzcGVjLlxuICAgKi9cblxuICAvLyBMZXRzIHVzIGtub3cgd2hlbiB0aGUgVlRUQ3VlJ3MgZGF0YSBoYXMgY2hhbmdlZCBpbiBzdWNoIGEgd2F5IHRoYXQgd2UgbmVlZFxuICAvLyB0byByZWNvbXB1dGUgaXRzIGRpc3BsYXkgc3RhdGUuIFRoaXMgbGV0cyB1cyBjb21wdXRlIGl0cyBkaXNwbGF5IHN0YXRlXG4gIC8vIGxhemlseS5cbiAgY3VlLmhhc0JlZW5SZXNldCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBWVFRDdWUgYW5kIFRleHRUcmFja0N1ZSBwcm9wZXJ0aWVzXG4gICAqIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0Y3VlLWludGVyZmFjZVxuICAgKi9cblxuICB2YXIgX2lkID0gXCJcIjtcbiAgdmFyIF9wYXVzZU9uRXhpdCA9IGZhbHNlO1xuICB2YXIgX3N0YXJ0VGltZSA9IHN0YXJ0VGltZTtcbiAgdmFyIF9lbmRUaW1lID0gZW5kVGltZTtcbiAgdmFyIF90ZXh0ID0gdGV4dDtcbiAgdmFyIF9yZWdpb24gPSBudWxsO1xuICB2YXIgX3ZlcnRpY2FsID0gXCJcIjtcbiAgdmFyIF9zbmFwVG9MaW5lcyA9IHRydWU7XG4gIHZhciBfbGluZSA9IFwiYXV0b1wiO1xuICB2YXIgX2xpbmVBbGlnbiA9IFwic3RhcnRcIjtcbiAgdmFyIF9wb3NpdGlvbiA9IDUwO1xuICB2YXIgX3Bvc2l0aW9uQWxpZ24gPSBcIm1pZGRsZVwiO1xuICB2YXIgX3NpemUgPSA1MDtcbiAgdmFyIF9hbGlnbiA9IFwibWlkZGxlXCI7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImlkXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9pZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9pZCA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInBhdXNlT25FeGl0XCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9wYXVzZU9uRXhpdDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9wYXVzZU9uRXhpdCA9ICEhdmFsdWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJzdGFydFRpbWVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3N0YXJ0VGltZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhcnQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3N0YXJ0VGltZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJlbmRUaW1lXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9lbmRUaW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFbmQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX2VuZFRpbWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwidGV4dFwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfdGV4dDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF90ZXh0ID0gXCJcIiArIHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJyZWdpb25cIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2lvbjtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9yZWdpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwidmVydGljYWxcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3ZlcnRpY2FsO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kRGlyZWN0aW9uU2V0dGluZyh2YWx1ZSk7XG4gICAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGZhbHNlIGJlY2F1c2UgdGhlIHNldHRpbmcgYW4gYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgICBpZiAoc2V0dGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF92ZXJ0aWNhbCA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInNuYXBUb0xpbmVzXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zbmFwVG9MaW5lcztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9zbmFwVG9MaW5lcyA9ICEhdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImxpbmVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2xpbmU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmIHZhbHVlICE9PSBhdXRvS2V5d29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgbnVtYmVyIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9saW5lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImxpbmVBbGlnblwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfbGluZUFsaWduO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKCFzZXR0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfbGluZUFsaWduID0gc2V0dGluZztcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwicG9zaXRpb25cIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3Bvc2l0aW9uO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvc2l0aW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9wb3NpdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJwb3NpdGlvbkFsaWduXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbkFsaWduO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKCFzZXR0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfcG9zaXRpb25BbGlnbiA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInNpemVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMTAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfc2l6ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJhbGlnblwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfYWxpZ247XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmRBbGlnblNldHRpbmcodmFsdWUpO1xuICAgICAgICBpZiAoIXNldHRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9hbGlnbiA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgLyoqXG4gICAqIE90aGVyIDx0cmFjaz4gc3BlYyBkZWZpbmVkIHByb3BlcnRpZXNcbiAgICovXG5cbiAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLXZpZGVvLWVsZW1lbnQuaHRtbCN0ZXh0LXRyYWNrLWN1ZS1kaXNwbGF5LXN0YXRlXG4gIGN1ZS5kaXNwbGF5U3RhdGUgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzSUU4KSB7XG4gICAgcmV0dXJuIGN1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFZUVEN1ZSBtZXRob2RzXG4gKi9cblxuVlRUQ3VlLnByb3RvdHlwZS5nZXRDdWVBc0hUTUwgPSBmdW5jdGlvbigpIHtcbiAgLy8gQXNzdW1lIFdlYlZUVC5jb252ZXJ0Q3VlVG9ET01UcmVlIGlzIG9uIHRoZSBnbG9iYWwuXG4gIHJldHVybiBXZWJWVFQuY29udmVydEN1ZVRvRE9NVHJlZSh3aW5kb3csIHRoaXMudGV4dCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZUVEN1ZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js\n");
/***/ }),
/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js":
/*!*****************************************************************************!*\
!*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar scrollSetting = {\n \"\": true,\n \"up\": true\n};\n\nfunction findScrollSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var scroll = scrollSetting[value.toLowerCase()];\n return scroll ? value.toLowerCase() : false;\n}\n\nfunction isValidPercentValue(value) {\n return typeof value === \"number\" && (value >= 0 && value <= 100);\n}\n\n// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface\nfunction VTTRegion() {\n var _width = 100;\n var _lines = 3;\n var _regionAnchorX = 0;\n var _regionAnchorY = 100;\n var _viewportAnchorX = 0;\n var _viewportAnchorY = 100;\n var _scroll = \"\";\n\n Object.defineProperties(this, {\n \"width\": {\n enumerable: true,\n get: function() {\n return _width;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"Width must be between 0 and 100.\");\n }\n _width = value;\n }\n },\n \"lines\": {\n enumerable: true,\n get: function() {\n return _lines;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Lines must be set to a number.\");\n }\n _lines = value;\n }\n },\n \"regionAnchorY\": {\n enumerable: true,\n get: function() {\n return _regionAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorX must be between 0 and 100.\");\n }\n _regionAnchorY = value;\n }\n },\n \"regionAnchorX\": {\n enumerable: true,\n get: function() {\n return _regionAnchorX;\n },\n set: function(value) {\n if(!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorY must be between 0 and 100.\");\n }\n _regionAnchorX = value;\n }\n },\n \"viewportAnchorY\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorY must be between 0 and 100.\");\n }\n _viewportAnchorY = value;\n }\n },\n \"viewportAnchorX\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorX;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorX must be between 0 and 100.\");\n }\n _viewportAnchorX = value;\n }\n },\n \"scroll\": {\n enumerable: true,\n get: function() {\n return _scroll;\n },\n set: function(value) {\n var setting = findScrollSetting(value);\n // Have to check for false as an empty string is a legal value.\n if (setting === false) {\n throw new SyntaxError(\"An invalid or illegal string was specified.\");\n }\n _scroll = setting;\n }\n }\n });\n}\n\nmodule.exports = VTTRegion;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0cmVnaW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dHJlZ2lvbi5qcz80MjAxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIHNjcm9sbFNldHRpbmcgPSB7XG4gIFwiXCI6IHRydWUsXG4gIFwidXBcIjogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZmluZFNjcm9sbFNldHRpbmcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc2Nyb2xsID0gc2Nyb2xsU2V0dGluZ1t2YWx1ZS50b0xvd2VyQ2FzZSgpXTtcbiAgcmV0dXJuIHNjcm9sbCA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEwMCk7XG59XG5cbi8vIFZUVFJlZ2lvbiBzaGltIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0cmVnaW9uLWludGVyZmFjZVxuZnVuY3Rpb24gVlRUUmVnaW9uKCkge1xuICB2YXIgX3dpZHRoID0gMTAwO1xuICB2YXIgX2xpbmVzID0gMztcbiAgdmFyIF9yZWdpb25BbmNob3JYID0gMDtcbiAgdmFyIF9yZWdpb25BbmNob3JZID0gMTAwO1xuICB2YXIgX3ZpZXdwb3J0QW5jaG9yWCA9IDA7XG4gIHZhciBfdmlld3BvcnRBbmNob3JZID0gMTAwO1xuICB2YXIgX3Njcm9sbCA9IFwiXCI7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIFwid2lkdGhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfd2lkdGg7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzVmFsaWRQZXJjZW50VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2lkdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3dpZHRoID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImxpbmVzXCI6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2xpbmVzO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJMaW5lcyBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX2xpbmVzID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInJlZ2lvbkFuY2hvcllcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfcmVnaW9uQW5jaG9yWTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWdpb25BbmNob3JYIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWdpb25BbmNob3JZID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInJlZ2lvbkFuY2hvclhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfcmVnaW9uQW5jaG9yWDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmKCFpc1ZhbGlkUGVyY2VudFZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbkFuY2hvclkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3JlZ2lvbkFuY2hvclggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwidmlld3BvcnRBbmNob3JZXCI6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3ZpZXdwb3J0QW5jaG9yWTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWaWV3cG9ydEFuY2hvclkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3ZpZXdwb3J0QW5jaG9yWSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJ2aWV3cG9ydEFuY2hvclhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfdmlld3BvcnRBbmNob3JYO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkUGVyY2VudFZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZpZXdwb3J0QW5jaG9yWCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfdmlld3BvcnRBbmNob3JYID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInNjcm9sbFwiOiB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zY3JvbGw7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmRTY3JvbGxTZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgZmFsc2UgYXMgYW4gZW1wdHkgc3RyaW5nIGlzIGEgbGVnYWwgdmFsdWUuXG4gICAgICAgIGlmIChzZXR0aW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3Njcm9sbCA9IHNldHRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBWVFRSZWdpb247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js\n");
/***/ }),
/***/ "./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js":
/*!**********************************************************************************************!*\
!*** ./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js ***!
\**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("!function(e,t){ true?module.exports=t(__webpack_require__(/*! swiper/dist/js/swiper.js */ \"./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js\")):undefined}(this,function(e){return function(e){function t(i){if(n[i])return n[i].exports;var s=n[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/\",t(t.s=4)}([function(t,n){t.exports=e},function(e,t){e.exports=function(e,t,n,i,s,r){var o,a=e=e||{},u=typeof e.default;\"object\"!==u&&\"function\"!==u||(o=e,a=e.default);var p=\"function\"==typeof a?a.options:a;t&&(p.render=t.render,p.staticRenderFns=t.staticRenderFns,p._compiled=!0),n&&(p.functional=!0),s&&(p._scopeId=s);var l;if(r?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},p._ssrRegister=l):i&&(l=i),l){var c=p.functional,d=c?p.render:p.beforeCreate;c?(p._injectStyles=l,p.render=function(e,t){return l.call(t),d(e,t)}):p.beforeCreate=d?[].concat(d,l):[l]}return{esModule:o,exports:a,options:p}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(5),s=n.n(i),r=n(8),o=n(1),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),s=n.n(i),r=n(7),o=n(1),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=t.swiperSlide=t.swiper=t.Swiper=void 0;var s=n(0),r=i(s),o=n(2),a=i(o),u=n(3),p=i(u),l=window.Swiper||r.default,c=p.default,d=a.default,f=function(e,t){t&&(p.default.props.globalOptions.default=function(){return t}),e.component(p.default.name,p.default),e.component(a.default.name,a.default)},h={Swiper:l,swiper:c,swiperSlide:d,install:f};t.default=h,t.Swiper=l,t.swiper=c,t.swiperSlide=d,t.install=f},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={name:\"swiper-slide\",data:function(){return{slideClass:\"swiper-slide\"}},ready:function(){this.update()},mounted:function(){this.update(),this.$parent&&this.$parent.options&&this.$parent.options.slideClass&&(this.slideClass=this.$parent.options.slideClass)},updated:function(){this.update()},attached:function(){this.update()},methods:{update:function(){this.$parent&&this.$parent.swiper&&this.$parent.update()}}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(0),s=function(e){return e&&e.__esModule?e:{default:e}}(i),r=window.Swiper||s.default;\"function\"!=typeof Object.assign&&Object.defineProperty(Object,\"assign\",{value:function(e,t){if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var n=Object(e),i=1;i<arguments.length;i++){var s=arguments[i];if(null!=s)for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(n[r]=s[r])}return n},writable:!0,configurable:!0});var o=[\"beforeDestroy\",\"slideChange\",\"slideChangeTransitionStart\",\"slideChangeTransitionEnd\",\"slideNextTransitionStart\",\"slideNextTransitionEnd\",\"slidePrevTransitionStart\",\"slidePrevTransitionEnd\",\"transitionStart\",\"transitionEnd\",\"touchStart\",\"touchMove\",\"touchMoveOpposite\",\"sliderMove\",\"touchEnd\",\"click\",\"tap\",\"doubleTap\",\"imagesReady\",\"progress\",\"reachBeginning\",\"reachEnd\",\"fromEdge\",\"setTranslate\",\"setTransition\",\"resize\"];t.default={name:\"swiper\",props:{options:{type:Object,default:function(){return{}}},globalOptions:{type:Object,required:!1,default:function(){return{}}}},data:function(){return{swiper:null,classes:{wrapperClass:\"swiper-wrapper\"}}},ready:function(){this.swiper||this.mountInstance()},mounted:function(){if(!this.swiper){var e=!1;for(var t in this.classes)this.classes.hasOwnProperty(t)&&this.options[t]&&(e=!0,this.classes[t]=this.options[t]);e?this.$nextTick(this.mountInstance):this.mountInstance()}},activated:function(){this.update()},updated:function(){this.update()},beforeDestroy:function(){this.$nextTick(function(){this.swiper&&(this.swiper.destroy&&this.swiper.destroy(),delete this.swiper)})},methods:{update:function(){this.swiper&&(this.swiper.update&&this.swiper.update(),this.swiper.navigation&&this.swiper.navigation.update(),this.swiper.pagination&&this.swiper.pagination.render(),this.swiper.pagination&&this.swiper.pagination.update())},mountInstance:function(){var e=Object.assign({},this.globalOptions,this.options);this.swiper=new r(this.$el,e),this.bindEvents(),this.$emit(\"ready\",this.swiper)},bindEvents:function(){var e=this,t=this;o.forEach(function(n){e.swiper.on(n,function(){t.$emit.apply(t,[n].concat(Array.prototype.slice.call(arguments))),t.$emit.apply(t,[n.replace(/([A-Z])/g,\"-$1\").toLowerCase()].concat(Array.prototype.slice.call(arguments)))})})}}}},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n(\"div\",{staticClass:\"swiper-container\"},[e._t(\"parallax-bg\"),e._v(\" \"),n(\"div\",{class:e.classes.wrapperClass},[e._t(\"default\")],2),e._v(\" \"),e._t(\"pagination\"),e._v(\" \"),e._t(\"button-prev\"),e._v(\" \"),e._t(\"button-next\"),e._v(\" \"),e._t(\"scrollbar\")],2)},s=[],r={render:i,staticRenderFns:s};t.a=r},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{class:e.slideClass},[e._t(\"default\")],2)},s=[],r={render:i,staticRenderFns:s};t.a=r}])});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1hd2Vzb21lLXN3aXBlckAzLjEuM0B2dWUtYXdlc29tZS1zd2lwZXIvZGlzdC92dWUtYXdlc29tZS1zd2lwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Z1ZS1hd2Vzb21lLXN3aXBlckAzLjEuM0B2dWUtYXdlc29tZS1zd2lwZXIvZGlzdC92dWUtYXdlc29tZS1zd2lwZXIuanM/NmZlOCJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanNcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJWdWVBd2Vzb21lU3dpcGVyXCIsW1wic3dpcGVyXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVnVlQXdlc29tZVN3aXBlcj10KHJlcXVpcmUoXCJzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanNcIikpOmUuVnVlQXdlc29tZVN3aXBlcj10KGUuU3dpcGVyKX0odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtpZihuW2ldKXJldHVybiBuW2ldLmV4cG9ydHM7dmFyIHM9bltpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbaV0uY2FsbChzLmV4cG9ydHMscyxzLmV4cG9ydHMsdCkscy5sPSEwLHMuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5pPWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LmQ9ZnVuY3Rpb24oZSxuLGkpe3QubyhlLG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6aX0pfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sdC5wPVwiL1wiLHQodC5zPTQpfShbZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSxzLHIpe3ZhciBvLGE9ZT1lfHx7fSx1PXR5cGVvZiBlLmRlZmF1bHQ7XCJvYmplY3RcIiE9PXUmJlwiZnVuY3Rpb25cIiE9PXV8fChvPWUsYT1lLmRlZmF1bHQpO3ZhciBwPVwiZnVuY3Rpb25cIj09dHlwZW9mIGE/YS5vcHRpb25zOmE7dCYmKHAucmVuZGVyPXQucmVuZGVyLHAuc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zLHAuX2NvbXBpbGVkPSEwKSxuJiYocC5mdW5jdGlvbmFsPSEwKSxzJiYocC5fc2NvcGVJZD1zKTt2YXIgbDtpZihyPyhsPWZ1bmN0aW9uKGUpe2U9ZXx8dGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR8fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC4kdm5vZGUmJnRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0LGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9ffHwoZT1fX1ZVRV9TU1JfQ09OVEVYVF9fKSxpJiZpLmNhbGwodGhpcyxlKSxlJiZlLl9yZWdpc3RlcmVkQ29tcG9uZW50cyYmZS5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKHIpfSxwLl9zc3JSZWdpc3Rlcj1sKTppJiYobD1pKSxsKXt2YXIgYz1wLmZ1bmN0aW9uYWwsZD1jP3AucmVuZGVyOnAuYmVmb3JlQ3JlYXRlO2M/KHAuX2luamVjdFN0eWxlcz1sLHAucmVuZGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwuY2FsbCh0KSxkKGUsdCl9KTpwLmJlZm9yZUNyZWF0ZT1kP1tdLmNvbmNhdChkLGwpOltsXX1yZXR1cm57ZXNNb2R1bGU6byxleHBvcnRzOmEsb3B0aW9uczpwfX19LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDUpLHM9bi5uKGkpLHI9big4KSxvPW4oMSksYT1vKHMuYSxyLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1hLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDYpLHM9bi5uKGkpLHI9big3KSxvPW4oMSksYT1vKHMuYSxyLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1hLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lmluc3RhbGw9dC5zd2lwZXJTbGlkZT10LnN3aXBlcj10LlN3aXBlcj12b2lkIDA7dmFyIHM9bigwKSxyPWkocyksbz1uKDIpLGE9aShvKSx1PW4oMykscD1pKHUpLGw9d2luZG93LlN3aXBlcnx8ci5kZWZhdWx0LGM9cC5kZWZhdWx0LGQ9YS5kZWZhdWx0LGY9ZnVuY3Rpb24oZSx0KXt0JiYocC5kZWZhdWx0LnByb3BzLmdsb2JhbE9wdGlvbnMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0fSksZS5jb21wb25lbnQocC5kZWZhdWx0Lm5hbWUscC5kZWZhdWx0KSxlLmNvbXBvbmVudChhLmRlZmF1bHQubmFtZSxhLmRlZmF1bHQpfSxoPXtTd2lwZXI6bCxzd2lwZXI6Yyxzd2lwZXJTbGlkZTpkLGluc3RhbGw6Zn07dC5kZWZhdWx0PWgsdC5Td2lwZXI9bCx0LnN3aXBlcj1jLHQuc3dpcGVyU2xpZGU9ZCx0Lmluc3RhbGw9Zn0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD17bmFtZTpcInN3aXBlci1zbGlkZVwiLGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c2xpZGVDbGFzczpcInN3aXBlci1zbGlkZVwifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZSgpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKSx0aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC5vcHRpb25zJiZ0aGlzLiRwYXJlbnQub3B0aW9ucy5zbGlkZUNsYXNzJiYodGhpcy5zbGlkZUNsYXNzPXRoaXMuJHBhcmVudC5vcHRpb25zLnNsaWRlQ2xhc3MpfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZSgpfSxtZXRob2RzOnt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC5zd2lwZXImJnRoaXMuJHBhcmVudC51cGRhdGUoKX19fX0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19KGkpLHI9d2luZG93LlN3aXBlcnx8cy5kZWZhdWx0O1wiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsXCJhc3NpZ25cIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3RcIik7Zm9yKHZhciBuPU9iamVjdChlKSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHM9YXJndW1lbnRzW2ldO2lmKG51bGwhPXMpZm9yKHZhciByIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMscikmJihuW3JdPXNbcl0pfXJldHVybiBufSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt2YXIgbz1bXCJiZWZvcmVEZXN0cm95XCIsXCJzbGlkZUNoYW5nZVwiLFwic2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnRcIixcInNsaWRlQ2hhbmdlVHJhbnNpdGlvbkVuZFwiLFwic2xpZGVOZXh0VHJhbnNpdGlvblN0YXJ0XCIsXCJzbGlkZU5leHRUcmFuc2l0aW9uRW5kXCIsXCJzbGlkZVByZXZUcmFuc2l0aW9uU3RhcnRcIixcInNsaWRlUHJldlRyYW5zaXRpb25FbmRcIixcInRyYW5zaXRpb25TdGFydFwiLFwidHJhbnNpdGlvbkVuZFwiLFwidG91Y2hTdGFydFwiLFwidG91Y2hNb3ZlXCIsXCJ0b3VjaE1vdmVPcHBvc2l0ZVwiLFwic2xpZGVyTW92ZVwiLFwidG91Y2hFbmRcIixcImNsaWNrXCIsXCJ0YXBcIixcImRvdWJsZVRhcFwiLFwiaW1hZ2VzUmVhZHlcIixcInByb2dyZXNzXCIsXCJyZWFjaEJlZ2lubmluZ1wiLFwicmVhY2hFbmRcIixcImZyb21FZGdlXCIsXCJzZXRUcmFuc2xhdGVcIixcInNldFRyYW5zaXRpb25cIixcInJlc2l6ZVwiXTt0LmRlZmF1bHQ9e25hbWU6XCJzd2lwZXJcIixwcm9wczp7b3B0aW9uczp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybnt9fX0sZ2xvYmFsT3B0aW9uczp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITEsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybnt9fX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c3dpcGVyOm51bGwsY2xhc3Nlczp7d3JhcHBlckNsYXNzOlwic3dpcGVyLXdyYXBwZXJcIn19fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc3dpcGVyfHx0aGlzLm1vdW50SW5zdGFuY2UoKX0sbW91bnRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLnN3aXBlcil7dmFyIGU9ITE7Zm9yKHZhciB0IGluIHRoaXMuY2xhc3Nlcyl0aGlzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkodCkmJnRoaXMub3B0aW9uc1t0XSYmKGU9ITAsdGhpcy5jbGFzc2VzW3RdPXRoaXMub3B0aW9uc1t0XSk7ZT90aGlzLiRuZXh0VGljayh0aGlzLm1vdW50SW5zdGFuY2UpOnRoaXMubW91bnRJbnN0YW5jZSgpfX0sYWN0aXZhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sdXBkYXRlZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlKCl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3RoaXMuc3dpcGVyJiYodGhpcy5zd2lwZXIuZGVzdHJveSYmdGhpcy5zd2lwZXIuZGVzdHJveSgpLGRlbGV0ZSB0aGlzLnN3aXBlcil9KX0sbWV0aG9kczp7dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zd2lwZXImJih0aGlzLnN3aXBlci51cGRhdGUmJnRoaXMuc3dpcGVyLnVwZGF0ZSgpLHRoaXMuc3dpcGVyLm5hdmlnYXRpb24mJnRoaXMuc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCksdGhpcy5zd2lwZXIucGFnaW5hdGlvbiYmdGhpcy5zd2lwZXIucGFnaW5hdGlvbi5yZW5kZXIoKSx0aGlzLnN3aXBlci5wYWdpbmF0aW9uJiZ0aGlzLnN3aXBlci5wYWdpbmF0aW9uLnVwZGF0ZSgpKX0sbW91bnRJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMub3B0aW9ucyk7dGhpcy5zd2lwZXI9bmV3IHIodGhpcy4kZWwsZSksdGhpcy5iaW5kRXZlbnRzKCksdGhpcy4kZW1pdChcInJlYWR5XCIsdGhpcy5zd2lwZXIpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXM7by5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Uuc3dpcGVyLm9uKG4sZnVuY3Rpb24oKXt0LiRlbWl0LmFwcGx5KHQsW25dLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSksdC4kZW1pdC5hcHBseSh0LFtuLnJlcGxhY2UoLyhbQS1aXSkvZyxcIi0kMVwiKS50b0xvd2VyQ2FzZSgpXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpfSl9KX19fX0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwic3dpcGVyLWNvbnRhaW5lclwifSxbZS5fdChcInBhcmFsbGF4LWJnXCIpLGUuX3YoXCIgXCIpLG4oXCJkaXZcIix7Y2xhc3M6ZS5jbGFzc2VzLndyYXBwZXJDbGFzc30sW2UuX3QoXCJkZWZhdWx0XCIpXSwyKSxlLl92KFwiIFwiKSxlLl90KFwicGFnaW5hdGlvblwiKSxlLl92KFwiIFwiKSxlLl90KFwiYnV0dG9uLXByZXZcIiksZS5fdihcIiBcIiksZS5fdChcImJ1dHRvbi1uZXh0XCIpLGUuX3YoXCIgXCIpLGUuX3QoXCJzY3JvbGxiYXJcIildLDIpfSxzPVtdLHI9e3JlbmRlcjppLHN0YXRpY1JlbmRlckZuczpzfTt0LmE9cn0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7cmV0dXJuKGUuX3NlbGYuX2N8fHQpKFwiZGl2XCIse2NsYXNzOmUuc2xpZGVDbGFzc30sW2UuX3QoXCJkZWZhdWx0XCIpXSwyKX0scz1bXSxyPXtyZW5kZXI6aSxzdGF0aWNSZW5kZXJGbnM6c307dC5hPXJ9XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js\n");
/***/ }),
/***/ "./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js":
/*!*********************************************************************************!*\
!*** ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var Vue // late bind\nvar version\nvar map = Object.create(null)\nif (typeof window !== 'undefined') {\n window.__VUE_HOT_MAP__ = map\n}\nvar installed = false\nvar isBrowserify = false\nvar initHookName = 'beforeCreate'\n\nexports.install = function (vue, browserify) {\n if (installed) { return }\n installed = true\n\n Vue = vue.__esModule ? vue.default : vue\n version = Vue.version.split('.').map(Number)\n isBrowserify = browserify\n\n // compat with < 2.0.0-alpha.7\n if (Vue.config._lifecycleHooks.indexOf('init') > -1) {\n initHookName = 'init'\n }\n\n exports.compatible = version[0] >= 2\n if (!exports.compatible) {\n console.warn(\n '[HMR] You are using a version of vue-hot-reload-api that is ' +\n 'only compatible with Vue.js core ^2.0.0.'\n )\n return\n }\n}\n\n/**\n * Create a record for a hot module, which keeps track of its constructor\n * and instances\n *\n * @param {String} id\n * @param {Object} options\n */\n\nexports.createRecord = function (id, options) {\n if(map[id]) { return }\n\n var Ctor = null\n if (typeof options === 'function') {\n Ctor = options\n options = Ctor.options\n }\n makeOptionsHot(id, options)\n map[id] = {\n Ctor: Ctor,\n options: options,\n instances: []\n }\n}\n\n/**\n * Check if module is recorded\n *\n * @param {String} id\n */\n\nexports.isRecorded = function (id) {\n return typeof map[id] !== 'undefined'\n}\n\n/**\n * Make a Component options object hot.\n *\n * @param {String} id\n * @param {Object} options\n */\n\nfunction makeOptionsHot(id, options) {\n if (options.functional) {\n var render = options.render\n options.render = function (h, ctx) {\n var instances = map[id].instances\n if (ctx && instances.indexOf(ctx.parent) < 0) {\n instances.push(ctx.parent)\n }\n return render(h, ctx)\n }\n } else {\n injectHook(options, initHookName, function() {\n var record = map[id]\n if (!record.Ctor) {\n record.Ctor = this.constructor\n }\n record.instances.push(this)\n })\n injectHook(options, 'beforeDestroy', function() {\n var instances = map[id].instances\n instances.splice(instances.indexOf(this), 1)\n })\n }\n}\n\n/**\n * Inject a hook to a hot reloadable component so that\n * we can keep track of it.\n *\n * @param {Object} options\n * @param {String} name\n * @param {Function} hook\n */\n\nfunction injectHook(options, name, hook) {\n var existing = options[name]\n options[name] = existing\n ? Array.isArray(existing) ? existing.concat(hook) : [existing, hook]\n : [hook]\n}\n\nfunction tryWrap(fn) {\n return function (id, arg) {\n try {\n fn(id, arg)\n } catch (e) {\n console.error(e)\n console.warn(\n 'Something went wrong during Vue component hot-reload. Full reload required.'\n )\n }\n }\n}\n\nfunction updateOptions (oldOptions, newOptions) {\n for (var key in oldOptions) {\n if (!(key in newOptions)) {\n delete oldOptions[key]\n }\n }\n for (var key$1 in newOptions) {\n oldOptions[key$1] = newOptions[key$1]\n }\n}\n\nexports.rerender = tryWrap(function (id, options) {\n var record = map[id]\n if (!options) {\n record.instances.slice().forEach(function (instance) {\n instance.$forceUpdate()\n })\n return\n }\n if (typeof options === 'function') {\n options = options.options\n }\n if (record.Ctor) {\n record.Ctor.options.render = options.render\n record.Ctor.options.staticRenderFns = options.staticRenderFns\n record.instances.slice().forEach(function (instance) {\n instance.$options.render = options.render\n instance.$options.staticRenderFns = options.staticRenderFns\n // reset static trees\n // pre 2.5, all static trees are cached together on the instance\n if (instance._staticTrees) {\n instance._staticTrees = []\n }\n // 2.5.0\n if (Array.isArray(record.Ctor.options.cached)) {\n record.Ctor.options.cached = []\n }\n // 2.5.3\n if (Array.isArray(instance.$options.cached)) {\n instance.$options.cached = []\n }\n\n // post 2.5.4: v-once trees are cached on instance._staticTrees.\n // Pure static trees are cached on the staticRenderFns array\n // (both already reset above)\n\n // 2.6: temporarily mark rendered scoped slots as unstable so that\n // child components can be forced to update\n var restore = patchScopedSlots(instance)\n instance.$forceUpdate()\n instance.$nextTick(restore)\n })\n } else {\n // functional or no instance created yet\n record.options.render = options.render\n record.options.staticRenderFns = options.staticRenderFns\n\n // handle functional component re-render\n if (record.options.functional) {\n // rerender with full options\n if (Object.keys(options).length > 2) {\n updateOptions(record.options, options)\n } else {\n // template-only rerender.\n // need to inject the style injection code for CSS modules\n // to work properly.\n var injectStyles = record.options._injectStyles\n if (injectStyles) {\n var render = options.render\n record.options.render = function (h, ctx) {\n injectStyles.call(ctx)\n return render(h, ctx)\n }\n }\n }\n record.options._Ctor = null\n // 2.5.3\n if (Array.isArray(record.options.cached)) {\n record.options.cached = []\n }\n record.instances.slice().forEach(function (instance) {\n instance.$forceUpdate()\n })\n }\n }\n})\n\nexports.reload = tryWrap(function (id, options) {\n var record = map[id]\n if (options) {\n if (typeof options === 'function') {\n options = options.options\n }\n makeOptionsHot(id, options)\n if (record.Ctor) {\n if (version[1] < 2) {\n // preserve pre 2.2 behavior for global mixin handling\n record.Ctor.extendOptions = options\n }\n var newCtor = record.Ctor.super.extend(options)\n // prevent record.options._Ctor from being overwritten accidentally\n newCtor.options._Ctor = record.options._Ctor\n record.Ctor.options = newCtor.options\n record.Ctor.cid = newCtor.cid\n record.Ctor.prototype = newCtor.prototype\n if (newCtor.release) {\n // temporary global mixin strategy used in < 2.0.0-alpha.6\n newCtor.release()\n }\n } else {\n updateOptions(record.options, options)\n }\n }\n record.instances.slice().forEach(function (instance) {\n if (instance.$vnode && instance.$vnode.context) {\n instance.$vnode.context.$forceUpdate()\n } else {\n console.warn(\n 'Root or manually mounted instance modified. Full reload required.'\n )\n }\n })\n})\n\n// 2.6 optimizes template-compiled scoped slots and skips updates if child\n// only uses scoped slots. We need to patch the scoped slots resolving helper\n// to temporarily mark all scoped slots as unstable in order to force child\n// updates.\nfunction patchScopedSlots (instance) {\n if (!instance._u) { return }\n // https://github.com/vuejs/vue/blob/dev/src/core/instance/render-helpers/resolve-scoped-slots.js\n var original = instance._u\n instance._u = function (slots) {\n try {\n // 2.6.4 ~ 2.6.6\n return original(slots, true)\n } catch (e) {\n // 2.5 / >= 2.6.7\n return original(slots, null, true)\n }\n }\n return function () {\n instance._u = original\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWhvdC1yZWxvYWQtYXBpQDIuMy40QHZ1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzP2Q1NDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFZ1ZSAvLyBsYXRlIGJpbmRcbnZhciB2ZXJzaW9uXG52YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5fX1ZVRV9IT1RfTUFQX18gPSBtYXBcbn1cbnZhciBpbnN0YWxsZWQgPSBmYWxzZVxudmFyIGlzQnJvd3NlcmlmeSA9IGZhbHNlXG52YXIgaW5pdEhvb2tOYW1lID0gJ2JlZm9yZUNyZWF0ZSdcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKHZ1ZSwgYnJvd3NlcmlmeSkge1xuICBpZiAoaW5zdGFsbGVkKSB7IHJldHVybiB9XG4gIGluc3RhbGxlZCA9IHRydWVcblxuICBWdWUgPSB2dWUuX19lc01vZHVsZSA/IHZ1ZS5kZWZhdWx0IDogdnVlXG4gIHZlcnNpb24gPSBWdWUudmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpXG4gIGlzQnJvd3NlcmlmeSA9IGJyb3dzZXJpZnlcblxuICAvLyBjb21wYXQgd2l0aCA8IDIuMC4wLWFscGhhLjdcbiAgaWYgKFZ1ZS5jb25maWcuX2xpZmVjeWNsZUhvb2tzLmluZGV4T2YoJ2luaXQnKSA+IC0xKSB7XG4gICAgaW5pdEhvb2tOYW1lID0gJ2luaXQnXG4gIH1cblxuICBleHBvcnRzLmNvbXBhdGlibGUgPSB2ZXJzaW9uWzBdID49IDJcbiAgaWYgKCFleHBvcnRzLmNvbXBhdGlibGUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW0hNUl0gWW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgdnVlLWhvdC1yZWxvYWQtYXBpIHRoYXQgaXMgJyArXG4gICAgICAgICdvbmx5IGNvbXBhdGlibGUgd2l0aCBWdWUuanMgY29yZSBeMi4wLjAuJ1xuICAgIClcbiAgICByZXR1cm5cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlY29yZCBmb3IgYSBob3QgbW9kdWxlLCB3aGljaCBrZWVwcyB0cmFjayBvZiBpdHMgY29uc3RydWN0b3JcbiAqIGFuZCBpbnN0YW5jZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZXhwb3J0cy5jcmVhdGVSZWNvcmQgPSBmdW5jdGlvbiAoaWQsIG9wdGlvbnMpIHtcbiAgaWYobWFwW2lkXSkgeyByZXR1cm4gfVxuXG4gIHZhciBDdG9yID0gbnVsbFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBDdG9yID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnNcbiAgfVxuICBtYWtlT3B0aW9uc0hvdChpZCwgb3B0aW9ucylcbiAgbWFwW2lkXSA9IHtcbiAgICBDdG9yOiBDdG9yLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgaW5zdGFuY2VzOiBbXVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW9kdWxlIGlzIHJlY29yZGVkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGlkXG4gKi9cblxuZXhwb3J0cy5pc1JlY29yZGVkID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwW2lkXSAhPT0gJ3VuZGVmaW5lZCdcbn1cblxuLyoqXG4gKiBNYWtlIGEgQ29tcG9uZW50IG9wdGlvbnMgb2JqZWN0IGhvdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gbWFrZU9wdGlvbnNIb3QoaWQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgIHZhciByZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gKGgsIGN0eCkge1xuICAgICAgdmFyIGluc3RhbmNlcyA9IG1hcFtpZF0uaW5zdGFuY2VzXG4gICAgICBpZiAoY3R4ICYmIGluc3RhbmNlcy5pbmRleE9mKGN0eC5wYXJlbnQpIDwgMCkge1xuICAgICAgICBpbnN0YW5jZXMucHVzaChjdHgucGFyZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbmRlcihoLCBjdHgpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluamVjdEhvb2sob3B0aW9ucywgaW5pdEhvb2tOYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWNvcmQgPSBtYXBbaWRdXG4gICAgICBpZiAoIXJlY29yZC5DdG9yKSB7XG4gICAgICAgIHJlY29yZC5DdG9yID0gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgfVxuICAgICAgcmVjb3JkLmluc3RhbmNlcy5wdXNoKHRoaXMpXG4gICAgfSlcbiAgICBpbmplY3RIb29rKG9wdGlvbnMsICdiZWZvcmVEZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaW5zdGFuY2VzID0gbWFwW2lkXS5pbnN0YW5jZXNcbiAgICAgIGluc3RhbmNlcy5zcGxpY2UoaW5zdGFuY2VzLmluZGV4T2YodGhpcyksIDEpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdCBhIGhvb2sgdG8gYSBob3QgcmVsb2FkYWJsZSBjb21wb25lbnQgc28gdGhhdFxuICogd2UgY2FuIGtlZXAgdHJhY2sgb2YgaXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rXG4gKi9cblxuZnVuY3Rpb24gaW5qZWN0SG9vayhvcHRpb25zLCBuYW1lLCBob29rKSB7XG4gIHZhciBleGlzdGluZyA9IG9wdGlvbnNbbmFtZV1cbiAgb3B0aW9uc1tuYW1lXSA9IGV4aXN0aW5nXG4gICAgPyBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IGV4aXN0aW5nLmNvbmNhdChob29rKSA6IFtleGlzdGluZywgaG9va11cbiAgICA6IFtob29rXVxufVxuXG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaWQsIGFyZykge1xuICAgIHRyeSB7XG4gICAgICBmbihpZCwgYXJnKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1NvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLidcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyAob2xkT3B0aW9ucywgbmV3T3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb2xkT3B0aW9ucykge1xuICAgIGlmICghKGtleSBpbiBuZXdPcHRpb25zKSkge1xuICAgICAgZGVsZXRlIG9sZE9wdGlvbnNba2V5XVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBrZXkkMSBpbiBuZXdPcHRpb25zKSB7XG4gICAgb2xkT3B0aW9uc1trZXkkMV0gPSBuZXdPcHRpb25zW2tleSQxXVxuICB9XG59XG5cbmV4cG9ydHMucmVyZW5kZXIgPSB0cnlXcmFwKGZ1bmN0aW9uIChpZCwgb3B0aW9ucykge1xuICB2YXIgcmVjb3JkID0gbWFwW2lkXVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZWNvcmQuaW5zdGFuY2VzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLiRmb3JjZVVwZGF0ZSgpXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucy5vcHRpb25zXG4gIH1cbiAgaWYgKHJlY29yZC5DdG9yKSB7XG4gICAgcmVjb3JkLkN0b3Iub3B0aW9ucy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgIHJlY29yZC5DdG9yLm9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNcbiAgICByZWNvcmQuaW5zdGFuY2VzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLiRvcHRpb25zLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBpbnN0YW5jZS4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuc1xuICAgICAgLy8gcmVzZXQgc3RhdGljIHRyZWVzXG4gICAgICAvLyBwcmUgMi41LCBhbGwgc3RhdGljIHRyZWVzIGFyZSBjYWNoZWQgdG9nZXRoZXIgb24gdGhlIGluc3RhbmNlXG4gICAgICBpZiAoaW5zdGFuY2UuX3N0YXRpY1RyZWVzKSB7XG4gICAgICAgIGluc3RhbmNlLl9zdGF0aWNUcmVlcyA9IFtdXG4gICAgICB9XG4gICAgICAvLyAyLjUuMFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkLkN0b3Iub3B0aW9ucy5jYWNoZWQpKSB7XG4gICAgICAgIHJlY29yZC5DdG9yLm9wdGlvbnMuY2FjaGVkID0gW11cbiAgICAgIH1cbiAgICAgIC8vIDIuNS4zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnN0YW5jZS4kb3B0aW9ucy5jYWNoZWQpKSB7XG4gICAgICAgIGluc3RhbmNlLiRvcHRpb25zLmNhY2hlZCA9IFtdXG4gICAgICB9XG5cbiAgICAgIC8vIHBvc3QgMi41LjQ6IHYtb25jZSB0cmVlcyBhcmUgY2FjaGVkIG9uIGluc3RhbmNlLl9zdGF0aWNUcmVlcy5cbiAgICAgIC8vIFB1cmUgc3RhdGljIHRyZWVzIGFyZSBjYWNoZWQgb24gdGhlIHN0YXRpY1JlbmRlckZucyBhcnJheVxuICAgICAgLy8gKGJvdGggYWxyZWFkeSByZXNldCBhYm92ZSlcblxuICAgICAgLy8gMi42OiB0ZW1wb3JhcmlseSBtYXJrIHJlbmRlcmVkIHNjb3BlZCBzbG90cyBhcyB1bnN0YWJsZSBzbyB0aGF0XG4gICAgICAvLyBjaGlsZCBjb21wb25lbnRzIGNhbiBiZSBmb3JjZWQgdG8gdXBkYXRlXG4gICAgICB2YXIgcmVzdG9yZSA9IHBhdGNoU2NvcGVkU2xvdHMoaW5zdGFuY2UpXG4gICAgICBpbnN0YW5jZS4kZm9yY2VVcGRhdGUoKVxuICAgICAgaW5zdGFuY2UuJG5leHRUaWNrKHJlc3RvcmUpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBmdW5jdGlvbmFsIG9yIG5vIGluc3RhbmNlIGNyZWF0ZWQgeWV0XG4gICAgcmVjb3JkLm9wdGlvbnMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICByZWNvcmQub3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuc1xuXG4gICAgLy8gaGFuZGxlIGZ1bmN0aW9uYWwgY29tcG9uZW50IHJlLXJlbmRlclxuICAgIGlmIChyZWNvcmQub3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyByZXJlbmRlciB3aXRoIGZ1bGwgb3B0aW9uc1xuICAgICAgaWYgKE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdXBkYXRlT3B0aW9ucyhyZWNvcmQub3B0aW9ucywgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRlbXBsYXRlLW9ubHkgcmVyZW5kZXIuXG4gICAgICAgIC8vIG5lZWQgdG8gaW5qZWN0IHRoZSBzdHlsZSBpbmplY3Rpb24gY29kZSBmb3IgQ1NTIG1vZHVsZXNcbiAgICAgICAgLy8gdG8gd29yayBwcm9wZXJseS5cbiAgICAgICAgdmFyIGluamVjdFN0eWxlcyA9IHJlY29yZC5vcHRpb25zLl9pbmplY3RTdHlsZXNcbiAgICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICAgIHZhciByZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgICAgIHJlY29yZC5vcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIChoLCBjdHgpIHtcbiAgICAgICAgICAgIGluamVjdFN0eWxlcy5jYWxsKGN0eClcbiAgICAgICAgICAgIHJldHVybiByZW5kZXIoaCwgY3R4KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjb3JkLm9wdGlvbnMuX0N0b3IgPSBudWxsXG4gICAgICAvLyAyLjUuM1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkLm9wdGlvbnMuY2FjaGVkKSkge1xuICAgICAgICByZWNvcmQub3B0aW9ucy5jYWNoZWQgPSBbXVxuICAgICAgfVxuICAgICAgcmVjb3JkLmluc3RhbmNlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlLiRmb3JjZVVwZGF0ZSgpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcblxuZXhwb3J0cy5yZWxvYWQgPSB0cnlXcmFwKGZ1bmN0aW9uIChpZCwgb3B0aW9ucykge1xuICB2YXIgcmVjb3JkID0gbWFwW2lkXVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMub3B0aW9uc1xuICAgIH1cbiAgICBtYWtlT3B0aW9uc0hvdChpZCwgb3B0aW9ucylcbiAgICBpZiAocmVjb3JkLkN0b3IpIHtcbiAgICAgIGlmICh2ZXJzaW9uWzFdIDwgMikge1xuICAgICAgICAvLyBwcmVzZXJ2ZSBwcmUgMi4yIGJlaGF2aW9yIGZvciBnbG9iYWwgbWl4aW4gaGFuZGxpbmdcbiAgICAgICAgcmVjb3JkLkN0b3IuZXh0ZW5kT3B0aW9ucyA9IG9wdGlvbnNcbiAgICAgIH1cbiAgICAgIHZhciBuZXdDdG9yID0gcmVjb3JkLkN0b3Iuc3VwZXIuZXh0ZW5kKG9wdGlvbnMpXG4gICAgICAvLyBwcmV2ZW50IHJlY29yZC5vcHRpb25zLl9DdG9yIGZyb20gYmVpbmcgb3ZlcndyaXR0ZW4gYWNjaWRlbnRhbGx5XG4gICAgICBuZXdDdG9yLm9wdGlvbnMuX0N0b3IgPSByZWNvcmQub3B0aW9ucy5fQ3RvclxuICAgICAgcmVjb3JkLkN0b3Iub3B0aW9ucyA9IG5ld0N0b3Iub3B0aW9uc1xuICAgICAgcmVjb3JkLkN0b3IuY2lkID0gbmV3Q3Rvci5jaWRcbiAgICAgIHJlY29yZC5DdG9yLnByb3RvdHlwZSA9IG5ld0N0b3IucHJvdG90eXBlXG4gICAgICBpZiAobmV3Q3Rvci5yZWxlYXNlKSB7XG4gICAgICAgIC8vIHRlbXBvcmFyeSBnbG9iYWwgbWl4aW4gc3RyYXRlZ3kgdXNlZCBpbiA8IDIuMC4wLWFscGhhLjZcbiAgICAgICAgbmV3Q3Rvci5yZWxlYXNlKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlT3B0aW9ucyhyZWNvcmQub3B0aW9ucywgb3B0aW9ucylcbiAgICB9XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgaWYgKGluc3RhbmNlLiR2bm9kZSAmJiBpbnN0YW5jZS4kdm5vZGUuY29udGV4dCkge1xuICAgICAgaW5zdGFuY2UuJHZub2RlLmNvbnRleHQuJGZvcmNlVXBkYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC4nXG4gICAgICApXG4gICAgfVxuICB9KVxufSlcblxuLy8gMi42IG9wdGltaXplcyB0ZW1wbGF0ZS1jb21waWxlZCBzY29wZWQgc2xvdHMgYW5kIHNraXBzIHVwZGF0ZXMgaWYgY2hpbGRcbi8vIG9ubHkgdXNlcyBzY29wZWQgc2xvdHMuIFdlIG5lZWQgdG8gcGF0Y2ggdGhlIHNjb3BlZCBzbG90cyByZXNvbHZpbmcgaGVscGVyXG4vLyB0byB0ZW1wb3JhcmlseSBtYXJrIGFsbCBzY29wZWQgc2xvdHMgYXMgdW5zdGFibGUgaW4gb3JkZXIgdG8gZm9yY2UgY2hpbGRcbi8vIHVwZGF0ZXMuXG5mdW5jdGlvbiBwYXRjaFNjb3BlZFNsb3RzIChpbnN0YW5jZSkge1xuICBpZiAoIWluc3RhbmNlLl91KSB7IHJldHVybiB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvYmxvYi9kZXYvc3JjL2NvcmUvaW5zdGFuY2UvcmVuZGVyLWhlbHBlcnMvcmVzb2x2ZS1zY29wZWQtc2xvdHMuanNcbiAgdmFyIG9yaWdpbmFsID0gaW5zdGFuY2UuX3VcbiAgaW5zdGFuY2UuX3UgPSBmdW5jdGlvbiAoc2xvdHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gMi42LjQgfiAyLjYuNlxuICAgICAgcmV0dXJuIG9yaWdpbmFsKHNsb3RzLCB0cnVlKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIDIuNSAvID49IDIuNi43XG4gICAgICByZXR1cm4gb3JpZ2luYWwoc2xvdHMsIG51bGwsIHRydWUpXG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaW5zdGFuY2UuX3UgPSBvcmlnaW5hbFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\n");
/***/ }),
/***/ "./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js":
/*!*********************************************************************!*\
!*** ./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js ***!
\*********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/*!\n * vue-i18n v8.15.0 \n * (c) 2019 kazuya kawaguchi\n * Released under the MIT License.\n */\n/* */\n\n/**\n * constants\n */\n\nvar numberFormatKeys = [\n 'style',\n 'currency',\n 'currencyDisplay',\n 'useGrouping',\n 'minimumIntegerDigits',\n 'minimumFractionDigits',\n 'maximumFractionDigits',\n 'minimumSignificantDigits',\n 'maximumSignificantDigits',\n 'localeMatcher',\n 'formatMatcher'\n];\n\n/**\n * utilities\n */\n\nfunction warn (msg, err) {\n if (typeof console !== 'undefined') {\n console.warn('[vue-i18n] ' + msg);\n /* istanbul ignore if */\n if (err) {\n console.warn(err.stack);\n }\n }\n}\n\nfunction error (msg, err) {\n if (typeof console !== 'undefined') {\n console.error('[vue-i18n] ' + msg);\n /* istanbul ignore if */\n if (err) {\n console.error(err.stack);\n }\n }\n}\n\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\nvar toString = Object.prototype.toString;\nvar OBJECT_STRING = '[object Object]';\nfunction isPlainObject (obj) {\n return toString.call(obj) === OBJECT_STRING\n}\n\nfunction isNull (val) {\n return val === null || val === undefined\n}\n\nfunction parseArgs () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var locale = null;\n var params = null;\n if (args.length === 1) {\n if (isObject(args[0]) || Array.isArray(args[0])) {\n params = args[0];\n } else if (typeof args[0] === 'string') {\n locale = args[0];\n }\n } else if (args.length === 2) {\n if (typeof args[0] === 'string') {\n locale = args[0];\n }\n /* istanbul ignore if */\n if (isObject(args[1]) || Array.isArray(args[1])) {\n params = args[1];\n }\n }\n\n return { locale: locale, params: params }\n}\n\nfunction looseClone (obj) {\n return JSON.parse(JSON.stringify(obj))\n}\n\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\nfunction merge (target) {\n var arguments$1 = arguments;\n\n var output = Object(target);\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments$1[i];\n if (source !== undefined && source !== null) {\n var key = (void 0);\n for (key in source) {\n if (hasOwn(source, key)) {\n if (isObject(source[key])) {\n output[key] = merge(output[key], source[key]);\n } else {\n output[key] = source[key];\n }\n }\n }\n }\n }\n return output\n}\n\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\n/* */\n\nfunction extend (Vue) {\n if (!Vue.prototype.hasOwnProperty('$i18n')) {\n // $FlowFixMe\n Object.defineProperty(Vue.prototype, '$i18n', {\n get: function get () { return this._i18n }\n });\n }\n\n Vue.prototype.$t = function (key) {\n var values = [], len = arguments.length - 1;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n\n var i18n = this.$i18n;\n return i18n._t.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this ].concat( values ))\n };\n\n Vue.prototype.$tc = function (key, choice) {\n var values = [], len = arguments.length - 2;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n\n var i18n = this.$i18n;\n return i18n._tc.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this, choice ].concat( values ))\n };\n\n Vue.prototype.$te = function (key, locale) {\n var i18n = this.$i18n;\n return i18n._te(key, i18n.locale, i18n._getMessages(), locale)\n };\n\n Vue.prototype.$d = function (value) {\n var ref;\n\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n return (ref = this.$i18n).d.apply(ref, [ value ].concat( args ))\n };\n\n Vue.prototype.$n = function (value) {\n var ref;\n\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n return (ref = this.$i18n).n.apply(ref, [ value ].concat( args ))\n };\n}\n\n/* */\n\nvar mixin = {\n beforeCreate: function beforeCreate () {\n var options = this.$options;\n options.i18n = options.i18n || (options.__i18n ? {} : null);\n\n if (options.i18n) {\n if (options.i18n instanceof VueI18n) {\n // init locale messages via custom blocks\n if (options.__i18n) {\n try {\n var localeMessages = {};\n options.__i18n.forEach(function (resource) {\n localeMessages = merge(localeMessages, JSON.parse(resource));\n });\n Object.keys(localeMessages).forEach(function (locale) {\n options.i18n.mergeLocaleMessage(locale, localeMessages[locale]);\n });\n } catch (e) {\n if (true) {\n warn(\"Cannot parse locale messages via custom blocks.\", e);\n }\n }\n }\n this._i18n = options.i18n;\n this._i18nWatcher = this._i18n.watchI18nData();\n } else if (isPlainObject(options.i18n)) {\n // component local i18n\n if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n options.i18n.root = this.$root;\n options.i18n.formatter = this.$root.$i18n.formatter;\n options.i18n.fallbackLocale = this.$root.$i18n.fallbackLocale;\n options.i18n.formatFallbackMessages = this.$root.$i18n.formatFallbackMessages;\n options.i18n.silentTranslationWarn = this.$root.$i18n.silentTranslationWarn;\n options.i18n.silentFallbackWarn = this.$root.$i18n.silentFallbackWarn;\n options.i18n.pluralizationRules = this.$root.$i18n.pluralizationRules;\n options.i18n.preserveDirectiveContent = this.$root.$i18n.preserveDirectiveContent;\n }\n\n // init locale messages via custom blocks\n if (options.__i18n) {\n try {\n var localeMessages$1 = {};\n options.__i18n.forEach(function (resource) {\n localeMessages$1 = merge(localeMessages$1, JSON.parse(resource));\n });\n options.i18n.messages = localeMessages$1;\n } catch (e) {\n if (true) {\n warn(\"Cannot parse locale messages via custom blocks.\", e);\n }\n }\n }\n\n var ref = options.i18n;\n var sharedMessages = ref.sharedMessages;\n if (sharedMessages && isPlainObject(sharedMessages)) {\n options.i18n.messages = merge(options.i18n.messages, sharedMessages);\n }\n\n this._i18n = new VueI18n(options.i18n);\n this._i18nWatcher = this._i18n.watchI18nData();\n\n if (options.i18n.sync === undefined || !!options.i18n.sync) {\n this._localeWatcher = this.$i18n.watchLocale();\n }\n } else {\n if (true) {\n warn(\"Cannot be interpreted 'i18n' option.\");\n }\n }\n } else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n // root i18n\n this._i18n = this.$root.$i18n;\n } else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {\n // parent i18n\n this._i18n = options.parent.$i18n;\n }\n },\n\n beforeMount: function beforeMount () {\n var options = this.$options;\n options.i18n = options.i18n || (options.__i18n ? {} : null);\n\n if (options.i18n) {\n if (options.i18n instanceof VueI18n) {\n // init locale messages via custom blocks\n this._i18n.subscribeDataChanging(this);\n this._subscribing = true;\n } else if (isPlainObject(options.i18n)) {\n this._i18n.subscribeDataChanging(this);\n this._subscribing = true;\n } else {\n if (true) {\n warn(\"Cannot be interpreted 'i18n' option.\");\n }\n }\n } else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n this._i18n.subscribeDataChanging(this);\n this._subscribing = true;\n } else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {\n this._i18n.subscribeDataChanging(this);\n this._subscribing = true;\n }\n },\n\n beforeDestroy: function beforeDestroy () {\n if (!this._i18n) { return }\n\n var self = this;\n this.$nextTick(function () {\n if (self._subscribing) {\n self._i18n.unsubscribeDataChanging(self);\n delete self._subscribing;\n }\n\n if (self._i18nWatcher) {\n self._i18nWatcher();\n self._i18n.destroyVM();\n delete self._i18nWatcher;\n }\n\n if (self._localeWatcher) {\n self._localeWatcher();\n delete self._localeWatcher;\n }\n\n self._i18n = null;\n });\n }\n};\n\n/* */\n\nvar interpolationComponent = {\n name: 'i18n',\n functional: true,\n props: {\n tag: {\n type: String\n },\n path: {\n type: String,\n required: true\n },\n locale: {\n type: String\n },\n places: {\n type: [Array, Object]\n }\n },\n render: function render (h, ref) {\n var data = ref.data;\n var parent = ref.parent;\n var props = ref.props;\n var slots = ref.slots;\n\n var $i18n = parent.$i18n;\n if (!$i18n) {\n if (true) {\n warn('Cannot find VueI18n instance!');\n }\n return\n }\n\n var path = props.path;\n var locale = props.locale;\n var places = props.places;\n var params = slots();\n var children = $i18n.i(\n path,\n locale,\n onlyHasDefaultPlace(params) || places\n ? useLegacyPlaces(params.default, places)\n : params\n );\n\n var tag = props.tag || 'span';\n return tag ? h(tag, data, children) : children\n }\n};\n\nfunction onlyHasDefaultPlace (params) {\n var prop;\n for (prop in params) {\n if (prop !== 'default') { return false }\n }\n return Boolean(prop)\n}\n\nfunction useLegacyPlaces (children, places) {\n var params = places ? createParamsFromPlaces(places) : {};\n\n if (!children) { return params }\n\n // Filter empty text nodes\n children = children.filter(function (child) {\n return child.tag || child.text.trim() !== ''\n });\n\n var everyPlace = children.every(vnodeHasPlaceAttribute);\n if ( true && everyPlace) {\n warn('`place` attribute is deprecated in next major version. Please switch to Vue slots.');\n }\n\n return children.reduce(\n everyPlace ? assignChildPlace : assignChildIndex,\n params\n )\n}\n\nfunction createParamsFromPlaces (places) {\n if (true) {\n warn('`places` prop is deprecated in next major version. Please switch to Vue slots.');\n }\n\n return Array.isArray(places)\n ? places.reduce(assignChildIndex, {})\n : Object.assign({}, places)\n}\n\nfunction assignChildPlace (params, child) {\n if (child.data && child.data.attrs && child.data.attrs.place) {\n params[child.data.attrs.place] = child;\n }\n return params\n}\n\nfunction assignChildIndex (params, child, index) {\n params[index] = child;\n return params\n}\n\nfunction vnodeHasPlaceAttribute (vnode) {\n return Boolean(vnode.data && vnode.data.attrs && vnode.data.attrs.place)\n}\n\n/* */\n\nvar numberComponent = {\n name: 'i18n-n',\n functional: true,\n props: {\n tag: {\n type: String,\n default: 'span'\n },\n value: {\n type: Number,\n required: true\n },\n format: {\n type: [String, Object]\n },\n locale: {\n type: String\n }\n },\n render: function render (h, ref) {\n var props = ref.props;\n var parent = ref.parent;\n var data = ref.data;\n\n var i18n = parent.$i18n;\n\n if (!i18n) {\n if (true) {\n warn('Cannot find VueI18n instance!');\n }\n return null\n }\n\n var key = null;\n var options = null;\n\n if (typeof props.format === 'string') {\n key = props.format;\n } else if (isObject(props.format)) {\n if (props.format.key) {\n key = props.format.key;\n }\n\n // Filter out number format options only\n options = Object.keys(props.format).reduce(function (acc, prop) {\n var obj;\n\n if (numberFormatKeys.includes(prop)) {\n return Object.assign({}, acc, ( obj = {}, obj[prop] = props.format[prop], obj ))\n }\n return acc\n }, null);\n }\n\n var locale = props.locale || i18n.locale;\n var parts = i18n._ntp(props.value, locale, key, options);\n\n var values = parts.map(function (part, index) {\n var obj;\n\n var slot = data.scopedSlots && data.scopedSlots[part.type];\n return slot ? slot(( obj = {}, obj[part.type] = part.value, obj.index = index, obj.parts = parts, obj )) : part.value\n });\n\n return h(props.tag, {\n attrs: data.attrs,\n 'class': data['class'],\n staticClass: data.staticClass\n }, values)\n }\n};\n\n/* */\n\nfunction bind (el, binding, vnode) {\n if (!assert(el, vnode)) { return }\n\n t(el, binding, vnode);\n}\n\nfunction update (el, binding, vnode, oldVNode) {\n if (!assert(el, vnode)) { return }\n\n var i18n = vnode.context.$i18n;\n if (localeEqual(el, vnode) &&\n (looseEqual(binding.value, binding.oldValue) &&\n looseEqual(el._localeMessage, i18n.getLocaleMessage(i18n.locale)))) { return }\n\n t(el, binding, vnode);\n}\n\nfunction unbind (el, binding, vnode, oldVNode) {\n var vm = vnode.context;\n if (!vm) {\n warn('Vue instance does not exists in VNode context');\n return\n }\n\n var i18n = vnode.context.$i18n || {};\n if (!binding.modifiers.preserve && !i18n.preserveDirectiveContent) {\n el.textContent = '';\n }\n el._vt = undefined;\n delete el['_vt'];\n el._locale = undefined;\n delete el['_locale'];\n el._localeMessage = undefined;\n delete el['_localeMessage'];\n}\n\nfunction assert (el, vnode) {\n var vm = vnode.context;\n if (!vm) {\n warn('Vue instance does not exists in VNode context');\n return false\n }\n\n if (!vm.$i18n) {\n warn('VueI18n instance does not exists in Vue instance');\n return false\n }\n\n return true\n}\n\nfunction localeEqual (el, vnode) {\n var vm = vnode.context;\n return el._locale === vm.$i18n.locale\n}\n\nfunction t (el, binding, vnode) {\n var ref$1, ref$2;\n\n var value = binding.value;\n\n var ref = parseValue(value);\n var path = ref.path;\n var locale = ref.locale;\n var args = ref.args;\n var choice = ref.choice;\n if (!path && !locale && !args) {\n warn('value type not supported');\n return\n }\n\n if (!path) {\n warn('`path` is required in v-t directive');\n return\n }\n\n var vm = vnode.context;\n if (choice) {\n el._vt = el.textContent = (ref$1 = vm.$i18n).tc.apply(ref$1, [ path, choice ].concat( makeParams(locale, args) ));\n } else {\n el._vt = el.textContent = (ref$2 = vm.$i18n).t.apply(ref$2, [ path ].concat( makeParams(locale, args) ));\n }\n el._locale = vm.$i18n.locale;\n el._localeMessage = vm.$i18n.getLocaleMessage(vm.$i18n.locale);\n}\n\nfunction parseValue (value) {\n var path;\n var locale;\n var args;\n var choice;\n\n if (typeof value === 'string') {\n path = value;\n } else if (isPlainObject(value)) {\n path = value.path;\n locale = value.locale;\n args = value.args;\n choice = value.choice;\n }\n\n return { path: path, locale: locale, args: args, choice: choice }\n}\n\nfunction makeParams (locale, args) {\n var params = [];\n\n locale && params.push(locale);\n if (args && (Array.isArray(args) || isPlainObject(args))) {\n params.push(args);\n }\n\n return params\n}\n\nvar Vue;\n\nfunction install (_Vue) {\n /* istanbul ignore if */\n if ( true && install.installed && _Vue === Vue) {\n warn('already installed.');\n return\n }\n install.installed = true;\n\n Vue = _Vue;\n\n var version = (Vue.version && Number(Vue.version.split('.')[0])) || -1;\n /* istanbul ignore if */\n if ( true && version < 2) {\n warn((\"vue-i18n (\" + (install.version) + \") need to use Vue 2.0 or later (Vue: \" + (Vue.version) + \").\"));\n return\n }\n\n extend(Vue);\n Vue.mixin(mixin);\n Vue.directive('t', { bind: bind, update: update, unbind: unbind });\n Vue.component(interpolationComponent.name, interpolationComponent);\n Vue.component(numberComponent.name, numberComponent);\n\n // use simple mergeStrategies to prevent i18n instance lose '__proto__'\n var strats = Vue.config.optionMergeStrategies;\n strats.i18n = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n };\n}\n\n/* */\n\nvar BaseFormatter = function BaseFormatter () {\n this._caches = Object.create(null);\n};\n\nBaseFormatter.prototype.interpolate = function interpolate (message, values) {\n if (!values) {\n return [message]\n }\n var tokens = this._caches[message];\n if (!tokens) {\n tokens = parse(message);\n this._caches[message] = tokens;\n }\n return compile(tokens, values)\n};\n\n\n\nvar RE_TOKEN_LIST_VALUE = /^(?:\\d)+/;\nvar RE_TOKEN_NAMED_VALUE = /^(?:\\w)+/;\n\nfunction parse (format) {\n var tokens = [];\n var position = 0;\n\n var text = '';\n while (position < format.length) {\n var char = format[position++];\n if (char === '{') {\n if (text) {\n tokens.push({ type: 'text', value: text });\n }\n\n text = '';\n var sub = '';\n char = format[position++];\n while (char !== undefined && char !== '}') {\n sub += char;\n char = format[position++];\n }\n var isClosed = char === '}';\n\n var type = RE_TOKEN_LIST_VALUE.test(sub)\n ? 'list'\n : isClosed && RE_TOKEN_NAMED_VALUE.test(sub)\n ? 'named'\n : 'unknown';\n tokens.push({ value: sub, type: type });\n } else if (char === '%') {\n // when found rails i18n syntax, skip text capture\n if (format[(position)] !== '{') {\n text += char;\n }\n } else {\n text += char;\n }\n }\n\n text && tokens.push({ type: 'text', value: text });\n\n return tokens\n}\n\nfunction compile (tokens, values) {\n var compiled = [];\n var index = 0;\n\n var mode = Array.isArray(values)\n ? 'list'\n : isObject(values)\n ? 'named'\n : 'unknown';\n if (mode === 'unknown') { return compiled }\n\n while (index < tokens.length) {\n var token = tokens[index];\n switch (token.type) {\n case 'text':\n compiled.push(token.value);\n break\n case 'list':\n compiled.push(values[parseInt(token.value, 10)]);\n break\n case 'named':\n if (mode === 'named') {\n compiled.push((values)[token.value]);\n } else {\n if (true) {\n warn((\"Type of token '\" + (token.type) + \"' and format of value '\" + mode + \"' don't match!\"));\n }\n }\n break\n case 'unknown':\n if (true) {\n warn(\"Detect 'unknown' type of token!\");\n }\n break\n }\n index++;\n }\n\n return compiled\n}\n\n/* */\n\n/**\n * Path parser\n * - Inspired:\n * Vue.js Path parser\n */\n\n// actions\nvar APPEND = 0;\nvar PUSH = 1;\nvar INC_SUB_PATH_DEPTH = 2;\nvar PUSH_SUB_PATH = 3;\n\n// states\nvar BEFORE_PATH = 0;\nvar IN_PATH = 1;\nvar BEFORE_IDENT = 2;\nvar IN_IDENT = 3;\nvar IN_SUB_PATH = 4;\nvar IN_SINGLE_QUOTE = 5;\nvar IN_DOUBLE_QUOTE = 6;\nvar AFTER_PATH = 7;\nvar ERROR = 8;\n\nvar pathStateMachine = [];\n\npathStateMachine[BEFORE_PATH] = {\n 'ws': [BEFORE_PATH],\n 'ident': [IN_IDENT, APPEND],\n '[': [IN_SUB_PATH],\n 'eof': [AFTER_PATH]\n};\n\npathStateMachine[IN_PATH] = {\n 'ws': [IN_PATH],\n '.': [BEFORE_IDENT],\n '[': [IN_SUB_PATH],\n 'eof': [AFTER_PATH]\n};\n\npathStateMachine[BEFORE_IDENT] = {\n 'ws': [BEFORE_IDENT],\n 'ident': [IN_IDENT, APPEND],\n '0': [IN_IDENT, APPEND],\n 'number': [IN_IDENT, APPEND]\n};\n\npathStateMachine[IN_IDENT] = {\n 'ident': [IN_IDENT, APPEND],\n '0': [IN_IDENT, APPEND],\n 'number': [IN_IDENT, APPEND],\n 'ws': [IN_PATH, PUSH],\n '.': [BEFORE_IDENT, PUSH],\n '[': [IN_SUB_PATH, PUSH],\n 'eof': [AFTER_PATH, PUSH]\n};\n\npathStateMachine[IN_SUB_PATH] = {\n \"'\": [IN_SINGLE_QUOTE, APPEND],\n '\"': [IN_DOUBLE_QUOTE, APPEND],\n '[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],\n ']': [IN_PATH, PUSH_SUB_PATH],\n 'eof': ERROR,\n 'else': [IN_SUB_PATH, APPEND]\n};\n\npathStateMachine[IN_SINGLE_QUOTE] = {\n \"'\": [IN_SUB_PATH, APPEND],\n 'eof': ERROR,\n 'else': [IN_SINGLE_QUOTE, APPEND]\n};\n\npathStateMachine[IN_DOUBLE_QUOTE] = {\n '\"': [IN_SUB_PATH, APPEND],\n 'eof': ERROR,\n 'else': [IN_DOUBLE_QUOTE, APPEND]\n};\n\n/**\n * Check if an expression is a literal value.\n */\n\nvar literalValueRE = /^\\s?(?:true|false|-?[\\d.]+|'[^']*'|\"[^\"]*\")\\s?$/;\nfunction isLiteral (exp) {\n return literalValueRE.test(exp)\n}\n\n/**\n * Strip quotes from a string\n */\n\nfunction stripQuotes (str) {\n var a = str.charCodeAt(0);\n var b = str.charCodeAt(str.length - 1);\n return a === b && (a === 0x22 || a === 0x27)\n ? str.slice(1, -1)\n : str\n}\n\n/**\n * Determine the type of a character in a keypath.\n */\n\nfunction getPathCharType (ch) {\n if (ch === undefined || ch === null) { return 'eof' }\n\n var code = ch.charCodeAt(0);\n\n switch (code) {\n case 0x5B: // [\n case 0x5D: // ]\n case 0x2E: // .\n case 0x22: // \"\n case 0x27: // '\n return ch\n\n case 0x5F: // _\n case 0x24: // $\n case 0x2D: // -\n return 'ident'\n\n case 0x09: // Tab\n case 0x0A: // Newline\n case 0x0D: // Return\n case 0xA0: // No-break space\n case 0xFEFF: // Byte Order Mark\n case 0x2028: // Line Separator\n case 0x2029: // Paragraph Separator\n return 'ws'\n }\n\n return 'ident'\n}\n\n/**\n * Format a subPath, return its plain form if it is\n * a literal string or number. Otherwise prepend the\n * dynamic indicator (*).\n */\n\nfunction formatSubPath (path) {\n var trimmed = path.trim();\n // invalid leading 0\n if (path.charAt(0) === '0' && isNaN(path)) { return false }\n\n return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed\n}\n\n/**\n * Parse a string path into an array of segments\n */\n\nfunction parse$1 (path) {\n var keys = [];\n var index = -1;\n var mode = BEFORE_PATH;\n var subPathDepth = 0;\n var c;\n var key;\n var newChar;\n var type;\n var transition;\n var action;\n var typeMap;\n var actions = [];\n\n actions[PUSH] = function () {\n if (key !== undefined) {\n keys.push(key);\n key = undefined;\n }\n };\n\n actions[APPEND] = function () {\n if (key === undefined) {\n key = newChar;\n } else {\n key += newChar;\n }\n };\n\n actions[INC_SUB_PATH_DEPTH] = function () {\n actions[APPEND]();\n subPathDepth++;\n };\n\n actions[PUSH_SUB_PATH] = function () {\n if (subPathDepth > 0) {\n subPathDepth--;\n mode = IN_SUB_PATH;\n actions[APPEND]();\n } else {\n subPathDepth = 0;\n if (key === undefined) { return false }\n key = formatSubPath(key);\n if (key === false) {\n return false\n } else {\n actions[PUSH]();\n }\n }\n };\n\n function maybeUnescapeQuote () {\n var nextChar = path[index + 1];\n if ((mode === IN_SINGLE_QUOTE && nextChar === \"'\") ||\n (mode === IN_DOUBLE_QUOTE && nextChar === '\"')) {\n index++;\n newChar = '\\\\' + nextChar;\n actions[APPEND]();\n return true\n }\n }\n\n while (mode !== null) {\n index++;\n c = path[index];\n\n if (c === '\\\\' && maybeUnescapeQuote()) {\n continue\n }\n\n type = getPathCharType(c);\n typeMap = pathStateMachine[mode];\n transition = typeMap[type] || typeMap['else'] || ERROR;\n\n if (transition === ERROR) {\n return // parse error\n }\n\n mode = transition[0];\n action = actions[transition[1]];\n if (action) {\n newChar = transition[2];\n newChar = newChar === undefined\n ? c\n : newChar;\n if (action() === false) {\n return\n }\n }\n\n if (mode === AFTER_PATH) {\n return keys\n }\n }\n}\n\n\n\n\n\nvar I18nPath = function I18nPath () {\n this._cache = Object.create(null);\n};\n\n/**\n * External parse that check for a cache hit first\n */\nI18nPath.prototype.parsePath = function parsePath (path) {\n var hit = this._cache[path];\n if (!hit) {\n hit = parse$1(path);\n if (hit) {\n this._cache[path] = hit;\n }\n }\n return hit || []\n};\n\n/**\n * Get path value from path string\n */\nI18nPath.prototype.getPathValue = function getPathValue (obj, path) {\n if (!isObject(obj)) { return null }\n\n var paths = this.parsePath(path);\n if (paths.length === 0) {\n return null\n } else {\n var length = paths.length;\n var last = obj;\n var i = 0;\n while (i < length) {\n var value = last[paths[i]];\n if (value === undefined) {\n return null\n }\n last = value;\n i++;\n }\n\n return last\n }\n};\n\n/* */\n\n\n\nvar htmlTagMatcher = /<\\/?[\\w\\s=\"/.':;#-\\/]+>/;\nvar linkKeyMatcher = /(?:@(?:\\.[a-z]+)?:(?:[\\w\\-_|.]+|\\([\\w\\-_|.]+\\)))/g;\nvar linkKeyPrefixMatcher = /^@(?:\\.([a-z]+))?:/;\nvar bracketsMatcher = /[()]/g;\nvar defaultModifiers = {\n 'upper': function (str) { return str.toLocaleUpperCase(); },\n 'lower': function (str) { return str.toLocaleLowerCase(); }\n};\n\nvar defaultFormatter = new BaseFormatter();\n\nvar VueI18n = function VueI18n (options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n // Auto install if it is not done yet and `window` has `Vue`.\n // To allow users to avoid auto-installation in some cases,\n // this code should be placed here. See #290\n /* istanbul ignore if */\n if (!Vue && typeof window !== 'undefined' && window.Vue) {\n install(window.Vue);\n }\n\n var locale = options.locale || 'en-US';\n var fallbackLocale = options.fallbackLocale || 'en-US';\n var messages = options.messages || {};\n var dateTimeFormats = options.dateTimeFormats || {};\n var numberFormats = options.numberFormats || {};\n\n this._vm = null;\n this._formatter = options.formatter || defaultFormatter;\n this._modifiers = options.modifiers || {};\n this._missing = options.missing || null;\n this._root = options.root || null;\n this._sync = options.sync === undefined ? true : !!options.sync;\n this._fallbackRoot = options.fallbackRoot === undefined\n ? true\n : !!options.fallbackRoot;\n this._formatFallbackMessages = options.formatFallbackMessages === undefined\n ? false\n : !!options.formatFallbackMessages;\n this._silentTranslationWarn = options.silentTranslationWarn === undefined\n ? false\n : options.silentTranslationWarn;\n this._silentFallbackWarn = options.silentFallbackWarn === undefined\n ? false\n : !!options.silentFallbackWarn;\n this._dateTimeFormatters = {};\n this._numberFormatters = {};\n this._path = new I18nPath();\n this._dataListeners = [];\n this._preserveDirectiveContent = options.preserveDirectiveContent === undefined\n ? false\n : !!options.preserveDirectiveContent;\n this.pluralizationRules = options.pluralizationRules || {};\n this._warnHtmlInMessage = options.warnHtmlInMessage || 'off';\n\n this._exist = function (message, key) {\n if (!message || !key) { return false }\n if (!isNull(this$1._path.getPathValue(message, key))) { return true }\n // fallback for flat key\n if (message[key]) { return true }\n return false\n };\n\n if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n Object.keys(messages).forEach(function (locale) {\n this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);\n });\n }\n\n this._initVM({\n locale: locale,\n fallbackLocale: fallbackLocale,\n messages: messages,\n dateTimeFormats: dateTimeFormats,\n numberFormats: numberFormats\n });\n};\n\nvar prototypeAccessors = { vm: { configurable: true },messages: { configurable: true },dateTimeFormats: { configurable: true },numberFormats: { configurable: true },availableLocales: { configurable: true },locale: { configurable: true },fallbackLocale: { configurable: true },formatFallbackMessages: { configurable: true },missing: { configurable: true },formatter: { configurable: true },silentTranslationWarn: { configurable: true },silentFallbackWarn: { configurable: true },preserveDirectiveContent: { configurable: true },warnHtmlInMessage: { configurable: true } };\n\nVueI18n.prototype._checkLocaleMessage = function _checkLocaleMessage (locale, level, message) {\n var paths = [];\n\n var fn = function (level, locale, message, paths) {\n if (isPlainObject(message)) {\n Object.keys(message).forEach(function (key) {\n var val = message[key];\n if (isPlainObject(val)) {\n paths.push(key);\n paths.push('.');\n fn(level, locale, val, paths);\n paths.pop();\n paths.pop();\n } else {\n paths.push(key);\n fn(level, locale, val, paths);\n paths.pop();\n }\n });\n } else if (Array.isArray(message)) {\n message.forEach(function (item, index) {\n if (isPlainObject(item)) {\n paths.push((\"[\" + index + \"]\"));\n paths.push('.');\n fn(level, locale, item, paths);\n paths.pop();\n paths.pop();\n } else {\n paths.push((\"[\" + index + \"]\"));\n fn(level, locale, item, paths);\n paths.pop();\n }\n });\n } else if (typeof message === 'string') {\n var ret = htmlTagMatcher.test(message);\n if (ret) {\n var msg = \"Detected HTML in message '\" + message + \"' of keypath '\" + (paths.join('')) + \"' at '\" + locale + \"'. Consider component interpolation with '<i18n>' to avoid XSS. See https://bit.ly/2ZqJzkp\";\n if (level === 'warn') {\n warn(msg);\n } else if (level === 'error') {\n error(msg);\n }\n }\n }\n };\n\n fn(level, locale, message, paths);\n};\n\nVueI18n.prototype._initVM = function _initVM (data) {\n var silent = Vue.config.silent;\n Vue.config.silent = true;\n this._vm = new Vue({ data: data });\n Vue.config.silent = silent;\n};\n\nVueI18n.prototype.destroyVM = function destroyVM () {\n this._vm.$destroy();\n};\n\nVueI18n.prototype.subscribeDataChanging = function subscribeDataChanging (vm) {\n this._dataListeners.push(vm);\n};\n\nVueI18n.prototype.unsubscribeDataChanging = function unsubscribeDataChanging (vm) {\n remove(this._dataListeners, vm);\n};\n\nVueI18n.prototype.watchI18nData = function watchI18nData () {\n var self = this;\n return this._vm.$watch('$data', function () {\n var i = self._dataListeners.length;\n while (i--) {\n Vue.nextTick(function () {\n self._dataListeners[i] && self._dataListeners[i].$forceUpdate();\n });\n }\n }, { deep: true })\n};\n\nVueI18n.prototype.watchLocale = function watchLocale () {\n /* istanbul ignore if */\n if (!this._sync || !this._root) { return null }\n var target = this._vm;\n return this._root.$i18n.vm.$watch('locale', function (val) {\n target.$set(target, 'locale', val);\n target.$forceUpdate();\n }, { immediate: true })\n};\n\nprototypeAccessors.vm.get = function () { return this._vm };\n\nprototypeAccessors.messages.get = function () { return looseClone(this._getMessages()) };\nprototypeAccessors.dateTimeFormats.get = function () { return looseClone(this._getDateTimeFormats()) };\nprototypeAccessors.numberFormats.get = function () { return looseClone(this._getNumberFormats()) };\nprototypeAccessors.availableLocales.get = function () { return Object.keys(this.messages).sort() };\n\nprototypeAccessors.locale.get = function () { return this._vm.locale };\nprototypeAccessors.locale.set = function (locale) {\n this._vm.$set(this._vm, 'locale', locale);\n};\n\nprototypeAccessors.fallbackLocale.get = function () { return this._vm.fallbackLocale };\nprototypeAccessors.fallbackLocale.set = function (locale) {\n this._vm.$set(this._vm, 'fallbackLocale', locale);\n};\n\nprototypeAccessors.formatFallbackMessages.get = function () { return this._formatFallbackMessages };\nprototypeAccessors.formatFallbackMessages.set = function (fallback) { this._formatFallbackMessages = fallback; };\n\nprototypeAccessors.missing.get = function () { return this._missing };\nprototypeAccessors.missing.set = function (handler) { this._missing = handler; };\n\nprototypeAccessors.formatter.get = function () { return this._formatter };\nprototypeAccessors.formatter.set = function (formatter) { this._formatter = formatter; };\n\nprototypeAccessors.silentTranslationWarn.get = function () { return this._silentTranslationWarn };\nprototypeAccessors.silentTranslationWarn.set = function (silent) { this._silentTranslationWarn = silent; };\n\nprototypeAccessors.silentFallbackWarn.get = function () { return this._silentFallbackWarn };\nprototypeAccessors.silentFallbackWarn.set = function (silent) { this._silentFallbackWarn = silent; };\n\nprototypeAccessors.preserveDirectiveContent.get = function () { return this._preserveDirectiveContent };\nprototypeAccessors.preserveDirectiveContent.set = function (preserve) { this._preserveDirectiveContent = preserve; };\n\nprototypeAccessors.warnHtmlInMessage.get = function () { return this._warnHtmlInMessage };\nprototypeAccessors.warnHtmlInMessage.set = function (level) {\n var this$1 = this;\n\n var orgLevel = this._warnHtmlInMessage;\n this._warnHtmlInMessage = level;\n if (orgLevel !== level && (level === 'warn' || level === 'error')) {\n var messages = this._getMessages();\n Object.keys(messages).forEach(function (locale) {\n this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);\n });\n }\n};\n\nVueI18n.prototype._getMessages = function _getMessages () { return this._vm.messages };\nVueI18n.prototype._getDateTimeFormats = function _getDateTimeFormats () { return this._vm.dateTimeFormats };\nVueI18n.prototype._getNumberFormats = function _getNumberFormats () { return this._vm.numberFormats };\n\nVueI18n.prototype._warnDefault = function _warnDefault (locale, key, result, vm, values) {\n if (!isNull(result)) { return result }\n if (this._missing) {\n var missingRet = this._missing.apply(null, [locale, key, vm, values]);\n if (typeof missingRet === 'string') {\n return missingRet\n }\n } else {\n if ( true && !this._isSilentTranslationWarn(key)) {\n warn(\n \"Cannot translate the value of keypath '\" + key + \"'. \" +\n 'Use the value of keypath as default.'\n );\n }\n }\n\n if (this._formatFallbackMessages) {\n var parsedArgs = parseArgs.apply(void 0, values);\n return this._render(key, 'string', parsedArgs.params, key)\n } else {\n return key\n }\n};\n\nVueI18n.prototype._isFallbackRoot = function _isFallbackRoot (val) {\n return !val && !isNull(this._root) && this._fallbackRoot\n};\n\nVueI18n.prototype._isSilentFallbackWarn = function _isSilentFallbackWarn (key) {\n return this._silentFallbackWarn instanceof RegExp\n ? this._silentFallbackWarn.test(key)\n : this._silentFallbackWarn\n};\n\nVueI18n.prototype._isSilentFallback = function _isSilentFallback (locale, key) {\n return this._isSilentFallbackWarn(key) && (this._isFallbackRoot() || locale !== this.fallbackLocale)\n};\n\nVueI18n.prototype._isSilentTranslationWarn = function _isSilentTranslationWarn (key) {\n return this._silentTranslationWarn instanceof RegExp\n ? this._silentTranslationWarn.test(key)\n : this._silentTranslationWarn\n};\n\nVueI18n.prototype._interpolate = function _interpolate (\n locale,\n message,\n key,\n host,\n interpolateMode,\n values,\n visitedLinkStack\n) {\n if (!message) { return null }\n\n var pathRet = this._path.getPathValue(message, key);\n if (Array.isArray(pathRet) || isPlainObject(pathRet)) { return pathRet }\n\n var ret;\n if (isNull(pathRet)) {\n /* istanbul ignore else */\n if (isPlainObject(message)) {\n ret = message[key];\n if (typeof ret !== 'string') {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallback(locale, key)) {\n warn((\"Value of key '\" + key + \"' is not a string!\"));\n }\n return null\n }\n } else {\n return null\n }\n } else {\n /* istanbul ignore else */\n if (typeof pathRet === 'string') {\n ret = pathRet;\n } else {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallback(locale, key)) {\n warn((\"Value of key '\" + key + \"' is not a string!\"));\n }\n return null\n }\n }\n\n // Check for the existence of links within the translated string\n if (ret.indexOf('@:') >= 0 || ret.indexOf('@.') >= 0) {\n ret = this._link(locale, message, ret, host, 'raw', values, visitedLinkStack);\n }\n\n return this._render(ret, interpolateMode, values, key)\n};\n\nVueI18n.prototype._link = function _link (\n locale,\n message,\n str,\n host,\n interpolateMode,\n values,\n visitedLinkStack\n) {\n var ret = str;\n\n // Match all the links within the local\n // We are going to replace each of\n // them with its translation\n var matches = ret.match(linkKeyMatcher);\n for (var idx in matches) {\n // ie compatible: filter custom array\n // prototype method\n if (!matches.hasOwnProperty(idx)) {\n continue\n }\n var link = matches[idx];\n var linkKeyPrefixMatches = link.match(linkKeyPrefixMatcher);\n var linkPrefix = linkKeyPrefixMatches[0];\n var formatterName = linkKeyPrefixMatches[1];\n\n // Remove the leading @:, @.case: and the brackets\n var linkPlaceholder = link.replace(linkPrefix, '').replace(bracketsMatcher, '');\n\n if (visitedLinkStack.includes(linkPlaceholder)) {\n if (true) {\n warn((\"Circular reference found. \\\"\" + link + \"\\\" is already visited in the chain of \" + (visitedLinkStack.reverse().join(' <- '))));\n }\n return ret\n }\n visitedLinkStack.push(linkPlaceholder);\n\n // Translate the link\n var translated = this._interpolate(\n locale, message, linkPlaceholder, host,\n interpolateMode === 'raw' ? 'string' : interpolateMode,\n interpolateMode === 'raw' ? undefined : values,\n visitedLinkStack\n );\n\n if (this._isFallbackRoot(translated)) {\n if ( true && !this._isSilentTranslationWarn(linkPlaceholder)) {\n warn((\"Fall back to translate the link placeholder '\" + linkPlaceholder + \"' with root locale.\"));\n }\n /* istanbul ignore if */\n if (!this._root) { throw Error('unexpected error') }\n var root = this._root.$i18n;\n translated = root._translate(\n root._getMessages(), root.locale, root.fallbackLocale,\n linkPlaceholder, host, interpolateMode, values\n );\n }\n translated = this._warnDefault(\n locale, linkPlaceholder, translated, host,\n Array.isArray(values) ? values : [values]\n );\n\n if (this._modifiers.hasOwnProperty(formatterName)) {\n translated = this._modifiers[formatterName](translated);\n } else if (defaultModifiers.hasOwnProperty(formatterName)) {\n translated = defaultModifiers[formatterName](translated);\n }\n\n visitedLinkStack.pop();\n\n // Replace the link with the translated\n ret = !translated ? ret : ret.replace(link, translated);\n }\n\n return ret\n};\n\nVueI18n.prototype._render = function _render (message, interpolateMode, values, path) {\n var ret = this._formatter.interpolate(message, values, path);\n\n // If the custom formatter refuses to work - apply the default one\n if (!ret) {\n ret = defaultFormatter.interpolate(message, values, path);\n }\n\n // if interpolateMode is **not** 'string' ('row'),\n // return the compiled data (e.g. ['foo', VNode, 'bar']) with formatter\n return interpolateMode === 'string' ? ret.join('') : ret\n};\n\nVueI18n.prototype._translate = function _translate (\n messages,\n locale,\n fallback,\n key,\n host,\n interpolateMode,\n args\n) {\n var res =\n this._interpolate(locale, messages[locale], key, host, interpolateMode, args, [key]);\n if (!isNull(res)) { return res }\n\n res = this._interpolate(fallback, messages[fallback], key, host, interpolateMode, args, [key]);\n if (!isNull(res)) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to translate the keypath '\" + key + \"' with '\" + fallback + \"' locale.\"));\n }\n return res\n } else {\n return null\n }\n};\n\nVueI18n.prototype._t = function _t (key, _locale, messages, host) {\n var ref;\n\n var values = [], len = arguments.length - 4;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 4 ];\n if (!key) { return '' }\n\n var parsedArgs = parseArgs.apply(void 0, values);\n var locale = parsedArgs.locale || _locale;\n\n var ret = this._translate(\n messages, locale, this.fallbackLocale, key,\n host, 'string', parsedArgs.params\n );\n if (this._isFallbackRoot(ret)) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to translate the keypath '\" + key + \"' with root locale.\"));\n }\n /* istanbul ignore if */\n if (!this._root) { throw Error('unexpected error') }\n return (ref = this._root).$t.apply(ref, [ key ].concat( values ))\n } else {\n return this._warnDefault(locale, key, ret, host, values)\n }\n};\n\nVueI18n.prototype.t = function t (key) {\n var ref;\n\n var values = [], len = arguments.length - 1;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n return (ref = this)._t.apply(ref, [ key, this.locale, this._getMessages(), null ].concat( values ))\n};\n\nVueI18n.prototype._i = function _i (key, locale, messages, host, values) {\n var ret =\n this._translate(messages, locale, this.fallbackLocale, key, host, 'raw', values);\n if (this._isFallbackRoot(ret)) {\n if ( true && !this._isSilentTranslationWarn(key)) {\n warn((\"Fall back to interpolate the keypath '\" + key + \"' with root locale.\"));\n }\n if (!this._root) { throw Error('unexpected error') }\n return this._root.$i18n.i(key, locale, values)\n } else {\n return this._warnDefault(locale, key, ret, host, [values])\n }\n};\n\nVueI18n.prototype.i = function i (key, locale, values) {\n /* istanbul ignore if */\n if (!key) { return '' }\n\n if (typeof locale !== 'string') {\n locale = this.locale;\n }\n\n return this._i(key, locale, this._getMessages(), null, values)\n};\n\nVueI18n.prototype._tc = function _tc (\n key,\n _locale,\n messages,\n host,\n choice\n) {\n var ref;\n\n var values = [], len = arguments.length - 5;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 5 ];\n if (!key) { return '' }\n if (choice === undefined) {\n choice = 1;\n }\n\n var predefined = { 'count': choice, 'n': choice };\n var parsedArgs = parseArgs.apply(void 0, values);\n parsedArgs.params = Object.assign(predefined, parsedArgs.params);\n values = parsedArgs.locale === null ? [parsedArgs.params] : [parsedArgs.locale, parsedArgs.params];\n return this.fetchChoice((ref = this)._t.apply(ref, [ key, _locale, messages, host ].concat( values )), choice)\n};\n\nVueI18n.prototype.fetchChoice = function fetchChoice (message, choice) {\n /* istanbul ignore if */\n if (!message && typeof message !== 'string') { return null }\n var choices = message.split('|');\n\n choice = this.getChoiceIndex(choice, choices.length);\n if (!choices[choice]) { return message }\n return choices[choice].trim()\n};\n\n/**\n * @param choice {number} a choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)`\n * @param choicesLength {number} an overall amount of available choices\n * @returns a final choice index\n*/\nVueI18n.prototype.getChoiceIndex = function getChoiceIndex (choice, choicesLength) {\n // Default (old) getChoiceIndex implementation - english-compatible\n var defaultImpl = function (_choice, _choicesLength) {\n _choice = Math.abs(_choice);\n\n if (_choicesLength === 2) {\n return _choice\n ? _choice > 1\n ? 1\n : 0\n : 1\n }\n\n return _choice ? Math.min(_choice, 2) : 0\n };\n\n if (this.locale in this.pluralizationRules) {\n return this.pluralizationRules[this.locale].apply(this, [choice, choicesLength])\n } else {\n return defaultImpl(choice, choicesLength)\n }\n};\n\nVueI18n.prototype.tc = function tc (key, choice) {\n var ref;\n\n var values = [], len = arguments.length - 2;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n return (ref = this)._tc.apply(ref, [ key, this.locale, this._getMessages(), null, choice ].concat( values ))\n};\n\nVueI18n.prototype._te = function _te (key, locale, messages) {\n var args = [], len = arguments.length - 3;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 3 ];\n\n var _locale = parseArgs.apply(void 0, args).locale || locale;\n return this._exist(messages[_locale], key)\n};\n\nVueI18n.prototype.te = function te (key, locale) {\n return this._te(key, this.locale, this._getMessages(), locale)\n};\n\nVueI18n.prototype.getLocaleMessage = function getLocaleMessage (locale) {\n return looseClone(this._vm.messages[locale] || {})\n};\n\nVueI18n.prototype.setLocaleMessage = function setLocaleMessage (locale, message) {\n if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);\n if (this._warnHtmlInMessage === 'error') { return }\n }\n this._vm.$set(this._vm.messages, locale, message);\n};\n\nVueI18n.prototype.mergeLocaleMessage = function mergeLocaleMessage (locale, message) {\n if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);\n if (this._warnHtmlInMessage === 'error') { return }\n }\n this._vm.$set(this._vm.messages, locale, merge(this._vm.messages[locale] || {}, message));\n};\n\nVueI18n.prototype.getDateTimeFormat = function getDateTimeFormat (locale) {\n return looseClone(this._vm.dateTimeFormats[locale] || {})\n};\n\nVueI18n.prototype.setDateTimeFormat = function setDateTimeFormat (locale, format) {\n this._vm.$set(this._vm.dateTimeFormats, locale, format);\n};\n\nVueI18n.prototype.mergeDateTimeFormat = function mergeDateTimeFormat (locale, format) {\n this._vm.$set(this._vm.dateTimeFormats, locale, merge(this._vm.dateTimeFormats[locale] || {}, format));\n};\n\nVueI18n.prototype._localizeDateTime = function _localizeDateTime (\n value,\n locale,\n fallback,\n dateTimeFormats,\n key\n) {\n var _locale = locale;\n var formats = dateTimeFormats[_locale];\n\n // fallback locale\n if (isNull(formats) || isNull(formats[key])) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to '\" + fallback + \"' datetime formats from '\" + locale + \"' datetime formats.\"));\n }\n _locale = fallback;\n formats = dateTimeFormats[_locale];\n }\n\n if (isNull(formats) || isNull(formats[key])) {\n return null\n } else {\n var format = formats[key];\n var id = _locale + \"__\" + key;\n var formatter = this._dateTimeFormatters[id];\n if (!formatter) {\n formatter = this._dateTimeFormatters[id] = new Intl.DateTimeFormat(_locale, format);\n }\n return formatter.format(value)\n }\n};\n\nVueI18n.prototype._d = function _d (value, locale, key) {\n /* istanbul ignore if */\n if ( true && !VueI18n.availabilities.dateTimeFormat) {\n warn('Cannot format a Date value due to not supported Intl.DateTimeFormat.');\n return ''\n }\n\n if (!key) {\n return new Intl.DateTimeFormat(locale).format(value)\n }\n\n var ret =\n this._localizeDateTime(value, locale, this.fallbackLocale, this._getDateTimeFormats(), key);\n if (this._isFallbackRoot(ret)) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to datetime localization of root: key '\" + key + \"'.\"));\n }\n /* istanbul ignore if */\n if (!this._root) { throw Error('unexpected error') }\n return this._root.$i18n.d(value, key, locale)\n } else {\n return ret || ''\n }\n};\n\nVueI18n.prototype.d = function d (value) {\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n var locale = this.locale;\n var key = null;\n\n if (args.length === 1) {\n if (typeof args[0] === 'string') {\n key = args[0];\n } else if (isObject(args[0])) {\n if (args[0].locale) {\n locale = args[0].locale;\n }\n if (args[0].key) {\n key = args[0].key;\n }\n }\n } else if (args.length === 2) {\n if (typeof args[0] === 'string') {\n key = args[0];\n }\n if (typeof args[1] === 'string') {\n locale = args[1];\n }\n }\n\n return this._d(value, locale, key)\n};\n\nVueI18n.prototype.getNumberFormat = function getNumberFormat (locale) {\n return looseClone(this._vm.numberFormats[locale] || {})\n};\n\nVueI18n.prototype.setNumberFormat = function setNumberFormat (locale, format) {\n this._vm.$set(this._vm.numberFormats, locale, format);\n};\n\nVueI18n.prototype.mergeNumberFormat = function mergeNumberFormat (locale, format) {\n this._vm.$set(this._vm.numberFormats, locale, merge(this._vm.numberFormats[locale] || {}, format));\n};\n\nVueI18n.prototype._getNumberFormatter = function _getNumberFormatter (\n value,\n locale,\n fallback,\n numberFormats,\n key,\n options\n) {\n var _locale = locale;\n var formats = numberFormats[_locale];\n\n // fallback locale\n if (isNull(formats) || isNull(formats[key])) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to '\" + fallback + \"' number formats from '\" + locale + \"' number formats.\"));\n }\n _locale = fallback;\n formats = numberFormats[_locale];\n }\n\n if (isNull(formats) || isNull(formats[key])) {\n return null\n } else {\n var format = formats[key];\n\n var formatter;\n if (options) {\n // If options specified - create one time number formatter\n formatter = new Intl.NumberFormat(_locale, Object.assign({}, format, options));\n } else {\n var id = _locale + \"__\" + key;\n formatter = this._numberFormatters[id];\n if (!formatter) {\n formatter = this._numberFormatters[id] = new Intl.NumberFormat(_locale, format);\n }\n }\n return formatter\n }\n};\n\nVueI18n.prototype._n = function _n (value, locale, key, options) {\n /* istanbul ignore if */\n if (!VueI18n.availabilities.numberFormat) {\n if (true) {\n warn('Cannot format a Number value due to not supported Intl.NumberFormat.');\n }\n return ''\n }\n\n if (!key) {\n var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);\n return nf.format(value)\n }\n\n var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);\n var ret = formatter && formatter.format(value);\n if (this._isFallbackRoot(ret)) {\n if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n warn((\"Fall back to number localization of root: key '\" + key + \"'.\"));\n }\n /* istanbul ignore if */\n if (!this._root) { throw Error('unexpected error') }\n return this._root.$i18n.n(value, Object.assign({}, { key: key, locale: locale }, options))\n } else {\n return ret || ''\n }\n};\n\nVueI18n.prototype.n = function n (value) {\n var args = [], len = arguments.length - 1;\n while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n var locale = this.locale;\n var key = null;\n var options = null;\n\n if (args.length === 1) {\n if (typeof args[0] === 'string') {\n key = args[0];\n } else if (isObject(args[0])) {\n if (args[0].locale) {\n locale = args[0].locale;\n }\n if (args[0].key) {\n key = args[0].key;\n }\n\n // Filter out number format options only\n options = Object.keys(args[0]).reduce(function (acc, key) {\n var obj;\n\n if (numberFormatKeys.includes(key)) {\n return Object.assign({}, acc, ( obj = {}, obj[key] = args[0][key], obj ))\n }\n return acc\n }, null);\n }\n } else if (args.length === 2) {\n if (typeof args[0] === 'string') {\n key = args[0];\n }\n if (typeof args[1] === 'string') {\n locale = args[1];\n }\n }\n\n return this._n(value, locale, key, options)\n};\n\nVueI18n.prototype._ntp = function _ntp (value, locale, key, options) {\n /* istanbul ignore if */\n if (!VueI18n.availabilities.numberFormat) {\n if (true) {\n warn('Cannot format to parts a Number value due to not supported Intl.NumberFormat.');\n }\n return []\n }\n\n if (!key) {\n var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);\n return nf.formatToParts(value)\n }\n\n var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);\n var ret = formatter && formatter.formatToParts(value);\n if (this._isFallbackRoot(ret)) {\n if ( true && !this._isSilentTranslationWarn(key)) {\n warn((\"Fall back to format number to parts of root: key '\" + key + \"' .\"));\n }\n /* istanbul ignore if */\n if (!this._root) { throw Error('unexpected error') }\n return this._root.$i18n._ntp(value, locale, key, options)\n } else {\n return ret || []\n }\n};\n\nObject.defineProperties( VueI18n.prototype, prototypeAccessors );\n\nvar availabilities;\n// $FlowFixMe\nObject.defineProperty(VueI18n, 'availabilities', {\n get: function get () {\n if (!availabilities) {\n var intlDefined = typeof Intl !== 'undefined';\n availabilities = {\n dateTimeFormat: intlDefined && typeof Intl.DateTimeFormat !== 'undefined',\n numberFormat: intlDefined && typeof Intl.NumberFormat !== 'undefined'\n };\n }\n\n return availabilities\n }\n});\n\nVueI18n.install = install;\nVueI18n.version = '8.15.0';\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (VueI18n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1pMThuQDguMTUuMEB2dWUtaTE4bi9kaXN0L3Z1ZS1pMThuLmVzbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWkxOG5AOC4xNS4wQHZ1ZS1pMThuL2Rpc3QvdnVlLWkxOG4uZXNtLmpzPzRiYTQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiB2dWUtaTE4biB2OC4xNS4wIFxuICogKGMpIDIwMTkga2F6dXlhIGthd2FndWNoaVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG4vKiAgKi9cblxuLyoqXG4gKiBjb25zdGFudHNcbiAqL1xuXG52YXIgbnVtYmVyRm9ybWF0S2V5cyA9IFtcbiAgJ3N0eWxlJyxcbiAgJ2N1cnJlbmN5JyxcbiAgJ2N1cnJlbmN5RGlzcGxheScsXG4gICd1c2VHcm91cGluZycsXG4gICdtaW5pbXVtSW50ZWdlckRpZ2l0cycsXG4gICdtaW5pbXVtRnJhY3Rpb25EaWdpdHMnLFxuICAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJyxcbiAgJ21pbmltdW1TaWduaWZpY2FudERpZ2l0cycsXG4gICdtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMnLFxuICAnbG9jYWxlTWF0Y2hlcicsXG4gICdmb3JtYXRNYXRjaGVyJ1xuXTtcblxuLyoqXG4gKiB1dGlsaXRpZXNcbiAqL1xuXG5mdW5jdGlvbiB3YXJuIChtc2csIGVycikge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS53YXJuKCdbdnVlLWkxOG5dICcgKyBtc2cpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlcnJvciAobXNnLCBlcnIpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWUtaTE4bl0gJyArIG1zZyk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBPQkpFQ1RfU1RSSU5HID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gT0JKRUNUX1NUUklOR1xufVxuXG5mdW5jdGlvbiBpc051bGwgKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJncyAoKSB7XG4gIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgdmFyIGxvY2FsZSA9IG51bGw7XG4gIHZhciBwYXJhbXMgPSBudWxsO1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoaXNPYmplY3QoYXJnc1swXSkgfHwgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgcGFyYW1zID0gYXJnc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1swXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2NhbGUgPSBhcmdzWzBdO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNPYmplY3QoYXJnc1sxXSkgfHwgQXJyYXkuaXNBcnJheShhcmdzWzFdKSkge1xuICAgICAgcGFyYW1zID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBsb2NhbGU6IGxvY2FsZSwgcGFyYW1zOiBwYXJhbXMgfVxufVxuXG5mdW5jdGlvbiBsb29zZUNsb25lIChvYmopIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG5mdW5jdGlvbiBtZXJnZSAodGFyZ2V0KSB7XG4gIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50cyQxW2ldO1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIHZhciBrZXkgPSAodm9pZCAwKTtcbiAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gbWVyZ2Uob3V0cHV0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBsb29zZUVxdWFsIChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpO1xuICB2YXIgaXNPYmplY3RCID0gaXNPYmplY3QoYik7XG4gIGlmIChpc09iamVjdEEgJiYgaXNPYmplY3RCKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0FycmF5QSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gICAgICB2YXIgaXNBcnJheUIgPSBBcnJheS5pc0FycmF5KGIpO1xuICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7XG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeShmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGUsIGJbaV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZXh0ZW5kIChWdWUpIHtcbiAgaWYgKCFWdWUucHJvdG90eXBlLmhhc093blByb3BlcnR5KCckaTE4bicpKSB7XG4gICAgLy8gJEZsb3dGaXhNZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGkxOG4nLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7IHJldHVybiB0aGlzLl9pMThuIH1cbiAgICB9KTtcbiAgfVxuXG4gIFZ1ZS5wcm90b3R5cGUuJHQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBpMThuID0gdGhpcy4kaTE4bjtcbiAgICByZXR1cm4gaTE4bi5fdC5hcHBseShpMThuLCBbIGtleSwgaTE4bi5sb2NhbGUsIGkxOG4uX2dldE1lc3NhZ2VzKCksIHRoaXMgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHRjID0gZnVuY3Rpb24gKGtleSwgY2hvaWNlKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDIgXTtcblxuICAgIHZhciBpMThuID0gdGhpcy4kaTE4bjtcbiAgICByZXR1cm4gaTE4bi5fdGMuYXBwbHkoaTE4biwgWyBrZXksIGkxOG4ubG9jYWxlLCBpMThuLl9nZXRNZXNzYWdlcygpLCB0aGlzLCBjaG9pY2UgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHRlID0gZnVuY3Rpb24gKGtleSwgbG9jYWxlKSB7XG4gICAgdmFyIGkxOG4gPSB0aGlzLiRpMThuO1xuICAgIHJldHVybiBpMThuLl90ZShrZXksIGkxOG4ubG9jYWxlLCBpMThuLl9nZXRNZXNzYWdlcygpLCBsb2NhbGUpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciByZWY7XG5cbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG4gICAgcmV0dXJuIChyZWYgPSB0aGlzLiRpMThuKS5kLmFwcGx5KHJlZiwgWyB2YWx1ZSBdLmNvbmNhdCggYXJncyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuICAgIHJldHVybiAocmVmID0gdGhpcy4kaTE4bikubi5hcHBseShyZWYsIFsgdmFsdWUgXS5jb25jYXQoIGFyZ3MgKSlcbiAgfTtcbn1cblxuLyogICovXG5cbnZhciBtaXhpbiA9IHtcbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUgKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9ucztcbiAgICBvcHRpb25zLmkxOG4gPSBvcHRpb25zLmkxOG4gfHwgKG9wdGlvbnMuX19pMThuID8ge30gOiBudWxsKTtcblxuICAgIGlmIChvcHRpb25zLmkxOG4pIHtcbiAgICAgIGlmIChvcHRpb25zLmkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICAgIC8vIGluaXQgbG9jYWxlIG1lc3NhZ2VzIHZpYSBjdXN0b20gYmxvY2tzXG4gICAgICAgIGlmIChvcHRpb25zLl9faTE4bikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlTWVzc2FnZXMgPSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMuX19pMThuLmZvckVhY2goZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gICAgICAgICAgICAgIGxvY2FsZU1lc3NhZ2VzID0gbWVyZ2UobG9jYWxlTWVzc2FnZXMsIEpTT04ucGFyc2UocmVzb3VyY2UpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobG9jYWxlTWVzc2FnZXMpLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICAgICAgICBvcHRpb25zLmkxOG4ubWVyZ2VMb2NhbGVNZXNzYWdlKGxvY2FsZSwgbG9jYWxlTWVzc2FnZXNbbG9jYWxlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFwiQ2Fubm90IHBhcnNlIGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrcy5cIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2kxOG4gPSBvcHRpb25zLmkxOG47XG4gICAgICAgIHRoaXMuX2kxOG5XYXRjaGVyID0gdGhpcy5faTE4bi53YXRjaEkxOG5EYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qob3B0aW9ucy5pMThuKSkge1xuICAgICAgICAvLyBjb21wb25lbnQgbG9jYWwgaTE4blxuICAgICAgICBpZiAodGhpcy4kcm9vdCAmJiB0aGlzLiRyb290LiRpMThuICYmIHRoaXMuJHJvb3QuJGkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICAgICAgb3B0aW9ucy5pMThuLnJvb3QgPSB0aGlzLiRyb290O1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5mb3JtYXR0ZXIgPSB0aGlzLiRyb290LiRpMThuLmZvcm1hdHRlcjtcbiAgICAgICAgICBvcHRpb25zLmkxOG4uZmFsbGJhY2tMb2NhbGUgPSB0aGlzLiRyb290LiRpMThuLmZhbGxiYWNrTG9jYWxlO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5mb3JtYXRGYWxsYmFja01lc3NhZ2VzID0gdGhpcy4kcm9vdC4kaTE4bi5mb3JtYXRGYWxsYmFja01lc3NhZ2VzO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5zaWxlbnRUcmFuc2xhdGlvbldhcm4gPSB0aGlzLiRyb290LiRpMThuLnNpbGVudFRyYW5zbGF0aW9uV2FybjtcbiAgICAgICAgICBvcHRpb25zLmkxOG4uc2lsZW50RmFsbGJhY2tXYXJuID0gdGhpcy4kcm9vdC4kaTE4bi5zaWxlbnRGYWxsYmFja1dhcm47XG4gICAgICAgICAgb3B0aW9ucy5pMThuLnBsdXJhbGl6YXRpb25SdWxlcyA9IHRoaXMuJHJvb3QuJGkxOG4ucGx1cmFsaXphdGlvblJ1bGVzO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgPSB0aGlzLiRyb290LiRpMThuLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluaXQgbG9jYWxlIG1lc3NhZ2VzIHZpYSBjdXN0b20gYmxvY2tzXG4gICAgICAgIGlmIChvcHRpb25zLl9faTE4bikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlTWVzc2FnZXMkMSA9IHt9O1xuICAgICAgICAgICAgb3B0aW9ucy5fX2kxOG4uZm9yRWFjaChmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgbG9jYWxlTWVzc2FnZXMkMSA9IG1lcmdlKGxvY2FsZU1lc3NhZ2VzJDEsIEpTT04ucGFyc2UocmVzb3VyY2UpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0aW9ucy5pMThuLm1lc3NhZ2VzID0gbG9jYWxlTWVzc2FnZXMkMTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFwiQ2Fubm90IHBhcnNlIGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrcy5cIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZiA9IG9wdGlvbnMuaTE4bjtcbiAgICAgICAgdmFyIHNoYXJlZE1lc3NhZ2VzID0gcmVmLnNoYXJlZE1lc3NhZ2VzO1xuICAgICAgICBpZiAoc2hhcmVkTWVzc2FnZXMgJiYgaXNQbGFpbk9iamVjdChzaGFyZWRNZXNzYWdlcykpIHtcbiAgICAgICAgICBvcHRpb25zLmkxOG4ubWVzc2FnZXMgPSBtZXJnZShvcHRpb25zLmkxOG4ubWVzc2FnZXMsIHNoYXJlZE1lc3NhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2kxOG4gPSBuZXcgVnVlSTE4bihvcHRpb25zLmkxOG4pO1xuICAgICAgICB0aGlzLl9pMThuV2F0Y2hlciA9IHRoaXMuX2kxOG4ud2F0Y2hJMThuRGF0YSgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmkxOG4uc3luYyA9PT0gdW5kZWZpbmVkIHx8ICEhb3B0aW9ucy5pMThuLnN5bmMpIHtcbiAgICAgICAgICB0aGlzLl9sb2NhbGVXYXRjaGVyID0gdGhpcy4kaTE4bi53YXRjaExvY2FsZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm4oXCJDYW5ub3QgYmUgaW50ZXJwcmV0ZWQgJ2kxOG4nIG9wdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuJHJvb3QgJiYgdGhpcy4kcm9vdC4kaTE4biAmJiB0aGlzLiRyb290LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgLy8gcm9vdCBpMThuXG4gICAgICB0aGlzLl9pMThuID0gdGhpcy4kcm9vdC4kaTE4bjtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LiRpMThuICYmIG9wdGlvbnMucGFyZW50LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgLy8gcGFyZW50IGkxOG5cbiAgICAgIHRoaXMuX2kxOG4gPSBvcHRpb25zLnBhcmVudC4kaTE4bjtcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlTW91bnQ6IGZ1bmN0aW9uIGJlZm9yZU1vdW50ICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgb3B0aW9ucy5pMThuID0gb3B0aW9ucy5pMThuIHx8IChvcHRpb25zLl9faTE4biA/IHt9IDogbnVsbCk7XG5cbiAgICBpZiAob3B0aW9ucy5pMThuKSB7XG4gICAgICBpZiAob3B0aW9ucy5pMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgICAvLyBpbml0IGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrc1xuICAgICAgICB0aGlzLl9pMThuLnN1YnNjcmliZURhdGFDaGFuZ2luZyh0aGlzKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnMuaTE4bikpIHtcbiAgICAgICAgdGhpcy5faTE4bi5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcodGhpcyk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliaW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybihcIkNhbm5vdCBiZSBpbnRlcnByZXRlZCAnaTE4bicgb3B0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy4kcm9vdCAmJiB0aGlzLiRyb290LiRpMThuICYmIHRoaXMuJHJvb3QuJGkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICB0aGlzLl9pMThuLnN1YnNjcmliZURhdGFDaGFuZ2luZyh0aGlzKTtcbiAgICAgIHRoaXMuX3N1YnNjcmliaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LiRpMThuICYmIG9wdGlvbnMucGFyZW50LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgdGhpcy5faTE4bi5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcodGhpcyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmluZyA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3kgKCkge1xuICAgIGlmICghdGhpcy5faTE4bikgeyByZXR1cm4gfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLl9zdWJzY3JpYmluZykge1xuICAgICAgICBzZWxmLl9pMThuLnVuc3Vic2NyaWJlRGF0YUNoYW5naW5nKHNlbGYpO1xuICAgICAgICBkZWxldGUgc2VsZi5fc3Vic2NyaWJpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9pMThuV2F0Y2hlcikge1xuICAgICAgICBzZWxmLl9pMThuV2F0Y2hlcigpO1xuICAgICAgICBzZWxmLl9pMThuLmRlc3Ryb3lWTSgpO1xuICAgICAgICBkZWxldGUgc2VsZi5faTE4bldhdGNoZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9sb2NhbGVXYXRjaGVyKSB7XG4gICAgICAgIHNlbGYuX2xvY2FsZVdhdGNoZXIoKTtcbiAgICAgICAgZGVsZXRlIHNlbGYuX2xvY2FsZVdhdGNoZXI7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2kxOG4gPSBudWxsO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKiAgKi9cblxudmFyIGludGVycG9sYXRpb25Db21wb25lbnQgPSB7XG4gIG5hbWU6ICdpMThuJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGF0aDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGxvY2FsZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICBwbGFjZXM6IHtcbiAgICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0XVxuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgsIHJlZikge1xuICAgIHZhciBkYXRhID0gcmVmLmRhdGE7XG4gICAgdmFyIHBhcmVudCA9IHJlZi5wYXJlbnQ7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBzbG90cyA9IHJlZi5zbG90cztcblxuICAgIHZhciAkaTE4biA9IHBhcmVudC4kaTE4bjtcbiAgICBpZiAoISRpMThuKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKCdDYW5ub3QgZmluZCBWdWVJMThuIGluc3RhbmNlIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHBhdGggPSBwcm9wcy5wYXRoO1xuICAgIHZhciBsb2NhbGUgPSBwcm9wcy5sb2NhbGU7XG4gICAgdmFyIHBsYWNlcyA9IHByb3BzLnBsYWNlcztcbiAgICB2YXIgcGFyYW1zID0gc2xvdHMoKTtcbiAgICB2YXIgY2hpbGRyZW4gPSAkaTE4bi5pKFxuICAgICAgcGF0aCxcbiAgICAgIGxvY2FsZSxcbiAgICAgIG9ubHlIYXNEZWZhdWx0UGxhY2UocGFyYW1zKSB8fCBwbGFjZXNcbiAgICAgICAgPyB1c2VMZWdhY3lQbGFjZXMocGFyYW1zLmRlZmF1bHQsIHBsYWNlcylcbiAgICAgICAgOiBwYXJhbXNcbiAgICApO1xuXG4gICAgdmFyIHRhZyA9IHByb3BzLnRhZyB8fCAnc3Bhbic7XG4gICAgcmV0dXJuIHRhZyA/IGgodGFnLCBkYXRhLCBjaGlsZHJlbikgOiBjaGlsZHJlblxuICB9XG59O1xuXG5mdW5jdGlvbiBvbmx5SGFzRGVmYXVsdFBsYWNlIChwYXJhbXMpIHtcbiAgdmFyIHByb3A7XG4gIGZvciAocHJvcCBpbiBwYXJhbXMpIHtcbiAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4ocHJvcClcbn1cblxuZnVuY3Rpb24gdXNlTGVnYWN5UGxhY2VzIChjaGlsZHJlbiwgcGxhY2VzKSB7XG4gIHZhciBwYXJhbXMgPSBwbGFjZXMgPyBjcmVhdGVQYXJhbXNGcm9tUGxhY2VzKHBsYWNlcykgOiB7fTtcblxuICBpZiAoIWNoaWxkcmVuKSB7IHJldHVybiBwYXJhbXMgfVxuXG4gIC8vIEZpbHRlciBlbXB0eSB0ZXh0IG5vZGVzXG4gIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWcgfHwgY2hpbGQudGV4dC50cmltKCkgIT09ICcnXG4gIH0pO1xuXG4gIHZhciBldmVyeVBsYWNlID0gY2hpbGRyZW4uZXZlcnkodm5vZGVIYXNQbGFjZUF0dHJpYnV0ZSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV2ZXJ5UGxhY2UpIHtcbiAgICB3YXJuKCdgcGxhY2VgIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi4gUGxlYXNlIHN3aXRjaCB0byBWdWUgc2xvdHMuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKFxuICAgIGV2ZXJ5UGxhY2UgPyBhc3NpZ25DaGlsZFBsYWNlIDogYXNzaWduQ2hpbGRJbmRleCxcbiAgICBwYXJhbXNcbiAgKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXJhbXNGcm9tUGxhY2VzIChwbGFjZXMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKCdgcGxhY2VzYCBwcm9wIGlzIGRlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2Ugc3dpdGNoIHRvIFZ1ZSBzbG90cy4nKTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBsYWNlcylcbiAgICA/IHBsYWNlcy5yZWR1Y2UoYXNzaWduQ2hpbGRJbmRleCwge30pXG4gICAgOiBPYmplY3QuYXNzaWduKHt9LCBwbGFjZXMpXG59XG5cbmZ1bmN0aW9uIGFzc2lnbkNoaWxkUGxhY2UgKHBhcmFtcywgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLmRhdGEgJiYgY2hpbGQuZGF0YS5hdHRycyAmJiBjaGlsZC5kYXRhLmF0dHJzLnBsYWNlKSB7XG4gICAgcGFyYW1zW2NoaWxkLmRhdGEuYXR0cnMucGxhY2VdID0gY2hpbGQ7XG4gIH1cbiAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DaGlsZEluZGV4IChwYXJhbXMsIGNoaWxkLCBpbmRleCkge1xuICBwYXJhbXNbaW5kZXhdID0gY2hpbGQ7XG4gIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gdm5vZGVIYXNQbGFjZUF0dHJpYnV0ZSAodm5vZGUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMucGxhY2UpXG59XG5cbi8qICAqL1xuXG52YXIgbnVtYmVyQ29tcG9uZW50ID0ge1xuICBuYW1lOiAnaTE4bi1uJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdzcGFuJ1xuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF1cbiAgICB9LFxuICAgIGxvY2FsZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCwgcmVmKSB7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBwYXJlbnQgPSByZWYucGFyZW50O1xuICAgIHZhciBkYXRhID0gcmVmLmRhdGE7XG5cbiAgICB2YXIgaTE4biA9IHBhcmVudC4kaTE4bjtcblxuICAgIGlmICghaTE4bikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybignQ2Fubm90IGZpbmQgVnVlSTE4biBpbnN0YW5jZSEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdmFyIGtleSA9IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5mb3JtYXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBwcm9wcy5mb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICBpZiAocHJvcHMuZm9ybWF0LmtleSkge1xuICAgICAgICBrZXkgPSBwcm9wcy5mb3JtYXQua2V5O1xuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgb3V0IG51bWJlciBmb3JtYXQgb3B0aW9ucyBvbmx5XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmtleXMocHJvcHMuZm9ybWF0KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcHJvcCkge1xuICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgIGlmIChudW1iZXJGb3JtYXRLZXlzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjYywgKCBvYmogPSB7fSwgb2JqW3Byb3BdID0gcHJvcHMuZm9ybWF0W3Byb3BdLCBvYmogKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgbG9jYWxlID0gcHJvcHMubG9jYWxlIHx8IGkxOG4ubG9jYWxlO1xuICAgIHZhciBwYXJ0cyA9IGkxOG4uX250cChwcm9wcy52YWx1ZSwgbG9jYWxlLCBrZXksIG9wdGlvbnMpO1xuXG4gICAgdmFyIHZhbHVlcyA9IHBhcnRzLm1hcChmdW5jdGlvbiAocGFydCwgaW5kZXgpIHtcbiAgICAgIHZhciBvYmo7XG5cbiAgICAgIHZhciBzbG90ID0gZGF0YS5zY29wZWRTbG90cyAmJiBkYXRhLnNjb3BlZFNsb3RzW3BhcnQudHlwZV07XG4gICAgICByZXR1cm4gc2xvdCA/IHNsb3QoKCBvYmogPSB7fSwgb2JqW3BhcnQudHlwZV0gPSBwYXJ0LnZhbHVlLCBvYmouaW5kZXggPSBpbmRleCwgb2JqLnBhcnRzID0gcGFydHMsIG9iaiApKSA6IHBhcnQudmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybiBoKHByb3BzLnRhZywge1xuICAgICAgYXR0cnM6IGRhdGEuYXR0cnMsXG4gICAgICAnY2xhc3MnOiBkYXRhWydjbGFzcyddLFxuICAgICAgc3RhdGljQ2xhc3M6IGRhdGEuc3RhdGljQ2xhc3NcbiAgICB9LCB2YWx1ZXMpXG4gIH1cbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBiaW5kIChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgaWYgKCFhc3NlcnQoZWwsIHZub2RlKSkgeyByZXR1cm4gfVxuXG4gIHQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlIChlbCwgYmluZGluZywgdm5vZGUsIG9sZFZOb2RlKSB7XG4gIGlmICghYXNzZXJ0KGVsLCB2bm9kZSkpIHsgcmV0dXJuIH1cblxuICB2YXIgaTE4biA9IHZub2RlLmNvbnRleHQuJGkxOG47XG4gIGlmIChsb2NhbGVFcXVhbChlbCwgdm5vZGUpICYmXG4gICAgKGxvb3NlRXF1YWwoYmluZGluZy52YWx1ZSwgYmluZGluZy5vbGRWYWx1ZSkgJiZcbiAgICAgbG9vc2VFcXVhbChlbC5fbG9jYWxlTWVzc2FnZSwgaTE4bi5nZXRMb2NhbGVNZXNzYWdlKGkxOG4ubG9jYWxlKSkpKSB7IHJldHVybiB9XG5cbiAgdChlbCwgYmluZGluZywgdm5vZGUpO1xufVxuXG5mdW5jdGlvbiB1bmJpbmQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVk5vZGUpIHtcbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKCF2bSkge1xuICAgIHdhcm4oJ1Z1ZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdHMgaW4gVk5vZGUgY29udGV4dCcpO1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGkxOG4gPSB2bm9kZS5jb250ZXh0LiRpMThuIHx8IHt9O1xuICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLnByZXNlcnZlICYmICFpMThuLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudCkge1xuICAgIGVsLnRleHRDb250ZW50ID0gJyc7XG4gIH1cbiAgZWwuX3Z0ID0gdW5kZWZpbmVkO1xuICBkZWxldGUgZWxbJ192dCddO1xuICBlbC5fbG9jYWxlID0gdW5kZWZpbmVkO1xuICBkZWxldGUgZWxbJ19sb2NhbGUnXTtcbiAgZWwuX2xvY2FsZU1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gIGRlbGV0ZSBlbFsnX2xvY2FsZU1lc3NhZ2UnXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0IChlbCwgdm5vZGUpIHtcbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKCF2bSkge1xuICAgIHdhcm4oJ1Z1ZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdHMgaW4gVk5vZGUgY29udGV4dCcpO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKCF2bS4kaTE4bikge1xuICAgIHdhcm4oJ1Z1ZUkxOG4gaW5zdGFuY2UgZG9lcyBub3QgZXhpc3RzIGluIFZ1ZSBpbnN0YW5jZScpO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gbG9jYWxlRXF1YWwgKGVsLCB2bm9kZSkge1xuICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICByZXR1cm4gZWwuX2xvY2FsZSA9PT0gdm0uJGkxOG4ubG9jYWxlXG59XG5cbmZ1bmN0aW9uIHQgKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICB2YXIgcmVmJDEsIHJlZiQyO1xuXG4gIHZhciB2YWx1ZSA9IGJpbmRpbmcudmFsdWU7XG5cbiAgdmFyIHJlZiA9IHBhcnNlVmFsdWUodmFsdWUpO1xuICB2YXIgcGF0aCA9IHJlZi5wYXRoO1xuICB2YXIgbG9jYWxlID0gcmVmLmxvY2FsZTtcbiAgdmFyIGFyZ3MgPSByZWYuYXJncztcbiAgdmFyIGNob2ljZSA9IHJlZi5jaG9pY2U7XG4gIGlmICghcGF0aCAmJiAhbG9jYWxlICYmICFhcmdzKSB7XG4gICAgd2FybigndmFsdWUgdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIXBhdGgpIHtcbiAgICB3YXJuKCdgcGF0aGAgaXMgcmVxdWlyZWQgaW4gdi10IGRpcmVjdGl2ZScpO1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKGNob2ljZSkge1xuICAgIGVsLl92dCA9IGVsLnRleHRDb250ZW50ID0gKHJlZiQxID0gdm0uJGkxOG4pLnRjLmFwcGx5KHJlZiQxLCBbIHBhdGgsIGNob2ljZSBdLmNvbmNhdCggbWFrZVBhcmFtcyhsb2NhbGUsIGFyZ3MpICkpO1xuICB9IGVsc2Uge1xuICAgIGVsLl92dCA9IGVsLnRleHRDb250ZW50ID0gKHJlZiQyID0gdm0uJGkxOG4pLnQuYXBwbHkocmVmJDIsIFsgcGF0aCBdLmNvbmNhdCggbWFrZVBhcmFtcyhsb2NhbGUsIGFyZ3MpICkpO1xuICB9XG4gIGVsLl9sb2NhbGUgPSB2bS4kaTE4bi5sb2NhbGU7XG4gIGVsLl9sb2NhbGVNZXNzYWdlID0gdm0uJGkxOG4uZ2V0TG9jYWxlTWVzc2FnZSh2bS4kaTE4bi5sb2NhbGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVZhbHVlICh2YWx1ZSkge1xuICB2YXIgcGF0aDtcbiAgdmFyIGxvY2FsZTtcbiAgdmFyIGFyZ3M7XG4gIHZhciBjaG9pY2U7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBwYXRoID0gdmFsdWUucGF0aDtcbiAgICBsb2NhbGUgPSB2YWx1ZS5sb2NhbGU7XG4gICAgYXJncyA9IHZhbHVlLmFyZ3M7XG4gICAgY2hvaWNlID0gdmFsdWUuY2hvaWNlO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogcGF0aCwgbG9jYWxlOiBsb2NhbGUsIGFyZ3M6IGFyZ3MsIGNob2ljZTogY2hvaWNlIH1cbn1cblxuZnVuY3Rpb24gbWFrZVBhcmFtcyAobG9jYWxlLCBhcmdzKSB7XG4gIHZhciBwYXJhbXMgPSBbXTtcblxuICBsb2NhbGUgJiYgcGFyYW1zLnB1c2gobG9jYWxlKTtcbiAgaWYgKGFyZ3MgJiYgKEFycmF5LmlzQXJyYXkoYXJncykgfHwgaXNQbGFpbk9iamVjdChhcmdzKSkpIHtcbiAgICBwYXJhbXMucHVzaChhcmdzKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXNcbn1cblxudmFyIFZ1ZTtcblxuZnVuY3Rpb24gaW5zdGFsbCAoX1Z1ZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaW5zdGFsbC5pbnN0YWxsZWQgJiYgX1Z1ZSA9PT0gVnVlKSB7XG4gICAgd2FybignYWxyZWFkeSBpbnN0YWxsZWQuJyk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaW5zdGFsbC5pbnN0YWxsZWQgPSB0cnVlO1xuXG4gIFZ1ZSA9IF9WdWU7XG5cbiAgdmFyIHZlcnNpb24gPSAoVnVlLnZlcnNpb24gJiYgTnVtYmVyKFZ1ZS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pKSB8fCAtMTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHZlcnNpb24gPCAyKSB7XG4gICAgd2FybigoXCJ2dWUtaTE4biAoXCIgKyAoaW5zdGFsbC52ZXJzaW9uKSArIFwiKSBuZWVkIHRvIHVzZSBWdWUgMi4wIG9yIGxhdGVyIChWdWU6IFwiICsgKFZ1ZS52ZXJzaW9uKSArIFwiKS5cIikpO1xuICAgIHJldHVyblxuICB9XG5cbiAgZXh0ZW5kKFZ1ZSk7XG4gIFZ1ZS5taXhpbihtaXhpbik7XG4gIFZ1ZS5kaXJlY3RpdmUoJ3QnLCB7IGJpbmQ6IGJpbmQsIHVwZGF0ZTogdXBkYXRlLCB1bmJpbmQ6IHVuYmluZCB9KTtcbiAgVnVlLmNvbXBvbmVudChpbnRlcnBvbGF0aW9uQ29tcG9uZW50Lm5hbWUsIGludGVycG9sYXRpb25Db21wb25lbnQpO1xuICBWdWUuY29tcG9uZW50KG51bWJlckNvbXBvbmVudC5uYW1lLCBudW1iZXJDb21wb25lbnQpO1xuXG4gIC8vIHVzZSBzaW1wbGUgbWVyZ2VTdHJhdGVnaWVzIHRvIHByZXZlbnQgaTE4biBpbnN0YW5jZSBsb3NlICdfX3Byb3RvX18nXG4gIHZhciBzdHJhdHMgPSBWdWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcbiAgc3RyYXRzLmkxOG4gPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICAgIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcmVudFZhbFxuICAgICAgOiBjaGlsZFZhbFxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIEJhc2VGb3JtYXR0ZXIgPSBmdW5jdGlvbiBCYXNlRm9ybWF0dGVyICgpIHtcbiAgdGhpcy5fY2FjaGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn07XG5cbkJhc2VGb3JtYXR0ZXIucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gaW50ZXJwb2xhdGUgKG1lc3NhZ2UsIHZhbHVlcykge1xuICBpZiAoIXZhbHVlcykge1xuICAgIHJldHVybiBbbWVzc2FnZV1cbiAgfVxuICB2YXIgdG9rZW5zID0gdGhpcy5fY2FjaGVzW21lc3NhZ2VdO1xuICBpZiAoIXRva2Vucykge1xuICAgIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpO1xuICAgIHRoaXMuX2NhY2hlc1ttZXNzYWdlXSA9IHRva2VucztcbiAgfVxuICByZXR1cm4gY29tcGlsZSh0b2tlbnMsIHZhbHVlcylcbn07XG5cblxuXG52YXIgUkVfVE9LRU5fTElTVF9WQUxVRSA9IC9eKD86XFxkKSsvO1xudmFyIFJFX1RPS0VOX05BTUVEX1ZBTFVFID0gL14oPzpcXHcpKy87XG5cbmZ1bmN0aW9uIHBhcnNlIChmb3JtYXQpIHtcbiAgdmFyIHRva2VucyA9IFtdO1xuICB2YXIgcG9zaXRpb24gPSAwO1xuXG4gIHZhciB0ZXh0ID0gJyc7XG4gIHdoaWxlIChwb3NpdGlvbiA8IGZvcm1hdC5sZW5ndGgpIHtcbiAgICB2YXIgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcbiAgICBpZiAoY2hhciA9PT0gJ3snKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHRleHQgfSk7XG4gICAgICB9XG5cbiAgICAgIHRleHQgPSAnJztcbiAgICAgIHZhciBzdWIgPSAnJztcbiAgICAgIGNoYXIgPSBmb3JtYXRbcG9zaXRpb24rK107XG4gICAgICB3aGlsZSAoY2hhciAhPT0gdW5kZWZpbmVkICYmIGNoYXIgIT09ICd9Jykge1xuICAgICAgICBzdWIgKz0gY2hhcjtcbiAgICAgICAgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0Nsb3NlZCA9IGNoYXIgPT09ICd9JztcblxuICAgICAgdmFyIHR5cGUgPSBSRV9UT0tFTl9MSVNUX1ZBTFVFLnRlc3Qoc3ViKVxuICAgICAgICA/ICdsaXN0J1xuICAgICAgICA6IGlzQ2xvc2VkICYmIFJFX1RPS0VOX05BTUVEX1ZBTFVFLnRlc3Qoc3ViKVxuICAgICAgICAgID8gJ25hbWVkJ1xuICAgICAgICAgIDogJ3Vua25vd24nO1xuICAgICAgdG9rZW5zLnB1c2goeyB2YWx1ZTogc3ViLCB0eXBlOiB0eXBlIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyUnKSB7XG4gICAgICAvLyB3aGVuIGZvdW5kIHJhaWxzIGkxOG4gc3ludGF4LCBza2lwIHRleHQgY2FwdHVyZVxuICAgICAgaWYgKGZvcm1hdFsocG9zaXRpb24pXSAhPT0gJ3snKSB7XG4gICAgICAgIHRleHQgKz0gY2hhcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCArPSBjaGFyO1xuICAgIH1cbiAgfVxuXG4gIHRleHQgJiYgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xuXG4gIHJldHVybiB0b2tlbnNcbn1cblxuZnVuY3Rpb24gY29tcGlsZSAodG9rZW5zLCB2YWx1ZXMpIHtcbiAgdmFyIGNvbXBpbGVkID0gW107XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgdmFyIG1vZGUgPSBBcnJheS5pc0FycmF5KHZhbHVlcylcbiAgICA/ICdsaXN0J1xuICAgIDogaXNPYmplY3QodmFsdWVzKVxuICAgICAgPyAnbmFtZWQnXG4gICAgICA6ICd1bmtub3duJztcbiAgaWYgKG1vZGUgPT09ICd1bmtub3duJykgeyByZXR1cm4gY29tcGlsZWQgfVxuXG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGNvbXBpbGVkLnB1c2godG9rZW4udmFsdWUpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3BhcnNlSW50KHRva2VuLnZhbHVlLCAxMCldKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ25hbWVkJzpcbiAgICAgICAgaWYgKG1vZGUgPT09ICduYW1lZCcpIHtcbiAgICAgICAgICBjb21waWxlZC5wdXNoKCh2YWx1ZXMpW3Rva2VuLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm4oKFwiVHlwZSBvZiB0b2tlbiAnXCIgKyAodG9rZW4udHlwZSkgKyBcIicgYW5kIGZvcm1hdCBvZiB2YWx1ZSAnXCIgKyBtb2RlICsgXCInIGRvbid0IG1hdGNoIVwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd1bmtub3duJzpcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKFwiRGV0ZWN0ICd1bmtub3duJyB0eXBlIG9mIHRva2VuIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVkXG59XG5cbi8qICAqL1xuXG4vKipcbiAqICBQYXRoIHBhcnNlclxuICogIC0gSW5zcGlyZWQ6XG4gKiAgICBWdWUuanMgUGF0aCBwYXJzZXJcbiAqL1xuXG4vLyBhY3Rpb25zXG52YXIgQVBQRU5EID0gMDtcbnZhciBQVVNIID0gMTtcbnZhciBJTkNfU1VCX1BBVEhfREVQVEggPSAyO1xudmFyIFBVU0hfU1VCX1BBVEggPSAzO1xuXG4vLyBzdGF0ZXNcbnZhciBCRUZPUkVfUEFUSCA9IDA7XG52YXIgSU5fUEFUSCA9IDE7XG52YXIgQkVGT1JFX0lERU5UID0gMjtcbnZhciBJTl9JREVOVCA9IDM7XG52YXIgSU5fU1VCX1BBVEggPSA0O1xudmFyIElOX1NJTkdMRV9RVU9URSA9IDU7XG52YXIgSU5fRE9VQkxFX1FVT1RFID0gNjtcbnZhciBBRlRFUl9QQVRIID0gNztcbnZhciBFUlJPUiA9IDg7XG5cbnZhciBwYXRoU3RhdGVNYWNoaW5lID0gW107XG5cbnBhdGhTdGF0ZU1hY2hpbmVbQkVGT1JFX1BBVEhdID0ge1xuICAnd3MnOiBbQkVGT1JFX1BBVEhdLFxuICAnaWRlbnQnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICdbJzogW0lOX1NVQl9QQVRIXSxcbiAgJ2VvZic6IFtBRlRFUl9QQVRIXVxufTtcblxucGF0aFN0YXRlTWFjaGluZVtJTl9QQVRIXSA9IHtcbiAgJ3dzJzogW0lOX1BBVEhdLFxuICAnLic6IFtCRUZPUkVfSURFTlRdLFxuICAnWyc6IFtJTl9TVUJfUEFUSF0sXG4gICdlb2YnOiBbQUZURVJfUEFUSF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbQkVGT1JFX0lERU5UXSA9IHtcbiAgJ3dzJzogW0JFRk9SRV9JREVOVF0sXG4gICdpZGVudCc6IFtJTl9JREVOVCwgQVBQRU5EXSxcbiAgJzAnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICdudW1iZXInOiBbSU5fSURFTlQsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fSURFTlRdID0ge1xuICAnaWRlbnQnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICcwJzogW0lOX0lERU5ULCBBUFBFTkRdLFxuICAnbnVtYmVyJzogW0lOX0lERU5ULCBBUFBFTkRdLFxuICAnd3MnOiBbSU5fUEFUSCwgUFVTSF0sXG4gICcuJzogW0JFRk9SRV9JREVOVCwgUFVTSF0sXG4gICdbJzogW0lOX1NVQl9QQVRILCBQVVNIXSxcbiAgJ2VvZic6IFtBRlRFUl9QQVRILCBQVVNIXVxufTtcblxucGF0aFN0YXRlTWFjaGluZVtJTl9TVUJfUEFUSF0gPSB7XG4gIFwiJ1wiOiBbSU5fU0lOR0xFX1FVT1RFLCBBUFBFTkRdLFxuICAnXCInOiBbSU5fRE9VQkxFX1FVT1RFLCBBUFBFTkRdLFxuICAnWyc6IFtJTl9TVUJfUEFUSCwgSU5DX1NVQl9QQVRIX0RFUFRIXSxcbiAgJ10nOiBbSU5fUEFUSCwgUFVTSF9TVUJfUEFUSF0sXG4gICdlb2YnOiBFUlJPUixcbiAgJ2Vsc2UnOiBbSU5fU1VCX1BBVEgsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fU0lOR0xFX1FVT1RFXSA9IHtcbiAgXCInXCI6IFtJTl9TVUJfUEFUSCwgQVBQRU5EXSxcbiAgJ2VvZic6IEVSUk9SLFxuICAnZWxzZSc6IFtJTl9TSU5HTEVfUVVPVEUsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fRE9VQkxFX1FVT1RFXSA9IHtcbiAgJ1wiJzogW0lOX1NVQl9QQVRILCBBUFBFTkRdLFxuICAnZW9mJzogRVJST1IsXG4gICdlbHNlJzogW0lOX0RPVUJMRV9RVU9URSwgQVBQRU5EXVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBleHByZXNzaW9uIGlzIGEgbGl0ZXJhbCB2YWx1ZS5cbiAqL1xuXG52YXIgbGl0ZXJhbFZhbHVlUkUgPSAvXlxccz8oPzp0cnVlfGZhbHNlfC0/W1xcZC5dK3wnW14nXSonfFwiW15cIl0qXCIpXFxzPyQvO1xuZnVuY3Rpb24gaXNMaXRlcmFsIChleHApIHtcbiAgcmV0dXJuIGxpdGVyYWxWYWx1ZVJFLnRlc3QoZXhwKVxufVxuXG4vKipcbiAqIFN0cmlwIHF1b3RlcyBmcm9tIGEgc3RyaW5nXG4gKi9cblxuZnVuY3Rpb24gc3RyaXBRdW90ZXMgKHN0cikge1xuICB2YXIgYSA9IHN0ci5jaGFyQ29kZUF0KDApO1xuICB2YXIgYiA9IHN0ci5jaGFyQ29kZUF0KHN0ci5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIGEgPT09IGIgJiYgKGEgPT09IDB4MjIgfHwgYSA9PT0gMHgyNylcbiAgICA/IHN0ci5zbGljZSgxLCAtMSlcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgdHlwZSBvZiBhIGNoYXJhY3RlciBpbiBhIGtleXBhdGguXG4gKi9cblxuZnVuY3Rpb24gZ2V0UGF0aENoYXJUeXBlIChjaCkge1xuICBpZiAoY2ggPT09IHVuZGVmaW5lZCB8fCBjaCA9PT0gbnVsbCkgeyByZXR1cm4gJ2VvZicgfVxuXG4gIHZhciBjb2RlID0gY2guY2hhckNvZGVBdCgwKTtcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4NUI6IC8vIFtcbiAgICBjYXNlIDB4NUQ6IC8vIF1cbiAgICBjYXNlIDB4MkU6IC8vIC5cbiAgICBjYXNlIDB4MjI6IC8vIFwiXG4gICAgY2FzZSAweDI3OiAvLyAnXG4gICAgICByZXR1cm4gY2hcblxuICAgIGNhc2UgMHg1RjogLy8gX1xuICAgIGNhc2UgMHgyNDogLy8gJFxuICAgIGNhc2UgMHgyRDogLy8gLVxuICAgICAgcmV0dXJuICdpZGVudCdcblxuICAgIGNhc2UgMHgwOTogLy8gVGFiXG4gICAgY2FzZSAweDBBOiAvLyBOZXdsaW5lXG4gICAgY2FzZSAweDBEOiAvLyBSZXR1cm5cbiAgICBjYXNlIDB4QTA6ICAvLyBOby1icmVhayBzcGFjZVxuICAgIGNhc2UgMHhGRUZGOiAgLy8gQnl0ZSBPcmRlciBNYXJrXG4gICAgY2FzZSAweDIwMjg6ICAvLyBMaW5lIFNlcGFyYXRvclxuICAgIGNhc2UgMHgyMDI5OiAgLy8gUGFyYWdyYXBoIFNlcGFyYXRvclxuICAgICAgcmV0dXJuICd3cydcbiAgfVxuXG4gIHJldHVybiAnaWRlbnQnXG59XG5cbi8qKlxuICogRm9ybWF0IGEgc3ViUGF0aCwgcmV0dXJuIGl0cyBwbGFpbiBmb3JtIGlmIGl0IGlzXG4gKiBhIGxpdGVyYWwgc3RyaW5nIG9yIG51bWJlci4gT3RoZXJ3aXNlIHByZXBlbmQgdGhlXG4gKiBkeW5hbWljIGluZGljYXRvciAoKikuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0U3ViUGF0aCAocGF0aCkge1xuICB2YXIgdHJpbW1lZCA9IHBhdGgudHJpbSgpO1xuICAvLyBpbnZhbGlkIGxlYWRpbmcgMFxuICBpZiAocGF0aC5jaGFyQXQoMCkgPT09ICcwJyAmJiBpc05hTihwYXRoKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHJldHVybiBpc0xpdGVyYWwodHJpbW1lZCkgPyBzdHJpcFF1b3Rlcyh0cmltbWVkKSA6ICcqJyArIHRyaW1tZWRcbn1cblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBwYXRoIGludG8gYW4gYXJyYXkgb2Ygc2VnbWVudHNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSQxIChwYXRoKSB7XG4gIHZhciBrZXlzID0gW107XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbW9kZSA9IEJFRk9SRV9QQVRIO1xuICB2YXIgc3ViUGF0aERlcHRoID0gMDtcbiAgdmFyIGM7XG4gIHZhciBrZXk7XG4gIHZhciBuZXdDaGFyO1xuICB2YXIgdHlwZTtcbiAgdmFyIHRyYW5zaXRpb247XG4gIHZhciBhY3Rpb247XG4gIHZhciB0eXBlTWFwO1xuICB2YXIgYWN0aW9ucyA9IFtdO1xuXG4gIGFjdGlvbnNbUFVTSF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIGtleSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgYWN0aW9uc1tBUFBFTkRdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gbmV3Q2hhcjtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ICs9IG5ld0NoYXI7XG4gICAgfVxuICB9O1xuXG4gIGFjdGlvbnNbSU5DX1NVQl9QQVRIX0RFUFRIXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBhY3Rpb25zW0FQUEVORF0oKTtcbiAgICBzdWJQYXRoRGVwdGgrKztcbiAgfTtcblxuICBhY3Rpb25zW1BVU0hfU1VCX1BBVEhdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdWJQYXRoRGVwdGggPiAwKSB7XG4gICAgICBzdWJQYXRoRGVwdGgtLTtcbiAgICAgIG1vZGUgPSBJTl9TVUJfUEFUSDtcbiAgICAgIGFjdGlvbnNbQVBQRU5EXSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJQYXRoRGVwdGggPSAwO1xuICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICBrZXkgPSBmb3JtYXRTdWJQYXRoKGtleSk7XG4gICAgICBpZiAoa2V5ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbnNbUFVTSF0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gbWF5YmVVbmVzY2FwZVF1b3RlICgpIHtcbiAgICB2YXIgbmV4dENoYXIgPSBwYXRoW2luZGV4ICsgMV07XG4gICAgaWYgKChtb2RlID09PSBJTl9TSU5HTEVfUVVPVEUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB8fFxuICAgICAgKG1vZGUgPT09IElOX0RPVUJMRV9RVU9URSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBuZXdDaGFyID0gJ1xcXFwnICsgbmV4dENoYXI7XG4gICAgICBhY3Rpb25zW0FQUEVORF0oKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKG1vZGUgIT09IG51bGwpIHtcbiAgICBpbmRleCsrO1xuICAgIGMgPSBwYXRoW2luZGV4XTtcblxuICAgIGlmIChjID09PSAnXFxcXCcgJiYgbWF5YmVVbmVzY2FwZVF1b3RlKCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdHlwZSA9IGdldFBhdGhDaGFyVHlwZShjKTtcbiAgICB0eXBlTWFwID0gcGF0aFN0YXRlTWFjaGluZVttb2RlXTtcbiAgICB0cmFuc2l0aW9uID0gdHlwZU1hcFt0eXBlXSB8fCB0eXBlTWFwWydlbHNlJ10gfHwgRVJST1I7XG5cbiAgICBpZiAodHJhbnNpdGlvbiA9PT0gRVJST1IpIHtcbiAgICAgIHJldHVybiAvLyBwYXJzZSBlcnJvclxuICAgIH1cblxuICAgIG1vZGUgPSB0cmFuc2l0aW9uWzBdO1xuICAgIGFjdGlvbiA9IGFjdGlvbnNbdHJhbnNpdGlvblsxXV07XG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgbmV3Q2hhciA9IHRyYW5zaXRpb25bMl07XG4gICAgICBuZXdDaGFyID0gbmV3Q2hhciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gY1xuICAgICAgICA6IG5ld0NoYXI7XG4gICAgICBpZiAoYWN0aW9uKCkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlID09PSBBRlRFUl9QQVRIKSB7XG4gICAgICByZXR1cm4ga2V5c1xuICAgIH1cbiAgfVxufVxuXG5cblxuXG5cbnZhciBJMThuUGF0aCA9IGZ1bmN0aW9uIEkxOG5QYXRoICgpIHtcbiAgdGhpcy5fY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xufTtcblxuLyoqXG4gKiBFeHRlcm5hbCBwYXJzZSB0aGF0IGNoZWNrIGZvciBhIGNhY2hlIGhpdCBmaXJzdFxuICovXG5JMThuUGF0aC5wcm90b3R5cGUucGFyc2VQYXRoID0gZnVuY3Rpb24gcGFyc2VQYXRoIChwYXRoKSB7XG4gIHZhciBoaXQgPSB0aGlzLl9jYWNoZVtwYXRoXTtcbiAgaWYgKCFoaXQpIHtcbiAgICBoaXQgPSBwYXJzZSQxKHBhdGgpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMuX2NhY2hlW3BhdGhdID0gaGl0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGl0IHx8IFtdXG59O1xuXG4vKipcbiAqIEdldCBwYXRoIHZhbHVlIGZyb20gcGF0aCBzdHJpbmdcbiAqL1xuSTE4blBhdGgucHJvdG90eXBlLmdldFBhdGhWYWx1ZSA9IGZ1bmN0aW9uIGdldFBhdGhWYWx1ZSAob2JqLCBwYXRoKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgdmFyIHBhdGhzID0gdGhpcy5wYXJzZVBhdGgocGF0aCk7XG4gIGlmIChwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgdmFyIGxhc3QgPSBvYmo7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBsYXN0W3BhdGhzW2ldXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBsYXN0ID0gdmFsdWU7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RcbiAgfVxufTtcblxuLyogICovXG5cblxuXG52YXIgaHRtbFRhZ01hdGNoZXIgPSAvPFxcLz9bXFx3XFxzPVwiLy4nOjsjLVxcL10rPi87XG52YXIgbGlua0tleU1hdGNoZXIgPSAvKD86QCg/OlxcLlthLXpdKyk/Oig/OltcXHdcXC1ffC5dK3xcXChbXFx3XFwtX3wuXStcXCkpKS9nO1xudmFyIGxpbmtLZXlQcmVmaXhNYXRjaGVyID0gL15AKD86XFwuKFthLXpdKykpPzovO1xudmFyIGJyYWNrZXRzTWF0Y2hlciA9IC9bKCldL2c7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IHtcbiAgJ3VwcGVyJzogZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyLnRvTG9jYWxlVXBwZXJDYXNlKCk7IH0sXG4gICdsb3dlcic6IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0ci50b0xvY2FsZUxvd2VyQ2FzZSgpOyB9XG59O1xuXG52YXIgZGVmYXVsdEZvcm1hdHRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XG5cbnZhciBWdWVJMThuID0gZnVuY3Rpb24gVnVlSTE4biAob3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgLy8gQXV0byBpbnN0YWxsIGlmIGl0IGlzIG5vdCBkb25lIHlldCBhbmQgYHdpbmRvd2AgaGFzIGBWdWVgLlxuICAvLyBUbyBhbGxvdyB1c2VycyB0byBhdm9pZCBhdXRvLWluc3RhbGxhdGlvbiBpbiBzb21lIGNhc2VzLFxuICAvLyB0aGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBoZXJlLiBTZWUgIzI5MFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFWdWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZ1ZSkge1xuICAgIGluc3RhbGwod2luZG93LlZ1ZSk7XG4gIH1cblxuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgJ2VuLVVTJztcbiAgdmFyIGZhbGxiYWNrTG9jYWxlID0gb3B0aW9ucy5mYWxsYmFja0xvY2FsZSB8fCAnZW4tVVMnO1xuICB2YXIgbWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzIHx8IHt9O1xuICB2YXIgZGF0ZVRpbWVGb3JtYXRzID0gb3B0aW9ucy5kYXRlVGltZUZvcm1hdHMgfHwge307XG4gIHZhciBudW1iZXJGb3JtYXRzID0gb3B0aW9ucy5udW1iZXJGb3JtYXRzIHx8IHt9O1xuXG4gIHRoaXMuX3ZtID0gbnVsbDtcbiAgdGhpcy5fZm9ybWF0dGVyID0gb3B0aW9ucy5mb3JtYXR0ZXIgfHwgZGVmYXVsdEZvcm1hdHRlcjtcbiAgdGhpcy5fbW9kaWZpZXJzID0gb3B0aW9ucy5tb2RpZmllcnMgfHwge307XG4gIHRoaXMuX21pc3NpbmcgPSBvcHRpb25zLm1pc3NpbmcgfHwgbnVsbDtcbiAgdGhpcy5fcm9vdCA9IG9wdGlvbnMucm9vdCB8fCBudWxsO1xuICB0aGlzLl9zeW5jID0gb3B0aW9ucy5zeW5jID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRpb25zLnN5bmM7XG4gIHRoaXMuX2ZhbGxiYWNrUm9vdCA9IG9wdGlvbnMuZmFsbGJhY2tSb290ID09PSB1bmRlZmluZWRcbiAgICA/IHRydWVcbiAgICA6ICEhb3B0aW9ucy5mYWxsYmFja1Jvb3Q7XG4gIHRoaXMuX2Zvcm1hdEZhbGxiYWNrTWVzc2FnZXMgPSBvcHRpb25zLmZvcm1hdEZhbGxiYWNrTWVzc2FnZXMgPT09IHVuZGVmaW5lZFxuICAgID8gZmFsc2VcbiAgICA6ICEhb3B0aW9ucy5mb3JtYXRGYWxsYmFja01lc3NhZ2VzO1xuICB0aGlzLl9zaWxlbnRUcmFuc2xhdGlvbldhcm4gPSBvcHRpb25zLnNpbGVudFRyYW5zbGF0aW9uV2FybiA9PT0gdW5kZWZpbmVkXG4gICAgPyBmYWxzZVxuICAgIDogb3B0aW9ucy5zaWxlbnRUcmFuc2xhdGlvbldhcm47XG4gIHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiA9IG9wdGlvbnMuc2lsZW50RmFsbGJhY2tXYXJuID09PSB1bmRlZmluZWRcbiAgICA/IGZhbHNlXG4gICAgOiAhIW9wdGlvbnMuc2lsZW50RmFsbGJhY2tXYXJuO1xuICB0aGlzLl9kYXRlVGltZUZvcm1hdHRlcnMgPSB7fTtcbiAgdGhpcy5fbnVtYmVyRm9ybWF0dGVycyA9IHt9O1xuICB0aGlzLl9wYXRoID0gbmV3IEkxOG5QYXRoKCk7XG4gIHRoaXMuX2RhdGFMaXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy5fcHJlc2VydmVEaXJlY3RpdmVDb250ZW50ID0gb3B0aW9ucy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgPT09IHVuZGVmaW5lZFxuICAgID8gZmFsc2VcbiAgICA6ICEhb3B0aW9ucy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQ7XG4gIHRoaXMucGx1cmFsaXphdGlvblJ1bGVzID0gb3B0aW9ucy5wbHVyYWxpemF0aW9uUnVsZXMgfHwge307XG4gIHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID0gb3B0aW9ucy53YXJuSHRtbEluTWVzc2FnZSB8fCAnb2ZmJztcblxuICB0aGlzLl9leGlzdCA9IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIWtleSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmICghaXNOdWxsKHRoaXMkMS5fcGF0aC5nZXRQYXRoVmFsdWUobWVzc2FnZSwga2V5KSkpIHsgcmV0dXJuIHRydWUgfVxuICAgIC8vIGZhbGxiYWNrIGZvciBmbGF0IGtleVxuICAgIGlmIChtZXNzYWdlW2tleV0pIHsgcmV0dXJuIHRydWUgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ3dhcm4nIHx8IHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7XG4gICAgT2JqZWN0LmtleXMobWVzc2FnZXMpLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgdGhpcyQxLl9jaGVja0xvY2FsZU1lc3NhZ2UobG9jYWxlLCB0aGlzJDEuX3dhcm5IdG1sSW5NZXNzYWdlLCBtZXNzYWdlc1tsb2NhbGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMuX2luaXRWTSh7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZmFsbGJhY2tMb2NhbGU6IGZhbGxiYWNrTG9jYWxlLFxuICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICBkYXRlVGltZUZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBudW1iZXJGb3JtYXRzOiBudW1iZXJGb3JtYXRzXG4gIH0pO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgdm06IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sbWVzc2FnZXM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGF0ZVRpbWVGb3JtYXRzOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG51bWJlckZvcm1hdHM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYXZhaWxhYmxlTG9jYWxlczogeyBjb25maWd1cmFibGU6IHRydWUgfSxsb2NhbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZmFsbGJhY2tMb2NhbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZm9ybWF0RmFsbGJhY2tNZXNzYWdlczogeyBjb25maWd1cmFibGU6IHRydWUgfSxtaXNzaW5nOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGZvcm1hdHRlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxzaWxlbnRUcmFuc2xhdGlvbldhcm46IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sc2lsZW50RmFsbGJhY2tXYXJuOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHByZXNlcnZlRGlyZWN0aXZlQ29udGVudDogeyBjb25maWd1cmFibGU6IHRydWUgfSx3YXJuSHRtbEluTWVzc2FnZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fY2hlY2tMb2NhbGVNZXNzYWdlID0gZnVuY3Rpb24gX2NoZWNrTG9jYWxlTWVzc2FnZSAobG9jYWxlLCBsZXZlbCwgbWVzc2FnZSkge1xuICB2YXIgcGF0aHMgPSBbXTtcblxuICB2YXIgZm4gPSBmdW5jdGlvbiAobGV2ZWwsIGxvY2FsZSwgbWVzc2FnZSwgcGF0aHMpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChtZXNzYWdlKSkge1xuICAgICAgT2JqZWN0LmtleXMobWVzc2FnZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWwgPSBtZXNzYWdlW2tleV07XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICBwYXRocy5wdXNoKGtleSk7XG4gICAgICAgICAgcGF0aHMucHVzaCgnLicpO1xuICAgICAgICAgIGZuKGxldmVsLCBsb2NhbGUsIHZhbCwgcGF0aHMpO1xuICAgICAgICAgIHBhdGhzLnBvcCgpO1xuICAgICAgICAgIHBhdGhzLnBvcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGhzLnB1c2goa2V5KTtcbiAgICAgICAgICBmbihsZXZlbCwgbG9jYWxlLCB2YWwsIHBhdGhzKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgICAgcGF0aHMucHVzaCgoXCJbXCIgKyBpbmRleCArIFwiXVwiKSk7XG4gICAgICAgICAgcGF0aHMucHVzaCgnLicpO1xuICAgICAgICAgIGZuKGxldmVsLCBsb2NhbGUsIGl0ZW0sIHBhdGhzKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRocy5wdXNoKChcIltcIiArIGluZGV4ICsgXCJdXCIpKTtcbiAgICAgICAgICBmbihsZXZlbCwgbG9jYWxlLCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgcGF0aHMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcmV0ID0gaHRtbFRhZ01hdGNoZXIudGVzdChtZXNzYWdlKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgdmFyIG1zZyA9IFwiRGV0ZWN0ZWQgSFRNTCBpbiBtZXNzYWdlICdcIiArIG1lc3NhZ2UgKyBcIicgb2Yga2V5cGF0aCAnXCIgKyAocGF0aHMuam9pbignJykpICsgXCInIGF0ICdcIiArIGxvY2FsZSArIFwiJy4gQ29uc2lkZXIgY29tcG9uZW50IGludGVycG9sYXRpb24gd2l0aCAnPGkxOG4+JyB0byBhdm9pZCBYU1MuIFNlZSBodHRwczovL2JpdC5seS8yWnFKemtwXCI7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSB7XG4gICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgZXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmbihsZXZlbCwgbG9jYWxlLCBtZXNzYWdlLCBwYXRocyk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faW5pdFZNID0gZnVuY3Rpb24gX2luaXRWTSAoZGF0YSkge1xuICB2YXIgc2lsZW50ID0gVnVlLmNvbmZpZy5zaWxlbnQ7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gdHJ1ZTtcbiAgdGhpcy5fdm0gPSBuZXcgVnVlKHsgZGF0YTogZGF0YSB9KTtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSBzaWxlbnQ7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5kZXN0cm95Vk0gPSBmdW5jdGlvbiBkZXN0cm95Vk0gKCkge1xuICB0aGlzLl92bS4kZGVzdHJveSgpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuc3Vic2NyaWJlRGF0YUNoYW5naW5nID0gZnVuY3Rpb24gc3Vic2NyaWJlRGF0YUNoYW5naW5nICh2bSkge1xuICB0aGlzLl9kYXRhTGlzdGVuZXJzLnB1c2godm0pO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudW5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcgPSBmdW5jdGlvbiB1bnN1YnNjcmliZURhdGFDaGFuZ2luZyAodm0pIHtcbiAgcmVtb3ZlKHRoaXMuX2RhdGFMaXN0ZW5lcnMsIHZtKTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLndhdGNoSTE4bkRhdGEgPSBmdW5jdGlvbiB3YXRjaEkxOG5EYXRhICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5fdm0uJHdhdGNoKCckZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaSA9IHNlbGYuX2RhdGFMaXN0ZW5lcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2RhdGFMaXN0ZW5lcnNbaV0gJiYgc2VsZi5fZGF0YUxpc3RlbmVyc1tpXS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgeyBkZWVwOiB0cnVlIH0pXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS53YXRjaExvY2FsZSA9IGZ1bmN0aW9uIHdhdGNoTG9jYWxlICgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghdGhpcy5fc3luYyB8fCAhdGhpcy5fcm9vdCkgeyByZXR1cm4gbnVsbCB9XG4gIHZhciB0YXJnZXQgPSB0aGlzLl92bTtcbiAgcmV0dXJuIHRoaXMuX3Jvb3QuJGkxOG4udm0uJHdhdGNoKCdsb2NhbGUnLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGFyZ2V0LiRzZXQodGFyZ2V0LCAnbG9jYWxlJywgdmFsKTtcbiAgICB0YXJnZXQuJGZvcmNlVXBkYXRlKCk7XG4gIH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMudm0uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0gfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLm1lc3NhZ2VzLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fZ2V0TWVzc2FnZXMoKSkgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5kYXRlVGltZUZvcm1hdHMuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbG9vc2VDbG9uZSh0aGlzLl9nZXREYXRlVGltZUZvcm1hdHMoKSkgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5udW1iZXJGb3JtYXRzLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fZ2V0TnVtYmVyRm9ybWF0cygpKSB9O1xucHJvdG90eXBlQWNjZXNzb3JzLmF2YWlsYWJsZUxvY2FsZXMuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tZXNzYWdlcykuc29ydCgpIH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5sb2NhbGUuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0ubG9jYWxlIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMubG9jYWxlLnNldCA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bSwgJ2xvY2FsZScsIGxvY2FsZSk7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuZmFsbGJhY2tMb2NhbGUuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0uZmFsbGJhY2tMb2NhbGUgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mYWxsYmFja0xvY2FsZS5zZXQgPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0sICdmYWxsYmFja0xvY2FsZScsIGxvY2FsZSk7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9ybWF0RmFsbGJhY2tNZXNzYWdlcy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9mb3JtYXRGYWxsYmFja01lc3NhZ2VzIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9ybWF0RmFsbGJhY2tNZXNzYWdlcy5zZXQgPSBmdW5jdGlvbiAoZmFsbGJhY2spIHsgdGhpcy5fZm9ybWF0RmFsbGJhY2tNZXNzYWdlcyA9IGZhbGxiYWNrOyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMubWlzc2luZy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9taXNzaW5nIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMubWlzc2luZy5zZXQgPSBmdW5jdGlvbiAoaGFuZGxlcikgeyB0aGlzLl9taXNzaW5nID0gaGFuZGxlcjsgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmZvcm1hdHRlci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9mb3JtYXR0ZXIgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mb3JtYXR0ZXIuc2V0ID0gZnVuY3Rpb24gKGZvcm1hdHRlcikgeyB0aGlzLl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5zaWxlbnRUcmFuc2xhdGlvbldhcm4uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc2lsZW50VHJhbnNsYXRpb25XYXJuIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMuc2lsZW50VHJhbnNsYXRpb25XYXJuLnNldCA9IGZ1bmN0aW9uIChzaWxlbnQpIHsgdGhpcy5fc2lsZW50VHJhbnNsYXRpb25XYXJuID0gc2lsZW50OyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuc2lsZW50RmFsbGJhY2tXYXJuLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiB9O1xucHJvdG90eXBlQWNjZXNzb3JzLnNpbGVudEZhbGxiYWNrV2Fybi5zZXQgPSBmdW5jdGlvbiAoc2lsZW50KSB7IHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiA9IHNpbGVudDsgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQuc2V0ID0gZnVuY3Rpb24gKHByZXNlcnZlKSB7IHRoaXMuX3ByZXNlcnZlRGlyZWN0aXZlQ29udGVudCA9IHByZXNlcnZlOyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMud2Fybkh0bWxJbk1lc3NhZ2UuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy53YXJuSHRtbEluTWVzc2FnZS5zZXQgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgb3JnTGV2ZWwgPSB0aGlzLl93YXJuSHRtbEluTWVzc2FnZTtcbiAgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgPSBsZXZlbDtcbiAgaWYgKG9yZ0xldmVsICE9PSBsZXZlbCAmJiAobGV2ZWwgPT09ICd3YXJuJyB8fCBsZXZlbCA9PT0gJ2Vycm9yJykpIHtcbiAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLl9nZXRNZXNzYWdlcygpO1xuICAgIE9iamVjdC5rZXlzKG1lc3NhZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICAgIHRoaXMkMS5fY2hlY2tMb2NhbGVNZXNzYWdlKGxvY2FsZSwgdGhpcyQxLl93YXJuSHRtbEluTWVzc2FnZSwgbWVzc2FnZXNbbG9jYWxlXSk7XG4gICAgfSk7XG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uIF9nZXRNZXNzYWdlcyAoKSB7IHJldHVybiB0aGlzLl92bS5tZXNzYWdlcyB9O1xuVnVlSTE4bi5wcm90b3R5cGUuX2dldERhdGVUaW1lRm9ybWF0cyA9IGZ1bmN0aW9uIF9nZXREYXRlVGltZUZvcm1hdHMgKCkgeyByZXR1cm4gdGhpcy5fdm0uZGF0ZVRpbWVGb3JtYXRzIH07XG5WdWVJMThuLnByb3RvdHlwZS5fZ2V0TnVtYmVyRm9ybWF0cyA9IGZ1bmN0aW9uIF9nZXROdW1iZXJGb3JtYXRzICgpIHsgcmV0dXJuIHRoaXMuX3ZtLm51bWJlckZvcm1hdHMgfTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3dhcm5EZWZhdWx0ID0gZnVuY3Rpb24gX3dhcm5EZWZhdWx0IChsb2NhbGUsIGtleSwgcmVzdWx0LCB2bSwgdmFsdWVzKSB7XG4gIGlmICghaXNOdWxsKHJlc3VsdCkpIHsgcmV0dXJuIHJlc3VsdCB9XG4gIGlmICh0aGlzLl9taXNzaW5nKSB7XG4gICAgdmFyIG1pc3NpbmdSZXQgPSB0aGlzLl9taXNzaW5nLmFwcGx5KG51bGwsIFtsb2NhbGUsIGtleSwgdm0sIHZhbHVlc10pO1xuICAgIGlmICh0eXBlb2YgbWlzc2luZ1JldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtaXNzaW5nUmV0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIkNhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggJ1wiICsga2V5ICsgXCInLiBcIiArXG4gICAgICAgICdVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9mb3JtYXRGYWxsYmFja01lc3NhZ2VzKSB7XG4gICAgdmFyIHBhcnNlZEFyZ3MgPSBwYXJzZUFyZ3MuYXBwbHkodm9pZCAwLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXIoa2V5LCAnc3RyaW5nJywgcGFyc2VkQXJncy5wYXJhbXMsIGtleSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2V5XG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc0ZhbGxiYWNrUm9vdCA9IGZ1bmN0aW9uIF9pc0ZhbGxiYWNrUm9vdCAodmFsKSB7XG4gIHJldHVybiAhdmFsICYmICFpc051bGwodGhpcy5fcm9vdCkgJiYgdGhpcy5fZmFsbGJhY2tSb290XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faXNTaWxlbnRGYWxsYmFja1dhcm4gPSBmdW5jdGlvbiBfaXNTaWxlbnRGYWxsYmFja1dhcm4gKGtleSkge1xuICByZXR1cm4gdGhpcy5fc2lsZW50RmFsbGJhY2tXYXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgPyB0aGlzLl9zaWxlbnRGYWxsYmFja1dhcm4udGVzdChrZXkpXG4gICAgOiB0aGlzLl9zaWxlbnRGYWxsYmFja1dhcm5cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc1NpbGVudEZhbGxiYWNrID0gZnVuY3Rpb24gX2lzU2lsZW50RmFsbGJhY2sgKGxvY2FsZSwga2V5KSB7XG4gIHJldHVybiB0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpICYmICh0aGlzLl9pc0ZhbGxiYWNrUm9vdCgpIHx8IGxvY2FsZSAhPT0gdGhpcy5mYWxsYmFja0xvY2FsZSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybiA9IGZ1bmN0aW9uIF9pc1NpbGVudFRyYW5zbGF0aW9uV2FybiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zaWxlbnRUcmFuc2xhdGlvbldhcm4gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICA/IHRoaXMuX3NpbGVudFRyYW5zbGF0aW9uV2Fybi50ZXN0KGtleSlcbiAgICA6IHRoaXMuX3NpbGVudFRyYW5zbGF0aW9uV2FyblxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX2ludGVycG9sYXRlID0gZnVuY3Rpb24gX2ludGVycG9sYXRlIChcbiAgbG9jYWxlLFxuICBtZXNzYWdlLFxuICBrZXksXG4gIGhvc3QsXG4gIGludGVycG9sYXRlTW9kZSxcbiAgdmFsdWVzLFxuICB2aXNpdGVkTGlua1N0YWNrXG4pIHtcbiAgaWYgKCFtZXNzYWdlKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgcGF0aFJldCA9IHRoaXMuX3BhdGguZ2V0UGF0aFZhbHVlKG1lc3NhZ2UsIGtleSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGhSZXQpIHx8IGlzUGxhaW5PYmplY3QocGF0aFJldCkpIHsgcmV0dXJuIHBhdGhSZXQgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChpc051bGwocGF0aFJldCkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG1lc3NhZ2UpKSB7XG4gICAgICByZXQgPSBtZXNzYWdlW2tleV07XG4gICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2sobG9jYWxlLCBrZXkpKSB7XG4gICAgICAgICAgd2FybigoXCJWYWx1ZSBvZiBrZXkgJ1wiICsga2V5ICsgXCInIGlzIG5vdCBhIHN0cmluZyFcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBwYXRoUmV0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0ID0gcGF0aFJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2sobG9jYWxlLCBrZXkpKSB7XG4gICAgICAgIHdhcm4oKFwiVmFsdWUgb2Yga2V5ICdcIiArIGtleSArIFwiJyBpcyBub3QgYSBzdHJpbmchXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbGlua3Mgd2l0aGluIHRoZSB0cmFuc2xhdGVkIHN0cmluZ1xuICBpZiAocmV0LmluZGV4T2YoJ0A6JykgPj0gMCB8fCByZXQuaW5kZXhPZignQC4nKSA+PSAwKSB7XG4gICAgcmV0ID0gdGhpcy5fbGluayhsb2NhbGUsIG1lc3NhZ2UsIHJldCwgaG9zdCwgJ3JhdycsIHZhbHVlcywgdmlzaXRlZExpbmtTdGFjayk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fcmVuZGVyKHJldCwgaW50ZXJwb2xhdGVNb2RlLCB2YWx1ZXMsIGtleSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9saW5rID0gZnVuY3Rpb24gX2xpbmsgKFxuICBsb2NhbGUsXG4gIG1lc3NhZ2UsXG4gIHN0cixcbiAgaG9zdCxcbiAgaW50ZXJwb2xhdGVNb2RlLFxuICB2YWx1ZXMsXG4gIHZpc2l0ZWRMaW5rU3RhY2tcbikge1xuICB2YXIgcmV0ID0gc3RyO1xuXG4gIC8vIE1hdGNoIGFsbCB0aGUgbGlua3Mgd2l0aGluIHRoZSBsb2NhbFxuICAvLyBXZSBhcmUgZ29pbmcgdG8gcmVwbGFjZSBlYWNoIG9mXG4gIC8vIHRoZW0gd2l0aCBpdHMgdHJhbnNsYXRpb25cbiAgdmFyIG1hdGNoZXMgPSByZXQubWF0Y2gobGlua0tleU1hdGNoZXIpO1xuICBmb3IgKHZhciBpZHggaW4gbWF0Y2hlcykge1xuICAgIC8vIGllIGNvbXBhdGlibGU6IGZpbHRlciBjdXN0b20gYXJyYXlcbiAgICAvLyBwcm90b3R5cGUgbWV0aG9kXG4gICAgaWYgKCFtYXRjaGVzLmhhc093blByb3BlcnR5KGlkeCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIHZhciBsaW5rID0gbWF0Y2hlc1tpZHhdO1xuICAgIHZhciBsaW5rS2V5UHJlZml4TWF0Y2hlcyA9IGxpbmsubWF0Y2gobGlua0tleVByZWZpeE1hdGNoZXIpO1xuICAgIHZhciBsaW5rUHJlZml4ID0gbGlua0tleVByZWZpeE1hdGNoZXNbMF07XG4gICAgICB2YXIgZm9ybWF0dGVyTmFtZSA9IGxpbmtLZXlQcmVmaXhNYXRjaGVzWzFdO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBsZWFkaW5nIEA6LCBALmNhc2U6IGFuZCB0aGUgYnJhY2tldHNcbiAgICB2YXIgbGlua1BsYWNlaG9sZGVyID0gbGluay5yZXBsYWNlKGxpbmtQcmVmaXgsICcnKS5yZXBsYWNlKGJyYWNrZXRzTWF0Y2hlciwgJycpO1xuXG4gICAgaWYgKHZpc2l0ZWRMaW5rU3RhY2suaW5jbHVkZXMobGlua1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigoXCJDaXJjdWxhciByZWZlcmVuY2UgZm91bmQuIFxcXCJcIiArIGxpbmsgKyBcIlxcXCIgaXMgYWxyZWFkeSB2aXNpdGVkIGluIHRoZSBjaGFpbiBvZiBcIiArICh2aXNpdGVkTGlua1N0YWNrLnJldmVyc2UoKS5qb2luKCcgPC0gJykpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICAgIHZpc2l0ZWRMaW5rU3RhY2sucHVzaChsaW5rUGxhY2Vob2xkZXIpO1xuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBsaW5rXG4gICAgdmFyIHRyYW5zbGF0ZWQgPSB0aGlzLl9pbnRlcnBvbGF0ZShcbiAgICAgIGxvY2FsZSwgbWVzc2FnZSwgbGlua1BsYWNlaG9sZGVyLCBob3N0LFxuICAgICAgaW50ZXJwb2xhdGVNb2RlID09PSAncmF3JyA/ICdzdHJpbmcnIDogaW50ZXJwb2xhdGVNb2RlLFxuICAgICAgaW50ZXJwb2xhdGVNb2RlID09PSAncmF3JyA/IHVuZGVmaW5lZCA6IHZhbHVlcyxcbiAgICAgIHZpc2l0ZWRMaW5rU3RhY2tcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHRyYW5zbGF0ZWQpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4obGlua1BsYWNlaG9sZGVyKSkge1xuICAgICAgICB3YXJuKChcIkZhbGwgYmFjayB0byB0cmFuc2xhdGUgdGhlIGxpbmsgcGxhY2Vob2xkZXIgJ1wiICsgbGlua1BsYWNlaG9sZGVyICsgXCInIHdpdGggcm9vdCBsb2NhbGUuXCIpKTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgICAgdmFyIHJvb3QgPSB0aGlzLl9yb290LiRpMThuO1xuICAgICAgdHJhbnNsYXRlZCA9IHJvb3QuX3RyYW5zbGF0ZShcbiAgICAgICAgcm9vdC5fZ2V0TWVzc2FnZXMoKSwgcm9vdC5sb2NhbGUsIHJvb3QuZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGxpbmtQbGFjZWhvbGRlciwgaG9zdCwgaW50ZXJwb2xhdGVNb2RlLCB2YWx1ZXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRyYW5zbGF0ZWQgPSB0aGlzLl93YXJuRGVmYXVsdChcbiAgICAgIGxvY2FsZSwgbGlua1BsYWNlaG9sZGVyLCB0cmFuc2xhdGVkLCBob3N0LFxuICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW3ZhbHVlc11cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX21vZGlmaWVycy5oYXNPd25Qcm9wZXJ0eShmb3JtYXR0ZXJOYW1lKSkge1xuICAgICAgdHJhbnNsYXRlZCA9IHRoaXMuX21vZGlmaWVyc1tmb3JtYXR0ZXJOYW1lXSh0cmFuc2xhdGVkKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRNb2RpZmllcnMuaGFzT3duUHJvcGVydHkoZm9ybWF0dGVyTmFtZSkpIHtcbiAgICAgIHRyYW5zbGF0ZWQgPSBkZWZhdWx0TW9kaWZpZXJzW2Zvcm1hdHRlck5hbWVdKHRyYW5zbGF0ZWQpO1xuICAgIH1cblxuICAgIHZpc2l0ZWRMaW5rU3RhY2sucG9wKCk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBsaW5rIHdpdGggdGhlIHRyYW5zbGF0ZWRcbiAgICByZXQgPSAhdHJhbnNsYXRlZCA/IHJldCA6IHJldC5yZXBsYWNlKGxpbmssIHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHJldFxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uIF9yZW5kZXIgKG1lc3NhZ2UsIGludGVycG9sYXRlTW9kZSwgdmFsdWVzLCBwYXRoKSB7XG4gIHZhciByZXQgPSB0aGlzLl9mb3JtYXR0ZXIuaW50ZXJwb2xhdGUobWVzc2FnZSwgdmFsdWVzLCBwYXRoKTtcblxuICAvLyBJZiB0aGUgY3VzdG9tIGZvcm1hdHRlciByZWZ1c2VzIHRvIHdvcmsgLSBhcHBseSB0aGUgZGVmYXVsdCBvbmVcbiAgaWYgKCFyZXQpIHtcbiAgICByZXQgPSBkZWZhdWx0Rm9ybWF0dGVyLmludGVycG9sYXRlKG1lc3NhZ2UsIHZhbHVlcywgcGF0aCk7XG4gIH1cblxuICAvLyBpZiBpbnRlcnBvbGF0ZU1vZGUgaXMgKipub3QqKiAnc3RyaW5nJyAoJ3JvdycpLFxuICAvLyByZXR1cm4gdGhlIGNvbXBpbGVkIGRhdGEgKGUuZy4gWydmb28nLCBWTm9kZSwgJ2JhciddKSB3aXRoIGZvcm1hdHRlclxuICByZXR1cm4gaW50ZXJwb2xhdGVNb2RlID09PSAnc3RyaW5nJyA/IHJldC5qb2luKCcnKSA6IHJldFxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3RyYW5zbGF0ZSA9IGZ1bmN0aW9uIF90cmFuc2xhdGUgKFxuICBtZXNzYWdlcyxcbiAgbG9jYWxlLFxuICBmYWxsYmFjayxcbiAga2V5LFxuICBob3N0LFxuICBpbnRlcnBvbGF0ZU1vZGUsXG4gIGFyZ3Ncbikge1xuICB2YXIgcmVzID1cbiAgICB0aGlzLl9pbnRlcnBvbGF0ZShsb2NhbGUsIG1lc3NhZ2VzW2xvY2FsZV0sIGtleSwgaG9zdCwgaW50ZXJwb2xhdGVNb2RlLCBhcmdzLCBba2V5XSk7XG4gIGlmICghaXNOdWxsKHJlcykpIHsgcmV0dXJuIHJlcyB9XG5cbiAgcmVzID0gdGhpcy5faW50ZXJwb2xhdGUoZmFsbGJhY2ssIG1lc3NhZ2VzW2ZhbGxiYWNrXSwga2V5LCBob3N0LCBpbnRlcnBvbGF0ZU1vZGUsIGFyZ3MsIFtrZXldKTtcbiAgaWYgKCFpc051bGwocmVzKSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpICYmICF0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpKSB7XG4gICAgICB3YXJuKChcIkZhbGwgYmFjayB0byB0cmFuc2xhdGUgdGhlIGtleXBhdGggJ1wiICsga2V5ICsgXCInIHdpdGggJ1wiICsgZmFsbGJhY2sgKyBcIicgbG9jYWxlLlwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fdCA9IGZ1bmN0aW9uIF90IChrZXksIF9sb2NhbGUsIG1lc3NhZ2VzLCBob3N0KSB7XG4gICAgdmFyIHJlZjtcblxuICAgIHZhciB2YWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDQ7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSB2YWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyA0IF07XG4gIGlmICgha2V5KSB7IHJldHVybiAnJyB9XG5cbiAgdmFyIHBhcnNlZEFyZ3MgPSBwYXJzZUFyZ3MuYXBwbHkodm9pZCAwLCB2YWx1ZXMpO1xuICB2YXIgbG9jYWxlID0gcGFyc2VkQXJncy5sb2NhbGUgfHwgX2xvY2FsZTtcblxuICB2YXIgcmV0ID0gdGhpcy5fdHJhbnNsYXRlKFxuICAgIG1lc3NhZ2VzLCBsb2NhbGUsIHRoaXMuZmFsbGJhY2tMb2NhbGUsIGtleSxcbiAgICBob3N0LCAnc3RyaW5nJywgcGFyc2VkQXJncy5wYXJhbXNcbiAgKTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSAmJiAhdGhpcy5faXNTaWxlbnRGYWxsYmFja1dhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gdHJhbnNsYXRlIHRoZSBrZXlwYXRoICdcIiArIGtleSArIFwiJyB3aXRoIHJvb3QgbG9jYWxlLlwiKSk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy5fcm9vdCkgeyB0aHJvdyBFcnJvcigndW5leHBlY3RlZCBlcnJvcicpIH1cbiAgICByZXR1cm4gKHJlZiA9IHRoaXMuX3Jvb3QpLiR0LmFwcGx5KHJlZiwgWyBrZXkgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLl93YXJuRGVmYXVsdChsb2NhbGUsIGtleSwgcmV0LCBob3N0LCB2YWx1ZXMpXG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLnQgPSBmdW5jdGlvbiB0IChrZXkpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcbiAgcmV0dXJuIChyZWYgPSB0aGlzKS5fdC5hcHBseShyZWYsIFsga2V5LCB0aGlzLmxvY2FsZSwgdGhpcy5fZ2V0TWVzc2FnZXMoKSwgbnVsbCBdLmNvbmNhdCggdmFsdWVzICkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faSA9IGZ1bmN0aW9uIF9pIChrZXksIGxvY2FsZSwgbWVzc2FnZXMsIGhvc3QsIHZhbHVlcykge1xuICB2YXIgcmV0ID1cbiAgICB0aGlzLl90cmFuc2xhdGUobWVzc2FnZXMsIGxvY2FsZSwgdGhpcy5mYWxsYmFja0xvY2FsZSwga2V5LCBob3N0LCAncmF3JywgdmFsdWVzKTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gaW50ZXJwb2xhdGUgdGhlIGtleXBhdGggJ1wiICsga2V5ICsgXCInIHdpdGggcm9vdCBsb2NhbGUuXCIpKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLmkoa2V5LCBsb2NhbGUsIHZhbHVlcylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fd2FybkRlZmF1bHQobG9jYWxlLCBrZXksIHJldCwgaG9zdCwgW3ZhbHVlc10pXG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLmkgPSBmdW5jdGlvbiBpIChrZXksIGxvY2FsZSwgdmFsdWVzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWtleSkgeyByZXR1cm4gJycgfVxuXG4gIGlmICh0eXBlb2YgbG9jYWxlICE9PSAnc3RyaW5nJykge1xuICAgIGxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2koa2V5LCBsb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIG51bGwsIHZhbHVlcylcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl90YyA9IGZ1bmN0aW9uIF90YyAoXG4gIGtleSxcbiAgX2xvY2FsZSxcbiAgbWVzc2FnZXMsXG4gIGhvc3QsXG4gIGNob2ljZVxuKSB7XG4gICAgdmFyIHJlZjtcblxuICAgIHZhciB2YWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDU7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSB2YWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyA1IF07XG4gIGlmICgha2V5KSB7IHJldHVybiAnJyB9XG4gIGlmIChjaG9pY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIGNob2ljZSA9IDE7XG4gIH1cblxuICB2YXIgcHJlZGVmaW5lZCA9IHsgJ2NvdW50JzogY2hvaWNlLCAnbic6IGNob2ljZSB9O1xuICB2YXIgcGFyc2VkQXJncyA9IHBhcnNlQXJncy5hcHBseSh2b2lkIDAsIHZhbHVlcyk7XG4gIHBhcnNlZEFyZ3MucGFyYW1zID0gT2JqZWN0LmFzc2lnbihwcmVkZWZpbmVkLCBwYXJzZWRBcmdzLnBhcmFtcyk7XG4gIHZhbHVlcyA9IHBhcnNlZEFyZ3MubG9jYWxlID09PSBudWxsID8gW3BhcnNlZEFyZ3MucGFyYW1zXSA6IFtwYXJzZWRBcmdzLmxvY2FsZSwgcGFyc2VkQXJncy5wYXJhbXNdO1xuICByZXR1cm4gdGhpcy5mZXRjaENob2ljZSgocmVmID0gdGhpcykuX3QuYXBwbHkocmVmLCBbIGtleSwgX2xvY2FsZSwgbWVzc2FnZXMsIGhvc3QgXS5jb25jYXQoIHZhbHVlcyApKSwgY2hvaWNlKVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZmV0Y2hDaG9pY2UgPSBmdW5jdGlvbiBmZXRjaENob2ljZSAobWVzc2FnZSwgY2hvaWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIW1lc3NhZ2UgJiYgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7IHJldHVybiBudWxsIH1cbiAgdmFyIGNob2ljZXMgPSBtZXNzYWdlLnNwbGl0KCd8Jyk7XG5cbiAgY2hvaWNlID0gdGhpcy5nZXRDaG9pY2VJbmRleChjaG9pY2UsIGNob2ljZXMubGVuZ3RoKTtcbiAgaWYgKCFjaG9pY2VzW2Nob2ljZV0pIHsgcmV0dXJuIG1lc3NhZ2UgfVxuICByZXR1cm4gY2hvaWNlc1tjaG9pY2VdLnRyaW0oKVxufTtcblxuLyoqXG4gKiBAcGFyYW0gY2hvaWNlIHtudW1iZXJ9IGEgY2hvaWNlIGluZGV4IGdpdmVuIGJ5IHRoZSBpbnB1dCB0byAkdGM6IGAkdGMoJ3BhdGgudG8ucnVsZScsIGNob2ljZUluZGV4KWBcbiAqIEBwYXJhbSBjaG9pY2VzTGVuZ3RoIHtudW1iZXJ9IGFuIG92ZXJhbGwgYW1vdW50IG9mIGF2YWlsYWJsZSBjaG9pY2VzXG4gKiBAcmV0dXJucyBhIGZpbmFsIGNob2ljZSBpbmRleFxuKi9cblZ1ZUkxOG4ucHJvdG90eXBlLmdldENob2ljZUluZGV4ID0gZnVuY3Rpb24gZ2V0Q2hvaWNlSW5kZXggKGNob2ljZSwgY2hvaWNlc0xlbmd0aCkge1xuICAvLyBEZWZhdWx0IChvbGQpIGdldENob2ljZUluZGV4IGltcGxlbWVudGF0aW9uIC0gZW5nbGlzaC1jb21wYXRpYmxlXG4gIHZhciBkZWZhdWx0SW1wbCA9IGZ1bmN0aW9uIChfY2hvaWNlLCBfY2hvaWNlc0xlbmd0aCkge1xuICAgIF9jaG9pY2UgPSBNYXRoLmFicyhfY2hvaWNlKTtcblxuICAgIGlmIChfY2hvaWNlc0xlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIF9jaG9pY2VcbiAgICAgICAgPyBfY2hvaWNlID4gMVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMFxuICAgICAgICA6IDFcbiAgICB9XG5cbiAgICByZXR1cm4gX2Nob2ljZSA/IE1hdGgubWluKF9jaG9pY2UsIDIpIDogMFxuICB9O1xuXG4gIGlmICh0aGlzLmxvY2FsZSBpbiB0aGlzLnBsdXJhbGl6YXRpb25SdWxlcykge1xuICAgIHJldHVybiB0aGlzLnBsdXJhbGl6YXRpb25SdWxlc1t0aGlzLmxvY2FsZV0uYXBwbHkodGhpcywgW2Nob2ljZSwgY2hvaWNlc0xlbmd0aF0pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlZmF1bHRJbXBsKGNob2ljZSwgY2hvaWNlc0xlbmd0aClcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudGMgPSBmdW5jdGlvbiB0YyAoa2V5LCBjaG9pY2UpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDIgXTtcbiAgcmV0dXJuIChyZWYgPSB0aGlzKS5fdGMuYXBwbHkocmVmLCBbIGtleSwgdGhpcy5sb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIG51bGwsIGNob2ljZSBdLmNvbmNhdCggdmFsdWVzICkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fdGUgPSBmdW5jdGlvbiBfdGUgKGtleSwgbG9jYWxlLCBtZXNzYWdlcykge1xuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAzO1xuICAgIHdoaWxlICggbGVuLS0gPiAwICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDMgXTtcblxuICB2YXIgX2xvY2FsZSA9IHBhcnNlQXJncy5hcHBseSh2b2lkIDAsIGFyZ3MpLmxvY2FsZSB8fCBsb2NhbGU7XG4gIHJldHVybiB0aGlzLl9leGlzdChtZXNzYWdlc1tfbG9jYWxlXSwga2V5KVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudGUgPSBmdW5jdGlvbiB0ZSAoa2V5LCBsb2NhbGUpIHtcbiAgcmV0dXJuIHRoaXMuX3RlKGtleSwgdGhpcy5sb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIGxvY2FsZSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLmdldExvY2FsZU1lc3NhZ2UgPSBmdW5jdGlvbiBnZXRMb2NhbGVNZXNzYWdlIChsb2NhbGUpIHtcbiAgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fdm0ubWVzc2FnZXNbbG9jYWxlXSB8fCB7fSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLnNldExvY2FsZU1lc3NhZ2UgPSBmdW5jdGlvbiBzZXRMb2NhbGVNZXNzYWdlIChsb2NhbGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnd2FybicgfHwgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgPT09ICdlcnJvcicpIHtcbiAgICB0aGlzLl9jaGVja0xvY2FsZU1lc3NhZ2UobG9jYWxlLCB0aGlzLl93YXJuSHRtbEluTWVzc2FnZSwgbWVzc2FnZSk7XG4gICAgaWYgKHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7IHJldHVybiB9XG4gIH1cbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5tZXNzYWdlcywgbG9jYWxlLCBtZXNzYWdlKTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLm1lcmdlTG9jYWxlTWVzc2FnZSA9IGZ1bmN0aW9uIG1lcmdlTG9jYWxlTWVzc2FnZSAobG9jYWxlLCBtZXNzYWdlKSB7XG4gIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ3dhcm4nIHx8IHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7XG4gICAgdGhpcy5fY2hlY2tMb2NhbGVNZXNzYWdlKGxvY2FsZSwgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UsIG1lc3NhZ2UpO1xuICAgIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ2Vycm9yJykgeyByZXR1cm4gfVxuICB9XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0ubWVzc2FnZXMsIGxvY2FsZSwgbWVyZ2UodGhpcy5fdm0ubWVzc2FnZXNbbG9jYWxlXSB8fCB7fSwgbWVzc2FnZSkpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZ2V0RGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBnZXREYXRlVGltZUZvcm1hdCAobG9jYWxlKSB7XG4gIHJldHVybiBsb29zZUNsb25lKHRoaXMuX3ZtLmRhdGVUaW1lRm9ybWF0c1tsb2NhbGVdIHx8IHt9KVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuc2V0RGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBzZXREYXRlVGltZUZvcm1hdCAobG9jYWxlLCBmb3JtYXQpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5kYXRlVGltZUZvcm1hdHMsIGxvY2FsZSwgZm9ybWF0KTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLm1lcmdlRGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBtZXJnZURhdGVUaW1lRm9ybWF0IChsb2NhbGUsIGZvcm1hdCkge1xuICB0aGlzLl92bS4kc2V0KHRoaXMuX3ZtLmRhdGVUaW1lRm9ybWF0cywgbG9jYWxlLCBtZXJnZSh0aGlzLl92bS5kYXRlVGltZUZvcm1hdHNbbG9jYWxlXSB8fCB7fSwgZm9ybWF0KSk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fbG9jYWxpemVEYXRlVGltZSA9IGZ1bmN0aW9uIF9sb2NhbGl6ZURhdGVUaW1lIChcbiAgdmFsdWUsXG4gIGxvY2FsZSxcbiAgZmFsbGJhY2ssXG4gIGRhdGVUaW1lRm9ybWF0cyxcbiAga2V5XG4pIHtcbiAgdmFyIF9sb2NhbGUgPSBsb2NhbGU7XG4gIHZhciBmb3JtYXRzID0gZGF0ZVRpbWVGb3JtYXRzW19sb2NhbGVdO1xuXG4gIC8vIGZhbGxiYWNrIGxvY2FsZVxuICBpZiAoaXNOdWxsKGZvcm1hdHMpIHx8IGlzTnVsbChmb3JtYXRzW2tleV0pKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2tXYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvICdcIiArIGZhbGxiYWNrICsgXCInIGRhdGV0aW1lIGZvcm1hdHMgZnJvbSAnXCIgKyBsb2NhbGUgKyBcIicgZGF0ZXRpbWUgZm9ybWF0cy5cIikpO1xuICAgIH1cbiAgICBfbG9jYWxlID0gZmFsbGJhY2s7XG4gICAgZm9ybWF0cyA9IGRhdGVUaW1lRm9ybWF0c1tfbG9jYWxlXTtcbiAgfVxuXG4gIGlmIChpc051bGwoZm9ybWF0cykgfHwgaXNOdWxsKGZvcm1hdHNba2V5XSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2tleV07XG4gICAgdmFyIGlkID0gX2xvY2FsZSArIFwiX19cIiArIGtleTtcbiAgICB2YXIgZm9ybWF0dGVyID0gdGhpcy5fZGF0ZVRpbWVGb3JtYXR0ZXJzW2lkXTtcbiAgICBpZiAoIWZvcm1hdHRlcikge1xuICAgICAgZm9ybWF0dGVyID0gdGhpcy5fZGF0ZVRpbWVGb3JtYXR0ZXJzW2lkXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KF9sb2NhbGUsIGZvcm1hdCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlKVxuICB9XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fZCA9IGZ1bmN0aW9uIF9kICh2YWx1ZSwgbG9jYWxlLCBrZXkpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFWdWVJMThuLmF2YWlsYWJpbGl0aWVzLmRhdGVUaW1lRm9ybWF0KSB7XG4gICAgd2FybignQ2Fubm90IGZvcm1hdCBhIERhdGUgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5EYXRlVGltZUZvcm1hdC4nKTtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSkuZm9ybWF0KHZhbHVlKVxuICB9XG5cbiAgdmFyIHJldCA9XG4gICAgdGhpcy5fbG9jYWxpemVEYXRlVGltZSh2YWx1ZSwgbG9jYWxlLCB0aGlzLmZhbGxiYWNrTG9jYWxlLCB0aGlzLl9nZXREYXRlVGltZUZvcm1hdHMoKSwga2V5KTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSAmJiAhdGhpcy5faXNTaWxlbnRGYWxsYmFja1dhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gZGF0ZXRpbWUgbG9jYWxpemF0aW9uIG9mIHJvb3Q6IGtleSAnXCIgKyBrZXkgKyBcIicuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLmQodmFsdWUsIGtleSwgbG9jYWxlKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgJydcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZCA9IGZ1bmN0aW9uIGQgKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgdmFyIGtleSA9IG51bGw7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGFyZ3NbMF0pKSB7XG4gICAgICBpZiAoYXJnc1swXS5sb2NhbGUpIHtcbiAgICAgICAgbG9jYWxlID0gYXJnc1swXS5sb2NhbGU7XG4gICAgICB9XG4gICAgICBpZiAoYXJnc1swXS5rZXkpIHtcbiAgICAgICAga2V5ID0gYXJnc1swXS5rZXk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZCh2YWx1ZSwgbG9jYWxlLCBrZXkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5nZXROdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQgKGxvY2FsZSkge1xuICByZXR1cm4gbG9vc2VDbG9uZSh0aGlzLl92bS5udW1iZXJGb3JtYXRzW2xvY2FsZV0gfHwge30pXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5zZXROdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBzZXROdW1iZXJGb3JtYXQgKGxvY2FsZSwgZm9ybWF0KSB7XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0ubnVtYmVyRm9ybWF0cywgbG9jYWxlLCBmb3JtYXQpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUubWVyZ2VOdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBtZXJnZU51bWJlckZvcm1hdCAobG9jYWxlLCBmb3JtYXQpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5udW1iZXJGb3JtYXRzLCBsb2NhbGUsIG1lcmdlKHRoaXMuX3ZtLm51bWJlckZvcm1hdHNbbG9jYWxlXSB8fCB7fSwgZm9ybWF0KSk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fZ2V0TnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gX2dldE51bWJlckZvcm1hdHRlciAoXG4gIHZhbHVlLFxuICBsb2NhbGUsXG4gIGZhbGxiYWNrLFxuICBudW1iZXJGb3JtYXRzLFxuICBrZXksXG4gIG9wdGlvbnNcbikge1xuICB2YXIgX2xvY2FsZSA9IGxvY2FsZTtcbiAgdmFyIGZvcm1hdHMgPSBudW1iZXJGb3JtYXRzW19sb2NhbGVdO1xuXG4gIC8vIGZhbGxiYWNrIGxvY2FsZVxuICBpZiAoaXNOdWxsKGZvcm1hdHMpIHx8IGlzTnVsbChmb3JtYXRzW2tleV0pKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2tXYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvICdcIiArIGZhbGxiYWNrICsgXCInIG51bWJlciBmb3JtYXRzIGZyb20gJ1wiICsgbG9jYWxlICsgXCInIG51bWJlciBmb3JtYXRzLlwiKSk7XG4gICAgfVxuICAgIF9sb2NhbGUgPSBmYWxsYmFjaztcbiAgICBmb3JtYXRzID0gbnVtYmVyRm9ybWF0c1tfbG9jYWxlXTtcbiAgfVxuXG4gIGlmIChpc051bGwoZm9ybWF0cykgfHwgaXNOdWxsKGZvcm1hdHNba2V5XSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2tleV07XG5cbiAgICB2YXIgZm9ybWF0dGVyO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAvLyBJZiBvcHRpb25zIHNwZWNpZmllZCAtIGNyZWF0ZSBvbmUgdGltZSBudW1iZXIgZm9ybWF0dGVyXG4gICAgICBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoX2xvY2FsZSwgT2JqZWN0LmFzc2lnbih7fSwgZm9ybWF0LCBvcHRpb25zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpZCA9IF9sb2NhbGUgKyBcIl9fXCIgKyBrZXk7XG4gICAgICBmb3JtYXR0ZXIgPSB0aGlzLl9udW1iZXJGb3JtYXR0ZXJzW2lkXTtcbiAgICAgIGlmICghZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHRlciA9IHRoaXMuX251bWJlckZvcm1hdHRlcnNbaWRdID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KF9sb2NhbGUsIGZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXJcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX24gPSBmdW5jdGlvbiBfbiAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIVZ1ZUkxOG4uYXZhaWxhYmlsaXRpZXMubnVtYmVyRm9ybWF0KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oJ0Nhbm5vdCBmb3JtYXQgYSBOdW1iZXIgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5OdW1iZXJGb3JtYXQuJyk7XG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFrZXkpIHtcbiAgICB2YXIgbmYgPSAhb3B0aW9ucyA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUpIDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5mLmZvcm1hdCh2YWx1ZSlcbiAgfVxuXG4gIHZhciBmb3JtYXR0ZXIgPSB0aGlzLl9nZXROdW1iZXJGb3JtYXR0ZXIodmFsdWUsIGxvY2FsZSwgdGhpcy5mYWxsYmFja0xvY2FsZSwgdGhpcy5fZ2V0TnVtYmVyRm9ybWF0cygpLCBrZXksIG9wdGlvbnMpO1xuICB2YXIgcmV0ID0gZm9ybWF0dGVyICYmIGZvcm1hdHRlci5mb3JtYXQodmFsdWUpO1xuICBpZiAodGhpcy5faXNGYWxsYmFja1Jvb3QocmV0KSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpICYmICF0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpKSB7XG4gICAgICB3YXJuKChcIkZhbGwgYmFjayB0byBudW1iZXIgbG9jYWxpemF0aW9uIG9mIHJvb3Q6IGtleSAnXCIgKyBrZXkgKyBcIicuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLm4odmFsdWUsIE9iamVjdC5hc3NpZ24oe30sIHsga2V5OiBrZXksIGxvY2FsZTogbG9jYWxlIH0sIG9wdGlvbnMpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgJydcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUubiA9IGZ1bmN0aW9uIG4gKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciBvcHRpb25zID0gbnVsbDtcblxuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoYXJnc1swXSkpIHtcbiAgICAgIGlmIChhcmdzWzBdLmxvY2FsZSkge1xuICAgICAgICBsb2NhbGUgPSBhcmdzWzBdLmxvY2FsZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzWzBdLmtleSkge1xuICAgICAgICBrZXkgPSBhcmdzWzBdLmtleTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsdGVyIG91dCBudW1iZXIgZm9ybWF0IG9wdGlvbnMgb25seVxuICAgICAgb3B0aW9ucyA9IE9iamVjdC5rZXlzKGFyZ3NbMF0pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgIGlmIChudW1iZXJGb3JtYXRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYWNjLCAoIG9iaiA9IHt9LCBvYmpba2V5XSA9IGFyZ3NbMF1ba2V5XSwgb2JqICkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbih2YWx1ZSwgbG9jYWxlLCBrZXksIG9wdGlvbnMpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fbnRwID0gZnVuY3Rpb24gX250cCAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIVZ1ZUkxOG4uYXZhaWxhYmlsaXRpZXMubnVtYmVyRm9ybWF0KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oJ0Nhbm5vdCBmb3JtYXQgdG8gcGFydHMgYSBOdW1iZXIgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5OdW1iZXJGb3JtYXQuJyk7XG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgaWYgKCFrZXkpIHtcbiAgICB2YXIgbmYgPSAhb3B0aW9ucyA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUpIDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5mLmZvcm1hdFRvUGFydHModmFsdWUpXG4gIH1cblxuICB2YXIgZm9ybWF0dGVyID0gdGhpcy5fZ2V0TnVtYmVyRm9ybWF0dGVyKHZhbHVlLCBsb2NhbGUsIHRoaXMuZmFsbGJhY2tMb2NhbGUsIHRoaXMuX2dldE51bWJlckZvcm1hdHMoKSwga2V5LCBvcHRpb25zKTtcbiAgdmFyIHJldCA9IGZvcm1hdHRlciAmJiBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cyh2YWx1ZSk7XG4gIGlmICh0aGlzLl9pc0ZhbGxiYWNrUm9vdChyZXQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvIGZvcm1hdCBudW1iZXIgdG8gcGFydHMgb2Ygcm9vdDoga2V5ICdcIiArIGtleSArIFwiJyAuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLl9udHAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgW11cbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZ1ZUkxOG4ucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGF2YWlsYWJpbGl0aWVzO1xuLy8gJEZsb3dGaXhNZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZUkxOG4sICdhdmFpbGFiaWxpdGllcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIGlmICghYXZhaWxhYmlsaXRpZXMpIHtcbiAgICAgIHZhciBpbnRsRGVmaW5lZCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgICAgIGF2YWlsYWJpbGl0aWVzID0ge1xuICAgICAgICBkYXRlVGltZUZvcm1hdDogaW50bERlZmluZWQgJiYgdHlwZW9mIEludGwuRGF0ZVRpbWVGb3JtYXQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICBudW1iZXJGb3JtYXQ6IGludGxEZWZpbmVkICYmIHR5cGVvZiBJbnRsLk51bWJlckZvcm1hdCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGF2YWlsYWJpbGl0aWVzXG4gIH1cbn0pO1xuXG5WdWVJMThuLmluc3RhbGwgPSBpbnN0YWxsO1xuVnVlSTE4bi52ZXJzaW9uID0gJzguMTUuMCc7XG5cbmV4cG9ydCBkZWZhdWx0IFZ1ZUkxOG47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js\n");
/***/ }),
/***/ "./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js":
/*!***************************************************************************************!*\
!*** ./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js ***!
\***************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzPzY2OTEiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkgeyBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpIH1cbiAgICAgIDogaW5qZWN0U3R5bGVzXG4gIH1cblxuICBpZiAoaG9vaykge1xuICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHtcbiAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0XG4gICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyXG4gICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rXG4gICAgICAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\n");
/***/ }),
/***/ "./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js":
/*!**************************************************************************!*\
!*** ./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js ***!
\**************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/*!\n * vue-router v3.1.3\n * (c) 2019 Evan You\n * @license MIT\n */\n/* */\n\nfunction assert (condition, message) {\n if (!condition) {\n throw new Error((\"[vue-router] \" + message))\n }\n}\n\nfunction warn (condition, message) {\n if ( true && !condition) {\n typeof console !== 'undefined' && console.warn((\"[vue-router] \" + message));\n }\n}\n\nfunction isError (err) {\n return Object.prototype.toString.call(err).indexOf('Error') > -1\n}\n\nfunction isExtendedError (constructor, err) {\n return (\n err instanceof constructor ||\n // _name is to support IE9 too\n (err && (err.name === constructor.name || err._name === constructor._name))\n )\n}\n\nfunction extend (a, b) {\n for (var key in b) {\n a[key] = b[key];\n }\n return a\n}\n\nvar View = {\n name: 'RouterView',\n functional: true,\n props: {\n name: {\n type: String,\n default: 'default'\n }\n },\n render: function render (_, ref) {\n var props = ref.props;\n var children = ref.children;\n var parent = ref.parent;\n var data = ref.data;\n\n // used by devtools to display a router-view badge\n data.routerView = true;\n\n // directly use parent context's createElement() function\n // so that components rendered by router-view can resolve named slots\n var h = parent.$createElement;\n var name = props.name;\n var route = parent.$route;\n var cache = parent._routerViewCache || (parent._routerViewCache = {});\n\n // determine current view depth, also check to see if the tree\n // has been toggled inactive but kept-alive.\n var depth = 0;\n var inactive = false;\n while (parent && parent._routerRoot !== parent) {\n var vnodeData = parent.$vnode && parent.$vnode.data;\n if (vnodeData) {\n if (vnodeData.routerView) {\n depth++;\n }\n if (vnodeData.keepAlive && parent._inactive) {\n inactive = true;\n }\n }\n parent = parent.$parent;\n }\n data.routerViewDepth = depth;\n\n // render previous view if the tree is inactive and kept-alive\n if (inactive) {\n return h(cache[name], data, children)\n }\n\n var matched = route.matched[depth];\n // render empty node if no matched route\n if (!matched) {\n cache[name] = null;\n return h()\n }\n\n var component = cache[name] = matched.components[name];\n\n // attach instance registration hook\n // this will be called in the instance's injected lifecycle hooks\n data.registerRouteInstance = function (vm, val) {\n // val could be undefined for unregistration\n var current = matched.instances[name];\n if (\n (val && current !== vm) ||\n (!val && current === vm)\n ) {\n matched.instances[name] = val;\n }\n }\n\n // also register instance in prepatch hook\n // in case the same component instance is reused across different routes\n ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {\n matched.instances[name] = vnode.componentInstance;\n };\n\n // register instance in init hook\n // in case kept-alive component be actived when routes changed\n data.hook.init = function (vnode) {\n if (vnode.data.keepAlive &&\n vnode.componentInstance &&\n vnode.componentInstance !== matched.instances[name]\n ) {\n matched.instances[name] = vnode.componentInstance;\n }\n };\n\n // resolve props\n var propsToPass = data.props = resolveProps(route, matched.props && matched.props[name]);\n if (propsToPass) {\n // clone to prevent mutation\n propsToPass = data.props = extend({}, propsToPass);\n // pass non-declared props as attrs\n var attrs = data.attrs = data.attrs || {};\n for (var key in propsToPass) {\n if (!component.props || !(key in component.props)) {\n attrs[key] = propsToPass[key];\n delete propsToPass[key];\n }\n }\n }\n\n return h(component, data, children)\n }\n};\n\nfunction resolveProps (route, config) {\n switch (typeof config) {\n case 'undefined':\n return\n case 'object':\n return config\n case 'function':\n return config(route)\n case 'boolean':\n return config ? route.params : undefined\n default:\n if (true) {\n warn(\n false,\n \"props in \\\"\" + (route.path) + \"\\\" is a \" + (typeof config) + \", \" +\n \"expecting an object, function or boolean.\"\n );\n }\n }\n}\n\n/* */\n\nvar encodeReserveRE = /[!'()*]/g;\nvar encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };\nvar commaRE = /%2C/g;\n\n// fixed encodeURIComponent which is more conformant to RFC3986:\n// - escapes [!'()*]\n// - preserve commas\nvar encode = function (str) { return encodeURIComponent(str)\n .replace(encodeReserveRE, encodeReserveReplacer)\n .replace(commaRE, ','); };\n\nvar decode = decodeURIComponent;\n\nfunction resolveQuery (\n query,\n extraQuery,\n _parseQuery\n) {\n if ( extraQuery === void 0 ) extraQuery = {};\n\n var parse = _parseQuery || parseQuery;\n var parsedQuery;\n try {\n parsedQuery = parse(query || '');\n } catch (e) {\n true && warn(false, e.message);\n parsedQuery = {};\n }\n for (var key in extraQuery) {\n parsedQuery[key] = extraQuery[key];\n }\n return parsedQuery\n}\n\nfunction parseQuery (query) {\n var res = {};\n\n query = query.trim().replace(/^(\\?|#|&)/, '');\n\n if (!query) {\n return res\n }\n\n query.split('&').forEach(function (param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = decode(parts.shift());\n var val = parts.length > 0\n ? decode(parts.join('='))\n : null;\n\n if (res[key] === undefined) {\n res[key] = val;\n } else if (Array.isArray(res[key])) {\n res[key].push(val);\n } else {\n res[key] = [res[key], val];\n }\n });\n\n return res\n}\n\nfunction stringifyQuery (obj) {\n var res = obj ? Object.keys(obj).map(function (key) {\n var val = obj[key];\n\n if (val === undefined) {\n return ''\n }\n\n if (val === null) {\n return encode(key)\n }\n\n if (Array.isArray(val)) {\n var result = [];\n val.forEach(function (val2) {\n if (val2 === undefined) {\n return\n }\n if (val2 === null) {\n result.push(encode(key));\n } else {\n result.push(encode(key) + '=' + encode(val2));\n }\n });\n return result.join('&')\n }\n\n return encode(key) + '=' + encode(val)\n }).filter(function (x) { return x.length > 0; }).join('&') : null;\n return res ? (\"?\" + res) : ''\n}\n\n/* */\n\nvar trailingSlashRE = /\\/?$/;\n\nfunction createRoute (\n record,\n location,\n redirectedFrom,\n router\n) {\n var stringifyQuery = router && router.options.stringifyQuery;\n\n var query = location.query || {};\n try {\n query = clone(query);\n } catch (e) {}\n\n var route = {\n name: location.name || (record && record.name),\n meta: (record && record.meta) || {},\n path: location.path || '/',\n hash: location.hash || '',\n query: query,\n params: location.params || {},\n fullPath: getFullPath(location, stringifyQuery),\n matched: record ? formatMatch(record) : []\n };\n if (redirectedFrom) {\n route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);\n }\n return Object.freeze(route)\n}\n\nfunction clone (value) {\n if (Array.isArray(value)) {\n return value.map(clone)\n } else if (value && typeof value === 'object') {\n var res = {};\n for (var key in value) {\n res[key] = clone(value[key]);\n }\n return res\n } else {\n return value\n }\n}\n\n// the starting route that represents the initial state\nvar START = createRoute(null, {\n path: '/'\n});\n\nfunction formatMatch (record) {\n var res = [];\n while (record) {\n res.unshift(record);\n record = record.parent;\n }\n return res\n}\n\nfunction getFullPath (\n ref,\n _stringifyQuery\n) {\n var path = ref.path;\n var query = ref.query; if ( query === void 0 ) query = {};\n var hash = ref.hash; if ( hash === void 0 ) hash = '';\n\n var stringify = _stringifyQuery || stringifyQuery;\n return (path || '/') + stringify(query) + hash\n}\n\nfunction isSameRoute (a, b) {\n if (b === START) {\n return a === b\n } else if (!b) {\n return false\n } else if (a.path && b.path) {\n return (\n a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') &&\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query)\n )\n } else if (a.name && b.name) {\n return (\n a.name === b.name &&\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query) &&\n isObjectEqual(a.params, b.params)\n )\n } else {\n return false\n }\n}\n\nfunction isObjectEqual (a, b) {\n if ( a === void 0 ) a = {};\n if ( b === void 0 ) b = {};\n\n // handle null value #1566\n if (!a || !b) { return a === b }\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false\n }\n return aKeys.every(function (key) {\n var aVal = a[key];\n var bVal = b[key];\n // check nested equality\n if (typeof aVal === 'object' && typeof bVal === 'object') {\n return isObjectEqual(aVal, bVal)\n }\n return String(aVal) === String(bVal)\n })\n}\n\nfunction isIncludedRoute (current, target) {\n return (\n current.path.replace(trailingSlashRE, '/').indexOf(\n target.path.replace(trailingSlashRE, '/')\n ) === 0 &&\n (!target.hash || current.hash === target.hash) &&\n queryIncludes(current.query, target.query)\n )\n}\n\nfunction queryIncludes (current, target) {\n for (var key in target) {\n if (!(key in current)) {\n return false\n }\n }\n return true\n}\n\n/* */\n\nfunction resolvePath (\n relative,\n base,\n append\n) {\n var firstChar = relative.charAt(0);\n if (firstChar === '/') {\n return relative\n }\n\n if (firstChar === '?' || firstChar === '#') {\n return base + relative\n }\n\n var stack = base.split('/');\n\n // remove trailing segment if:\n // - not appending\n // - appending to trailing slash (last segment is empty)\n if (!append || !stack[stack.length - 1]) {\n stack.pop();\n }\n\n // resolve relative path\n var segments = relative.replace(/^\\//, '').split('/');\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n if (segment === '..') {\n stack.pop();\n } else if (segment !== '.') {\n stack.push(segment);\n }\n }\n\n // ensure leading slash\n if (stack[0] !== '') {\n stack.unshift('');\n }\n\n return stack.join('/')\n}\n\nfunction parsePath (path) {\n var hash = '';\n var query = '';\n\n var hashIndex = path.indexOf('#');\n if (hashIndex >= 0) {\n hash = path.slice(hashIndex);\n path = path.slice(0, hashIndex);\n }\n\n var queryIndex = path.indexOf('?');\n if (queryIndex >= 0) {\n query = path.slice(queryIndex + 1);\n path = path.slice(0, queryIndex);\n }\n\n return {\n path: path,\n query: query,\n hash: hash\n }\n}\n\nfunction cleanPath (path) {\n return path.replace(/\\/\\//g, '/')\n}\n\nvar isarray = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var defaultDelimiter = options && options.delimiter || '/';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length;\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1];\n continue\n }\n\n var next = str[index];\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var modifier = res[6];\n var asterisk = res[7];\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var partial = prefix != null && next != null && next !== prefix;\n var repeat = modifier === '+' || modifier === '*';\n var optional = modifier === '?' || modifier === '*';\n var delimiter = res[2] || defaultDelimiter;\n var pattern = capture || group;\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n });\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index);\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path);\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options))\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length);\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');\n }\n }\n\n return function (obj, opts) {\n var path = '';\n var data = obj || {};\n var options = opts || {};\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n path += token;\n\n continue\n }\n\n var value = data[token.name];\n var segment;\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix;\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j]);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment;\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys;\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {!Array} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g);\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n asterisk: false,\n pattern: null\n });\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = [];\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source);\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {!Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n var strict = options.strict;\n var end = options.end !== false;\n var route = '';\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n route += escapeString(token);\n } else {\n var prefix = escapeString(token.prefix);\n var capture = '(?:' + token.pattern + ')';\n\n keys.push(token);\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*';\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?';\n } else {\n capture = prefix + '(' + capture + ')?';\n }\n } else {\n capture = prefix + '(' + capture + ')';\n }\n\n route += capture;\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/');\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';\n }\n\n if (end) {\n route += '$';\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/* */\n\n// $flow-disable-line\nvar regexpCompileCache = Object.create(null);\n\nfunction fillParams (\n path,\n params,\n routeMsg\n) {\n params = params || {};\n try {\n var filler =\n regexpCompileCache[path] ||\n (regexpCompileCache[path] = pathToRegexp_1.compile(path));\n\n // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}\n if (params.pathMatch) { params[0] = params.pathMatch; }\n\n return filler(params, { pretty: true })\n } catch (e) {\n if (true) {\n warn(false, (\"missing param for \" + routeMsg + \": \" + (e.message)));\n }\n return ''\n } finally {\n // delete the 0 if it was added\n delete params[0];\n }\n}\n\n/* */\n\nfunction normalizeLocation (\n raw,\n current,\n append,\n router\n) {\n var next = typeof raw === 'string' ? { path: raw } : raw;\n // named target\n if (next._normalized) {\n return next\n } else if (next.name) {\n return extend({}, raw)\n }\n\n // relative params\n if (!next.path && next.params && current) {\n next = extend({}, next);\n next._normalized = true;\n var params = extend(extend({}, current.params), next.params);\n if (current.name) {\n next.name = current.name;\n next.params = params;\n } else if (current.matched.length) {\n var rawPath = current.matched[current.matched.length - 1].path;\n next.path = fillParams(rawPath, params, (\"path \" + (current.path)));\n } else if (true) {\n warn(false, \"relative params navigation requires a current route.\");\n }\n return next\n }\n\n var parsedPath = parsePath(next.path || '');\n var basePath = (current && current.path) || '/';\n var path = parsedPath.path\n ? resolvePath(parsedPath.path, basePath, append || next.append)\n : basePath;\n\n var query = resolveQuery(\n parsedPath.query,\n next.query,\n router && router.options.parseQuery\n );\n\n var hash = next.hash || parsedPath.hash;\n if (hash && hash.charAt(0) !== '#') {\n hash = \"#\" + hash;\n }\n\n return {\n _normalized: true,\n path: path,\n query: query,\n hash: hash\n }\n}\n\n/* */\n\n// work around weird flow bug\nvar toTypes = [String, Object];\nvar eventTypes = [String, Array];\n\nvar noop = function () {};\n\nvar Link = {\n name: 'RouterLink',\n props: {\n to: {\n type: toTypes,\n required: true\n },\n tag: {\n type: String,\n default: 'a'\n },\n exact: Boolean,\n append: Boolean,\n replace: Boolean,\n activeClass: String,\n exactActiveClass: String,\n event: {\n type: eventTypes,\n default: 'click'\n }\n },\n render: function render (h) {\n var this$1 = this;\n\n var router = this.$router;\n var current = this.$route;\n var ref = router.resolve(\n this.to,\n current,\n this.append\n );\n var location = ref.location;\n var route = ref.route;\n var href = ref.href;\n\n var classes = {};\n var globalActiveClass = router.options.linkActiveClass;\n var globalExactActiveClass = router.options.linkExactActiveClass;\n // Support global empty active class\n var activeClassFallback =\n globalActiveClass == null ? 'router-link-active' : globalActiveClass;\n var exactActiveClassFallback =\n globalExactActiveClass == null\n ? 'router-link-exact-active'\n : globalExactActiveClass;\n var activeClass =\n this.activeClass == null ? activeClassFallback : this.activeClass;\n var exactActiveClass =\n this.exactActiveClass == null\n ? exactActiveClassFallback\n : this.exactActiveClass;\n\n var compareTarget = route.redirectedFrom\n ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)\n : route;\n\n classes[exactActiveClass] = isSameRoute(current, compareTarget);\n classes[activeClass] = this.exact\n ? classes[exactActiveClass]\n : isIncludedRoute(current, compareTarget);\n\n var handler = function (e) {\n if (guardEvent(e)) {\n if (this$1.replace) {\n router.replace(location, noop);\n } else {\n router.push(location, noop);\n }\n }\n };\n\n var on = { click: guardEvent };\n if (Array.isArray(this.event)) {\n this.event.forEach(function (e) {\n on[e] = handler;\n });\n } else {\n on[this.event] = handler;\n }\n\n var data = { class: classes };\n\n var scopedSlot =\n !this.$scopedSlots.$hasNormal &&\n this.$scopedSlots.default &&\n this.$scopedSlots.default({\n href: href,\n route: route,\n navigate: handler,\n isActive: classes[activeClass],\n isExactActive: classes[exactActiveClass]\n });\n\n if (scopedSlot) {\n if (scopedSlot.length === 1) {\n return scopedSlot[0]\n } else if (scopedSlot.length > 1 || !scopedSlot.length) {\n if (true) {\n warn(\n false,\n (\"RouterLink with to=\\\"\" + (this.props.to) + \"\\\" is trying to use a scoped slot but it didn't provide exactly one child.\")\n );\n }\n return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)\n }\n }\n\n if (this.tag === 'a') {\n data.on = on;\n data.attrs = { href: href };\n } else {\n // find the first <a> child and apply listener and href\n var a = findAnchor(this.$slots.default);\n if (a) {\n // in case the <a> is a static node\n a.isStatic = false;\n var aData = (a.data = extend({}, a.data));\n aData.on = aData.on || {};\n // transform existing events in both objects into arrays so we can push later\n for (var event in aData.on) {\n var handler$1 = aData.on[event];\n if (event in on) {\n aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];\n }\n }\n // append new listeners for router-link\n for (var event$1 in on) {\n if (event$1 in aData.on) {\n // on[event] is always a function\n aData.on[event$1].push(on[event$1]);\n } else {\n aData.on[event$1] = handler;\n }\n }\n\n var aAttrs = (a.data.attrs = extend({}, a.data.attrs));\n aAttrs.href = href;\n } else {\n // doesn't have <a> child, apply listener to self\n data.on = on;\n }\n }\n\n return h(this.tag, data, this.$slots.default)\n }\n};\n\nfunction guardEvent (e) {\n // don't redirect with control keys\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }\n // don't redirect when preventDefault called\n if (e.defaultPrevented) { return }\n // don't redirect on right click\n if (e.button !== undefined && e.button !== 0) { return }\n // don't redirect if `target=\"_blank\"`\n if (e.currentTarget && e.currentTarget.getAttribute) {\n var target = e.currentTarget.getAttribute('target');\n if (/\\b_blank\\b/i.test(target)) { return }\n }\n // this may be a Weex event which doesn't have this method\n if (e.preventDefault) {\n e.preventDefault();\n }\n return true\n}\n\nfunction findAnchor (children) {\n if (children) {\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.tag === 'a') {\n return child\n }\n if (child.children && (child = findAnchor(child.children))) {\n return child\n }\n }\n }\n}\n\nvar _Vue;\n\nfunction install (Vue) {\n if (install.installed && _Vue === Vue) { return }\n install.installed = true;\n\n _Vue = Vue;\n\n var isDef = function (v) { return v !== undefined; };\n\n var registerInstance = function (vm, callVal) {\n var i = vm.$options._parentVnode;\n if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {\n i(vm, callVal);\n }\n };\n\n Vue.mixin({\n beforeCreate: function beforeCreate () {\n if (isDef(this.$options.router)) {\n this._routerRoot = this;\n this._router = this.$options.router;\n this._router.init(this);\n Vue.util.defineReactive(this, '_route', this._router.history.current);\n } else {\n this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;\n }\n registerInstance(this, this);\n },\n destroyed: function destroyed () {\n registerInstance(this);\n }\n });\n\n Object.defineProperty(Vue.prototype, '$router', {\n get: function get () { return this._routerRoot._router }\n });\n\n Object.defineProperty(Vue.prototype, '$route', {\n get: function get () { return this._routerRoot._route }\n });\n\n Vue.component('RouterView', View);\n Vue.component('RouterLink', Link);\n\n var strats = Vue.config.optionMergeStrategies;\n // use the same hook merging strategy for route hooks\n strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;\n}\n\n/* */\n\nvar inBrowser = typeof window !== 'undefined';\n\n/* */\n\nfunction createRouteMap (\n routes,\n oldPathList,\n oldPathMap,\n oldNameMap\n) {\n // the path list is used to control path matching priority\n var pathList = oldPathList || [];\n // $flow-disable-line\n var pathMap = oldPathMap || Object.create(null);\n // $flow-disable-line\n var nameMap = oldNameMap || Object.create(null);\n\n routes.forEach(function (route) {\n addRouteRecord(pathList, pathMap, nameMap, route);\n });\n\n // ensure wildcard routes are always at the end\n for (var i = 0, l = pathList.length; i < l; i++) {\n if (pathList[i] === '*') {\n pathList.push(pathList.splice(i, 1)[0]);\n l--;\n i--;\n }\n }\n\n if (false) { var pathNames, found; }\n\n return {\n pathList: pathList,\n pathMap: pathMap,\n nameMap: nameMap\n }\n}\n\nfunction addRouteRecord (\n pathList,\n pathMap,\n nameMap,\n route,\n parent,\n matchAs\n) {\n var path = route.path;\n var name = route.name;\n if (true) {\n assert(path != null, \"\\\"path\\\" is required in a route configuration.\");\n assert(\n typeof route.component !== 'string',\n \"route config \\\"component\\\" for path: \" + (String(\n path || name\n )) + \" cannot be a \" + \"string id. Use an actual component instead.\"\n );\n }\n\n var pathToRegexpOptions =\n route.pathToRegexpOptions || {};\n var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);\n\n if (typeof route.caseSensitive === 'boolean') {\n pathToRegexpOptions.sensitive = route.caseSensitive;\n }\n\n var record = {\n path: normalizedPath,\n regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),\n components: route.components || { default: route.component },\n instances: {},\n name: name,\n parent: parent,\n matchAs: matchAs,\n redirect: route.redirect,\n beforeEnter: route.beforeEnter,\n meta: route.meta || {},\n props:\n route.props == null\n ? {}\n : route.components\n ? route.props\n : { default: route.props }\n };\n\n if (route.children) {\n // Warn if route is named, does not redirect and has a default child route.\n // If users navigate to this route by name, the default child will\n // not be rendered (GH Issue #629)\n if (true) {\n if (\n route.name &&\n !route.redirect &&\n route.children.some(function (child) { return /^\\/?$/.test(child.path); })\n ) {\n warn(\n false,\n \"Named Route '\" + (route.name) + \"' has a default child route. \" +\n \"When navigating to this named route (:to=\\\"{name: '\" + (route.name) + \"'\\\"), \" +\n \"the default child route will not be rendered. Remove the name from \" +\n \"this route and use the name of the default child route for named \" +\n \"links instead.\"\n );\n }\n }\n route.children.forEach(function (child) {\n var childMatchAs = matchAs\n ? cleanPath((matchAs + \"/\" + (child.path)))\n : undefined;\n addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);\n });\n }\n\n if (!pathMap[record.path]) {\n pathList.push(record.path);\n pathMap[record.path] = record;\n }\n\n if (route.alias !== undefined) {\n var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];\n for (var i = 0; i < aliases.length; ++i) {\n var alias = aliases[i];\n if ( true && alias === path) {\n warn(\n false,\n (\"Found an alias with the same value as the path: \\\"\" + path + \"\\\". You have to remove that alias. It will be ignored in development.\")\n );\n // skip in dev to make it work\n continue\n }\n\n var aliasRoute = {\n path: alias,\n children: route.children\n };\n addRouteRecord(\n pathList,\n pathMap,\n nameMap,\n aliasRoute,\n parent,\n record.path || '/' // matchAs\n );\n }\n }\n\n if (name) {\n if (!nameMap[name]) {\n nameMap[name] = record;\n } else if ( true && !matchAs) {\n warn(\n false,\n \"Duplicate named routes definition: \" +\n \"{ name: \\\"\" + name + \"\\\", path: \\\"\" + (record.path) + \"\\\" }\"\n );\n }\n }\n}\n\nfunction compileRouteRegex (\n path,\n pathToRegexpOptions\n) {\n var regex = pathToRegexp_1(path, [], pathToRegexpOptions);\n if (true) {\n var keys = Object.create(null);\n regex.keys.forEach(function (key) {\n warn(\n !keys[key.name],\n (\"Duplicate param keys in route with path: \\\"\" + path + \"\\\"\")\n );\n keys[key.name] = true;\n });\n }\n return regex\n}\n\nfunction normalizePath (\n path,\n parent,\n strict\n) {\n if (!strict) { path = path.replace(/\\/$/, ''); }\n if (path[0] === '/') { return path }\n if (parent == null) { return path }\n return cleanPath(((parent.path) + \"/\" + path))\n}\n\n/* */\n\n\n\nfunction createMatcher (\n routes,\n router\n) {\n var ref = createRouteMap(routes);\n var pathList = ref.pathList;\n var pathMap = ref.pathMap;\n var nameMap = ref.nameMap;\n\n function addRoutes (routes) {\n createRouteMap(routes, pathList, pathMap, nameMap);\n }\n\n function match (\n raw,\n currentRoute,\n redirectedFrom\n ) {\n var location = normalizeLocation(raw, currentRoute, false, router);\n var name = location.name;\n\n if (name) {\n var record = nameMap[name];\n if (true) {\n warn(record, (\"Route with name '\" + name + \"' does not exist\"));\n }\n if (!record) { return _createRoute(null, location) }\n var paramNames = record.regex.keys\n .filter(function (key) { return !key.optional; })\n .map(function (key) { return key.name; });\n\n if (typeof location.params !== 'object') {\n location.params = {};\n }\n\n if (currentRoute && typeof currentRoute.params === 'object') {\n for (var key in currentRoute.params) {\n if (!(key in location.params) && paramNames.indexOf(key) > -1) {\n location.params[key] = currentRoute.params[key];\n }\n }\n }\n\n location.path = fillParams(record.path, location.params, (\"named route \\\"\" + name + \"\\\"\"));\n return _createRoute(record, location, redirectedFrom)\n } else if (location.path) {\n location.params = {};\n for (var i = 0; i < pathList.length; i++) {\n var path = pathList[i];\n var record$1 = pathMap[path];\n if (matchRoute(record$1.regex, location.path, location.params)) {\n return _createRoute(record$1, location, redirectedFrom)\n }\n }\n }\n // no match\n return _createRoute(null, location)\n }\n\n function redirect (\n record,\n location\n ) {\n var originalRedirect = record.redirect;\n var redirect = typeof originalRedirect === 'function'\n ? originalRedirect(createRoute(record, location, null, router))\n : originalRedirect;\n\n if (typeof redirect === 'string') {\n redirect = { path: redirect };\n }\n\n if (!redirect || typeof redirect !== 'object') {\n if (true) {\n warn(\n false, (\"invalid redirect option: \" + (JSON.stringify(redirect)))\n );\n }\n return _createRoute(null, location)\n }\n\n var re = redirect;\n var name = re.name;\n var path = re.path;\n var query = location.query;\n var hash = location.hash;\n var params = location.params;\n query = re.hasOwnProperty('query') ? re.query : query;\n hash = re.hasOwnProperty('hash') ? re.hash : hash;\n params = re.hasOwnProperty('params') ? re.params : params;\n\n if (name) {\n // resolved named direct\n var targetRecord = nameMap[name];\n if (true) {\n assert(targetRecord, (\"redirect failed: named route \\\"\" + name + \"\\\" not found.\"));\n }\n return match({\n _normalized: true,\n name: name,\n query: query,\n hash: hash,\n params: params\n }, undefined, location)\n } else if (path) {\n // 1. resolve relative redirect\n var rawPath = resolveRecordPath(path, record);\n // 2. resolve params\n var resolvedPath = fillParams(rawPath, params, (\"redirect route with path \\\"\" + rawPath + \"\\\"\"));\n // 3. rematch with existing query and hash\n return match({\n _normalized: true,\n path: resolvedPath,\n query: query,\n hash: hash\n }, undefined, location)\n } else {\n if (true) {\n warn(false, (\"invalid redirect option: \" + (JSON.stringify(redirect))));\n }\n return _createRoute(null, location)\n }\n }\n\n function alias (\n record,\n location,\n matchAs\n ) {\n var aliasedPath = fillParams(matchAs, location.params, (\"aliased route with path \\\"\" + matchAs + \"\\\"\"));\n var aliasedMatch = match({\n _normalized: true,\n path: aliasedPath\n });\n if (aliasedMatch) {\n var matched = aliasedMatch.matched;\n var aliasedRecord = matched[matched.length - 1];\n location.params = aliasedMatch.params;\n return _createRoute(aliasedRecord, location)\n }\n return _createRoute(null, location)\n }\n\n function _createRoute (\n record,\n location,\n redirectedFrom\n ) {\n if (record && record.redirect) {\n return redirect(record, redirectedFrom || location)\n }\n if (record && record.matchAs) {\n return alias(record, location, record.matchAs)\n }\n return createRoute(record, location, redirectedFrom, router)\n }\n\n return {\n match: match,\n addRoutes: addRoutes\n }\n}\n\nfunction matchRoute (\n regex,\n path,\n params\n) {\n var m = path.match(regex);\n\n if (!m) {\n return false\n } else if (!params) {\n return true\n }\n\n for (var i = 1, len = m.length; i < len; ++i) {\n var key = regex.keys[i - 1];\n var val = typeof m[i] === 'string' ? decodeURIComponent(m[i]) : m[i];\n if (key) {\n // Fix #1994: using * with props: true generates a param named 0\n params[key.name || 'pathMatch'] = val;\n }\n }\n\n return true\n}\n\nfunction resolveRecordPath (path, record) {\n return resolvePath(path, record.parent ? record.parent.path : '/', true)\n}\n\n/* */\n\n// use User Timing api (if present) for more accurate key precision\nvar Time =\n inBrowser && window.performance && window.performance.now\n ? window.performance\n : Date;\n\nfunction genStateKey () {\n return Time.now().toFixed(3)\n}\n\nvar _key = genStateKey();\n\nfunction getStateKey () {\n return _key\n}\n\nfunction setStateKey (key) {\n return (_key = key)\n}\n\n/* */\n\nvar positionStore = Object.create(null);\n\nfunction setupScroll () {\n // Fix for #1585 for Firefox\n // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678\n // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with\n // window.location.protocol + '//' + window.location.host\n // location.host contains the port and location.hostname doesn't\n var protocolAndPath = window.location.protocol + '//' + window.location.host;\n var absolutePath = window.location.href.replace(protocolAndPath, '');\n window.history.replaceState({ key: getStateKey() }, '', absolutePath);\n window.addEventListener('popstate', function (e) {\n saveScrollPosition();\n if (e.state && e.state.key) {\n setStateKey(e.state.key);\n }\n });\n}\n\nfunction handleScroll (\n router,\n to,\n from,\n isPop\n) {\n if (!router.app) {\n return\n }\n\n var behavior = router.options.scrollBehavior;\n if (!behavior) {\n return\n }\n\n if (true) {\n assert(typeof behavior === 'function', \"scrollBehavior must be a function\");\n }\n\n // wait until re-render finishes before scrolling\n router.app.$nextTick(function () {\n var position = getScrollPosition();\n var shouldScroll = behavior.call(\n router,\n to,\n from,\n isPop ? position : null\n );\n\n if (!shouldScroll) {\n return\n }\n\n if (typeof shouldScroll.then === 'function') {\n shouldScroll\n .then(function (shouldScroll) {\n scrollToPosition((shouldScroll), position);\n })\n .catch(function (err) {\n if (true) {\n assert(false, err.toString());\n }\n });\n } else {\n scrollToPosition(shouldScroll, position);\n }\n });\n}\n\nfunction saveScrollPosition () {\n var key = getStateKey();\n if (key) {\n positionStore[key] = {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n }\n}\n\nfunction getScrollPosition () {\n var key = getStateKey();\n if (key) {\n return positionStore[key]\n }\n}\n\nfunction getElementPosition (el, offset) {\n var docEl = document.documentElement;\n var docRect = docEl.getBoundingClientRect();\n var elRect = el.getBoundingClientRect();\n return {\n x: elRect.left - docRect.left - offset.x,\n y: elRect.top - docRect.top - offset.y\n }\n}\n\nfunction isValidPosition (obj) {\n return isNumber(obj.x) || isNumber(obj.y)\n}\n\nfunction normalizePosition (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : window.pageXOffset,\n y: isNumber(obj.y) ? obj.y : window.pageYOffset\n }\n}\n\nfunction normalizeOffset (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : 0,\n y: isNumber(obj.y) ? obj.y : 0\n }\n}\n\nfunction isNumber (v) {\n return typeof v === 'number'\n}\n\nvar hashStartsWithNumberRE = /^#\\d/;\n\nfunction scrollToPosition (shouldScroll, position) {\n var isObject = typeof shouldScroll === 'object';\n if (isObject && typeof shouldScroll.selector === 'string') {\n // getElementById would still fail if the selector contains a more complicated query like #main[data-attr]\n // but at the same time, it doesn't make much sense to select an element with an id and an extra selector\n var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line\n ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line\n : document.querySelector(shouldScroll.selector);\n\n if (el) {\n var offset =\n shouldScroll.offset && typeof shouldScroll.offset === 'object'\n ? shouldScroll.offset\n : {};\n offset = normalizeOffset(offset);\n position = getElementPosition(el, offset);\n } else if (isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n } else if (isObject && isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n\n if (position) {\n window.scrollTo(position.x, position.y);\n }\n}\n\n/* */\n\nvar supportsPushState =\n inBrowser &&\n (function () {\n var ua = window.navigator.userAgent;\n\n if (\n (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&\n ua.indexOf('Mobile Safari') !== -1 &&\n ua.indexOf('Chrome') === -1 &&\n ua.indexOf('Windows Phone') === -1\n ) {\n return false\n }\n\n return window.history && 'pushState' in window.history\n })();\n\nfunction pushState (url, replace) {\n saveScrollPosition();\n // try...catch the pushState call to get around Safari\n // DOM Exception 18 where it limits to 100 pushState calls\n var history = window.history;\n try {\n if (replace) {\n history.replaceState({ key: getStateKey() }, '', url);\n } else {\n history.pushState({ key: setStateKey(genStateKey()) }, '', url);\n }\n } catch (e) {\n window.location[replace ? 'replace' : 'assign'](url);\n }\n}\n\nfunction replaceState (url) {\n pushState(url, true);\n}\n\n/* */\n\nfunction runQueue (queue, fn, cb) {\n var step = function (index) {\n if (index >= queue.length) {\n cb();\n } else {\n if (queue[index]) {\n fn(queue[index], function () {\n step(index + 1);\n });\n } else {\n step(index + 1);\n }\n }\n };\n step(0);\n}\n\n/* */\n\nfunction resolveAsyncComponents (matched) {\n return function (to, from, next) {\n var hasAsync = false;\n var pending = 0;\n var error = null;\n\n flatMapComponents(matched, function (def, _, match, key) {\n // if it's a function and doesn't have cid attached,\n // assume it's an async component resolve function.\n // we are not using Vue's default async resolving mechanism because\n // we want to halt the navigation until the incoming component has been\n // resolved.\n if (typeof def === 'function' && def.cid === undefined) {\n hasAsync = true;\n pending++;\n\n var resolve = once(function (resolvedDef) {\n if (isESModule(resolvedDef)) {\n resolvedDef = resolvedDef.default;\n }\n // save resolved on async factory in case it's used elsewhere\n def.resolved = typeof resolvedDef === 'function'\n ? resolvedDef\n : _Vue.extend(resolvedDef);\n match.components[key] = resolvedDef;\n pending--;\n if (pending <= 0) {\n next();\n }\n });\n\n var reject = once(function (reason) {\n var msg = \"Failed to resolve async component \" + key + \": \" + reason;\n true && warn(false, msg);\n if (!error) {\n error = isError(reason)\n ? reason\n : new Error(msg);\n next(error);\n }\n });\n\n var res;\n try {\n res = def(resolve, reject);\n } catch (e) {\n reject(e);\n }\n if (res) {\n if (typeof res.then === 'function') {\n res.then(resolve, reject);\n } else {\n // new syntax in Vue 2.3\n var comp = res.component;\n if (comp && typeof comp.then === 'function') {\n comp.then(resolve, reject);\n }\n }\n }\n }\n });\n\n if (!hasAsync) { next(); }\n }\n}\n\nfunction flatMapComponents (\n matched,\n fn\n) {\n return flatten(matched.map(function (m) {\n return Object.keys(m.components).map(function (key) { return fn(\n m.components[key],\n m.instances[key],\n m, key\n ); })\n }))\n}\n\nfunction flatten (arr) {\n return Array.prototype.concat.apply([], arr)\n}\n\nvar hasSymbol =\n typeof Symbol === 'function' &&\n typeof Symbol.toStringTag === 'symbol';\n\nfunction isESModule (obj) {\n return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')\n}\n\n// in Webpack 2, require.ensure now also returns a Promise\n// so the resolve/reject functions may get called an extra time\n// if the user uses an arrow function shorthand that happens to\n// return that Promise.\nfunction once (fn) {\n var called = false;\n return function () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (called) { return }\n called = true;\n return fn.apply(this, args)\n }\n}\n\nvar NavigationDuplicated = /*@__PURE__*/(function (Error) {\n function NavigationDuplicated (normalizedLocation) {\n Error.call(this);\n this.name = this._name = 'NavigationDuplicated';\n // passing the message to super() doesn't seem to work in the transpiled version\n this.message = \"Navigating to current location (\\\"\" + (normalizedLocation.fullPath) + \"\\\") is not allowed\";\n // add a stack property so services like Sentry can correctly display it\n Object.defineProperty(this, 'stack', {\n value: new Error().stack,\n writable: true,\n configurable: true\n });\n // we could also have used\n // Error.captureStackTrace(this, this.constructor)\n // but it only exists on node and chrome\n }\n\n if ( Error ) NavigationDuplicated.__proto__ = Error;\n NavigationDuplicated.prototype = Object.create( Error && Error.prototype );\n NavigationDuplicated.prototype.constructor = NavigationDuplicated;\n\n return NavigationDuplicated;\n}(Error));\n\n// support IE9\nNavigationDuplicated._name = 'NavigationDuplicated';\n\n/* */\n\nvar History = function History (router, base) {\n this.router = router;\n this.base = normalizeBase(base);\n // start with a route object that stands for \"nowhere\"\n this.current = START;\n this.pending = null;\n this.ready = false;\n this.readyCbs = [];\n this.readyErrorCbs = [];\n this.errorCbs = [];\n};\n\nHistory.prototype.listen = function listen (cb) {\n this.cb = cb;\n};\n\nHistory.prototype.onReady = function onReady (cb, errorCb) {\n if (this.ready) {\n cb();\n } else {\n this.readyCbs.push(cb);\n if (errorCb) {\n this.readyErrorCbs.push(errorCb);\n }\n }\n};\n\nHistory.prototype.onError = function onError (errorCb) {\n this.errorCbs.push(errorCb);\n};\n\nHistory.prototype.transitionTo = function transitionTo (\n location,\n onComplete,\n onAbort\n) {\n var this$1 = this;\n\n var route = this.router.match(location, this.current);\n this.confirmTransition(\n route,\n function () {\n this$1.updateRoute(route);\n onComplete && onComplete(route);\n this$1.ensureURL();\n\n // fire ready cbs once\n if (!this$1.ready) {\n this$1.ready = true;\n this$1.readyCbs.forEach(function (cb) {\n cb(route);\n });\n }\n },\n function (err) {\n if (onAbort) {\n onAbort(err);\n }\n if (err && !this$1.ready) {\n this$1.ready = true;\n this$1.readyErrorCbs.forEach(function (cb) {\n cb(err);\n });\n }\n }\n );\n};\n\nHistory.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {\n var this$1 = this;\n\n var current = this.current;\n var abort = function (err) {\n // after merging https://github.com/vuejs/vue-router/pull/2771 we\n // When the user navigates through history through back/forward buttons\n // we do not want to throw the error. We only throw it if directly calling\n // push/replace. That's why it's not included in isError\n if (!isExtendedError(NavigationDuplicated, err) && isError(err)) {\n if (this$1.errorCbs.length) {\n this$1.errorCbs.forEach(function (cb) {\n cb(err);\n });\n } else {\n warn(false, 'uncaught error during route navigation:');\n console.error(err);\n }\n }\n onAbort && onAbort(err);\n };\n if (\n isSameRoute(route, current) &&\n // in the case the route map has been dynamically appended to\n route.matched.length === current.matched.length\n ) {\n this.ensureURL();\n return abort(new NavigationDuplicated(route))\n }\n\n var ref = resolveQueue(\n this.current.matched,\n route.matched\n );\n var updated = ref.updated;\n var deactivated = ref.deactivated;\n var activated = ref.activated;\n\n var queue = [].concat(\n // in-component leave guards\n extractLeaveGuards(deactivated),\n // global before hooks\n this.router.beforeHooks,\n // in-component update hooks\n extractUpdateHooks(updated),\n // in-config enter guards\n activated.map(function (m) { return m.beforeEnter; }),\n // async components\n resolveAsyncComponents(activated)\n );\n\n this.pending = route;\n var iterator = function (hook, next) {\n if (this$1.pending !== route) {\n return abort()\n }\n try {\n hook(route, current, function (to) {\n if (to === false || isError(to)) {\n // next(false) -> abort navigation, ensure current URL\n this$1.ensureURL(true);\n abort(to);\n } else if (\n typeof to === 'string' ||\n (typeof to === 'object' &&\n (typeof to.path === 'string' || typeof to.name === 'string'))\n ) {\n // next('/') or next({ path: '/' }) -> redirect\n abort();\n if (typeof to === 'object' && to.replace) {\n this$1.replace(to);\n } else {\n this$1.push(to);\n }\n } else {\n // confirm transition and pass on the value\n next(to);\n }\n });\n } catch (e) {\n abort(e);\n }\n };\n\n runQueue(queue, iterator, function () {\n var postEnterCbs = [];\n var isValid = function () { return this$1.current === route; };\n // wait until async components are resolved before\n // extracting in-component enter guards\n var enterGuards = extractEnterGuards(activated, postEnterCbs, isValid);\n var queue = enterGuards.concat(this$1.router.resolveHooks);\n runQueue(queue, iterator, function () {\n if (this$1.pending !== route) {\n return abort()\n }\n this$1.pending = null;\n onComplete(route);\n if (this$1.router.app) {\n this$1.router.app.$nextTick(function () {\n postEnterCbs.forEach(function (cb) {\n cb();\n });\n });\n }\n });\n });\n};\n\nHistory.prototype.updateRoute = function updateRoute (route) {\n var prev = this.current;\n this.current = route;\n this.cb && this.cb(route);\n this.router.afterHooks.forEach(function (hook) {\n hook && hook(route, prev);\n });\n};\n\nfunction normalizeBase (base) {\n if (!base) {\n if (inBrowser) {\n // respect <base> tag\n var baseEl = document.querySelector('base');\n base = (baseEl && baseEl.getAttribute('href')) || '/';\n // strip full URL origin\n base = base.replace(/^https?:\\/\\/[^\\/]+/, '');\n } else {\n base = '/';\n }\n }\n // make sure there's the starting slash\n if (base.charAt(0) !== '/') {\n base = '/' + base;\n }\n // remove trailing slash\n return base.replace(/\\/$/, '')\n}\n\nfunction resolveQueue (\n current,\n next\n) {\n var i;\n var max = Math.max(current.length, next.length);\n for (i = 0; i < max; i++) {\n if (current[i] !== next[i]) {\n break\n }\n }\n return {\n updated: next.slice(0, i),\n activated: next.slice(i),\n deactivated: current.slice(i)\n }\n}\n\nfunction extractGuards (\n records,\n name,\n bind,\n reverse\n) {\n var guards = flatMapComponents(records, function (def, instance, match, key) {\n var guard = extractGuard(def, name);\n if (guard) {\n return Array.isArray(guard)\n ? guard.map(function (guard) { return bind(guard, instance, match, key); })\n : bind(guard, instance, match, key)\n }\n });\n return flatten(reverse ? guards.reverse() : guards)\n}\n\nfunction extractGuard (\n def,\n key\n) {\n if (typeof def !== 'function') {\n // extend now so that global mixins are applied.\n def = _Vue.extend(def);\n }\n return def.options[key]\n}\n\nfunction extractLeaveGuards (deactivated) {\n return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)\n}\n\nfunction extractUpdateHooks (updated) {\n return extractGuards(updated, 'beforeRouteUpdate', bindGuard)\n}\n\nfunction bindGuard (guard, instance) {\n if (instance) {\n return function boundRouteGuard () {\n return guard.apply(instance, arguments)\n }\n }\n}\n\nfunction extractEnterGuards (\n activated,\n cbs,\n isValid\n) {\n return extractGuards(\n activated,\n 'beforeRouteEnter',\n function (guard, _, match, key) {\n return bindEnterGuard(guard, match, key, cbs, isValid)\n }\n )\n}\n\nfunction bindEnterGuard (\n guard,\n match,\n key,\n cbs,\n isValid\n) {\n return function routeEnterGuard (to, from, next) {\n return guard(to, from, function (cb) {\n if (typeof cb === 'function') {\n cbs.push(function () {\n // #750\n // if a router-view is wrapped with an out-in transition,\n // the instance may not have been registered at this time.\n // we will need to poll for registration until current route\n // is no longer valid.\n poll(cb, match.instances, key, isValid);\n });\n }\n next(cb);\n })\n }\n}\n\nfunction poll (\n cb, // somehow flow cannot infer this is a function\n instances,\n key,\n isValid\n) {\n if (\n instances[key] &&\n !instances[key]._isBeingDestroyed // do not reuse being destroyed instance\n ) {\n cb(instances[key]);\n } else if (isValid()) {\n setTimeout(function () {\n poll(cb, instances, key, isValid);\n }, 16);\n }\n}\n\n/* */\n\nvar HTML5History = /*@__PURE__*/(function (History) {\n function HTML5History (router, base) {\n var this$1 = this;\n\n History.call(this, router, base);\n\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n setupScroll();\n }\n\n var initLocation = getLocation(this.base);\n window.addEventListener('popstate', function (e) {\n var current = this$1.current;\n\n // Avoiding first `popstate` event dispatched in some browsers but first\n // history route not updated since async guard at the same time.\n var location = getLocation(this$1.base);\n if (this$1.current === START && location === initLocation) {\n return\n }\n\n this$1.transitionTo(location, function (route) {\n if (supportsScroll) {\n handleScroll(router, route, current, true);\n }\n });\n });\n }\n\n if ( History ) HTML5History.__proto__ = History;\n HTML5History.prototype = Object.create( History && History.prototype );\n HTML5History.prototype.constructor = HTML5History;\n\n HTML5History.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HTML5History.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n pushState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n replaceState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.ensureURL = function ensureURL (push) {\n if (getLocation(this.base) !== this.current.fullPath) {\n var current = cleanPath(this.base + this.current.fullPath);\n push ? pushState(current) : replaceState(current);\n }\n };\n\n HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {\n return getLocation(this.base)\n };\n\n return HTML5History;\n}(History));\n\nfunction getLocation (base) {\n var path = decodeURI(window.location.pathname);\n if (base && path.indexOf(base) === 0) {\n path = path.slice(base.length);\n }\n return (path || '/') + window.location.search + window.location.hash\n}\n\n/* */\n\nvar HashHistory = /*@__PURE__*/(function (History) {\n function HashHistory (router, base, fallback) {\n History.call(this, router, base);\n // check history fallback deeplinking\n if (fallback && checkFallback(this.base)) {\n return\n }\n ensureSlash();\n }\n\n if ( History ) HashHistory.__proto__ = History;\n HashHistory.prototype = Object.create( History && History.prototype );\n HashHistory.prototype.constructor = HashHistory;\n\n // this is delayed until the app mounts\n // to avoid the hashchange listener being fired too early\n HashHistory.prototype.setupListeners = function setupListeners () {\n var this$1 = this;\n\n var router = this.router;\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n setupScroll();\n }\n\n window.addEventListener(\n supportsPushState ? 'popstate' : 'hashchange',\n function () {\n var current = this$1.current;\n if (!ensureSlash()) {\n return\n }\n this$1.transitionTo(getHash(), function (route) {\n if (supportsScroll) {\n handleScroll(this$1.router, route, current, true);\n }\n if (!supportsPushState) {\n replaceHash(route.fullPath);\n }\n });\n }\n );\n };\n\n HashHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n pushHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n replaceHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HashHistory.prototype.ensureURL = function ensureURL (push) {\n var current = this.current.fullPath;\n if (getHash() !== current) {\n push ? pushHash(current) : replaceHash(current);\n }\n };\n\n HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n return getHash()\n };\n\n return HashHistory;\n}(History));\n\nfunction checkFallback (base) {\n var location = getLocation(base);\n if (!/^\\/#/.test(location)) {\n window.location.replace(cleanPath(base + '/#' + location));\n return true\n }\n}\n\nfunction ensureSlash () {\n var path = getHash();\n if (path.charAt(0) === '/') {\n return true\n }\n replaceHash('/' + path);\n return false\n}\n\nfunction getHash () {\n // We can't use window.location.hash here because it's not\n // consistent across browsers - Firefox will pre-decode it!\n var href = window.location.href;\n var index = href.indexOf('#');\n // empty path\n if (index < 0) { return '' }\n\n href = href.slice(index + 1);\n // decode the hash but not the search or hash\n // as search(query) is already decoded\n // https://github.com/vuejs/vue-router/issues/2708\n var searchIndex = href.indexOf('?');\n if (searchIndex < 0) {\n var hashIndex = href.indexOf('#');\n if (hashIndex > -1) {\n href = decodeURI(href.slice(0, hashIndex)) + href.slice(hashIndex);\n } else { href = decodeURI(href); }\n } else {\n if (searchIndex > -1) {\n href = decodeURI(href.slice(0, searchIndex)) + href.slice(searchIndex);\n }\n }\n\n return href\n}\n\nfunction getUrl (path) {\n var href = window.location.href;\n var i = href.indexOf('#');\n var base = i >= 0 ? href.slice(0, i) : href;\n return (base + \"#\" + path)\n}\n\nfunction pushHash (path) {\n if (supportsPushState) {\n pushState(getUrl(path));\n } else {\n window.location.hash = path;\n }\n}\n\nfunction replaceHash (path) {\n if (supportsPushState) {\n replaceState(getUrl(path));\n } else {\n window.location.replace(getUrl(path));\n }\n}\n\n/* */\n\nvar AbstractHistory = /*@__PURE__*/(function (History) {\n function AbstractHistory (router, base) {\n History.call(this, router, base);\n this.stack = [];\n this.index = -1;\n }\n\n if ( History ) AbstractHistory.__proto__ = History;\n AbstractHistory.prototype = Object.create( History && History.prototype );\n AbstractHistory.prototype.constructor = AbstractHistory;\n\n AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route);\n this$1.index++;\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index).concat(route);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.go = function go (n) {\n var this$1 = this;\n\n var targetIndex = this.index + n;\n if (targetIndex < 0 || targetIndex >= this.stack.length) {\n return\n }\n var route = this.stack[targetIndex];\n this.confirmTransition(\n route,\n function () {\n this$1.index = targetIndex;\n this$1.updateRoute(route);\n },\n function (err) {\n if (isExtendedError(NavigationDuplicated, err)) {\n this$1.index = targetIndex;\n }\n }\n );\n };\n\n AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n var current = this.stack[this.stack.length - 1];\n return current ? current.fullPath : '/'\n };\n\n AbstractHistory.prototype.ensureURL = function ensureURL () {\n // noop\n };\n\n return AbstractHistory;\n}(History));\n\n/* */\n\n\n\nvar VueRouter = function VueRouter (options) {\n if ( options === void 0 ) options = {};\n\n this.app = null;\n this.apps = [];\n this.options = options;\n this.beforeHooks = [];\n this.resolveHooks = [];\n this.afterHooks = [];\n this.matcher = createMatcher(options.routes || [], this);\n\n var mode = options.mode || 'hash';\n this.fallback = mode === 'history' && !supportsPushState && options.fallback !== false;\n if (this.fallback) {\n mode = 'hash';\n }\n if (!inBrowser) {\n mode = 'abstract';\n }\n this.mode = mode;\n\n switch (mode) {\n case 'history':\n this.history = new HTML5History(this, options.base);\n break\n case 'hash':\n this.history = new HashHistory(this, options.base, this.fallback);\n break\n case 'abstract':\n this.history = new AbstractHistory(this, options.base);\n break\n default:\n if (true) {\n assert(false, (\"invalid mode: \" + mode));\n }\n }\n};\n\nvar prototypeAccessors = { currentRoute: { configurable: true } };\n\nVueRouter.prototype.match = function match (\n raw,\n current,\n redirectedFrom\n) {\n return this.matcher.match(raw, current, redirectedFrom)\n};\n\nprototypeAccessors.currentRoute.get = function () {\n return this.history && this.history.current\n};\n\nVueRouter.prototype.init = function init (app /* Vue component instance */) {\n var this$1 = this;\n\n true && assert(\n install.installed,\n \"not installed. Make sure to call `Vue.use(VueRouter)` \" +\n \"before creating root instance.\"\n );\n\n this.apps.push(app);\n\n // set up app destroyed handler\n // https://github.com/vuejs/vue-router/issues/2639\n app.$once('hook:destroyed', function () {\n // clean out app from this.apps array once destroyed\n var index = this$1.apps.indexOf(app);\n if (index > -1) { this$1.apps.splice(index, 1); }\n // ensure we still have a main app or null if no apps\n // we do not release the router so it can be reused\n if (this$1.app === app) { this$1.app = this$1.apps[0] || null; }\n });\n\n // main app previously initialized\n // return as we don't need to set up new history listener\n if (this.app) {\n return\n }\n\n this.app = app;\n\n var history = this.history;\n\n if (history instanceof HTML5History) {\n history.transitionTo(history.getCurrentLocation());\n } else if (history instanceof HashHistory) {\n var setupHashListener = function () {\n history.setupListeners();\n };\n history.transitionTo(\n history.getCurrentLocation(),\n setupHashListener,\n setupHashListener\n );\n }\n\n history.listen(function (route) {\n this$1.apps.forEach(function (app) {\n app._route = route;\n });\n });\n};\n\nVueRouter.prototype.beforeEach = function beforeEach (fn) {\n return registerHook(this.beforeHooks, fn)\n};\n\nVueRouter.prototype.beforeResolve = function beforeResolve (fn) {\n return registerHook(this.resolveHooks, fn)\n};\n\nVueRouter.prototype.afterEach = function afterEach (fn) {\n return registerHook(this.afterHooks, fn)\n};\n\nVueRouter.prototype.onReady = function onReady (cb, errorCb) {\n this.history.onReady(cb, errorCb);\n};\n\nVueRouter.prototype.onError = function onError (errorCb) {\n this.history.onError(errorCb);\n};\n\nVueRouter.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.push(location, resolve, reject);\n })\n } else {\n this.history.push(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.replace(location, resolve, reject);\n })\n } else {\n this.history.replace(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.go = function go (n) {\n this.history.go(n);\n};\n\nVueRouter.prototype.back = function back () {\n this.go(-1);\n};\n\nVueRouter.prototype.forward = function forward () {\n this.go(1);\n};\n\nVueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {\n var route = to\n ? to.matched\n ? to\n : this.resolve(to).route\n : this.currentRoute;\n if (!route) {\n return []\n }\n return [].concat.apply([], route.matched.map(function (m) {\n return Object.keys(m.components).map(function (key) {\n return m.components[key]\n })\n }))\n};\n\nVueRouter.prototype.resolve = function resolve (\n to,\n current,\n append\n) {\n current = current || this.history.current;\n var location = normalizeLocation(\n to,\n current,\n append,\n this\n );\n var route = this.match(location, current);\n var fullPath = route.redirectedFrom || route.fullPath;\n var base = this.history.base;\n var href = createHref(base, fullPath, this.mode);\n return {\n location: location,\n route: route,\n href: href,\n // for backwards compat\n normalizedTo: location,\n resolved: route\n }\n};\n\nVueRouter.prototype.addRoutes = function addRoutes (routes) {\n this.matcher.addRoutes(routes);\n if (this.history.current !== START) {\n this.history.transitionTo(this.history.getCurrentLocation());\n }\n};\n\nObject.defineProperties( VueRouter.prototype, prototypeAccessors );\n\nfunction registerHook (list, fn) {\n list.push(fn);\n return function () {\n var i = list.indexOf(fn);\n if (i > -1) { list.splice(i, 1); }\n }\n}\n\nfunction createHref (base, fullPath, mode) {\n var path = mode === 'hash' ? '#' + fullPath : fullPath;\n return base ? cleanPath(base + '/' + path) : path\n}\n\nVueRouter.install = install;\nVueRouter.version = '3.1.3';\n\nif (inBrowser && window.Vue) {\n window.Vue.use(VueRouter);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (VueRouter);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1yb3V0ZXJAMy4xLjNAdnVlLXJvdXRlci9kaXN0L3Z1ZS1yb3V0ZXIuZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtcm91dGVyQDMuMS4zQHZ1ZS1yb3V0ZXIvZGlzdC92dWUtcm91dGVyLmVzbS5qcz9jNDc4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICAqIHZ1ZS1yb3V0ZXIgdjMuMS4zXG4gICogKGMpIDIwMTkgRXZhbiBZb3VcbiAgKiBAbGljZW5zZSBNSVRcbiAgKi9cbi8qICAqL1xuXG5mdW5jdGlvbiBhc3NlcnQgKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcigoXCJbdnVlLXJvdXRlcl0gXCIgKyBtZXNzYWdlKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuIChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbmRpdGlvbikge1xuICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4oKFwiW3Z1ZS1yb3V0ZXJdIFwiICsgbWVzc2FnZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IgKGVycikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycikuaW5kZXhPZignRXJyb3InKSA+IC0xXG59XG5cbmZ1bmN0aW9uIGlzRXh0ZW5kZWRFcnJvciAoY29uc3RydWN0b3IsIGVycikge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yIHx8XG4gICAgLy8gX25hbWUgaXMgdG8gc3VwcG9ydCBJRTkgdG9vXG4gICAgKGVyciAmJiAoZXJyLm5hbWUgPT09IGNvbnN0cnVjdG9yLm5hbWUgfHwgZXJyLl9uYW1lID09PSBjb25zdHJ1Y3Rvci5fbmFtZSkpXG4gIClcbn1cblxuZnVuY3Rpb24gZXh0ZW5kIChhLCBiKSB7XG4gIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgYVtrZXldID0gYltrZXldO1xuICB9XG4gIHJldHVybiBhXG59XG5cbnZhciBWaWV3ID0ge1xuICBuYW1lOiAnUm91dGVyVmlldycsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RlZmF1bHQnXG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoXywgcmVmKSB7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBjaGlsZHJlbiA9IHJlZi5jaGlsZHJlbjtcbiAgICB2YXIgcGFyZW50ID0gcmVmLnBhcmVudDtcbiAgICB2YXIgZGF0YSA9IHJlZi5kYXRhO1xuXG4gICAgLy8gdXNlZCBieSBkZXZ0b29scyB0byBkaXNwbGF5IGEgcm91dGVyLXZpZXcgYmFkZ2VcbiAgICBkYXRhLnJvdXRlclZpZXcgPSB0cnVlO1xuXG4gICAgLy8gZGlyZWN0bHkgdXNlIHBhcmVudCBjb250ZXh0J3MgY3JlYXRlRWxlbWVudCgpIGZ1bmN0aW9uXG4gICAgLy8gc28gdGhhdCBjb21wb25lbnRzIHJlbmRlcmVkIGJ5IHJvdXRlci12aWV3IGNhbiByZXNvbHZlIG5hbWVkIHNsb3RzXG4gICAgdmFyIGggPSBwYXJlbnQuJGNyZWF0ZUVsZW1lbnQ7XG4gICAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHZhciByb3V0ZSA9IHBhcmVudC4kcm91dGU7XG4gICAgdmFyIGNhY2hlID0gcGFyZW50Ll9yb3V0ZXJWaWV3Q2FjaGUgfHwgKHBhcmVudC5fcm91dGVyVmlld0NhY2hlID0ge30pO1xuXG4gICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdmlldyBkZXB0aCwgYWxzbyBjaGVjayB0byBzZWUgaWYgdGhlIHRyZWVcbiAgICAvLyBoYXMgYmVlbiB0b2dnbGVkIGluYWN0aXZlIGJ1dCBrZXB0LWFsaXZlLlxuICAgIHZhciBkZXB0aCA9IDA7XG4gICAgdmFyIGluYWN0aXZlID0gZmFsc2U7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX3JvdXRlclJvb3QgIT09IHBhcmVudCkge1xuICAgICAgdmFyIHZub2RlRGF0YSA9IHBhcmVudC4kdm5vZGUgJiYgcGFyZW50LiR2bm9kZS5kYXRhO1xuICAgICAgaWYgKHZub2RlRGF0YSkge1xuICAgICAgICBpZiAodm5vZGVEYXRhLnJvdXRlclZpZXcpIHtcbiAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZURhdGEua2VlcEFsaXZlICYmIHBhcmVudC5faW5hY3RpdmUpIHtcbiAgICAgICAgICBpbmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgIH1cbiAgICBkYXRhLnJvdXRlclZpZXdEZXB0aCA9IGRlcHRoO1xuXG4gICAgLy8gcmVuZGVyIHByZXZpb3VzIHZpZXcgaWYgdGhlIHRyZWUgaXMgaW5hY3RpdmUgYW5kIGtlcHQtYWxpdmVcbiAgICBpZiAoaW5hY3RpdmUpIHtcbiAgICAgIHJldHVybiBoKGNhY2hlW25hbWVdLCBkYXRhLCBjaGlsZHJlbilcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2hlZCA9IHJvdXRlLm1hdGNoZWRbZGVwdGhdO1xuICAgIC8vIHJlbmRlciBlbXB0eSBub2RlIGlmIG5vIG1hdGNoZWQgcm91dGVcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNhY2hlW25hbWVdID0gbnVsbDtcbiAgICAgIHJldHVybiBoKClcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50ID0gY2FjaGVbbmFtZV0gPSBtYXRjaGVkLmNvbXBvbmVudHNbbmFtZV07XG5cbiAgICAvLyBhdHRhY2ggaW5zdGFuY2UgcmVnaXN0cmF0aW9uIGhvb2tcbiAgICAvLyB0aGlzIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBpbnN0YW5jZSdzIGluamVjdGVkIGxpZmVjeWNsZSBob29rc1xuICAgIGRhdGEucmVnaXN0ZXJSb3V0ZUluc3RhbmNlID0gZnVuY3Rpb24gKHZtLCB2YWwpIHtcbiAgICAgIC8vIHZhbCBjb3VsZCBiZSB1bmRlZmluZWQgZm9yIHVucmVnaXN0cmF0aW9uXG4gICAgICB2YXIgY3VycmVudCA9IG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdO1xuICAgICAgaWYgKFxuICAgICAgICAodmFsICYmIGN1cnJlbnQgIT09IHZtKSB8fFxuICAgICAgICAoIXZhbCAmJiBjdXJyZW50ID09PSB2bSlcbiAgICAgICkge1xuICAgICAgICBtYXRjaGVkLmluc3RhbmNlc1tuYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbHNvIHJlZ2lzdGVyIGluc3RhbmNlIGluIHByZXBhdGNoIGhvb2tcbiAgICAvLyBpbiBjYXNlIHRoZSBzYW1lIGNvbXBvbmVudCBpbnN0YW5jZSBpcyByZXVzZWQgYWNyb3NzIGRpZmZlcmVudCByb3V0ZXNcbiAgICA7KGRhdGEuaG9vayB8fCAoZGF0YS5ob29rID0ge30pKS5wcmVwYXRjaCA9IGZ1bmN0aW9uIChfLCB2bm9kZSkge1xuICAgICAgbWF0Y2hlZC5pbnN0YW5jZXNbbmFtZV0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB9O1xuXG4gICAgLy8gcmVnaXN0ZXIgaW5zdGFuY2UgaW4gaW5pdCBob29rXG4gICAgLy8gaW4gY2FzZSBrZXB0LWFsaXZlIGNvbXBvbmVudCBiZSBhY3RpdmVkIHdoZW4gcm91dGVzIGNoYW5nZWRcbiAgICBkYXRhLmhvb2suaW5pdCA9IGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlICYmXG4gICAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmXG4gICAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICE9PSBtYXRjaGVkLmluc3RhbmNlc1tuYW1lXVxuICAgICAgKSB7XG4gICAgICAgIG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHJlc29sdmUgcHJvcHNcbiAgICB2YXIgcHJvcHNUb1Bhc3MgPSBkYXRhLnByb3BzID0gcmVzb2x2ZVByb3BzKHJvdXRlLCBtYXRjaGVkLnByb3BzICYmIG1hdGNoZWQucHJvcHNbbmFtZV0pO1xuICAgIGlmIChwcm9wc1RvUGFzcykge1xuICAgICAgLy8gY2xvbmUgdG8gcHJldmVudCBtdXRhdGlvblxuICAgICAgcHJvcHNUb1Bhc3MgPSBkYXRhLnByb3BzID0gZXh0ZW5kKHt9LCBwcm9wc1RvUGFzcyk7XG4gICAgICAvLyBwYXNzIG5vbi1kZWNsYXJlZCBwcm9wcyBhcyBhdHRyc1xuICAgICAgdmFyIGF0dHJzID0gZGF0YS5hdHRycyA9IGRhdGEuYXR0cnMgfHwge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHNUb1Bhc3MpIHtcbiAgICAgICAgaWYgKCFjb21wb25lbnQucHJvcHMgfHwgIShrZXkgaW4gY29tcG9uZW50LnByb3BzKSkge1xuICAgICAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1RvUGFzc1trZXldO1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1RvUGFzc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGgoY29tcG9uZW50LCBkYXRhLCBjaGlsZHJlbilcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVzb2x2ZVByb3BzIChyb3V0ZSwgY29uZmlnKSB7XG4gIHN3aXRjaCAodHlwZW9mIGNvbmZpZykge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIGNvbmZpZ1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjb25maWcocm91dGUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gY29uZmlnID8gcm91dGUucGFyYW1zIDogdW5kZWZpbmVkXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJwcm9wcyBpbiBcXFwiXCIgKyAocm91dGUucGF0aCkgKyBcIlxcXCIgaXMgYSBcIiArICh0eXBlb2YgY29uZmlnKSArIFwiLCBcIiArXG4gICAgICAgICAgXCJleHBlY3RpbmcgYW4gb2JqZWN0LCBmdW5jdGlvbiBvciBib29sZWFuLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBlbmNvZGVSZXNlcnZlUkUgPSAvWyEnKCkqXS9nO1xudmFyIGVuY29kZVJlc2VydmVSZXBsYWNlciA9IGZ1bmN0aW9uIChjKSB7IHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpOyB9O1xudmFyIGNvbW1hUkUgPSAvJTJDL2c7XG5cbi8vIGZpeGVkIGVuY29kZVVSSUNvbXBvbmVudCB3aGljaCBpcyBtb3JlIGNvbmZvcm1hbnQgdG8gUkZDMzk4Njpcbi8vIC0gZXNjYXBlcyBbIScoKSpdXG4vLyAtIHByZXNlcnZlIGNvbW1hc1xudmFyIGVuY29kZSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpXG4gIC5yZXBsYWNlKGVuY29kZVJlc2VydmVSRSwgZW5jb2RlUmVzZXJ2ZVJlcGxhY2VyKVxuICAucmVwbGFjZShjb21tYVJFLCAnLCcpOyB9O1xuXG52YXIgZGVjb2RlID0gZGVjb2RlVVJJQ29tcG9uZW50O1xuXG5mdW5jdGlvbiByZXNvbHZlUXVlcnkgKFxuICBxdWVyeSxcbiAgZXh0cmFRdWVyeSxcbiAgX3BhcnNlUXVlcnlcbikge1xuICBpZiAoIGV4dHJhUXVlcnkgPT09IHZvaWQgMCApIGV4dHJhUXVlcnkgPSB7fTtcblxuICB2YXIgcGFyc2UgPSBfcGFyc2VRdWVyeSB8fCBwYXJzZVF1ZXJ5O1xuICB2YXIgcGFyc2VkUXVlcnk7XG4gIHRyeSB7XG4gICAgcGFyc2VkUXVlcnkgPSBwYXJzZShxdWVyeSB8fCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oZmFsc2UsIGUubWVzc2FnZSk7XG4gICAgcGFyc2VkUXVlcnkgPSB7fTtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gZXh0cmFRdWVyeSkge1xuICAgIHBhcnNlZFF1ZXJ5W2tleV0gPSBleHRyYVF1ZXJ5W2tleV07XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFF1ZXJ5XG59XG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkgKHF1ZXJ5KSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjfCYpLywgJycpO1xuXG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICBxdWVyeS5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgdmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcbiAgICB2YXIga2V5ID0gZGVjb2RlKHBhcnRzLnNoaWZ0KCkpO1xuICAgIHZhciB2YWwgPSBwYXJ0cy5sZW5ndGggPiAwXG4gICAgICA/IGRlY29kZShwYXJ0cy5qb2luKCc9JykpXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAocmVzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzW2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc1trZXldKSkge1xuICAgICAgcmVzW2tleV0ucHVzaCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNba2V5XSA9IFtyZXNba2V5XSwgdmFsXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5UXVlcnkgKG9iaikge1xuICB2YXIgcmVzID0gb2JqID8gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSBvYmpba2V5XTtcblxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZShrZXkpXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbDIpIHtcbiAgICAgICAgaWYgKHZhbDIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlKGtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHZhbDIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyYnKVxuICAgIH1cblxuICAgIHJldHVybiBlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2YWwpXG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9KS5qb2luKCcmJykgOiBudWxsO1xuICByZXR1cm4gcmVzID8gKFwiP1wiICsgcmVzKSA6ICcnXG59XG5cbi8qICAqL1xuXG52YXIgdHJhaWxpbmdTbGFzaFJFID0gL1xcLz8kLztcblxuZnVuY3Rpb24gY3JlYXRlUm91dGUgKFxuICByZWNvcmQsXG4gIGxvY2F0aW9uLFxuICByZWRpcmVjdGVkRnJvbSxcbiAgcm91dGVyXG4pIHtcbiAgdmFyIHN0cmluZ2lmeVF1ZXJ5ID0gcm91dGVyICYmIHJvdXRlci5vcHRpb25zLnN0cmluZ2lmeVF1ZXJ5O1xuXG4gIHZhciBxdWVyeSA9IGxvY2F0aW9uLnF1ZXJ5IHx8IHt9O1xuICB0cnkge1xuICAgIHF1ZXJ5ID0gY2xvbmUocXVlcnkpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByb3V0ZSA9IHtcbiAgICBuYW1lOiBsb2NhdGlvbi5uYW1lIHx8IChyZWNvcmQgJiYgcmVjb3JkLm5hbWUpLFxuICAgIG1ldGE6IChyZWNvcmQgJiYgcmVjb3JkLm1ldGEpIHx8IHt9LFxuICAgIHBhdGg6IGxvY2F0aW9uLnBhdGggfHwgJy8nLFxuICAgIGhhc2g6IGxvY2F0aW9uLmhhc2ggfHwgJycsXG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIHBhcmFtczogbG9jYXRpb24ucGFyYW1zIHx8IHt9LFxuICAgIGZ1bGxQYXRoOiBnZXRGdWxsUGF0aChsb2NhdGlvbiwgc3RyaW5naWZ5UXVlcnkpLFxuICAgIG1hdGNoZWQ6IHJlY29yZCA/IGZvcm1hdE1hdGNoKHJlY29yZCkgOiBbXVxuICB9O1xuICBpZiAocmVkaXJlY3RlZEZyb20pIHtcbiAgICByb3V0ZS5yZWRpcmVjdGVkRnJvbSA9IGdldEZ1bGxQYXRoKHJlZGlyZWN0ZWRGcm9tLCBzdHJpbmdpZnlRdWVyeSk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUocm91dGUpXG59XG5cbmZ1bmN0aW9uIGNsb25lICh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKGNsb25lKVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICByZXNba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuLy8gdGhlIHN0YXJ0aW5nIHJvdXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCBzdGF0ZVxudmFyIFNUQVJUID0gY3JlYXRlUm91dGUobnVsbCwge1xuICBwYXRoOiAnLydcbn0pO1xuXG5mdW5jdGlvbiBmb3JtYXRNYXRjaCAocmVjb3JkKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgd2hpbGUgKHJlY29yZCkge1xuICAgIHJlcy51bnNoaWZ0KHJlY29yZCk7XG4gICAgcmVjb3JkID0gcmVjb3JkLnBhcmVudDtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGdldEZ1bGxQYXRoIChcbiAgcmVmLFxuICBfc3RyaW5naWZ5UXVlcnlcbikge1xuICB2YXIgcGF0aCA9IHJlZi5wYXRoO1xuICB2YXIgcXVlcnkgPSByZWYucXVlcnk7IGlmICggcXVlcnkgPT09IHZvaWQgMCApIHF1ZXJ5ID0ge307XG4gIHZhciBoYXNoID0gcmVmLmhhc2g7IGlmICggaGFzaCA9PT0gdm9pZCAwICkgaGFzaCA9ICcnO1xuXG4gIHZhciBzdHJpbmdpZnkgPSBfc3RyaW5naWZ5UXVlcnkgfHwgc3RyaW5naWZ5UXVlcnk7XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgc3RyaW5naWZ5KHF1ZXJ5KSArIGhhc2hcbn1cblxuZnVuY3Rpb24gaXNTYW1lUm91dGUgKGEsIGIpIHtcbiAgaWYgKGIgPT09IFNUQVJUKSB7XG4gICAgcmV0dXJuIGEgPT09IGJcbiAgfSBlbHNlIGlmICghYikge1xuICAgIHJldHVybiBmYWxzZVxuICB9IGVsc2UgaWYgKGEucGF0aCAmJiBiLnBhdGgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnJykgPT09IGIucGF0aC5yZXBsYWNlKHRyYWlsaW5nU2xhc2hSRSwgJycpICYmXG4gICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KVxuICAgIClcbiAgfSBlbHNlIGlmIChhLm5hbWUgJiYgYi5uYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubmFtZSA9PT0gYi5uYW1lICYmXG4gICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KSAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnBhcmFtcywgYi5wYXJhbXMpXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0RXF1YWwgKGEsIGIpIHtcbiAgaWYgKCBhID09PSB2b2lkIDAgKSBhID0ge307XG4gIGlmICggYiA9PT0gdm9pZCAwICkgYiA9IHt9O1xuXG4gIC8vIGhhbmRsZSBudWxsIHZhbHVlICMxNTY2XG4gIGlmICghYSB8fCAhYikgeyByZXR1cm4gYSA9PT0gYiB9XG4gIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYVZhbCA9IGFba2V5XTtcbiAgICB2YXIgYlZhbCA9IGJba2V5XTtcbiAgICAvLyBjaGVjayBuZXN0ZWQgZXF1YWxpdHlcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiVmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0RXF1YWwoYVZhbCwgYlZhbClcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKSA9PT0gU3RyaW5nKGJWYWwpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGlzSW5jbHVkZWRSb3V0ZSAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIHJldHVybiAoXG4gICAgY3VycmVudC5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnLycpLmluZGV4T2YoXG4gICAgICB0YXJnZXQucGF0aC5yZXBsYWNlKHRyYWlsaW5nU2xhc2hSRSwgJy8nKVxuICAgICkgPT09IDAgJiZcbiAgICAoIXRhcmdldC5oYXNoIHx8IGN1cnJlbnQuaGFzaCA9PT0gdGFyZ2V0Lmhhc2gpICYmXG4gICAgcXVlcnlJbmNsdWRlcyhjdXJyZW50LnF1ZXJ5LCB0YXJnZXQucXVlcnkpXG4gIClcbn1cblxuZnVuY3Rpb24gcXVlcnlJbmNsdWRlcyAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGggKFxuICByZWxhdGl2ZSxcbiAgYmFzZSxcbiAgYXBwZW5kXG4pIHtcbiAgdmFyIGZpcnN0Q2hhciA9IHJlbGF0aXZlLmNoYXJBdCgwKTtcbiAgaWYgKGZpcnN0Q2hhciA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHJlbGF0aXZlXG4gIH1cblxuICBpZiAoZmlyc3RDaGFyID09PSAnPycgfHwgZmlyc3RDaGFyID09PSAnIycpIHtcbiAgICByZXR1cm4gYmFzZSArIHJlbGF0aXZlXG4gIH1cblxuICB2YXIgc3RhY2sgPSBiYXNlLnNwbGl0KCcvJyk7XG5cbiAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNlZ21lbnQgaWY6XG4gIC8vIC0gbm90IGFwcGVuZGluZ1xuICAvLyAtIGFwcGVuZGluZyB0byB0cmFpbGluZyBzbGFzaCAobGFzdCBzZWdtZW50IGlzIGVtcHR5KVxuICBpZiAoIWFwcGVuZCB8fCAhc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIC8vIHJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICB2YXIgc2VnbWVudHMgPSByZWxhdGl2ZS5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50ID09PSAnLi4nKSB7XG4gICAgICBzdGFjay5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgIT09ICcuJykge1xuICAgICAgc3RhY2sucHVzaChzZWdtZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBlbnN1cmUgbGVhZGluZyBzbGFzaFxuICBpZiAoc3RhY2tbMF0gIT09ICcnKSB7XG4gICAgc3RhY2sudW5zaGlmdCgnJyk7XG4gIH1cblxuICByZXR1cm4gc3RhY2suam9pbignLycpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICB2YXIgaGFzaCA9ICcnO1xuICB2YXIgcXVlcnkgPSAnJztcblxuICB2YXIgaGFzaEluZGV4ID0gcGF0aC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoSW5kZXggPj0gMCkge1xuICAgIGhhc2ggPSBwYXRoLnNsaWNlKGhhc2hJbmRleCk7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgaGFzaEluZGV4KTtcbiAgfVxuXG4gIHZhciBxdWVyeUluZGV4ID0gcGF0aC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxdWVyeUluZGV4ID49IDApIHtcbiAgICBxdWVyeSA9IHBhdGguc2xpY2UocXVlcnlJbmRleCArIDEpO1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIHF1ZXJ5SW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICBoYXNoOiBoYXNoXG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5QYXRoIChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG59XG5cbnZhciBpc2FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHBhdGhUb1JlZ2V4cGAuXG4gKi9cbnZhciBwYXRoVG9SZWdleHBfMSA9IHBhdGhUb1JlZ2V4cDtcbnZhciBwYXJzZV8xID0gcGFyc2U7XG52YXIgY29tcGlsZV8xID0gY29tcGlsZTtcbnZhciB0b2tlbnNUb0Z1bmN0aW9uXzEgPSB0b2tlbnNUb0Z1bmN0aW9uO1xudmFyIHRva2Vuc1RvUmVnRXhwXzEgPSB0b2tlbnNUb1JlZ0V4cDtcblxuLyoqXG4gKiBUaGUgbWFpbiBwYXRoIG1hdGNoaW5nIHJlZ2V4cCB1dGlsaXR5LlxuICpcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbnZhciBQQVRIX1JFR0VYUCA9IG5ldyBSZWdFeHAoW1xuICAvLyBNYXRjaCBlc2NhcGVkIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYXBwZWFyIGluIGZ1dHVyZSBtYXRjaGVzLlxuICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgd29uJ3QgdHJhbnNmb3JtLlxuICAnKFxcXFxcXFxcLiknLFxuICAvLyBNYXRjaCBFeHByZXNzLXN0eWxlIHBhcmFtZXRlcnMgYW5kIHVuLW5hbWVkIHBhcmFtZXRlcnMgd2l0aCBhIHByZWZpeFxuICAvLyBhbmQgb3B0aW9uYWwgc3VmZml4ZXMuIE1hdGNoZXMgYXBwZWFyIGFzOlxuICAvL1xuICAvLyBcIi86dGVzdChcXFxcZCspP1wiID0+IFtcIi9cIiwgXCJ0ZXN0XCIsIFwiXFxkK1wiLCB1bmRlZmluZWQsIFwiP1wiLCB1bmRlZmluZWRdXG4gIC8vIFwiL3JvdXRlKFxcXFxkKylcIiAgPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiXFxkK1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgLy8gXCIvKlwiICAgICAgICAgICAgPT4gW1wiL1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiKlwiXVxuICAnKFtcXFxcLy5dKT8oPzooPzpcXFxcOihcXFxcdyspKD86XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSk/fFxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpKFsrKj9dKT98KFxcXFwqKSknXG5dLmpvaW4oJ3wnKSwgJ2cnKTtcblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBmb3IgdGhlIHJhdyB0b2tlbnMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshQXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlIChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIHRva2VucyA9IFtdO1xuICB2YXIga2V5ID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHBhdGggPSAnJztcbiAgdmFyIGRlZmF1bHREZWxpbWl0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJztcbiAgdmFyIHJlcztcblxuICB3aGlsZSAoKHJlcyA9IFBBVEhfUkVHRVhQLmV4ZWMoc3RyKSkgIT0gbnVsbCkge1xuICAgIHZhciBtID0gcmVzWzBdO1xuICAgIHZhciBlc2NhcGVkID0gcmVzWzFdO1xuICAgIHZhciBvZmZzZXQgPSByZXMuaW5kZXg7XG4gICAgcGF0aCArPSBzdHIuc2xpY2UoaW5kZXgsIG9mZnNldCk7XG4gICAgaW5kZXggPSBvZmZzZXQgKyBtLmxlbmd0aDtcblxuICAgIC8vIElnbm9yZSBhbHJlYWR5IGVzY2FwZWQgc2VxdWVuY2VzLlxuICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICBwYXRoICs9IGVzY2FwZWRbMV07XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBuZXh0ID0gc3RyW2luZGV4XTtcbiAgICB2YXIgcHJlZml4ID0gcmVzWzJdO1xuICAgIHZhciBuYW1lID0gcmVzWzNdO1xuICAgIHZhciBjYXB0dXJlID0gcmVzWzRdO1xuICAgIHZhciBncm91cCA9IHJlc1s1XTtcbiAgICB2YXIgbW9kaWZpZXIgPSByZXNbNl07XG4gICAgdmFyIGFzdGVyaXNrID0gcmVzWzddO1xuXG4gICAgLy8gUHVzaCB0aGUgY3VycmVudCBwYXRoIG9udG8gdGhlIHRva2Vucy5cbiAgICBpZiAocGF0aCkge1xuICAgICAgdG9rZW5zLnB1c2gocGF0aCk7XG4gICAgICBwYXRoID0gJyc7XG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWwgPSBwcmVmaXggIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwgJiYgbmV4dCAhPT0gcHJlZml4O1xuICAgIHZhciByZXBlYXQgPSBtb2RpZmllciA9PT0gJysnIHx8IG1vZGlmaWVyID09PSAnKic7XG4gICAgdmFyIG9wdGlvbmFsID0gbW9kaWZpZXIgPT09ICc/JyB8fCBtb2RpZmllciA9PT0gJyonO1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXNbMl0gfHwgZGVmYXVsdERlbGltaXRlcjtcbiAgICB2YXIgcGF0dGVybiA9IGNhcHR1cmUgfHwgZ3JvdXA7XG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lIHx8IGtleSsrLFxuICAgICAgcHJlZml4OiBwcmVmaXggfHwgJycsXG4gICAgICBkZWxpbWl0ZXI6IGRlbGltaXRlcixcbiAgICAgIG9wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgIHJlcGVhdDogcmVwZWF0LFxuICAgICAgcGFydGlhbDogcGFydGlhbCxcbiAgICAgIGFzdGVyaXNrOiAhIWFzdGVyaXNrLFxuICAgICAgcGF0dGVybjogcGF0dGVybiA/IGVzY2FwZUdyb3VwKHBhdHRlcm4pIDogKGFzdGVyaXNrID8gJy4qJyA6ICdbXicgKyBlc2NhcGVTdHJpbmcoZGVsaW1pdGVyKSArICddKz8nKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KTtcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGV4aXN0cywgcHVzaCBpdCBvbnRvIHRoZSBlbmQuXG4gIGlmIChwYXRoKSB7XG4gICAgdG9rZW5zLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zXG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHN0cmluZyB0byBhIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciB0aGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshZnVuY3Rpb24oT2JqZWN0PSwgT2JqZWN0PSl9XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUgKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9GdW5jdGlvbihwYXJzZShzdHIsIG9wdGlvbnMpKVxufVxuXG4vKipcbiAqIFByZXR0aWVyIGVuY29kaW5nIG9mIFVSSSBwYXRoIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1tcXC8/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBhc3RlcmlzayBwYXJhbWV0ZXIuIFNpbWlsYXIgdG8gYHByZXR0eWAsIGJ1dCBhbGxvd3Mgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFzdGVyaXNrIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRXhwb3NlIGEgbWV0aG9kIGZvciB0cmFuc2Zvcm1pbmcgdG9rZW5zIGludG8gdGhlIHBhdGggZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb24gKHRva2Vucykge1xuICAvLyBDb21waWxlIGFsbCB0aGUgdG9rZW5zIGludG8gcmVnZXhwcy5cbiAgdmFyIG1hdGNoZXMgPSBuZXcgQXJyYXkodG9rZW5zLmxlbmd0aCk7XG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRva2Vuc1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1hdGNoZXNbaV0gPSBuZXcgUmVnRXhwKCdeKD86JyArIHRva2Vuc1tpXS5wYXR0ZXJuICsgJykkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcbiAgICB2YXIgcGF0aCA9ICcnO1xuICAgIHZhciBkYXRhID0gb2JqIHx8IHt9O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgZW5jb2RlID0gb3B0aW9ucy5wcmV0dHkgPyBlbmNvZGVVUklDb21wb25lbnRQcmV0dHkgOiBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRoICs9IHRva2VuO1xuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbdG9rZW4ubmFtZV07XG4gICAgICB2YXIgc2VnbWVudDtcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gUHJlcGVuZCBwYXJ0aWFsIHNlZ21lbnQgcHJlZml4ZXMuXG4gICAgICAgICAgaWYgKHRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBiZSBkZWZpbmVkJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNhcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCByZXBlYXQsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdgJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc2VnbWVudCA9IGVuY29kZSh2YWx1ZVtqXSk7XG5cbiAgICAgICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbWF0Y2ggXCInICsgdG9rZW4ucGF0dGVybiArICdcIiwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkoc2VnbWVudCkgKyAnYCcpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF0aCArPSAoaiA9PT0gMCA/IHRva2VuLnByZWZpeCA6IHRva2VuLmRlbGltaXRlcikgKyBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc2VnbWVudCA9IHRva2VuLmFzdGVyaXNrID8gZW5jb2RlQXN0ZXJpc2sodmFsdWUpIDogZW5jb2RlKHZhbHVlKTtcblxuICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgXCInICsgc2VnbWVudCArICdcIicpXG4gICAgICB9XG5cbiAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG59XG5cbi8qKlxuICogRXNjYXBlIGEgcmVndWxhciBleHByZXNzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcgKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18XFwvXFxcXF0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgY2FwdHVyaW5nIGdyb3VwIGJ5IGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgbWVhbmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGdyb3VwXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUdyb3VwIChncm91cCkge1xuICByZXR1cm4gZ3JvdXAucmVwbGFjZSgvKFs9ITokXFwvKCldKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIGtleXMgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFSZWdFeHB9IHJlXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhdHRhY2hLZXlzIChyZSwga2V5cykge1xuICByZS5rZXlzID0ga2V5cztcbiAgcmV0dXJuIHJlXG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyBmb3IgYSByZWdleHAgZnJvbSB0aGUgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmxhZ3MgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2Vuc2l0aXZlID8gJycgOiAnaSdcbn1cblxuLyoqXG4gKiBQdWxsIG91dCBrZXlzIGZyb20gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcmVnZXhwVG9SZWdleHAgKHBhdGgsIGtleXMpIHtcbiAgLy8gVXNlIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIG1hdGNoIG9ubHkgY2FwdHVyaW5nIGdyb3Vwcy5cbiAgdmFyIGdyb3VwcyA9IHBhdGguc291cmNlLm1hdGNoKC9cXCgoPyFcXD8pL2cpO1xuXG4gIGlmIChncm91cHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZTogaSxcbiAgICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgICBkZWxpbWl0ZXI6IG51bGwsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgcmVwZWF0OiBmYWxzZSxcbiAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgIGFzdGVyaXNrOiBmYWxzZSxcbiAgICAgICAgcGF0dGVybjogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMocGF0aCwga2V5cylcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXkgaW50byBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhcnJheVRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBwYXJ0cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2gocGF0aFRvUmVnZXhwKHBhdGhbaV0sIGtleXMsIG9wdGlvbnMpLnNvdXJjZSk7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnKD86JyArIHBhcnRzLmpvaW4oJ3wnKSArICcpJywgZmxhZ3Mob3B0aW9ucykpO1xuXG4gIHJldHVybiBhdHRhY2hLZXlzKHJlZ2V4cCwga2V5cylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwYXRoIHJlZ2V4cCBmcm9tIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9SZWdFeHAocGFyc2UocGF0aCwgb3B0aW9ucyksIGtleXMsIG9wdGlvbnMpXG59XG5cbi8qKlxuICogRXhwb3NlIGEgZnVuY3Rpb24gZm9yIHRha2luZyB0b2tlbnMgYW5kIHJldHVybmluZyBhIFJlZ0V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICAgICAgICAgIHRva2Vuc1xuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvUmVnRXhwICh0b2tlbnMsIGtleXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc2FycmF5KGtleXMpKSB7XG4gICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGtleXMgfHwgb3B0aW9ucyk7XG4gICAga2V5cyA9IFtdO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0O1xuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlO1xuICB2YXIgcm91dGUgPSAnJztcblxuICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRva2VucyBhbmQgY3JlYXRlIG91ciByZWdleHAgc3RyaW5nLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblxuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByb3V0ZSArPSBlc2NhcGVTdHJpbmcodG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJlZml4ID0gZXNjYXBlU3RyaW5nKHRva2VuLnByZWZpeCk7XG4gICAgICB2YXIgY2FwdHVyZSA9ICcoPzonICsgdG9rZW4ucGF0dGVybiArICcpJztcblxuICAgICAga2V5cy5wdXNoKHRva2VuKTtcblxuICAgICAgaWYgKHRva2VuLnJlcGVhdCkge1xuICAgICAgICBjYXB0dXJlICs9ICcoPzonICsgcHJlZml4ICsgY2FwdHVyZSArICcpKic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICBpZiAoIXRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICBjYXB0dXJlID0gJyg/OicgKyBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJykpPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKT8nO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXB0dXJlID0gcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpJztcbiAgICAgIH1cblxuICAgICAgcm91dGUgKz0gY2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZXNjYXBlU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJyk7XG4gIHZhciBlbmRzV2l0aERlbGltaXRlciA9IHJvdXRlLnNsaWNlKC1kZWxpbWl0ZXIubGVuZ3RoKSA9PT0gZGVsaW1pdGVyO1xuXG4gIC8vIEluIG5vbi1zdHJpY3QgbW9kZSB3ZSBhbGxvdyBhIHNsYXNoIGF0IHRoZSBlbmQgb2YgbWF0Y2guIElmIHRoZSBwYXRoIHRvXG4gIC8vIG1hdGNoIGFscmVhZHkgZW5kcyB3aXRoIGEgc2xhc2gsIHdlIHJlbW92ZSBpdCBmb3IgY29uc2lzdGVuY3kuIFRoZSBzbGFzaFxuICAvLyBpcyB2YWxpZCBhdCB0aGUgZW5kIG9mIGEgcGF0aCBtYXRjaCwgbm90IGluIHRoZSBtaWRkbGUuIFRoaXMgaXMgaW1wb3J0YW50XG4gIC8vIGluIG5vbi1lbmRpbmcgbW9kZSwgd2hlcmUgXCIvdGVzdC9cIiBzaG91bGRuJ3QgbWF0Y2ggXCIvdGVzdC8vcm91dGVcIi5cbiAgaWYgKCFzdHJpY3QpIHtcbiAgICByb3V0ZSA9IChlbmRzV2l0aERlbGltaXRlciA/IHJvdXRlLnNsaWNlKDAsIC1kZWxpbWl0ZXIubGVuZ3RoKSA6IHJvdXRlKSArICcoPzonICsgZGVsaW1pdGVyICsgJyg/PSQpKT8nO1xuICB9XG5cbiAgaWYgKGVuZCkge1xuICAgIHJvdXRlICs9ICckJztcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiBub24tZW5kaW5nIG1vZGUsIHdlIG5lZWQgdGhlIGNhcHR1cmluZyBncm91cHMgdG8gbWF0Y2ggYXMgbXVjaCBhc1xuICAgIC8vIHBvc3NpYmxlIGJ5IHVzaW5nIGEgcG9zaXRpdmUgbG9va2FoZWFkIHRvIHRoZSBlbmQgb3IgbmV4dCBwYXRoIHNlZ21lbnQuXG4gICAgcm91dGUgKz0gc3RyaWN0ICYmIGVuZHNXaXRoRGVsaW1pdGVyID8gJycgOiAnKD89JyArIGRlbGltaXRlciArICd8JCknO1xuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMobmV3IFJlZ0V4cCgnXicgKyByb3V0ZSwgZmxhZ3Mob3B0aW9ucykpLCBrZXlzKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gcGF0aCBzdHJpbmcsIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBjYW4gYmUgcGFzc2VkIGluIGZvciB0aGUga2V5cywgd2hpY2ggd2lsbCBob2xkIHRoZVxuICogcGxhY2Vob2xkZXIga2V5IGRlc2NyaXB0aW9ucy4gRm9yIGV4YW1wbGUsIHVzaW5nIGAvdXNlci86aWRgLCBga2V5c2Agd2lsbFxuICogY29udGFpbiBgW3sgbmFtZTogJ2lkJywgZGVsaW1pdGVyOiAnLycsIG9wdGlvbmFsOiBmYWxzZSwgcmVwZWF0OiBmYWxzZSB9XWAuXG4gKlxuICogQHBhcmFtICB7KHN0cmluZ3xSZWdFeHB8QXJyYXkpfSBwYXRoXG4gKiBAcGFyYW0gIHsoQXJyYXl8T2JqZWN0KT19ICAgICAgIGtleXNcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcGF0aFRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpO1xuICAgIGtleXMgPSBbXTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cFRvUmVnZXhwKHBhdGgsIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cykpXG4gIH1cblxuICBpZiAoaXNhcnJheShwYXRoKSkge1xuICAgIHJldHVybiBhcnJheVRvUmVnZXhwKC8qKiBAdHlwZSB7IUFycmF5fSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gc3RyaW5nVG9SZWdleHAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRoKSwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSwgb3B0aW9ucylcbn1cbnBhdGhUb1JlZ2V4cF8xLnBhcnNlID0gcGFyc2VfMTtcbnBhdGhUb1JlZ2V4cF8xLmNvbXBpbGUgPSBjb21waWxlXzE7XG5wYXRoVG9SZWdleHBfMS50b2tlbnNUb0Z1bmN0aW9uID0gdG9rZW5zVG9GdW5jdGlvbl8xO1xucGF0aFRvUmVnZXhwXzEudG9rZW5zVG9SZWdFeHAgPSB0b2tlbnNUb1JlZ0V4cF8xO1xuXG4vKiAgKi9cblxuLy8gJGZsb3ctZGlzYWJsZS1saW5lXG52YXIgcmVnZXhwQ29tcGlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZnVuY3Rpb24gZmlsbFBhcmFtcyAoXG4gIHBhdGgsXG4gIHBhcmFtcyxcbiAgcm91dGVNc2dcbikge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIHRyeSB7XG4gICAgdmFyIGZpbGxlciA9XG4gICAgICByZWdleHBDb21waWxlQ2FjaGVbcGF0aF0gfHxcbiAgICAgIChyZWdleHBDb21waWxlQ2FjaGVbcGF0aF0gPSBwYXRoVG9SZWdleHBfMS5jb21waWxlKHBhdGgpKTtcblxuICAgIC8vIEZpeCAjMjUwNSByZXNvbHZpbmcgYXN0ZXJpc2sgcm91dGVzIHsgbmFtZTogJ25vdC1mb3VuZCcsIHBhcmFtczogeyBwYXRoTWF0Y2g6ICcvbm90LWZvdW5kJyB9fVxuICAgIGlmIChwYXJhbXMucGF0aE1hdGNoKSB7IHBhcmFtc1swXSA9IHBhcmFtcy5wYXRoTWF0Y2g7IH1cblxuICAgIHJldHVybiBmaWxsZXIocGFyYW1zLCB7IHByZXR0eTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIChcIm1pc3NpbmcgcGFyYW0gZm9yIFwiICsgcm91dGVNc2cgKyBcIjogXCIgKyAoZS5tZXNzYWdlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBkZWxldGUgdGhlIDAgaWYgaXQgd2FzIGFkZGVkXG4gICAgZGVsZXRlIHBhcmFtc1swXTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb24gKFxuICByYXcsXG4gIGN1cnJlbnQsXG4gIGFwcGVuZCxcbiAgcm91dGVyXG4pIHtcbiAgdmFyIG5leHQgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyA/IHsgcGF0aDogcmF3IH0gOiByYXc7XG4gIC8vIG5hbWVkIHRhcmdldFxuICBpZiAobmV4dC5fbm9ybWFsaXplZCkge1xuICAgIHJldHVybiBuZXh0XG4gIH0gZWxzZSBpZiAobmV4dC5uYW1lKSB7XG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgcmF3KVxuICB9XG5cbiAgLy8gcmVsYXRpdmUgcGFyYW1zXG4gIGlmICghbmV4dC5wYXRoICYmIG5leHQucGFyYW1zICYmIGN1cnJlbnQpIHtcbiAgICBuZXh0ID0gZXh0ZW5kKHt9LCBuZXh0KTtcbiAgICBuZXh0Ll9ub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB2YXIgcGFyYW1zID0gZXh0ZW5kKGV4dGVuZCh7fSwgY3VycmVudC5wYXJhbXMpLCBuZXh0LnBhcmFtcyk7XG4gICAgaWYgKGN1cnJlbnQubmFtZSkge1xuICAgICAgbmV4dC5uYW1lID0gY3VycmVudC5uYW1lO1xuICAgICAgbmV4dC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Lm1hdGNoZWQubGVuZ3RoKSB7XG4gICAgICB2YXIgcmF3UGF0aCA9IGN1cnJlbnQubWF0Y2hlZFtjdXJyZW50Lm1hdGNoZWQubGVuZ3RoIC0gMV0ucGF0aDtcbiAgICAgIG5leHQucGF0aCA9IGZpbGxQYXJhbXMocmF3UGF0aCwgcGFyYW1zLCAoXCJwYXRoIFwiICsgKGN1cnJlbnQucGF0aCkpKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIFwicmVsYXRpdmUgcGFyYW1zIG5hdmlnYXRpb24gcmVxdWlyZXMgYSBjdXJyZW50IHJvdXRlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRcbiAgfVxuXG4gIHZhciBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKG5leHQucGF0aCB8fCAnJyk7XG4gIHZhciBiYXNlUGF0aCA9IChjdXJyZW50ICYmIGN1cnJlbnQucGF0aCkgfHwgJy8nO1xuICB2YXIgcGF0aCA9IHBhcnNlZFBhdGgucGF0aFxuICAgID8gcmVzb2x2ZVBhdGgocGFyc2VkUGF0aC5wYXRoLCBiYXNlUGF0aCwgYXBwZW5kIHx8IG5leHQuYXBwZW5kKVxuICAgIDogYmFzZVBhdGg7XG5cbiAgdmFyIHF1ZXJ5ID0gcmVzb2x2ZVF1ZXJ5KFxuICAgIHBhcnNlZFBhdGgucXVlcnksXG4gICAgbmV4dC5xdWVyeSxcbiAgICByb3V0ZXIgJiYgcm91dGVyLm9wdGlvbnMucGFyc2VRdWVyeVxuICApO1xuXG4gIHZhciBoYXNoID0gbmV4dC5oYXNoIHx8IHBhcnNlZFBhdGguaGFzaDtcbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykge1xuICAgIGhhc2ggPSBcIiNcIiArIGhhc2g7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIF9ub3JtYWxpemVkOiB0cnVlLFxuICAgIHBhdGg6IHBhdGgsXG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIGhhc2g6IGhhc2hcbiAgfVxufVxuXG4vKiAgKi9cblxuLy8gd29yayBhcm91bmQgd2VpcmQgZmxvdyBidWdcbnZhciB0b1R5cGVzID0gW1N0cmluZywgT2JqZWN0XTtcbnZhciBldmVudFR5cGVzID0gW1N0cmluZywgQXJyYXldO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgTGluayA9IHtcbiAgbmFtZTogJ1JvdXRlckxpbmsnLFxuICBwcm9wczoge1xuICAgIHRvOiB7XG4gICAgICB0eXBlOiB0b1R5cGVzLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2EnXG4gICAgfSxcbiAgICBleGFjdDogQm9vbGVhbixcbiAgICBhcHBlbmQ6IEJvb2xlYW4sXG4gICAgcmVwbGFjZTogQm9vbGVhbixcbiAgICBhY3RpdmVDbGFzczogU3RyaW5nLFxuICAgIGV4YWN0QWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgICBldmVudDoge1xuICAgICAgdHlwZTogZXZlbnRUeXBlcyxcbiAgICAgIGRlZmF1bHQ6ICdjbGljaydcbiAgICB9XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcm91dGVyID0gdGhpcy4kcm91dGVyO1xuICAgIHZhciBjdXJyZW50ID0gdGhpcy4kcm91dGU7XG4gICAgdmFyIHJlZiA9IHJvdXRlci5yZXNvbHZlKFxuICAgICAgdGhpcy50byxcbiAgICAgIGN1cnJlbnQsXG4gICAgICB0aGlzLmFwcGVuZFxuICAgICk7XG4gICAgdmFyIGxvY2F0aW9uID0gcmVmLmxvY2F0aW9uO1xuICAgIHZhciByb3V0ZSA9IHJlZi5yb3V0ZTtcbiAgICB2YXIgaHJlZiA9IHJlZi5ocmVmO1xuXG4gICAgdmFyIGNsYXNzZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsQWN0aXZlQ2xhc3MgPSByb3V0ZXIub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3M7XG4gICAgdmFyIGdsb2JhbEV4YWN0QWN0aXZlQ2xhc3MgPSByb3V0ZXIub3B0aW9ucy5saW5rRXhhY3RBY3RpdmVDbGFzcztcbiAgICAvLyBTdXBwb3J0IGdsb2JhbCBlbXB0eSBhY3RpdmUgY2xhc3NcbiAgICB2YXIgYWN0aXZlQ2xhc3NGYWxsYmFjayA9XG4gICAgICBnbG9iYWxBY3RpdmVDbGFzcyA9PSBudWxsID8gJ3JvdXRlci1saW5rLWFjdGl2ZScgOiBnbG9iYWxBY3RpdmVDbGFzcztcbiAgICB2YXIgZXhhY3RBY3RpdmVDbGFzc0ZhbGxiYWNrID1cbiAgICAgIGdsb2JhbEV4YWN0QWN0aXZlQ2xhc3MgPT0gbnVsbFxuICAgICAgICA/ICdyb3V0ZXItbGluay1leGFjdC1hY3RpdmUnXG4gICAgICAgIDogZ2xvYmFsRXhhY3RBY3RpdmVDbGFzcztcbiAgICB2YXIgYWN0aXZlQ2xhc3MgPVxuICAgICAgdGhpcy5hY3RpdmVDbGFzcyA9PSBudWxsID8gYWN0aXZlQ2xhc3NGYWxsYmFjayA6IHRoaXMuYWN0aXZlQ2xhc3M7XG4gICAgdmFyIGV4YWN0QWN0aXZlQ2xhc3MgPVxuICAgICAgdGhpcy5leGFjdEFjdGl2ZUNsYXNzID09IG51bGxcbiAgICAgICAgPyBleGFjdEFjdGl2ZUNsYXNzRmFsbGJhY2tcbiAgICAgICAgOiB0aGlzLmV4YWN0QWN0aXZlQ2xhc3M7XG5cbiAgICB2YXIgY29tcGFyZVRhcmdldCA9IHJvdXRlLnJlZGlyZWN0ZWRGcm9tXG4gICAgICA/IGNyZWF0ZVJvdXRlKG51bGwsIG5vcm1hbGl6ZUxvY2F0aW9uKHJvdXRlLnJlZGlyZWN0ZWRGcm9tKSwgbnVsbCwgcm91dGVyKVxuICAgICAgOiByb3V0ZTtcblxuICAgIGNsYXNzZXNbZXhhY3RBY3RpdmVDbGFzc10gPSBpc1NhbWVSb3V0ZShjdXJyZW50LCBjb21wYXJlVGFyZ2V0KTtcbiAgICBjbGFzc2VzW2FjdGl2ZUNsYXNzXSA9IHRoaXMuZXhhY3RcbiAgICAgID8gY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXVxuICAgICAgOiBpc0luY2x1ZGVkUm91dGUoY3VycmVudCwgY29tcGFyZVRhcmdldCk7XG5cbiAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZ3VhcmRFdmVudChlKSkge1xuICAgICAgICBpZiAodGhpcyQxLnJlcGxhY2UpIHtcbiAgICAgICAgICByb3V0ZXIucmVwbGFjZShsb2NhdGlvbiwgbm9vcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm91dGVyLnB1c2gobG9jYXRpb24sIG5vb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvbiA9IHsgY2xpY2s6IGd1YXJkRXZlbnQgfTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV2ZW50KSkge1xuICAgICAgdGhpcy5ldmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9uW2VdID0gaGFuZGxlcjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvblt0aGlzLmV2ZW50XSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB7IGNsYXNzOiBjbGFzc2VzIH07XG5cbiAgICB2YXIgc2NvcGVkU2xvdCA9XG4gICAgICAhdGhpcy4kc2NvcGVkU2xvdHMuJGhhc05vcm1hbCAmJlxuICAgICAgdGhpcy4kc2NvcGVkU2xvdHMuZGVmYXVsdCAmJlxuICAgICAgdGhpcy4kc2NvcGVkU2xvdHMuZGVmYXVsdCh7XG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIHJvdXRlOiByb3V0ZSxcbiAgICAgICAgbmF2aWdhdGU6IGhhbmRsZXIsXG4gICAgICAgIGlzQWN0aXZlOiBjbGFzc2VzW2FjdGl2ZUNsYXNzXSxcbiAgICAgICAgaXNFeGFjdEFjdGl2ZTogY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXVxuICAgICAgfSk7XG5cbiAgICBpZiAoc2NvcGVkU2xvdCkge1xuICAgICAgaWYgKHNjb3BlZFNsb3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzY29wZWRTbG90WzBdXG4gICAgICB9IGVsc2UgaWYgKHNjb3BlZFNsb3QubGVuZ3RoID4gMSB8fCAhc2NvcGVkU2xvdC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAoXCJSb3V0ZXJMaW5rIHdpdGggdG89XFxcIlwiICsgKHRoaXMucHJvcHMudG8pICsgXCJcXFwiIGlzIHRyeWluZyB0byB1c2UgYSBzY29wZWQgc2xvdCBidXQgaXQgZGlkbid0IHByb3ZpZGUgZXhhY3RseSBvbmUgY2hpbGQuXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NvcGVkU2xvdC5sZW5ndGggPT09IDAgPyBoKCkgOiBoKCdzcGFuJywge30sIHNjb3BlZFNsb3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFnID09PSAnYScpIHtcbiAgICAgIGRhdGEub24gPSBvbjtcbiAgICAgIGRhdGEuYXR0cnMgPSB7IGhyZWY6IGhyZWYgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmluZCB0aGUgZmlyc3QgPGE+IGNoaWxkIGFuZCBhcHBseSBsaXN0ZW5lciBhbmQgaHJlZlxuICAgICAgdmFyIGEgPSBmaW5kQW5jaG9yKHRoaXMuJHNsb3RzLmRlZmF1bHQpO1xuICAgICAgaWYgKGEpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGUgPGE+IGlzIGEgc3RhdGljIG5vZGVcbiAgICAgICAgYS5pc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICB2YXIgYURhdGEgPSAoYS5kYXRhID0gZXh0ZW5kKHt9LCBhLmRhdGEpKTtcbiAgICAgICAgYURhdGEub24gPSBhRGF0YS5vbiB8fCB7fTtcbiAgICAgICAgLy8gdHJhbnNmb3JtIGV4aXN0aW5nIGV2ZW50cyBpbiBib3RoIG9iamVjdHMgaW50byBhcnJheXMgc28gd2UgY2FuIHB1c2ggbGF0ZXJcbiAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gYURhdGEub24pIHtcbiAgICAgICAgICB2YXIgaGFuZGxlciQxID0gYURhdGEub25bZXZlbnRdO1xuICAgICAgICAgIGlmIChldmVudCBpbiBvbikge1xuICAgICAgICAgICAgYURhdGEub25bZXZlbnRdID0gQXJyYXkuaXNBcnJheShoYW5kbGVyJDEpID8gaGFuZGxlciQxIDogW2hhbmRsZXIkMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGVuZCBuZXcgbGlzdGVuZXJzIGZvciByb3V0ZXItbGlua1xuICAgICAgICBmb3IgKHZhciBldmVudCQxIGluIG9uKSB7XG4gICAgICAgICAgaWYgKGV2ZW50JDEgaW4gYURhdGEub24pIHtcbiAgICAgICAgICAgIC8vIG9uW2V2ZW50XSBpcyBhbHdheXMgYSBmdW5jdGlvblxuICAgICAgICAgICAgYURhdGEub25bZXZlbnQkMV0ucHVzaChvbltldmVudCQxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFEYXRhLm9uW2V2ZW50JDFdID0gaGFuZGxlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYUF0dHJzID0gKGEuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYS5kYXRhLmF0dHJzKSk7XG4gICAgICAgIGFBdHRycy5ocmVmID0gaHJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSA8YT4gY2hpbGQsIGFwcGx5IGxpc3RlbmVyIHRvIHNlbGZcbiAgICAgICAgZGF0YS5vbiA9IG9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoKHRoaXMudGFnLCBkYXRhLCB0aGlzLiRzbG90cy5kZWZhdWx0KVxuICB9XG59O1xuXG5mdW5jdGlvbiBndWFyZEV2ZW50IChlKSB7XG4gIC8vIGRvbid0IHJlZGlyZWN0IHdpdGggY29udHJvbCBrZXlzXG4gIGlmIChlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpIHsgcmV0dXJuIH1cbiAgLy8gZG9uJ3QgcmVkaXJlY3Qgd2hlbiBwcmV2ZW50RGVmYXVsdCBjYWxsZWRcbiAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBvbiByaWdodCBjbGlja1xuICBpZiAoZS5idXR0b24gIT09IHVuZGVmaW5lZCAmJiBlLmJ1dHRvbiAhPT0gMCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBpZiBgdGFyZ2V0PVwiX2JsYW5rXCJgXG4gIGlmIChlLmN1cnJlbnRUYXJnZXQgJiYgZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSkge1xuICAgIHZhciB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAoL1xcYl9ibGFua1xcYi9pLnRlc3QodGFyZ2V0KSkgeyByZXR1cm4gfVxuICB9XG4gIC8vIHRoaXMgbWF5IGJlIGEgV2VleCBldmVudCB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2RcbiAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gZmluZEFuY2hvciAoY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2hpbGQudGFnID09PSAnYScpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgKGNoaWxkID0gZmluZEFuY2hvcihjaGlsZC5jaGlsZHJlbikpKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgX1Z1ZTtcblxuZnVuY3Rpb24gaW5zdGFsbCAoVnVlKSB7XG4gIGlmIChpbnN0YWxsLmluc3RhbGxlZCAmJiBfVnVlID09PSBWdWUpIHsgcmV0dXJuIH1cbiAgaW5zdGFsbC5pbnN0YWxsZWQgPSB0cnVlO1xuXG4gIF9WdWUgPSBWdWU7XG5cbiAgdmFyIGlzRGVmID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHVuZGVmaW5lZDsgfTtcblxuICB2YXIgcmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uICh2bSwgY2FsbFZhbCkge1xuICAgIHZhciBpID0gdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICAgIGlmIChpc0RlZihpKSAmJiBpc0RlZihpID0gaS5kYXRhKSAmJiBpc0RlZihpID0gaS5yZWdpc3RlclJvdXRlSW5zdGFuY2UpKSB7XG4gICAgICBpKHZtLCBjYWxsVmFsKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLm1peGluKHtcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgICBpZiAoaXNEZWYodGhpcy4kb3B0aW9ucy5yb3V0ZXIpKSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLiRvcHRpb25zLnJvdXRlcjtcbiAgICAgICAgdGhpcy5fcm91dGVyLmluaXQodGhpcyk7XG4gICAgICAgIFZ1ZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsICdfcm91dGUnLCB0aGlzLl9yb3V0ZXIuaGlzdG9yeS5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5fcm91dGVyUm9vdCkgfHwgdGhpcztcbiAgICAgIH1cbiAgICAgIHJlZ2lzdGVySW5zdGFuY2UodGhpcywgdGhpcyk7XG4gICAgfSxcbiAgICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgICByZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcm91dGVyJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlciB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHJvdXRlJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlIH1cbiAgfSk7XG5cbiAgVnVlLmNvbXBvbmVudCgnUm91dGVyVmlldycsIFZpZXcpO1xuICBWdWUuY29tcG9uZW50KCdSb3V0ZXJMaW5rJywgTGluayk7XG5cbiAgdmFyIHN0cmF0cyA9IFZ1ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuICAvLyB1c2UgdGhlIHNhbWUgaG9vayBtZXJnaW5nIHN0cmF0ZWd5IGZvciByb3V0ZSBob29rc1xuICBzdHJhdHMuYmVmb3JlUm91dGVFbnRlciA9IHN0cmF0cy5iZWZvcmVSb3V0ZUxlYXZlID0gc3RyYXRzLmJlZm9yZVJvdXRlVXBkYXRlID0gc3RyYXRzLmNyZWF0ZWQ7XG59XG5cbi8qICAqL1xuXG52YXIgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZU1hcCAoXG4gIHJvdXRlcyxcbiAgb2xkUGF0aExpc3QsXG4gIG9sZFBhdGhNYXAsXG4gIG9sZE5hbWVNYXBcbikge1xuICAvLyB0aGUgcGF0aCBsaXN0IGlzIHVzZWQgdG8gY29udHJvbCBwYXRoIG1hdGNoaW5nIHByaW9yaXR5XG4gIHZhciBwYXRoTGlzdCA9IG9sZFBhdGhMaXN0IHx8IFtdO1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIHBhdGhNYXAgPSBvbGRQYXRoTWFwIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICB2YXIgbmFtZU1hcCA9IG9sZE5hbWVNYXAgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICByb3V0ZXMuZm9yRWFjaChmdW5jdGlvbiAocm91dGUpIHtcbiAgICBhZGRSb3V0ZVJlY29yZChwYXRoTGlzdCwgcGF0aE1hcCwgbmFtZU1hcCwgcm91dGUpO1xuICB9KTtcblxuICAvLyBlbnN1cmUgd2lsZGNhcmQgcm91dGVzIGFyZSBhbHdheXMgYXQgdGhlIGVuZFxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhdGhMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChwYXRoTGlzdFtpXSA9PT0gJyonKSB7XG4gICAgICBwYXRoTGlzdC5wdXNoKHBhdGhMaXN0LnNwbGljZShpLCAxKVswXSk7XG4gICAgICBsLS07XG4gICAgICBpLS07XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgLy8gd2FybiBpZiByb3V0ZXMgZG8gbm90IGluY2x1ZGUgbGVhZGluZyBzbGFzaGVzXG4gICAgdmFyIGZvdW5kID0gcGF0aExpc3RcbiAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBsZWFkaW5nIHNsYXNoXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiBwYXRoICYmIHBhdGguY2hhckF0KDApICE9PSAnKicgJiYgcGF0aC5jaGFyQXQoMCkgIT09ICcvJzsgfSk7XG5cbiAgICBpZiAoZm91bmQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHBhdGhOYW1lcyA9IGZvdW5kLm1hcChmdW5jdGlvbiAocGF0aCkgeyByZXR1cm4gKFwiLSBcIiArIHBhdGgpOyB9KS5qb2luKCdcXG4nKTtcbiAgICAgIHdhcm4oZmFsc2UsIChcIk5vbi1uZXN0ZWQgcm91dGVzIG11c3QgaW5jbHVkZSBhIGxlYWRpbmcgc2xhc2ggY2hhcmFjdGVyLiBGaXggdGhlIGZvbGxvd2luZyByb3V0ZXM6IFxcblwiICsgcGF0aE5hbWVzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoTGlzdDogcGF0aExpc3QsXG4gICAgcGF0aE1hcDogcGF0aE1hcCxcbiAgICBuYW1lTWFwOiBuYW1lTWFwXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkUm91dGVSZWNvcmQgKFxuICBwYXRoTGlzdCxcbiAgcGF0aE1hcCxcbiAgbmFtZU1hcCxcbiAgcm91dGUsXG4gIHBhcmVudCxcbiAgbWF0Y2hBc1xuKSB7XG4gIHZhciBwYXRoID0gcm91dGUucGF0aDtcbiAgdmFyIG5hbWUgPSByb3V0ZS5uYW1lO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChwYXRoICE9IG51bGwsIFwiXFxcInBhdGhcXFwiIGlzIHJlcXVpcmVkIGluIGEgcm91dGUgY29uZmlndXJhdGlvbi5cIik7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIHJvdXRlLmNvbXBvbmVudCAhPT0gJ3N0cmluZycsXG4gICAgICBcInJvdXRlIGNvbmZpZyBcXFwiY29tcG9uZW50XFxcIiBmb3IgcGF0aDogXCIgKyAoU3RyaW5nKFxuICAgICAgICBwYXRoIHx8IG5hbWVcbiAgICAgICkpICsgXCIgY2Fubm90IGJlIGEgXCIgKyBcInN0cmluZyBpZC4gVXNlIGFuIGFjdHVhbCBjb21wb25lbnQgaW5zdGVhZC5cIlxuICAgICk7XG4gIH1cblxuICB2YXIgcGF0aFRvUmVnZXhwT3B0aW9ucyA9XG4gICAgcm91dGUucGF0aFRvUmVnZXhwT3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoLCBwYXJlbnQsIHBhdGhUb1JlZ2V4cE9wdGlvbnMuc3RyaWN0KTtcblxuICBpZiAodHlwZW9mIHJvdXRlLmNhc2VTZW5zaXRpdmUgPT09ICdib29sZWFuJykge1xuICAgIHBhdGhUb1JlZ2V4cE9wdGlvbnMuc2Vuc2l0aXZlID0gcm91dGUuY2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIHZhciByZWNvcmQgPSB7XG4gICAgcGF0aDogbm9ybWFsaXplZFBhdGgsXG4gICAgcmVnZXg6IGNvbXBpbGVSb3V0ZVJlZ2V4KG5vcm1hbGl6ZWRQYXRoLCBwYXRoVG9SZWdleHBPcHRpb25zKSxcbiAgICBjb21wb25lbnRzOiByb3V0ZS5jb21wb25lbnRzIHx8IHsgZGVmYXVsdDogcm91dGUuY29tcG9uZW50IH0sXG4gICAgaW5zdGFuY2VzOiB7fSxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmVudDogcGFyZW50LFxuICAgIG1hdGNoQXM6IG1hdGNoQXMsXG4gICAgcmVkaXJlY3Q6IHJvdXRlLnJlZGlyZWN0LFxuICAgIGJlZm9yZUVudGVyOiByb3V0ZS5iZWZvcmVFbnRlcixcbiAgICBtZXRhOiByb3V0ZS5tZXRhIHx8IHt9LFxuICAgIHByb3BzOlxuICAgICAgcm91dGUucHJvcHMgPT0gbnVsbFxuICAgICAgICA/IHt9XG4gICAgICAgIDogcm91dGUuY29tcG9uZW50c1xuICAgICAgICAgID8gcm91dGUucHJvcHNcbiAgICAgICAgICA6IHsgZGVmYXVsdDogcm91dGUucHJvcHMgfVxuICB9O1xuXG4gIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgIC8vIFdhcm4gaWYgcm91dGUgaXMgbmFtZWQsIGRvZXMgbm90IHJlZGlyZWN0IGFuZCBoYXMgYSBkZWZhdWx0IGNoaWxkIHJvdXRlLlxuICAgIC8vIElmIHVzZXJzIG5hdmlnYXRlIHRvIHRoaXMgcm91dGUgYnkgbmFtZSwgdGhlIGRlZmF1bHQgY2hpbGQgd2lsbFxuICAgIC8vIG5vdCBiZSByZW5kZXJlZCAoR0ggSXNzdWUgIzYyOSlcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKFxuICAgICAgICByb3V0ZS5uYW1lICYmXG4gICAgICAgICFyb3V0ZS5yZWRpcmVjdCAmJlxuICAgICAgICByb3V0ZS5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gL15cXC8/JC8udGVzdChjaGlsZC5wYXRoKTsgfSlcbiAgICAgICkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwiTmFtZWQgUm91dGUgJ1wiICsgKHJvdXRlLm5hbWUpICsgXCInIGhhcyBhIGRlZmF1bHQgY2hpbGQgcm91dGUuIFwiICtcbiAgICAgICAgICAgIFwiV2hlbiBuYXZpZ2F0aW5nIHRvIHRoaXMgbmFtZWQgcm91dGUgKDp0bz1cXFwie25hbWU6ICdcIiArIChyb3V0ZS5uYW1lKSArIFwiJ1xcXCIpLCBcIiArXG4gICAgICAgICAgICBcInRoZSBkZWZhdWx0IGNoaWxkIHJvdXRlIHdpbGwgbm90IGJlIHJlbmRlcmVkLiBSZW1vdmUgdGhlIG5hbWUgZnJvbSBcIiArXG4gICAgICAgICAgICBcInRoaXMgcm91dGUgYW5kIHVzZSB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBjaGlsZCByb3V0ZSBmb3IgbmFtZWQgXCIgK1xuICAgICAgICAgICAgXCJsaW5rcyBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGRNYXRjaEFzID0gbWF0Y2hBc1xuICAgICAgICA/IGNsZWFuUGF0aCgobWF0Y2hBcyArIFwiL1wiICsgKGNoaWxkLnBhdGgpKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBhZGRSb3V0ZVJlY29yZChwYXRoTGlzdCwgcGF0aE1hcCwgbmFtZU1hcCwgY2hpbGQsIHJlY29yZCwgY2hpbGRNYXRjaEFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghcGF0aE1hcFtyZWNvcmQucGF0aF0pIHtcbiAgICBwYXRoTGlzdC5wdXNoKHJlY29yZC5wYXRoKTtcbiAgICBwYXRoTWFwW3JlY29yZC5wYXRoXSA9IHJlY29yZDtcbiAgfVxuXG4gIGlmIChyb3V0ZS5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGFsaWFzZXMgPSBBcnJheS5pc0FycmF5KHJvdXRlLmFsaWFzKSA/IHJvdXRlLmFsaWFzIDogW3JvdXRlLmFsaWFzXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBhbGlhcyA9IGFsaWFzZXNbaV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhbGlhcyA9PT0gcGF0aCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChcIkZvdW5kIGFuIGFsaWFzIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHBhdGg6IFxcXCJcIiArIHBhdGggKyBcIlxcXCIuIFlvdSBoYXZlIHRvIHJlbW92ZSB0aGF0IGFsaWFzLiBJdCB3aWxsIGJlIGlnbm9yZWQgaW4gZGV2ZWxvcG1lbnQuXCIpXG4gICAgICAgICk7XG4gICAgICAgIC8vIHNraXAgaW4gZGV2IHRvIG1ha2UgaXQgd29ya1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgYWxpYXNSb3V0ZSA9IHtcbiAgICAgICAgcGF0aDogYWxpYXMsXG4gICAgICAgIGNoaWxkcmVuOiByb3V0ZS5jaGlsZHJlblxuICAgICAgfTtcbiAgICAgIGFkZFJvdXRlUmVjb3JkKFxuICAgICAgICBwYXRoTGlzdCxcbiAgICAgICAgcGF0aE1hcCxcbiAgICAgICAgbmFtZU1hcCxcbiAgICAgICAgYWxpYXNSb3V0ZSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICByZWNvcmQucGF0aCB8fCAnLycgLy8gbWF0Y2hBc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmFtZSkge1xuICAgIGlmICghbmFtZU1hcFtuYW1lXSkge1xuICAgICAgbmFtZU1hcFtuYW1lXSA9IHJlY29yZDtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIW1hdGNoQXMpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBcIkR1cGxpY2F0ZSBuYW1lZCByb3V0ZXMgZGVmaW5pdGlvbjogXCIgK1xuICAgICAgICAgIFwieyBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLCBwYXRoOiBcXFwiXCIgKyAocmVjb3JkLnBhdGgpICsgXCJcXFwiIH1cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZVJvdXRlUmVnZXggKFxuICBwYXRoLFxuICBwYXRoVG9SZWdleHBPcHRpb25zXG4pIHtcbiAgdmFyIHJlZ2V4ID0gcGF0aFRvUmVnZXhwXzEocGF0aCwgW10sIHBhdGhUb1JlZ2V4cE9wdGlvbnMpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICByZWdleC5rZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgd2FybihcbiAgICAgICAgIWtleXNba2V5Lm5hbWVdLFxuICAgICAgICAoXCJEdXBsaWNhdGUgcGFyYW0ga2V5cyBpbiByb3V0ZSB3aXRoIHBhdGg6IFxcXCJcIiArIHBhdGggKyBcIlxcXCJcIilcbiAgICAgICk7XG4gICAgICBrZXlzW2tleS5uYW1lXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlZ2V4XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGggKFxuICBwYXRoLFxuICBwYXJlbnQsXG4gIHN0cmljdFxuKSB7XG4gIGlmICghc3RyaWN0KSB7IHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7IH1cbiAgaWYgKHBhdGhbMF0gPT09ICcvJykgeyByZXR1cm4gcGF0aCB9XG4gIGlmIChwYXJlbnQgPT0gbnVsbCkgeyByZXR1cm4gcGF0aCB9XG4gIHJldHVybiBjbGVhblBhdGgoKChwYXJlbnQucGF0aCkgKyBcIi9cIiArIHBhdGgpKVxufVxuXG4vKiAgKi9cblxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU1hdGNoZXIgKFxuICByb3V0ZXMsXG4gIHJvdXRlclxuKSB7XG4gIHZhciByZWYgPSBjcmVhdGVSb3V0ZU1hcChyb3V0ZXMpO1xuICB2YXIgcGF0aExpc3QgPSByZWYucGF0aExpc3Q7XG4gIHZhciBwYXRoTWFwID0gcmVmLnBhdGhNYXA7XG4gIHZhciBuYW1lTWFwID0gcmVmLm5hbWVNYXA7XG5cbiAgZnVuY3Rpb24gYWRkUm91dGVzIChyb3V0ZXMpIHtcbiAgICBjcmVhdGVSb3V0ZU1hcChyb3V0ZXMsIHBhdGhMaXN0LCBwYXRoTWFwLCBuYW1lTWFwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hdGNoIChcbiAgICByYXcsXG4gICAgY3VycmVudFJvdXRlLFxuICAgIHJlZGlyZWN0ZWRGcm9tXG4gICkge1xuICAgIHZhciBsb2NhdGlvbiA9IG5vcm1hbGl6ZUxvY2F0aW9uKHJhdywgY3VycmVudFJvdXRlLCBmYWxzZSwgcm91dGVyKTtcbiAgICB2YXIgbmFtZSA9IGxvY2F0aW9uLm5hbWU7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgdmFyIHJlY29yZCA9IG5hbWVNYXBbbmFtZV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKHJlY29yZCwgKFwiUm91dGUgd2l0aCBuYW1lICdcIiArIG5hbWUgKyBcIicgZG9lcyBub3QgZXhpc3RcIikpO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQpIHsgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbikgfVxuICAgICAgdmFyIHBhcmFtTmFtZXMgPSByZWNvcmQucmVnZXgua2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuICFrZXkub3B0aW9uYWw7IH0pXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5Lm5hbWU7IH0pO1xuXG4gICAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnBhcmFtcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbG9jYXRpb24ucGFyYW1zID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Um91dGUgJiYgdHlwZW9mIGN1cnJlbnRSb3V0ZS5wYXJhbXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50Um91dGUucGFyYW1zKSB7XG4gICAgICAgICAgaWYgKCEoa2V5IGluIGxvY2F0aW9uLnBhcmFtcykgJiYgcGFyYW1OYW1lcy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgICAgICAgbG9jYXRpb24ucGFyYW1zW2tleV0gPSBjdXJyZW50Um91dGUucGFyYW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvY2F0aW9uLnBhdGggPSBmaWxsUGFyYW1zKHJlY29yZC5wYXRoLCBsb2NhdGlvbi5wYXJhbXMsIChcIm5hbWVkIHJvdXRlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShyZWNvcmQsIGxvY2F0aW9uLCByZWRpcmVjdGVkRnJvbSlcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnBhdGgpIHtcbiAgICAgIGxvY2F0aW9uLnBhcmFtcyA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGF0aCA9IHBhdGhMaXN0W2ldO1xuICAgICAgICB2YXIgcmVjb3JkJDEgPSBwYXRoTWFwW3BhdGhdO1xuICAgICAgICBpZiAobWF0Y2hSb3V0ZShyZWNvcmQkMS5yZWdleCwgbG9jYXRpb24ucGF0aCwgbG9jYXRpb24ucGFyYW1zKSkge1xuICAgICAgICAgIHJldHVybiBfY3JlYXRlUm91dGUocmVjb3JkJDEsIGxvY2F0aW9uLCByZWRpcmVjdGVkRnJvbSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaFxuICAgIHJldHVybiBfY3JlYXRlUm91dGUobnVsbCwgbG9jYXRpb24pXG4gIH1cblxuICBmdW5jdGlvbiByZWRpcmVjdCAoXG4gICAgcmVjb3JkLFxuICAgIGxvY2F0aW9uXG4gICkge1xuICAgIHZhciBvcmlnaW5hbFJlZGlyZWN0ID0gcmVjb3JkLnJlZGlyZWN0O1xuICAgIHZhciByZWRpcmVjdCA9IHR5cGVvZiBvcmlnaW5hbFJlZGlyZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9yaWdpbmFsUmVkaXJlY3QoY3JlYXRlUm91dGUocmVjb3JkLCBsb2NhdGlvbiwgbnVsbCwgcm91dGVyKSlcbiAgICAgIDogb3JpZ2luYWxSZWRpcmVjdDtcblxuICAgIGlmICh0eXBlb2YgcmVkaXJlY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZWRpcmVjdCA9IHsgcGF0aDogcmVkaXJlY3QgfTtcbiAgICB9XG5cbiAgICBpZiAoIXJlZGlyZWN0IHx8IHR5cGVvZiByZWRpcmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgZmFsc2UsIChcImludmFsaWQgcmVkaXJlY3Qgb3B0aW9uOiBcIiArIChKU09OLnN0cmluZ2lmeShyZWRpcmVjdCkpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgICB9XG5cbiAgICB2YXIgcmUgPSByZWRpcmVjdDtcbiAgICB2YXIgbmFtZSA9IHJlLm5hbWU7XG4gICAgdmFyIHBhdGggPSByZS5wYXRoO1xuICAgIHZhciBxdWVyeSA9IGxvY2F0aW9uLnF1ZXJ5O1xuICAgIHZhciBoYXNoID0gbG9jYXRpb24uaGFzaDtcbiAgICB2YXIgcGFyYW1zID0gbG9jYXRpb24ucGFyYW1zO1xuICAgIHF1ZXJ5ID0gcmUuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5JykgPyByZS5xdWVyeSA6IHF1ZXJ5O1xuICAgIGhhc2ggPSByZS5oYXNPd25Qcm9wZXJ0eSgnaGFzaCcpID8gcmUuaGFzaCA6IGhhc2g7XG4gICAgcGFyYW1zID0gcmUuaGFzT3duUHJvcGVydHkoJ3BhcmFtcycpID8gcmUucGFyYW1zIDogcGFyYW1zO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIC8vIHJlc29sdmVkIG5hbWVkIGRpcmVjdFxuICAgICAgdmFyIHRhcmdldFJlY29yZCA9IG5hbWVNYXBbbmFtZV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhc3NlcnQodGFyZ2V0UmVjb3JkLCAoXCJyZWRpcmVjdCBmYWlsZWQ6IG5hbWVkIHJvdXRlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgbm90IGZvdW5kLlwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2goe1xuICAgICAgICBfbm9ybWFsaXplZDogdHJ1ZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfSwgdW5kZWZpbmVkLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKHBhdGgpIHtcbiAgICAgIC8vIDEuIHJlc29sdmUgcmVsYXRpdmUgcmVkaXJlY3RcbiAgICAgIHZhciByYXdQYXRoID0gcmVzb2x2ZVJlY29yZFBhdGgocGF0aCwgcmVjb3JkKTtcbiAgICAgIC8vIDIuIHJlc29sdmUgcGFyYW1zXG4gICAgICB2YXIgcmVzb2x2ZWRQYXRoID0gZmlsbFBhcmFtcyhyYXdQYXRoLCBwYXJhbXMsIChcInJlZGlyZWN0IHJvdXRlIHdpdGggcGF0aCBcXFwiXCIgKyByYXdQYXRoICsgXCJcXFwiXCIpKTtcbiAgICAgIC8vIDMuIHJlbWF0Y2ggd2l0aCBleGlzdGluZyBxdWVyeSBhbmQgaGFzaFxuICAgICAgcmV0dXJuIG1hdGNoKHtcbiAgICAgICAgX25vcm1hbGl6ZWQ6IHRydWUsXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICBoYXNoOiBoYXNoXG4gICAgICB9LCB1bmRlZmluZWQsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKGZhbHNlLCAoXCJpbnZhbGlkIHJlZGlyZWN0IG9wdGlvbjogXCIgKyAoSlNPTi5zdHJpbmdpZnkocmVkaXJlY3QpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhbGlhcyAoXG4gICAgcmVjb3JkLFxuICAgIGxvY2F0aW9uLFxuICAgIG1hdGNoQXNcbiAgKSB7XG4gICAgdmFyIGFsaWFzZWRQYXRoID0gZmlsbFBhcmFtcyhtYXRjaEFzLCBsb2NhdGlvbi5wYXJhbXMsIChcImFsaWFzZWQgcm91dGUgd2l0aCBwYXRoIFxcXCJcIiArIG1hdGNoQXMgKyBcIlxcXCJcIikpO1xuICAgIHZhciBhbGlhc2VkTWF0Y2ggPSBtYXRjaCh7XG4gICAgICBfbm9ybWFsaXplZDogdHJ1ZSxcbiAgICAgIHBhdGg6IGFsaWFzZWRQYXRoXG4gICAgfSk7XG4gICAgaWYgKGFsaWFzZWRNYXRjaCkge1xuICAgICAgdmFyIG1hdGNoZWQgPSBhbGlhc2VkTWF0Y2gubWF0Y2hlZDtcbiAgICAgIHZhciBhbGlhc2VkUmVjb3JkID0gbWF0Y2hlZFttYXRjaGVkLmxlbmd0aCAtIDFdO1xuICAgICAgbG9jYXRpb24ucGFyYW1zID0gYWxpYXNlZE1hdGNoLnBhcmFtcztcbiAgICAgIHJldHVybiBfY3JlYXRlUm91dGUoYWxpYXNlZFJlY29yZCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBfY3JlYXRlUm91dGUobnVsbCwgbG9jYXRpb24pXG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlUm91dGUgKFxuICAgIHJlY29yZCxcbiAgICBsb2NhdGlvbixcbiAgICByZWRpcmVjdGVkRnJvbVxuICApIHtcbiAgICBpZiAocmVjb3JkICYmIHJlY29yZC5yZWRpcmVjdCkge1xuICAgICAgcmV0dXJuIHJlZGlyZWN0KHJlY29yZCwgcmVkaXJlY3RlZEZyb20gfHwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChyZWNvcmQgJiYgcmVjb3JkLm1hdGNoQXMpIHtcbiAgICAgIHJldHVybiBhbGlhcyhyZWNvcmQsIGxvY2F0aW9uLCByZWNvcmQubWF0Y2hBcylcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlKHJlY29yZCwgbG9jYXRpb24sIHJlZGlyZWN0ZWRGcm9tLCByb3V0ZXIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBhZGRSb3V0ZXM6IGFkZFJvdXRlc1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoUm91dGUgKFxuICByZWdleCxcbiAgcGF0aCxcbiAgcGFyYW1zXG4pIHtcbiAgdmFyIG0gPSBwYXRoLm1hdGNoKHJlZ2V4KTtcblxuICBpZiAoIW0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxLCBsZW4gPSBtLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIGtleSA9IHJlZ2V4LmtleXNbaSAtIDFdO1xuICAgIHZhciB2YWwgPSB0eXBlb2YgbVtpXSA9PT0gJ3N0cmluZycgPyBkZWNvZGVVUklDb21wb25lbnQobVtpXSkgOiBtW2ldO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIC8vIEZpeCAjMTk5NDogdXNpbmcgKiB3aXRoIHByb3BzOiB0cnVlIGdlbmVyYXRlcyBhIHBhcmFtIG5hbWVkIDBcbiAgICAgIHBhcmFtc1trZXkubmFtZSB8fCAncGF0aE1hdGNoJ10gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlY29yZFBhdGggKHBhdGgsIHJlY29yZCkge1xuICByZXR1cm4gcmVzb2x2ZVBhdGgocGF0aCwgcmVjb3JkLnBhcmVudCA/IHJlY29yZC5wYXJlbnQucGF0aCA6ICcvJywgdHJ1ZSlcbn1cblxuLyogICovXG5cbi8vIHVzZSBVc2VyIFRpbWluZyBhcGkgKGlmIHByZXNlbnQpIGZvciBtb3JlIGFjY3VyYXRlIGtleSBwcmVjaXNpb25cbnZhciBUaW1lID1cbiAgaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93XG4gICAgPyB3aW5kb3cucGVyZm9ybWFuY2VcbiAgICA6IERhdGU7XG5cbmZ1bmN0aW9uIGdlblN0YXRlS2V5ICgpIHtcbiAgcmV0dXJuIFRpbWUubm93KCkudG9GaXhlZCgzKVxufVxuXG52YXIgX2tleSA9IGdlblN0YXRlS2V5KCk7XG5cbmZ1bmN0aW9uIGdldFN0YXRlS2V5ICgpIHtcbiAgcmV0dXJuIF9rZXlcbn1cblxuZnVuY3Rpb24gc2V0U3RhdGVLZXkgKGtleSkge1xuICByZXR1cm4gKF9rZXkgPSBrZXkpXG59XG5cbi8qICAqL1xuXG52YXIgcG9zaXRpb25TdG9yZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIHNldHVwU2Nyb2xsICgpIHtcbiAgLy8gRml4IGZvciAjMTU4NSBmb3IgRmlyZWZveFxuICAvLyBGaXggZm9yICMyMTk1IEFkZCBvcHRpb25hbCB0aGlyZCBhdHRyaWJ1dGUgdG8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBzYWZhcmkgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MjY3OFxuICAvLyBGaXggZm9yICMyNzc0IFN1cHBvcnQgZm9yIGFwcHMgbG9hZGVkIGZyb20gV2luZG93cyBmaWxlIHNoYXJlcyBub3QgbWFwcGVkIHRvIG5ldHdvcmsgZHJpdmVzOiByZXBsYWNlZCBsb2NhdGlvbi5vcmlnaW4gd2l0aFxuICAvLyB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RcbiAgLy8gbG9jYXRpb24uaG9zdCBjb250YWlucyB0aGUgcG9ydCBhbmQgbG9jYXRpb24uaG9zdG5hbWUgZG9lc24ndFxuICB2YXIgcHJvdG9jb2xBbmRQYXRoID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICB2YXIgYWJzb2x1dGVQYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShwcm90b2NvbEFuZFBhdGgsICcnKTtcbiAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBnZXRTdGF0ZUtleSgpIH0sICcnLCBhYnNvbHV0ZVBhdGgpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmdW5jdGlvbiAoZSkge1xuICAgIHNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAgIGlmIChlLnN0YXRlICYmIGUuc3RhdGUua2V5KSB7XG4gICAgICBzZXRTdGF0ZUtleShlLnN0YXRlLmtleSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Nyb2xsIChcbiAgcm91dGVyLFxuICB0byxcbiAgZnJvbSxcbiAgaXNQb3Bcbikge1xuICBpZiAoIXJvdXRlci5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiZWhhdmlvciA9IHJvdXRlci5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO1xuICBpZiAoIWJlaGF2aW9yKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydCh0eXBlb2YgYmVoYXZpb3IgPT09ICdmdW5jdGlvbicsIFwic2Nyb2xsQmVoYXZpb3IgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgLy8gd2FpdCB1bnRpbCByZS1yZW5kZXIgZmluaXNoZXMgYmVmb3JlIHNjcm9sbGluZ1xuICByb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB2YXIgc2hvdWxkU2Nyb2xsID0gYmVoYXZpb3IuY2FsbChcbiAgICAgIHJvdXRlcixcbiAgICAgIHRvLFxuICAgICAgZnJvbSxcbiAgICAgIGlzUG9wID8gcG9zaXRpb24gOiBudWxsXG4gICAgKTtcblxuICAgIGlmICghc2hvdWxkU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNob3VsZFNjcm9sbC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzaG91bGRTY3JvbGxcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNob3VsZFNjcm9sbCkge1xuICAgICAgICAgIHNjcm9sbFRvUG9zaXRpb24oKHNob3VsZFNjcm9sbCksIHBvc2l0aW9uKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBlcnIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbihzaG91bGRTY3JvbGwsIHBvc2l0aW9uKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlU2Nyb2xsUG9zaXRpb24gKCkge1xuICB2YXIga2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgaWYgKGtleSkge1xuICAgIHBvc2l0aW9uU3RvcmVba2V5XSA9IHtcbiAgICAgIHg6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24gKCkge1xuICB2YXIga2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBwb3NpdGlvblN0b3JlW2tleV1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50UG9zaXRpb24gKGVsLCBvZmZzZXQpIHtcbiAgdmFyIGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgZG9jUmVjdCA9IGRvY0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgeDogZWxSZWN0LmxlZnQgLSBkb2NSZWN0LmxlZnQgLSBvZmZzZXQueCxcbiAgICB5OiBlbFJlY3QudG9wIC0gZG9jUmVjdC50b3AgLSBvZmZzZXQueVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRQb3NpdGlvbiAob2JqKSB7XG4gIHJldHVybiBpc051bWJlcihvYmoueCkgfHwgaXNOdW1iZXIob2JqLnkpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc2l0aW9uIChvYmopIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBpc051bWJlcihvYmoueCkgPyBvYmoueCA6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICB5OiBpc051bWJlcihvYmoueSkgPyBvYmoueSA6IHdpbmRvdy5wYWdlWU9mZnNldFxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCAob2JqKSB7XG4gIHJldHVybiB7XG4gICAgeDogaXNOdW1iZXIob2JqLngpID8gb2JqLnggOiAwLFxuICAgIHk6IGlzTnVtYmVyKG9iai55KSA/IG9iai55IDogMFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyICh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcidcbn1cblxudmFyIGhhc2hTdGFydHNXaXRoTnVtYmVyUkUgPSAvXiNcXGQvO1xuXG5mdW5jdGlvbiBzY3JvbGxUb1Bvc2l0aW9uIChzaG91bGRTY3JvbGwsIHBvc2l0aW9uKSB7XG4gIHZhciBpc09iamVjdCA9IHR5cGVvZiBzaG91bGRTY3JvbGwgPT09ICdvYmplY3QnO1xuICBpZiAoaXNPYmplY3QgJiYgdHlwZW9mIHNob3VsZFNjcm9sbC5zZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBnZXRFbGVtZW50QnlJZCB3b3VsZCBzdGlsbCBmYWlsIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyBhIG1vcmUgY29tcGxpY2F0ZWQgcXVlcnkgbGlrZSAjbWFpbltkYXRhLWF0dHJdXG4gICAgLy8gYnV0IGF0IHRoZSBzYW1lIHRpbWUsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHNlbGVjdCBhbiBlbGVtZW50IHdpdGggYW4gaWQgYW5kIGFuIGV4dHJhIHNlbGVjdG9yXG4gICAgdmFyIGVsID0gaGFzaFN0YXJ0c1dpdGhOdW1iZXJSRS50ZXN0KHNob3VsZFNjcm9sbC5zZWxlY3RvcikgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNob3VsZFNjcm9sbC5zZWxlY3Rvci5zbGljZSgxKSkgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2hvdWxkU2Nyb2xsLnNlbGVjdG9yKTtcblxuICAgIGlmIChlbCkge1xuICAgICAgdmFyIG9mZnNldCA9XG4gICAgICAgIHNob3VsZFNjcm9sbC5vZmZzZXQgJiYgdHlwZW9mIHNob3VsZFNjcm9sbC5vZmZzZXQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBzaG91bGRTY3JvbGwub2Zmc2V0XG4gICAgICAgICAgOiB7fTtcbiAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldChvZmZzZXQpO1xuICAgICAgcG9zaXRpb24gPSBnZXRFbGVtZW50UG9zaXRpb24oZWwsIG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkUG9zaXRpb24oc2hvdWxkU2Nyb2xsKSkge1xuICAgICAgcG9zaXRpb24gPSBub3JtYWxpemVQb3NpdGlvbihzaG91bGRTY3JvbGwpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCAmJiBpc1ZhbGlkUG9zaXRpb24oc2hvdWxkU2Nyb2xsKSkge1xuICAgIHBvc2l0aW9uID0gbm9ybWFsaXplUG9zaXRpb24oc2hvdWxkU2Nyb2xsKTtcbiAgfVxuXG4gIGlmIChwb3NpdGlvbikge1xuICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHN1cHBvcnRzUHVzaFN0YXRlID1cbiAgaW5Ccm93c2VyICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICBpZiAoXG4gICAgICAodWEuaW5kZXhPZignQW5kcm9pZCAyLicpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdBbmRyb2lkIDQuMCcpICE9PSAtMSkgJiZcbiAgICAgIHVhLmluZGV4T2YoJ01vYmlsZSBTYWZhcmknKSAhPT0gLTEgJiZcbiAgICAgIHVhLmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSAmJlxuICAgICAgdWEuaW5kZXhPZignV2luZG93cyBQaG9uZScpID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5XG4gIH0pKCk7XG5cbmZ1bmN0aW9uIHB1c2hTdGF0ZSAodXJsLCByZXBsYWNlKSB7XG4gIHNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAvLyB0cnkuLi5jYXRjaCB0aGUgcHVzaFN0YXRlIGNhbGwgdG8gZ2V0IGFyb3VuZCBTYWZhcmlcbiAgLy8gRE9NIEV4Y2VwdGlvbiAxOCB3aGVyZSBpdCBsaW1pdHMgdG8gMTAwIHB1c2hTdGF0ZSBjYWxsc1xuICB2YXIgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xuICB0cnkge1xuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGtleTogZ2V0U3RhdGVLZXkoKSB9LCAnJywgdXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBrZXk6IHNldFN0YXRlS2V5KGdlblN0YXRlS2V5KCkpIH0sICcnLCB1cmwpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHdpbmRvdy5sb2NhdGlvbltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2Fzc2lnbiddKHVybCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVN0YXRlICh1cmwpIHtcbiAgcHVzaFN0YXRlKHVybCwgdHJ1ZSk7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBydW5RdWV1ZSAocXVldWUsIGZuLCBjYikge1xuICB2YXIgc3RlcCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA+PSBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChxdWV1ZVtpbmRleF0pIHtcbiAgICAgICAgZm4ocXVldWVbaW5kZXhdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RlcChpbmRleCArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ZXAoaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHN0ZXAoMCk7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnRzIChtYXRjaGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIG5leHQpIHtcbiAgICB2YXIgaGFzQXN5bmMgPSBmYWxzZTtcbiAgICB2YXIgcGVuZGluZyA9IDA7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIGZsYXRNYXBDb21wb25lbnRzKG1hdGNoZWQsIGZ1bmN0aW9uIChkZWYsIF8sIG1hdGNoLCBrZXkpIHtcbiAgICAgIC8vIGlmIGl0J3MgYSBmdW5jdGlvbiBhbmQgZG9lc24ndCBoYXZlIGNpZCBhdHRhY2hlZCxcbiAgICAgIC8vIGFzc3VtZSBpdCdzIGFuIGFzeW5jIGNvbXBvbmVudCByZXNvbHZlIGZ1bmN0aW9uLlxuICAgICAgLy8gd2UgYXJlIG5vdCB1c2luZyBWdWUncyBkZWZhdWx0IGFzeW5jIHJlc29sdmluZyBtZWNoYW5pc20gYmVjYXVzZVxuICAgICAgLy8gd2Ugd2FudCB0byBoYWx0IHRoZSBuYXZpZ2F0aW9uIHVudGlsIHRoZSBpbmNvbWluZyBjb21wb25lbnQgaGFzIGJlZW5cbiAgICAgIC8vIHJlc29sdmVkLlxuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZGVmLmNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhhc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgcGVuZGluZysrO1xuXG4gICAgICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzb2x2ZWREZWYpIHtcbiAgICAgICAgICBpZiAoaXNFU01vZHVsZShyZXNvbHZlZERlZikpIHtcbiAgICAgICAgICAgIHJlc29sdmVkRGVmID0gcmVzb2x2ZWREZWYuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc2F2ZSByZXNvbHZlZCBvbiBhc3luYyBmYWN0b3J5IGluIGNhc2UgaXQncyB1c2VkIGVsc2V3aGVyZVxuICAgICAgICAgIGRlZi5yZXNvbHZlZCA9IHR5cGVvZiByZXNvbHZlZERlZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyByZXNvbHZlZERlZlxuICAgICAgICAgICAgOiBfVnVlLmV4dGVuZChyZXNvbHZlZERlZik7XG4gICAgICAgICAgbWF0Y2guY29tcG9uZW50c1trZXldID0gcmVzb2x2ZWREZWY7XG4gICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgIGlmIChwZW5kaW5nIDw9IDApIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQgXCIgKyBrZXkgKyBcIjogXCIgKyByZWFzb247XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKGZhbHNlLCBtc2cpO1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gaXNFcnJvcihyZWFzb24pXG4gICAgICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzID0gZGVmKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5ldyBzeW50YXggaW4gVnVlIDIuM1xuICAgICAgICAgICAgdmFyIGNvbXAgPSByZXMuY29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGNvbXAgJiYgdHlwZW9mIGNvbXAudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBjb21wLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaGFzQXN5bmMpIHsgbmV4dCgpOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdE1hcENvbXBvbmVudHMgKFxuICBtYXRjaGVkLFxuICBmblxuKSB7XG4gIHJldHVybiBmbGF0dGVuKG1hdGNoZWQubWFwKGZ1bmN0aW9uIChtKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG0uY29tcG9uZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGZuKFxuICAgICAgbS5jb21wb25lbnRzW2tleV0sXG4gICAgICBtLmluc3RhbmNlc1trZXldLFxuICAgICAgbSwga2V5XG4gICAgKTsgfSlcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4gKGFycikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxuZnVuY3Rpb24gaXNFU01vZHVsZSAob2JqKSB7XG4gIHJldHVybiBvYmouX19lc01vZHVsZSB8fCAoaGFzU3ltYm9sICYmIG9ialtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJylcbn1cblxuLy8gaW4gV2VicGFjayAyLCByZXF1aXJlLmVuc3VyZSBub3cgYWxzbyByZXR1cm5zIGEgUHJvbWlzZVxuLy8gc28gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBtYXkgZ2V0IGNhbGxlZCBhbiBleHRyYSB0aW1lXG4vLyBpZiB0aGUgdXNlciB1c2VzIGFuIGFycm93IGZ1bmN0aW9uIHNob3J0aGFuZCB0aGF0IGhhcHBlbnMgdG9cbi8vIHJldHVybiB0aGF0IFByb21pc2UuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgaWYgKGNhbGxlZCkgeyByZXR1cm4gfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH1cbn1cblxudmFyIE5hdmlnYXRpb25EdXBsaWNhdGVkID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRXJyb3IpIHtcbiAgZnVuY3Rpb24gTmF2aWdhdGlvbkR1cGxpY2F0ZWQgKG5vcm1hbGl6ZWRMb2NhdGlvbikge1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5fbmFtZSA9ICdOYXZpZ2F0aW9uRHVwbGljYXRlZCc7XG4gICAgLy8gcGFzc2luZyB0aGUgbWVzc2FnZSB0byBzdXBlcigpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIHRoZSB0cmFuc3BpbGVkIHZlcnNpb25cbiAgICB0aGlzLm1lc3NhZ2UgPSBcIk5hdmlnYXRpbmcgdG8gY3VycmVudCBsb2NhdGlvbiAoXFxcIlwiICsgKG5vcm1hbGl6ZWRMb2NhdGlvbi5mdWxsUGF0aCkgKyBcIlxcXCIpIGlzIG5vdCBhbGxvd2VkXCI7XG4gICAgLy8gYWRkIGEgc3RhY2sgcHJvcGVydHkgc28gc2VydmljZXMgbGlrZSBTZW50cnkgY2FuIGNvcnJlY3RseSBkaXNwbGF5IGl0XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdGFjaycsIHtcbiAgICAgIHZhbHVlOiBuZXcgRXJyb3IoKS5zdGFjayxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gd2UgY291bGQgYWxzbyBoYXZlIHVzZWRcbiAgICAvLyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKVxuICAgIC8vIGJ1dCBpdCBvbmx5IGV4aXN0cyBvbiBub2RlIGFuZCBjaHJvbWVcbiAgfVxuXG4gIGlmICggRXJyb3IgKSBOYXZpZ2F0aW9uRHVwbGljYXRlZC5fX3Byb3RvX18gPSBFcnJvcjtcbiAgTmF2aWdhdGlvbkR1cGxpY2F0ZWQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXJyb3IgJiYgRXJyb3IucHJvdG90eXBlICk7XG4gIE5hdmlnYXRpb25EdXBsaWNhdGVkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5hdmlnYXRpb25EdXBsaWNhdGVkO1xuXG4gIHJldHVybiBOYXZpZ2F0aW9uRHVwbGljYXRlZDtcbn0oRXJyb3IpKTtcblxuLy8gc3VwcG9ydCBJRTlcbk5hdmlnYXRpb25EdXBsaWNhdGVkLl9uYW1lID0gJ05hdmlnYXRpb25EdXBsaWNhdGVkJztcblxuLyogICovXG5cbnZhciBIaXN0b3J5ID0gZnVuY3Rpb24gSGlzdG9yeSAocm91dGVyLCBiYXNlKSB7XG4gIHRoaXMucm91dGVyID0gcm91dGVyO1xuICB0aGlzLmJhc2UgPSBub3JtYWxpemVCYXNlKGJhc2UpO1xuICAvLyBzdGFydCB3aXRoIGEgcm91dGUgb2JqZWN0IHRoYXQgc3RhbmRzIGZvciBcIm5vd2hlcmVcIlxuICB0aGlzLmN1cnJlbnQgPSBTVEFSVDtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICB0aGlzLnJlYWR5Q2JzID0gW107XG4gIHRoaXMucmVhZHlFcnJvckNicyA9IFtdO1xuICB0aGlzLmVycm9yQ2JzID0gW107XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4gKGNiKSB7XG4gIHRoaXMuY2IgPSBjYjtcbn07XG5cbkhpc3RvcnkucHJvdG90eXBlLm9uUmVhZHkgPSBmdW5jdGlvbiBvblJlYWR5IChjYiwgZXJyb3JDYikge1xuICBpZiAodGhpcy5yZWFkeSkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZWFkeUNicy5wdXNoKGNiKTtcbiAgICBpZiAoZXJyb3JDYikge1xuICAgICAgdGhpcy5yZWFkeUVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG4gICAgfVxuICB9XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gb25FcnJvciAoZXJyb3JDYikge1xuICB0aGlzLmVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS50cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiB0cmFuc2l0aW9uVG8gKFxuICBsb2NhdGlvbixcbiAgb25Db21wbGV0ZSxcbiAgb25BYm9ydFxuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHJvdXRlID0gdGhpcy5yb3V0ZXIubWF0Y2gobG9jYXRpb24sIHRoaXMuY3VycmVudCk7XG4gIHRoaXMuY29uZmlybVRyYW5zaXRpb24oXG4gICAgcm91dGUsXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcyQxLnVwZGF0ZVJvdXRlKHJvdXRlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB0aGlzJDEuZW5zdXJlVVJMKCk7XG5cbiAgICAgIC8vIGZpcmUgcmVhZHkgY2JzIG9uY2VcbiAgICAgIGlmICghdGhpcyQxLnJlYWR5KSB7XG4gICAgICAgIHRoaXMkMS5yZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMkMS5yZWFkeUNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgIGNiKHJvdXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAob25BYm9ydCkge1xuICAgICAgICBvbkFib3J0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyICYmICF0aGlzJDEucmVhZHkpIHtcbiAgICAgICAgdGhpcyQxLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcyQxLnJlYWR5RXJyb3JDYnMuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5jb25maXJtVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIGNvbmZpcm1UcmFuc2l0aW9uIChyb3V0ZSwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICB2YXIgYWJvcnQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLy8gYWZ0ZXIgbWVyZ2luZyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9wdWxsLzI3NzEgd2VcbiAgICAvLyBXaGVuIHRoZSB1c2VyIG5hdmlnYXRlcyB0aHJvdWdoIGhpc3RvcnkgdGhyb3VnaCBiYWNrL2ZvcndhcmQgYnV0dG9uc1xuICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIHRocm93IHRoZSBlcnJvci4gV2Ugb25seSB0aHJvdyBpdCBpZiBkaXJlY3RseSBjYWxsaW5nXG4gICAgLy8gcHVzaC9yZXBsYWNlLiBUaGF0J3Mgd2h5IGl0J3Mgbm90IGluY2x1ZGVkIGluIGlzRXJyb3JcbiAgICBpZiAoIWlzRXh0ZW5kZWRFcnJvcihOYXZpZ2F0aW9uRHVwbGljYXRlZCwgZXJyKSAmJiBpc0Vycm9yKGVycikpIHtcbiAgICAgIGlmICh0aGlzJDEuZXJyb3JDYnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMkMS5lcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihmYWxzZSwgJ3VuY2F1Z2h0IGVycm9yIGR1cmluZyByb3V0ZSBuYXZpZ2F0aW9uOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIG9uQWJvcnQgJiYgb25BYm9ydChlcnIpO1xuICB9O1xuICBpZiAoXG4gICAgaXNTYW1lUm91dGUocm91dGUsIGN1cnJlbnQpICYmXG4gICAgLy8gaW4gdGhlIGNhc2UgdGhlIHJvdXRlIG1hcCBoYXMgYmVlbiBkeW5hbWljYWxseSBhcHBlbmRlZCB0b1xuICAgIHJvdXRlLm1hdGNoZWQubGVuZ3RoID09PSBjdXJyZW50Lm1hdGNoZWQubGVuZ3RoXG4gICkge1xuICAgIHRoaXMuZW5zdXJlVVJMKCk7XG4gICAgcmV0dXJuIGFib3J0KG5ldyBOYXZpZ2F0aW9uRHVwbGljYXRlZChyb3V0ZSkpXG4gIH1cblxuICB2YXIgcmVmID0gcmVzb2x2ZVF1ZXVlKFxuICAgIHRoaXMuY3VycmVudC5tYXRjaGVkLFxuICAgIHJvdXRlLm1hdGNoZWRcbiAgKTtcbiAgICB2YXIgdXBkYXRlZCA9IHJlZi51cGRhdGVkO1xuICAgIHZhciBkZWFjdGl2YXRlZCA9IHJlZi5kZWFjdGl2YXRlZDtcbiAgICB2YXIgYWN0aXZhdGVkID0gcmVmLmFjdGl2YXRlZDtcblxuICB2YXIgcXVldWUgPSBbXS5jb25jYXQoXG4gICAgLy8gaW4tY29tcG9uZW50IGxlYXZlIGd1YXJkc1xuICAgIGV4dHJhY3RMZWF2ZUd1YXJkcyhkZWFjdGl2YXRlZCksXG4gICAgLy8gZ2xvYmFsIGJlZm9yZSBob29rc1xuICAgIHRoaXMucm91dGVyLmJlZm9yZUhvb2tzLFxuICAgIC8vIGluLWNvbXBvbmVudCB1cGRhdGUgaG9va3NcbiAgICBleHRyYWN0VXBkYXRlSG9va3ModXBkYXRlZCksXG4gICAgLy8gaW4tY29uZmlnIGVudGVyIGd1YXJkc1xuICAgIGFjdGl2YXRlZC5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0uYmVmb3JlRW50ZXI7IH0pLFxuICAgIC8vIGFzeW5jIGNvbXBvbmVudHNcbiAgICByZXNvbHZlQXN5bmNDb21wb25lbnRzKGFjdGl2YXRlZClcbiAgKTtcblxuICB0aGlzLnBlbmRpbmcgPSByb3V0ZTtcbiAgdmFyIGl0ZXJhdG9yID0gZnVuY3Rpb24gKGhvb2ssIG5leHQpIHtcbiAgICBpZiAodGhpcyQxLnBlbmRpbmcgIT09IHJvdXRlKSB7XG4gICAgICByZXR1cm4gYWJvcnQoKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgaG9vayhyb3V0ZSwgY3VycmVudCwgZnVuY3Rpb24gKHRvKSB7XG4gICAgICAgIGlmICh0byA9PT0gZmFsc2UgfHwgaXNFcnJvcih0bykpIHtcbiAgICAgICAgICAvLyBuZXh0KGZhbHNlKSAtPiBhYm9ydCBuYXZpZ2F0aW9uLCBlbnN1cmUgY3VycmVudCBVUkxcbiAgICAgICAgICB0aGlzJDEuZW5zdXJlVVJMKHRydWUpO1xuICAgICAgICAgIGFib3J0KHRvKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdG8gPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgKHR5cGVvZiB0byA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICh0eXBlb2YgdG8ucGF0aCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRvLm5hbWUgPT09ICdzdHJpbmcnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gbmV4dCgnLycpIG9yIG5leHQoeyBwYXRoOiAnLycgfSkgLT4gcmVkaXJlY3RcbiAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdG8gPT09ICdvYmplY3QnICYmIHRvLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMkMS5yZXBsYWNlKHRvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcyQxLnB1c2godG8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25maXJtIHRyYW5zaXRpb24gYW5kIHBhc3Mgb24gdGhlIHZhbHVlXG4gICAgICAgICAgbmV4dCh0byk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFib3J0KGUpO1xuICAgIH1cbiAgfTtcblxuICBydW5RdWV1ZShxdWV1ZSwgaXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcG9zdEVudGVyQ2JzID0gW107XG4gICAgdmFyIGlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuY3VycmVudCA9PT0gcm91dGU7IH07XG4gICAgLy8gd2FpdCB1bnRpbCBhc3luYyBjb21wb25lbnRzIGFyZSByZXNvbHZlZCBiZWZvcmVcbiAgICAvLyBleHRyYWN0aW5nIGluLWNvbXBvbmVudCBlbnRlciBndWFyZHNcbiAgICB2YXIgZW50ZXJHdWFyZHMgPSBleHRyYWN0RW50ZXJHdWFyZHMoYWN0aXZhdGVkLCBwb3N0RW50ZXJDYnMsIGlzVmFsaWQpO1xuICAgIHZhciBxdWV1ZSA9IGVudGVyR3VhcmRzLmNvbmNhdCh0aGlzJDEucm91dGVyLnJlc29sdmVIb29rcyk7XG4gICAgcnVuUXVldWUocXVldWUsIGl0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcyQxLnBlbmRpbmcgIT09IHJvdXRlKSB7XG4gICAgICAgIHJldHVybiBhYm9ydCgpXG4gICAgICB9XG4gICAgICB0aGlzJDEucGVuZGluZyA9IG51bGw7XG4gICAgICBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIGlmICh0aGlzJDEucm91dGVyLmFwcCkge1xuICAgICAgICB0aGlzJDEucm91dGVyLmFwcC4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBvc3RFbnRlckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuSGlzdG9yeS5wcm90b3R5cGUudXBkYXRlUm91dGUgPSBmdW5jdGlvbiB1cGRhdGVSb3V0ZSAocm91dGUpIHtcbiAgdmFyIHByZXYgPSB0aGlzLmN1cnJlbnQ7XG4gIHRoaXMuY3VycmVudCA9IHJvdXRlO1xuICB0aGlzLmNiICYmIHRoaXMuY2Iocm91dGUpO1xuICB0aGlzLnJvdXRlci5hZnRlckhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICBob29rICYmIGhvb2socm91dGUsIHByZXYpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJhc2UgKGJhc2UpIHtcbiAgaWYgKCFiYXNlKSB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgLy8gcmVzcGVjdCA8YmFzZT4gdGFnXG4gICAgICB2YXIgYmFzZUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xuICAgICAgYmFzZSA9IChiYXNlRWwgJiYgYmFzZUVsLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB8fCAnLyc7XG4gICAgICAvLyBzdHJpcCBmdWxsIFVSTCBvcmlnaW5cbiAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2UoL15odHRwcz86XFwvXFwvW15cXC9dKy8sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZSA9ICcvJztcbiAgICB9XG4gIH1cbiAgLy8gbWFrZSBzdXJlIHRoZXJlJ3MgdGhlIHN0YXJ0aW5nIHNsYXNoXG4gIGlmIChiYXNlLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgYmFzZSA9ICcvJyArIGJhc2U7XG4gIH1cbiAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIHJldHVybiBiYXNlLnJlcGxhY2UoL1xcLyQvLCAnJylcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVF1ZXVlIChcbiAgY3VycmVudCxcbiAgbmV4dFxuKSB7XG4gIHZhciBpO1xuICB2YXIgbWF4ID0gTWF0aC5tYXgoY3VycmVudC5sZW5ndGgsIG5leHQubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7XG4gICAgaWYgKGN1cnJlbnRbaV0gIT09IG5leHRbaV0pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdXBkYXRlZDogbmV4dC5zbGljZSgwLCBpKSxcbiAgICBhY3RpdmF0ZWQ6IG5leHQuc2xpY2UoaSksXG4gICAgZGVhY3RpdmF0ZWQ6IGN1cnJlbnQuc2xpY2UoaSlcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0R3VhcmRzIChcbiAgcmVjb3JkcyxcbiAgbmFtZSxcbiAgYmluZCxcbiAgcmV2ZXJzZVxuKSB7XG4gIHZhciBndWFyZHMgPSBmbGF0TWFwQ29tcG9uZW50cyhyZWNvcmRzLCBmdW5jdGlvbiAoZGVmLCBpbnN0YW5jZSwgbWF0Y2gsIGtleSkge1xuICAgIHZhciBndWFyZCA9IGV4dHJhY3RHdWFyZChkZWYsIG5hbWUpO1xuICAgIGlmIChndWFyZCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZ3VhcmQpXG4gICAgICAgID8gZ3VhcmQubWFwKGZ1bmN0aW9uIChndWFyZCkgeyByZXR1cm4gYmluZChndWFyZCwgaW5zdGFuY2UsIG1hdGNoLCBrZXkpOyB9KVxuICAgICAgICA6IGJpbmQoZ3VhcmQsIGluc3RhbmNlLCBtYXRjaCwga2V5KVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmbGF0dGVuKHJldmVyc2UgPyBndWFyZHMucmV2ZXJzZSgpIDogZ3VhcmRzKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0R3VhcmQgKFxuICBkZWYsXG4gIGtleVxuKSB7XG4gIGlmICh0eXBlb2YgZGVmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gZXh0ZW5kIG5vdyBzbyB0aGF0IGdsb2JhbCBtaXhpbnMgYXJlIGFwcGxpZWQuXG4gICAgZGVmID0gX1Z1ZS5leHRlbmQoZGVmKTtcbiAgfVxuICByZXR1cm4gZGVmLm9wdGlvbnNba2V5XVxufVxuXG5mdW5jdGlvbiBleHRyYWN0TGVhdmVHdWFyZHMgKGRlYWN0aXZhdGVkKSB7XG4gIHJldHVybiBleHRyYWN0R3VhcmRzKGRlYWN0aXZhdGVkLCAnYmVmb3JlUm91dGVMZWF2ZScsIGJpbmRHdWFyZCwgdHJ1ZSlcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFVwZGF0ZUhvb2tzICh1cGRhdGVkKSB7XG4gIHJldHVybiBleHRyYWN0R3VhcmRzKHVwZGF0ZWQsICdiZWZvcmVSb3V0ZVVwZGF0ZScsIGJpbmRHdWFyZClcbn1cblxuZnVuY3Rpb24gYmluZEd1YXJkIChndWFyZCwgaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kUm91dGVHdWFyZCAoKSB7XG4gICAgICByZXR1cm4gZ3VhcmQuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVudGVyR3VhcmRzIChcbiAgYWN0aXZhdGVkLFxuICBjYnMsXG4gIGlzVmFsaWRcbikge1xuICByZXR1cm4gZXh0cmFjdEd1YXJkcyhcbiAgICBhY3RpdmF0ZWQsXG4gICAgJ2JlZm9yZVJvdXRlRW50ZXInLFxuICAgIGZ1bmN0aW9uIChndWFyZCwgXywgbWF0Y2gsIGtleSkge1xuICAgICAgcmV0dXJuIGJpbmRFbnRlckd1YXJkKGd1YXJkLCBtYXRjaCwga2V5LCBjYnMsIGlzVmFsaWQpXG4gICAgfVxuICApXG59XG5cbmZ1bmN0aW9uIGJpbmRFbnRlckd1YXJkIChcbiAgZ3VhcmQsXG4gIG1hdGNoLFxuICBrZXksXG4gIGNicyxcbiAgaXNWYWxpZFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiByb3V0ZUVudGVyR3VhcmQgKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgcmV0dXJuIGd1YXJkKHRvLCBmcm9tLCBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2JzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICM3NTBcbiAgICAgICAgICAvLyBpZiBhIHJvdXRlci12aWV3IGlzIHdyYXBwZWQgd2l0aCBhbiBvdXQtaW4gdHJhbnNpdGlvbixcbiAgICAgICAgICAvLyB0aGUgaW5zdGFuY2UgbWF5IG5vdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBhdCB0aGlzIHRpbWUuXG4gICAgICAgICAgLy8gd2Ugd2lsbCBuZWVkIHRvIHBvbGwgZm9yIHJlZ2lzdHJhdGlvbiB1bnRpbCBjdXJyZW50IHJvdXRlXG4gICAgICAgICAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAgICAgIHBvbGwoY2IsIG1hdGNoLmluc3RhbmNlcywga2V5LCBpc1ZhbGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBuZXh0KGNiKTtcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvbGwgKFxuICBjYiwgLy8gc29tZWhvdyBmbG93IGNhbm5vdCBpbmZlciB0aGlzIGlzIGEgZnVuY3Rpb25cbiAgaW5zdGFuY2VzLFxuICBrZXksXG4gIGlzVmFsaWRcbikge1xuICBpZiAoXG4gICAgaW5zdGFuY2VzW2tleV0gJiZcbiAgICAhaW5zdGFuY2VzW2tleV0uX2lzQmVpbmdEZXN0cm95ZWQgLy8gZG8gbm90IHJldXNlIGJlaW5nIGRlc3Ryb3llZCBpbnN0YW5jZVxuICApIHtcbiAgICBjYihpbnN0YW5jZXNba2V5XSk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZCgpKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBwb2xsKGNiLCBpbnN0YW5jZXMsIGtleSwgaXNWYWxpZCk7XG4gICAgfSwgMTYpO1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgSFRNTDVIaXN0b3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSGlzdG9yeSkge1xuICBmdW5jdGlvbiBIVE1MNUhpc3RvcnkgKHJvdXRlciwgYmFzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG5cbiAgICB2YXIgZXhwZWN0U2Nyb2xsID0gcm91dGVyLm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3I7XG4gICAgdmFyIHN1cHBvcnRzU2Nyb2xsID0gc3VwcG9ydHNQdXNoU3RhdGUgJiYgZXhwZWN0U2Nyb2xsO1xuXG4gICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICBzZXR1cFNjcm9sbCgpO1xuICAgIH1cblxuICAgIHZhciBpbml0TG9jYXRpb24gPSBnZXRMb2NhdGlvbih0aGlzLmJhc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMkMS5jdXJyZW50O1xuXG4gICAgICAvLyBBdm9pZGluZyBmaXJzdCBgcG9wc3RhdGVgIGV2ZW50IGRpc3BhdGNoZWQgaW4gc29tZSBicm93c2VycyBidXQgZmlyc3RcbiAgICAgIC8vIGhpc3Rvcnkgcm91dGUgbm90IHVwZGF0ZWQgc2luY2UgYXN5bmMgZ3VhcmQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgIHZhciBsb2NhdGlvbiA9IGdldExvY2F0aW9uKHRoaXMkMS5iYXNlKTtcbiAgICAgIGlmICh0aGlzJDEuY3VycmVudCA9PT0gU1RBUlQgJiYgbG9jYXRpb24gPT09IGluaXRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcyQxLnRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbCkge1xuICAgICAgICAgIGhhbmRsZVNjcm9sbChyb3V0ZXIsIHJvdXRlLCBjdXJyZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIEhpc3RvcnkgKSBIVE1MNUhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEhpc3RvcnkgJiYgSGlzdG9yeS5wcm90b3R5cGUgKTtcbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhUTUw1SGlzdG9yeTtcblxuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbiAgfTtcblxuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgdmFyIGZyb21Sb3V0ZSA9IHJlZi5jdXJyZW50O1xuICAgIHRoaXMudHJhbnNpdGlvblRvKGxvY2F0aW9uLCBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgIHB1c2hTdGF0ZShjbGVhblBhdGgodGhpcyQxLmJhc2UgKyByb3V0ZS5mdWxsUGF0aCkpO1xuICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgfSwgb25BYm9ydCk7XG4gIH07XG5cbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZWYgPSB0aGlzO1xuICAgIHZhciBmcm9tUm91dGUgPSByZWYuY3VycmVudDtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICByZXBsYWNlU3RhdGUoY2xlYW5QYXRoKHRoaXMkMS5iYXNlICsgcm91dGUuZnVsbFBhdGgpKTtcbiAgICAgIGhhbmRsZVNjcm9sbCh0aGlzJDEucm91dGVyLCByb3V0ZSwgZnJvbVJvdXRlLCBmYWxzZSk7XG4gICAgICBvbkNvbXBsZXRlICYmIG9uQ29tcGxldGUocm91dGUpO1xuICAgIH0sIG9uQWJvcnQpO1xuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMIChwdXNoKSB7XG4gICAgaWYgKGdldExvY2F0aW9uKHRoaXMuYmFzZSkgIT09IHRoaXMuY3VycmVudC5mdWxsUGF0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBjbGVhblBhdGgodGhpcy5iYXNlICsgdGhpcy5jdXJyZW50LmZ1bGxQYXRoKTtcbiAgICAgIHB1c2ggPyBwdXNoU3RhdGUoY3VycmVudCkgOiByZXBsYWNlU3RhdGUoY3VycmVudCk7XG4gICAgfVxuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuZ2V0Q3VycmVudExvY2F0aW9uID0gZnVuY3Rpb24gZ2V0Q3VycmVudExvY2F0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0TG9jYXRpb24odGhpcy5iYXNlKVxuICB9O1xuXG4gIHJldHVybiBIVE1MNUhpc3Rvcnk7XG59KEhpc3RvcnkpKTtcblxuZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGJhc2UpIHtcbiAgdmFyIHBhdGggPSBkZWNvZGVVUkkod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgaWYgKGJhc2UgJiYgcGF0aC5pbmRleE9mKGJhc2UpID09PSAwKSB7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpO1xuICB9XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoXG59XG5cbi8qICAqL1xuXG52YXIgSGFzaEhpc3RvcnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChIaXN0b3J5KSB7XG4gIGZ1bmN0aW9uIEhhc2hIaXN0b3J5IChyb3V0ZXIsIGJhc2UsIGZhbGxiYWNrKSB7XG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG4gICAgLy8gY2hlY2sgaGlzdG9yeSBmYWxsYmFjayBkZWVwbGlua2luZ1xuICAgIGlmIChmYWxsYmFjayAmJiBjaGVja0ZhbGxiYWNrKHRoaXMuYmFzZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlbnN1cmVTbGFzaCgpO1xuICB9XG5cbiAgaWYgKCBIaXN0b3J5ICkgSGFzaEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSGlzdG9yeSAmJiBIaXN0b3J5LnByb3RvdHlwZSApO1xuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIYXNoSGlzdG9yeTtcblxuICAvLyB0aGlzIGlzIGRlbGF5ZWQgdW50aWwgdGhlIGFwcCBtb3VudHNcbiAgLy8gdG8gYXZvaWQgdGhlIGhhc2hjaGFuZ2UgbGlzdGVuZXIgYmVpbmcgZmlyZWQgdG9vIGVhcmx5XG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldHVwTGlzdGVuZXJzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjtcbiAgICB2YXIgZXhwZWN0U2Nyb2xsID0gcm91dGVyLm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3I7XG4gICAgdmFyIHN1cHBvcnRzU2Nyb2xsID0gc3VwcG9ydHNQdXNoU3RhdGUgJiYgZXhwZWN0U2Nyb2xsO1xuXG4gICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICBzZXR1cFNjcm9sbCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgc3VwcG9ydHNQdXNoU3RhdGUgPyAncG9wc3RhdGUnIDogJ2hhc2hjaGFuZ2UnLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMkMS5jdXJyZW50O1xuICAgICAgICBpZiAoIWVuc3VyZVNsYXNoKCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzJDEudHJhbnNpdGlvblRvKGdldEhhc2goKSwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICAgICAgICBoYW5kbGVTY3JvbGwodGhpcyQxLnJvdXRlciwgcm91dGUsIGN1cnJlbnQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1cHBvcnRzUHVzaFN0YXRlKSB7XG4gICAgICAgICAgICByZXBsYWNlSGFzaChyb3V0ZS5mdWxsUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZWYgPSB0aGlzO1xuICAgIHZhciBmcm9tUm91dGUgPSByZWYuY3VycmVudDtcbiAgICB0aGlzLnRyYW5zaXRpb25UbyhcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIHB1c2hIYXNoKHJvdXRlLmZ1bGxQYXRoKTtcbiAgICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UgKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmVmID0gdGhpcztcbiAgICB2YXIgZnJvbVJvdXRlID0gcmVmLmN1cnJlbnQ7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICByZXBsYWNlSGFzaChyb3V0ZS5mdWxsUGF0aCk7XG4gICAgICAgIGhhbmRsZVNjcm9sbCh0aGlzJDEucm91dGVyLCByb3V0ZSwgZnJvbVJvdXRlLCBmYWxzZSk7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMIChwdXNoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQuZnVsbFBhdGg7XG4gICAgaWYgKGdldEhhc2goKSAhPT0gY3VycmVudCkge1xuICAgICAgcHVzaCA/IHB1c2hIYXNoKGN1cnJlbnQpIDogcmVwbGFjZUhhc2goY3VycmVudCk7XG4gICAgfVxuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRDdXJyZW50TG9jYXRpb24gKCkge1xuICAgIHJldHVybiBnZXRIYXNoKClcbiAgfTtcblxuICByZXR1cm4gSGFzaEhpc3Rvcnk7XG59KEhpc3RvcnkpKTtcblxuZnVuY3Rpb24gY2hlY2tGYWxsYmFjayAoYmFzZSkge1xuICB2YXIgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihiYXNlKTtcbiAgaWYgKCEvXlxcLyMvLnRlc3QobG9jYXRpb24pKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoY2xlYW5QYXRoKGJhc2UgKyAnLyMnICsgbG9jYXRpb24pKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVNsYXNoICgpIHtcbiAgdmFyIHBhdGggPSBnZXRIYXNoKCk7XG4gIGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXBsYWNlSGFzaCgnLycgKyBwYXRoKTtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGdldEhhc2ggKCkge1xuICAvLyBXZSBjYW4ndCB1c2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggaGVyZSBiZWNhdXNlIGl0J3Mgbm90XG4gIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzIC0gRmlyZWZveCB3aWxsIHByZS1kZWNvZGUgaXQhXG4gIHZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHZhciBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpO1xuICAvLyBlbXB0eSBwYXRoXG4gIGlmIChpbmRleCA8IDApIHsgcmV0dXJuICcnIH1cblxuICBocmVmID0gaHJlZi5zbGljZShpbmRleCArIDEpO1xuICAvLyBkZWNvZGUgdGhlIGhhc2ggYnV0IG5vdCB0aGUgc2VhcmNoIG9yIGhhc2hcbiAgLy8gYXMgc2VhcmNoKHF1ZXJ5KSBpcyBhbHJlYWR5IGRlY29kZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzI3MDhcbiAgdmFyIHNlYXJjaEluZGV4ID0gaHJlZi5pbmRleE9mKCc/Jyk7XG4gIGlmIChzZWFyY2hJbmRleCA8IDApIHtcbiAgICB2YXIgaGFzaEluZGV4ID0gaHJlZi5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2hJbmRleCA+IC0xKSB7XG4gICAgICBocmVmID0gZGVjb2RlVVJJKGhyZWYuc2xpY2UoMCwgaGFzaEluZGV4KSkgKyBocmVmLnNsaWNlKGhhc2hJbmRleCk7XG4gICAgfSBlbHNlIHsgaHJlZiA9IGRlY29kZVVSSShocmVmKTsgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZWFyY2hJbmRleCA+IC0xKSB7XG4gICAgICBocmVmID0gZGVjb2RlVVJJKGhyZWYuc2xpY2UoMCwgc2VhcmNoSW5kZXgpKSArIGhyZWYuc2xpY2Uoc2VhcmNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBocmVmXG59XG5cbmZ1bmN0aW9uIGdldFVybCAocGF0aCkge1xuICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB2YXIgaSA9IGhyZWYuaW5kZXhPZignIycpO1xuICB2YXIgYmFzZSA9IGkgPj0gMCA/IGhyZWYuc2xpY2UoMCwgaSkgOiBocmVmO1xuICByZXR1cm4gKGJhc2UgKyBcIiNcIiArIHBhdGgpXG59XG5cbmZ1bmN0aW9uIHB1c2hIYXNoIChwYXRoKSB7XG4gIGlmIChzdXBwb3J0c1B1c2hTdGF0ZSkge1xuICAgIHB1c2hTdGF0ZShnZXRVcmwocGF0aCkpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gcGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzaCAocGF0aCkge1xuICBpZiAoc3VwcG9ydHNQdXNoU3RhdGUpIHtcbiAgICByZXBsYWNlU3RhdGUoZ2V0VXJsKHBhdGgpKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShnZXRVcmwocGF0aCkpO1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgQWJzdHJhY3RIaXN0b3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSGlzdG9yeSkge1xuICBmdW5jdGlvbiBBYnN0cmFjdEhpc3RvcnkgKHJvdXRlciwgYmFzZSkge1xuICAgIEhpc3RvcnkuY2FsbCh0aGlzLCByb3V0ZXIsIGJhc2UpO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLmluZGV4ID0gLTE7XG4gIH1cblxuICBpZiAoIEhpc3RvcnkgKSBBYnN0cmFjdEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEhpc3RvcnkgJiYgSGlzdG9yeS5wcm90b3R5cGUgKTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFic3RyYWN0SGlzdG9yeTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICB0aGlzJDEuc3RhY2sgPSB0aGlzJDEuc3RhY2suc2xpY2UoMCwgdGhpcyQxLmluZGV4ICsgMSkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgdGhpcyQxLmluZGV4Kys7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMudHJhbnNpdGlvblRvKFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgICAgdGhpcyQxLnN0YWNrID0gdGhpcyQxLnN0YWNrLnNsaWNlKDAsIHRoaXMkMS5pbmRleCkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuaW5kZXggKyBuO1xuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gdGhpcy5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgcm91dGUgPSB0aGlzLnN0YWNrW3RhcmdldEluZGV4XTtcbiAgICB0aGlzLmNvbmZpcm1UcmFuc2l0aW9uKFxuICAgICAgcm91dGUsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMkMS5pbmRleCA9IHRhcmdldEluZGV4O1xuICAgICAgICB0aGlzJDEudXBkYXRlUm91dGUocm91dGUpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRXh0ZW5kZWRFcnJvcihOYXZpZ2F0aW9uRHVwbGljYXRlZCwgZXJyKSkge1xuICAgICAgICAgIHRoaXMkMS5pbmRleCA9IHRhcmdldEluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLmdldEN1cnJlbnRMb2NhdGlvbiA9IGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGN1cnJlbnQgPyBjdXJyZW50LmZ1bGxQYXRoIDogJy8nXG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5lbnN1cmVVUkwgPSBmdW5jdGlvbiBlbnN1cmVVUkwgKCkge1xuICAgIC8vIG5vb3BcbiAgfTtcblxuICByZXR1cm4gQWJzdHJhY3RIaXN0b3J5O1xufShIaXN0b3J5KSk7XG5cbi8qICAqL1xuXG5cblxudmFyIFZ1ZVJvdXRlciA9IGZ1bmN0aW9uIFZ1ZVJvdXRlciAob3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICB0aGlzLmFwcCA9IG51bGw7XG4gIHRoaXMuYXBwcyA9IFtdO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLmJlZm9yZUhvb2tzID0gW107XG4gIHRoaXMucmVzb2x2ZUhvb2tzID0gW107XG4gIHRoaXMuYWZ0ZXJIb29rcyA9IFtdO1xuICB0aGlzLm1hdGNoZXIgPSBjcmVhdGVNYXRjaGVyKG9wdGlvbnMucm91dGVzIHx8IFtdLCB0aGlzKTtcblxuICB2YXIgbW9kZSA9IG9wdGlvbnMubW9kZSB8fCAnaGFzaCc7XG4gIHRoaXMuZmFsbGJhY2sgPSBtb2RlID09PSAnaGlzdG9yeScgJiYgIXN1cHBvcnRzUHVzaFN0YXRlICYmIG9wdGlvbnMuZmFsbGJhY2sgIT09IGZhbHNlO1xuICBpZiAodGhpcy5mYWxsYmFjaykge1xuICAgIG1vZGUgPSAnaGFzaCc7XG4gIH1cbiAgaWYgKCFpbkJyb3dzZXIpIHtcbiAgICBtb2RlID0gJ2Fic3RyYWN0JztcbiAgfVxuICB0aGlzLm1vZGUgPSBtb2RlO1xuXG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhUTUw1SGlzdG9yeSh0aGlzLCBvcHRpb25zLmJhc2UpO1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdoYXNoJzpcbiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIYXNoSGlzdG9yeSh0aGlzLCBvcHRpb25zLmJhc2UsIHRoaXMuZmFsbGJhY2spO1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdhYnN0cmFjdCc6XG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgQWJzdHJhY3RIaXN0b3J5KHRoaXMsIG9wdGlvbnMuYmFzZSk7XG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIChcImludmFsaWQgbW9kZTogXCIgKyBtb2RlKSk7XG4gICAgICB9XG4gIH1cbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGN1cnJlbnRSb3V0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2ggKFxuICByYXcsXG4gIGN1cnJlbnQsXG4gIHJlZGlyZWN0ZWRGcm9tXG4pIHtcbiAgcmV0dXJuIHRoaXMubWF0Y2hlci5tYXRjaChyYXcsIGN1cnJlbnQsIHJlZGlyZWN0ZWRGcm9tKVxufTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmN1cnJlbnRSb3V0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmhpc3RvcnkgJiYgdGhpcy5oaXN0b3J5LmN1cnJlbnRcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIGluaXQgKGFwcCAvKiBWdWUgY29tcG9uZW50IGluc3RhbmNlICovKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhc3NlcnQoXG4gICAgaW5zdGFsbC5pbnN0YWxsZWQsXG4gICAgXCJub3QgaW5zdGFsbGVkLiBNYWtlIHN1cmUgdG8gY2FsbCBgVnVlLnVzZShWdWVSb3V0ZXIpYCBcIiArXG4gICAgXCJiZWZvcmUgY3JlYXRpbmcgcm9vdCBpbnN0YW5jZS5cIlxuICApO1xuXG4gIHRoaXMuYXBwcy5wdXNoKGFwcCk7XG5cbiAgLy8gc2V0IHVwIGFwcCBkZXN0cm95ZWQgaGFuZGxlclxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMjYzOVxuICBhcHAuJG9uY2UoJ2hvb2s6ZGVzdHJveWVkJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIGNsZWFuIG91dCBhcHAgZnJvbSB0aGlzLmFwcHMgYXJyYXkgb25jZSBkZXN0cm95ZWRcbiAgICB2YXIgaW5kZXggPSB0aGlzJDEuYXBwcy5pbmRleE9mKGFwcCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHsgdGhpcyQxLmFwcHMuc3BsaWNlKGluZGV4LCAxKTsgfVxuICAgIC8vIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGEgbWFpbiBhcHAgb3IgbnVsbCBpZiBubyBhcHBzXG4gICAgLy8gd2UgZG8gbm90IHJlbGVhc2UgdGhlIHJvdXRlciBzbyBpdCBjYW4gYmUgcmV1c2VkXG4gICAgaWYgKHRoaXMkMS5hcHAgPT09IGFwcCkgeyB0aGlzJDEuYXBwID0gdGhpcyQxLmFwcHNbMF0gfHwgbnVsbDsgfVxuICB9KTtcblxuICAvLyBtYWluIGFwcCBwcmV2aW91c2x5IGluaXRpYWxpemVkXG4gIC8vIHJldHVybiBhcyB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBuZXcgaGlzdG9yeSBsaXN0ZW5lclxuICBpZiAodGhpcy5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMuYXBwID0gYXBwO1xuXG4gIHZhciBoaXN0b3J5ID0gdGhpcy5oaXN0b3J5O1xuXG4gIGlmIChoaXN0b3J5IGluc3RhbmNlb2YgSFRNTDVIaXN0b3J5KSB7XG4gICAgaGlzdG9yeS50cmFuc2l0aW9uVG8oaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSk7XG4gIH0gZWxzZSBpZiAoaGlzdG9yeSBpbnN0YW5jZW9mIEhhc2hIaXN0b3J5KSB7XG4gICAgdmFyIHNldHVwSGFzaExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGlzdG9yeS5zZXR1cExpc3RlbmVycygpO1xuICAgIH07XG4gICAgaGlzdG9yeS50cmFuc2l0aW9uVG8oXG4gICAgICBoaXN0b3J5LmdldEN1cnJlbnRMb2NhdGlvbigpLFxuICAgICAgc2V0dXBIYXNoTGlzdGVuZXIsXG4gICAgICBzZXR1cEhhc2hMaXN0ZW5lclxuICAgICk7XG4gIH1cblxuICBoaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAocm91dGUpIHtcbiAgICB0aGlzJDEuYXBwcy5mb3JFYWNoKGZ1bmN0aW9uIChhcHApIHtcbiAgICAgIGFwcC5fcm91dGUgPSByb3V0ZTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmJlZm9yZUVhY2ggPSBmdW5jdGlvbiBiZWZvcmVFYWNoIChmbikge1xuICByZXR1cm4gcmVnaXN0ZXJIb29rKHRoaXMuYmVmb3JlSG9va3MsIGZuKVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5iZWZvcmVSZXNvbHZlID0gZnVuY3Rpb24gYmVmb3JlUmVzb2x2ZSAoZm4pIHtcbiAgcmV0dXJuIHJlZ2lzdGVySG9vayh0aGlzLnJlc29sdmVIb29rcywgZm4pXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmFmdGVyRWFjaCA9IGZ1bmN0aW9uIGFmdGVyRWFjaCAoZm4pIHtcbiAgcmV0dXJuIHJlZ2lzdGVySG9vayh0aGlzLmFmdGVySG9va3MsIGZuKVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5vblJlYWR5ID0gZnVuY3Rpb24gb25SZWFkeSAoY2IsIGVycm9yQ2IpIHtcbiAgdGhpcy5oaXN0b3J5Lm9uUmVhZHkoY2IsIGVycm9yQ2IpO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gb25FcnJvciAoZXJyb3JDYikge1xuICB0aGlzLmhpc3Rvcnkub25FcnJvcihlcnJvckNiKTtcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghb25Db21wbGV0ZSAmJiAhb25BYm9ydCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdGhpcyQxLmhpc3RvcnkucHVzaChsb2NhdGlvbiwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuaGlzdG9yeS5wdXNoKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KTtcbiAgfVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgaWYgKCFvbkNvbXBsZXRlICYmICFvbkFib3J0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0aGlzJDEuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5oaXN0b3J5LnJlcGxhY2UobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpO1xuICB9XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgdGhpcy5oaXN0b3J5LmdvKG4pO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5iYWNrID0gZnVuY3Rpb24gYmFjayAoKSB7XG4gIHRoaXMuZ28oLTEpO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gZm9yd2FyZCAoKSB7XG4gIHRoaXMuZ28oMSk7XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmdldE1hdGNoZWRDb21wb25lbnRzID0gZnVuY3Rpb24gZ2V0TWF0Y2hlZENvbXBvbmVudHMgKHRvKSB7XG4gIHZhciByb3V0ZSA9IHRvXG4gICAgPyB0by5tYXRjaGVkXG4gICAgICA/IHRvXG4gICAgICA6IHRoaXMucmVzb2x2ZSh0bykucm91dGVcbiAgICA6IHRoaXMuY3VycmVudFJvdXRlO1xuICBpZiAoIXJvdXRlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgcm91dGUubWF0Y2hlZC5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobS5jb21wb25lbnRzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIG0uY29tcG9uZW50c1trZXldXG4gICAgfSlcbiAgfSkpXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlIChcbiAgdG8sXG4gIGN1cnJlbnQsXG4gIGFwcGVuZFxuKSB7XG4gIGN1cnJlbnQgPSBjdXJyZW50IHx8IHRoaXMuaGlzdG9yeS5jdXJyZW50O1xuICB2YXIgbG9jYXRpb24gPSBub3JtYWxpemVMb2NhdGlvbihcbiAgICB0byxcbiAgICBjdXJyZW50LFxuICAgIGFwcGVuZCxcbiAgICB0aGlzXG4gICk7XG4gIHZhciByb3V0ZSA9IHRoaXMubWF0Y2gobG9jYXRpb24sIGN1cnJlbnQpO1xuICB2YXIgZnVsbFBhdGggPSByb3V0ZS5yZWRpcmVjdGVkRnJvbSB8fCByb3V0ZS5mdWxsUGF0aDtcbiAgdmFyIGJhc2UgPSB0aGlzLmhpc3RvcnkuYmFzZTtcbiAgdmFyIGhyZWYgPSBjcmVhdGVIcmVmKGJhc2UsIGZ1bGxQYXRoLCB0aGlzLm1vZGUpO1xuICByZXR1cm4ge1xuICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICByb3V0ZTogcm91dGUsXG4gICAgaHJlZjogaHJlZixcbiAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdFxuICAgIG5vcm1hbGl6ZWRUbzogbG9jYXRpb24sXG4gICAgcmVzb2x2ZWQ6IHJvdXRlXG4gIH1cbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuYWRkUm91dGVzID0gZnVuY3Rpb24gYWRkUm91dGVzIChyb3V0ZXMpIHtcbiAgdGhpcy5tYXRjaGVyLmFkZFJvdXRlcyhyb3V0ZXMpO1xuICBpZiAodGhpcy5oaXN0b3J5LmN1cnJlbnQgIT09IFNUQVJUKSB7XG4gICAgdGhpcy5oaXN0b3J5LnRyYW5zaXRpb25Ubyh0aGlzLmhpc3RvcnkuZ2V0Q3VycmVudExvY2F0aW9uKCkpO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVnVlUm91dGVyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVySG9vayAobGlzdCwgZm4pIHtcbiAgbGlzdC5wdXNoKGZuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaSA9IGxpc3QuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgPiAtMSkgeyBsaXN0LnNwbGljZShpLCAxKTsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhyZWYgKGJhc2UsIGZ1bGxQYXRoLCBtb2RlKSB7XG4gIHZhciBwYXRoID0gbW9kZSA9PT0gJ2hhc2gnID8gJyMnICsgZnVsbFBhdGggOiBmdWxsUGF0aDtcbiAgcmV0dXJuIGJhc2UgPyBjbGVhblBhdGgoYmFzZSArICcvJyArIHBhdGgpIDogcGF0aFxufVxuXG5WdWVSb3V0ZXIuaW5zdGFsbCA9IGluc3RhbGw7XG5WdWVSb3V0ZXIudmVyc2lvbiA9ICczLjEuMyc7XG5cbmlmIChpbkJyb3dzZXIgJiYgd2luZG93LlZ1ZSkge1xuICB3aW5kb3cuVnVlLnVzZShWdWVSb3V0ZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBWdWVSb3V0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=scss& ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"07db42f3\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\", function() {\n var newContent = __webpack_require__(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT8wNjJmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9BcHAudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmbGFuZz1zY3NzJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCIwN2RiNDJmM1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPXNjc3MmXCIsIGZ1bmN0aW9uKCkge1xuICAgICB2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPXNjc3MmXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
\**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4d682107\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\", function() {\n var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT8xNmNkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zYjRmMzVhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciBhZGQgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXNDbGllbnQuanNcIikuZGVmYXVsdFxudmFyIHVwZGF0ZSA9IGFkZChcIjRkNjgyMTA3XCIsIGNvbnRlbnQsIGZhbHNlLCB7XCJzb3VyY2VNYXBcIjpmYWxzZSxcInNoYWRvd01vZGVcIjpmYWxzZX0pO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuIC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG4gaWYoIWNvbnRlbnQubG9jYWxzKSB7XG4gICBtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9M2I0ZjM1YWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zYjRmMzVhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"63df74aa\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\", function() {\n var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/ZDk1NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZm9vdGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPWY2NzhmYzIyJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiNjNkZjc0YWFcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3568dd4b\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\", function() {\n var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/OWVlNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaGVhZGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTZmYmE4ZGFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiMzU2OGRkNGJcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4f0b2316\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\", function() {\n var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlP2MxMTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MDRjNTVlMmYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI0ZjBiMjMxNlwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MDRjNTVlMmYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"c0b7fb5c\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n module.hot.accept(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\", function() {\n var newContent = __webpack_require__(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n update(newContent);\n });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MTEwNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCJjMGI3ZmI1Y1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTFiYWRjODAxJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js":
/*!**************************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js ***!
\**************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return addStylesClient; });\n/* harmony import */ var _listToStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./listToStyles */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js\");\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n Modified by Evan You @yyx990803\n*/\n\n\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n if (!hasDocument) {\n throw new Error(\n 'vue-style-loader cannot be used in a non-browser environment. ' +\n \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n ) }\n}\n\n/*\ntype StyleObject = {\n id: number;\n parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n css: string;\n media: string;\n sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n [id: number]: {\n id: number,\n refs: number,\n parts: Array<(obj?: StyleObjectPart) => void>\n }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nfunction addStylesClient (parentId, list, _isProduction, _options) {\n isProduction = _isProduction\n\n options = _options || {}\n\n var styles = Object(_listToStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(parentId, list)\n addStylesToDom(styles)\n\n return function update (newList) {\n var mayRemove = []\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n domStyle.refs--\n mayRemove.push(domStyle)\n }\n if (newList) {\n styles = Object(_listToStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(parentId, newList)\n addStylesToDom(styles)\n } else {\n styles = []\n }\n for (var i = 0; i < mayRemove.length; i++) {\n var domStyle = mayRemove[i]\n if (domStyle.refs === 0) {\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j]()\n }\n delete stylesInDom[domStyle.id]\n }\n }\n }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i]\n var domStyle = stylesInDom[item.id]\n if (domStyle) {\n domStyle.refs++\n for (var j = 0; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j])\n }\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j]))\n }\n if (domStyle.parts.length > item.parts.length) {\n domStyle.parts.length = item.parts.length\n }\n } else {\n var parts = []\n for (var j = 0; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j]))\n }\n stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n }\n }\n}\n\nfunction createStyleElement () {\n var styleElement = document.createElement('style')\n styleElement.type = 'text/css'\n head.appendChild(styleElement)\n return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n var update, remove\n var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n if (styleElement) {\n if (isProduction) {\n // has SSR styles and in production mode.\n // simply do nothing.\n return noop\n } else {\n // has SSR styles but in dev mode.\n // for some reason Chrome can't handle source map in server-rendered\n // style tags - source maps in <style> only works if the style tag is\n // created and inserted dynamically. So we remove the server rendered\n // styles and inject new ones.\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n if (isOldIE) {\n // use singleton mode for IE9.\n var styleIndex = singletonCounter++\n styleElement = singletonElement || (singletonElement = createStyleElement())\n update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n } else {\n // use multi-style-tag mode in all other cases\n styleElement = createStyleElement()\n update = applyToTag.bind(null, styleElement)\n remove = function () {\n styleElement.parentNode.removeChild(styleElement)\n }\n }\n\n update(obj)\n\n return function updateStyle (newObj /* StyleObjectPart */) {\n if (newObj) {\n if (newObj.css === obj.css &&\n newObj.media === obj.media &&\n newObj.sourceMap === obj.sourceMap) {\n return\n }\n update(obj = newObj)\n } else {\n remove()\n }\n }\n}\n\nvar replaceText = (function () {\n var textStore = []\n\n return function (index, replacement) {\n textStore[index] = replacement\n return textStore.filter(Boolean).join('\\n')\n }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n var css = remove ? '' : obj.css\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = replaceText(index, css)\n } else {\n var cssNode = document.createTextNode(css)\n var childNodes = styleElement.childNodes\n if (childNodes[index]) styleElement.removeChild(childNodes[index])\n if (childNodes.length) {\n styleElement.insertBefore(cssNode, childNodes[index])\n } else {\n styleElement.appendChild(cssNode)\n }\n }\n}\n\nfunction applyToTag (styleElement, obj) {\n var css = obj.css\n var media = obj.media\n var sourceMap = obj.sourceMap\n\n if (media) {\n styleElement.setAttribute('media', media)\n }\n if (options.ssrId) {\n styleElement.setAttribute(ssrIdKey, obj.id)\n }\n\n if (sourceMap) {\n // https://developer.chrome.com/devtools/docs/javascript-debugging\n // this makes source maps inside style tags work properly in Chrome\n css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n // http://stackoverflow.com/a/26603875\n css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n }\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild)\n }\n styleElement.appendChild(document.createTextNode(css))\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qcz84NWNiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiAgTW9kaWZpZWQgYnkgRXZhbiBZb3UgQHl5eDk5MDgwM1xuKi9cblxuaW1wb3J0IGxpc3RUb1N0eWxlcyBmcm9tICcuL2xpc3RUb1N0eWxlcydcblxudmFyIGhhc0RvY3VtZW50ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG5pZiAodHlwZW9mIERFQlVHICE9PSAndW5kZWZpbmVkJyAmJiBERUJVRykge1xuICBpZiAoIWhhc0RvY3VtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2dWUtc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuICcgK1xuICAgIFwiVXNlIHsgdGFyZ2V0OiAnbm9kZScgfSBpbiB5b3VyIFdlYnBhY2sgY29uZmlnIHRvIGluZGljYXRlIGEgc2VydmVyLXJlbmRlcmluZyBlbnZpcm9ubWVudC5cIlxuICApIH1cbn1cblxuLypcbnR5cGUgU3R5bGVPYmplY3QgPSB7XG4gIGlkOiBudW1iZXI7XG4gIHBhcnRzOiBBcnJheTxTdHlsZU9iamVjdFBhcnQ+XG59XG5cbnR5cGUgU3R5bGVPYmplY3RQYXJ0ID0ge1xuICBjc3M6IHN0cmluZztcbiAgbWVkaWE6IHN0cmluZztcbiAgc291cmNlTWFwOiA/c3RyaW5nXG59XG4qL1xuXG52YXIgc3R5bGVzSW5Eb20gPSB7LypcbiAgW2lkOiBudW1iZXJdOiB7XG4gICAgaWQ6IG51bWJlcixcbiAgICByZWZzOiBudW1iZXIsXG4gICAgcGFydHM6IEFycmF5PChvYmo/OiBTdHlsZU9iamVjdFBhcnQpID0+IHZvaWQ+XG4gIH1cbiovfVxuXG52YXIgaGVhZCA9IGhhc0RvY3VtZW50ICYmIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0pXG52YXIgc2luZ2xldG9uRWxlbWVudCA9IG51bGxcbnZhciBzaW5nbGV0b25Db3VudGVyID0gMFxudmFyIGlzUHJvZHVjdGlvbiA9IGZhbHNlXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG52YXIgb3B0aW9ucyA9IG51bGxcbnZhciBzc3JJZEtleSA9ICdkYXRhLXZ1ZS1zc3ItaWQnXG5cbi8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuLy8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxudmFyIGlzT2xkSUUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAvbXNpZSBbNi05XVxcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFN0eWxlc0NsaWVudCAocGFyZW50SWQsIGxpc3QsIF9pc1Byb2R1Y3Rpb24sIF9vcHRpb25zKSB7XG4gIGlzUHJvZHVjdGlvbiA9IF9pc1Byb2R1Y3Rpb25cblxuICBvcHRpb25zID0gX29wdGlvbnMgfHwge31cblxuICB2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKHBhcmVudElkLCBsaXN0KVxuICBhZGRTdHlsZXNUb0RvbShzdHlsZXMpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuICAgIHZhciBtYXlSZW1vdmUgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHN0eWxlc1tpXVxuICAgICAgdmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF1cbiAgICAgIGRvbVN0eWxlLnJlZnMtLVxuICAgICAgbWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpXG4gICAgfVxuICAgIGlmIChuZXdMaXN0KSB7XG4gICAgICBzdHlsZXMgPSBsaXN0VG9TdHlsZXMocGFyZW50SWQsIG5ld0xpc3QpXG4gICAgICBhZGRTdHlsZXNUb0RvbShzdHlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlcyA9IFtdXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV1cbiAgICAgIGlmIChkb21TdHlsZS5yZWZzID09PSAwKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBkb21TdHlsZS5wYXJ0c1tqXSgpXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbSAoc3R5bGVzIC8qIEFycmF5PFN0eWxlT2JqZWN0PiAqLykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gc3R5bGVzW2ldXG4gICAgdmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF1cbiAgICBpZiAoZG9tU3R5bGUpIHtcbiAgICAgIGRvbVN0eWxlLnJlZnMrK1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKVxuICAgICAgfVxuICAgICAgZm9yICg7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSkpXG4gICAgICB9XG4gICAgICBpZiAoZG9tU3R5bGUucGFydHMubGVuZ3RoID4gaXRlbS5wYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgZG9tU3R5bGUucGFydHMubGVuZ3RoID0gaXRlbS5wYXJ0cy5sZW5ndGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnRzID0gW11cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0pKVxuICAgICAgfVxuICAgICAgc3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7IGlkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHMgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQgKCkge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICBzdHlsZUVsZW1lbnQudHlwZSA9ICd0ZXh0L2NzcydcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpXG4gIHJldHVybiBzdHlsZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYWRkU3R5bGUgKG9iaiAvKiBTdHlsZU9iamVjdFBhcnQgKi8pIHtcbiAgdmFyIHVwZGF0ZSwgcmVtb3ZlXG4gIHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdHlsZVsnICsgc3NySWRLZXkgKyAnfj1cIicgKyBvYmouaWQgKyAnXCJdJylcblxuICBpZiAoc3R5bGVFbGVtZW50KSB7XG4gICAgaWYgKGlzUHJvZHVjdGlvbikge1xuICAgICAgLy8gaGFzIFNTUiBzdHlsZXMgYW5kIGluIHByb2R1Y3Rpb24gbW9kZS5cbiAgICAgIC8vIHNpbXBseSBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG5vb3BcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFzIFNTUiBzdHlsZXMgYnV0IGluIGRldiBtb2RlLlxuICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIENocm9tZSBjYW4ndCBoYW5kbGUgc291cmNlIG1hcCBpbiBzZXJ2ZXItcmVuZGVyZWRcbiAgICAgIC8vIHN0eWxlIHRhZ3MgLSBzb3VyY2UgbWFwcyBpbiA8c3R5bGU+IG9ubHkgd29ya3MgaWYgdGhlIHN0eWxlIHRhZyBpc1xuICAgICAgLy8gY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgZHluYW1pY2FsbHkuIFNvIHdlIHJlbW92ZSB0aGUgc2VydmVyIHJlbmRlcmVkXG4gICAgICAvLyBzdHlsZXMgYW5kIGluamVjdCBuZXcgb25lcy5cbiAgICAgIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudClcbiAgICB9XG4gIH1cblxuICBpZiAoaXNPbGRJRSkge1xuICAgIC8vIHVzZSBzaW5nbGV0b24gbW9kZSBmb3IgSUU5LlxuICAgIHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrXG4gICAgc3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpKVxuICAgIHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIGZhbHNlKVxuICAgIHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIHRydWUpXG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIG11bHRpLXN0eWxlLXRhZyBtb2RlIGluIGFsbCBvdGhlciBjYXNlc1xuICAgIHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpXG4gICAgdXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudClcbiAgICByZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKG9iailcblxuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG5ld09iaiAvKiBTdHlsZU9iamVjdFBhcnQgKi8pIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJlxuICAgICAgICAgIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmXG4gICAgICAgICAgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHVwZGF0ZShvYmogPSBuZXdPYmopXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG5cbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXh0U3RvcmUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG4gICAgdGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJylcbiAgfVxufSkoKVxuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZUVsZW1lbnQsIGluZGV4LCByZW1vdmUsIG9iaikge1xuICB2YXIgY3NzID0gcmVtb3ZlID8gJycgOiBvYmouY3NzXG5cbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpXG4gIH0gZWxzZSB7XG4gICAgdmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpXG4gICAgdmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlc1xuICAgIGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKVxuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgc3R5bGVFbGVtZW50Lmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSlcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlRWxlbWVudCwgb2JqKSB7XG4gIHZhciBjc3MgPSBvYmouY3NzXG4gIHZhciBtZWRpYSA9IG9iai5tZWRpYVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcFxuXG4gIGlmIChtZWRpYSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWEpXG4gIH1cbiAgaWYgKG9wdGlvbnMuc3NySWQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKHNzcklkS2V5LCBvYmouaWQpXG4gIH1cblxuICBpZiAoc291cmNlTWFwKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG4gICAgLy8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuICAgIGNzcyArPSAnXFxuLyojIHNvdXJjZVVSTD0nICsgc291cmNlTWFwLnNvdXJjZXNbMF0gKyAnICovJ1xuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XG4gICAgY3NzICs9ICdcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgJyAqLydcbiAgfVxuXG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3NcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZClcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\n");
/***/ }),
/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js":
/*!***********************************************************************************!*\
!*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js ***!
\***********************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return listToStyles; });\n/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nfunction listToStyles (parentId, list) {\n var styles = []\n var newStyles = {}\n for (var i = 0; i < list.length; i++) {\n var item = list[i]\n var id = item[0]\n var css = item[1]\n var media = item[2]\n var sourceMap = item[3]\n var part = {\n id: parentId + ':' + i,\n css: css,\n media: media,\n sourceMap: sourceMap\n }\n if (!newStyles[id]) {\n styles.push(newStyles[id] = { id: id, parts: [part] })\n } else {\n newStyles[id].parts.push(part)\n }\n }\n return styles\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvbGlzdFRvU3R5bGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2xpc3RUb1N0eWxlcy5qcz82MTgxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNsYXRlcyB0aGUgbGlzdCBmb3JtYXQgcHJvZHVjZWQgYnkgY3NzLWxvYWRlciBpbnRvIHNvbWV0aGluZ1xuICogZWFzaWVyIHRvIG1hbmlwdWxhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAocGFyZW50SWQsIGxpc3QpIHtcbiAgdmFyIHN0eWxlcyA9IFtdXG4gIHZhciBuZXdTdHlsZXMgPSB7fVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICB2YXIgaWQgPSBpdGVtWzBdXG4gICAgdmFyIGNzcyA9IGl0ZW1bMV1cbiAgICB2YXIgbWVkaWEgPSBpdGVtWzJdXG4gICAgdmFyIHNvdXJjZU1hcCA9IGl0ZW1bM11cbiAgICB2YXIgcGFydCA9IHtcbiAgICAgIGlkOiBwYXJlbnRJZCArICc6JyArIGksXG4gICAgICBjc3M6IGNzcyxcbiAgICAgIG1lZGlhOiBtZWRpYSxcbiAgICAgIHNvdXJjZU1hcDogc291cmNlTWFwXG4gICAgfVxuICAgIGlmICghbmV3U3R5bGVzW2lkXSkge1xuICAgICAgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHsgaWQ6IGlkLCBwYXJ0czogW3BhcnRdIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVzXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js\n");
/***/ }),
/***/ "./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js":
/*!****************************************************************************************!*\
!*** ./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js ***!
\****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("!function(e,t){ true?module.exports=t(__webpack_require__(/*! video.js */ \"./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js\")):undefined}(this,function(e){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/\",t(t.s=3)}([function(t,n){t.exports=e},function(e,t,n){\"use strict\";function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),o=function(e){return e&&e.__esModule?e:{default:e}}(r),s=window.videojs||o.default;\"function\"!=typeof Object.assign&&Object.defineProperty(Object,\"assign\",{value:function(e,t){if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var n=Object(e),i=1;i<arguments.length;i++){var r=arguments[i];if(null!=r)for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(n[o]=r[o])}return n},writable:!0,configurable:!0});var a=[\"loadeddata\",\"canplay\",\"canplaythrough\",\"play\",\"pause\",\"waiting\",\"playing\",\"ended\",\"error\"];t.default={name:\"video-player\",props:{start:{type:Number,default:0},crossOrigin:{type:String,default:\"\"},playsinline:{type:Boolean,default:!1},customEventName:{type:String,default:\"statechanged\"},options:{type:Object,required:!0},events:{type:Array,default:function(){return[]}},globalOptions:{type:Object,default:function(){return{controls:!0,controlBar:{remainingTimeDisplay:!1,playToggle:{},progressControl:{},fullscreenToggle:{},volumeMenuButton:{inline:!1,vertical:!0}},techOrder:[\"html5\"],plugins:{}}}},globalEvents:{type:Array,default:function(){return[]}}},data:function(){return{player:null,reseted:!0}},mounted:function(){this.player||this.initialize()},beforeDestroy:function(){this.player&&this.dispose()},methods:{initialize:function(){var e=this,t=Object.assign({},this.globalOptions,this.options);this.playsinline&&(this.$refs.video.setAttribute(\"playsinline\",this.playsinline),this.$refs.video.setAttribute(\"webkit-playsinline\",this.playsinline),this.$refs.video.setAttribute(\"x5-playsinline\",this.playsinline),this.$refs.video.setAttribute(\"x5-video-player-type\",\"h5\"),this.$refs.video.setAttribute(\"x5-video-player-fullscreen\",!1)),\"\"!==this.crossOrigin&&(this.$refs.video.crossOrigin=this.crossOrigin,this.$refs.video.setAttribute(\"crossOrigin\",this.crossOrigin));var n=function(t,n){t&&e.$emit(t,e.player),n&&e.$emit(e.customEventName,i({},t,n))};t.plugins&&delete t.plugins.__ob__;var r=this;this.player=s(this.$refs.video,t,function(){for(var e=this,t=a.concat(r.events).concat(r.globalEvents),i={},o=0;o<t.length;o++)\"string\"==typeof t[o]&&void 0===i[t[o]]&&function(t){i[t]=null,e.on(t,function(){n(t,!0)})}(t[o]);this.on(\"timeupdate\",function(){n(\"timeupdate\",this.currentTime())}),r.$emit(\"ready\",this)})},dispose:function(e){var t=this;this.player&&this.player.dispose&&(\"Flash\"!==this.player.techName_&&this.player.pause&&this.player.pause(),this.player.dispose(),this.player=null,this.$nextTick(function(){t.reseted=!1,t.$nextTick(function(){t.reseted=!0,t.$nextTick(function(){e&&e()})})}))}},watch:{options:{deep:!0,handler:function(e,t){var n=this;this.dispose(function(){e&&e.sources&&e.sources.length&&n.initialize()})}}}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(1),r=n.n(i);for(var o in i)[\"default\",\"default\"].indexOf(o)<0&&function(e){n.d(t,e,function(){return i[e]})}(o);var s=n(5),a=n(4),l=a(r.a,s.a,!1,null,null,null);t.default=l.exports},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=t.videoPlayer=t.videojs=void 0;var r=n(0),o=i(r),s=n(2),a=i(s),l=window.videojs||o.default,u=function(e,t){t&&(t.options&&(a.default.props.globalOptions.default=function(){return t.options}),t.events&&(a.default.props.globalEvents.default=function(){return t.events})),e.component(a.default.name,a.default)},d={videojs:l,videoPlayer:a.default,install:u};t.default=d,t.videojs=l,t.videoPlayer=a.default,t.install=u},function(e,t){e.exports=function(e,t,n,i,r,o){var s,a=e=e||{},l=typeof e.default;\"object\"!==l&&\"function\"!==l||(s=e,a=e.default);var u=\"function\"==typeof a?a.options:a;t&&(u.render=t.render,u.staticRenderFns=t.staticRenderFns,u._compiled=!0),n&&(u.functional=!0),r&&(u._scopeId=r);var d;if(o?(d=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(o)},u._ssrRegister=d):i&&(d=i),d){var c=u.functional,f=c?u.render:u.beforeCreate;c?(u._injectStyles=d,u.render=function(e,t){return d.call(t),f(e,t)}):u.beforeCreate=f?[].concat(f,d):[d]}return{esModule:s,exports:a,options:u}}},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.reseted?n(\"div\",{staticClass:\"video-player\"},[n(\"video\",{ref:\"video\",staticClass:\"video-js\"})]):e._e()},r=[],o={render:i,staticRenderFns:r};t.a=o}])});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS12aWRlby1wbGF5ZXJANS4wLjJAdnVlLXZpZGVvLXBsYXllci9kaXN0L3Z1ZS12aWRlby1wbGF5ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Z1ZS12aWRlby1wbGF5ZXJANS4wLjJAdnVlLXZpZGVvLXBsYXllci9kaXN0L3Z1ZS12aWRlby1wbGF5ZXIuanM/ZTI0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJ2aWRlby5qc1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJ2aWRlb2pzXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVnVlVmlkZW9QbGF5ZXI9dChyZXF1aXJlKFwidmlkZW8uanNcIikpOmUuVnVlVmlkZW9QbGF5ZXI9dChlLnZpZGVvanMpfSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGkpe2lmKG5baV0pcmV0dXJuIG5baV0uZXhwb3J0czt2YXIgcj1uW2ldPXtpOmksbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtpXS5jYWxsKHIuZXhwb3J0cyxyLHIuZXhwb3J0cyx0KSxyLmw9ITAsci5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0Lmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZD1mdW5jdGlvbihlLG4saSl7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDppfSl9LHQubj1mdW5jdGlvbihlKXt2YXIgbj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gdC5kKG4sXCJhXCIsbiksbn0sdC5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSx0LnA9XCIvXCIsdCh0LnM9Myl9KFtmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9bigwKSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX0ocikscz13aW5kb3cudmlkZW9qc3x8by5kZWZhdWx0O1wiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsXCJhc3NpZ25cIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3RcIik7Zm9yKHZhciBuPU9iamVjdChlKSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHI9YXJndW1lbnRzW2ldO2lmKG51bGwhPXIpZm9yKHZhciBvIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsbykmJihuW29dPXJbb10pfXJldHVybiBufSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt2YXIgYT1bXCJsb2FkZWRkYXRhXCIsXCJjYW5wbGF5XCIsXCJjYW5wbGF5dGhyb3VnaFwiLFwicGxheVwiLFwicGF1c2VcIixcIndhaXRpbmdcIixcInBsYXlpbmdcIixcImVuZGVkXCIsXCJlcnJvclwiXTt0LmRlZmF1bHQ9e25hbWU6XCJ2aWRlby1wbGF5ZXJcIixwcm9wczp7c3RhcnQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sY3Jvc3NPcmlnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJcIn0scGxheXNpbmxpbmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxjdXN0b21FdmVudE5hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJzdGF0ZWNoYW5nZWRcIn0sb3B0aW9uczp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITB9LGV2ZW50czp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxnbG9iYWxPcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJue2NvbnRyb2xzOiEwLGNvbnRyb2xCYXI6e3JlbWFpbmluZ1RpbWVEaXNwbGF5OiExLHBsYXlUb2dnbGU6e30scHJvZ3Jlc3NDb250cm9sOnt9LGZ1bGxzY3JlZW5Ub2dnbGU6e30sdm9sdW1lTWVudUJ1dHRvbjp7aW5saW5lOiExLHZlcnRpY2FsOiEwfX0sdGVjaE9yZGVyOltcImh0bWw1XCJdLHBsdWdpbnM6e319fX0sZ2xvYmFsRXZlbnRzOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3BsYXllcjpudWxsLHJlc2V0ZWQ6ITB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXJ8fHRoaXMuaW5pdGlhbGl6ZSgpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXImJnRoaXMuZGlzcG9zZSgpfSxtZXRob2RzOntpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PU9iamVjdC5hc3NpZ24oe30sdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMub3B0aW9ucyk7dGhpcy5wbGF5c2lubGluZSYmKHRoaXMuJHJlZnMudmlkZW8uc2V0QXR0cmlidXRlKFwicGxheXNpbmxpbmVcIix0aGlzLnBsYXlzaW5saW5lKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIndlYmtpdC1wbGF5c2lubGluZVwiLHRoaXMucGxheXNpbmxpbmUpLHRoaXMuJHJlZnMudmlkZW8uc2V0QXR0cmlidXRlKFwieDUtcGxheXNpbmxpbmVcIix0aGlzLnBsYXlzaW5saW5lKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIng1LXZpZGVvLXBsYXllci10eXBlXCIsXCJoNVwiKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIng1LXZpZGVvLXBsYXllci1mdWxsc2NyZWVuXCIsITEpKSxcIlwiIT09dGhpcy5jcm9zc09yaWdpbiYmKHRoaXMuJHJlZnMudmlkZW8uY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbix0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcImNyb3NzT3JpZ2luXCIsdGhpcy5jcm9zc09yaWdpbikpO3ZhciBuPWZ1bmN0aW9uKHQsbil7dCYmZS4kZW1pdCh0LGUucGxheWVyKSxuJiZlLiRlbWl0KGUuY3VzdG9tRXZlbnROYW1lLGkoe30sdCxuKSl9O3QucGx1Z2lucyYmZGVsZXRlIHQucGx1Z2lucy5fX29iX187dmFyIHI9dGhpczt0aGlzLnBsYXllcj1zKHRoaXMuJHJlZnMudmlkZW8sdCxmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLHQ9YS5jb25jYXQoci5ldmVudHMpLmNvbmNhdChyLmdsb2JhbEV2ZW50cyksaT17fSxvPTA7bzx0Lmxlbmd0aDtvKyspXCJzdHJpbmdcIj09dHlwZW9mIHRbb10mJnZvaWQgMD09PWlbdFtvXV0mJmZ1bmN0aW9uKHQpe2lbdF09bnVsbCxlLm9uKHQsZnVuY3Rpb24oKXtuKHQsITApfSl9KHRbb10pO3RoaXMub24oXCJ0aW1ldXBkYXRlXCIsZnVuY3Rpb24oKXtuKFwidGltZXVwZGF0ZVwiLHRoaXMuY3VycmVudFRpbWUoKSl9KSxyLiRlbWl0KFwicmVhZHlcIix0aGlzKX0pfSxkaXNwb3NlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5wbGF5ZXImJnRoaXMucGxheWVyLmRpc3Bvc2UmJihcIkZsYXNoXCIhPT10aGlzLnBsYXllci50ZWNoTmFtZV8mJnRoaXMucGxheWVyLnBhdXNlJiZ0aGlzLnBsYXllci5wYXVzZSgpLHRoaXMucGxheWVyLmRpc3Bvc2UoKSx0aGlzLnBsYXllcj1udWxsLHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dC5yZXNldGVkPSExLHQuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dC5yZXNldGVkPSEwLHQuJG5leHRUaWNrKGZ1bmN0aW9uKCl7ZSYmZSgpfSl9KX0pKX19LHdhdGNoOntvcHRpb25zOntkZWVwOiEwLGhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuZGlzcG9zZShmdW5jdGlvbigpe2UmJmUuc291cmNlcyYmZS5zb3VyY2VzLmxlbmd0aCYmbi5pbml0aWFsaXplKCl9KX19fX19LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDEpLHI9bi5uKGkpO2Zvcih2YXIgbyBpbiBpKVtcImRlZmF1bHRcIixcImRlZmF1bHRcIl0uaW5kZXhPZihvKTwwJiZmdW5jdGlvbihlKXtuLmQodCxlLGZ1bmN0aW9uKCl7cmV0dXJuIGlbZV19KX0obyk7dmFyIHM9big1KSxhPW4oNCksbD1hKHIuYSxzLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1sLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lmluc3RhbGw9dC52aWRlb1BsYXllcj10LnZpZGVvanM9dm9pZCAwO3ZhciByPW4oMCksbz1pKHIpLHM9bigyKSxhPWkocyksbD13aW5kb3cudmlkZW9qc3x8by5kZWZhdWx0LHU9ZnVuY3Rpb24oZSx0KXt0JiYodC5vcHRpb25zJiYoYS5kZWZhdWx0LnByb3BzLmdsb2JhbE9wdGlvbnMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0Lm9wdGlvbnN9KSx0LmV2ZW50cyYmKGEuZGVmYXVsdC5wcm9wcy5nbG9iYWxFdmVudHMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0LmV2ZW50c30pKSxlLmNvbXBvbmVudChhLmRlZmF1bHQubmFtZSxhLmRlZmF1bHQpfSxkPXt2aWRlb2pzOmwsdmlkZW9QbGF5ZXI6YS5kZWZhdWx0LGluc3RhbGw6dX07dC5kZWZhdWx0PWQsdC52aWRlb2pzPWwsdC52aWRlb1BsYXllcj1hLmRlZmF1bHQsdC5pbnN0YWxsPXV9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGkscixvKXt2YXIgcyxhPWU9ZXx8e30sbD10eXBlb2YgZS5kZWZhdWx0O1wib2JqZWN0XCIhPT1sJiZcImZ1bmN0aW9uXCIhPT1sfHwocz1lLGE9ZS5kZWZhdWx0KTt2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBhP2Eub3B0aW9uczphO3QmJih1LnJlbmRlcj10LnJlbmRlcix1LnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyx1Ll9jb21waWxlZD0hMCksbiYmKHUuZnVuY3Rpb25hbD0hMCksciYmKHUuX3Njb3BlSWQ9cik7dmFyIGQ7aWYobz8oZD1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fHx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuJHZub2RlJiZ0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCxlfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfX3x8KGU9X19WVUVfU1NSX0NPTlRFWFRfXyksaSYmaS5jYWxsKHRoaXMsZSksZSYmZS5fcmVnaXN0ZXJlZENvbXBvbmVudHMmJmUuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChvKX0sdS5fc3NyUmVnaXN0ZXI9ZCk6aSYmKGQ9aSksZCl7dmFyIGM9dS5mdW5jdGlvbmFsLGY9Yz91LnJlbmRlcjp1LmJlZm9yZUNyZWF0ZTtjPyh1Ll9pbmplY3RTdHlsZXM9ZCx1LnJlbmRlcj1mdW5jdGlvbihlLHQpe3JldHVybiBkLmNhbGwodCksZihlLHQpfSk6dS5iZWZvcmVDcmVhdGU9Zj9bXS5jb25jYXQoZixkKTpbZF19cmV0dXJue2VzTW9kdWxlOnMsZXhwb3J0czphLG9wdGlvbnM6dX19fSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIGUucmVzZXRlZD9uKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidmlkZW8tcGxheWVyXCJ9LFtuKFwidmlkZW9cIix7cmVmOlwidmlkZW9cIixzdGF0aWNDbGFzczpcInZpZGVvLWpzXCJ9KV0pOmUuX2UoKX0scj1bXSxvPXtyZW5kZXI6aSxzdGF0aWNSZW5kZXJGbnM6cn07dC5hPW99XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js\n");
/***/ }),
/***/ "./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js":
/*!**************************************************************!*\
!*** ./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/*!\n * Vue.js v2.6.10\n * (c) 2014-2019 Evan You\n * Released under the MIT License.\n */\n/* */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n return v === undefined || v === null\n}\n\nfunction isDef (v) {\n return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n return v === true\n}\n\nfunction isFalse (v) {\n return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n // $flow-disable-line\n typeof value === 'symbol' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n return (\n isDef(val) &&\n typeof val.then === 'function' &&\n typeof val.catch === 'function'\n )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n return val == null\n ? ''\n : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n ? JSON.stringify(val, null, 2)\n : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n str,\n expectsLowerCase\n) {\n var map = Object.create(null);\n var list = str.split(',');\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase\n ? function (val) { return map[val.toLowerCase()]; }\n : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n var cache = Object.create(null);\n return (function cachedFn (str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str))\n })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n function boundFn (a) {\n var l = arguments.length;\n return l\n ? l > 1\n ? fn.apply(ctx, arguments)\n : fn.call(ctx, a)\n : fn.call(ctx)\n }\n\n boundFn._length = fn.length;\n return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n ? nativeBind\n : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n while (i--) {\n ret[i] = list[i + start];\n }\n return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) { return i }\n }\n return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n 'component',\n 'directive',\n 'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeDestroy',\n 'destroyed',\n 'activated',\n 'deactivated',\n 'errorCaptured',\n 'serverPrefetch'\n];\n\n/* */\n\n\n\nvar config = ({\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: \"sandbox\" !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: \"sandbox\" !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Perform updates asynchronously. Intended to be used by Vue Test Utils\n * This will significantly reduce performance if set to false.\n */\n async: true,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/* */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n if (bailRE.test(path)) {\n return\n }\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) { return }\n obj = obj[segments[i]];\n }\n return obj\n }\n}\n\n/* */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', ({\n get: function get () {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n })); // https://github.com/facebook/flow/issues/285\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n typeof Symbol !== 'undefined' && isNative(Symbol) &&\n typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = /*@__PURE__*/(function () {\n function Set () {\n this.set = Object.create(null);\n }\n Set.prototype.has = function has (key) {\n return this.set[key] === true\n };\n Set.prototype.add = function add (key) {\n this.set[key] = true;\n };\n Set.prototype.clear = function clear () {\n this.set = Object.create(null);\n };\n\n return Set;\n }());\n}\n\n/* */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (true) {\n var hasConsole = typeof console !== 'undefined';\n var classifyRE = /(?:^|[-_])(\\w)/g;\n var classify = function (str) { return str\n .replace(classifyRE, function (c) { return c.toUpperCase(); })\n .replace(/[-_]/g, ''); };\n\n warn = function (msg, vm) {\n var trace = vm ? generateComponentTrace(vm) : '';\n\n if (config.warnHandler) {\n config.warnHandler.call(null, msg, vm, trace);\n } else if (hasConsole && (!config.silent)) {\n console.error((\"[Vue warn]: \" + msg + trace));\n }\n };\n\n tip = function (msg, vm) {\n if (hasConsole && (!config.silent)) {\n console.warn(\"[Vue tip]: \" + msg + (\n vm ? generateComponentTrace(vm) : ''\n ));\n }\n };\n\n formatComponentName = function (vm, includeFile) {\n if (vm.$root === vm) {\n return '<Root>'\n }\n var options = typeof vm === 'function' && vm.cid != null\n ? vm.options\n : vm._isVue\n ? vm.$options || vm.constructor.options\n : vm;\n var name = options.name || options._componentTag;\n var file = options.__file;\n if (!name && file) {\n var match = file.match(/([^/\\\\]+)\\.vue$/);\n name = match && match[1];\n }\n\n return (\n (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n (file && includeFile !== false ? (\" at \" + file) : '')\n )\n };\n\n var repeat = function (str, n) {\n var res = '';\n while (n) {\n if (n % 2 === 1) { res += str; }\n if (n > 1) { str += str; }\n n >>= 1;\n }\n return res\n };\n\n generateComponentTrace = function (vm) {\n if (vm._isVue && vm.$parent) {\n var tree = [];\n var currentRecursiveSequence = 0;\n while (vm) {\n if (tree.length > 0) {\n var last = tree[tree.length - 1];\n if (last.constructor === vm.constructor) {\n currentRecursiveSequence++;\n vm = vm.$parent;\n continue\n } else if (currentRecursiveSequence > 0) {\n tree[tree.length - 1] = [last, currentRecursiveSequence];\n currentRecursiveSequence = 0;\n }\n }\n tree.push(vm);\n vm = vm.$parent;\n }\n return '\\n\\nfound in\\n\\n' + tree\n .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n if ( true && !config.async) {\n // subs aren't sorted in scheduler if not running async\n // we need to sort them now to make sure they fire in correct\n // order\n subs.sort(function (a, b) { return a.id - b.id; });\n }\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n targetStack.push(target);\n Dep.target = target;\n}\n\nfunction popTarget () {\n targetStack.pop();\n Dep.target = targetStack[targetStack.length - 1];\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n // #7975\n // clone children array to avoid mutating original in case of cloning\n // a child.\n vnode.children && vnode.children.slice(),\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.asyncMeta = vnode.asyncMeta;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n if (hasProto) {\n protoAugment(value, arrayMethods);\n } else {\n copyAugment(value, arrayMethods, arrayKeys);\n }\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive$$1(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n var setter = property && property.set;\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key];\n }\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.target) {\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if ( true && customSetter) {\n customSetter();\n }\n // #7981: for accessor properties without setter\n if (getter && !setter) { return }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if ( true &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n true && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive$$1(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if ( true &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n true && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (true) {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n\n var keys = hasSymbol\n ? Reflect.ownKeys(from)\n : Object.keys(from);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n // in case the object is already observed...\n if (key === '__ob__') { continue }\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (\n toVal !== fromVal &&\n isPlainObject(toVal) &&\n isPlainObject(fromVal)\n ) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n true && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n var res = childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal;\n return res\n ? dedupeHooks(res)\n : res\n}\n\nfunction dedupeHooks (hooks) {\n var res = [];\n for (var i = 0; i < hooks.length; i++) {\n if (res.indexOf(hooks[i]) === -1) {\n res.push(hooks[i]);\n }\n }\n return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n true && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (true) {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && \"sandbox\" !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'should conform to valid custom element name in html5 specification.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (true) {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (true) {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (true) {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def$$1 = dirs[key];\n if (typeof def$$1 === 'function') {\n dirs[key] = { bind: def$$1, update: def$$1 };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (true) {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n\n // Apply extends and mixins on the child options,\n // but only if it is a raw options object that isn't\n // the result of another mergeOptions call.\n // Only merged options has the _base property.\n if (!child._base) {\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n }\n\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if ( true && warnMissing && !res) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\n\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n true\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if ( true && isObject(def)) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n\n if (!valid) {\n warn(\n getInvalidTypeMessage(name, value, expectedTypes),\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n var expectedType = expectedTypes[0];\n var receivedType = toRawType(value);\n var expectedValue = styleValue(value, expectedType);\n var receivedValue = styleValue(value, receivedType);\n // check if we need to specify expected value\n if (expectedTypes.length === 1 &&\n isExplicable(expectedType) &&\n !isBoolean(expectedType, receivedType)) {\n message += \" with value \" + expectedValue;\n }\n message += \", got \" + receivedType + \" \";\n // check if we need to specify received value\n if (isExplicable(receivedType)) {\n message += \"with value \" + receivedValue + \".\";\n }\n return message\n}\n\nfunction styleValue (value, type) {\n if (type === 'String') {\n return (\"\\\"\" + value + \"\\\"\")\n } else if (type === 'Number') {\n return (\"\" + (Number(value)))\n } else {\n return (\"\" + value)\n }\n}\n\nfunction isExplicable (value) {\n var explicitTypes = ['string', 'number', 'boolean'];\n return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n // See: https://github.com/vuejs/vuex/issues/1505\n pushTarget();\n try {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n } finally {\n popTarget();\n }\n}\n\nfunction invokeWithErrorHandling (\n handler,\n context,\n args,\n vm,\n info\n) {\n var res;\n try {\n res = args ? handler.apply(context, args) : handler.call(context);\n if (res && !res._isVue && isPromise(res) && !res._handled) {\n res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n // issue #9511\n // avoid catch triggering multiple times when nested calls\n res._handled = true;\n }\n } catch (e) {\n handleError(e, vm, info);\n }\n return res\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n // if the user intentionally throws the original error in the handler,\n // do not log it twice\n if (e !== err) {\n logError(e, null, 'config.errorHandler');\n }\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (true) {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n timerFunc = function () {\n p.then(flushCallbacks);\n // In problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n isNative(MutationObserver) ||\n // PhantomJS and iOS 7.x\n MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n // Use MutationObserver where native Promise is not available,\n // e.g. PhantomJS, iOS7, Android 4.4\n // (#6466 MutationObserver is unreliable in IE11)\n var counter = 1;\n var observer = new MutationObserver(flushCallbacks);\n var textNode = document.createTextNode(String(counter));\n observer.observe(textNode, {\n characterData: true\n });\n timerFunc = function () {\n counter = (counter + 1) % 2;\n textNode.data = String(counter);\n };\n isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n // Fallback to setImmediate.\n // Techinically it leverages the (macro) task queue,\n // but it is still a better choice than setTimeout.\n timerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else {\n // Fallback to setTimeout.\n timerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n timerFunc();\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (true) {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var warnReservedPrefix = function (target, key) {\n warn(\n \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n 'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n 'prevent conflicts with Vue internals' +\n 'See: https://vuejs.org/v2/api/#data',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) ||\n (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n if (!has && !isAllowed) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\nvar mark;\nvar measure;\n\nif (true) {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n // perf.clearMeasures(name)\n };\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns, vm) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n }\n } else {\n // return handler return value for single handlers\n return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n createOnceHandler,\n vm\n) {\n var name, def$$1, cur, old, event;\n for (name in on) {\n def$$1 = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n if (isUndef(cur)) {\n true && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur, vm);\n }\n if (isTrue(event.once)) {\n cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n }\n add(event.name, cur, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook () {\n hook.apply(this, arguments);\n // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n\n/* */\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n return\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (true) {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n return res\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n return isPrimitive(children)\n ? [createTextVNode(children)]\n : Array.isArray(children)\n ? normalizeArrayChildren(children)\n : undefined\n}\n\nfunction isTextNode (node) {\n return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n var res = [];\n var i, c, lastIndex, last;\n for (i = 0; i < children.length; i++) {\n c = children[i];\n if (isUndef(c) || typeof c === 'boolean') { continue }\n lastIndex = res.length - 1;\n last = res[lastIndex];\n // nested\n if (Array.isArray(c)) {\n if (c.length > 0) {\n c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n // merge adjacent text nodes\n if (isTextNode(c[0]) && isTextNode(last)) {\n res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n c.shift();\n }\n res.push.apply(res, c);\n }\n } else if (isPrimitive(c)) {\n if (isTextNode(last)) {\n // merge adjacent text nodes\n // this is necessary for SSR hydration because text nodes are\n // essentially merged when rendered to HTML strings\n res[lastIndex] = createTextVNode(last.text + c);\n } else if (c !== '') {\n // convert primitive to vnode\n res.push(createTextVNode(c));\n }\n } else {\n if (isTextNode(c) && isTextNode(last)) {\n // merge adjacent text nodes\n res[lastIndex] = createTextVNode(last.text + c.text);\n } else {\n // default key for nested array children (likely generated by v-for)\n if (isTrue(children._isVList) &&\n isDef(c.tag) &&\n isUndef(c.key) &&\n isDef(nestedIndex)) {\n c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n }\n res.push(c);\n }\n }\n }\n return res\n}\n\n/* */\n\nfunction initProvide (vm) {\n var provide = vm.$options.provide;\n if (provide) {\n vm._provided = typeof provide === 'function'\n ? provide.call(vm)\n : provide;\n }\n}\n\nfunction initInjections (vm) {\n var result = resolveInject(vm.$options.inject, vm);\n if (result) {\n toggleObserving(false);\n Object.keys(result).forEach(function (key) {\n /* istanbul ignore else */\n if (true) {\n defineReactive$$1(vm, key, result[key], function () {\n warn(\n \"Avoid mutating an injected value directly since the changes will be \" +\n \"overwritten whenever the provided component re-renders. \" +\n \"injection being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n });\n } else {}\n });\n toggleObserving(true);\n }\n}\n\nfunction resolveInject (inject, vm) {\n if (inject) {\n // inject is :any because flow is not smart enough to figure out cached\n var result = Object.create(null);\n var keys = hasSymbol\n ? Reflect.ownKeys(inject)\n : Object.keys(inject);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n // #6574 in case the inject object is observed...\n if (key === '__ob__') { continue }\n var provideKey = inject[key].from;\n var source = vm;\n while (source) {\n if (source._provided && hasOwn(source._provided, provideKey)) {\n result[key] = source._provided[provideKey];\n break\n }\n source = source.$parent;\n }\n if (!source) {\n if ('default' in inject[key]) {\n var provideDefault = inject[key].default;\n result[key] = typeof provideDefault === 'function'\n ? provideDefault.call(vm)\n : provideDefault;\n } else if (true) {\n warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n }\n }\n }\n return result\n }\n}\n\n/* */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n children,\n context\n) {\n if (!children || !children.length) {\n return {}\n }\n var slots = {};\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n var data = child.data;\n // remove slot attribute if the node is resolved as a Vue slot node\n if (data && data.attrs && data.attrs.slot) {\n delete data.attrs.slot;\n }\n // named slots should only be respected if the vnode was rendered in the\n // same context.\n if ((child.context === context || child.fnContext === context) &&\n data && data.slot != null\n ) {\n var name = data.slot;\n var slot = (slots[name] || (slots[name] = []));\n if (child.tag === 'template') {\n slot.push.apply(slot, child.children || []);\n } else {\n slot.push(child);\n }\n } else {\n (slots.default || (slots.default = [])).push(child);\n }\n }\n // ignore slots that contains only whitespace\n for (var name$1 in slots) {\n if (slots[name$1].every(isWhitespace)) {\n delete slots[name$1];\n }\n }\n return slots\n}\n\nfunction isWhitespace (node) {\n return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\n/* */\n\nfunction normalizeScopedSlots (\n slots,\n normalSlots,\n prevSlots\n) {\n var res;\n var hasNormalSlots = Object.keys(normalSlots).length > 0;\n var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n var key = slots && slots.$key;\n if (!slots) {\n res = {};\n } else if (slots._normalized) {\n // fast path 1: child component re-render only, parent did not change\n return slots._normalized\n } else if (\n isStable &&\n prevSlots &&\n prevSlots !== emptyObject &&\n key === prevSlots.$key &&\n !hasNormalSlots &&\n !prevSlots.$hasNormal\n ) {\n // fast path 2: stable scoped slots w/ no normal slots to proxy,\n // only need to normalize once\n return prevSlots\n } else {\n res = {};\n for (var key$1 in slots) {\n if (slots[key$1] && key$1[0] !== '$') {\n res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n }\n }\n }\n // expose normal slots on scopedSlots\n for (var key$2 in normalSlots) {\n if (!(key$2 in res)) {\n res[key$2] = proxyNormalSlot(normalSlots, key$2);\n }\n }\n // avoriaz seems to mock a non-extensible $scopedSlots object\n // and when that is passed down this would cause an error\n if (slots && Object.isExtensible(slots)) {\n (slots)._normalized = res;\n }\n def(res, '$stable', isStable);\n def(res, '$key', key);\n def(res, '$hasNormal', hasNormalSlots);\n return res\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n var normalized = function () {\n var res = arguments.length ? fn.apply(null, arguments) : fn({});\n res = res && typeof res === 'object' && !Array.isArray(res)\n ? [res] // single vnode\n : normalizeChildren(res);\n return res && (\n res.length === 0 ||\n (res.length === 1 && res[0].isComment) // #9658\n ) ? undefined\n : res\n };\n // this is a slot using the new v-slot syntax without scope. although it is\n // compiled as a scoped slot, render fn users would expect it to be present\n // on this.$slots because the usage is semantically a normal slot.\n if (fn.proxy) {\n Object.defineProperty(normalSlots, key, {\n get: normalized,\n enumerable: true,\n configurable: true\n });\n }\n return normalized\n}\n\nfunction proxyNormalSlot(slots, key) {\n return function () { return slots[key]; }\n}\n\n/* */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n val,\n render\n) {\n var ret, i, l, keys, key;\n if (Array.isArray(val) || typeof val === 'string') {\n ret = new Array(val.length);\n for (i = 0, l = val.length; i < l; i++) {\n ret[i] = render(val[i], i);\n }\n } else if (typeof val === 'number') {\n ret = new Array(val);\n for (i = 0; i < val; i++) {\n ret[i] = render(i + 1, i);\n }\n } else if (isObject(val)) {\n if (hasSymbol && val[Symbol.iterator]) {\n ret = [];\n var iterator = val[Symbol.iterator]();\n var result = iterator.next();\n while (!result.done) {\n ret.push(render(result.value, ret.length));\n result = iterator.next();\n }\n } else {\n keys = Object.keys(val);\n ret = new Array(keys.length);\n for (i = 0, l = keys.length; i < l; i++) {\n key = keys[i];\n ret[i] = render(val[key], key, i);\n }\n }\n }\n if (!isDef(ret)) {\n ret = [];\n }\n (ret)._isVList = true;\n return ret\n}\n\n/* */\n\n/**\n * Runtime helper for rendering <slot>\n */\nfunction renderSlot (\n name,\n fallback,\n props,\n bindObject\n) {\n var scopedSlotFn = this.$scopedSlots[name];\n var nodes;\n if (scopedSlotFn) { // scoped slot\n props = props || {};\n if (bindObject) {\n if ( true && !isObject(bindObject)) {\n warn(\n 'slot v-bind without argument expects an Object',\n this\n );\n }\n props = extend(extend({}, bindObject), props);\n }\n nodes = scopedSlotFn(props) || fallback;\n } else {\n nodes = this.$slots[name] || fallback;\n }\n\n var target = props && props.slot;\n if (target) {\n return this.$createElement('template', { slot: target }, nodes)\n } else {\n return nodes\n }\n}\n\n/* */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/* */\n\nfunction isKeyNotMatch (expect, actual) {\n if (Array.isArray(expect)) {\n return expect.indexOf(actual) === -1\n } else {\n return expect !== actual\n }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n eventKeyCode,\n key,\n builtInKeyCode,\n eventKeyName,\n builtInKeyName\n) {\n var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n return isKeyNotMatch(builtInKeyName, eventKeyName)\n } else if (mappedKeyCode) {\n return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n } else if (eventKeyName) {\n return hyphenate(eventKeyName) !== key\n }\n}\n\n/* */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n data,\n tag,\n value,\n asProp,\n isSync\n) {\n if (value) {\n if (!isObject(value)) {\n true && warn(\n 'v-bind without argument expects an Object or Array value',\n this\n );\n } else {\n if (Array.isArray(value)) {\n value = toObject(value);\n }\n var hash;\n var loop = function ( key ) {\n if (\n key === 'class' ||\n key === 'style' ||\n isReservedAttribute(key)\n ) {\n hash = data;\n } else {\n var type = data.attrs && data.attrs.type;\n hash = asProp || config.mustUseProp(tag, type, key)\n ? data.domProps || (data.domProps = {})\n : data.attrs || (data.attrs = {});\n }\n var camelizedKey = camelize(key);\n var hyphenatedKey = hyphenate(key);\n if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n hash[key] = value[key];\n\n if (isSync) {\n var on = data.on || (data.on = {});\n on[(\"update:\" + key)] = function ($event) {\n value[key] = $event;\n };\n }\n }\n };\n\n for (var key in value) loop( key );\n }\n }\n return data\n}\n\n/* */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n index,\n isInFor\n) {\n var cached = this._staticTrees || (this._staticTrees = []);\n var tree = cached[index];\n // if has already-rendered static tree and not inside v-for,\n // we can reuse the same tree.\n if (tree && !isInFor) {\n return tree\n }\n // otherwise, render a fresh tree.\n tree = cached[index] = this.$options.staticRenderFns[index].call(\n this._renderProxy,\n null,\n this // for render fns generated for functional component templates\n );\n markStatic(tree, (\"__static__\" + index), false);\n return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n tree,\n index,\n key\n) {\n markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n return tree\n}\n\nfunction markStatic (\n tree,\n key,\n isOnce\n) {\n if (Array.isArray(tree)) {\n for (var i = 0; i < tree.length; i++) {\n if (tree[i] && typeof tree[i] !== 'string') {\n markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n }\n }\n } else {\n markStaticNode(tree, key, isOnce);\n }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n node.isStatic = true;\n node.key = key;\n node.isOnce = isOnce;\n}\n\n/* */\n\nfunction bindObjectListeners (data, value) {\n if (value) {\n if (!isPlainObject(value)) {\n true && warn(\n 'v-on without argument expects an Object value',\n this\n );\n } else {\n var on = data.on = data.on ? extend({}, data.on) : {};\n for (var key in value) {\n var existing = on[key];\n var ours = value[key];\n on[key] = existing ? [].concat(existing, ours) : ours;\n }\n }\n }\n return data\n}\n\n/* */\n\nfunction resolveScopedSlots (\n fns, // see flow/vnode\n res,\n // the following are added in 2.6\n hasDynamicKeys,\n contentHashKey\n) {\n res = res || { $stable: !hasDynamicKeys };\n for (var i = 0; i < fns.length; i++) {\n var slot = fns[i];\n if (Array.isArray(slot)) {\n resolveScopedSlots(slot, res, hasDynamicKeys);\n } else if (slot) {\n // marker for reverse proxying v-slot without scope on this.$slots\n if (slot.proxy) {\n slot.fn.proxy = true;\n }\n res[slot.key] = slot.fn;\n }\n }\n if (contentHashKey) {\n (res).$key = contentHashKey;\n }\n return res\n}\n\n/* */\n\nfunction bindDynamicKeys (baseObj, values) {\n for (var i = 0; i < values.length; i += 2) {\n var key = values[i];\n if (typeof key === 'string' && key) {\n baseObj[values[i]] = values[i + 1];\n } else if ( true && key !== '' && key !== null) {\n // null is a speical value for explicitly removing a binding\n warn(\n (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n this\n );\n }\n }\n return baseObj\n}\n\n// helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\nfunction prependModifier (value, symbol) {\n return typeof value === 'string' ? symbol + value : value\n}\n\n/* */\n\nfunction installRenderHelpers (target) {\n target._o = markOnce;\n target._n = toNumber;\n target._s = toString;\n target._l = renderList;\n target._t = renderSlot;\n target._q = looseEqual;\n target._i = looseIndexOf;\n target._m = renderStatic;\n target._f = resolveFilter;\n target._k = checkKeyCodes;\n target._b = bindObjectProps;\n target._v = createTextVNode;\n target._e = createEmptyVNode;\n target._u = resolveScopedSlots;\n target._g = bindObjectListeners;\n target._d = bindDynamicKeys;\n target._p = prependModifier;\n}\n\n/* */\n\nfunction FunctionalRenderContext (\n data,\n props,\n children,\n parent,\n Ctor\n) {\n var this$1 = this;\n\n var options = Ctor.options;\n // ensure the createElement function in functional components\n // gets a unique context - this is necessary for correct named slot check\n var contextVm;\n if (hasOwn(parent, '_uid')) {\n contextVm = Object.create(parent);\n // $flow-disable-line\n contextVm._original = parent;\n } else {\n // the context vm passed in is a functional context as well.\n // in this case we want to make sure we are able to get a hold to the\n // real context instance.\n contextVm = parent;\n // $flow-disable-line\n parent = parent._original;\n }\n var isCompiled = isTrue(options._compiled);\n var needNormalization = !isCompiled;\n\n this.data = data;\n this.props = props;\n this.children = children;\n this.parent = parent;\n this.listeners = data.on || emptyObject;\n this.injections = resolveInject(options.inject, parent);\n this.slots = function () {\n if (!this$1.$slots) {\n normalizeScopedSlots(\n data.scopedSlots,\n this$1.$slots = resolveSlots(children, parent)\n );\n }\n return this$1.$slots\n };\n\n Object.defineProperty(this, 'scopedSlots', ({\n enumerable: true,\n get: function get () {\n return normalizeScopedSlots(data.scopedSlots, this.slots())\n }\n }));\n\n // support for compiled functional template\n if (isCompiled) {\n // exposing $options for renderStatic()\n this.$options = options;\n // pre-resolve slots for renderSlot()\n this.$slots = this.slots();\n this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n }\n\n if (options._scopeId) {\n this._c = function (a, b, c, d) {\n var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n if (vnode && !Array.isArray(vnode)) {\n vnode.fnScopeId = options._scopeId;\n vnode.fnContext = parent;\n }\n return vnode\n };\n } else {\n this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n Ctor,\n propsData,\n data,\n contextVm,\n children\n) {\n var options = Ctor.options;\n var props = {};\n var propOptions = options.props;\n if (isDef(propOptions)) {\n for (var key in propOptions) {\n props[key] = validateProp(key, propOptions, propsData || emptyObject);\n }\n } else {\n if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n if (isDef(data.props)) { mergeProps(props, data.props); }\n }\n\n var renderContext = new FunctionalRenderContext(\n data,\n props,\n children,\n contextVm,\n Ctor\n );\n\n var vnode = options.render.call(null, renderContext._c, renderContext);\n\n if (vnode instanceof VNode) {\n return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n } else if (Array.isArray(vnode)) {\n var vnodes = normalizeChildren(vnode) || [];\n var res = new Array(vnodes.length);\n for (var i = 0; i < vnodes.length; i++) {\n res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n }\n return res\n }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n // #7817 clone node before setting fnContext, otherwise if the node is reused\n // (e.g. it was from a cached normal slot) the fnContext causes named slots\n // that should not be matched to match.\n var clone = cloneVNode(vnode);\n clone.fnContext = contextVm;\n clone.fnOptions = options;\n if (true) {\n (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n }\n if (data.slot) {\n (clone.data || (clone.data = {})).slot = data.slot;\n }\n return clone\n}\n\nfunction mergeProps (to, from) {\n for (var key in from) {\n to[camelize(key)] = from[key];\n }\n}\n\n/* */\n\n/* */\n\n/* */\n\n/* */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n init: function init (vnode, hydrating) {\n if (\n vnode.componentInstance &&\n !vnode.componentInstance._isDestroyed &&\n vnode.data.keepAlive\n ) {\n // kept-alive components, treat as a patch\n var mountedNode = vnode; // work around flow\n componentVNodeHooks.prepatch(mountedNode, mountedNode);\n } else {\n var child = vnode.componentInstance = createComponentInstanceForVnode(\n vnode,\n activeInstance\n );\n child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n }\n },\n\n prepatch: function prepatch (oldVnode, vnode) {\n var options = vnode.componentOptions;\n var child = vnode.componentInstance = oldVnode.componentInstance;\n updateChildComponent(\n child,\n options.propsData, // updated props\n options.listeners, // updated listeners\n vnode, // new parent vnode\n options.children // new children\n );\n },\n\n insert: function insert (vnode) {\n var context = vnode.context;\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isMounted) {\n componentInstance._isMounted = true;\n callHook(componentInstance, 'mounted');\n }\n if (vnode.data.keepAlive) {\n if (context._isMounted) {\n // vue-router#1212\n // During updates, a kept-alive component's child components may\n // change, so directly walking the tree here may call activated hooks\n // on incorrect children. Instead we push them into a queue which will\n // be processed after the whole patch process ended.\n queueActivatedComponent(componentInstance);\n } else {\n activateChildComponent(componentInstance, true /* direct */);\n }\n }\n },\n\n destroy: function destroy (vnode) {\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isDestroyed) {\n if (!vnode.data.keepAlive) {\n componentInstance.$destroy();\n } else {\n deactivateChildComponent(componentInstance, true /* direct */);\n }\n }\n }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n Ctor,\n data,\n context,\n children,\n tag\n) {\n if (isUndef(Ctor)) {\n return\n }\n\n var baseCtor = context.$options._base;\n\n // plain options object: turn it into a constructor\n if (isObject(Ctor)) {\n Ctor = baseCtor.extend(Ctor);\n }\n\n // if at this stage it's not a constructor or an async component factory,\n // reject.\n if (typeof Ctor !== 'function') {\n if (true) {\n warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n }\n return\n }\n\n // async component\n var asyncFactory;\n if (isUndef(Ctor.cid)) {\n asyncFactory = Ctor;\n Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n if (Ctor === undefined) {\n // return a placeholder node for async component, which is rendered\n // as a comment node but preserves all the raw information for the node.\n // the information will be used for async server-rendering and hydration.\n return createAsyncPlaceholder(\n asyncFactory,\n data,\n context,\n children,\n tag\n )\n }\n }\n\n data = data || {};\n\n // resolve constructor options in case global mixins are applied after\n // component constructor creation\n resolveConstructorOptions(Ctor);\n\n // transform component v-model data into props & events\n if (isDef(data.model)) {\n transformModel(Ctor.options, data);\n }\n\n // extract props\n var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n // functional component\n if (isTrue(Ctor.options.functional)) {\n return createFunctionalComponent(Ctor, propsData, data, context, children)\n }\n\n // extract listeners, since these needs to be treated as\n // child component listeners instead of DOM listeners\n var listeners = data.on;\n // replace with listeners with .native modifier\n // so it gets processed during parent component patch.\n data.on = data.nativeOn;\n\n if (isTrue(Ctor.options.abstract)) {\n // abstract components do not keep anything\n // other than props & listeners & slot\n\n // work around flow\n var slot = data.slot;\n data = {};\n if (slot) {\n data.slot = slot;\n }\n }\n\n // install component management hooks onto the placeholder node\n installComponentHooks(data);\n\n // return a placeholder vnode\n var name = Ctor.options.name || tag;\n var vnode = new VNode(\n (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n data, undefined, undefined, undefined, context,\n { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n asyncFactory\n );\n\n return vnode\n}\n\nfunction createComponentInstanceForVnode (\n vnode, // we know it's MountedComponentVNode but flow doesn't\n parent // activeInstance in lifecycle state\n) {\n var options = {\n _isComponent: true,\n _parentVnode: vnode,\n parent: parent\n };\n // check inline-template render functions\n var inlineTemplate = vnode.data.inlineTemplate;\n if (isDef(inlineTemplate)) {\n options.render = inlineTemplate.render;\n options.staticRenderFns = inlineTemplate.staticRenderFns;\n }\n return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n var hooks = data.hook || (data.hook = {});\n for (var i = 0; i < hooksToMerge.length; i++) {\n var key = hooksToMerge[i];\n var existing = hooks[key];\n var toMerge = componentVNodeHooks[key];\n if (existing !== toMerge && !(existing && existing._merged)) {\n hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n }\n }\n}\n\nfunction mergeHook$1 (f1, f2) {\n var merged = function (a, b) {\n // flow complains about extra args which is why we use any\n f1(a, b);\n f2(a, b);\n };\n merged._merged = true;\n return merged\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n var prop = (options.model && options.model.prop) || 'value';\n var event = (options.model && options.model.event) || 'input'\n ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n var on = data.on || (data.on = {});\n var existing = on[event];\n var callback = data.model.callback;\n if (isDef(existing)) {\n if (\n Array.isArray(existing)\n ? existing.indexOf(callback) === -1\n : existing !== callback\n ) {\n on[event] = [callback].concat(existing);\n }\n } else {\n on[event] = callback;\n }\n}\n\n/* */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n context,\n tag,\n data,\n children,\n normalizationType,\n alwaysNormalize\n) {\n if (Array.isArray(data) || isPrimitive(data)) {\n normalizationType = children;\n children = data;\n data = undefined;\n }\n if (isTrue(alwaysNormalize)) {\n normalizationType = ALWAYS_NORMALIZE;\n }\n return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n context,\n tag,\n data,\n children,\n normalizationType\n) {\n if (isDef(data) && isDef((data).__ob__)) {\n true && warn(\n \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n 'Always create fresh vnode data objects in each render!',\n context\n );\n return createEmptyVNode()\n }\n // object syntax in v-bind\n if (isDef(data) && isDef(data.is)) {\n tag = data.is;\n }\n if (!tag) {\n // in case of component :is set to falsy value\n return createEmptyVNode()\n }\n // warn against non-primitive key\n if ( true &&\n isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n ) {\n {\n warn(\n 'Avoid using non-primitive value as key, ' +\n 'use string/number value instead.',\n context\n );\n }\n }\n // support single function children as default scoped slot\n if (Array.isArray(children) &&\n typeof children[0] === 'function'\n ) {\n data = data || {};\n data.scopedSlots = { default: children[0] };\n children.length = 0;\n }\n if (normalizationType === ALWAYS_NORMALIZE) {\n children = normalizeChildren(children);\n } else if (normalizationType === SIMPLE_NORMALIZE) {\n children = simpleNormalizeChildren(children);\n }\n var vnode, ns;\n if (typeof tag === 'string') {\n var Ctor;\n ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n if (config.isReservedTag(tag)) {\n // platform built-in elements\n vnode = new VNode(\n config.parsePlatformTagName(tag), data, children,\n undefined, undefined, context\n );\n } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n // component\n vnode = createComponent(Ctor, data, context, children, tag);\n } else {\n // unknown or unlisted namespaced elements\n // check at runtime because it may get assigned a namespace when its\n // parent normalizes children\n vnode = new VNode(\n tag, data, children,\n undefined, undefined, context\n );\n }\n } else {\n // direct component options / constructor\n vnode = createComponent(tag, data, context, children);\n }\n if (Array.isArray(vnode)) {\n return vnode\n } else if (isDef(vnode)) {\n if (isDef(ns)) { applyNS(vnode, ns); }\n if (isDef(data)) { registerDeepBindings(data); }\n return vnode\n } else {\n return createEmptyVNode()\n }\n}\n\nfunction applyNS (vnode, ns, force) {\n vnode.ns = ns;\n if (vnode.tag === 'foreignObject') {\n // use default namespace inside foreignObject\n ns = undefined;\n force = true;\n }\n if (isDef(vnode.children)) {\n for (var i = 0, l = vnode.children.length; i < l; i++) {\n var child = vnode.children[i];\n if (isDef(child.tag) && (\n isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n applyNS(child, ns, force);\n }\n }\n }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n if (isObject(data.style)) {\n traverse(data.style);\n }\n if (isObject(data.class)) {\n traverse(data.class);\n }\n}\n\n/* */\n\nfunction initRender (vm) {\n vm._vnode = null; // the root of the child tree\n vm._staticTrees = null; // v-once cached trees\n var options = vm.$options;\n var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n var renderContext = parentVnode && parentVnode.context;\n vm.$slots = resolveSlots(options._renderChildren, renderContext);\n vm.$scopedSlots = emptyObject;\n // bind the createElement fn to this instance\n // so that we get proper render context inside it.\n // args order: tag, data, children, normalizationType, alwaysNormalize\n // internal version is used by render functions compiled from templates\n vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n // normalization is always applied for the public version, used in\n // user-written render functions.\n vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n // $attrs & $listeners are exposed for easier HOC creation.\n // they need to be reactive so that HOCs using them are always updated\n var parentData = parentVnode && parentVnode.data;\n\n /* istanbul ignore else */\n if (true) {\n defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n }, true);\n defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n }, true);\n } else {}\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin (Vue) {\n // install runtime convenience helpers\n installRenderHelpers(Vue.prototype);\n\n Vue.prototype.$nextTick = function (fn) {\n return nextTick(fn, this)\n };\n\n Vue.prototype._render = function () {\n var vm = this;\n var ref = vm.$options;\n var render = ref.render;\n var _parentVnode = ref._parentVnode;\n\n if (_parentVnode) {\n vm.$scopedSlots = normalizeScopedSlots(\n _parentVnode.data.scopedSlots,\n vm.$slots,\n vm.$scopedSlots\n );\n }\n\n // set parent vnode. this allows render functions to have access\n // to the data on the placeholder node.\n vm.$vnode = _parentVnode;\n // render self\n var vnode;\n try {\n // There's no need to maintain a stack becaues all render fns are called\n // separately from one another. Nested component's render fns are called\n // when parent component is patched.\n currentRenderingInstance = vm;\n vnode = render.call(vm._renderProxy, vm.$createElement);\n } catch (e) {\n handleError(e, vm, \"render\");\n // return error render result,\n // or previous vnode to prevent render error causing blank component\n /* istanbul ignore else */\n if ( true && vm.$options.renderError) {\n try {\n vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n } catch (e) {\n handleError(e, vm, \"renderError\");\n vnode = vm._vnode;\n }\n } else {\n vnode = vm._vnode;\n }\n } finally {\n currentRenderingInstance = null;\n }\n // if the returned array contains only a single node, allow it\n if (Array.isArray(vnode) && vnode.length === 1) {\n vnode = vnode[0];\n }\n // return empty vnode in case the render function errored out\n if (!(vnode instanceof VNode)) {\n if ( true && Array.isArray(vnode)) {\n warn(\n 'Multiple root nodes returned from render function. Render function ' +\n 'should return a single root node.',\n vm\n );\n }\n vnode = createEmptyVNode();\n }\n // set parent\n vnode.parent = _parentVnode;\n return vnode\n };\n}\n\n/* */\n\nfunction ensureCtor (comp, base) {\n if (\n comp.__esModule ||\n (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n ) {\n comp = comp.default;\n }\n return isObject(comp)\n ? base.extend(comp)\n : comp\n}\n\nfunction createAsyncPlaceholder (\n factory,\n data,\n context,\n children,\n tag\n) {\n var node = createEmptyVNode();\n node.asyncFactory = factory;\n node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n return node\n}\n\nfunction resolveAsyncComponent (\n factory,\n baseCtor\n) {\n if (isTrue(factory.error) && isDef(factory.errorComp)) {\n return factory.errorComp\n }\n\n if (isDef(factory.resolved)) {\n return factory.resolved\n }\n\n var owner = currentRenderingInstance;\n if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n // already pending\n factory.owners.push(owner);\n }\n\n if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n return factory.loadingComp\n }\n\n if (owner && !isDef(factory.owners)) {\n var owners = factory.owners = [owner];\n var sync = true;\n var timerLoading = null;\n var timerTimeout = null\n\n ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });\n\n var forceRender = function (renderCompleted) {\n for (var i = 0, l = owners.length; i < l; i++) {\n (owners[i]).$forceUpdate();\n }\n\n if (renderCompleted) {\n owners.length = 0;\n if (timerLoading !== null) {\n clearTimeout(timerLoading);\n timerLoading = null;\n }\n if (timerTimeout !== null) {\n clearTimeout(timerTimeout);\n timerTimeout = null;\n }\n }\n };\n\n var resolve = once(function (res) {\n // cache resolved\n factory.resolved = ensureCtor(res, baseCtor);\n // invoke callbacks only if this is not a synchronous resolve\n // (async resolves are shimmed as synchronous during SSR)\n if (!sync) {\n forceRender(true);\n } else {\n owners.length = 0;\n }\n });\n\n var reject = once(function (reason) {\n true && warn(\n \"Failed to resolve async component: \" + (String(factory)) +\n (reason ? (\"\\nReason: \" + reason) : '')\n );\n if (isDef(factory.errorComp)) {\n factory.error = true;\n forceRender(true);\n }\n });\n\n var res = factory(resolve, reject);\n\n if (isObject(res)) {\n if (isPromise(res)) {\n // () => Promise\n if (isUndef(factory.resolved)) {\n res.then(resolve, reject);\n }\n } else if (isPromise(res.component)) {\n res.component.then(resolve, reject);\n\n if (isDef(res.error)) {\n factory.errorComp = ensureCtor(res.error, baseCtor);\n }\n\n if (isDef(res.loading)) {\n factory.loadingComp = ensureCtor(res.loading, baseCtor);\n if (res.delay === 0) {\n factory.loading = true;\n } else {\n timerLoading = setTimeout(function () {\n timerLoading = null;\n if (isUndef(factory.resolved) && isUndef(factory.error)) {\n factory.loading = true;\n forceRender(false);\n }\n }, res.delay || 200);\n }\n }\n\n if (isDef(res.timeout)) {\n timerTimeout = setTimeout(function () {\n timerTimeout = null;\n if (isUndef(factory.resolved)) {\n reject(\n true\n ? (\"timeout (\" + (res.timeout) + \"ms)\")\n : undefined\n );\n }\n }, res.timeout);\n }\n }\n }\n\n sync = false;\n // return in case resolved synchronously\n return factory.loading\n ? factory.loadingComp\n : factory.resolved\n }\n}\n\n/* */\n\nfunction isAsyncPlaceholder (node) {\n return node.isComment && node.asyncFactory\n}\n\n/* */\n\nfunction getFirstComponentChild (children) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n var c = children[i];\n if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n return c\n }\n }\n }\n}\n\n/* */\n\n/* */\n\nfunction initEvents (vm) {\n vm._events = Object.create(null);\n vm._hasHookEvent = false;\n // init parent attached events\n var listeners = vm.$options._parentListeners;\n if (listeners) {\n updateComponentListeners(vm, listeners);\n }\n}\n\nvar target;\n\nfunction add (event, fn) {\n target.$on(event, fn);\n}\n\nfunction remove$1 (event, fn) {\n target.$off(event, fn);\n}\n\nfunction createOnceHandler (event, fn) {\n var _target = target;\n return function onceHandler () {\n var res = fn.apply(null, arguments);\n if (res !== null) {\n _target.$off(event, onceHandler);\n }\n }\n}\n\nfunction updateComponentListeners (\n vm,\n listeners,\n oldListeners\n) {\n target = vm;\n updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n var hookRE = /^hook:/;\n Vue.prototype.$on = function (event, fn) {\n var vm = this;\n if (Array.isArray(event)) {\n for (var i = 0, l = event.length; i < l; i++) {\n vm.$on(event[i], fn);\n }\n } else {\n (vm._events[event] || (vm._events[event] = [])).push(fn);\n // optimize hook:event cost by using a boolean flag marked at registration\n // instead of a hash lookup\n if (hookRE.test(event)) {\n vm._hasHookEvent = true;\n }\n }\n return vm\n };\n\n Vue.prototype.$once = function (event, fn) {\n var vm = this;\n function on () {\n vm.$off(event, on);\n fn.apply(vm, arguments);\n }\n on.fn = fn;\n vm.$on(event, on);\n return vm\n };\n\n Vue.prototype.$off = function (event, fn) {\n var vm = this;\n // all\n if (!arguments.length) {\n vm._events = Object.create(null);\n return vm\n }\n // array of events\n if (Array.isArray(event)) {\n for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n vm.$off(event[i$1], fn);\n }\n return vm\n }\n // specific event\n var cbs = vm._events[event];\n if (!cbs) {\n return vm\n }\n if (!fn) {\n vm._events[event] = null;\n return vm\n }\n // specific handler\n var cb;\n var i = cbs.length;\n while (i--) {\n cb = cbs[i];\n if (cb === fn || cb.fn === fn) {\n cbs.splice(i, 1);\n break\n }\n }\n return vm\n };\n\n Vue.prototype.$emit = function (event) {\n var vm = this;\n if (true) {\n var lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n tip(\n \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and you cannot use \" +\n \"v-on to listen to camelCase events when using in-DOM templates. \" +\n \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n );\n }\n }\n var cbs = vm._events[event];\n if (cbs) {\n cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n var args = toArray(arguments, 1);\n var info = \"event handler for \\\"\" + event + \"\\\"\";\n for (var i = 0, l = cbs.length; i < l; i++) {\n invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n }\n }\n return vm\n };\n}\n\n/* */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n var prevActiveInstance = activeInstance;\n activeInstance = vm;\n return function () {\n activeInstance = prevActiveInstance;\n }\n}\n\nfunction initLifecycle (vm) {\n var options = vm.$options;\n\n // locate first non-abstract parent\n var parent = options.parent;\n if (parent && !options.abstract) {\n while (parent.$options.abstract && parent.$parent) {\n parent = parent.$parent;\n }\n parent.$children.push(vm);\n }\n\n vm.$parent = parent;\n vm.$root = parent ? parent.$root : vm;\n\n vm.$children = [];\n vm.$refs = {};\n\n vm._watcher = null;\n vm._inactive = null;\n vm._directInactive = false;\n vm._isMounted = false;\n vm._isDestroyed = false;\n vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n Vue.prototype._update = function (vnode, hydrating) {\n var vm = this;\n var prevEl = vm.$el;\n var prevVnode = vm._vnode;\n var restoreActiveInstance = setActiveInstance(vm);\n vm._vnode = vnode;\n // Vue.prototype.__patch__ is injected in entry points\n // based on the rendering backend used.\n if (!prevVnode) {\n // initial render\n vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n } else {\n // updates\n vm.$el = vm.__patch__(prevVnode, vnode);\n }\n restoreActiveInstance();\n // update __vue__ reference\n if (prevEl) {\n prevEl.__vue__ = null;\n }\n if (vm.$el) {\n vm.$el.__vue__ = vm;\n }\n // if parent is an HOC, update its $el as well\n if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n vm.$parent.$el = vm.$el;\n }\n // updated hook is called by the scheduler to ensure that children are\n // updated in a parent's updated hook.\n };\n\n Vue.prototype.$forceUpdate = function () {\n var vm = this;\n if (vm._watcher) {\n vm._watcher.update();\n }\n };\n\n Vue.prototype.$destroy = function () {\n var vm = this;\n if (vm._isBeingDestroyed) {\n return\n }\n callHook(vm, 'beforeDestroy');\n vm._isBeingDestroyed = true;\n // remove self from parent\n var parent = vm.$parent;\n if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n remove(parent.$children, vm);\n }\n // teardown watchers\n if (vm._watcher) {\n vm._watcher.teardown();\n }\n var i = vm._watchers.length;\n while (i--) {\n vm._watchers[i].teardown();\n }\n // remove reference from data ob\n // frozen object may not have observer.\n if (vm._data.__ob__) {\n vm._data.__ob__.vmCount--;\n }\n // call the last hook...\n vm._isDestroyed = true;\n // invoke destroy hooks on current rendered tree\n vm.__patch__(vm._vnode, null);\n // fire destroyed hook\n callHook(vm, 'destroyed');\n // turn off all instance listeners.\n vm.$off();\n // remove __vue__ reference\n if (vm.$el) {\n vm.$el.__vue__ = null;\n }\n // release circular reference (#6759)\n if (vm.$vnode) {\n vm.$vnode.parent = null;\n }\n };\n}\n\nfunction mountComponent (\n vm,\n el,\n hydrating\n) {\n vm.$el = el;\n if (!vm.$options.render) {\n vm.$options.render = createEmptyVNode;\n if (true) {\n /* istanbul ignore if */\n if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n vm.$options.el || el) {\n warn(\n 'You are using the runtime-only build of Vue where the template ' +\n 'compiler is not available. Either pre-compile the templates into ' +\n 'render functions, or use the compiler-included build.',\n vm\n );\n } else {\n warn(\n 'Failed to mount component: template or render function not defined.',\n vm\n );\n }\n }\n }\n callHook(vm, 'beforeMount');\n\n var updateComponent;\n /* istanbul ignore if */\n if ( true && config.performance && mark) {\n updateComponent = function () {\n var name = vm._name;\n var id = vm._uid;\n var startTag = \"vue-perf-start:\" + id;\n var endTag = \"vue-perf-end:\" + id;\n\n mark(startTag);\n var vnode = vm._render();\n mark(endTag);\n measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n mark(startTag);\n vm._update(vnode, hydrating);\n mark(endTag);\n measure((\"vue \" + name + \" patch\"), startTag, endTag);\n };\n } else {\n updateComponent = function () {\n vm._update(vm._render(), hydrating);\n };\n }\n\n // we set this to vm._watcher inside the watcher's constructor\n // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n // component's mounted hook), which relies on vm._watcher being already defined\n new Watcher(vm, updateComponent, noop, {\n before: function before () {\n if (vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'beforeUpdate');\n }\n }\n }, true /* isRenderWatcher */);\n hydrating = false;\n\n // manually mounted instance, call mounted on self\n // mounted is called for render-created child components in its inserted hook\n if (vm.$vnode == null) {\n vm._isMounted = true;\n callHook(vm, 'mounted');\n }\n return vm\n}\n\nfunction updateChildComponent (\n vm,\n propsData,\n listeners,\n parentVnode,\n renderChildren\n) {\n if (true) {\n isUpdatingChildComponent = true;\n }\n\n // determine whether component has slot children\n // we need to do this before overwriting $options._renderChildren.\n\n // check if there are dynamic scopedSlots (hand-written or compiled but with\n // dynamic slot names). Static scoped slots compiled from template has the\n // \"$stable\" marker.\n var newScopedSlots = parentVnode.data.scopedSlots;\n var oldScopedSlots = vm.$scopedSlots;\n var hasDynamicScopedSlot = !!(\n (newScopedSlots && !newScopedSlots.$stable) ||\n (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)\n );\n\n // Any static slot children from the parent may have changed during parent's\n // update. Dynamic scoped slots may also have changed. In such cases, a forced\n // update is necessary to ensure correctness.\n var needsForceUpdate = !!(\n renderChildren || // has new static slots\n vm.$options._renderChildren || // has old static slots\n hasDynamicScopedSlot\n );\n\n vm.$options._parentVnode = parentVnode;\n vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n if (vm._vnode) { // update child tree's parent\n vm._vnode.parent = parentVnode;\n }\n vm.$options._renderChildren = renderChildren;\n\n // update $attrs and $listeners hash\n // these are also reactive so they may trigger child update if the child\n // used them during render\n vm.$attrs = parentVnode.data.attrs || emptyObject;\n vm.$listeners = listeners || emptyObject;\n\n // update props\n if (propsData && vm.$options.props) {\n toggleObserving(false);\n var props = vm._props;\n var propKeys = vm.$options._propKeys || [];\n for (var i = 0; i < propKeys.length; i++) {\n var key = propKeys[i];\n var propOptions = vm.$options.props; // wtf flow?\n props[key] = validateProp(key, propOptions, propsData, vm);\n }\n toggleObserving(true);\n // keep a copy of raw propsData\n vm.$options.propsData = propsData;\n }\n\n // update listeners\n listeners = listeners || emptyObject;\n var oldListeners = vm.$options._parentListeners;\n vm.$options._parentListeners = listeners;\n updateComponentListeners(vm, listeners, oldListeners);\n\n // resolve slots + force update if has children\n if (needsForceUpdate) {\n vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n vm.$forceUpdate();\n }\n\n if (true) {\n isUpdatingChildComponent = false;\n }\n}\n\nfunction isInInactiveTree (vm) {\n while (vm && (vm = vm.$parent)) {\n if (vm._inactive) { return true }\n }\n return false\n}\n\nfunction activateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = false;\n if (isInInactiveTree(vm)) {\n return\n }\n } else if (vm._directInactive) {\n return\n }\n if (vm._inactive || vm._inactive === null) {\n vm._inactive = false;\n for (var i = 0; i < vm.$children.length; i++) {\n activateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'activated');\n }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = true;\n if (isInInactiveTree(vm)) {\n return\n }\n }\n if (!vm._inactive) {\n vm._inactive = true;\n for (var i = 0; i < vm.$children.length; i++) {\n deactivateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'deactivated');\n }\n}\n\nfunction callHook (vm, hook) {\n // #7573 disable dep collection when invoking lifecycle hooks\n pushTarget();\n var handlers = vm.$options[hook];\n var info = hook + \" hook\";\n if (handlers) {\n for (var i = 0, j = handlers.length; i < j; i++) {\n invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n }\n }\n if (vm._hasHookEvent) {\n vm.$emit('hook:' + hook);\n }\n popTarget();\n}\n\n/* */\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n index = queue.length = activatedChildren.length = 0;\n has = {};\n if (true) {\n circular = {};\n }\n waiting = flushing = false;\n}\n\n// Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\nvar currentFlushTimestamp = 0;\n\n// Async edge case fix requires storing an event listener's attach timestamp.\nvar getNow = Date.now;\n\n// Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\nif (inBrowser && !isIE) {\n var performance = window.performance;\n if (\n performance &&\n typeof performance.now === 'function' &&\n getNow() > document.createEvent('Event').timeStamp\n ) {\n // if the event timestamp, although evaluated AFTER the Date.now(), is\n // smaller than it, it means the event is using a hi-res timestamp,\n // and we need to use the hi-res version for event listener timestamps as\n // well.\n getNow = function () { return performance.now(); };\n }\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n currentFlushTimestamp = getNow();\n flushing = true;\n var watcher, id;\n\n // Sort queue before flush.\n // This ensures that:\n // 1. Components are updated from parent to child. (because parent is always\n // created before the child)\n // 2. A component's user watchers are run before its render watcher (because\n // user watchers are created before the render watcher)\n // 3. If a component is destroyed during a parent component's watcher run,\n // its watchers can be skipped.\n queue.sort(function (a, b) { return a.id - b.id; });\n\n // do not cache length because more watchers might be pushed\n // as we run existing watchers\n for (index = 0; index < queue.length; index++) {\n watcher = queue[index];\n if (watcher.before) {\n watcher.before();\n }\n id = watcher.id;\n has[id] = null;\n watcher.run();\n // in dev build, check and stop circular updates.\n if ( true && has[id] != null) {\n circular[id] = (circular[id] || 0) + 1;\n if (circular[id] > MAX_UPDATE_COUNT) {\n warn(\n 'You may have an infinite update loop ' + (\n watcher.user\n ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n : \"in a component render function.\"\n ),\n watcher.vm\n );\n break\n }\n }\n }\n\n // keep copies of post queues before resetting state\n var activatedQueue = activatedChildren.slice();\n var updatedQueue = queue.slice();\n\n resetSchedulerState();\n\n // call component updated and activated hooks\n callActivatedHooks(activatedQueue);\n callUpdatedHooks(updatedQueue);\n\n // devtool hook\n /* istanbul ignore if */\n if (devtools && config.devtools) {\n devtools.emit('flush');\n }\n}\n\nfunction callUpdatedHooks (queue) {\n var i = queue.length;\n while (i--) {\n var watcher = queue[i];\n var vm = watcher.vm;\n if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'updated');\n }\n }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n // setting _inactive to false here so that a render function can\n // rely on checking whether it's in an inactive tree (e.g. router-view)\n vm._inactive = false;\n activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n for (var i = 0; i < queue.length; i++) {\n queue[i]._inactive = true;\n activateChildComponent(queue[i], true /* true */);\n }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n var id = watcher.id;\n if (has[id] == null) {\n has[id] = true;\n if (!flushing) {\n queue.push(watcher);\n } else {\n // if already flushing, splice the watcher based on its id\n // if already past its id, it will be run next immediately.\n var i = queue.length - 1;\n while (i > index && queue[i].id > watcher.id) {\n i--;\n }\n queue.splice(i + 1, 0, watcher);\n }\n // queue the flush\n if (!waiting) {\n waiting = true;\n\n if ( true && !config.async) {\n flushSchedulerQueue();\n return\n }\n nextTick(flushSchedulerQueue);\n }\n }\n}\n\n/* */\n\n\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n vm,\n expOrFn,\n cb,\n options,\n isRenderWatcher\n) {\n this.vm = vm;\n if (isRenderWatcher) {\n vm._watcher = this;\n }\n vm._watchers.push(this);\n // options\n if (options) {\n this.deep = !!options.deep;\n this.user = !!options.user;\n this.lazy = !!options.lazy;\n this.sync = !!options.sync;\n this.before = options.before;\n } else {\n this.deep = this.user = this.lazy = this.sync = false;\n }\n this.cb = cb;\n this.id = ++uid$2; // uid for batching\n this.active = true;\n this.dirty = this.lazy; // for lazy watchers\n this.deps = [];\n this.newDeps = [];\n this.depIds = new _Set();\n this.newDepIds = new _Set();\n this.expression = true\n ? expOrFn.toString()\n : undefined;\n // parse expression for getter\n if (typeof expOrFn === 'function') {\n this.getter = expOrFn;\n } else {\n this.getter = parsePath(expOrFn);\n if (!this.getter) {\n this.getter = noop;\n true && warn(\n \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n 'Watcher only accepts simple dot-delimited paths. ' +\n 'For full control, use a function instead.',\n vm\n );\n }\n }\n this.value = this.lazy\n ? undefined\n : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n pushTarget(this);\n var value;\n var vm = this.vm;\n try {\n value = this.getter.call(vm, vm);\n } catch (e) {\n if (this.user) {\n handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n } else {\n throw e\n }\n } finally {\n // \"touch\" every property so they are all tracked as\n // dependencies for deep watching\n if (this.deep) {\n traverse(value);\n }\n popTarget();\n this.cleanupDeps();\n }\n return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n var id = dep.id;\n if (!this.newDepIds.has(id)) {\n this.newDepIds.add(id);\n this.newDeps.push(dep);\n if (!this.depIds.has(id)) {\n dep.addSub(this);\n }\n }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n var i = this.deps.length;\n while (i--) {\n var dep = this.deps[i];\n if (!this.newDepIds.has(dep.id)) {\n dep.removeSub(this);\n }\n }\n var tmp = this.depIds;\n this.depIds = this.newDepIds;\n this.newDepIds = tmp;\n this.newDepIds.clear();\n tmp = this.deps;\n this.deps = this.newDeps;\n this.newDeps = tmp;\n this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n /* istanbul ignore else */\n if (this.lazy) {\n this.dirty = true;\n } else if (this.sync) {\n this.run();\n } else {\n queueWatcher(this);\n }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n if (this.active) {\n var value = this.get();\n if (\n value !== this.value ||\n // Deep watchers and watchers on Object/Arrays should fire even\n // when the value is the same, because the value may\n // have mutated.\n isObject(value) ||\n this.deep\n ) {\n // set new value\n var oldValue = this.value;\n this.value = value;\n if (this.user) {\n try {\n this.cb.call(this.vm, value, oldValue);\n } catch (e) {\n handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n }\n } else {\n this.cb.call(this.vm, value, oldValue);\n }\n }\n }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n this.value = this.get();\n this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n var i = this.deps.length;\n while (i--) {\n this.deps[i].depend();\n }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n if (this.active) {\n // remove self from vm's watcher list\n // this is a somewhat expensive operation so we skip it\n // if the vm is being destroyed.\n if (!this.vm._isBeingDestroyed) {\n remove(this.vm._watchers, this);\n }\n var i = this.deps.length;\n while (i--) {\n this.deps[i].removeSub(this);\n }\n this.active = false;\n }\n};\n\n/* */\n\nvar sharedPropertyDefinition = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n sharedPropertyDefinition.get = function proxyGetter () {\n return this[sourceKey][key]\n };\n sharedPropertyDefinition.set = function proxySetter (val) {\n this[sourceKey][key] = val;\n };\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n vm._watchers = [];\n var opts = vm.$options;\n if (opts.props) { initProps(vm, opts.props); }\n if (opts.methods) { initMethods(vm, opts.methods); }\n if (opts.data) {\n initData(vm);\n } else {\n observe(vm._data = {}, true /* asRootData */);\n }\n if (opts.computed) { initComputed(vm, opts.computed); }\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch);\n }\n}\n\nfunction initProps (vm, propsOptions) {\n var propsData = vm.$options.propsData || {};\n var props = vm._props = {};\n // cache prop keys so that future props updates can iterate using Array\n // instead of dynamic object key enumeration.\n var keys = vm.$options._propKeys = [];\n var isRoot = !vm.$parent;\n // root instance props should be converted\n if (!isRoot) {\n toggleObserving(false);\n }\n var loop = function ( key ) {\n keys.push(key);\n var value = validateProp(key, propsOptions, propsData, vm);\n /* istanbul ignore else */\n if (true) {\n var hyphenatedKey = hyphenate(key);\n if (isReservedAttribute(hyphenatedKey) ||\n config.isReservedAttr(hyphenatedKey)) {\n warn(\n (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n vm\n );\n }\n defineReactive$$1(props, key, value, function () {\n if (!isRoot && !isUpdatingChildComponent) {\n warn(\n \"Avoid mutating a prop directly since the value will be \" +\n \"overwritten whenever the parent component re-renders. \" +\n \"Instead, use a data or computed property based on the prop's \" +\n \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n }\n });\n } else {}\n // static props are already proxied on the component's prototype\n // during Vue.extend(). We only need to proxy props defined at\n // instantiation here.\n if (!(key in vm)) {\n proxy(vm, \"_props\", key);\n }\n };\n\n for (var key in propsOptions) loop( key );\n toggleObserving(true);\n}\n\nfunction initData (vm) {\n var data = vm.$options.data;\n data = vm._data = typeof data === 'function'\n ? getData(data, vm)\n : data || {};\n if (!isPlainObject(data)) {\n data = {};\n true && warn(\n 'data functions should return an object:\\n' +\n 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n vm\n );\n }\n // proxy data on instance\n var keys = Object.keys(data);\n var props = vm.$options.props;\n var methods = vm.$options.methods;\n var i = keys.length;\n while (i--) {\n var key = keys[i];\n if (true) {\n if (methods && hasOwn(methods, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n vm\n );\n }\n }\n if (props && hasOwn(props, key)) {\n true && warn(\n \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n \"Use prop default value instead.\",\n vm\n );\n } else if (!isReserved(key)) {\n proxy(vm, \"_data\", key);\n }\n }\n // observe data\n observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n // #7573 disable dep collection when invoking data getters\n pushTarget();\n try {\n return data.call(vm, vm)\n } catch (e) {\n handleError(e, vm, \"data()\");\n return {}\n } finally {\n popTarget();\n }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n // $flow-disable-line\n var watchers = vm._computedWatchers = Object.create(null);\n // computed properties are just getters during SSR\n var isSSR = isServerRendering();\n\n for (var key in computed) {\n var userDef = computed[key];\n var getter = typeof userDef === 'function' ? userDef : userDef.get;\n if ( true && getter == null) {\n warn(\n (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n vm\n );\n }\n\n if (!isSSR) {\n // create internal watcher for the computed property.\n watchers[key] = new Watcher(\n vm,\n getter || noop,\n noop,\n computedWatcherOptions\n );\n }\n\n // component-defined computed properties are already defined on the\n // component prototype. We only need to define computed properties defined\n // at instantiation here.\n if (!(key in vm)) {\n defineComputed(vm, key, userDef);\n } else if (true) {\n if (key in vm.$data) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n } else if (vm.$options.props && key in vm.$options.props) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n }\n }\n }\n}\n\nfunction defineComputed (\n target,\n key,\n userDef\n) {\n var shouldCache = !isServerRendering();\n if (typeof userDef === 'function') {\n sharedPropertyDefinition.get = shouldCache\n ? createComputedGetter(key)\n : createGetterInvoker(userDef);\n sharedPropertyDefinition.set = noop;\n } else {\n sharedPropertyDefinition.get = userDef.get\n ? shouldCache && userDef.cache !== false\n ? createComputedGetter(key)\n : createGetterInvoker(userDef.get)\n : noop;\n sharedPropertyDefinition.set = userDef.set || noop;\n }\n if ( true &&\n sharedPropertyDefinition.set === noop) {\n sharedPropertyDefinition.set = function () {\n warn(\n (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n this\n );\n };\n }\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n return function computedGetter () {\n var watcher = this._computedWatchers && this._computedWatchers[key];\n if (watcher) {\n if (watcher.dirty) {\n watcher.evaluate();\n }\n if (Dep.target) {\n watcher.depend();\n }\n return watcher.value\n }\n }\n}\n\nfunction createGetterInvoker(fn) {\n return function computedGetter () {\n return fn.call(this, this)\n }\n}\n\nfunction initMethods (vm, methods) {\n var props = vm.$options.props;\n for (var key in methods) {\n if (true) {\n if (typeof methods[key] !== 'function') {\n warn(\n \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n \"Did you reference the function correctly?\",\n vm\n );\n }\n if (props && hasOwn(props, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n vm\n );\n }\n if ((key in vm) && isReserved(key)) {\n warn(\n \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n \"Avoid defining component methods that start with _ or $.\"\n );\n }\n }\n vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n }\n}\n\nfunction initWatch (vm, watch) {\n for (var key in watch) {\n var handler = watch[key];\n if (Array.isArray(handler)) {\n for (var i = 0; i < handler.length; i++) {\n createWatcher(vm, key, handler[i]);\n }\n } else {\n createWatcher(vm, key, handler);\n }\n }\n}\n\nfunction createWatcher (\n vm,\n expOrFn,\n handler,\n options\n) {\n if (isPlainObject(handler)) {\n options = handler;\n handler = handler.handler;\n }\n if (typeof handler === 'string') {\n handler = vm[handler];\n }\n return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n // flow somehow has problems with directly declared definition object\n // when using Object.defineProperty, so we have to procedurally build up\n // the object here.\n var dataDef = {};\n dataDef.get = function () { return this._data };\n var propsDef = {};\n propsDef.get = function () { return this._props };\n if (true) {\n dataDef.set = function () {\n warn(\n 'Avoid replacing instance root $data. ' +\n 'Use nested data properties instead.',\n this\n );\n };\n propsDef.set = function () {\n warn(\"$props is readonly.\", this);\n };\n }\n Object.defineProperty(Vue.prototype, '$data', dataDef);\n Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n Vue.prototype.$set = set;\n Vue.prototype.$delete = del;\n\n Vue.prototype.$watch = function (\n expOrFn,\n cb,\n options\n ) {\n var vm = this;\n if (isPlainObject(cb)) {\n return createWatcher(vm, expOrFn, cb, options)\n }\n options = options || {};\n options.user = true;\n var watcher = new Watcher(vm, expOrFn, cb, options);\n if (options.immediate) {\n try {\n cb.call(vm, watcher.value);\n } catch (error) {\n handleError(error, vm, (\"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\"));\n }\n }\n return function unwatchFn () {\n watcher.teardown();\n }\n };\n}\n\n/* */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n Vue.prototype._init = function (options) {\n var vm = this;\n // a uid\n vm._uid = uid$3++;\n\n var startTag, endTag;\n /* istanbul ignore if */\n if ( true && config.performance && mark) {\n startTag = \"vue-perf-start:\" + (vm._uid);\n endTag = \"vue-perf-end:\" + (vm._uid);\n mark(startTag);\n }\n\n // a flag to avoid this being observed\n vm._isVue = true;\n // merge options\n if (options && options._isComponent) {\n // optimize internal component instantiation\n // since dynamic options merging is pretty slow, and none of the\n // internal component options needs special treatment.\n initInternalComponent(vm, options);\n } else {\n vm.$options = mergeOptions(\n resolveConstructorOptions(vm.constructor),\n options || {},\n vm\n );\n }\n /* istanbul ignore else */\n if (true) {\n initProxy(vm);\n } else {}\n // expose real self\n vm._self = vm;\n initLifecycle(vm);\n initEvents(vm);\n initRender(vm);\n callHook(vm, 'beforeCreate');\n initInjections(vm); // resolve injections before data/props\n initState(vm);\n initProvide(vm); // resolve provide after data/props\n callHook(vm, 'created');\n\n /* istanbul ignore if */\n if ( true && config.performance && mark) {\n vm._name = formatComponentName(vm, false);\n mark(endTag);\n measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n }\n\n if (vm.$options.el) {\n vm.$mount(vm.$options.el);\n }\n };\n}\n\nfunction initInternalComponent (vm, options) {\n var opts = vm.$options = Object.create(vm.constructor.options);\n // doing this because it's faster than dynamic enumeration.\n var parentVnode = options._parentVnode;\n opts.parent = options.parent;\n opts._parentVnode = parentVnode;\n\n var vnodeComponentOptions = parentVnode.componentOptions;\n opts.propsData = vnodeComponentOptions.propsData;\n opts._parentListeners = vnodeComponentOptions.listeners;\n opts._renderChildren = vnodeComponentOptions.children;\n opts._componentTag = vnodeComponentOptions.tag;\n\n if (options.render) {\n opts.render = options.render;\n opts.staticRenderFns = options.staticRenderFns;\n }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n var options = Ctor.options;\n if (Ctor.super) {\n var superOptions = resolveConstructorOptions(Ctor.super);\n var cachedSuperOptions = Ctor.superOptions;\n if (superOptions !== cachedSuperOptions) {\n // super option changed,\n // need to resolve new options.\n Ctor.superOptions = superOptions;\n // check if there are any late-modified/attached options (#4976)\n var modifiedOptions = resolveModifiedOptions(Ctor);\n // update base extend options\n if (modifiedOptions) {\n extend(Ctor.extendOptions, modifiedOptions);\n }\n options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n if (options.name) {\n options.components[options.name] = Ctor;\n }\n }\n }\n return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n var modified;\n var latest = Ctor.options;\n var sealed = Ctor.sealedOptions;\n for (var key in latest) {\n if (latest[key] !== sealed[key]) {\n if (!modified) { modified = {}; }\n modified[key] = latest[key];\n }\n }\n return modified\n}\n\nfunction Vue (options) {\n if ( true &&\n !(this instanceof Vue)\n ) {\n warn('Vue is a constructor and should be called with the `new` keyword');\n }\n this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/* */\n\nfunction initUse (Vue) {\n Vue.use = function (plugin) {\n var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n if (installedPlugins.indexOf(plugin) > -1) {\n return this\n }\n\n // additional parameters\n var args = toArray(arguments, 1);\n args.unshift(this);\n if (typeof plugin.install === 'function') {\n plugin.install.apply(plugin, args);\n } else if (typeof plugin === 'function') {\n plugin.apply(null, args);\n }\n installedPlugins.push(plugin);\n return this\n };\n}\n\n/* */\n\nfunction initMixin$1 (Vue) {\n Vue.mixin = function (mixin) {\n this.options = mergeOptions(this.options, mixin);\n return this\n };\n}\n\n/* */\n\nfunction initExtend (Vue) {\n /**\n * Each instance constructor, including Vue, has a unique\n * cid. This enables us to create wrapped \"child\n * constructors\" for prototypal inheritance and cache them.\n */\n Vue.cid = 0;\n var cid = 1;\n\n /**\n * Class inheritance\n */\n Vue.extend = function (extendOptions) {\n extendOptions = extendOptions || {};\n var Super = this;\n var SuperId = Super.cid;\n var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n if (cachedCtors[SuperId]) {\n return cachedCtors[SuperId]\n }\n\n var name = extendOptions.name || Super.options.name;\n if ( true && name) {\n validateComponentName(name);\n }\n\n var Sub = function VueComponent (options) {\n this._init(options);\n };\n Sub.prototype = Object.create(Super.prototype);\n Sub.prototype.constructor = Sub;\n Sub.cid = cid++;\n Sub.options = mergeOptions(\n Super.options,\n extendOptions\n );\n Sub['super'] = Super;\n\n // For props and computed properties, we define the proxy getters on\n // the Vue instances at extension time, on the extended prototype. This\n // avoids Object.defineProperty calls for each instance created.\n if (Sub.options.props) {\n initProps$1(Sub);\n }\n if (Sub.options.computed) {\n initComputed$1(Sub);\n }\n\n // allow further extension/mixin/plugin usage\n Sub.extend = Super.extend;\n Sub.mixin = Super.mixin;\n Sub.use = Super.use;\n\n // create asset registers, so extended classes\n // can have their private assets too.\n ASSET_TYPES.forEach(function (type) {\n Sub[type] = Super[type];\n });\n // enable recursive self-lookup\n if (name) {\n Sub.options.components[name] = Sub;\n }\n\n // keep a reference to the super options at extension time.\n // later at instantiation we can check if Super's options have\n // been updated.\n Sub.superOptions = Super.options;\n Sub.extendOptions = extendOptions;\n Sub.sealedOptions = extend({}, Sub.options);\n\n // cache constructor\n cachedCtors[SuperId] = Sub;\n return Sub\n };\n}\n\nfunction initProps$1 (Comp) {\n var props = Comp.options.props;\n for (var key in props) {\n proxy(Comp.prototype, \"_props\", key);\n }\n}\n\nfunction initComputed$1 (Comp) {\n var computed = Comp.options.computed;\n for (var key in computed) {\n defineComputed(Comp.prototype, key, computed[key]);\n }\n}\n\n/* */\n\nfunction initAssetRegisters (Vue) {\n /**\n * Create asset registration methods.\n */\n ASSET_TYPES.forEach(function (type) {\n Vue[type] = function (\n id,\n definition\n ) {\n if (!definition) {\n return this.options[type + 's'][id]\n } else {\n /* istanbul ignore if */\n if ( true && type === 'component') {\n validateComponentName(id);\n }\n if (type === 'component' && isPlainObject(definition)) {\n definition.name = definition.name || id;\n definition = this.options._base.extend(definition);\n }\n if (type === 'directive' && typeof definition === 'function') {\n definition = { bind: definition, update: definition };\n }\n this.options[type + 's'][id] = definition;\n return definition\n }\n };\n });\n}\n\n/* */\n\n\n\nfunction getComponentName (opts) {\n return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n if (Array.isArray(pattern)) {\n return pattern.indexOf(name) > -1\n } else if (typeof pattern === 'string') {\n return pattern.split(',').indexOf(name) > -1\n } else if (isRegExp(pattern)) {\n return pattern.test(name)\n }\n /* istanbul ignore next */\n return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n var cache = keepAliveInstance.cache;\n var keys = keepAliveInstance.keys;\n var _vnode = keepAliveInstance._vnode;\n for (var key in cache) {\n var cachedNode = cache[key];\n if (cachedNode) {\n var name = getComponentName(cachedNode.componentOptions);\n if (name && !filter(name)) {\n pruneCacheEntry(cache, key, keys, _vnode);\n }\n }\n }\n}\n\nfunction pruneCacheEntry (\n cache,\n key,\n keys,\n current\n) {\n var cached$$1 = cache[key];\n if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n cached$$1.componentInstance.$destroy();\n }\n cache[key] = null;\n remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n name: 'keep-alive',\n abstract: true,\n\n props: {\n include: patternTypes,\n exclude: patternTypes,\n max: [String, Number]\n },\n\n created: function created () {\n this.cache = Object.create(null);\n this.keys = [];\n },\n\n destroyed: function destroyed () {\n for (var key in this.cache) {\n pruneCacheEntry(this.cache, key, this.keys);\n }\n },\n\n mounted: function mounted () {\n var this$1 = this;\n\n this.$watch('include', function (val) {\n pruneCache(this$1, function (name) { return matches(val, name); });\n });\n this.$watch('exclude', function (val) {\n pruneCache(this$1, function (name) { return !matches(val, name); });\n });\n },\n\n render: function render () {\n var slot = this.$slots.default;\n var vnode = getFirstComponentChild(slot);\n var componentOptions = vnode && vnode.componentOptions;\n if (componentOptions) {\n // check pattern\n var name = getComponentName(componentOptions);\n var ref = this;\n var include = ref.include;\n var exclude = ref.exclude;\n if (\n // not included\n (include && (!name || !matches(include, name))) ||\n // excluded\n (exclude && name && matches(exclude, name))\n ) {\n return vnode\n }\n\n var ref$1 = this;\n var cache = ref$1.cache;\n var keys = ref$1.keys;\n var key = vnode.key == null\n // same constructor may get registered as different local components\n // so cid alone is not enough (#3269)\n ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n : vnode.key;\n if (cache[key]) {\n vnode.componentInstance = cache[key].componentInstance;\n // make current key freshest\n remove(keys, key);\n keys.push(key);\n } else {\n cache[key] = vnode;\n keys.push(key);\n // prune oldest entry\n if (this.max && keys.length > parseInt(this.max)) {\n pruneCacheEntry(cache, keys[0], keys, this._vnode);\n }\n }\n\n vnode.data.keepAlive = true;\n }\n return vnode || (slot && slot[0])\n }\n};\n\nvar builtInComponents = {\n KeepAlive: KeepAlive\n};\n\n/* */\n\nfunction initGlobalAPI (Vue) {\n // config\n var configDef = {};\n configDef.get = function () { return config; };\n if (true) {\n configDef.set = function () {\n warn(\n 'Do not replace the Vue.config object, set individual fields instead.'\n );\n };\n }\n Object.defineProperty(Vue, 'config', configDef);\n\n // exposed util methods.\n // NOTE: these are not considered part of the public API - avoid relying on\n // them unless you are aware of the risk.\n Vue.util = {\n warn: warn,\n extend: extend,\n mergeOptions: mergeOptions,\n defineReactive: defineReactive$$1\n };\n\n Vue.set = set;\n Vue.delete = del;\n Vue.nextTick = nextTick;\n\n // 2.6 explicit observable API\n Vue.observable = function (obj) {\n observe(obj);\n return obj\n };\n\n Vue.options = Object.create(null);\n ASSET_TYPES.forEach(function (type) {\n Vue.options[type + 's'] = Object.create(null);\n });\n\n // this is used to identify the \"base\" constructor to extend all plain-object\n // components with in Weex's multi-instance scenarios.\n Vue.options._base = Vue;\n\n extend(Vue.options.components, builtInComponents);\n\n initUse(Vue);\n initMixin$1(Vue);\n initExtend(Vue);\n initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n get: function get () {\n /* istanbul ignore next */\n return this.$vnode && this.$vnode.ssrContext\n }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n value: FunctionalRenderContext\n});\n\nVue.version = '2.6.10';\n\n/* */\n\n// these are reserved for web because they are directly compiled away\n// during template compilation\nvar isReservedAttr = makeMap('style,class');\n\n// attributes that should be using props for binding\nvar acceptValue = makeMap('input,textarea,option,select,progress');\nvar mustUseProp = function (tag, type, attr) {\n return (\n (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n (attr === 'selected' && tag === 'option') ||\n (attr === 'checked' && tag === 'input') ||\n (attr === 'muted' && tag === 'video')\n )\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\nvar isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\nvar convertEnumeratedValue = function (key, value) {\n return isFalsyAttrValue(value) || value === 'false'\n ? 'false'\n // allow arbitrary string value for contenteditable\n : key === 'contenteditable' && isValidContentEditableValue(value)\n ? value\n : 'true'\n};\n\nvar isBooleanAttr = makeMap(\n 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n 'required,reversed,scoped,seamless,selected,sortable,translate,' +\n 'truespeed,typemustmatch,visible'\n);\n\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function (name) {\n return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n};\n\nvar getXlinkProp = function (name) {\n return isXlink(name) ? name.slice(6, name.length) : ''\n};\n\nvar isFalsyAttrValue = function (val) {\n return val == null || val === false\n};\n\n/* */\n\nfunction genClassForVnode (vnode) {\n var data = vnode.data;\n var parentNode = vnode;\n var childNode = vnode;\n while (isDef(childNode.componentInstance)) {\n childNode = childNode.componentInstance._vnode;\n if (childNode && childNode.data) {\n data = mergeClassData(childNode.data, data);\n }\n }\n while (isDef(parentNode = parentNode.parent)) {\n if (parentNode && parentNode.data) {\n data = mergeClassData(data, parentNode.data);\n }\n }\n return renderClass(data.staticClass, data.class)\n}\n\nfunction mergeClassData (child, parent) {\n return {\n staticClass: concat(child.staticClass, parent.staticClass),\n class: isDef(child.class)\n ? [child.class, parent.class]\n : parent.class\n }\n}\n\nfunction renderClass (\n staticClass,\n dynamicClass\n) {\n if (isDef(staticClass) || isDef(dynamicClass)) {\n return concat(staticClass, stringifyClass(dynamicClass))\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction concat (a, b) {\n return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n if (Array.isArray(value)) {\n return stringifyArray(value)\n }\n if (isObject(value)) {\n return stringifyObject(value)\n }\n if (typeof value === 'string') {\n return value\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction stringifyArray (value) {\n var res = '';\n var stringified;\n for (var i = 0, l = value.length; i < l; i++) {\n if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n if (res) { res += ' '; }\n res += stringified;\n }\n }\n return res\n}\n\nfunction stringifyObject (value) {\n var res = '';\n for (var key in value) {\n if (value[key]) {\n if (res) { res += ' '; }\n res += key;\n }\n }\n return res\n}\n\n/* */\n\nvar namespaceMap = {\n svg: 'http://www.w3.org/2000/svg',\n math: 'http://www.w3.org/1998/Math/MathML'\n};\n\nvar isHTMLTag = makeMap(\n 'html,body,base,head,link,meta,style,title,' +\n 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n 'embed,object,param,source,canvas,script,noscript,del,ins,' +\n 'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n 'output,progress,select,textarea,' +\n 'details,dialog,menu,menuitem,summary,' +\n 'content,element,shadow,template,blockquote,iframe,tfoot'\n);\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\nvar isSVG = makeMap(\n 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n 'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n true\n);\n\nvar isReservedTag = function (tag) {\n return isHTMLTag(tag) || isSVG(tag)\n};\n\nfunction getTagNamespace (tag) {\n if (isSVG(tag)) {\n return 'svg'\n }\n // basic support for MathML\n // note it doesn't support other MathML elements being component roots\n if (tag === 'math') {\n return 'math'\n }\n}\n\nvar unknownElementCache = Object.create(null);\nfunction isUnknownElement (tag) {\n /* istanbul ignore if */\n if (!inBrowser) {\n return true\n }\n if (isReservedTag(tag)) {\n return false\n }\n tag = tag.toLowerCase();\n /* istanbul ignore if */\n if (unknownElementCache[tag] != null) {\n return unknownElementCache[tag]\n }\n var el = document.createElement(tag);\n if (tag.indexOf('-') > -1) {\n // http://stackoverflow.com/a/28210364/1070244\n return (unknownElementCache[tag] = (\n el.constructor === window.HTMLUnknownElement ||\n el.constructor === window.HTMLElement\n ))\n } else {\n return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n/* */\n\n/**\n * Query an element selector if it's not an element already.\n */\nfunction query (el) {\n if (typeof el === 'string') {\n var selected = document.querySelector(el);\n if (!selected) {\n true && warn(\n 'Cannot find element: ' + el\n );\n return document.createElement('div')\n }\n return selected\n } else {\n return el\n }\n}\n\n/* */\n\nfunction createElement$1 (tagName, vnode) {\n var elm = document.createElement(tagName);\n if (tagName !== 'select') {\n return elm\n }\n // false or null will remove the attribute but undefined will not\n if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n elm.setAttribute('multiple', 'multiple');\n }\n return elm\n}\n\nfunction createElementNS (namespace, tagName) {\n return document.createElementNS(namespaceMap[namespace], tagName)\n}\n\nfunction createTextNode (text) {\n return document.createTextNode(text)\n}\n\nfunction createComment (text) {\n return document.createComment(text)\n}\n\nfunction insertBefore (parentNode, newNode, referenceNode) {\n parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild (node, child) {\n node.removeChild(child);\n}\n\nfunction appendChild (node, child) {\n node.appendChild(child);\n}\n\nfunction parentNode (node) {\n return node.parentNode\n}\n\nfunction nextSibling (node) {\n return node.nextSibling\n}\n\nfunction tagName (node) {\n return node.tagName\n}\n\nfunction setTextContent (node, text) {\n node.textContent = text;\n}\n\nfunction setStyleScope (node, scopeId) {\n node.setAttribute(scopeId, '');\n}\n\nvar nodeOps = /*#__PURE__*/Object.freeze({\n createElement: createElement$1,\n createElementNS: createElementNS,\n createTextNode: createTextNode,\n createComment: createComment,\n insertBefore: insertBefore,\n removeChild: removeChild,\n appendChild: appendChild,\n parentNode: parentNode,\n nextSibling: nextSibling,\n tagName: tagName,\n setTextContent: setTextContent,\n setStyleScope: setStyleScope\n});\n\n/* */\n\nvar ref = {\n create: function create (_, vnode) {\n registerRef(vnode);\n },\n update: function update (oldVnode, vnode) {\n if (oldVnode.data.ref !== vnode.data.ref) {\n registerRef(oldVnode, true);\n registerRef(vnode);\n }\n },\n destroy: function destroy (vnode) {\n registerRef(vnode, true);\n }\n};\n\nfunction registerRef (vnode, isRemoval) {\n var key = vnode.data.ref;\n if (!isDef(key)) { return }\n\n var vm = vnode.context;\n var ref = vnode.componentInstance || vnode.elm;\n var refs = vm.$refs;\n if (isRemoval) {\n if (Array.isArray(refs[key])) {\n remove(refs[key], ref);\n } else if (refs[key] === ref) {\n refs[key] = undefined;\n }\n } else {\n if (vnode.data.refInFor) {\n if (!Array.isArray(refs[key])) {\n refs[key] = [ref];\n } else if (refs[key].indexOf(ref) < 0) {\n // $flow-disable-line\n refs[key].push(ref);\n }\n } else {\n refs[key] = ref;\n }\n }\n}\n\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\nvar emptyNode = new VNode('', {}, []);\n\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode (a, b) {\n return (\n a.key === b.key && (\n (\n a.tag === b.tag &&\n a.isComment === b.isComment &&\n isDef(a.data) === isDef(b.data) &&\n sameInputType(a, b)\n ) || (\n isTrue(a.isAsyncPlaceholder) &&\n a.asyncFactory === b.asyncFactory &&\n isUndef(b.asyncFactory.error)\n )\n )\n )\n}\n\nfunction sameInputType (a, b) {\n if (a.tag !== 'input') { return true }\n var i;\n var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n}\n\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n var i, key;\n var map = {};\n for (i = beginIdx; i <= endIdx; ++i) {\n key = children[i].key;\n if (isDef(key)) { map[key] = i; }\n }\n return map\n}\n\nfunction createPatchFunction (backend) {\n var i, j;\n var cbs = {};\n\n var modules = backend.modules;\n var nodeOps = backend.nodeOps;\n\n for (i = 0; i < hooks.length; ++i) {\n cbs[hooks[i]] = [];\n for (j = 0; j < modules.length; ++j) {\n if (isDef(modules[j][hooks[i]])) {\n cbs[hooks[i]].push(modules[j][hooks[i]]);\n }\n }\n }\n\n function emptyNodeAt (elm) {\n return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n }\n\n function createRmCb (childElm, listeners) {\n function remove$$1 () {\n if (--remove$$1.listeners === 0) {\n removeNode(childElm);\n }\n }\n remove$$1.listeners = listeners;\n return remove$$1\n }\n\n function removeNode (el) {\n var parent = nodeOps.parentNode(el);\n // element may have already been removed due to v-html / v-text\n if (isDef(parent)) {\n nodeOps.removeChild(parent, el);\n }\n }\n\n function isUnknownElement$$1 (vnode, inVPre) {\n return (\n !inVPre &&\n !vnode.ns &&\n !(\n config.ignoredElements.length &&\n config.ignoredElements.some(function (ignore) {\n return isRegExp(ignore)\n ? ignore.test(vnode.tag)\n : ignore === vnode.tag\n })\n ) &&\n config.isUnknownElement(vnode.tag)\n )\n }\n\n var creatingElmInVPre = 0;\n\n function createElm (\n vnode,\n insertedVnodeQueue,\n parentElm,\n refElm,\n nested,\n ownerArray,\n index\n ) {\n if (isDef(vnode.elm) && isDef(ownerArray)) {\n // This vnode was used in a previous render!\n // now it's used as a new node, overwriting its elm would cause\n // potential patch errors down the road when it's used as an insertion\n // reference node. Instead, we clone the node on-demand before creating\n // associated DOM element for it.\n vnode = ownerArray[index] = cloneVNode(vnode);\n }\n\n vnode.isRootInsert = !nested; // for transition enter check\n if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n return\n }\n\n var data = vnode.data;\n var children = vnode.children;\n var tag = vnode.tag;\n if (isDef(tag)) {\n if (true) {\n if (data && data.pre) {\n creatingElmInVPre++;\n }\n if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n warn(\n 'Unknown custom element: <' + tag + '> - did you ' +\n 'register the component correctly? For recursive components, ' +\n 'make sure to provide the \"name\" option.',\n vnode.context\n );\n }\n }\n\n vnode.elm = vnode.ns\n ? nodeOps.createElementNS(vnode.ns, tag)\n : nodeOps.createElement(tag, vnode);\n setScope(vnode);\n\n /* istanbul ignore if */\n {\n createChildren(vnode, children, insertedVnodeQueue);\n if (isDef(data)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n }\n insert(parentElm, vnode.elm, refElm);\n }\n\n if ( true && data && data.pre) {\n creatingElmInVPre--;\n }\n } else if (isTrue(vnode.isComment)) {\n vnode.elm = nodeOps.createComment(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n } else {\n vnode.elm = nodeOps.createTextNode(vnode.text);\n insert(parentElm, vnode.elm, refElm);\n }\n }\n\n function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n var i = vnode.data;\n if (isDef(i)) {\n var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n if (isDef(i = i.hook) && isDef(i = i.init)) {\n i(vnode, false /* hydrating */);\n }\n // after calling the init hook, if the vnode is a child component\n // it should've created a child instance and mounted it. the child\n // component also has set the placeholder vnode's elm.\n // in that case we can just return the element and be done.\n if (isDef(vnode.componentInstance)) {\n initComponent(vnode, insertedVnodeQueue);\n insert(parentElm, vnode.elm, refElm);\n if (isTrue(isReactivated)) {\n reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n }\n return true\n }\n }\n }\n\n function initComponent (vnode, insertedVnodeQueue) {\n if (isDef(vnode.data.pendingInsert)) {\n insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n vnode.data.pendingInsert = null;\n }\n vnode.elm = vnode.componentInstance.$el;\n if (isPatchable(vnode)) {\n invokeCreateHooks(vnode, insertedVnodeQueue);\n setScope(vnode);\n } else {\n // empty component root.\n // skip all element-related modules except for ref (#3455)\n registerRef(vnode);\n // make sure to invoke the insert hook\n insertedVnodeQueue.push(vnode);\n }\n }\n\n function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n var i;\n // hack for #4339: a reactivated component with inner transition\n // does not trigger because the inner node's created hooks are not called\n // again. It's not ideal to involve module-specific logic in here but\n // there doesn't seem to be a better way to do it.\n var innerNode = vnode;\n while (innerNode.componentInstance) {\n innerNode = innerNode.componentInstance._vnode;\n if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n for (i = 0; i < cbs.activate.length; ++i) {\n cbs.activate[i](emptyNode, innerNode);\n }\n insertedVnodeQueue.push(innerNode);\n break\n }\n }\n // unlike a newly created component,\n // a reactivated keep-alive component doesn't insert itself\n insert(parentElm, vnode.elm, refElm);\n }\n\n function insert (parent, elm, ref$$1) {\n if (isDef(parent)) {\n if (isDef(ref$$1)) {\n if (nodeOps.parentNode(ref$$1) === parent) {\n nodeOps.insertBefore(parent, elm, ref$$1);\n }\n } else {\n nodeOps.appendChild(parent, elm);\n }\n }\n }\n\n function createChildren (vnode, children, insertedVnodeQueue) {\n if (Array.isArray(children)) {\n if (true) {\n checkDuplicateKeys(children);\n }\n for (var i = 0; i < children.length; ++i) {\n createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n }\n } else if (isPrimitive(vnode.text)) {\n nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n }\n }\n\n function isPatchable (vnode) {\n while (vnode.componentInstance) {\n vnode = vnode.componentInstance._vnode;\n }\n return isDef(vnode.tag)\n }\n\n function invokeCreateHooks (vnode, insertedVnodeQueue) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, vnode);\n }\n i = vnode.data.hook; // Reuse variable\n if (isDef(i)) {\n if (isDef(i.create)) { i.create(emptyNode, vnode); }\n if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n }\n }\n\n // set scope id attribute for scoped CSS.\n // this is implemented as a special case to avoid the overhead\n // of going through the normal attribute patching process.\n function setScope (vnode) {\n var i;\n if (isDef(i = vnode.fnScopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n } else {\n var ancestor = vnode;\n while (ancestor) {\n if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n ancestor = ancestor.parent;\n }\n }\n // for slot content they should also get the scopeId from the host instance.\n if (isDef(i = activeInstance) &&\n i !== vnode.context &&\n i !== vnode.fnContext &&\n isDef(i = i.$options._scopeId)\n ) {\n nodeOps.setStyleScope(vnode.elm, i);\n }\n }\n\n function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n for (; startIdx <= endIdx; ++startIdx) {\n createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n }\n }\n\n function invokeDestroyHook (vnode) {\n var i, j;\n var data = vnode.data;\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n }\n if (isDef(i = vnode.children)) {\n for (j = 0; j < vnode.children.length; ++j) {\n invokeDestroyHook(vnode.children[j]);\n }\n }\n }\n\n function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n for (; startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx];\n if (isDef(ch)) {\n if (isDef(ch.tag)) {\n removeAndInvokeRemoveHook(ch);\n invokeDestroyHook(ch);\n } else { // Text node\n removeNode(ch.elm);\n }\n }\n }\n }\n\n function removeAndInvokeRemoveHook (vnode, rm) {\n if (isDef(rm) || isDef(vnode.data)) {\n var i;\n var listeners = cbs.remove.length + 1;\n if (isDef(rm)) {\n // we have a recursively passed down rm callback\n // increase the listeners count\n rm.listeners += listeners;\n } else {\n // directly removing\n rm = createRmCb(vnode.elm, listeners);\n }\n // recursively invoke hooks on child component root node\n if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n removeAndInvokeRemoveHook(i, rm);\n }\n for (i = 0; i < cbs.remove.length; ++i) {\n cbs.remove[i](vnode, rm);\n }\n if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n i(vnode, rm);\n } else {\n rm();\n }\n } else {\n removeNode(vnode.elm);\n }\n }\n\n function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n var oldStartIdx = 0;\n var newStartIdx = 0;\n var oldEndIdx = oldCh.length - 1;\n var oldStartVnode = oldCh[0];\n var oldEndVnode = oldCh[oldEndIdx];\n var newEndIdx = newCh.length - 1;\n var newStartVnode = newCh[0];\n var newEndVnode = newCh[newEndIdx];\n var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n // removeOnly is a special flag used only by <transition-group>\n // to ensure removed elements stay in correct relative positions\n // during leaving transitions\n var canMove = !removeOnly;\n\n if (true) {\n checkDuplicateKeys(newCh);\n }\n\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (isUndef(oldStartVnode)) {\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n } else if (isUndef(oldEndVnode)) {\n oldEndVnode = oldCh[--oldEndIdx];\n } else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n } else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n oldStartVnode = oldCh[++oldStartIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n oldEndVnode = oldCh[--oldEndIdx];\n newStartVnode = newCh[++newStartIdx];\n } else {\n if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n idxInOld = isDef(newStartVnode.key)\n ? oldKeyToIdx[newStartVnode.key]\n : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n if (isUndef(idxInOld)) { // New element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n } else {\n vnodeToMove = oldCh[idxInOld];\n if (sameVnode(vnodeToMove, newStartVnode)) {\n patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n oldCh[idxInOld] = undefined;\n canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n } else {\n // same key but different element. treat as new element\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n }\n }\n newStartVnode = newCh[++newStartIdx];\n }\n }\n if (oldStartIdx > oldEndIdx) {\n refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n } else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n }\n }\n\n function checkDuplicateKeys (children) {\n var seenKeys = {};\n for (var i = 0; i < children.length; i++) {\n var vnode = children[i];\n var key = vnode.key;\n if (isDef(key)) {\n if (seenKeys[key]) {\n warn(\n (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n vnode.context\n );\n } else {\n seenKeys[key] = true;\n }\n }\n }\n }\n\n function findIdxInOld (node, oldCh, start, end) {\n for (var i = start; i < end; i++) {\n var c = oldCh[i];\n if (isDef(c) && sameVnode(node, c)) { return i }\n }\n }\n\n function patchVnode (\n oldVnode,\n vnode,\n insertedVnodeQueue,\n ownerArray,\n index,\n removeOnly\n ) {\n if (oldVnode === vnode) {\n return\n }\n\n if (isDef(vnode.elm) && isDef(ownerArray)) {\n // clone reused vnode\n vnode = ownerArray[index] = cloneVNode(vnode);\n }\n\n var elm = vnode.elm = oldVnode.elm;\n\n if (isTrue(oldVnode.isAsyncPlaceholder)) {\n if (isDef(vnode.asyncFactory.resolved)) {\n hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n } else {\n vnode.isAsyncPlaceholder = true;\n }\n return\n }\n\n // reuse element for static trees.\n // note we only do this if the vnode is cloned -\n // if the new node is not cloned it means the render functions have been\n // reset by the hot-reload-api and we need to do a proper re-render.\n if (isTrue(vnode.isStatic) &&\n isTrue(oldVnode.isStatic) &&\n vnode.key === oldVnode.key &&\n (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n ) {\n vnode.componentInstance = oldVnode.componentInstance;\n return\n }\n\n var i;\n var data = vnode.data;\n if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n i(oldVnode, vnode);\n }\n\n var oldCh = oldVnode.children;\n var ch = vnode.children;\n if (isDef(data) && isPatchable(vnode)) {\n for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n }\n if (isUndef(vnode.text)) {\n if (isDef(oldCh) && isDef(ch)) {\n if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n } else if (isDef(ch)) {\n if (true) {\n checkDuplicateKeys(ch);\n }\n if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n } else if (isDef(oldCh)) {\n removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n } else if (isDef(oldVnode.text)) {\n nodeOps.setTextContent(elm, '');\n }\n } else if (oldVnode.text !== vnode.text) {\n nodeOps.setTextContent(elm, vnode.text);\n }\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n }\n }\n\n function invokeInsertHook (vnode, queue, initial) {\n // delay insert hooks for component root nodes, invoke them after the\n // element is really inserted\n if (isTrue(initial) && isDef(vnode.parent)) {\n vnode.parent.data.pendingInsert = queue;\n } else {\n for (var i = 0; i < queue.length; ++i) {\n queue[i].data.hook.insert(queue[i]);\n }\n }\n }\n\n var hydrationBailed = false;\n // list of modules that can skip create hook during hydration because they\n // are already rendered on the client or has no need for initialization\n // Note: style is excluded because it relies on initial clone for future\n // deep updates (#7063).\n var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n // Note: this is a browser-only function so we can assume elms are DOM nodes.\n function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n var i;\n var tag = vnode.tag;\n var data = vnode.data;\n var children = vnode.children;\n inVPre = inVPre || (data && data.pre);\n vnode.elm = elm;\n\n if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n vnode.isAsyncPlaceholder = true;\n return true\n }\n // assert node match\n if (true) {\n if (!assertNodeMatch(elm, vnode, inVPre)) {\n return false\n }\n }\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n if (isDef(i = vnode.componentInstance)) {\n // child component. it should have hydrated its own tree.\n initComponent(vnode, insertedVnodeQueue);\n return true\n }\n }\n if (isDef(tag)) {\n if (isDef(children)) {\n // empty element, allow client to pick up and populate children\n if (!elm.hasChildNodes()) {\n createChildren(vnode, children, insertedVnodeQueue);\n } else {\n // v-html and domProps: innerHTML\n if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n if (i !== elm.innerHTML) {\n /* istanbul ignore if */\n if ( true &&\n typeof console !== 'undefined' &&\n !hydrationBailed\n ) {\n hydrationBailed = true;\n console.warn('Parent: ', elm);\n console.warn('server innerHTML: ', i);\n console.warn('client innerHTML: ', elm.innerHTML);\n }\n return false\n }\n } else {\n // iterate and compare children lists\n var childrenMatch = true;\n var childNode = elm.firstChild;\n for (var i$1 = 0; i$1 < children.length; i$1++) {\n if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n childrenMatch = false;\n break\n }\n childNode = childNode.nextSibling;\n }\n // if childNode is not null, it means the actual childNodes list is\n // longer than the virtual children list.\n if (!childrenMatch || childNode) {\n /* istanbul ignore if */\n if ( true &&\n typeof console !== 'undefined' &&\n !hydrationBailed\n ) {\n hydrationBailed = true;\n console.warn('Parent: ', elm);\n console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n }\n return false\n }\n }\n }\n }\n if (isDef(data)) {\n var fullInvoke = false;\n for (var key in data) {\n if (!isRenderedModule(key)) {\n fullInvoke = true;\n invokeCreateHooks(vnode, insertedVnodeQueue);\n break\n }\n }\n if (!fullInvoke && data['class']) {\n // ensure collecting deps for deep class bindings for future updates\n traverse(data['class']);\n }\n }\n } else if (elm.data !== vnode.text) {\n elm.data = vnode.text;\n }\n return true\n }\n\n function assertNodeMatch (node, vnode, inVPre) {\n if (isDef(vnode.tag)) {\n return vnode.tag.indexOf('vue-component') === 0 || (\n !isUnknownElement$$1(vnode, inVPre) &&\n vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n )\n } else {\n return node.nodeType === (vnode.isComment ? 8 : 3)\n }\n }\n\n return function patch (oldVnode, vnode, hydrating, removeOnly) {\n if (isUndef(vnode)) {\n if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n return\n }\n\n var isInitialPatch = false;\n var insertedVnodeQueue = [];\n\n if (isUndef(oldVnode)) {\n // empty mount (likely as component), create new root element\n isInitialPatch = true;\n createElm(vnode, insertedVnodeQueue);\n } else {\n var isRealElement = isDef(oldVnode.nodeType);\n if (!isRealElement && sameVnode(oldVnode, vnode)) {\n // patch existing root node\n patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n } else {\n if (isRealElement) {\n // mounting to a real element\n // check if this is server-rendered content and if we can perform\n // a successful hydration.\n if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n oldVnode.removeAttribute(SSR_ATTR);\n hydrating = true;\n }\n if (isTrue(hydrating)) {\n if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n invokeInsertHook(vnode, insertedVnodeQueue, true);\n return oldVnode\n } else if (true) {\n warn(\n 'The client-side rendered virtual DOM tree is not matching ' +\n 'server-rendered content. This is likely caused by incorrect ' +\n 'HTML markup, for example nesting block-level elements inside ' +\n '<p>, or missing <tbody>. Bailing hydration and performing ' +\n 'full client-side render.'\n );\n }\n }\n // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n // replacing existing element\n var oldElm = oldVnode.elm;\n var parentElm = nodeOps.parentNode(oldElm);\n\n // create new node\n createElm(\n vnode,\n insertedVnodeQueue,\n // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm,\n nodeOps.nextSibling(oldElm)\n );\n\n // update parent placeholder node element, recursively\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n ancestor.elm = vnode.elm;\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n }\n // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n var insert = ancestor.data.hook.insert;\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n ancestor = ancestor.parent;\n }\n }\n\n // destroy old node\n if (isDef(parentElm)) {\n removeVnodes(parentElm, [oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm\n }\n}\n\n/* */\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives (vnode) {\n updateDirectives(vnode, emptyNode);\n }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update (oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n\n var key, oldDir, dir;\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n dir.oldArg = oldDir.arg;\n callHook$1(dir, 'update', vnode, oldVnode);\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function () {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n dirs,\n vm\n) {\n var res = Object.create(null);\n if (!dirs) {\n // $flow-disable-line\n return res\n }\n var i, dir;\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n }\n // $flow-disable-line\n return res\n}\n\nfunction getRawDirName (dir) {\n return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n }\n }\n}\n\nvar baseModules = [\n ref,\n directives\n];\n\n/* */\n\nfunction updateAttrs (oldVnode, vnode) {\n var opts = vnode.componentOptions;\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return\n }\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return\n }\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n setAttr(elm, key, cur);\n }\n }\n // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n /* istanbul ignore if */\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr (el, key, value) {\n if (el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. <option disabled>Select one</option>\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for <iframe>,\n // but Flash expects a value of \"true\" when used on <embed> tag\n value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n ? 'true'\n : key;\n el.setAttribute(key, value);\n }\n } else if (isEnumeratedAttr(key)) {\n el.setAttribute(key, convertEnumeratedValue(key, value));\n } else if (isXlink(key)) {\n if (isFalsyAttrValue(value)) {\n el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else {\n el.setAttributeNS(xlinkNS, key, value);\n }\n } else {\n baseSetAttr(el, key, value);\n }\n}\n\nfunction baseSetAttr (el, key, value) {\n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // #7138: IE10 & 11 fires input event when setting placeholder on\n // <textarea>... block the first input event and remove the blocker\n // immediately.\n /* istanbul ignore if */\n if (\n isIE && !isIE9 &&\n el.tagName === 'TEXTAREA' &&\n key === 'placeholder' && value !== '' && !el.__ieph\n ) {\n var blocker = function (e) {\n e.stopImmediatePropagation();\n el.removeEventListener('input', blocker);\n };\n el.addEventListener('input', blocker);\n // $flow-disable-line\n el.__ieph = true; /* IE placeholder patched */\n }\n el.setAttribute(key, value);\n }\n}\n\nvar attrs = {\n create: updateAttrs,\n update: updateAttrs\n};\n\n/* */\n\nfunction updateClass (oldVnode, vnode) {\n var el = vnode.elm;\n var data = vnode.data;\n var oldData = oldVnode.data;\n if (\n isUndef(data.staticClass) &&\n isUndef(data.class) && (\n isUndef(oldData) || (\n isUndef(oldData.staticClass) &&\n isUndef(oldData.class)\n )\n )\n ) {\n return\n }\n\n var cls = genClassForVnode(vnode);\n\n // handle transition classes\n var transitionClass = el._transitionClasses;\n if (isDef(transitionClass)) {\n cls = concat(cls, stringifyClass(transitionClass));\n }\n\n // set the class\n if (cls !== el._prevClass) {\n el.setAttribute('class', cls);\n el._prevClass = cls;\n }\n}\n\nvar klass = {\n create: updateClass,\n update: updateClass\n};\n\n/* */\n\n/* */\n\n/* */\n\n/* */\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n\n/* */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\nfunction normalizeEvents (on) {\n /* istanbul ignore if */\n if (isDef(on[RANGE_TOKEN])) {\n // IE input[type=range] only supports `change` event\n var event = isIE ? 'change' : 'input';\n on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n delete on[RANGE_TOKEN];\n }\n // This was originally intended to fix #4521 but no longer necessary\n // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n /* istanbul ignore if */\n if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n delete on[CHECKBOX_RADIO_TOKEN];\n }\n}\n\nvar target$1;\n\nfunction createOnceHandler$1 (event, handler, capture) {\n var _target = target$1; // save current target element in closure\n return function onceHandler () {\n var res = handler.apply(null, arguments);\n if (res !== null) {\n remove$2(event, onceHandler, capture, _target);\n }\n }\n}\n\n// #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n// implementation and does not fire microtasks in between event propagation, so\n// safe to exclude.\nvar useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\nfunction add$1 (\n name,\n handler,\n capture,\n passive\n) {\n // async edge case #6566: inner click event triggers patch, event handler\n // attached to outer element during patch, and triggered again. This\n // happens because browsers fire microtask ticks between event propagation.\n // the solution is simple: we save the timestamp when a handler is attached,\n // and the handler would only fire if the event passed to it was fired\n // AFTER it was attached.\n if (useMicrotaskFix) {\n var attachedTimestamp = currentFlushTimestamp;\n var original = handler;\n handler = original._wrapper = function (e) {\n if (\n // no bubbling, should always fire.\n // this is just a safety net in case event.timeStamp is unreliable in\n // certain weird environments...\n e.target === e.currentTarget ||\n // event is fired after handler attachment\n e.timeStamp >= attachedTimestamp ||\n // bail for environments that have buggy event.timeStamp implementations\n // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState\n // #9681 QtWebEngine event.timeStamp is negative value\n e.timeStamp <= 0 ||\n // #9448 bail if event is fired in another document in a multi-page\n // electron/nw.js app, since event.timeStamp will be using a different\n // starting reference\n e.target.ownerDocument !== document\n ) {\n return original.apply(this, arguments)\n }\n };\n }\n target$1.addEventListener(\n name,\n handler,\n supportsPassive\n ? { capture: capture, passive: passive }\n : capture\n );\n}\n\nfunction remove$2 (\n name,\n handler,\n capture,\n _target\n) {\n (_target || target$1).removeEventListener(\n name,\n handler._wrapper || handler,\n capture\n );\n}\n\nfunction updateDOMListeners (oldVnode, vnode) {\n if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n return\n }\n var on = vnode.data.on || {};\n var oldOn = oldVnode.data.on || {};\n target$1 = vnode.elm;\n normalizeEvents(on);\n updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n target$1 = undefined;\n}\n\nvar events = {\n create: updateDOMListeners,\n update: updateDOMListeners\n};\n\n/* */\n\nvar svgContainer;\n\nfunction updateDOMProps (oldVnode, vnode) {\n if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n return\n }\n var key, cur;\n var elm = vnode.elm;\n var oldProps = oldVnode.data.domProps || {};\n var props = vnode.data.domProps || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(props.__ob__)) {\n props = vnode.data.domProps = extend({}, props);\n }\n\n for (key in oldProps) {\n if (!(key in props)) {\n elm[key] = '';\n }\n }\n\n for (key in props) {\n cur = props[key];\n // ignore children if the node has textContent or innerHTML,\n // as these will throw away existing DOM nodes and cause removal errors\n // on subsequent patches (#3360)\n if (key === 'textContent' || key === 'innerHTML') {\n if (vnode.children) { vnode.children.length = 0; }\n if (cur === oldProps[key]) { continue }\n // #6601 work around Chrome version <= 55 bug where single textNode\n // replaced by innerHTML/textContent retains its parentNode property\n if (elm.childNodes.length === 1) {\n elm.removeChild(elm.childNodes[0]);\n }\n }\n\n if (key === 'value' && elm.tagName !== 'PROGRESS') {\n // store value as _value as well since\n // non-string values will be stringified\n elm._value = cur;\n // avoid resetting cursor position when value is the same\n var strCur = isUndef(cur) ? '' : String(cur);\n if (shouldUpdateValue(elm, strCur)) {\n elm.value = strCur;\n }\n } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n // IE doesn't support innerHTML for SVG elements\n svgContainer = svgContainer || document.createElement('div');\n svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n var svg = svgContainer.firstChild;\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n while (svg.firstChild) {\n elm.appendChild(svg.firstChild);\n }\n } else if (\n // skip the update if old and new VDOM state is the same.\n // `value` is handled separately because the DOM value may be temporarily\n // out of sync with VDOM state due to focus, composition and modifiers.\n // This #4521 by skipping the unnecesarry `checked` update.\n cur !== oldProps[key]\n ) {\n // some property updates can throw\n // e.g. `value` on <progress> w/ non-finite value\n try {\n elm[key] = cur;\n } catch (e) {}\n }\n }\n}\n\n// check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue (elm, checkVal) {\n return (!elm.composing && (\n elm.tagName === 'OPTION' ||\n isNotInFocusAndDirty(elm, checkVal) ||\n isDirtyWithModifiers(elm, checkVal)\n ))\n}\n\nfunction isNotInFocusAndDirty (elm, checkVal) {\n // return true when textbox (.number and .trim) loses focus and its value is\n // not equal to the updated value\n var notInFocus = true;\n // #6157\n // work around IE bug when accessing document.activeElement in an iframe\n try { notInFocus = document.activeElement !== elm; } catch (e) {}\n return notInFocus && elm.value !== checkVal\n}\n\nfunction isDirtyWithModifiers (elm, newVal) {\n var value = elm.value;\n var modifiers = elm._vModifiers; // injected by v-model runtime\n if (isDef(modifiers)) {\n if (modifiers.number) {\n return toNumber(value) !== toNumber(newVal)\n }\n if (modifiers.trim) {\n return value.trim() !== newVal.trim()\n }\n }\n return value !== newVal\n}\n\nvar domProps = {\n create: updateDOMProps,\n update: updateDOMProps\n};\n\n/* */\n\nvar parseStyleText = cached(function (cssText) {\n var res = {};\n var listDelimiter = /;(?![^(]*\\))/g;\n var propertyDelimiter = /:(.+)/;\n cssText.split(listDelimiter).forEach(function (item) {\n if (item) {\n var tmp = item.split(propertyDelimiter);\n tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return res\n});\n\n// merge static and dynamic style data on the same vnode\nfunction normalizeStyleData (data) {\n var style = normalizeStyleBinding(data.style);\n // static style is pre-processed into an object during compilation\n // and is always a fresh object, so it's safe to merge into it\n return data.staticStyle\n ? extend(data.staticStyle, style)\n : style\n}\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n if (Array.isArray(bindingStyle)) {\n return toObject(bindingStyle)\n }\n if (typeof bindingStyle === 'string') {\n return parseStyleText(bindingStyle)\n }\n return bindingStyle\n}\n\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\nfunction getStyle (vnode, checkChild) {\n var res = {};\n var styleData;\n\n if (checkChild) {\n var childNode = vnode;\n while (childNode.componentInstance) {\n childNode = childNode.componentInstance._vnode;\n if (\n childNode && childNode.data &&\n (styleData = normalizeStyleData(childNode.data))\n ) {\n extend(res, styleData);\n }\n }\n }\n\n if ((styleData = normalizeStyleData(vnode.data))) {\n extend(res, styleData);\n }\n\n var parentNode = vnode;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n extend(res, styleData);\n }\n }\n return res\n}\n\n/* */\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\nvar setProp = function (el, name, val) {\n /* istanbul ignore if */\n if (cssVarRE.test(name)) {\n el.style.setProperty(name, val);\n } else if (importantRE.test(val)) {\n el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n } else {\n var normalizedName = normalize(name);\n if (Array.isArray(val)) {\n // Support values array created by autoprefixer, e.g.\n // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n // Set them one by one, and the browser will only set those it can recognize\n for (var i = 0, len = val.length; i < len; i++) {\n el.style[normalizedName] = val[i];\n }\n } else {\n el.style[normalizedName] = val;\n }\n }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\n\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n emptyStyle = emptyStyle || document.createElement('div').style;\n prop = camelize(prop);\n if (prop !== 'filter' && (prop in emptyStyle)) {\n return prop\n }\n var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n for (var i = 0; i < vendorNames.length; i++) {\n var name = vendorNames[i] + capName;\n if (name in emptyStyle) {\n return name\n }\n }\n});\n\nfunction updateStyle (oldVnode, vnode) {\n var data = vnode.data;\n var oldData = oldVnode.data;\n\n if (isUndef(data.staticStyle) && isUndef(data.style) &&\n isUndef(oldData.staticStyle) && isUndef(oldData.style)\n ) {\n return\n }\n\n var cur, name;\n var el = vnode.elm;\n var oldStaticStyle = oldData.staticStyle;\n var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n var oldStyle = oldStaticStyle || oldStyleBinding;\n\n var style = normalizeStyleBinding(vnode.data.style) || {};\n\n // store normalized style under a different key for next diff\n // make sure to clone it if it's reactive, since the user likely wants\n // to mutate it.\n vnode.data.normalizedStyle = isDef(style.__ob__)\n ? extend({}, style)\n : style;\n\n var newStyle = getStyle(vnode, true);\n\n for (name in oldStyle) {\n if (isUndef(newStyle[name])) {\n setProp(el, name, '');\n }\n }\n for (name in newStyle) {\n cur = newStyle[name];\n if (cur !== oldStyle[name]) {\n // ie9 setting to null has no effect, must use empty string\n setProp(el, name, cur == null ? '' : cur);\n }\n }\n}\n\nvar style = {\n create: updateStyle,\n update: updateStyle\n};\n\n/* */\n\nvar whitespaceRE = /\\s+/;\n\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction addClass (el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return\n }\n\n /* istanbul ignore else */\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });\n } else {\n el.classList.add(cls);\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n if (cur.indexOf(' ' + cls + ' ') < 0) {\n el.setAttribute('class', (cur + cls).trim());\n }\n }\n}\n\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction removeClass (el, cls) {\n /* istanbul ignore if */\n if (!cls || !(cls = cls.trim())) {\n return\n }\n\n /* istanbul ignore else */\n if (el.classList) {\n if (cls.indexOf(' ') > -1) {\n cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });\n } else {\n el.classList.remove(cls);\n }\n if (!el.classList.length) {\n el.removeAttribute('class');\n }\n } else {\n var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n var tar = ' ' + cls + ' ';\n while (cur.indexOf(tar) >= 0) {\n cur = cur.replace(tar, ' ');\n }\n cur = cur.trim();\n if (cur) {\n el.setAttribute('class', cur);\n } else {\n el.removeAttribute('class');\n }\n }\n}\n\n/* */\n\nfunction resolveTransition (def$$1) {\n if (!def$$1) {\n return\n }\n /* istanbul ignore else */\n if (typeof def$$1 === 'object') {\n var res = {};\n if (def$$1.css !== false) {\n extend(res, autoCssTransition(def$$1.name || 'v'));\n }\n extend(res, def$$1);\n return res\n } else if (typeof def$$1 === 'string') {\n return autoCssTransition(def$$1)\n }\n}\n\nvar autoCssTransition = cached(function (name) {\n return {\n enterClass: (name + \"-enter\"),\n enterToClass: (name + \"-enter-to\"),\n enterActiveClass: (name + \"-enter-active\"),\n leaveClass: (name + \"-leave\"),\n leaveToClass: (name + \"-leave-to\"),\n leaveActiveClass: (name + \"-leave-active\")\n }\n});\n\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation';\n\n// Transition property/event sniffing\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\nif (hasTransition) {\n /* istanbul ignore if */\n if (window.ontransitionend === undefined &&\n window.onwebkittransitionend !== undefined\n ) {\n transitionProp = 'WebkitTransition';\n transitionEndEvent = 'webkitTransitionEnd';\n }\n if (window.onanimationend === undefined &&\n window.onwebkitanimationend !== undefined\n ) {\n animationProp = 'WebkitAnimation';\n animationEndEvent = 'webkitAnimationEnd';\n }\n}\n\n// binding to window is necessary to make hot reload work in IE in strict mode\nvar raf = inBrowser\n ? window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : setTimeout\n : /* istanbul ignore next */ function (fn) { return fn(); };\n\nfunction nextFrame (fn) {\n raf(function () {\n raf(fn);\n });\n}\n\nfunction addTransitionClass (el, cls) {\n var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n if (transitionClasses.indexOf(cls) < 0) {\n transitionClasses.push(cls);\n addClass(el, cls);\n }\n}\n\nfunction removeTransitionClass (el, cls) {\n if (el._transitionClasses) {\n remove(el._transitionClasses, cls);\n }\n removeClass(el, cls);\n}\n\nfunction whenTransitionEnds (\n el,\n expectedType,\n cb\n) {\n var ref = getTransitionInfo(el, expectedType);\n var type = ref.type;\n var timeout = ref.timeout;\n var propCount = ref.propCount;\n if (!type) { return cb() }\n var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n var ended = 0;\n var end = function () {\n el.removeEventListener(event, onEnd);\n cb();\n };\n var onEnd = function (e) {\n if (e.target === el) {\n if (++ended >= propCount) {\n end();\n }\n }\n };\n setTimeout(function () {\n if (ended < propCount) {\n end();\n }\n }, timeout + 1);\n el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo (el, expectedType) {\n var styles = window.getComputedStyle(el);\n // JSDOM may return undefined for transition properties\n var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n var type;\n var timeout = 0;\n var propCount = 0;\n /* istanbul ignore if */\n if (expectedType === TRANSITION) {\n if (transitionTimeout > 0) {\n type = TRANSITION;\n timeout = transitionTimeout;\n propCount = transitionDurations.length;\n }\n } else if (expectedType === ANIMATION) {\n if (animationTimeout > 0) {\n type = ANIMATION;\n timeout = animationTimeout;\n propCount = animationDurations.length;\n }\n } else {\n timeout = Math.max(transitionTimeout, animationTimeout);\n type = timeout > 0\n ? transitionTimeout > animationTimeout\n ? TRANSITION\n : ANIMATION\n : null;\n propCount = type\n ? type === TRANSITION\n ? transitionDurations.length\n : animationDurations.length\n : 0;\n }\n var hasTransform =\n type === TRANSITION &&\n transformRE.test(styles[transitionProp + 'Property']);\n return {\n type: type,\n timeout: timeout,\n propCount: propCount,\n hasTransform: hasTransform\n }\n}\n\nfunction getTimeout (delays, durations) {\n /* istanbul ignore next */\n while (delays.length < durations.length) {\n delays = delays.concat(delays);\n }\n\n return Math.max.apply(null, durations.map(function (d, i) {\n return toMs(d) + toMs(delays[i])\n }))\n}\n\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n// in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n// as a floor function) causing unexpected behaviors\nfunction toMs (s) {\n return Number(s.slice(0, -1).replace(',', '.')) * 1000\n}\n\n/* */\n\nfunction enter (vnode, toggleDisplay) {\n var el = vnode.elm;\n\n // call leave callback now\n if (isDef(el._leaveCb)) {\n el._leaveCb.cancelled = true;\n el._leaveCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n if (isUndef(data)) {\n return\n }\n\n /* istanbul ignore if */\n if (isDef(el._enterCb) || el.nodeType !== 1) {\n return\n }\n\n var css = data.css;\n var type = data.type;\n var enterClass = data.enterClass;\n var enterToClass = data.enterToClass;\n var enterActiveClass = data.enterActiveClass;\n var appearClass = data.appearClass;\n var appearToClass = data.appearToClass;\n var appearActiveClass = data.appearActiveClass;\n var beforeEnter = data.beforeEnter;\n var enter = data.enter;\n var afterEnter = data.afterEnter;\n var enterCancelled = data.enterCancelled;\n var beforeAppear = data.beforeAppear;\n var appear = data.appear;\n var afterAppear = data.afterAppear;\n var appearCancelled = data.appearCancelled;\n var duration = data.duration;\n\n // activeInstance will always be the <transition> component managing this\n // transition. One edge case to check is when the <transition> is placed\n // as the root node of a child component. In that case we need to check\n // <transition>'s parent for appear check.\n var context = activeInstance;\n var transitionNode = activeInstance.$vnode;\n while (transitionNode && transitionNode.parent) {\n context = transitionNode.context;\n transitionNode = transitionNode.parent;\n }\n\n var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n if (isAppear && !appear && appear !== '') {\n return\n }\n\n var startClass = isAppear && appearClass\n ? appearClass\n : enterClass;\n var activeClass = isAppear && appearActiveClass\n ? appearActiveClass\n : enterActiveClass;\n var toClass = isAppear && appearToClass\n ? appearToClass\n : enterToClass;\n\n var beforeEnterHook = isAppear\n ? (beforeAppear || beforeEnter)\n : beforeEnter;\n var enterHook = isAppear\n ? (typeof appear === 'function' ? appear : enter)\n : enter;\n var afterEnterHook = isAppear\n ? (afterAppear || afterEnter)\n : afterEnter;\n var enterCancelledHook = isAppear\n ? (appearCancelled || enterCancelled)\n : enterCancelled;\n\n var explicitEnterDuration = toNumber(\n isObject(duration)\n ? duration.enter\n : duration\n );\n\n if ( true && explicitEnterDuration != null) {\n checkDuration(explicitEnterDuration, 'enter', vnode);\n }\n\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(enterHook);\n\n var cb = el._enterCb = once(function () {\n if (expectsCSS) {\n removeTransitionClass(el, toClass);\n removeTransitionClass(el, activeClass);\n }\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, startClass);\n }\n enterCancelledHook && enterCancelledHook(el);\n } else {\n afterEnterHook && afterEnterHook(el);\n }\n el._enterCb = null;\n });\n\n if (!vnode.data.show) {\n // remove pending leave element on enter by injecting an insert hook\n mergeVNodeHook(vnode, 'insert', function () {\n var parent = el.parentNode;\n var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n if (pendingNode &&\n pendingNode.tag === vnode.tag &&\n pendingNode.elm._leaveCb\n ) {\n pendingNode.elm._leaveCb();\n }\n enterHook && enterHook(el, cb);\n });\n }\n\n // start enter transition\n beforeEnterHook && beforeEnterHook(el);\n if (expectsCSS) {\n addTransitionClass(el, startClass);\n addTransitionClass(el, activeClass);\n nextFrame(function () {\n removeTransitionClass(el, startClass);\n if (!cb.cancelled) {\n addTransitionClass(el, toClass);\n if (!userWantsControl) {\n if (isValidDuration(explicitEnterDuration)) {\n setTimeout(cb, explicitEnterDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n\n if (vnode.data.show) {\n toggleDisplay && toggleDisplay();\n enterHook && enterHook(el, cb);\n }\n\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n}\n\nfunction leave (vnode, rm) {\n var el = vnode.elm;\n\n // call enter callback now\n if (isDef(el._enterCb)) {\n el._enterCb.cancelled = true;\n el._enterCb();\n }\n\n var data = resolveTransition(vnode.data.transition);\n if (isUndef(data) || el.nodeType !== 1) {\n return rm()\n }\n\n /* istanbul ignore if */\n if (isDef(el._leaveCb)) {\n return\n }\n\n var css = data.css;\n var type = data.type;\n var leaveClass = data.leaveClass;\n var leaveToClass = data.leaveToClass;\n var leaveActiveClass = data.leaveActiveClass;\n var beforeLeave = data.beforeLeave;\n var leave = data.leave;\n var afterLeave = data.afterLeave;\n var leaveCancelled = data.leaveCancelled;\n var delayLeave = data.delayLeave;\n var duration = data.duration;\n\n var expectsCSS = css !== false && !isIE9;\n var userWantsControl = getHookArgumentsLength(leave);\n\n var explicitLeaveDuration = toNumber(\n isObject(duration)\n ? duration.leave\n : duration\n );\n\n if ( true && isDef(explicitLeaveDuration)) {\n checkDuration(explicitLeaveDuration, 'leave', vnode);\n }\n\n var cb = el._leaveCb = once(function () {\n if (el.parentNode && el.parentNode._pending) {\n el.parentNode._pending[vnode.key] = null;\n }\n if (expectsCSS) {\n removeTransitionClass(el, leaveToClass);\n removeTransitionClass(el, leaveActiveClass);\n }\n if (cb.cancelled) {\n if (expectsCSS) {\n removeTransitionClass(el, leaveClass);\n }\n leaveCancelled && leaveCancelled(el);\n } else {\n rm();\n afterLeave && afterLeave(el);\n }\n el._leaveCb = null;\n });\n\n if (delayLeave) {\n delayLeave(performLeave);\n } else {\n performLeave();\n }\n\n function performLeave () {\n // the delayed leave may have already been cancelled\n if (cb.cancelled) {\n return\n }\n // record leaving element\n if (!vnode.data.show && el.parentNode) {\n (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n }\n beforeLeave && beforeLeave(el);\n if (expectsCSS) {\n addTransitionClass(el, leaveClass);\n addTransitionClass(el, leaveActiveClass);\n nextFrame(function () {\n removeTransitionClass(el, leaveClass);\n if (!cb.cancelled) {\n addTransitionClass(el, leaveToClass);\n if (!userWantsControl) {\n if (isValidDuration(explicitLeaveDuration)) {\n setTimeout(cb, explicitLeaveDuration);\n } else {\n whenTransitionEnds(el, type, cb);\n }\n }\n }\n });\n }\n leave && leave(el, cb);\n if (!expectsCSS && !userWantsControl) {\n cb();\n }\n }\n}\n\n// only used in dev mode\nfunction checkDuration (val, name, vnode) {\n if (typeof val !== 'number') {\n warn(\n \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n \"got \" + (JSON.stringify(val)) + \".\",\n vnode.context\n );\n } else if (isNaN(val)) {\n warn(\n \"<transition> explicit \" + name + \" duration is NaN - \" +\n 'the duration expression might be incorrect.',\n vnode.context\n );\n }\n}\n\nfunction isValidDuration (val) {\n return typeof val === 'number' && !isNaN(val)\n}\n\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\nfunction getHookArgumentsLength (fn) {\n if (isUndef(fn)) {\n return false\n }\n var invokerFns = fn.fns;\n if (isDef(invokerFns)) {\n // invoker\n return getHookArgumentsLength(\n Array.isArray(invokerFns)\n ? invokerFns[0]\n : invokerFns\n )\n } else {\n return (fn._length || fn.length) > 1\n }\n}\n\nfunction _enter (_, vnode) {\n if (vnode.data.show !== true) {\n enter(vnode);\n }\n}\n\nvar transition = inBrowser ? {\n create: _enter,\n activate: _enter,\n remove: function remove$$1 (vnode, rm) {\n /* istanbul ignore else */\n if (vnode.data.show !== true) {\n leave(vnode, rm);\n } else {\n rm();\n }\n }\n} : {};\n\nvar platformModules = [\n attrs,\n klass,\n events,\n domProps,\n style,\n transition\n];\n\n/* */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\nvar modules = platformModules.concat(baseModules);\n\nvar patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\nif (isIE9) {\n // http://www.matts411.com/post/internet-explorer-9-oninput/\n document.addEventListener('selectionchange', function () {\n var el = document.activeElement;\n if (el && el.vmodel) {\n trigger(el, 'input');\n }\n });\n}\n\nvar directive = {\n inserted: function inserted (el, binding, vnode, oldVnode) {\n if (vnode.tag === 'select') {\n // #6903\n if (oldVnode.elm && !oldVnode.elm._vOptions) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n directive.componentUpdated(el, binding, vnode);\n });\n } else {\n setSelected(el, binding, vnode.context);\n }\n el._vOptions = [].map.call(el.options, getValue);\n } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n el._vModifiers = binding.modifiers;\n if (!binding.modifiers.lazy) {\n el.addEventListener('compositionstart', onCompositionStart);\n el.addEventListener('compositionend', onCompositionEnd);\n // Safari < 10.2 & UIWebView doesn't fire compositionend when\n // switching focus before confirming composition choice\n // this also fixes the issue where some browsers e.g. iOS Chrome\n // fires \"change\" instead of \"input\" on autocomplete.\n el.addEventListener('change', onCompositionEnd);\n /* istanbul ignore if */\n if (isIE9) {\n el.vmodel = true;\n }\n }\n }\n },\n\n componentUpdated: function componentUpdated (el, binding, vnode) {\n if (vnode.tag === 'select') {\n setSelected(el, binding, vnode.context);\n // in case the options rendered by v-for have changed,\n // it's possible that the value is out-of-sync with the rendered options.\n // detect such cases and filter out values that no longer has a matching\n // option in the DOM.\n var prevOptions = el._vOptions;\n var curOptions = el._vOptions = [].map.call(el.options, getValue);\n if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n // trigger change event if\n // no matching option found for at least one value\n var needReset = el.multiple\n ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n if (needReset) {\n trigger(el, 'change');\n }\n }\n }\n }\n};\n\nfunction setSelected (el, binding, vm) {\n actuallySetSelected(el, binding, vm);\n /* istanbul ignore if */\n if (isIE || isEdge) {\n setTimeout(function () {\n actuallySetSelected(el, binding, vm);\n }, 0);\n }\n}\n\nfunction actuallySetSelected (el, binding, vm) {\n var value = binding.value;\n var isMultiple = el.multiple;\n if (isMultiple && !Array.isArray(value)) {\n true && warn(\n \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n vm\n );\n return\n }\n var selected, option;\n for (var i = 0, l = el.options.length; i < l; i++) {\n option = el.options[i];\n if (isMultiple) {\n selected = looseIndexOf(value, getValue(option)) > -1;\n if (option.selected !== selected) {\n option.selected = selected;\n }\n } else {\n if (looseEqual(getValue(option), value)) {\n if (el.selectedIndex !== i) {\n el.selectedIndex = i;\n }\n return\n }\n }\n }\n if (!isMultiple) {\n el.selectedIndex = -1;\n }\n}\n\nfunction hasNoMatchingOption (value, options) {\n return options.every(function (o) { return !looseEqual(o, value); })\n}\n\nfunction getValue (option) {\n return '_value' in option\n ? option._value\n : option.value\n}\n\nfunction onCompositionStart (e) {\n e.target.composing = true;\n}\n\nfunction onCompositionEnd (e) {\n // prevent triggering an input event for no reason\n if (!e.target.composing) { return }\n e.target.composing = false;\n trigger(e.target, 'input');\n}\n\nfunction trigger (el, type) {\n var e = document.createEvent('HTMLEvents');\n e.initEvent(type, true, true);\n el.dispatchEvent(e);\n}\n\n/* */\n\n// recursively search for possible transition defined inside the component root\nfunction locateNode (vnode) {\n return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n ? locateNode(vnode.componentInstance._vnode)\n : vnode\n}\n\nvar show = {\n bind: function bind (el, ref, vnode) {\n var value = ref.value;\n\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n var originalDisplay = el.__vOriginalDisplay =\n el.style.display === 'none' ? '' : el.style.display;\n if (value && transition$$1) {\n vnode.data.show = true;\n enter(vnode, function () {\n el.style.display = originalDisplay;\n });\n } else {\n el.style.display = value ? originalDisplay : 'none';\n }\n },\n\n update: function update (el, ref, vnode) {\n var value = ref.value;\n var oldValue = ref.oldValue;\n\n /* istanbul ignore if */\n if (!value === !oldValue) { return }\n vnode = locateNode(vnode);\n var transition$$1 = vnode.data && vnode.data.transition;\n if (transition$$1) {\n vnode.data.show = true;\n if (value) {\n enter(vnode, function () {\n el.style.display = el.__vOriginalDisplay;\n });\n } else {\n leave(vnode, function () {\n el.style.display = 'none';\n });\n }\n } else {\n el.style.display = value ? el.__vOriginalDisplay : 'none';\n }\n },\n\n unbind: function unbind (\n el,\n binding,\n vnode,\n oldVnode,\n isDestroy\n ) {\n if (!isDestroy) {\n el.style.display = el.__vOriginalDisplay;\n }\n }\n};\n\nvar platformDirectives = {\n model: directive,\n show: show\n};\n\n/* */\n\nvar transitionProps = {\n name: String,\n appear: Boolean,\n css: Boolean,\n mode: String,\n type: String,\n enterClass: String,\n leaveClass: String,\n enterToClass: String,\n leaveToClass: String,\n enterActiveClass: String,\n leaveActiveClass: String,\n appearClass: String,\n appearActiveClass: String,\n appearToClass: String,\n duration: [Number, String, Object]\n};\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\nfunction getRealChild (vnode) {\n var compOptions = vnode && vnode.componentOptions;\n if (compOptions && compOptions.Ctor.options.abstract) {\n return getRealChild(getFirstComponentChild(compOptions.children))\n } else {\n return vnode\n }\n}\n\nfunction extractTransitionData (comp) {\n var data = {};\n var options = comp.$options;\n // props\n for (var key in options.propsData) {\n data[key] = comp[key];\n }\n // events.\n // extract listeners and pass them directly to the transition methods\n var listeners = options._parentListeners;\n for (var key$1 in listeners) {\n data[camelize(key$1)] = listeners[key$1];\n }\n return data\n}\n\nfunction placeholder (h, rawChild) {\n if (/\\d-keep-alive$/.test(rawChild.tag)) {\n return h('keep-alive', {\n props: rawChild.componentOptions.propsData\n })\n }\n}\n\nfunction hasParentTransition (vnode) {\n while ((vnode = vnode.parent)) {\n if (vnode.data.transition) {\n return true\n }\n }\n}\n\nfunction isSameChild (child, oldChild) {\n return oldChild.key === child.key && oldChild.tag === child.tag\n}\n\nvar isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };\n\nvar isVShowDirective = function (d) { return d.name === 'show'; };\n\nvar Transition = {\n name: 'transition',\n props: transitionProps,\n abstract: true,\n\n render: function render (h) {\n var this$1 = this;\n\n var children = this.$slots.default;\n if (!children) {\n return\n }\n\n // filter out text nodes (possible whitespaces)\n children = children.filter(isNotTextNode);\n /* istanbul ignore if */\n if (!children.length) {\n return\n }\n\n // warn multiple elements\n if ( true && children.length > 1) {\n warn(\n '<transition> can only be used on a single element. Use ' +\n '<transition-group> for lists.',\n this.$parent\n );\n }\n\n var mode = this.mode;\n\n // warn invalid mode\n if ( true &&\n mode && mode !== 'in-out' && mode !== 'out-in'\n ) {\n warn(\n 'invalid <transition> mode: ' + mode,\n this.$parent\n );\n }\n\n var rawChild = children[0];\n\n // if this is a component root node and the component's\n // parent container node also has transition, skip.\n if (hasParentTransition(this.$vnode)) {\n return rawChild\n }\n\n // apply transition data to child\n // use getRealChild() to ignore abstract components e.g. keep-alive\n var child = getRealChild(rawChild);\n /* istanbul ignore if */\n if (!child) {\n return rawChild\n }\n\n if (this._leaving) {\n return placeholder(h, rawChild)\n }\n\n // ensure a key that is unique to the vnode type and to this transition\n // component instance. This key will be used to remove pending leaving nodes\n // during entering.\n var id = \"__transition-\" + (this._uid) + \"-\";\n child.key = child.key == null\n ? child.isComment\n ? id + 'comment'\n : id + child.tag\n : isPrimitive(child.key)\n ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n : child.key;\n\n var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n var oldRawChild = this._vnode;\n var oldChild = getRealChild(oldRawChild);\n\n // mark v-show\n // so that the transition module can hand over the control to the directive\n if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n child.data.show = true;\n }\n\n if (\n oldChild &&\n oldChild.data &&\n !isSameChild(child, oldChild) &&\n !isAsyncPlaceholder(oldChild) &&\n // #6687 component root is a comment node\n !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n ) {\n // replace old child transition data with fresh one\n // important for dynamic transitions!\n var oldData = oldChild.data.transition = extend({}, data);\n // handle transition mode\n if (mode === 'out-in') {\n // return placeholder node and queue update when leave finishes\n this._leaving = true;\n mergeVNodeHook(oldData, 'afterLeave', function () {\n this$1._leaving = false;\n this$1.$forceUpdate();\n });\n return placeholder(h, rawChild)\n } else if (mode === 'in-out') {\n if (isAsyncPlaceholder(child)) {\n return oldRawChild\n }\n var delayedLeave;\n var performLeave = function () { delayedLeave(); };\n mergeVNodeHook(data, 'afterEnter', performLeave);\n mergeVNodeHook(data, 'enterCancelled', performLeave);\n mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n }\n }\n\n return rawChild\n }\n};\n\n/* */\n\nvar props = extend({\n tag: String,\n moveClass: String\n}, transitionProps);\n\ndelete props.mode;\n\nvar TransitionGroup = {\n props: props,\n\n beforeMount: function beforeMount () {\n var this$1 = this;\n\n var update = this._update;\n this._update = function (vnode, hydrating) {\n var restoreActiveInstance = setActiveInstance(this$1);\n // force removing pass\n this$1.__patch__(\n this$1._vnode,\n this$1.kept,\n false, // hydrating\n true // removeOnly (!important, avoids unnecessary moves)\n );\n this$1._vnode = this$1.kept;\n restoreActiveInstance();\n update.call(this$1, vnode, hydrating);\n };\n },\n\n render: function render (h) {\n var tag = this.tag || this.$vnode.data.tag || 'span';\n var map = Object.create(null);\n var prevChildren = this.prevChildren = this.children;\n var rawChildren = this.$slots.default || [];\n var children = this.children = [];\n var transitionData = extractTransitionData(this);\n\n for (var i = 0; i < rawChildren.length; i++) {\n var c = rawChildren[i];\n if (c.tag) {\n if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n children.push(c);\n map[c.key] = c\n ;(c.data || (c.data = {})).transition = transitionData;\n } else if (true) {\n var opts = c.componentOptions;\n var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n }\n }\n }\n\n if (prevChildren) {\n var kept = [];\n var removed = [];\n for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n var c$1 = prevChildren[i$1];\n c$1.data.transition = transitionData;\n c$1.data.pos = c$1.elm.getBoundingClientRect();\n if (map[c$1.key]) {\n kept.push(c$1);\n } else {\n removed.push(c$1);\n }\n }\n this.kept = h(tag, null, kept);\n this.removed = removed;\n }\n\n return h(tag, null, children)\n },\n\n updated: function updated () {\n var children = this.prevChildren;\n var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n return\n }\n\n // we divide the work into three loops to avoid mixing DOM reads and writes\n // in each iteration - which helps prevent layout thrashing.\n children.forEach(callPendingCbs);\n children.forEach(recordPosition);\n children.forEach(applyTranslation);\n\n // force reflow to put everything in position\n // assign to this to avoid being removed in tree-shaking\n // $flow-disable-line\n this._reflow = document.body.offsetHeight;\n\n children.forEach(function (c) {\n if (c.data.moved) {\n var el = c.elm;\n var s = el.style;\n addTransitionClass(el, moveClass);\n s.transform = s.WebkitTransform = s.transitionDuration = '';\n el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n if (e && e.target !== el) {\n return\n }\n if (!e || /transform$/.test(e.propertyName)) {\n el.removeEventListener(transitionEndEvent, cb);\n el._moveCb = null;\n removeTransitionClass(el, moveClass);\n }\n });\n }\n });\n },\n\n methods: {\n hasMove: function hasMove (el, moveClass) {\n /* istanbul ignore if */\n if (!hasTransition) {\n return false\n }\n /* istanbul ignore if */\n if (this._hasMove) {\n return this._hasMove\n }\n // Detect whether an element with the move class applied has\n // CSS transitions. Since the element may be inside an entering\n // transition at this very moment, we make a clone of it and remove\n // all other transition classes applied to ensure only the move class\n // is applied.\n var clone = el.cloneNode();\n if (el._transitionClasses) {\n el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n }\n addClass(clone, moveClass);\n clone.style.display = 'none';\n this.$el.appendChild(clone);\n var info = getTransitionInfo(clone);\n this.$el.removeChild(clone);\n return (this._hasMove = info.hasTransform)\n }\n }\n};\n\nfunction callPendingCbs (c) {\n /* istanbul ignore if */\n if (c.elm._moveCb) {\n c.elm._moveCb();\n }\n /* istanbul ignore if */\n if (c.elm._enterCb) {\n c.elm._enterCb();\n }\n}\n\nfunction recordPosition (c) {\n c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation (c) {\n var oldPos = c.data.pos;\n var newPos = c.data.newPos;\n var dx = oldPos.left - newPos.left;\n var dy = oldPos.top - newPos.top;\n if (dx || dy) {\n c.data.moved = true;\n var s = c.elm.style;\n s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n s.transitionDuration = '0s';\n }\n}\n\nvar platformComponents = {\n Transition: Transition,\n TransitionGroup: TransitionGroup\n};\n\n/* */\n\n// install platform specific utils\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents);\n\n// install platform patch function\nVue.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\nVue.prototype.$mount = function (\n el,\n hydrating\n) {\n el = el && inBrowser ? query(el) : undefined;\n return mountComponent(this, el, hydrating)\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (inBrowser) {\n setTimeout(function () {\n if (config.devtools) {\n if (devtools) {\n devtools.emit('init', Vue);\n } else if (\n true\n ) {\n console[console.info ? 'info' : 'log'](\n 'Download the Vue Devtools extension for a better development experience:\\n' +\n 'https://github.com/vuejs/vue-devtools'\n );\n }\n }\n if ( true &&\n config.productionTip !== false &&\n typeof console !== 'undefined'\n ) {\n console[console.info ? 'info' : 'log'](\n \"You are running Vue in development mode.\\n\" +\n \"Make sure to turn on production mode when deploying for production.\\n\" +\n \"See more tips at https://vuejs.org/guide/deployment.html\"\n );\n }\n }, 0);\n}\n\n/* */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Vue);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZUAyLjYuMTBAdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWVAMi42LjEwQHZ1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS5qcz82ZTZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVnVlLmpzIHYyLjYuMTBcbiAqIChjKSAyMDE0LTIwMTkgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUaGVzZSBoZWxwZXJzIHByb2R1Y2UgYmV0dGVyIFZNIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmcuXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlLlxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUsIGUuZy4sIFtvYmplY3QgT2JqZWN0XS5cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gKFxuICAgIGlzRGVmKHZhbCkgJiZcbiAgICB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBpcyBhY3R1YWxseSByZW5kZXJlZC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkge1xuICByZXR1cm4gdmFsID09IG51bGxcbiAgICA/ICcnXG4gICAgOiBBcnJheS5pc0FycmF5KHZhbCkgfHwgKGlzUGxhaW5PYmplY3QodmFsKSAmJiB2YWwudG9TdHJpbmcgPT09IF90b1N0cmluZylcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZS5cbiAqL1xudmFyIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUgPSBtYWtlTWFwKCdrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJy0kMScpLnRvTG93ZXJDYXNlKClcbn0pO1xuXG4vKipcbiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdCxcbiAqIGUuZy4sIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZVxuICogc2luY2UgbmF0aXZlIGJpbmQgaXMgbm93IHBlcmZvcm1hbnQgZW5vdWdoIGluIG1vc3QgYnJvd3NlcnMuXG4gKiBCdXQgcmVtb3ZpbmcgaXQgd291bGQgbWVhbiBicmVha2luZyBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluXG4gKiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcG9seWZpbGxCaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cblxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY3R4KVxufVxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gID8gbmF0aXZlQmluZFxuICA6IHBvbHlmaWxsQmluZDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG4vKipcbiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7XG4gICAgdG9ba2V5XSA9IF9mcm9tW2tleV07XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogTWVyZ2UgYW4gQXJyYXkgb2YgT2JqZWN0cyBpbnRvIGEgc2luZ2xlIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QgKGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycltpXSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXJyW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLlxuICogU3R1YmJpbmcgYXJncyB0byBtYWtlIEZsb3cgaGFwcHkgd2l0aG91dCBsZWF2aW5nIHVzZWxlc3MgdHJhbnNwaWxlZCBjb2RlXG4gKiB3aXRoIC4uLnJlc3QgKGh0dHBzOi8vZmxvdy5vcmcvYmxvZy8yMDE3LzA1LzA3L1N0cmljdC1GdW5jdGlvbi1DYWxsLUFyaXR5LykuXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gdmFsdWVzIGFyZSBsb29zZWx5IGVxdWFsIC0gdGhhdCBpcyxcbiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT9cbiAqL1xuZnVuY3Rpb24gbG9vc2VFcXVhbCAoYSwgYikge1xuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9XG4gIHZhciBpc09iamVjdEEgPSBpc09iamVjdChhKTtcbiAgdmFyIGlzT2JqZWN0QiA9IGlzT2JqZWN0KGIpO1xuICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0Qikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaXNBcnJheUEgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTtcbiAgICAgIGlmIChpc0FycmF5QSAmJiBpc0FycmF5Qikge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBsb29zZWx5IGVxdWFsIHZhbHVlIGNhbiBiZVxuICogZm91bmQgaW4gdGhlIGFycmF5IChpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCwgdGhlIGFycmF5IG11c3RcbiAqIGNvbnRhaW4gYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHNoYXBlKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBTU1JfQVRUUiA9ICdkYXRhLXNlcnZlci1yZW5kZXJlZCc7XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnLFxuICAnc2VydmVyUHJlZmV0Y2gnXG5dO1xuXG4vKiAgKi9cblxuXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdXBkYXRlcyBhc3luY2hyb25vdXNseS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBieSBWdWUgVGVzdCBVdGlsc1xuICAgKiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSByZWR1Y2UgcGVyZm9ybWFuY2UgaWYgc2V0IHRvIGZhbHNlLlxuICAgKi9cbiAgYXN5bmM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSk7XG5cbi8qICAqL1xuXG4vKipcbiAqIHVuaWNvZGUgbGV0dGVycyB1c2VkIGZvciBwYXJzaW5nIGh0bWwgdGFncywgY29tcG9uZW50IG5hbWVzIGFuZCBwcm9wZXJ0eSBwYXRocy5cbiAqIHVzaW5nIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTMvc2VtYW50aWNzLXNjcmlwdGluZy5odG1sI3BvdGVudGlhbGN1c3RvbWVsZW1lbnRuYW1lXG4gKiBza2lwcGluZyBcXHUxMDAwMC1cXHVFRkZGRiBkdWUgdG8gaXQgZnJlZXppbmcgdXAgUGhhbnRvbUpTXG4gKi9cbnZhciB1bmljb2RlUmVnRXhwID0gL2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICovXG5mdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHtcbiAgdmFyIGMgPSAoc3RyICsgJycpLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBzaW1wbGUgcGF0aC5cbiAqL1xudmFyIGJhaWxSRSA9IG5ldyBSZWdFeHAoKFwiW15cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIi4kX1xcXFxkXVwiKSk7XG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgaWYgKGJhaWxSRS50ZXN0KHBhdGgpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghb2JqKSB7IHJldHVybiB9XG4gICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbn1cblxuLyogICovXG5cbi8vIGNhbiB3ZSB1c2UgX19wcm90b19fP1xudmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307XG5cbi8vIEJyb3dzZXIgZW52aXJvbm1lbnQgc25pZmZpbmdcbnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbnZhciBpbldlZXggPSB0eXBlb2YgV1hFbnZpcm9ubWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISFXWEVudmlyb25tZW50LnBsYXRmb3JtO1xudmFyIHdlZXhQbGF0Zm9ybSA9IGluV2VleCAmJiBXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG52YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7XG52YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDtcbnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDtcbnZhciBpc0FuZHJvaWQgPSAoVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMCkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKTtcbnZhciBpc0lPUyA9IChVQSAmJiAvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoVUEpKSB8fCAod2VleFBsYXRmb3JtID09PSAnaW9zJyk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcbnZhciBpc1BoYW50b21KUyA9IFVBICYmIC9waGFudG9tanMvLnRlc3QoVUEpO1xudmFyIGlzRkYgPSBVQSAmJiBVQS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuXG52YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5pZiAoaW5Ccm93c2VyKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdHMgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoe1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzI4NVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuLy8gdGhpcyBuZWVkcyB0byBiZSBsYXp5LWV2YWxlZCBiZWNhdXNlIHZ1ZSBtYXkgYmUgcmVxdWlyZWQgYmVmb3JlXG4vLyB2dWUtc2VydmVyLXJlbmRlcmVyIGNhbiBzZXQgVlVFX0VOVlxudmFyIF9pc1NlcnZlcjtcbnZhciBpc1NlcnZlclJlbmRlcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF9pc1NlcnZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFpbkJyb3dzZXIgJiYgIWluV2VleCAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZGV0ZWN0IHByZXNlbmNlIG9mIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgYW5kIGF2b2lkXG4gICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzXG4gICAgICBfaXNTZXJ2ZXIgPSBnbG9iYWxbJ3Byb2Nlc3MnXSAmJiBnbG9iYWxbJ3Byb2Nlc3MnXS5lbnYuVlVFX0VOViA9PT0gJ3NlcnZlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pc1NlcnZlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2lzU2VydmVyXG59O1xuXG4vLyBkZXRlY3QgZGV2dG9vbHNcbnZhciBkZXZ0b29scyA9IGluQnJvd3NlciAmJiB3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGlzTmF0aXZlIChDdG9yKSB7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoQ3Rvci50b1N0cmluZygpKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJlxuICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUmVmbGVjdC5vd25LZXlzKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8gLy8gJGZsb3ctZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU2V0KSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldDtcbn0gZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNldCAoKSB7XG4gICAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFtrZXldID09PSB0cnVlXG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7XG4gICAgICB0aGlzLnNldFtrZXldID0gdHJ1ZTtcbiAgICB9O1xuICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTZXQ7XG4gIH0oKSk7XG59XG5cbi8qICAqL1xuXG52YXIgd2FybiA9IG5vb3A7XG52YXIgdGlwID0gbm9vcDtcbnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrXG52YXIgZm9ybWF0Q29tcG9uZW50TmFtZSA9IChub29wKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGhhc0NvbnNvbGUgPSB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuICB2YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBzdHJcbiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KVxuICAgIC5yZXBsYWNlKC9bLV9dL2csICcnKTsgfTtcblxuICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHtcbiAgICB2YXIgdHJhY2UgPSB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJyc7XG5cbiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7XG4gICAgICBjb25maWcud2FybkhhbmRsZXIuY2FsbChudWxsLCBtc2csIHZtLCB0cmFjZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDb25zb2xlICYmICghY29uZmlnLnNpbGVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW1Z1ZSB3YXJuXTogXCIgKyBtc2cgKyB0cmFjZSkpO1xuICAgIH1cbiAgfTtcblxuICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIGlmIChoYXNDb25zb2xlICYmICghY29uZmlnLnNpbGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIltWdWUgdGlwXTogXCIgKyBtc2cgKyAoXG4gICAgICAgIHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJ1xuICAgICAgKSk7XG4gICAgfVxuICB9O1xuXG4gIGZvcm1hdENvbXBvbmVudE5hbWUgPSBmdW5jdGlvbiAodm0sIGluY2x1ZGVGaWxlKSB7XG4gICAgaWYgKHZtLiRyb290ID09PSB2bSkge1xuICAgICAgcmV0dXJuICc8Um9vdD4nXG4gICAgfVxuICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHZtID09PSAnZnVuY3Rpb24nICYmIHZtLmNpZCAhPSBudWxsXG4gICAgICA/IHZtLm9wdGlvbnNcbiAgICAgIDogdm0uX2lzVnVlXG4gICAgICAgID8gdm0uJG9wdGlvbnMgfHwgdm0uY29uc3RydWN0b3Iub3B0aW9uc1xuICAgICAgICA6IHZtO1xuICAgIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lIHx8IG9wdGlvbnMuX2NvbXBvbmVudFRhZztcbiAgICB2YXIgZmlsZSA9IG9wdGlvbnMuX19maWxlO1xuICAgIGlmICghbmFtZSAmJiBmaWxlKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaWxlLm1hdGNoKC8oW14vXFxcXF0rKVxcLnZ1ZSQvKTtcbiAgICAgIG5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgKG5hbWUgPyAoXCI8XCIgKyAoY2xhc3NpZnkobmFtZSkpICsgXCI+XCIpIDogXCI8QW5vbnltb3VzPlwiKSArXG4gICAgICAoZmlsZSAmJiBpbmNsdWRlRmlsZSAhPT0gZmFsc2UgPyAoXCIgYXQgXCIgKyBmaWxlKSA6ICcnKVxuICAgIClcbiAgfTtcblxuICB2YXIgcmVwZWF0ID0gZnVuY3Rpb24gKHN0ciwgbikge1xuICAgIHZhciByZXMgPSAnJztcbiAgICB3aGlsZSAobikge1xuICAgICAgaWYgKG4gJSAyID09PSAxKSB7IHJlcyArPSBzdHI7IH1cbiAgICAgIGlmIChuID4gMSkgeyBzdHIgKz0gc3RyOyB9XG4gICAgICBuID4+PSAxO1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH07XG5cbiAgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IGZ1bmN0aW9uICh2bSkge1xuICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkge1xuICAgICAgdmFyIHRyZWUgPSBbXTtcbiAgICAgIHZhciBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgd2hpbGUgKHZtKSB7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbGFzdCA9IHRyZWVbdHJlZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSsrO1xuICAgICAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA+IDApIHtcbiAgICAgICAgICAgIHRyZWVbdHJlZS5sZW5ndGggLSAxXSA9IFtsYXN0LCBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2VdO1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJlZS5wdXNoKHZtKTtcbiAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuICdcXG5cXG5mb3VuZCBpblxcblxcbicgKyB0cmVlXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHZtLCBpKSB7IHJldHVybiAoXCJcIiArIChpID09PSAwID8gJy0tLT4gJyA6IHJlcGVhdCgnICcsIDUgKyBpICogMikpICsgKEFycmF5LmlzQXJyYXkodm0pXG4gICAgICAgICAgICA/ICgoZm9ybWF0Q29tcG9uZW50TmFtZSh2bVswXSkpICsgXCIuLi4gKFwiICsgKHZtWzFdKSArIFwiIHJlY3Vyc2l2ZSBjYWxscylcIilcbiAgICAgICAgICAgIDogZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpKTsgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXCJcXG5cXG4oZm91bmQgaW4gXCIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIpXCIpXG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCA9IDA7XG5cbi8qKlxuICogQSBkZXAgaXMgYW4gb2JzZXJ2YWJsZSB0aGF0IGNhbiBoYXZlIG11bHRpcGxlXG4gKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LlxuICovXG52YXIgRGVwID0gZnVuY3Rpb24gRGVwICgpIHtcbiAgdGhpcy5pZCA9IHVpZCsrO1xuICB0aGlzLnN1YnMgPSBbXTtcbn07XG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gYWRkU3ViIChzdWIpIHtcbiAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gcmVtb3ZlU3ViIChzdWIpIHtcbiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29uZmlnLmFzeW5jKSB7XG4gICAgLy8gc3VicyBhcmVuJ3Qgc29ydGVkIGluIHNjaGVkdWxlciBpZiBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGVtIG5vdyB0byBtYWtlIHN1cmUgdGhleSBmaXJlIGluIGNvcnJlY3RcbiAgICAvLyBvcmRlclxuICAgIHN1YnMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyBUaGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyBUaGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIG9ubHkgb25lIHdhdGNoZXJcbi8vIGNhbiBiZSBldmFsdWF0ZWQgYXQgYSB0aW1lLlxuRGVwLnRhcmdldCA9IG51bGw7XG52YXIgdGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAodGFyZ2V0KSB7XG4gIHRhcmdldFN0YWNrLnB1c2godGFyZ2V0KTtcbiAgRGVwLnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgdGFyZ2V0U3RhY2sucG9wKCk7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFja1t0YXJnZXRTdGFjay5sZW5ndGggLSAxXTtcbn1cblxuLyogICovXG5cbnZhciBWTm9kZSA9IGZ1bmN0aW9uIFZOb2RlIChcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgdGV4dCxcbiAgZWxtLFxuICBjb250ZXh0LFxuICBjb21wb25lbnRPcHRpb25zLFxuICBhc3luY0ZhY3Rvcnlcbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLmVsbSA9IGVsbTtcbiAgdGhpcy5ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5PcHRpb25zID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuU2NvcGVJZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5O1xuICB0aGlzLmNvbXBvbmVudE9wdGlvbnMgPSBjb21wb25lbnRPcHRpb25zO1xuICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yYXcgPSBmYWxzZTtcbiAgdGhpcy5pc1N0YXRpYyA9IGZhbHNlO1xuICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7XG4gIHRoaXMuaXNDb21tZW50ID0gZmFsc2U7XG4gIHRoaXMuaXNDbG9uZWQgPSBmYWxzZTtcbiAgdGhpcy5pc09uY2UgPSBmYWxzZTtcbiAgdGhpcy5hc3luY0ZhY3RvcnkgPSBhc3luY0ZhY3Rvcnk7XG4gIHRoaXMuYXN5bmNNZXRhID0gdW5kZWZpbmVkO1xuICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLy8gREVQUkVDQVRFRDogYWxpYXMgZm9yIGNvbXBvbmVudEluc3RhbmNlIGZvciBiYWNrd2FyZHMgY29tcGF0LlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5jaGlsZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVk5vZGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGNyZWF0ZUVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoIHRleHQgPT09IHZvaWQgMCApIHRleHQgPSAnJztcblxuICB2YXIgbm9kZSA9IG5ldyBWTm9kZSgpO1xuICBub2RlLnRleHQgPSB0ZXh0O1xuICBub2RlLmlzQ29tbWVudCA9IHRydWU7XG4gIHJldHVybiBub2RlXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkge1xuICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKVxufVxuXG4vLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZVxuLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zc1xuLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5XG4vLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLlxuZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHtcbiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZShcbiAgICB2bm9kZS50YWcsXG4gICAgdm5vZGUuZGF0YSxcbiAgICAvLyAjNzk3NVxuICAgIC8vIGNsb25lIGNoaWxkcmVuIGFycmF5IHRvIGF2b2lkIG11dGF0aW5nIG9yaWdpbmFsIGluIGNhc2Ugb2YgY2xvbmluZ1xuICAgIC8vIGEgY2hpbGQuXG4gICAgdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4uc2xpY2UoKSxcbiAgICB2bm9kZS50ZXh0LFxuICAgIHZub2RlLmVsbSxcbiAgICB2bm9kZS5jb250ZXh0LFxuICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMsXG4gICAgdm5vZGUuYXN5bmNGYWN0b3J5XG4gICk7XG4gIGNsb25lZC5ucyA9IHZub2RlLm5zO1xuICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYztcbiAgY2xvbmVkLmtleSA9IHZub2RlLmtleTtcbiAgY2xvbmVkLmlzQ29tbWVudCA9IHZub2RlLmlzQ29tbWVudDtcbiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDtcbiAgY2xvbmVkLmZuT3B0aW9ucyA9IHZub2RlLmZuT3B0aW9ucztcbiAgY2xvbmVkLmZuU2NvcGVJZCA9IHZub2RlLmZuU2NvcGVJZDtcbiAgY2xvbmVkLmFzeW5jTWV0YSA9IHZub2RlLmFzeW5jTWV0YTtcbiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTtcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1xuXG52YXIgbWV0aG9kc1RvUGF0Y2ggPSBbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dO1xuXG4vKipcbiAqIEludGVyY2VwdCBtdXRhdGluZyBtZXRob2RzIGFuZCBlbWl0IGV2ZW50c1xuICovXG5tZXRob2RzVG9QYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTtcbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIG9iID0gdGhpcy5fX29iX187XG4gICAgdmFyIGluc2VydGVkO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdwdXNoJzpcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9XG4gICAgLy8gbm90aWZ5IGNoYW5nZVxuICAgIG9iLmRlcC5ub3RpZnkoKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pO1xufSk7XG5cbi8qICAqL1xuXG52YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTtcblxuLyoqXG4gKiBJbiBzb21lIGNhc2VzIHdlIG1heSB3YW50IHRvIGRpc2FibGUgb2JzZXJ2YXRpb24gaW5zaWRlIGEgY29tcG9uZW50J3NcbiAqIHVwZGF0ZSBjb21wdXRhdGlvbi5cbiAqL1xudmFyIHNob3VsZE9ic2VydmUgPSB0cnVlO1xuXG5mdW5jdGlvbiB0b2dnbGVPYnNlcnZpbmcgKHZhbHVlKSB7XG4gIHNob3VsZE9ic2VydmUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRoZSB0YXJnZXRcbiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0XG4gKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy5cbiAqL1xudmFyIE9ic2VydmVyID0gZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gIHRoaXMudm1Db3VudCA9IDA7XG4gIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAoaGFzUHJvdG8pIHtcbiAgICAgIHByb3RvQXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2Fsayh2YWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FsayB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZ1xuICogaGlkZGVuIHByb3BlcnRpZXMuXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKi9cbmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlLCBhc1Jvb3REYXRhKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2I7XG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fO1xuICB9IGVsc2UgaWYgKFxuICAgIHNob3VsZE9ic2VydmUgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWVcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YWwgPSBvYmpba2V5XTtcbiAgfVxuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLnRhcmdldCkge1xuICAgICAgICBkZXAuZGVwZW5kKCk7XG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBkZXBlbmRBcnJheSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gcmVhY3RpdmVTZXR0ZXIgKG5ld1ZhbCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7XG4gICAgICAgIGN1c3RvbVNldHRlcigpO1xuICAgICAgfVxuICAgICAgLy8gIzc5ODE6IGZvciBhY2Nlc3NvciBwcm9wZXJ0aWVzIHdpdGhvdXQgc2V0dGVyXG4gICAgICBpZiAoZ2V0dGVyICYmICFzZXR0ZXIpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBuZXdWYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gbmV3VmFsO1xuICAgICAgfVxuICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTtcbiAgICAgIGRlcC5ub3RpZnkoKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gQWRkcyB0aGUgbmV3IHByb3BlcnR5IGFuZFxuICogdHJpZ2dlcnMgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiB0aGUgcHJvcGVydHkgZG9lc24ndFxuICogYWxyZWFkeSBleGlzdC5cbiAqL1xuZnVuY3Rpb24gc2V0ICh0YXJnZXQsIGtleSwgdmFsKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgKGlzVW5kZWYodGFyZ2V0KSB8fCBpc1ByaW1pdGl2ZSh0YXJnZXQpKVxuICApIHtcbiAgICB3YXJuKChcIkNhbm5vdCBzZXQgcmVhY3RpdmUgcHJvcGVydHkgb24gdW5kZWZpbmVkLCBudWxsLCBvciBwcmltaXRpdmUgdmFsdWU6IFwiICsgKCh0YXJnZXQpKSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgaXNWYWxpZEFycmF5SW5kZXgoa2V5KSkge1xuICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpO1xuICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxLCB2YWwpO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoa2V5IGluIHRhcmdldCAmJiAhKGtleSBpbiBPYmplY3QucHJvdG90eXBlKSkge1xuICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187XG4gIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICtcbiAgICAgICdhdCBydW50aW1lIC0gZGVjbGFyZSBpdCB1cGZyb250IGluIHRoZSBkYXRhIG9wdGlvbi4nXG4gICAgKTtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgaWYgKCFvYikge1xuICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBkZWZpbmVSZWFjdGl2ZSQkMShvYi52YWx1ZSwga2V5LCB2YWwpO1xuICBvYi5kZXAubm90aWZ5KCk7XG4gIHJldHVybiB2YWxcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LlxuICovXG5mdW5jdGlvbiBkZWwgKHRhcmdldCwga2V5KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgKGlzVW5kZWYodGFyZ2V0KSB8fCBpc1ByaW1pdGl2ZSh0YXJnZXQpKVxuICApIHtcbiAgICB3YXJuKChcIkNhbm5vdCBkZWxldGUgcmVhY3RpdmUgcHJvcGVydHkgb24gdW5kZWZpbmVkLCBudWxsLCBvciBwcmltaXRpdmUgdmFsdWU6IFwiICsgKCh0YXJnZXQpKSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgaXNWYWxpZEFycmF5SW5kZXgoa2V5KSkge1xuICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187XG4gIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdBdm9pZCBkZWxldGluZyBwcm9wZXJ0aWVzIG9uIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJy0ganVzdCBzZXQgaXQgdG8gbnVsbC4nXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWxldGUgdGFyZ2V0W2tleV07XG4gIGlmICghb2IpIHtcbiAgICByZXR1cm5cbiAgfVxuICBvYi5kZXAubm90aWZ5KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdCBkZXBlbmRlbmNpZXMgb24gYXJyYXkgZWxlbWVudHMgd2hlbiB0aGUgYXJyYXkgaXMgdG91Y2hlZCwgc2luY2VcbiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLlxuICovXG5mdW5jdGlvbiBkZXBlbmRBcnJheSAodmFsdWUpIHtcbiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGUgPSB2YWx1ZVtpXTtcbiAgICBlICYmIGUuX19vYl9fICYmIGUuX19vYl9fLmRlcC5kZXBlbmQoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgZGVwZW5kQXJyYXkoZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGVcbiAqIGhvdyB0byBtZXJnZSBhIHBhcmVudCBvcHRpb24gdmFsdWUgYW5kIGEgY2hpbGQgb3B0aW9uXG4gKiB2YWx1ZSBpbnRvIHRoZSBmaW5hbCB2YWx1ZS5cbiAqL1xudmFyIHN0cmF0cyA9IGNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7XG5cbi8qKlxuICogT3B0aW9ucyB3aXRoIHJlc3RyaWN0aW9uc1xuICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBzdHJhdHMuZWwgPSBzdHJhdHMucHJvcHNEYXRhID0gZnVuY3Rpb24gKHBhcmVudCwgY2hpbGQsIHZtLCBrZXkpIHtcbiAgICBpZiAoIXZtKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIm9wdGlvbiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgXCIgK1xuICAgICAgICAnY3JlYXRpb24gd2l0aCB0aGUgYG5ld2Aga2V5d29yZC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFN0cmF0KHBhcmVudCwgY2hpbGQpXG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIHRoYXQgcmVjdXJzaXZlbHkgbWVyZ2VzIHR3byBkYXRhIG9iamVjdHMgdG9nZXRoZXIuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHtcbiAgaWYgKCFmcm9tKSB7IHJldHVybiB0byB9XG4gIHZhciBrZXksIHRvVmFsLCBmcm9tVmFsO1xuXG4gIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgPyBSZWZsZWN0Lm93bktleXMoZnJvbSlcbiAgICA6IE9iamVjdC5rZXlzKGZyb20pO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgLy8gaW4gY2FzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgb2JzZXJ2ZWQuLi5cbiAgICBpZiAoa2V5ID09PSAnX19vYl9fJykgeyBjb250aW51ZSB9XG4gICAgdG9WYWwgPSB0b1trZXldO1xuICAgIGZyb21WYWwgPSBmcm9tW2tleV07XG4gICAgaWYgKCFoYXNPd24odG8sIGtleSkpIHtcbiAgICAgIHNldCh0bywga2V5LCBmcm9tVmFsKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdG9WYWwgIT09IGZyb21WYWwgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QodG9WYWwpICYmXG4gICAgICBpc1BsYWluT2JqZWN0KGZyb21WYWwpXG4gICAgKSB7XG4gICAgICBtZXJnZURhdGEodG9WYWwsIGZyb21WYWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuLyoqXG4gKiBEYXRhXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YU9yRm4gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bVxuKSB7XG4gIGlmICghdm0pIHtcbiAgICAvLyBpbiBhIFZ1ZS5leHRlbmQgbWVyZ2UsIGJvdGggc2hvdWxkIGJlIGZ1bmN0aW9uc1xuICAgIGlmICghY2hpbGRWYWwpIHtcbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgaWYgKCFwYXJlbnRWYWwpIHtcbiAgICAgIHJldHVybiBjaGlsZFZhbFxuICAgIH1cbiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsXG4gICAgLy8gd2UgbmVlZCB0byByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gICAgLy8gbWVyZ2VkIHJlc3VsdCBvZiBib3RoIGZ1bmN0aW9ucy4uLiBubyBuZWVkIHRvXG4gICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlXG4gICAgLy8gaXQgaGFzIHRvIGJlIGEgZnVuY3Rpb24gdG8gcGFzcyBwcmV2aW91cyBtZXJnZXMuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbiAoKSB7XG4gICAgICByZXR1cm4gbWVyZ2VEYXRhKFxuICAgICAgICB0eXBlb2YgY2hpbGRWYWwgPT09ICdmdW5jdGlvbicgPyBjaGlsZFZhbC5jYWxsKHRoaXMsIHRoaXMpIDogY2hpbGRWYWwsXG4gICAgICAgIHR5cGVvZiBwYXJlbnRWYWwgPT09ICdmdW5jdGlvbicgPyBwYXJlbnRWYWwuY2FsbCh0aGlzLCB0aGlzKSA6IHBhcmVudFZhbFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkge1xuICAgICAgLy8gaW5zdGFuY2UgbWVyZ2VcbiAgICAgIHZhciBpbnN0YW5jZURhdGEgPSB0eXBlb2YgY2hpbGRWYWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSlcbiAgICAgICAgOiBjaGlsZFZhbDtcbiAgICAgIHZhciBkZWZhdWx0RGF0YSA9IHR5cGVvZiBwYXJlbnRWYWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pXG4gICAgICAgIDogcGFyZW50VmFsO1xuICAgICAgaWYgKGluc3RhbmNlRGF0YSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdERhdGFcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuc3RyYXRzLmRhdGEgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIGlmIChjaGlsZFZhbCAmJiB0eXBlb2YgY2hpbGRWYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ1RoZSBcImRhdGFcIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gJyArXG4gICAgICAgICd0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50ICcgK1xuICAgICAgICAnZGVmaW5pdGlvbnMuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbClcbiAgfVxuXG4gIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKVxufTtcblxuLyoqXG4gKiBIb29rcyBhbmQgcHJvcHMgYXJlIG1lcmdlZCBhcyBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSG9vayAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWxcbikge1xuICB2YXIgcmVzID0gY2hpbGRWYWxcbiAgICA/IHBhcmVudFZhbFxuICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkVmFsKVxuICAgICAgICA/IGNoaWxkVmFsXG4gICAgICAgIDogW2NoaWxkVmFsXVxuICAgIDogcGFyZW50VmFsO1xuICByZXR1cm4gcmVzXG4gICAgPyBkZWR1cGVIb29rcyhyZXMpXG4gICAgOiByZXNcbn1cblxuZnVuY3Rpb24gZGVkdXBlSG9va3MgKGhvb2tzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZXMuaW5kZXhPZihob29rc1tpXSkgPT09IC0xKSB7XG4gICAgICByZXMucHVzaChob29rc1tpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgc3RyYXRzW2hvb2tdID0gbWVyZ2VIb29rO1xufSk7XG5cbi8qKlxuICogQXNzZXRzXG4gKlxuICogV2hlbiBhIHZtIGlzIHByZXNlbnQgKGluc3RhbmNlIGNyZWF0aW9uKSwgd2UgbmVlZCB0byBkb1xuICogYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiBjb25zdHJ1Y3RvciBvcHRpb25zLCBpbnN0YW5jZVxuICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXNzZXRzIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKTtcbiAgaWYgKGNoaWxkVmFsKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhc3NlcnRPYmplY3RUeXBlKGtleSwgY2hpbGRWYWwsIHZtKTtcbiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgc3RyYXRzW3R5cGUgKyAncyddID0gbWVyZ2VBc3NldHM7XG59KTtcblxuLyoqXG4gKiBXYXRjaGVycy5cbiAqXG4gKiBXYXRjaGVycyBoYXNoZXMgc2hvdWxkIG5vdCBvdmVyd3JpdGUgb25lXG4gKiBhbm90aGVyLCBzbyB3ZSBtZXJnZSB0aGVtIGFzIGFycmF5cy5cbiAqL1xuc3RyYXRzLndhdGNoID0gZnVuY3Rpb24gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgLy8gd29yayBhcm91bmQgRmlyZWZveCdzIE9iamVjdC5wcm90b3R5cGUud2F0Y2guLi5cbiAgaWYgKHBhcmVudFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgcGFyZW50VmFsID0gdW5kZWZpbmVkOyB9XG4gIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2hpbGRWYWwpIHsgcmV0dXJuIE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBhc3NlcnRPYmplY3RUeXBlKGtleSwgY2hpbGRWYWwsIHZtKTtcbiAgfVxuICBpZiAoIXBhcmVudFZhbCkgeyByZXR1cm4gY2hpbGRWYWwgfVxuICB2YXIgcmV0ID0ge307XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGZvciAodmFyIGtleSQxIGluIGNoaWxkVmFsKSB7XG4gICAgdmFyIHBhcmVudCA9IHJldFtrZXkkMV07XG4gICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdO1xuICAgIGlmIChwYXJlbnQgJiYgIUFycmF5LmlzQXJyYXkocGFyZW50KSkge1xuICAgICAgcGFyZW50ID0gW3BhcmVudF07XG4gICAgfVxuICAgIHJldFtrZXkkMV0gPSBwYXJlbnRcbiAgICAgID8gcGFyZW50LmNvbmNhdChjaGlsZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07XG4gIH1cbiAgcmV0dXJuIHJldFxufTtcblxuLyoqXG4gKiBPdGhlciBvYmplY3QgaGFzaGVzLlxuICovXG5zdHJhdHMucHJvcHMgPVxuc3RyYXRzLm1ldGhvZHMgPVxuc3RyYXRzLmluamVjdCA9XG5zdHJhdHMuY29tcHV0ZWQgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICBpZiAoY2hpbGRWYWwgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBleHRlbmQocmV0LCBwYXJlbnRWYWwpO1xuICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9XG4gIHJldHVybiByZXRcbn07XG5zdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47XG5cbi8qKlxuICogRGVmYXVsdCBzdHJhdGVneS5cbiAqL1xudmFyIGRlZmF1bHRTdHJhdCA9IGZ1bmN0aW9uIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwYXJlbnRWYWxcbiAgICA6IGNoaWxkVmFsXG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lc1xuICovXG5mdW5jdGlvbiBjaGVja0NvbXBvbmVudHMgKG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykge1xuICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50TmFtZSAobmFtZSkge1xuICBpZiAoIW5ldyBSZWdFeHAoKFwiXlthLXpBLVpdW1xcXFwtXFxcXC4wLTlfXCIgKyAodW5pY29kZVJlZ0V4cC5zb3VyY2UpICsgXCJdKiRcIikpLnRlc3QobmFtZSkpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ludmFsaWQgY29tcG9uZW50IG5hbWU6IFwiJyArIG5hbWUgKyAnXCIuIENvbXBvbmVudCBuYW1lcyAnICtcbiAgICAgICdzaG91bGQgY29uZm9ybSB0byB2YWxpZCBjdXN0b20gZWxlbWVudCBuYW1lIGluIGh0bWw1IHNwZWNpZmljYXRpb24uJ1xuICAgICk7XG4gIH1cbiAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhuYW1lKSkge1xuICAgIHdhcm4oXG4gICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICtcbiAgICAgICdpZDogJyArIG5hbWVcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIGFsbCBwcm9wcyBvcHRpb24gc3ludGF4IGFyZSBub3JtYWxpemVkIGludG8gdGhlXG4gKiBPYmplY3QtYmFzZWQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wcyAob3B0aW9ucywgdm0pIHtcbiAgdmFyIHByb3BzID0gb3B0aW9ucy5wcm9wcztcbiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfVxuICB2YXIgcmVzID0ge307XG4gIHZhciBpLCB2YWwsIG5hbWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkge1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdmFsID0gcHJvcHNbaV07XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmFtZSA9IGNhbWVsaXplKHZhbCk7XG4gICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9O1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhbCA9IHByb3BzW2tleV07XG4gICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTtcbiAgICAgIHJlc1tuYW1lXSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IHZhbFxuICAgICAgICA6IHsgdHlwZTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcInByb3BzXFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKHByb3BzKSkgKyBcIi5cIixcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICBvcHRpb25zLnByb3BzID0gcmVzO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0IChvcHRpb25zLCB2bSkge1xuICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7XG4gIGlmICghaW5qZWN0KSB7IHJldHVybiB9XG4gIHZhciBub3JtYWxpemVkID0gb3B0aW9ucy5pbmplY3QgPSB7fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBub3JtYWxpemVkW2luamVjdFtpXV0gPSB7IGZyb206IGluamVjdFtpXSB9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGluamVjdCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gaW5qZWN0KSB7XG4gICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07XG4gICAgICBub3JtYWxpemVkW2tleV0gPSBpc1BsYWluT2JqZWN0KHZhbClcbiAgICAgICAgPyBleHRlbmQoeyBmcm9tOiBrZXkgfSwgdmFsKVxuICAgICAgICA6IHsgZnJvbTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcImluamVjdFxcXCI6IGV4cGVjdGVkIGFuIEFycmF5IG9yIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZShpbmplY3QpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHJhdyBmdW5jdGlvbiBkaXJlY3RpdmVzIGludG8gb2JqZWN0IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGlyZWN0aXZlcyAob3B0aW9ucykge1xuICB2YXIgZGlycyA9IG9wdGlvbnMuZGlyZWN0aXZlcztcbiAgaWYgKGRpcnMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGlycykge1xuICAgICAgdmFyIGRlZiQkMSA9IGRpcnNba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgZGVmJCQxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRpcnNba2V5XSA9IHsgYmluZDogZGVmJCQxLCB1cGRhdGU6IGRlZiQkMSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlIChuYW1lLCB2YWx1ZSwgdm0pIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiOiBleHBlY3RlZCBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUodmFsdWUpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLlxuICogQ29yZSB1dGlsaXR5IHVzZWQgaW4gYm90aCBpbnN0YW50aWF0aW9uIGFuZCBpbmhlcml0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zIChcbiAgcGFyZW50LFxuICBjaGlsZCxcbiAgdm1cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNoZWNrQ29tcG9uZW50cyhjaGlsZCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hpbGQgPSBjaGlsZC5vcHRpb25zO1xuICB9XG5cbiAgbm9ybWFsaXplUHJvcHMoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7XG4gIG5vcm1hbGl6ZURpcmVjdGl2ZXMoY2hpbGQpO1xuXG4gIC8vIEFwcGx5IGV4dGVuZHMgYW5kIG1peGlucyBvbiB0aGUgY2hpbGQgb3B0aW9ucyxcbiAgLy8gYnV0IG9ubHkgaWYgaXQgaXMgYSByYXcgb3B0aW9ucyBvYmplY3QgdGhhdCBpc24ndFxuICAvLyB0aGUgcmVzdWx0IG9mIGFub3RoZXIgbWVyZ2VPcHRpb25zIGNhbGwuXG4gIC8vIE9ubHkgbWVyZ2VkIG9wdGlvbnMgaGFzIHRoZSBfYmFzZSBwcm9wZXJ0eS5cbiAgaWYgKCFjaGlsZC5fYmFzZSkge1xuICAgIGlmIChjaGlsZC5leHRlbmRzKSB7XG4gICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5leHRlbmRzLCB2bSk7XG4gICAgfVxuICAgIGlmIChjaGlsZC5taXhpbnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBwYXJlbnQpIHtcbiAgICBtZXJnZUZpZWxkKGtleSk7XG4gIH1cbiAgZm9yIChrZXkgaW4gY2hpbGQpIHtcbiAgICBpZiAoIWhhc093bihwYXJlbnQsIGtleSkpIHtcbiAgICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7XG4gICAgdmFyIHN0cmF0ID0gc3RyYXRzW2tleV0gfHwgZGVmYXVsdFN0cmF0O1xuICAgIG9wdGlvbnNba2V5XSA9IHN0cmF0KHBhcmVudFtrZXldLCBjaGlsZFtrZXldLCB2bSwga2V5KTtcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXNzZXQuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3NcbiAqIHRvIGFzc2V0cyBkZWZpbmVkIGluIGl0cyBhbmNlc3RvciBjaGFpbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0IChcbiAgb3B0aW9ucyxcbiAgdHlwZSxcbiAgaWQsXG4gIHdhcm5NaXNzaW5nXG4pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGFzc2V0cyA9IG9wdGlvbnNbdHlwZV07XG4gIC8vIGNoZWNrIGxvY2FsIHJlZ2lzdHJhdGlvbiB2YXJpYXRpb25zIGZpcnN0XG4gIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfVxuICB2YXIgY2FtZWxpemVkSWQgPSBjYW1lbGl6ZShpZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBjYW1lbGl6ZWRJZCkpIHsgcmV0dXJuIGFzc2V0c1tjYW1lbGl6ZWRJZF0gfVxuICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBQYXNjYWxDYXNlSWQpKSB7IHJldHVybiBhc3NldHNbUGFzY2FsQ2FzZUlkXSB9XG4gIC8vIGZhbGxiYWNrIHRvIHByb3RvdHlwZSBjaGFpblxuICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgd2FybihcbiAgICAgICdGYWlsZWQgdG8gcmVzb2x2ZSAnICsgdHlwZS5zbGljZSgwLCAtMSkgKyAnOiAnICsgaWQsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wIChcbiAga2V5LFxuICBwcm9wT3B0aW9ucyxcbiAgcHJvcHNEYXRhLFxuICB2bVxuKSB7XG4gIHZhciBwcm9wID0gcHJvcE9wdGlvbnNba2V5XTtcbiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpO1xuICB2YXIgdmFsdWUgPSBwcm9wc0RhdGFba2V5XTtcbiAgLy8gYm9vbGVhbiBjYXN0aW5nXG4gIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTtcbiAgaWYgKGJvb2xlYW5JbmRleCA+IC0xKSB7XG4gICAgaWYgKGFic2VudCAmJiAhaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSB7XG4gICAgICAvLyBvbmx5IGNhc3QgZW1wdHkgc3RyaW5nIC8gc2FtZSBuYW1lIHRvIGJvb2xlYW4gaWZcbiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eVxuICAgICAgdmFyIHN0cmluZ0luZGV4ID0gZ2V0VHlwZUluZGV4KFN0cmluZywgcHJvcC50eXBlKTtcbiAgICAgIGlmIChzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBjaGVjayBkZWZhdWx0IHZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpO1xuICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgZnJlc2ggY29weSxcbiAgICAvLyBtYWtlIHN1cmUgdG8gb2JzZXJ2ZSBpdC5cbiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgICBvYnNlcnZlKHZhbHVlKTtcbiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpO1xuICB9XG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGZvciB3ZWV4IHJlY3ljbGUtbGlzdCBjaGlsZCBjb21wb25lbnQgcHJvcHNcbiAgICAhKGZhbHNlKVxuICApIHtcbiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHtcbiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNPYmplY3QoZGVmKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wIFwiJyArIGtleSArICdcIjogJyArXG4gICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArXG4gICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlcixcbiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyXG4gIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiZcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdm0uX3Byb3BzW2tleV1cbiAgfVxuICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlc1xuICAvLyBhIHZhbHVlIGlzIEZ1bmN0aW9uIGlmIGl0cyBwcm90b3R5cGUgaXMgZnVuY3Rpb24gZXZlbiBhY3Jvc3MgZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJ1xuICAgID8gZGVmLmNhbGwodm0pXG4gICAgOiBkZWZcbn1cblxuLyoqXG4gKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFByb3AgKFxuICBwcm9wLFxuICBuYW1lLFxuICB2YWx1ZSxcbiAgdm0sXG4gIGFic2VudFxuKSB7XG4gIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkge1xuICAgIHdhcm4oXG4gICAgICAnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlO1xuICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICBpZiAodHlwZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZSA9IFt0eXBlXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykge1xuICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpO1xuICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF2YWxpZCkge1xuICAgIHdhcm4oXG4gICAgICBnZXRJbnZhbGlkVHlwZU1lc3NhZ2UobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjtcbiAgaWYgKHZhbGlkYXRvcikge1xuICAgIGlmICghdmFsaWRhdG9yKHZhbHVlKSkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHNpbXBsZUNoZWNrUkUgPSAvXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO1xuXG5mdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkge1xuICB2YXIgdmFsaWQ7XG4gIHZhciBleHBlY3RlZFR5cGUgPSBnZXRUeXBlKHR5cGUpO1xuICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHtcbiAgICB2YXIgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzXG4gICAgaWYgKCF2YWxpZCAmJiB0ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGVcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcyxcbiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZ1xuICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlIChmbikge1xuICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnXG59XG5cbmZ1bmN0aW9uIGlzU2FtZVR5cGUgKGEsIGIpIHtcbiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYilcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXMsIHR5cGUpID8gMCA6IC0xXG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV4cGVjdGVkVHlwZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzW2ldLCB0eXBlKSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZSAobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgdmFyIG1lc3NhZ2UgPSBcIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXFxcIlwiICsgbmFtZSArIFwiXFxcIi5cIiArXG4gICAgXCIgRXhwZWN0ZWQgXCIgKyAoZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbignLCAnKSk7XG4gIHZhciBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICB2YXIgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgdmFyIGV4cGVjdGVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCBleHBlY3RlZFR5cGUpO1xuICB2YXIgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BlY2lmeSBleHBlY3RlZCB2YWx1ZVxuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGlzRXhwbGljYWJsZShleHBlY3RlZFR5cGUpICYmXG4gICAgICAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gXCIgd2l0aCB2YWx1ZSBcIiArIGV4cGVjdGVkVmFsdWU7XG4gIH1cbiAgbWVzc2FnZSArPSBcIiwgZ290IFwiICsgcmVjZWl2ZWRUeXBlICsgXCIgXCI7XG4gIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BlY2lmeSByZWNlaXZlZCB2YWx1ZVxuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IFwid2l0aCB2YWx1ZSBcIiArIHJlY2VpdmVkVmFsdWUgKyBcIi5cIjtcbiAgfVxuICByZXR1cm4gbWVzc2FnZVxufVxuXG5mdW5jdGlvbiBzdHlsZVZhbHVlICh2YWx1ZSwgdHlwZSkge1xuICBpZiAodHlwZSA9PT0gJ1N0cmluZycpIHtcbiAgICByZXR1cm4gKFwiXFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIilcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnTnVtYmVyJykge1xuICAgIHJldHVybiAoXCJcIiArIChOdW1iZXIodmFsdWUpKSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFwiXCIgKyB2YWx1ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V4cGxpY2FibGUgKHZhbHVlKSB7XG4gIHZhciBleHBsaWNpdFR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gZWxlbTsgfSlcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuICgpIHtcbiAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICByZXR1cm4gYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiBlbGVtLnRvTG93ZXJDYXNlKCkgPT09ICdib29sZWFuJzsgfSlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIC8vIERlYWN0aXZhdGUgZGVwcyB0cmFja2luZyB3aGlsZSBwcm9jZXNzaW5nIGVycm9yIGhhbmRsZXIgdG8gYXZvaWQgcG9zc2libGUgaW5maW5pdGUgcmVuZGVyaW5nLlxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWV4L2lzc3Vlcy8xNTA1XG4gIHB1c2hUYXJnZXQoKTtcbiAgdHJ5IHtcbiAgICBpZiAodm0pIHtcbiAgICAgIHZhciBjdXIgPSB2bTtcbiAgICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7XG4gICAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO1xuICAgICAgICBpZiAoaG9va3MpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwb3BUYXJnZXQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyAoXG4gIGhhbmRsZXIsXG4gIGNvbnRleHQsXG4gIGFyZ3MsXG4gIHZtLFxuICBpbmZvXG4pIHtcbiAgdmFyIHJlcztcbiAgdHJ5IHtcbiAgICByZXMgPSBhcmdzID8gaGFuZGxlci5hcHBseShjb250ZXh0LCBhcmdzKSA6IGhhbmRsZXIuY2FsbChjb250ZXh0KTtcbiAgICBpZiAocmVzICYmICFyZXMuX2lzVnVlICYmIGlzUHJvbWlzZShyZXMpICYmICFyZXMuX2hhbmRsZWQpIHtcbiAgICAgIHJlcy5jYXRjaChmdW5jdGlvbiAoZSkgeyByZXR1cm4gaGFuZGxlRXJyb3IoZSwgdm0sIGluZm8gKyBcIiAoUHJvbWlzZS9hc3luYylcIik7IH0pO1xuICAgICAgLy8gaXNzdWUgIzk1MTFcbiAgICAgIC8vIGF2b2lkIGNhdGNoIHRyaWdnZXJpbmcgbXVsdGlwbGUgdGltZXMgd2hlbiBuZXN0ZWQgY2FsbHNcbiAgICAgIHJlcy5faGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaGFuZGxlRXJyb3IoZSwgdm0sIGluZm8pO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIHRoZSB1c2VyIGludGVudGlvbmFsbHkgdGhyb3dzIHRoZSBvcmlnaW5hbCBlcnJvciBpbiB0aGUgaGFuZGxlcixcbiAgICAgIC8vIGRvIG5vdCBsb2cgaXQgdHdpY2VcbiAgICAgIGlmIChlICE9PSBlcnIpIHtcbiAgICAgICAgbG9nRXJyb3IoZSwgbnVsbCwgJ2NvbmZpZy5lcnJvckhhbmRsZXInKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB2bSwgaW5mbyk7XG59XG5cbmZ1bmN0aW9uIGxvZ0Vycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybigoXCJFcnJvciBpbiBcIiArIGluZm8gKyBcIjogXFxcIlwiICsgKGVyci50b1N0cmluZygpKSArIFwiXFxcIlwiKSwgdm0pO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICgoaW5Ccm93c2VyIHx8IGluV2VleCkgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgaXNVc2luZ01pY3JvVGFzayA9IGZhbHNlO1xuXG52YXIgY2FsbGJhY2tzID0gW107XG52YXIgcGVuZGluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7XG4gIHBlbmRpbmcgPSBmYWxzZTtcbiAgdmFyIGNvcGllcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29waWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29waWVzW2ldKCk7XG4gIH1cbn1cblxuLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBtaWNyb3Rhc2tzLlxuLy8gSW4gMi41IHdlIHVzZWQgKG1hY3JvKSB0YXNrcyAoaW4gY29tYmluYXRpb24gd2l0aCBtaWNyb3Rhc2tzKS5cbi8vIEhvd2V2ZXIsIGl0IGhhcyBzdWJ0bGUgcHJvYmxlbXMgd2hlbiBzdGF0ZSBpcyBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSByZXBhaW50XG4vLyAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS5cbi8vIEFsc28sIHVzaW5nIChtYWNybykgdGFza3MgaW4gZXZlbnQgaGFuZGxlciB3b3VsZCBjYXVzZSBzb21lIHdlaXJkIGJlaGF2aW9yc1xuLy8gdGhhdCBjYW5ub3QgYmUgY2lyY3VtdmVudGVkIChlLmcuICM3MTA5LCAjNzE1MywgIzc1NDYsICM3ODM0LCAjODEwOSkuXG4vLyBTbyB3ZSBub3cgdXNlIG1pY3JvdGFza3MgZXZlcnl3aGVyZSwgYWdhaW4uXG4vLyBBIG1ham9yIGRyYXdiYWNrIG9mIHRoaXMgdHJhZGVvZmYgaXMgdGhhdCB0aGVyZSBhcmUgc29tZSBzY2VuYXJpb3Ncbi8vIHdoZXJlIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseVxuLy8gc2VxdWVudGlhbCBldmVudHMgKGUuZy4gIzQ1MjEsICM2NjkwLCB3aGljaCBoYXZlIHdvcmthcm91bmRzKVxuLy8gb3IgZXZlbiBiZXR3ZWVuIGJ1YmJsaW5nIG9mIHRoZSBzYW1lIGV2ZW50ICgjNjU2NikuXG52YXIgdGltZXJGdW5jO1xuXG4vLyBUaGUgbmV4dFRpY2sgYmVoYXZpb3IgbGV2ZXJhZ2VzIHRoZSBtaWNyb3Rhc2sgcXVldWUsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZFxuLy8gdmlhIGVpdGhlciBuYXRpdmUgUHJvbWlzZS50aGVuIG9yIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXRhdGlvbk9ic2VydmVyIGhhcyB3aWRlciBzdXBwb3J0LCBob3dldmVyIGl0IGlzIHNlcmlvdXNseSBidWdnZWQgaW5cbi8vIFVJV2ViVmlldyBpbiBpT1MgPj0gOS4zLjMgd2hlbiB0cmlnZ2VyZWQgaW4gdG91Y2ggZXZlbnQgaGFuZGxlcnMuIEl0XG4vLyBjb21wbGV0ZWx5IHN0b3BzIHdvcmtpbmcgYWZ0ZXIgdHJpZ2dlcmluZyBhIGZldyB0aW1lcy4uLiBzbywgaWYgbmF0aXZlXG4vLyBQcm9taXNlIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCB1c2UgaXQ6XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovXG5pZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb21pc2UpKSB7XG4gIHZhciBwID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwLnRoZW4oZmx1c2hDYWxsYmFja3MpO1xuICAgIC8vIEluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dFxuICAgIC8vIGl0IGNhbiBnZXQgc3R1Y2sgaW4gYSB3ZWlyZCBzdGF0ZSB3aGVyZSBjYWxsYmFja3MgYXJlIHB1c2hlZCBpbnRvIHRoZVxuICAgIC8vIG1pY3JvdGFzayBxdWV1ZSBidXQgdGhlIHF1ZXVlIGlzbid0IGJlaW5nIGZsdXNoZWQsIHVudGlsIHRoZSBicm93c2VyXG4gICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuXG4gICAgLy8gXCJmb3JjZVwiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuXG4gICAgaWYgKGlzSU9TKSB7IHNldFRpbWVvdXQobm9vcCk7IH1cbiAgfTtcbiAgaXNVc2luZ01pY3JvVGFzayA9IHRydWU7XG59IGVsc2UgaWYgKCFpc0lFICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiAoXG4gIGlzTmF0aXZlKE11dGF0aW9uT2JzZXJ2ZXIpIHx8XG4gIC8vIFBoYW50b21KUyBhbmQgaU9TIDcueFxuICBNdXRhdGlvbk9ic2VydmVyLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0nXG4pKSB7XG4gIC8vIFVzZSBNdXRhdGlvbk9ic2VydmVyIHdoZXJlIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBhdmFpbGFibGUsXG4gIC8vIGUuZy4gUGhhbnRvbUpTLCBpT1M3LCBBbmRyb2lkIDQuNFxuICAvLyAoIzY0NjYgTXV0YXRpb25PYnNlcnZlciBpcyB1bnJlbGlhYmxlIGluIElFMTEpXG4gIHZhciBjb3VudGVyID0gMTtcbiAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2hDYWxsYmFja3MpO1xuICB2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoY291bnRlcikpO1xuICBvYnNlcnZlci5vYnNlcnZlKHRleHROb2RlLCB7XG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICB9KTtcbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMjtcbiAgICB0ZXh0Tm9kZS5kYXRhID0gU3RyaW5nKGNvdW50ZXIpO1xuICB9O1xuICBpc1VzaW5nTWljcm9UYXNrID0gdHJ1ZTtcbn0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoc2V0SW1tZWRpYXRlKSkge1xuICAvLyBGYWxsYmFjayB0byBzZXRJbW1lZGlhdGUuXG4gIC8vIFRlY2hpbmljYWxseSBpdCBsZXZlcmFnZXMgdGhlIChtYWNybykgdGFzayBxdWV1ZSxcbiAgLy8gYnV0IGl0IGlzIHN0aWxsIGEgYmV0dGVyIGNob2ljZSB0aGFuIHNldFRpbWVvdXQuXG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dC5cbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQoZmx1c2hDYWxsYmFja3MsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkge1xuICB2YXIgX3Jlc29sdmU7XG4gIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNiLmNhbGwoY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZSwgY3R4LCAnbmV4dFRpY2snKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZShjdHgpO1xuICAgIH1cbiAgfSk7XG4gIGlmICghcGVuZGluZykge1xuICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgIHRpbWVyRnVuYygpO1xuICB9XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBpZiAoIWNiICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pXG4gIH1cbn1cblxuLyogICovXG5cbi8qIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aCBQcm94eSAqL1xuXG52YXIgaW5pdFByb3h5O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgYWxsb3dlZEdsb2JhbHMgPSBtYWtlTWFwKFxuICAgICdJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLCcgK1xuICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICtcbiAgICAnTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLCcgK1xuICAgICdyZXF1aXJlJyAvLyBmb3IgV2VicGFjay9Ccm93c2VyaWZ5XG4gICk7XG5cbiAgdmFyIHdhcm5Ob25QcmVzZW50ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgd2FybihcbiAgICAgIFwiUHJvcGVydHkgb3IgbWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UgYnV0IFwiICtcbiAgICAgICdyZWZlcmVuY2VkIGR1cmluZyByZW5kZXIuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcHJvcGVydHkgaXMgcmVhY3RpdmUsICcgK1xuICAgICAgJ2VpdGhlciBpbiB0aGUgZGF0YSBvcHRpb24sIG9yIGZvciBjbGFzcy1iYXNlZCBjb21wb25lbnRzLCBieSAnICtcbiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICtcbiAgICAgICdTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL3JlYWN0aXZpdHkuaHRtbCNEZWNsYXJpbmctUmVhY3RpdmUtUHJvcGVydGllcy4nLFxuICAgICAgdGFyZ2V0XG4gICAgKTtcbiAgfTtcblxuICB2YXIgd2FyblJlc2VydmVkUHJlZml4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgd2FybihcbiAgICAgIFwiUHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBcXFwiJGRhdGEuXCIgKyBrZXkgKyBcIlxcXCIgYmVjYXVzZSBcIiArXG4gICAgICAncHJvcGVydGllcyBzdGFydGluZyB3aXRoIFwiJFwiIG9yIFwiX1wiIGFyZSBub3QgcHJveGllZCBpbiB0aGUgVnVlIGluc3RhbmNlIHRvICcgK1xuICAgICAgJ3ByZXZlbnQgY29uZmxpY3RzIHdpdGggVnVlIGludGVybmFscycgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNkYXRhJyxcbiAgICAgIHRhcmdldFxuICAgICk7XG4gIH07XG5cbiAgdmFyIGhhc1Byb3h5ID1cbiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb3h5KTtcblxuICBpZiAoaGFzUHJveHkpIHtcbiAgICB2YXIgaXNCdWlsdEluTW9kaWZpZXIgPSBtYWtlTWFwKCdzdG9wLHByZXZlbnQsc2VsZixjdHJsLHNoaWZ0LGFsdCxtZXRhLGV4YWN0Jyk7XG4gICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2Rlcywge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNCdWlsdEluTW9kaWZpZXIoa2V5KSkge1xuICAgICAgICAgIHdhcm4oKFwiQXZvaWQgb3ZlcndyaXRpbmcgYnVpbHQtaW4gbW9kaWZpZXIgaW4gY29uZmlnLmtleUNvZGVzOiAuXCIgKyBrZXkpKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBoYXNIYW5kbGVyID0ge1xuICAgIGhhczogZnVuY3Rpb24gaGFzICh0YXJnZXQsIGtleSkge1xuICAgICAgdmFyIGhhcyA9IGtleSBpbiB0YXJnZXQ7XG4gICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fFxuICAgICAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmNoYXJBdCgwKSA9PT0gJ18nICYmICEoa2V5IGluIHRhcmdldC4kZGF0YSkpO1xuICAgICAgaWYgKCFoYXMgJiYgIWlzQWxsb3dlZCkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldC4kZGF0YSkgeyB3YXJuUmVzZXJ2ZWRQcmVmaXgodGFyZ2V0LCBrZXkpOyB9XG4gICAgICAgIGVsc2UgeyB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXMgfHwgIWlzQWxsb3dlZFxuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0SGFuZGxlciA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiAhKGtleSBpbiB0YXJnZXQpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0LiRkYXRhKSB7IHdhcm5SZXNlcnZlZFByZWZpeCh0YXJnZXQsIGtleSk7IH1cbiAgICAgICAgZWxzZSB7IHdhcm5Ob25QcmVzZW50KHRhcmdldCwga2V5KTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgc2Vlbk9iamVjdHMgPSBuZXcgX1NldCgpO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2UgKHZhbCkge1xuICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7XG4gIHNlZW5PYmplY3RzLmNsZWFyKCk7XG59XG5cbmZ1bmN0aW9uIF90cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIHZhciBpLCBrZXlzO1xuICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuICBpZiAoKCFpc0EgJiYgIWlzT2JqZWN0KHZhbCkpIHx8IE9iamVjdC5pc0Zyb3plbih2YWwpIHx8IHZhbCBpbnN0YW5jZW9mIFZOb2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG52YXIgbWFyaztcbnZhciBtZWFzdXJlO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcGVyZiA9IGluQnJvd3NlciAmJiB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoXG4gICAgcGVyZiAmJlxuICAgIHBlcmYubWFyayAmJlxuICAgIHBlcmYubWVhc3VyZSAmJlxuICAgIHBlcmYuY2xlYXJNYXJrcyAmJlxuICAgIHBlcmYuY2xlYXJNZWFzdXJlc1xuICApIHtcbiAgICBtYXJrID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gcGVyZi5tYXJrKHRhZyk7IH07XG4gICAgbWVhc3VyZSA9IGZ1bmN0aW9uIChuYW1lLCBzdGFydFRhZywgZW5kVGFnKSB7XG4gICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gICAgICAvLyBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSlcbiAgICB9O1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zLCB2bSkge1xuICBmdW5jdGlvbiBpbnZva2VyICgpIHtcbiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm5zKSkge1xuICAgICAgdmFyIGNsb25lZCA9IGZucy5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW52b2tlV2l0aEVycm9ySGFuZGxpbmcoY2xvbmVkW2ldLCBudWxsLCBhcmd1bWVudHMkMSwgdm0sIFwidi1vbiBoYW5kbGVyXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGZucywgbnVsbCwgYXJndW1lbnRzLCB2bSwgXCJ2LW9uIGhhbmRsZXJcIilcbiAgICB9XG4gIH1cbiAgaW52b2tlci5mbnMgPSBmbnM7XG4gIHJldHVybiBpbnZva2VyXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpc3RlbmVycyAoXG4gIG9uLFxuICBvbGRPbixcbiAgYWRkLFxuICByZW1vdmUkJDEsXG4gIGNyZWF0ZU9uY2VIYW5kbGVyLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBkZWYkJDEsIGN1ciwgb2xkLCBldmVudDtcbiAgZm9yIChuYW1lIGluIG9uKSB7XG4gICAgZGVmJCQxID0gY3VyID0gb25bbmFtZV07XG4gICAgb2xkID0gb2xkT25bbmFtZV07XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICBpZiAoaXNVbmRlZihjdXIpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiSW52YWxpZCBoYW5kbGVyIGZvciBldmVudCBcXFwiXCIgKyAoZXZlbnQubmFtZSkgKyBcIlxcXCI6IGdvdCBcIiArIFN0cmluZyhjdXIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkKSkge1xuICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHtcbiAgICAgICAgY3VyID0gb25bbmFtZV0gPSBjcmVhdGVGbkludm9rZXIoY3VyLCB2bSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNUcnVlKGV2ZW50Lm9uY2UpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlT25jZUhhbmRsZXIoZXZlbnQubmFtZSwgY3VyLCBldmVudC5jYXB0dXJlKTtcbiAgICAgIH1cbiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7XG4gICAgfSBlbHNlIGlmIChjdXIgIT09IG9sZCkge1xuICAgICAgb2xkLmZucyA9IGN1cjtcbiAgICAgIG9uW25hbWVdID0gb2xkO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gb2xkT24pIHtcbiAgICBpZiAoaXNVbmRlZihvbltuYW1lXSkpIHtcbiAgICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbWVyZ2VWTm9kZUhvb2sgKGRlZiwgaG9va0tleSwgaG9vaykge1xuICBpZiAoZGVmIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pO1xuICB9XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDtcbiAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgYyA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfVxuICAgIGxhc3RJbmRleCA9IHJlcy5sZW5ndGggLSAxO1xuICAgIGxhc3QgPSByZXNbbGFzdEluZGV4XTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIGlmIChjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyBcIl9cIiArIGkpKTtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAoaXNUZXh0Tm9kZShjWzBdKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgKGNbMF0pLnRleHQpO1xuICAgICAgICAgIGMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUoYykpIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgLy8gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFNTUiBoeWRyYXRpb24gYmVjYXVzZSB0ZXh0IG5vZGVzIGFyZVxuICAgICAgICAvLyBlc3NlbnRpYWxseSBtZXJnZWQgd2hlbiByZW5kZXJlZCB0byBIVE1MIHN0cmluZ3NcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgIT09ICcnKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHRvIHZub2RlXG4gICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyBjLnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVmYXVsdCBrZXkgZm9yIG5lc3RlZCBhcnJheSBjaGlsZHJlbiAobGlrZWx5IGdlbmVyYXRlZCBieSB2LWZvcilcbiAgICAgICAgaWYgKGlzVHJ1ZShjaGlsZHJlbi5faXNWTGlzdCkgJiZcbiAgICAgICAgICBpc0RlZihjLnRhZykgJiZcbiAgICAgICAgICBpc1VuZGVmKGMua2V5KSAmJlxuICAgICAgICAgIGlzRGVmKG5lc3RlZEluZGV4KSkge1xuICAgICAgICAgIGMua2V5ID0gXCJfX3ZsaXN0XCIgKyBuZXN0ZWRJbmRleCArIFwiX1wiICsgaSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFByb3ZpZGUgKHZtKSB7XG4gIHZhciBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZTtcbiAgaWYgKHByb3ZpZGUpIHtcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwcm92aWRlLmNhbGwodm0pXG4gICAgICA6IHByb3ZpZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEluamVjdGlvbnMgKHZtKSB7XG4gIHZhciByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pO1xuICBpZiAocmVzdWx0KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0IChpbmplY3QsIHZtKSB7XG4gIGlmIChpbmplY3QpIHtcbiAgICAvLyBpbmplY3QgaXMgOmFueSBiZWNhdXNlIGZsb3cgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBmaWd1cmUgb3V0IGNhY2hlZFxuICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpXG4gICAgICA6IE9iamVjdC5rZXlzKGluamVjdCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgLy8gIzY1NzQgaW4gY2FzZSB0aGUgaW5qZWN0IG9iamVjdCBpcyBvYnNlcnZlZC4uLlxuICAgICAgaWYgKGtleSA9PT0gJ19fb2JfXycpIHsgY29udGludWUgfVxuICAgICAgdmFyIHByb3ZpZGVLZXkgPSBpbmplY3Rba2V5XS5mcm9tO1xuICAgICAgdmFyIHNvdXJjZSA9IHZtO1xuICAgICAgd2hpbGUgKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLl9wcm92aWRlZCAmJiBoYXNPd24oc291cmNlLl9wcm92aWRlZCwgcHJvdmlkZUtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHtcbiAgICAgICAgICB2YXIgcHJvdmlkZURlZmF1bHQgPSBpbmplY3Rba2V5XS5kZWZhdWx0O1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdHlwZW9mIHByb3ZpZGVEZWZhdWx0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pXG4gICAgICAgICAgICA6IHByb3ZpZGVEZWZhdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKChcIkluamVjdGlvbiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgbm90IGZvdW5kXCIpLCB2bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbi8qICAqL1xuXG5cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIHJhdyBjaGlsZHJlbiBWTm9kZXMgaW50byBhIHNsb3Qgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU2xvdHMgKFxuICBjaGlsZHJlbixcbiAgY29udGV4dFxuKSB7XG4gIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIHZhciBzbG90cyA9IHt9O1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIHZhciBkYXRhID0gY2hpbGQuZGF0YTtcbiAgICAvLyByZW1vdmUgc2xvdCBhdHRyaWJ1dGUgaWYgdGhlIG5vZGUgaXMgcmVzb2x2ZWQgYXMgYSBWdWUgc2xvdCBub2RlXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHtcbiAgICAgIGRlbGV0ZSBkYXRhLmF0dHJzLnNsb3Q7XG4gICAgfVxuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZm5Db250ZXh0ID09PSBjb250ZXh0KSAmJlxuICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbFxuICAgICkge1xuICAgICAgdmFyIG5hbWUgPSBkYXRhLnNsb3Q7XG4gICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpO1xuICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICBzbG90LnB1c2guYXBwbHkoc2xvdCwgY2hpbGQuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2xvdC5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVTY29wZWRTbG90cyAoXG4gIHNsb3RzLFxuICBub3JtYWxTbG90cyxcbiAgcHJldlNsb3RzXG4pIHtcbiAgdmFyIHJlcztcbiAgdmFyIGhhc05vcm1hbFNsb3RzID0gT2JqZWN0LmtleXMobm9ybWFsU2xvdHMpLmxlbmd0aCA+IDA7XG4gIHZhciBpc1N0YWJsZSA9IHNsb3RzID8gISFzbG90cy4kc3RhYmxlIDogIWhhc05vcm1hbFNsb3RzO1xuICB2YXIga2V5ID0gc2xvdHMgJiYgc2xvdHMuJGtleTtcbiAgaWYgKCFzbG90cykge1xuICAgIHJlcyA9IHt9O1xuICB9IGVsc2UgaWYgKHNsb3RzLl9ub3JtYWxpemVkKSB7XG4gICAgLy8gZmFzdCBwYXRoIDE6IGNoaWxkIGNvbXBvbmVudCByZS1yZW5kZXIgb25seSwgcGFyZW50IGRpZCBub3QgY2hhbmdlXG4gICAgcmV0dXJuIHNsb3RzLl9ub3JtYWxpemVkXG4gIH0gZWxzZSBpZiAoXG4gICAgaXNTdGFibGUgJiZcbiAgICBwcmV2U2xvdHMgJiZcbiAgICBwcmV2U2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmXG4gICAga2V5ID09PSBwcmV2U2xvdHMuJGtleSAmJlxuICAgICFoYXNOb3JtYWxTbG90cyAmJlxuICAgICFwcmV2U2xvdHMuJGhhc05vcm1hbFxuICApIHtcbiAgICAvLyBmYXN0IHBhdGggMjogc3RhYmxlIHNjb3BlZCBzbG90cyB3LyBubyBub3JtYWwgc2xvdHMgdG8gcHJveHksXG4gICAgLy8gb25seSBuZWVkIHRvIG5vcm1hbGl6ZSBvbmNlXG4gICAgcmV0dXJuIHByZXZTbG90c1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSQxIGluIHNsb3RzKSB7XG4gICAgICBpZiAoc2xvdHNba2V5JDFdICYmIGtleSQxWzBdICE9PSAnJCcpIHtcbiAgICAgICAgcmVzW2tleSQxXSA9IG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSQxLCBzbG90c1trZXkkMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2Ugbm9ybWFsIHNsb3RzIG9uIHNjb3BlZFNsb3RzXG4gIGZvciAodmFyIGtleSQyIGluIG5vcm1hbFNsb3RzKSB7XG4gICAgaWYgKCEoa2V5JDIgaW4gcmVzKSkge1xuICAgICAgcmVzW2tleSQyXSA9IHByb3h5Tm9ybWFsU2xvdChub3JtYWxTbG90cywga2V5JDIpO1xuICAgIH1cbiAgfVxuICAvLyBhdm9yaWF6IHNlZW1zIHRvIG1vY2sgYSBub24tZXh0ZW5zaWJsZSAkc2NvcGVkU2xvdHMgb2JqZWN0XG4gIC8vIGFuZCB3aGVuIHRoYXQgaXMgcGFzc2VkIGRvd24gdGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvclxuICBpZiAoc2xvdHMgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShzbG90cykpIHtcbiAgICAoc2xvdHMpLl9ub3JtYWxpemVkID0gcmVzO1xuICB9XG4gIGRlZihyZXMsICckc3RhYmxlJywgaXNTdGFibGUpO1xuICBkZWYocmVzLCAnJGtleScsIGtleSk7XG4gIGRlZihyZXMsICckaGFzTm9ybWFsJywgaGFzTm9ybWFsU2xvdHMpO1xuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSwgZm4pIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50cy5sZW5ndGggPyBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZm4oe30pO1xuICAgIHJlcyA9IHJlcyAmJiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXMpXG4gICAgICA/IFtyZXNdIC8vIHNpbmdsZSB2bm9kZVxuICAgICAgOiBub3JtYWxpemVDaGlsZHJlbihyZXMpO1xuICAgIHJldHVybiByZXMgJiYgKFxuICAgICAgcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKHJlcy5sZW5ndGggPT09IDEgJiYgcmVzWzBdLmlzQ29tbWVudCkgLy8gIzk2NThcbiAgICApID8gdW5kZWZpbmVkXG4gICAgICA6IHJlc1xuICB9O1xuICAvLyB0aGlzIGlzIGEgc2xvdCB1c2luZyB0aGUgbmV3IHYtc2xvdCBzeW50YXggd2l0aG91dCBzY29wZS4gYWx0aG91Z2ggaXQgaXNcbiAgLy8gY29tcGlsZWQgYXMgYSBzY29wZWQgc2xvdCwgcmVuZGVyIGZuIHVzZXJzIHdvdWxkIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50XG4gIC8vIG9uIHRoaXMuJHNsb3RzIGJlY2F1c2UgdGhlIHVzYWdlIGlzIHNlbWFudGljYWxseSBhIG5vcm1hbCBzbG90LlxuICBpZiAoZm4ucHJveHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsU2xvdHMsIGtleSwge1xuICAgICAgZ2V0OiBub3JtYWxpemVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIHByb3h5Tm9ybWFsU2xvdChzbG90cywga2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzbG90c1trZXldOyB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgdi1mb3IgbGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpc3QgKFxuICB2YWwsXG4gIHJlbmRlclxuKSB7XG4gIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXIoaSArIDEsIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgaWYgKGhhc1N5bWJvbCAmJiB2YWxbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gW107XG4gICAgICB2YXIgaXRlcmF0b3IgPSB2YWxbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0LnB1c2gocmVuZGVyKHJlc3VsdC52YWx1ZSwgcmV0Lmxlbmd0aCkpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNEZWYocmV0KSkge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgcmV0dXJuIHJldFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIDxzbG90PlxuICovXG5mdW5jdGlvbiByZW5kZXJTbG90IChcbiAgbmFtZSxcbiAgZmFsbGJhY2ssXG4gIHByb3BzLFxuICBiaW5kT2JqZWN0XG4pIHtcbiAgdmFyIHNjb3BlZFNsb3RGbiA9IHRoaXMuJHNjb3BlZFNsb3RzW25hbWVdO1xuICB2YXIgbm9kZXM7XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNPYmplY3QoYmluZE9iamVjdCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJvcHMgPSBleHRlbmQoZXh0ZW5kKHt9LCBiaW5kT2JqZWN0KSwgcHJvcHMpO1xuICAgIH1cbiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgbm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXSB8fCBmYWxsYmFjaztcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBwcm9wcyAmJiBwcm9wcy5zbG90O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzS2V5Tm90TWF0Y2ggKGV4cGVjdCwgYWN0dWFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHtcbiAgICByZXR1cm4gZXhwZWN0LmluZGV4T2YoYWN0dWFsKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWxcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBjaGVja2luZyBrZXlDb2RlcyBmcm9tIGNvbmZpZy5cbiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fa1xuICogcGFzc2luZyBpbiBldmVudEtleU5hbWUgYXMgbGFzdCBhcmd1bWVudCBzZXBhcmF0ZWx5IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gKi9cbmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKFxuICBldmVudEtleUNvZGUsXG4gIGtleSxcbiAgYnVpbHRJbktleUNvZGUsXG4gIGV2ZW50S2V5TmFtZSxcbiAgYnVpbHRJbktleU5hbWVcbikge1xuICB2YXIgbWFwcGVkS2V5Q29kZSA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5LZXlDb2RlO1xuICBpZiAoYnVpbHRJbktleU5hbWUgJiYgZXZlbnRLZXlOYW1lICYmICFjb25maWcua2V5Q29kZXNba2V5XSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpXG4gIH0gZWxzZSBpZiAobWFwcGVkS2V5Q29kZSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKG1hcHBlZEtleUNvZGUsIGV2ZW50S2V5Q29kZSlcbiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHtcbiAgICByZXR1cm4gaHlwaGVuYXRlKGV2ZW50S2V5TmFtZSkgIT09IGtleVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKCEoY2FtZWxpemVkS2V5IGluIGhhc2gpICYmICEoaHlwaGVuYXRlZEtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzLFxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBhZGRlZCBpbiAyLjZcbiAgaGFzRHluYW1pY0tleXMsXG4gIGNvbnRlbnRIYXNoS2V5XG4pIHtcbiAgcmVzID0gcmVzIHx8IHsgJHN0YWJsZTogIWhhc0R5bmFtaWNLZXlzIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNsb3QgPSBmbnNbaV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhzbG90LCByZXMsIGhhc0R5bmFtaWNLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIC8vIG1hcmtlciBmb3IgcmV2ZXJzZSBwcm94eWluZyB2LXNsb3Qgd2l0aG91dCBzY29wZSBvbiB0aGlzLiRzbG90c1xuICAgICAgaWYgKHNsb3QucHJveHkpIHtcbiAgICAgICAgc2xvdC5mbi5wcm94eSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNbc2xvdC5rZXldID0gc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnRIYXNoS2V5KSB7XG4gICAgKHJlcykuJGtleSA9IGNvbnRlbnRIYXNoS2V5O1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGJpbmREeW5hbWljS2V5cyAoYmFzZU9iaiwgdmFsdWVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5KSB7XG4gICAgICBiYXNlT2JqW3ZhbHVlc1tpXV0gPSB2YWx1ZXNbaSArIDFdO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBrZXkgIT09ICcnICYmIGtleSAhPT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBpcyBhIHNwZWljYWwgdmFsdWUgZm9yIGV4cGxpY2l0bHkgcmVtb3ZpbmcgYSBiaW5kaW5nXG4gICAgICB3YXJuKFxuICAgICAgICAoXCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiBcIiArIGtleSksXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiYXNlT2JqXG59XG5cbi8vIGhlbHBlciB0byBkeW5hbWljYWxseSBhcHBlbmQgbW9kaWZpZXIgcnVudGltZSBtYXJrZXJzIHRvIGV2ZW50IG5hbWVzLlxuLy8gZW5zdXJlIG9ubHkgYXBwZW5kIHdoZW4gdmFsdWUgaXMgYWxyZWFkeSBzdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNhc3Rcbi8vIHRvIHN0cmluZyBhbmQgY2F1c2UgdGhlIHR5cGUgY2hlY2sgdG8gbWlzcy5cbmZ1bmN0aW9uIHByZXBlbmRNb2RpZmllciAodmFsdWUsIHN5bWJvbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHN5bWJvbCArIHZhbHVlIDogdmFsdWVcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG4gIHRhcmdldC5fZCA9IGJpbmREeW5hbWljS2V5cztcbiAgdGFyZ2V0Ll9wID0gcHJlcGVuZE1vZGlmaWVyO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgKFxuICBkYXRhLFxuICBwcm9wcyxcbiAgY2hpbGRyZW4sXG4gIHBhcmVudCxcbiAgQ3RvclxuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIGNvbnRleHRWbTtcbiAgaWYgKGhhc093bihwYXJlbnQsICdfdWlkJykpIHtcbiAgICBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgY29udGV4dFZtLl9vcmlnaW5hbCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC5cbiAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgYXJlIGFibGUgdG8gZ2V0IGEgaG9sZCB0byB0aGVcbiAgICAvLyByZWFsIGNvbnRleHQgaW5zdGFuY2UuXG4gICAgY29udGV4dFZtID0gcGFyZW50O1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHBhcmVudCA9IHBhcmVudC5fb3JpZ2luYWw7XG4gIH1cbiAgdmFyIGlzQ29tcGlsZWQgPSBpc1RydWUob3B0aW9ucy5fY29tcGlsZWQpO1xuICB2YXIgbmVlZE5vcm1hbGl6YXRpb24gPSAhaXNDb21waWxlZDtcblxuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMubGlzdGVuZXJzID0gZGF0YS5vbiB8fCBlbXB0eU9iamVjdDtcbiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTtcbiAgdGhpcy5zbG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS4kc2xvdHMpIHtcbiAgICAgIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBkYXRhLnNjb3BlZFNsb3RzLFxuICAgICAgICB0aGlzJDEuJHNsb3RzID0gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcyQxLiRzbG90c1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NvcGVkU2xvdHMnLCAoe1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKGRhdGEuc2NvcGVkU2xvdHMsIHRoaXMuc2xvdHMoKSlcbiAgICB9XG4gIH0pKTtcblxuICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgLy8gZXhwb3NpbmcgJG9wdGlvbnMgZm9yIHJlbmRlclN0YXRpYygpXG4gICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gcHJlLXJlc29sdmUgc2xvdHMgZm9yIHJlbmRlclNsb3QoKVxuICAgIHRoaXMuJHNsb3RzID0gdGhpcy5zbG90cygpO1xuICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gbm9ybWFsaXplU2NvcGVkU2xvdHMoZGF0YS5zY29wZWRTbG90cywgdGhpcy4kc2xvdHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucywgcmVuZGVyQ29udGV4dClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zLCByZW5kZXJDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMsIHJlbmRlckNvbnRleHQpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIChjbG9uZS5kZXZ0b29sc01ldGEgPSBjbG9uZS5kZXZ0b29sc01ldGEgfHwge30pLnJlbmRlckNvbnRleHQgPSByZW5kZXJDb250ZXh0O1xuICB9XG4gIGlmIChkYXRhLnNsb3QpIHtcbiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW5saW5lIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0ICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgaWYgKFxuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiZcbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlXG4gICAgKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJlcGF0Y2g6IGZ1bmN0aW9uIHByZXBhdGNoIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB1cGRhdGVDaGlsZENvbXBvbmVudChcbiAgICAgIGNoaWxkLFxuICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHNcbiAgICAgIG9wdGlvbnMubGlzdGVuZXJzLCAvLyB1cGRhdGVkIGxpc3RlbmVyc1xuICAgICAgdm5vZGUsIC8vIG5ldyBwYXJlbnQgdm5vZGVcbiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuXG4gICAgKTtcbiAgfSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHZub2RlLmNvbnRleHQ7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkKSB7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHtcbiAgICAgICAgLy8gdnVlLXJvdXRlciMxMjEyXG4gICAgICAgIC8vIER1cmluZyB1cGRhdGVzLCBhIGtlcHQtYWxpdmUgY29tcG9uZW50J3MgY2hpbGQgY29tcG9uZW50cyBtYXlcbiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzXG4gICAgICAgIC8vIG9uIGluY29ycmVjdCBjaGlsZHJlbi4gSW5zdGVhZCB3ZSBwdXNoIHRoZW0gaW50byBhIHF1ZXVlIHdoaWNoIHdpbGxcbiAgICAgICAgLy8gYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSB3aG9sZSBwYXRjaCBwcm9jZXNzIGVuZGVkLlxuICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3kgKHZub2RlKSB7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGlmICghdm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxudmFyIGhvb2tzVG9NZXJnZSA9IE9iamVjdC5rZXlzKGNvbXBvbmVudFZOb2RlSG9va3MpO1xuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKFxuICBDdG9yLFxuICBkYXRhLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgdGFnXG4pIHtcbiAgaWYgKGlzVW5kZWYoQ3RvcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiYXNlQ3RvciA9IGNvbnRleHQuJG9wdGlvbnMuX2Jhc2U7XG5cbiAgLy8gcGxhaW4gb3B0aW9ucyBvYmplY3Q6IHR1cm4gaXQgaW50byBhIGNvbnN0cnVjdG9yXG4gIGlmIChpc09iamVjdChDdG9yKSkge1xuICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7XG4gIH1cblxuICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksXG4gIC8vIHJlamVjdC5cbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oKFwiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogXCIgKyAoU3RyaW5nKEN0b3IpKSksIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGFzeW5jIGNvbXBvbmVudFxuICB2YXIgYXN5bmNGYWN0b3J5O1xuICBpZiAoaXNVbmRlZihDdG9yLmNpZCkpIHtcbiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yO1xuICAgIEN0b3IgPSByZXNvbHZlQXN5bmNDb21wb25lbnQoYXN5bmNGYWN0b3J5LCBiYXNlQ3Rvcik7XG4gICAgaWYgKEN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZFxuICAgICAgLy8gYXMgYSBjb21tZW50IG5vZGUgYnV0IHByZXNlcnZlcyBhbGwgdGhlIHJhdyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUuXG4gICAgICAvLyB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGZvciBhc3luYyBzZXJ2ZXItcmVuZGVyaW5nIGFuZCBoeWRyYXRpb24uXG4gICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcihcbiAgICAgICAgYXN5bmNGYWN0b3J5LFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdGFnXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZGF0YSA9IGRhdGEgfHwge307XG5cbiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlclxuICAvLyBjb21wb25lbnQgY29uc3RydWN0b3IgY3JlYXRpb25cbiAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyhDdG9yKTtcblxuICAvLyB0cmFuc2Zvcm0gY29tcG9uZW50IHYtbW9kZWwgZGF0YSBpbnRvIHByb3BzICYgZXZlbnRzXG4gIGlmIChpc0RlZihkYXRhLm1vZGVsKSkge1xuICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7XG4gIH1cblxuICAvLyBleHRyYWN0IHByb3BzXG4gIHZhciBwcm9wc0RhdGEgPSBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhKGRhdGEsIEN0b3IsIHRhZyk7XG5cbiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnRcbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25hbENvbXBvbmVudChDdG9yLCBwcm9wc0RhdGEsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKVxuICB9XG5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMsIHNpbmNlIHRoZXNlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXNcbiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnNcbiAgdmFyIGxpc3RlbmVycyA9IGRhdGEub247XG4gIC8vIHJlcGxhY2Ugd2l0aCBsaXN0ZW5lcnMgd2l0aCAubmF0aXZlIG1vZGlmaWVyXG4gIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLlxuICBkYXRhLm9uID0gZGF0YS5uYXRpdmVPbjtcblxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHtcbiAgICAvLyBhYnN0cmFjdCBjb21wb25lbnRzIGRvIG5vdCBrZWVwIGFueXRoaW5nXG4gICAgLy8gb3RoZXIgdGhhbiBwcm9wcyAmIGxpc3RlbmVycyAmIHNsb3RcblxuICAgIC8vIHdvcmsgYXJvdW5kIGZsb3dcbiAgICB2YXIgc2xvdCA9IGRhdGEuc2xvdDtcbiAgICBkYXRhID0ge307XG4gICAgaWYgKHNsb3QpIHtcbiAgICAgIGRhdGEuc2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIGluc3RhbGxDb21wb25lbnRIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgX2lzQ29tcG9uZW50OiB0cnVlLFxuICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxDb21wb25lbnRIb29rcyAoZGF0YSkge1xuICB2YXIgaG9va3MgPSBkYXRhLmhvb2sgfHwgKGRhdGEuaG9vayA9IHt9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBleGlzdGluZyA9IGhvb2tzW2tleV07XG4gICAgdmFyIHRvTWVyZ2UgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB0b01lcmdlICYmICEoZXhpc3RpbmcgJiYgZXhpc3RpbmcuX21lcmdlZCkpIHtcbiAgICAgIGhvb2tzW2tleV0gPSBleGlzdGluZyA/IG1lcmdlSG9vayQxKHRvTWVyZ2UsIGV4aXN0aW5nKSA6IHRvTWVyZ2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChmMSwgZjIpIHtcbiAgdmFyIG1lcmdlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgLy8gZmxvdyBjb21wbGFpbnMgYWJvdXQgZXh0cmEgYXJncyB3aGljaCBpcyB3aHkgd2UgdXNlIGFueVxuICAgIGYxKGEsIGIpO1xuICAgIGYyKGEsIGIpO1xuICB9O1xuICBtZXJnZWQuX21lcmdlZCA9IHRydWU7XG4gIHJldHVybiBtZXJnZWRcbn1cblxuLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50b1xuLy8gcHJvcCBhbmQgZXZlbnQgaGFuZGxlciByZXNwZWN0aXZlbHkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Nb2RlbCAob3B0aW9ucywgZGF0YSkge1xuICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJztcbiAgdmFyIGV2ZW50ID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5ldmVudCkgfHwgJ2lucHV0J1xuICA7KGRhdGEuYXR0cnMgfHwgKGRhdGEuYXR0cnMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgdmFyIGV4aXN0aW5nID0gb25bZXZlbnRdO1xuICB2YXIgY2FsbGJhY2sgPSBkYXRhLm1vZGVsLmNhbGxiYWNrO1xuICBpZiAoaXNEZWYoZXhpc3RpbmcpKSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyBleGlzdGluZy5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTFcbiAgICAgICAgOiBleGlzdGluZyAhPT0gY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIG9uW2V2ZW50XSA9IFtjYWxsYmFja10uY29uY2F0KGV4aXN0aW5nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgoIWRhdGEgfHwgIWRhdGEucHJlKSAmJiBpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSBpZiAoaXNEZWYodm5vZGUpKSB7XG4gICAgaWYgKGlzRGVmKG5zKSkgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChcbiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7XG4gICAgICAgIGFwcGx5TlMoY2hpbGQsIG5zLCBmb3JjZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHJlZiAjNTMxOFxuLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBwYXJlbnQgcmUtcmVuZGVyIHdoZW4gZGVlcCBiaW5kaW5ncyBsaWtlIDpzdHlsZSBhbmRcbi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzXG5mdW5jdGlvbiByZWdpc3RlckRlZXBCaW5kaW5ncyAoZGF0YSkge1xuICBpZiAoaXNPYmplY3QoZGF0YS5zdHlsZSkpIHtcbiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoZGF0YS5jbGFzcykpIHtcbiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbnZhciBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7XG4gIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzXG4gIGluc3RhbGxSZW5kZXJIZWxwZXJzKFZ1ZS5wcm90b3R5cGUpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIHZhciByZWYgPSB2bS4kb3B0aW9ucztcbiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTtcblxuICAgIGlmIChfcGFyZW50Vm5vZGUpIHtcbiAgICAgIHZtLiRzY29wZWRTbG90cyA9IG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyxcbiAgICAgICAgdm0uJHNsb3RzLFxuICAgICAgICB2bS4kc2NvcGVkU2xvdHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIG1haW50YWluIGEgc3RhY2sgYmVjYXVlcyBhbGwgcmVuZGVyIGZucyBhcmUgY2FsbGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gb25lIGFub3RoZXIuIE5lc3RlZCBjb21wb25lbnQncyByZW5kZXIgZm5zIGFyZSBjYWxsZWRcbiAgICAgIC8vIHdoZW4gcGFyZW50IGNvbXBvbmVudCBpcyBwYXRjaGVkLlxuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gdm07XG4gICAgICB2bm9kZSA9IHJlbmRlci5jYWxsKHZtLl9yZW5kZXJQcm94eSwgdm0uJGNyZWF0ZUVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlclwiKTtcbiAgICAgIC8vIHJldHVybiBlcnJvciByZW5kZXIgcmVzdWx0LFxuICAgICAgLy8gb3IgcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2bS4kb3B0aW9ucy5yZW5kZXJFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlckVycm9yXCIpO1xuICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIHJldHVybmVkIGFycmF5IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9kZSwgYWxsb3cgaXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkgJiYgdm5vZGUubGVuZ3RoID09PSAxKSB7XG4gICAgICB2bm9kZSA9IHZub2RlWzBdO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yXG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICB2YXIgb3duZXIgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChvd25lciAmJiBpc0RlZihmYWN0b3J5Lm93bmVycykgJiYgZmFjdG9yeS5vd25lcnMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5vd25lcnMucHVzaChvd25lcik7XG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKG93bmVyICYmICFpc0RlZihmYWN0b3J5Lm93bmVycykpIHtcbiAgICB2YXIgb3duZXJzID0gZmFjdG9yeS5vd25lcnMgPSBbb3duZXJdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcbiAgICB2YXIgdGltZXJMb2FkaW5nID0gbnVsbDtcbiAgICB2YXIgdGltZXJUaW1lb3V0ID0gbnVsbFxuXG4gICAgOyhvd25lcikuJG9uKCdob29rOmRlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbW92ZShvd25lcnMsIG93bmVyKTsgfSk7XG5cbiAgICB2YXIgZm9yY2VSZW5kZXIgPSBmdW5jdGlvbiAocmVuZGVyQ29tcGxldGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgKG93bmVyc1tpXSkuJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJDb21wbGV0ZWQpIHtcbiAgICAgICAgb3duZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aW1lckxvYWRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJMb2FkaW5nKTtcbiAgICAgICAgICB0aW1lckxvYWRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJUaW1lb3V0KTtcbiAgICAgICAgICB0aW1lclRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcih0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVycy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJlcy5jb21wb25lbnQpKSB7XG4gICAgICAgIHJlcy5jb21wb25lbnQudGhlbihyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7XG4gICAgICAgICAgZmFjdG9yeS5lcnJvckNvbXAgPSBlbnN1cmVDdG9yKHJlcy5lcnJvciwgYmFzZUN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5sb2FkaW5nKSkge1xuICAgICAgICAgIGZhY3RvcnkubG9hZGluZ0NvbXAgPSBlbnN1cmVDdG9yKHJlcy5sb2FkaW5nLCBiYXNlQ3Rvcik7XG4gICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXJMb2FkaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRpbWVyTG9hZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpICYmIGlzVW5kZWYoZmFjdG9yeS5lcnJvcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHRpbWVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IChcInRpbWVvdXQgKFwiICsgKHJlcy50aW1lb3V0KSArIFwibXMpXCIpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCByZXMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzeW5jID0gZmFsc2U7XG4gICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseVxuICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdcbiAgICAgID8gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICAgICAgOiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzQXN5bmNQbGFjZWhvbGRlciAobm9kZSkge1xuICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3Rvcnlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldEZpcnN0Q29tcG9uZW50Q2hpbGQgKGNoaWxkcmVuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkge1xuICAgICAgICByZXR1cm4gY1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFdmVudHMgKHZtKSB7XG4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2bS5faGFzSG9va0V2ZW50ID0gZmFsc2U7XG4gIC8vIGluaXQgcGFyZW50IGF0dGFjaGVkIGV2ZW50c1xuICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgaWYgKGxpc3RlbmVycykge1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzKTtcbiAgfVxufVxuXG52YXIgdGFyZ2V0O1xuXG5mdW5jdGlvbiBhZGQgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIgKGV2ZW50LCBmbikge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldDtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICBfdGFyZ2V0LiRvZmYoZXZlbnQsIG9uY2VIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgY3JlYXRlT25jZUhhbmRsZXIsIHZtKTtcbiAgdGFyZ2V0ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZtLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSQxIDwgbDsgaSQxKyspIHtcbiAgICAgICAgdm0uJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgaGFuZGxlclxuICAgIHZhciBjYjtcbiAgICB2YXIgaSA9IGNicy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY2IgPSBjYnNbaV07XG4gICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICBjYnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgdm0uX2V2ZW50c1tsb3dlckNhc2VFdmVudF0pIHtcbiAgICAgICAgdGlwKFxuICAgICAgICAgIFwiRXZlbnQgXFxcIlwiICsgbG93ZXJDYXNlRXZlbnQgKyBcIlxcXCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgXCIgK1xuICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIiBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIFwiICtcbiAgICAgICAgICBcInYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBcIiArXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyAoaHlwaGVuYXRlKGV2ZW50KSkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBldmVudCArIFwiXFxcIi5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKGNicykge1xuICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7XG4gICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBpbmZvID0gXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNic1tpXSwgdm0sIGFyZ3MsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzZXRBY3RpdmVJbnN0YW5jZSh2bSkge1xuICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSBwcmV2QWN0aXZlSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHByZXZFbCA9IHZtLiRlbDtcbiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlO1xuICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh2bSk7XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18odm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXN0b3JlQWN0aXZlSW5zdGFuY2UoKTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHJlbmRlclwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG5cbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgICAgdm0uX3VwZGF0ZSh2bm9kZSwgaHlkcmF0aW5nKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHBhdGNoXCIpLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH1cblxuICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvclxuICAvLyBzaW5jZSB0aGUgd2F0Y2hlcidzIGluaXRpYWwgcGF0Y2ggbWF5IGNhbGwgJGZvcmNlVXBkYXRlIChlLmcuIGluc2lkZSBjaGlsZFxuICAvLyBjb21wb25lbnQncyBtb3VudGVkIGhvb2spLCB3aGljaCByZWxpZXMgb24gdm0uX3dhdGNoZXIgYmVpbmcgYWxyZWFkeSBkZWZpbmVkXG4gIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIHtcbiAgICBiZWZvcmU6IGZ1bmN0aW9uIGJlZm9yZSAoKSB7XG4gICAgICBpZiAodm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0cnVlIC8qIGlzUmVuZGVyV2F0Y2hlciAqLyk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuXG4gIC8vIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UsIGNhbGwgbW91bnRlZCBvbiBzZWxmXG4gIC8vIG1vdW50ZWQgaXMgY2FsbGVkIGZvciByZW5kZXItY3JlYXRlZCBjaGlsZCBjb21wb25lbnRzIGluIGl0cyBpbnNlcnRlZCBob29rXG4gIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkge1xuICAgIHZtLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgIGNhbGxIb29rKHZtLCAnbW91bnRlZCcpO1xuICB9XG4gIHJldHVybiB2bVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZENvbXBvbmVudCAoXG4gIHZtLFxuICBwcm9wc0RhdGEsXG4gIGxpc3RlbmVycyxcbiAgcGFyZW50Vm5vZGUsXG4gIHJlbmRlckNoaWxkcmVuXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgY29tcG9uZW50IGhhcyBzbG90IGNoaWxkcmVuXG4gIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgb3ZlcndyaXRpbmcgJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuLlxuXG4gIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBkeW5hbWljIHNjb3BlZFNsb3RzIChoYW5kLXdyaXR0ZW4gb3IgY29tcGlsZWQgYnV0IHdpdGhcbiAgLy8gZHluYW1pYyBzbG90IG5hbWVzKS4gU3RhdGljIHNjb3BlZCBzbG90cyBjb21waWxlZCBmcm9tIHRlbXBsYXRlIGhhcyB0aGVcbiAgLy8gXCIkc3RhYmxlXCIgbWFya2VyLlxuICB2YXIgbmV3U2NvcGVkU2xvdHMgPSBwYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzO1xuICB2YXIgb2xkU2NvcGVkU2xvdHMgPSB2bS4kc2NvcGVkU2xvdHM7XG4gIHZhciBoYXNEeW5hbWljU2NvcGVkU2xvdCA9ICEhKFxuICAgIChuZXdTY29wZWRTbG90cyAmJiAhbmV3U2NvcGVkU2xvdHMuJHN0YWJsZSkgfHxcbiAgICAob2xkU2NvcGVkU2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmICFvbGRTY29wZWRTbG90cy4kc3RhYmxlKSB8fFxuICAgIChuZXdTY29wZWRTbG90cyAmJiB2bS4kc2NvcGVkU2xvdHMuJGtleSAhPT0gbmV3U2NvcGVkU2xvdHMuJGtleSlcbiAgKTtcblxuICAvLyBBbnkgc3RhdGljIHNsb3QgY2hpbGRyZW4gZnJvbSB0aGUgcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHBhcmVudCdzXG4gIC8vIHVwZGF0ZS4gRHluYW1pYyBzY29wZWQgc2xvdHMgbWF5IGFsc28gaGF2ZSBjaGFuZ2VkLiBJbiBzdWNoIGNhc2VzLCBhIGZvcmNlZFxuICAvLyB1cGRhdGUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0bmVzcy5cbiAgdmFyIG5lZWRzRm9yY2VVcGRhdGUgPSAhIShcbiAgICByZW5kZXJDaGlsZHJlbiB8fCAgICAgICAgICAgICAgIC8vIGhhcyBuZXcgc3RhdGljIHNsb3RzXG4gICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90c1xuICAgIGhhc0R5bmFtaWNTY29wZWRTbG90XG4gICk7XG5cbiAgdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG4gIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyXG5cbiAgaWYgKHZtLl92bm9kZSkgeyAvLyB1cGRhdGUgY2hpbGQgdHJlZSdzIHBhcmVudFxuICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTtcbiAgfVxuICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gPSByZW5kZXJDaGlsZHJlbjtcblxuICAvLyB1cGRhdGUgJGF0dHJzIGFuZCAkbGlzdGVuZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IHBhcmVudFZub2RlLmRhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZtLiRsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG5cbiAgLy8gdXBkYXRlIHByb3BzXG4gIGlmIChwcm9wc0RhdGEgJiYgdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpO1xuICAgIHZhciBwcm9wcyA9IHZtLl9wcm9wcztcbiAgICB2YXIgcHJvcEtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHByb3BLZXlzW2ldO1xuICAgICAgdmFyIHByb3BPcHRpb25zID0gdm0uJG9wdGlvbnMucHJvcHM7IC8vIHd0ZiBmbG93P1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICB9XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGFcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgPSBwcm9wc0RhdGE7XG4gIH1cblxuICAvLyB1cGRhdGUgbGlzdGVuZXJzXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycyB8fCBlbXB0eU9iamVjdDtcbiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzLCBvbGRMaXN0ZW5lcnMpO1xuXG4gIC8vIHJlc29sdmUgc2xvdHMgKyBmb3JjZSB1cGRhdGUgaWYgaGFzIGNoaWxkcmVuXG4gIGlmIChuZWVkc0ZvcmNlVXBkYXRlKSB7XG4gICAgdm0uJHNsb3RzID0gcmVzb2x2ZVNsb3RzKHJlbmRlckNoaWxkcmVuLCBwYXJlbnRWbm9kZS5jb250ZXh0KTtcbiAgICB2bS4kZm9yY2VVcGRhdGUoKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHtcbiAgd2hpbGUgKHZtICYmICh2bSA9IHZtLiRwYXJlbnQpKSB7XG4gICAgaWYgKHZtLl9pbmFjdGl2ZSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHZtLl9kaXJlY3RJbmFjdGl2ZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2bS5faW5hY3RpdmUgfHwgdm0uX2luYWN0aXZlID09PSBudWxsKSB7XG4gICAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cbiAgaWYgKCF2bS5faW5hY3RpdmUpIHtcbiAgICB2bS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdkZWFjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rICh2bSwgaG9vaykge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gIHZhciBpbmZvID0gaG9vayArIFwiIGhvb2tcIjtcbiAgaWYgKGhhbmRsZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGhhbmRsZXJzW2ldLCB2bSwgbnVsbCwgdm0sIGluZm8pO1xuICAgIH1cbiAgfVxuICBpZiAodm0uX2hhc0hvb2tFdmVudCkge1xuICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rKTtcbiAgfVxuICBwb3BUYXJnZXQoKTtcbn1cblxuLyogICovXG5cbnZhciBNQVhfVVBEQVRFX0NPVU5UID0gMTAwO1xuXG52YXIgcXVldWUgPSBbXTtcbnZhciBhY3RpdmF0ZWRDaGlsZHJlbiA9IFtdO1xudmFyIGhhcyA9IHt9O1xudmFyIGNpcmN1bGFyID0ge307XG52YXIgd2FpdGluZyA9IGZhbHNlO1xudmFyIGZsdXNoaW5nID0gZmFsc2U7XG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTY2hlZHVsZXJTdGF0ZSAoKSB7XG4gIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgaGFzID0ge307XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2lyY3VsYXIgPSB7fTtcbiAgfVxuICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gQXN5bmMgZWRnZSBjYXNlICM2NTY2IHJlcXVpcmVzIHNhdmluZyB0aGUgdGltZXN0YW1wIHdoZW4gZXZlbnQgbGlzdGVuZXJzIGFyZVxuLy8gYXR0YWNoZWQuIEhvd2V2ZXIsIGNhbGxpbmcgcGVyZm9ybWFuY2Uubm93KCkgaGFzIGEgcGVyZiBvdmVyaGVhZCBlc3BlY2lhbGx5XG4vLyBpZiB0aGUgcGFnZSBoYXMgdGhvdXNhbmRzIG9mIGV2ZW50IGxpc3RlbmVycy4gSW5zdGVhZCwgd2UgdGFrZSBhIHRpbWVzdGFtcFxuLy8gZXZlcnkgdGltZSB0aGUgc2NoZWR1bGVyIGZsdXNoZXMgYW5kIHVzZSB0aGF0IGZvciBhbGwgZXZlbnQgbGlzdGVuZXJzXG4vLyBhdHRhY2hlZCBkdXJpbmcgdGhhdCBmbHVzaC5cbnZhciBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSAwO1xuXG4vLyBBc3luYyBlZGdlIGNhc2UgZml4IHJlcXVpcmVzIHN0b3JpbmcgYW4gZXZlbnQgbGlzdGVuZXIncyBhdHRhY2ggdGltZXN0YW1wLlxudmFyIGdldE5vdyA9IERhdGUubm93O1xuXG4vLyBEZXRlcm1pbmUgd2hhdCBldmVudCB0aW1lc3RhbXAgdGhlIGJyb3dzZXIgaXMgdXNpbmcuIEFubm95aW5nbHksIHRoZVxuLy8gdGltZXN0YW1wIGNhbiBlaXRoZXIgYmUgaGktcmVzIChyZWxhdGl2ZSB0byBwYWdlIGxvYWQpIG9yIGxvdy1yZXNcbi8vIChyZWxhdGl2ZSB0byBVTklYIGVwb2NoKSwgc28gaW4gb3JkZXIgdG8gY29tcGFyZSB0aW1lIHdlIGhhdmUgdG8gdXNlIHRoZVxuLy8gc2FtZSB0aW1lc3RhbXAgdHlwZSB3aGVuIHNhdmluZyB0aGUgZmx1c2ggdGltZXN0YW1wLlxuLy8gQWxsIElFIHZlcnNpb25zIHVzZSBsb3ctcmVzIGV2ZW50IHRpbWVzdGFtcHMsIGFuZCBoYXZlIHByb2JsZW1hdGljIGNsb2NrXG4vLyBpbXBsZW1lbnRhdGlvbnMgKCM5NjMyKVxuaWYgKGluQnJvd3NlciAmJiAhaXNJRSkge1xuICB2YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIGlmIChcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbicgJiZcbiAgICBnZXROb3coKSA+IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpLnRpbWVTdGFtcFxuICApIHtcbiAgICAvLyBpZiB0aGUgZXZlbnQgdGltZXN0YW1wLCBhbHRob3VnaCBldmFsdWF0ZWQgQUZURVIgdGhlIERhdGUubm93KCksIGlzXG4gICAgLy8gc21hbGxlciB0aGFuIGl0LCBpdCBtZWFucyB0aGUgZXZlbnQgaXMgdXNpbmcgYSBoaS1yZXMgdGltZXN0YW1wLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHVzZSB0aGUgaGktcmVzIHZlcnNpb24gZm9yIGV2ZW50IGxpc3RlbmVyIHRpbWVzdGFtcHMgYXNcbiAgICAvLyB3ZWxsLlxuICAgIGdldE5vdyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOyB9O1xuICB9XG59XG5cbi8qKlxuICogRmx1c2ggYm90aCBxdWV1ZXMgYW5kIHJ1biB0aGUgd2F0Y2hlcnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoU2NoZWR1bGVyUXVldWUgKCkge1xuICBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSBnZXROb3coKTtcbiAgZmx1c2hpbmcgPSB0cnVlO1xuICB2YXIgd2F0Y2hlciwgaWQ7XG5cbiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0OlxuICAvLyAxLiBDb21wb25lbnRzIGFyZSB1cGRhdGVkIGZyb20gcGFyZW50IHRvIGNoaWxkLiAoYmVjYXVzZSBwYXJlbnQgaXMgYWx3YXlzXG4gIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZClcbiAgLy8gMi4gQSBjb21wb25lbnQncyB1c2VyIHdhdGNoZXJzIGFyZSBydW4gYmVmb3JlIGl0cyByZW5kZXIgd2F0Y2hlciAoYmVjYXVzZVxuICAvLyAgICB1c2VyIHdhdGNoZXJzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgcmVuZGVyIHdhdGNoZXIpXG4gIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sXG4gIC8vICAgIGl0cyB3YXRjaGVycyBjYW4gYmUgc2tpcHBlZC5cbiAgcXVldWUuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuXG4gIC8vIGRvIG5vdCBjYWNoZSBsZW5ndGggYmVjYXVzZSBtb3JlIHdhdGNoZXJzIG1pZ2h0IGJlIHB1c2hlZFxuICAvLyBhcyB3ZSBydW4gZXhpc3Rpbmcgd2F0Y2hlcnNcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgd2F0Y2hlciA9IHF1ZXVlW2luZGV4XTtcbiAgICBpZiAod2F0Y2hlci5iZWZvcmUpIHtcbiAgICAgIHdhdGNoZXIuYmVmb3JlKCk7XG4gICAgfVxuICAgIGlkID0gd2F0Y2hlci5pZDtcbiAgICBoYXNbaWRdID0gbnVsbDtcbiAgICB3YXRjaGVyLnJ1bigpO1xuICAgIC8vIGluIGRldiBidWlsZCwgY2hlY2sgYW5kIHN0b3AgY2lyY3VsYXIgdXBkYXRlcy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHtcbiAgICAgIGNpcmN1bGFyW2lkXSA9IChjaXJjdWxhcltpZF0gfHwgMCkgKyAxO1xuICAgICAgaWYgKGNpcmN1bGFyW2lkXSA+IE1BWF9VUERBVEVfQ09VTlQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IG1heSBoYXZlIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wICcgKyAoXG4gICAgICAgICAgICB3YXRjaGVyLnVzZXJcbiAgICAgICAgICAgICAgPyAoXCJpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiBcXFwiXCIgKyAod2F0Y2hlci5leHByZXNzaW9uKSArIFwiXFxcIlwiKVxuICAgICAgICAgICAgICA6IFwiaW4gYSBjb21wb25lbnQgcmVuZGVyIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YXRjaGVyLnZtXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8ga2VlcCBjb3BpZXMgb2YgcG9zdCBxdWV1ZXMgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZVxuICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpO1xuICB2YXIgdXBkYXRlZFF1ZXVlID0gcXVldWUuc2xpY2UoKTtcblxuICByZXNldFNjaGVkdWxlclN0YXRlKCk7XG5cbiAgLy8gY2FsbCBjb21wb25lbnQgdXBkYXRlZCBhbmQgYWN0aXZhdGVkIGhvb2tzXG4gIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7XG4gIGNhbGxVcGRhdGVkSG9va3ModXBkYXRlZFF1ZXVlKTtcblxuICAvLyBkZXZ0b29sIGhvb2tcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChkZXZ0b29scyAmJiBjb25maWcuZGV2dG9vbHMpIHtcbiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxVcGRhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIHZhciBpID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIHdhdGNoZXIgPSBxdWV1ZVtpXTtcbiAgICB2YXIgdm0gPSB3YXRjaGVyLnZtO1xuICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkICYmICF2bS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC5cbiAqIFRoZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgZW50aXJlIHRyZWUgaGFzIGJlZW4gcGF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7XG4gIC8vIHNldHRpbmcgX2luYWN0aXZlIHRvIGZhbHNlIGhlcmUgc28gdGhhdCBhIHJlbmRlciBmdW5jdGlvbiBjYW5cbiAgLy8gcmVseSBvbiBjaGVja2luZyB3aGV0aGVyIGl0J3MgaW4gYW4gaW5hY3RpdmUgdHJlZSAoZS5nLiByb3V0ZXItdmlldylcbiAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gIGFjdGl2YXRlZENoaWxkcmVuLnB1c2godm0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQWN0aXZhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQocXVldWVbaV0sIHRydWUgLyogdHJ1ZSAqLyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLlxuICogSm9icyB3aXRoIGR1cGxpY2F0ZSBJRHMgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBpdCdzXG4gKiBwdXNoZWQgd2hlbiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVXYXRjaGVyICh3YXRjaGVyKSB7XG4gIHZhciBpZCA9IHdhdGNoZXIuaWQ7XG4gIGlmIChoYXNbaWRdID09IG51bGwpIHtcbiAgICBoYXNbaWRdID0gdHJ1ZTtcbiAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBhbHJlYWR5IGZsdXNoaW5nLCBzcGxpY2UgdGhlIHdhdGNoZXIgYmFzZWQgb24gaXRzIGlkXG4gICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LlxuICAgICAgdmFyIGkgPSBxdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkgPiBpbmRleCAmJiBxdWV1ZVtpXS5pZCA+IHdhdGNoZXIuaWQpIHtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB3YXRjaGVyKTtcbiAgICB9XG4gICAgLy8gcXVldWUgdGhlIGZsdXNoXG4gICAgaWYgKCF3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbmZpZy5hc3luYykge1xuICAgICAgICBmbHVzaFNjaGVkdWxlclF1ZXVlKCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5cblxudmFyIHVpZCQyID0gMDtcblxuLyoqXG4gKiBBIHdhdGNoZXIgcGFyc2VzIGFuIGV4cHJlc3Npb24sIGNvbGxlY3RzIGRlcGVuZGVuY2llcyxcbiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlICR3YXRjaCgpIGFwaSBhbmQgZGlyZWN0aXZlcy5cbiAqL1xudmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGNiLFxuICBvcHRpb25zLFxuICBpc1JlbmRlcldhdGNoZXJcbikge1xuICB0aGlzLnZtID0gdm07XG4gIGlmIChpc1JlbmRlcldhdGNoZXIpIHtcbiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7XG4gIH1cbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgICB0aGlzLmJlZm9yZSA9IG9wdGlvbnMuYmVmb3JlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlO1xuICB9XG4gIHRoaXMuY2IgPSBjYjtcbiAgdGhpcy5pZCA9ICsrdWlkJDI7IC8vIHVpZCBmb3IgYmF0Y2hpbmdcbiAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICB0aGlzLmRpcnR5ID0gdGhpcy5sYXp5OyAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXTtcbiAgdGhpcy5uZXdEZXBzID0gW107XG4gIHRoaXMuZGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpO1xuICB0aGlzLmV4cHJlc3Npb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgPyBleHBPckZuLnRvU3RyaW5nKClcbiAgICA6ICcnO1xuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5nZXR0ZXIgPSBleHBPckZuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0dGVyID0gcGFyc2VQYXRoKGV4cE9yRm4pO1xuICAgIGlmICghdGhpcy5nZXR0ZXIpIHtcbiAgICAgIHRoaXMuZ2V0dGVyID0gbm9vcDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXFxcIlwiICsgZXhwT3JGbiArIFwiXFxcIiBcIiArXG4gICAgICAgICdXYXRjaGVyIG9ubHkgYWNjZXB0cyBzaW1wbGUgZG90LWRlbGltaXRlZCBwYXRocy4gJyArXG4gICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KCk7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBnZXR0ZXIsIGFuZCByZS1jb2xsZWN0IGRlcGVuZGVuY2llcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0ICgpIHtcbiAgcHVzaFRhcmdldCh0aGlzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgdm0gPSB0aGlzLnZtO1xuICB0cnkge1xuICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImdldHRlciBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gXCJ0b3VjaFwiIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzXG4gICAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gICAgaWYgKHRoaXMuZGVlcCkge1xuICAgICAgdHJhdmVyc2UodmFsdWUpO1xuICAgIH1cbiAgICBwb3BUYXJnZXQoKTtcbiAgICB0aGlzLmNsZWFudXBEZXBzKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59O1xuXG4vKipcbiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmFkZERlcCA9IGZ1bmN0aW9uIGFkZERlcCAoZGVwKSB7XG4gIHZhciBpZCA9IGRlcC5pZDtcbiAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoaWQpKSB7XG4gICAgdGhpcy5uZXdEZXBJZHMuYWRkKGlkKTtcbiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApO1xuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ2xlYW4gdXAgZm9yIGRlcGVuZGVuY3kgY29sbGVjdGlvbi5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiBjbGVhbnVwRGVwcyAoKSB7XG4gIHZhciBpID0gdGhpcy5kZXBzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBkZXAgPSB0aGlzLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzO1xuICB0aGlzLmRlcElkcyA9IHRoaXMubmV3RGVwSWRzO1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTtcbiAgdG1wID0gdGhpcy5kZXBzO1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHM7XG4gIHRoaXMubmV3RGVwcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBzLmxlbmd0aCA9IDA7XG59O1xuXG4vKipcbiAqIFN1YnNjcmliZXIgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlICgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHRoaXMubGF6eSkge1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAgIHRoaXMucnVuKCk7XG4gIH0gZWxzZSB7XG4gICAgcXVldWVXYXRjaGVyKHRoaXMpO1xuICB9XG59O1xuXG4vKipcbiAqIFNjaGVkdWxlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQuXG4gICAgICBpc09iamVjdCh2YWx1ZSkgfHxcbiAgICAgIHRoaXMuZGVlcFxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHRoaXMudm0sIChcImNhbGxiYWNrIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiBldmFsdWF0ZSAoKSB7XG4gIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIERlcGVuZCBvbiBhbGwgZGVwcyBjb2xsZWN0ZWQgYnkgdGhpcyB3YXRjaGVyLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5kZXBlbmQgPSBmdW5jdGlvbiBkZXBlbmQgKCkge1xuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzLmRlcHNbaV0uZGVwZW5kKCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJzY3JpYmVyIGxpc3QuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHZtJ3Mgd2F0Y2hlciBsaXN0XG4gICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdFxuICAgIC8vIGlmIHRoZSB2bSBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgaWYgKCF0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpO1xuICAgIH1cbiAgICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufTtcblxuLyogICovXG5cbnZhciBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24gPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBub29wLFxuICBzZXQ6IG5vb3Bcbn07XG5cbmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSBmdW5jdGlvbiBwcm94eUdldHRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXNbc291cmNlS2V5XVtrZXldXG4gIH07XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiBwcm94eVNldHRlciAodmFsKSB7XG4gICAgdGhpc1tzb3VyY2VLZXldW2tleV0gPSB2YWw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXTtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucztcbiAgaWYgKG9wdHMucHJvcHMpIHsgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKTsgfVxuICBpZiAob3B0cy5tZXRob2RzKSB7IGluaXRNZXRob2RzKHZtLCBvcHRzLm1ldGhvZHMpOyB9XG4gIGlmIChvcHRzLmRhdGEpIHtcbiAgICBpbml0RGF0YSh2bSk7XG4gIH0gZWxzZSB7XG4gICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xuICB9XG4gIGlmIChvcHRzLmNvbXB1dGVkKSB7IGluaXRDb21wdXRlZCh2bSwgb3B0cy5jb21wdXRlZCk7IH1cbiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHtcbiAgICBpbml0V2F0Y2godm0sIG9wdHMud2F0Y2gpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyAodm0sIHByb3BzT3B0aW9ucykge1xuICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9O1xuICB2YXIgcHJvcHMgPSB2bS5fcHJvcHMgPSB7fTtcbiAgLy8gY2FjaGUgcHJvcCBrZXlzIHNvIHRoYXQgZnV0dXJlIHByb3BzIHVwZGF0ZXMgY2FuIGl0ZXJhdGUgdXNpbmcgQXJyYXlcbiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uXG4gIHZhciBrZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzID0gW107XG4gIHZhciBpc1Jvb3QgPSAhdm0uJHBhcmVudDtcbiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkXG4gIGlmICghaXNSb290KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgfVxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChpc1Jlc2VydmVkQXR0cmlidXRlKGh5cGhlbmF0ZWRLZXkpIHx8XG4gICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsgaHlwaGVuYXRlZEtleSArIFwiXFxcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWZpbmVSZWFjdGl2ZSQkMShwcm9wcywga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzUm9vdCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlIFwiICtcbiAgICAgICAgICAgIFwib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgXCIgK1xuICAgICAgICAgICAgXCJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIixcbiAgICAgICAgICAgIHZtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHByb3BzLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZVxuICAgIC8vIGR1cmluZyBWdWUuZXh0ZW5kKCkuIFdlIG9ubHkgbmVlZCB0byBwcm94eSBwcm9wcyBkZWZpbmVkIGF0XG4gICAgLy8gaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIHByb3h5KHZtLCBcIl9wcm9wc1wiLCBrZXkpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHNPcHRpb25zKSBsb29wKCBrZXkgKTtcbiAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YSAodm0pIHtcbiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhO1xuICBkYXRhID0gdm0uX2RhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZ2V0RGF0YShkYXRhLCB2bSlcbiAgICA6IGRhdGEgfHwge307XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGRhdGEgPSB7fTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3Q6XFxuJyArXG4gICAgICAnaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHMgJiYgaGFzT3duKG1ldGhvZHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJUaGUgZGF0YSBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFwiICtcbiAgICAgICAgXCJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXCIsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgcHJveHkodm0sIFwiX2RhdGFcIiwga2V5KTtcbiAgICB9XG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoZGF0YSwgdm0pIHtcbiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVyc1xuICBwdXNoVGFyZ2V0KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJkYXRhKClcIik7XG4gICAgcmV0dXJuIHt9XG4gIH0gZmluYWxseSB7XG4gICAgcG9wVGFyZ2V0KCk7XG4gIH1cbn1cblxudmFyIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnMgPSB7IGxhenk6IHRydWUgfTtcblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkICh2bSwgY29tcHV0ZWQpIHtcbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gY29tcHV0ZWQgcHJvcGVydGllcyBhcmUganVzdCBnZXR0ZXJzIGR1cmluZyBTU1JcbiAgdmFyIGlzU1NSID0gaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICB2YXIgdXNlckRlZiA9IGNvbXB1dGVkW2tleV07XG4gICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGdldHRlciA9PSBudWxsKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJHZXR0ZXIgaXMgbWlzc2luZyBmb3IgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiLlwiKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1NTUikge1xuICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICAgIHdhdGNoZXJzW2tleV0gPSBuZXcgV2F0Y2hlcihcbiAgICAgICAgdm0sXG4gICAgICAgIGdldHRlciB8fCBub29wLFxuICAgICAgICBub29wLFxuICAgICAgICBjb21wdXRlZFdhdGNoZXJPcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkIChcbiAgdGFyZ2V0LFxuICBrZXksXG4gIHVzZXJEZWZcbikge1xuICB2YXIgc2hvdWxkQ2FjaGUgPSAhaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcbiAgaWYgKHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlXG4gICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmKTtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmLmdldClcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXQgfHwgbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXJJbnZva2VyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdGhpcylcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyB0eXBlIFxcXCJcIiArICh0eXBlb2YgbWV0aG9kc1trZXldKSArIFwiXFxcIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIFwiICtcbiAgICAgICAgICBcIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1ba2V5XSA9IHR5cGVvZiBtZXRob2RzW2tleV0gIT09ICdmdW5jdGlvbicgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGV4cE9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCB2bSwgKFwiY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCQzID0gMDtcblxuZnVuY3Rpb24gaW5pdE1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhIHVpZFxuICAgIHZtLl91aWQgPSB1aWQkMysrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHNcbiAgICBpbml0U3RhdGUodm0pO1xuICAgIGluaXRQcm92aWRlKHZtKTsgLy8gcmVzb2x2ZSBwcm92aWRlIGFmdGVyIGRhdGEvcHJvcHNcbiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7XG4gICAgICB2bS5fbmFtZSA9IGZvcm1hdENvbXBvbmVudE5hbWUodm0sIGZhbHNlKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIHZhciBwYXJlbnRWbm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuICBvcHRzLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlO1xuXG4gIHZhciB2bm9kZUNvbXBvbmVudE9wdGlvbnMgPSBwYXJlbnRWbm9kZS5jb21wb25lbnRPcHRpb25zO1xuICBvcHRzLnByb3BzRGF0YSA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGE7XG4gIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7XG4gIG9wdHMuX3JlbmRlckNoaWxkcmVuID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmNoaWxkcmVuO1xuICBvcHRzLl9jb21wb25lbnRUYWcgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMudGFnO1xuXG4gIGlmIChvcHRpb25zLnJlbmRlcikge1xuICAgIG9wdHMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7XG4gICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZucztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zIChDdG9yKSB7XG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICBpZiAoQ3Rvci5zdXBlcikge1xuICAgIHZhciBzdXBlck9wdGlvbnMgPSByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3Iuc3VwZXIpO1xuICAgIHZhciBjYWNoZWRTdXBlck9wdGlvbnMgPSBDdG9yLnN1cGVyT3B0aW9ucztcbiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHtcbiAgICAgIC8vIHN1cGVyIG9wdGlvbiBjaGFuZ2VkLFxuICAgICAgLy8gbmVlZCB0byByZXNvbHZlIG5ldyBvcHRpb25zLlxuICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGxhdGUtbW9kaWZpZWQvYXR0YWNoZWQgb3B0aW9ucyAoIzQ5NzYpXG4gICAgICB2YXIgbW9kaWZpZWRPcHRpb25zID0gcmVzb2x2ZU1vZGlmaWVkT3B0aW9ucyhDdG9yKTtcbiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zXG4gICAgICBpZiAobW9kaWZpZWRPcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZChDdG9yLmV4dGVuZE9wdGlvbnMsIG1vZGlmaWVkT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBvcHRpb25zID0gQ3Rvci5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHN1cGVyT3B0aW9ucywgQ3Rvci5leHRlbmRPcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTW9kaWZpZWRPcHRpb25zIChDdG9yKSB7XG4gIHZhciBtb2RpZmllZDtcbiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9ucztcbiAgZm9yICh2YXIga2V5IGluIGxhdGVzdCkge1xuICAgIGlmIChsYXRlc3Rba2V5XSAhPT0gc2VhbGVkW2tleV0pIHtcbiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfVxuICAgICAgbW9kaWZpZWRba2V5XSA9IGxhdGVzdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWRcbn1cblxuZnVuY3Rpb24gVnVlIChvcHRpb25zKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlKVxuICApIHtcbiAgICB3YXJuKCdWdWUgaXMgYSBjb25zdHJ1Y3RvciBhbmQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkJyk7XG4gIH1cbiAgdGhpcy5faW5pdChvcHRpb25zKTtcbn1cblxuaW5pdE1peGluKFZ1ZSk7XG5zdGF0ZU1peGluKFZ1ZSk7XG5ldmVudHNNaXhpbihWdWUpO1xubGlmZWN5Y2xlTWl4aW4oVnVlKTtcbnJlbmRlck1peGluKFZ1ZSk7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0VXNlIChWdWUpIHtcbiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgaW5zdGFsbGVkUGx1Z2lucyA9ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zIHx8ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zID0gW10pKTtcbiAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPiAtMSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmluc3RhbGwuYXBwbHkocGx1Z2luLCBhcmdzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHtcbiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHtcbiAgLyoqXG4gICAqIEVhY2ggaW5zdGFuY2UgY29uc3RydWN0b3IsIGluY2x1ZGluZyBWdWUsIGhhcyBhIHVuaXF1ZVxuICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCBcImNoaWxkXG4gICAqIGNvbnN0cnVjdG9yc1wiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLlxuICAgKi9cbiAgVnVlLmNpZCA9IDA7XG4gIHZhciBjaWQgPSAxO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgVnVlLmV4dGVuZCA9IGZ1bmN0aW9uIChleHRlbmRPcHRpb25zKSB7XG4gICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307XG4gICAgdmFyIFN1cGVyID0gdGhpcztcbiAgICB2YXIgU3VwZXJJZCA9IFN1cGVyLmNpZDtcbiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pO1xuICAgIGlmIChjYWNoZWRDdG9yc1tTdXBlcklkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZEN0b3JzW1N1cGVySWRdXG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIG5hbWUpIHtcbiAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG4gICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTtcbiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgIFN1Yi5jaWQgPSBjaWQrKztcbiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIFN1cGVyLm9wdGlvbnMsXG4gICAgICBleHRlbmRPcHRpb25zXG4gICAgKTtcbiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjtcblxuICAgIC8vIEZvciBwcm9wcyBhbmQgY29tcHV0ZWQgcHJvcGVydGllcywgd2UgZGVmaW5lIHRoZSBwcm94eSBnZXR0ZXJzIG9uXG4gICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXNcbiAgICAvLyBhdm9pZHMgT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxzIGZvciBlYWNoIGluc3RhbmNlIGNyZWF0ZWQuXG4gICAgaWYgKFN1Yi5vcHRpb25zLnByb3BzKSB7XG4gICAgICBpbml0UHJvcHMkMShTdWIpO1xuICAgIH1cbiAgICBpZiAoU3ViLm9wdGlvbnMuY29tcHV0ZWQpIHtcbiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlXG4gICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcbiAgICBTdWIubWl4aW4gPSBTdXBlci5taXhpbjtcbiAgICBTdWIudXNlID0gU3VwZXIudXNlO1xuXG4gICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlc1xuICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby5cbiAgICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBTdWJbdHlwZV0gPSBTdXBlclt0eXBlXTtcbiAgICB9KTtcbiAgICAvLyBlbmFibGUgcmVjdXJzaXZlIHNlbGYtbG9va3VwXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS5cbiAgICAvLyBsYXRlciBhdCBpbnN0YW50aWF0aW9uIHdlIGNhbiBjaGVjayBpZiBTdXBlcidzIG9wdGlvbnMgaGF2ZVxuICAgIC8vIGJlZW4gdXBkYXRlZC5cbiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9ucztcbiAgICBTdWIuZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnM7XG4gICAgU3ViLnNlYWxlZE9wdGlvbnMgPSBleHRlbmQoe30sIFN1Yi5vcHRpb25zKTtcblxuICAgIC8vIGNhY2hlIGNvbnN0cnVjdG9yXG4gICAgY2FjaGVkQ3RvcnNbU3VwZXJJZF0gPSBTdWI7XG4gICAgcmV0dXJuIFN1YlxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMkMSAoQ29tcCkge1xuICB2YXIgcHJvcHMgPSBDb21wLm9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHByb3h5KENvbXAucHJvdG90eXBlLCBcIl9wcm9wc1wiLCBrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCQxIChDb21wKSB7XG4gIHZhciBjb21wdXRlZCA9IENvbXAub3B0aW9ucy5jb21wdXRlZDtcbiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgZGVmaW5lQ29tcHV0ZWQoQ29tcC5wcm90b3R5cGUsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKFxuICAgICAgaWQsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50Jykge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qICAqL1xuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSAob3B0cykge1xuICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZylcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KCcsJykuaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHtcbiAgdmFyIGNhY2hlID0ga2VlcEFsaXZlSW5zdGFuY2UuY2FjaGU7XG4gIHZhciBrZXlzID0ga2VlcEFsaXZlSW5zdGFuY2Uua2V5cztcbiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTtcbiAgZm9yICh2YXIga2V5IGluIGNhY2hlKSB7XG4gICAgdmFyIGNhY2hlZE5vZGUgPSBjYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWROb2RlKSB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY2FjaGVkTm9kZS5jb21wb25lbnRPcHRpb25zKTtcbiAgICAgIGlmIChuYW1lICYmICFmaWx0ZXIobmFtZSkpIHtcbiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoXG4gIGNhY2hlLFxuICBrZXksXG4gIGtleXMsXG4gIGN1cnJlbnRcbikge1xuICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCQkMSAmJiAoIWN1cnJlbnQgfHwgY2FjaGVkJCQxLnRhZyAhPT0gY3VycmVudC50YWcpKSB7XG4gICAgY2FjaGVkJCQxLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbiAgY2FjaGVba2V5XSA9IG51bGw7XG4gIHJlbW92ZShrZXlzLCBrZXkpO1xufVxuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbnZhciBLZWVwQWxpdmUgPSB7XG4gIG5hbWU6ICdrZWVwLWFsaXZlJyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgZXhjbHVkZTogcGF0dGVyblR5cGVzLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICB9LFxuXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkICgpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgcHJ1bmVDYWNoZUVudHJ5KHRoaXMuY2FjaGUsIGtleSwgdGhpcy5rZXlzKTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLiR3YXRjaCgnaW5jbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgICB0aGlzLiR3YXRjaCgnZXhjbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gIW1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkge1xuICAgIHZhciBzbG90ID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICB2YXIgdm5vZGUgPSBnZXRGaXJzdENvbXBvbmVudENoaWxkKHNsb3QpO1xuICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICBpZiAoY29tcG9uZW50T3B0aW9ucykge1xuICAgICAgLy8gY2hlY2sgcGF0dGVyblxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpO1xuICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICB2YXIgaW5jbHVkZSA9IHJlZi5pbmNsdWRlO1xuICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gbm90IGluY2x1ZGVkXG4gICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8XG4gICAgICAgIC8vIGV4Y2x1ZGVkXG4gICAgICAgIChleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdm5vZGVcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiQxID0gdGhpcztcbiAgICAgIHZhciBjYWNoZSA9IHJlZiQxLmNhY2hlO1xuICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzO1xuICAgICAgdmFyIGtleSA9IHZub2RlLmtleSA9PSBudWxsXG4gICAgICAgIC8vIHNhbWUgY29uc3RydWN0b3IgbWF5IGdldCByZWdpc3RlcmVkIGFzIGRpZmZlcmVudCBsb2NhbCBjb21wb25lbnRzXG4gICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSlcbiAgICAgICAgPyBjb21wb25lbnRPcHRpb25zLkN0b3IuY2lkICsgKGNvbXBvbmVudE9wdGlvbnMudGFnID8gKFwiOjpcIiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpXG4gICAgICAgIDogdm5vZGUua2V5O1xuICAgICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAvLyBtYWtlIGN1cnJlbnQga2V5IGZyZXNoZXN0XG4gICAgICAgIHJlbW92ZShrZXlzLCBrZXkpO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlW2tleV0gPSB2bm9kZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIC8vIHBydW5lIG9sZGVzdCBlbnRyeVxuICAgICAgICBpZiAodGhpcy5tYXggJiYga2V5cy5sZW5ndGggPiBwYXJzZUludCh0aGlzLm1heCkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2bm9kZS5kYXRhLmtlZXBBbGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKVxuICB9XG59O1xuXG52YXIgYnVpbHRJbkNvbXBvbmVudHMgPSB7XG4gIEtlZXBBbGl2ZTogS2VlcEFsaXZlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7XG4gIC8vIGNvbmZpZ1xuICB2YXIgY29uZmlnRGVmID0ge307XG4gIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgcmVwbGFjZSB0aGUgVnVlLmNvbmZpZyBvYmplY3QsIHNldCBpbmRpdmlkdWFsIGZpZWxkcyBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTtcblxuICAvLyBleHBvc2VkIHV0aWwgbWV0aG9kcy5cbiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uXG4gIC8vIHRoZW0gdW5sZXNzIHlvdSBhcmUgYXdhcmUgb2YgdGhlIHJpc2suXG4gIFZ1ZS51dGlsID0ge1xuICAgIHdhcm46IHdhcm4sXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgbWVyZ2VPcHRpb25zOiBtZXJnZU9wdGlvbnMsXG4gICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlJCQxXG4gIH07XG5cbiAgVnVlLnNldCA9IHNldDtcbiAgVnVlLmRlbGV0ZSA9IGRlbDtcbiAgVnVlLm5leHRUaWNrID0gbmV4dFRpY2s7XG5cbiAgLy8gMi42IGV4cGxpY2l0IG9ic2VydmFibGUgQVBJXG4gIFZ1ZS5vYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIG9ic2VydmUob2JqKTtcbiAgICByZXR1cm4gb2JqXG4gIH07XG5cbiAgVnVlLm9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9KTtcblxuICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFwiYmFzZVwiIGNvbnN0cnVjdG9yIHRvIGV4dGVuZCBhbGwgcGxhaW4tb2JqZWN0XG4gIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLlxuICBWdWUub3B0aW9ucy5fYmFzZSA9IFZ1ZTtcblxuICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpO1xuXG4gIGluaXRVc2UoVnVlKTtcbiAgaW5pdE1peGluJDEoVnVlKTtcbiAgaW5pdEV4dGVuZChWdWUpO1xuICBpbml0QXNzZXRSZWdpc3RlcnMoVnVlKTtcbn1cblxuaW5pdEdsb2JhbEFQSShWdWUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRpc1NlcnZlcicsIHtcbiAgZ2V0OiBpc1NlcnZlclJlbmRlcmluZ1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHNzckNvbnRleHQnLCB7XG4gIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0XG4gIH1cbn0pO1xuXG4vLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb25cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCcsIHtcbiAgdmFsdWU6IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0XG59KTtcblxuVnVlLnZlcnNpb24gPSAnMi42LjEwJztcblxuLyogICovXG5cbi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheVxuLy8gZHVyaW5nIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG52YXIgaXNSZXNlcnZlZEF0dHIgPSBtYWtlTWFwKCdzdHlsZSxjbGFzcycpO1xuXG4vLyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHVzaW5nIHByb3BzIGZvciBiaW5kaW5nXG52YXIgYWNjZXB0VmFsdWUgPSBtYWtlTWFwKCdpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzJyk7XG52YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7XG4gIHJldHVybiAoXG4gICAgKGF0dHIgPT09ICd2YWx1ZScgJiYgYWNjZXB0VmFsdWUodGFnKSkgJiYgdHlwZSAhPT0gJ2J1dHRvbicgfHxcbiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fFxuICAgIChhdHRyID09PSAnY2hlY2tlZCcgJiYgdGFnID09PSAnaW5wdXQnKSB8fFxuICAgIChhdHRyID09PSAnbXV0ZWQnICYmIHRhZyA9PT0gJ3ZpZGVvJylcbiAgKVxufTtcblxudmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTtcblxudmFyIGlzVmFsaWRDb250ZW50RWRpdGFibGVWYWx1ZSA9IG1ha2VNYXAoJ2V2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHknKTtcblxudmFyIGNvbnZlcnRFbnVtZXJhdGVkVmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZSdcbiAgICA/ICdmYWxzZSdcbiAgICAvLyBhbGxvdyBhcmJpdHJhcnkgc3RyaW5nIHZhbHVlIGZvciBjb250ZW50ZWRpdGFibGVcbiAgICA6IGtleSA9PT0gJ2NvbnRlbnRlZGl0YWJsZScgJiYgaXNWYWxpZENvbnRlbnRFZGl0YWJsZVZhbHVlKHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiAndHJ1ZSdcbn07XG5cbnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcChcbiAgJ2FsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsJyArXG4gICdkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsJyArXG4gICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgK1xuICAnbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSwnICtcbiAgJ3JlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsJyArXG4gICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJ1xuKTtcblxudmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7XG5cbnZhciBpc1hsaW5rID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJ1xufTtcblxudmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBpc1hsaW5rKG5hbWUpID8gbmFtZS5zbGljZSg2LCBuYW1lLmxlbmd0aCkgOiAnJ1xufTtcblxudmFyIGlzRmFsc3lBdHRyVmFsdWUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2VuQ2xhc3NGb3JWbm9kZSAodm5vZGUpIHtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlO1xuICB2YXIgY2hpbGROb2RlID0gdm5vZGU7XG4gIHdoaWxlIChpc0RlZihjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtcbiAgICBpZiAoY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhKSB7XG4gICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoY2hpbGROb2RlLmRhdGEsIGRhdGEpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoaXNEZWYocGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50KSkge1xuICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkge1xuICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGRhdGEsIHBhcmVudE5vZGUuZGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW5kZXJDbGFzcyhkYXRhLnN0YXRpY0NsYXNzLCBkYXRhLmNsYXNzKVxufVxuXG5mdW5jdGlvbiBtZXJnZUNsYXNzRGF0YSAoY2hpbGQsIHBhcmVudCkge1xuICByZXR1cm4ge1xuICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksXG4gICAgY2xhc3M6IGlzRGVmKGNoaWxkLmNsYXNzKVxuICAgICAgPyBbY2hpbGQuY2xhc3MsIHBhcmVudC5jbGFzc11cbiAgICAgIDogcGFyZW50LmNsYXNzXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2xhc3MgKFxuICBzdGF0aWNDbGFzcyxcbiAgZHluYW1pY0NsYXNzXG4pIHtcbiAgaWYgKGlzRGVmKHN0YXRpY0NsYXNzKSB8fCBpc0RlZihkeW5hbWljQ2xhc3MpKSB7XG4gICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBhID8gYiA/IChhICsgJyAnICsgYikgOiBhIDogKGIgfHwgJycpXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNsYXNzICh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpXG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgdmFyIHN0cmluZ2lmaWVkO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChpc0RlZihzdHJpbmdpZmllZCA9IHN0cmluZ2lmeUNsYXNzKHZhbHVlW2ldKSkgJiYgc3RyaW5naWZpZWQgIT09ICcnKSB7XG4gICAgICBpZiAocmVzKSB7IHJlcyArPSAnICc7IH1cbiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlW2tleV0pIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIG5hbWVzcGFjZU1hcCA9IHtcbiAgc3ZnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCdcbn07XG5cbnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKFxuICAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsJyArXG4gICdhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sJyArXG4gICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICtcbiAgJ2EsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSwnICtcbiAgJ3Msc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLCcgK1xuICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArXG4gICdjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0ciwnICtcbiAgJ2J1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sJyArXG4gICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgK1xuICAnZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LCcgK1xuICAnY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCdcbik7XG5cbi8vIHRoaXMgbWFwIGlzIGludGVudGlvbmFsbHkgc2VsZWN0aXZlLCBvbmx5IGNvdmVyaW5nIFNWRyBlbGVtZW50cyB0aGF0IG1heVxuLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy5cbnZhciBpc1NWRyA9IG1ha2VNYXAoXG4gICdzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsJyArXG4gICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICtcbiAgJ3BvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXcnLFxuICB0cnVlXG4pO1xuXG52YXIgaXNSZXNlcnZlZFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgcmV0dXJuIGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHKHRhZylcbn07XG5cbmZ1bmN0aW9uIGdldFRhZ05hbWVzcGFjZSAodGFnKSB7XG4gIGlmIChpc1NWRyh0YWcpKSB7XG4gICAgcmV0dXJuICdzdmcnXG4gIH1cbiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MXG4gIC8vIG5vdGUgaXQgZG9lc24ndCBzdXBwb3J0IG90aGVyIE1hdGhNTCBlbGVtZW50cyBiZWluZyBjb21wb25lbnQgcm9vdHNcbiAgaWYgKHRhZyA9PT0gJ21hdGgnKSB7XG4gICAgcmV0dXJuICdtYXRoJ1xuICB9XG59XG5cbnZhciB1bmtub3duRWxlbWVudENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQgKHRhZykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFpbkJyb3dzZXIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChpc1Jlc2VydmVkVGFnKHRhZykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB0YWcgPSB0YWcudG9Mb3dlckNhc2UoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkge1xuICAgIHJldHVybiB1bmtub3duRWxlbWVudENhY2hlW3RhZ11cbiAgfVxuICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGlmICh0YWcuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yODIxMDM2NC8xMDcwMjQ0XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoXG4gICAgICBlbC5jb25zdHJ1Y3RvciA9PT0gd2luZG93LkhUTUxVbmtub3duRWxlbWVudCB8fFxuICAgICAgZWwuY29uc3RydWN0b3IgPT09IHdpbmRvdy5IVE1MRWxlbWVudFxuICAgICkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAvSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KGVsLnRvU3RyaW5nKCkpKVxuICB9XG59XG5cbnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpO1xuXG4vKiAgKi9cblxuLyoqXG4gKiBRdWVyeSBhbiBlbGVtZW50IHNlbGVjdG9yIGlmIGl0J3Mgbm90IGFuIGVsZW1lbnQgYWxyZWFkeS5cbiAqL1xuZnVuY3Rpb24gcXVlcnkgKGVsKSB7XG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnQ2Fubm90IGZpbmQgZWxlbWVudDogJyArIGVsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbFxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50JDEgKHRhZ05hbWUsIHZub2RlKSB7XG4gIHZhciBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICByZXR1cm4gZWxtXG4gIH1cbiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3RcbiAgaWYgKHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS5hdHRycyAmJiB2bm9kZS5kYXRhLmF0dHJzLm11bHRpcGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbG0uc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICB9XG4gIHJldHVybiBlbG1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TIChuYW1lc3BhY2UsIHRhZ05hbWUpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSwgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dClcbn1cblxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlIChwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkge1xuICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS5wYXJlbnROb2RlXG59XG5cbmZ1bmN0aW9uIG5leHRTaWJsaW5nIChub2RlKSB7XG4gIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG59XG5cbmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZVxufVxuXG5mdW5jdGlvbiBzZXRUZXh0Q29udGVudCAobm9kZSwgdGV4dCkge1xuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVTY29wZSAobm9kZSwgc2NvcGVJZCkge1xuICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7XG59XG5cbnZhciBub2RlT3BzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50JDEsXG4gIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICBjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG4gIGNyZWF0ZUNvbW1lbnQ6IGNyZWF0ZUNvbW1lbnQsXG4gIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gIGFwcGVuZENoaWxkOiBhcHBlbmRDaGlsZCxcbiAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuICB0YWdOYW1lOiB0YWdOYW1lLFxuICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gIHNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7XG4gIHZhciBrZXkgPSB2bm9kZS5kYXRhLnJlZjtcbiAgaWYgKCFpc0RlZihrZXkpKSB7IHJldHVybiB9XG5cbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgdmFyIHJlZiA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmVsbTtcbiAgdmFyIHJlZnMgPSB2bS4kcmVmcztcbiAgaWYgKGlzUmVtb3ZhbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7XG4gICAgfSBlbHNlIGlmIChyZWZzW2tleV0gPT09IHJlZikge1xuICAgICAgcmVmc1trZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodm5vZGUuZGF0YS5yZWZJbkZvcikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgICAgcmVmc1trZXldID0gW3JlZl07XG4gICAgICB9IGVsc2UgaWYgKHJlZnNba2V5XS5pbmRleE9mKHJlZikgPCAwKSB7XG4gICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgICAgICByZWZzW2tleV0ucHVzaChyZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWZzW2tleV0gPSByZWY7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmlydHVhbCBET00gcGF0Y2hpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIFNuYWJiZG9tIGJ5XG4gKiBTaW1vbiBGcmlpcyBWaW5kdW0gKEBwYWxkZXBpbmQpXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxkZXBpbmQvc25hYmJkb20vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKVxuICpcbiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgYmVjYXVzZSB0aGlzIGZpbGUgaXMgcGVyZi1jcml0aWNhbCBhbmQgdGhlIGNvc3RcbiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LlxuICovXG5cbnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7XG5cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ2FjdGl2YXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveSddO1xuXG5mdW5jdGlvbiBzYW1lVm5vZGUgKGEsIGIpIHtcbiAgcmV0dXJuIChcbiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKFxuICAgICAgKFxuICAgICAgICBhLnRhZyA9PT0gYi50YWcgJiZcbiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmXG4gICAgICAgIGlzRGVmKGEuZGF0YSkgPT09IGlzRGVmKGIuZGF0YSkgJiZcbiAgICAgICAgc2FtZUlucHV0VHlwZShhLCBiKVxuICAgICAgKSB8fCAoXG4gICAgICAgIGlzVHJ1ZShhLmlzQXN5bmNQbGFjZWhvbGRlcikgJiZcbiAgICAgICAgYS5hc3luY0ZhY3RvcnkgPT09IGIuYXN5bmNGYWN0b3J5ICYmXG4gICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUIgfHwgaXNUZXh0SW5wdXRUeXBlKHR5cGVBKSAmJiBpc1RleHRJbnB1dFR5cGUodHlwZUIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVRvT2xkSWR4IChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkge1xuICB2YXIgaSwga2V5O1xuICB2YXIgbWFwID0ge307XG4gIGZvciAoaSA9IGJlZ2luSWR4OyBpIDw9IGVuZElkeDsgKytpKSB7XG4gICAga2V5ID0gY2hpbGRyZW5baV0ua2V5O1xuICAgIGlmIChpc0RlZihrZXkpKSB7IG1hcFtrZXldID0gaTsgfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkge1xuICB2YXIgaSwgajtcbiAgdmFyIGNicyA9IHt9O1xuXG4gIHZhciBtb2R1bGVzID0gYmFja2VuZC5tb2R1bGVzO1xuICB2YXIgbm9kZU9wcyA9IGJhY2tlbmQubm9kZU9wcztcblxuICBmb3IgKGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChpc0RlZihtb2R1bGVzW2pdW2hvb2tzW2ldXSkpIHtcbiAgICAgICAgY2JzW2hvb2tzW2ldXS5wdXNoKG1vZHVsZXNbal1baG9va3NbaV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbXB0eU5vZGVBdCAoZWxtKSB7XG4gICAgcmV0dXJuIG5ldyBWTm9kZShub2RlT3BzLnRhZ05hbWUoZWxtKS50b0xvd2VyQ2FzZSgpLCB7fSwgW10sIHVuZGVmaW5lZCwgZWxtKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUm1DYiAoY2hpbGRFbG0sIGxpc3RlbmVycykge1xuICAgIGZ1bmN0aW9uIHJlbW92ZSQkMSAoKSB7XG4gICAgICBpZiAoLS1yZW1vdmUkJDEubGlzdGVuZXJzID09PSAwKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoY2hpbGRFbG0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZW1vdmUkJDEubGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICAgIHJldHVybiByZW1vdmUkJDFcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGVPcHMucGFyZW50Tm9kZShlbCk7XG4gICAgLy8gZWxlbWVudCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBkdWUgdG8gdi1odG1sIC8gdi10ZXh0XG4gICAgaWYgKGlzRGVmKHBhcmVudCkpIHtcbiAgICAgIG5vZGVPcHMucmVtb3ZlQ2hpbGQocGFyZW50LCBlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNVbmtub3duRWxlbWVudCQkMSAodm5vZGUsIGluVlByZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhaW5WUHJlICYmXG4gICAgICAhdm5vZGUubnMgJiZcbiAgICAgICEoXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuc29tZShmdW5jdGlvbiAoaWdub3JlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSlcbiAgICAgICAgICAgID8gaWdub3JlLnRlc3Qodm5vZGUudGFnKVxuICAgICAgICAgICAgOiBpZ25vcmUgPT09IHZub2RlLnRhZ1xuICAgICAgICB9KVxuICAgICAgKSAmJlxuICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodm5vZGUudGFnKVxuICAgIClcbiAgfVxuXG4gIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxtIChcbiAgICB2bm9kZSxcbiAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgcGFyZW50RWxtLFxuICAgIHJlZkVsbSxcbiAgICBuZXN0ZWQsXG4gICAgb3duZXJBcnJheSxcbiAgICBpbmRleFxuICApIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZWxtKSAmJiBpc0RlZihvd25lckFycmF5KSkge1xuICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciFcbiAgICAgIC8vIG5vdyBpdCdzIHVzZWQgYXMgYSBuZXcgbm9kZSwgb3ZlcndyaXRpbmcgaXRzIGVsbSB3b3VsZCBjYXVzZVxuICAgICAgLy8gcG90ZW50aWFsIHBhdGNoIGVycm9ycyBkb3duIHRoZSByb2FkIHdoZW4gaXQncyB1c2VkIGFzIGFuIGluc2VydGlvblxuICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmdcbiAgICAgIC8vIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnQgZm9yIGl0LlxuICAgICAgdm5vZGUgPSBvd25lckFycmF5W2luZGV4XSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIH1cblxuICAgIHZub2RlLmlzUm9vdEluc2VydCA9ICFuZXN0ZWQ7IC8vIGZvciB0cmFuc2l0aW9uIGVudGVyIGNoZWNrXG4gICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIGlmIChpc0RlZih0YWcpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5rbm93bkVsZW1lbnQkJDEodm5vZGUsIGNyZWF0aW5nRWxtSW5WUHJlKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArXG4gICAgICAgICAgICAncmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgJyArXG4gICAgICAgICAgICAnbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlIFwibmFtZVwiIG9wdGlvbi4nLFxuICAgICAgICAgICAgdm5vZGUuY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdm5vZGUuZWxtID0gdm5vZGUubnNcbiAgICAgICAgPyBub2RlT3BzLmNyZWF0ZUVsZW1lbnROUyh2bm9kZS5ucywgdGFnKVxuICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTtcbiAgICAgIHNldFNjb3BlKHZub2RlKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkYXRhICYmIGRhdGEucHJlKSB7XG4gICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSkge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGkpKSB7XG4gICAgICB2YXIgaXNSZWFjdGl2YXRlZCA9IGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpLmtlZXBBbGl2ZTtcbiAgICAgIGlmIChpc0RlZihpID0gaS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkge1xuICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8pO1xuICAgICAgfVxuICAgICAgLy8gYWZ0ZXIgY2FsbGluZyB0aGUgaW5pdCBob29rLCBpZiB0aGUgdm5vZGUgaXMgYSBjaGlsZCBjb21wb25lbnRcbiAgICAgIC8vIGl0IHNob3VsZCd2ZSBjcmVhdGVkIGEgY2hpbGQgaW5zdGFuY2UgYW5kIG1vdW50ZWQgaXQuIHRoZSBjaGlsZFxuICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uXG4gICAgICAvLyBpbiB0aGF0IGNhc2Ugd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBlbGVtZW50IGFuZCBiZSBkb25lLlxuICAgICAgaWYgKGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHtcbiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkge1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2guYXBwbHkoaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpO1xuICAgICAgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdm5vZGUuZWxtID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuJGVsO1xuICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC5cbiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSlcbiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rXG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhY3RpdmF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaTtcbiAgICAvLyBoYWNrIGZvciAjNDMzOTogYSByZWFjdGl2YXRlZCBjb21wb25lbnQgd2l0aCBpbm5lciB0cmFuc2l0aW9uXG4gICAgLy8gZG9lcyBub3QgdHJpZ2dlciBiZWNhdXNlIHRoZSBpbm5lciBub2RlJ3MgY3JlYXRlZCBob29rcyBhcmUgbm90IGNhbGxlZFxuICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dFxuICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQuXG4gICAgdmFyIGlubmVyTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGlubmVyTm9kZSA9IGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGlubmVyTm9kZS5kYXRhKSAmJiBpc0RlZihpID0gaS50cmFuc2l0aW9uKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2JzLmFjdGl2YXRlW2ldKGVtcHR5Tm9kZSwgaW5uZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpa2UgYSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCxcbiAgICAvLyBhIHJlYWN0aXZhdGVkIGtlZXAtYWxpdmUgY29tcG9uZW50IGRvZXNuJ3QgaW5zZXJ0IGl0c2VsZlxuICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkge1xuICAgIGlmIChpc0RlZihwYXJlbnQpKSB7XG4gICAgICBpZiAoaXNEZWYocmVmJCQxKSkge1xuICAgICAgICBpZiAobm9kZU9wcy5wYXJlbnROb2RlKHJlZiQkMSkgPT09IHBhcmVudCkge1xuICAgICAgICAgIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudCwgZWxtLCByZWYkJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHBhcmVudCwgZWxtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNyZWF0ZUVsbShjaGlsZHJlbltpXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5lbG0sIG51bGwsIHRydWUsIGNoaWxkcmVuLCBpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7XG4gICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHZub2RlLmVsbSwgbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcodm5vZGUudGV4dCkpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1BhdGNoYWJsZSAodm5vZGUpIHtcbiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgIH1cbiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjYnMuY3JlYXRlLmxlbmd0aDsgKytpJDEpIHtcbiAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIHZub2RlKTtcbiAgICB9XG4gICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICBpZiAoaXNEZWYoaSkpIHtcbiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpLmluc2VydCkpIHsgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2godm5vZGUpOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IHNjb3BlIGlkIGF0dHJpYnV0ZSBmb3Igc2NvcGVkIENTUy5cbiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWRcbiAgLy8gb2YgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBwYXRjaGluZyBwcm9jZXNzLlxuICBmdW5jdGlvbiBzZXRTY29wZSAodm5vZGUpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmZuU2NvcGVJZCkpIHtcbiAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYW5jZXN0b3IgPSB2bm9kZTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkge1xuICAgICAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuXG4gICAgaWYgKGlzRGVmKGkgPSBhY3RpdmVJbnN0YW5jZSkgJiZcbiAgICAgIGkgIT09IHZub2RlLmNvbnRleHQgJiZcbiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJlxuICAgICAgaXNEZWYoaSA9IGkuJG9wdGlvbnMuX3Njb3BlSWQpXG4gICAgKSB7XG4gICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWbm9kZXMgKHBhcmVudEVsbSwgcmVmRWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRGVzdHJveUhvb2sgKHZub2RlKSB7XG4gICAgdmFyIGksIGo7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKSB7IGkodm5vZGUpOyB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9XG4gICAgfVxuICAgIGlmIChpc0RlZihpID0gdm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaW52b2tlRGVzdHJveUhvb2sodm5vZGUuY2hpbGRyZW5bal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHtcbiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgaWYgKGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAoaXNEZWYoY2gudGFnKSkge1xuICAgICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soY2gpO1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgcmVtb3ZlTm9kZShjaC5lbG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQW5kSW52b2tlUmVtb3ZlSG9vayAodm5vZGUsIHJtKSB7XG4gICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkge1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gY2JzLnJlbW92ZS5sZW5ndGggKyAxO1xuICAgICAgaWYgKGlzRGVmKHJtKSkge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgcmVjdXJzaXZlbHkgcGFzc2VkIGRvd24gcm0gY2FsbGJhY2tcbiAgICAgICAgLy8gaW5jcmVhc2UgdGhlIGxpc3RlbmVycyBjb3VudFxuICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGlyZWN0bHkgcmVtb3ZpbmdcbiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlY3Vyc2l2ZWx5IGludm9rZSBob29rcyBvbiBjaGlsZCBjb21wb25lbnQgcm9vdCBub2RlXG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHtcbiAgICAgICAgcmVtb3ZlQW5kSW52b2tlUmVtb3ZlSG9vayhpLCBybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnMucmVtb3ZlW2ldKHZub2RlLCBybSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkge1xuICAgICAgICBpKHZub2RlLCBybSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4gKHBhcmVudEVsbSwgb2xkQ2gsIG5ld0NoLCBpbnNlcnRlZFZub2RlUXVldWUsIHJlbW92ZU9ubHkpIHtcbiAgICB2YXIgb2xkU3RhcnRJZHggPSAwO1xuICAgIHZhciBuZXdTdGFydElkeCA9IDA7XG4gICAgdmFyIG9sZEVuZElkeCA9IG9sZENoLmxlbmd0aCAtIDE7XG4gICAgdmFyIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFswXTtcbiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgIHZhciBuZXdFbmRJZHggPSBuZXdDaC5sZW5ndGggLSAxO1xuICAgIHZhciBuZXdTdGFydFZub2RlID0gbmV3Q2hbMF07XG4gICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICB2YXIgb2xkS2V5VG9JZHgsIGlkeEluT2xkLCB2bm9kZVRvTW92ZSwgcmVmRWxtO1xuXG4gICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+XG4gICAgLy8gdG8gZW5zdXJlIHJlbW92ZWQgZWxlbWVudHMgc3RheSBpbiBjb3JyZWN0IHJlbGF0aXZlIHBvc2l0aW9uc1xuICAgIC8vIGR1cmluZyBsZWF2aW5nIHRyYW5zaXRpb25zXG4gICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja0R1cGxpY2F0ZUtleXMobmV3Q2gpO1xuICAgIH1cblxuICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICBpZiAoaXNVbmRlZihvbGRTdGFydFZub2RlKSkge1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnRcbiAgICAgIH0gZWxzZSBpZiAoaXNVbmRlZihvbGRFbmRWbm9kZSkpIHtcbiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIG5ld0NoLCBuZXdFbmRJZHgpO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgcmlnaHRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBuZXdDaCwgbmV3RW5kSWR4KTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBuZXdDaCwgbmV3U3RhcnRJZHgpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkRW5kVm5vZGUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNVbmRlZihvbGRLZXlUb0lkeCkpIHsgb2xkS2V5VG9JZHggPSBjcmVhdGVLZXlUb09sZElkeChvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7IH1cbiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSlcbiAgICAgICAgICA/IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XVxuICAgICAgICAgIDogZmluZElkeEluT2xkKG5ld1N0YXJ0Vm5vZGUsIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07XG4gICAgICAgICAgaWYgKHNhbWVWbm9kZSh2bm9kZVRvTW92ZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGNoVm5vZGUodm5vZGVUb01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTtcbiAgICAgICAgICAgIG9sZENoW2lkeEluT2xkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2FtZSBrZXkgYnV0IGRpZmZlcmVudCBlbGVtZW50LiB0cmVhdCBhcyBuZXcgZWxlbWVudFxuICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7XG4gICAgICByZWZFbG0gPSBpc1VuZGVmKG5ld0NoW25ld0VuZElkeCArIDFdKSA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCByZWZFbG0sIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHtcbiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0R1cGxpY2F0ZUtleXMgKGNoaWxkcmVuKSB7XG4gICAgdmFyIHNlZW5LZXlzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZub2RlID0gY2hpbGRyZW5baV07XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5O1xuICAgICAgaWYgKGlzRGVmKGtleSkpIHtcbiAgICAgICAgaWYgKHNlZW5LZXlzW2tleV0pIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgKFwiRHVwbGljYXRlIGtleXMgZGV0ZWN0ZWQ6ICdcIiArIGtleSArIFwiJy4gVGhpcyBtYXkgY2F1c2UgYW4gdXBkYXRlIGVycm9yLlwiKSxcbiAgICAgICAgICAgIHZub2RlLmNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkge1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG9sZENoW2ldO1xuICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF0Y2hWbm9kZSAoXG4gICAgb2xkVm5vZGUsXG4gICAgdm5vZGUsXG4gICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgIG93bmVyQXJyYXksXG4gICAgaW5kZXgsXG4gICAgcmVtb3ZlT25seVxuICApIHtcbiAgICBpZiAob2xkVm5vZGUgPT09IHZub2RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNEZWYodm5vZGUuZWxtKSAmJiBpc0RlZihvd25lckFycmF5KSkge1xuICAgICAgLy8gY2xvbmUgcmV1c2VkIHZub2RlXG4gICAgICB2bm9kZSA9IG93bmVyQXJyYXlbaW5kZXhdID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbTtcblxuICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgaHlkcmF0ZShvbGRWbm9kZS5lbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy5cbiAgICAvLyBub3RlIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIC1cbiAgICAvLyBpZiB0aGUgbmV3IG5vZGUgaXMgbm90IGNsb25lZCBpdCBtZWFucyB0aGUgcmVuZGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW5cbiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLlxuICAgIGlmIChpc1RydWUodm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICBpc1RydWUob2xkVm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJlxuICAgICAgKGlzVHJ1ZSh2bm9kZS5pc0Nsb25lZCkgfHwgaXNUcnVlKHZub2RlLmlzT25jZSkpXG4gICAgKSB7XG4gICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGk7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHtcbiAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY2ggPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnVwZGF0ZS5sZW5ndGg7ICsraSkgeyBjYnMudXBkYXRlW2ldKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS51cGRhdGUpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfVxuICAgICAgfSBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZUtleXMoY2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9XG4gICAgICAgIGFkZFZub2RlcyhlbG0sIG51bGwsIGNoLCAwLCBjaC5sZW5ndGggLSAxLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRDaCkpIHtcbiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkge1xuICAgICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2xkVm5vZGUudGV4dCAhPT0gdm5vZGUudGV4dCkge1xuICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wb3N0cGF0Y2gpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkge1xuICAgIC8vIGRlbGF5IGluc2VydCBob29rcyBmb3IgY29tcG9uZW50IHJvb3Qgbm9kZXMsIGludm9rZSB0aGVtIGFmdGVyIHRoZVxuICAgIC8vIGVsZW1lbnQgaXMgcmVhbGx5IGluc2VydGVkXG4gICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICB2bm9kZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcXVldWVbaV0uZGF0YS5ob29rLmluc2VydChxdWV1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlO1xuICAvLyBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjYW4gc2tpcCBjcmVhdGUgaG9vayBkdXJpbmcgaHlkcmF0aW9uIGJlY2F1c2UgdGhleVxuICAvLyBhcmUgYWxyZWFkeSByZW5kZXJlZCBvbiB0aGUgY2xpZW50IG9yIGhhcyBubyBuZWVkIGZvciBpbml0aWFsaXphdGlvblxuICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmVcbiAgLy8gZGVlcCB1cGRhdGVzICgjNzA2MykuXG4gIHZhciBpc1JlbmRlcmVkTW9kdWxlID0gbWFrZU1hcCgnYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Jyk7XG5cbiAgLy8gTm90ZTogdGhpcyBpcyBhIGJyb3dzZXItb25seSBmdW5jdGlvbiBzbyB3ZSBjYW4gYXNzdW1lIGVsbXMgYXJlIERPTSBub2Rlcy5cbiAgZnVuY3Rpb24gaHlkcmF0ZSAoZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpblZQcmUgPSBpblZQcmUgfHwgKGRhdGEgJiYgZGF0YS5wcmUpO1xuICAgIHZub2RlLmVsbSA9IGVsbTtcblxuICAgIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSAmJiBpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkpKSB7XG4gICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gYXNzZXJ0IG5vZGUgbWF0Y2hcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFhc3NlcnROb2RlTWF0Y2goZWxtLCB2bm9kZSwgaW5WUHJlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsgaSh2bm9kZSwgdHJ1ZSAvKiBoeWRyYXRpbmcgKi8pOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS5cbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHtcbiAgICAgICAgLy8gZW1wdHkgZWxlbWVudCwgYWxsb3cgY2xpZW50IHRvIHBpY2sgdXAgYW5kIHBvcHVsYXRlIGNoaWxkcmVuXG4gICAgICAgIGlmICghZWxtLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB2LWh0bWwgYW5kIGRvbVByb3BzOiBpbm5lckhUTUxcbiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7XG4gICAgICAgICAgICBpZiAoaSAhPT0gZWxtLmlubmVySFRNTCkge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkJhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzZXJ2ZXIgaW5uZXJIVE1MOiAnLCBpKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2NsaWVudCBpbm5lckhUTUw6ICcsIGVsbS5pbm5lckhUTUwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpdGVyYXRlIGFuZCBjb21wYXJlIGNoaWxkcmVuIGxpc3RzXG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7XG4gICAgICAgICAgICAgIGlmICghY2hpbGROb2RlIHx8ICFoeWRyYXRlKGNoaWxkTm9kZSwgY2hpbGRyZW5baSQxXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgY2hpbGROb2RlIGlzIG5vdCBudWxsLCBpdCBtZWFucyB0aGUgYWN0dWFsIGNoaWxkTm9kZXMgbGlzdCBpc1xuICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5NYXRjaCB8fCBjaGlsZE5vZGUpIHtcbiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAnLCBlbG0uY2hpbGROb2RlcywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKCFpc1JlbmRlcmVkTW9kdWxlKGtleSkpIHtcbiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlO1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxJbnZva2UgJiYgZGF0YVsnY2xhc3MnXSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICAgICAgdHJhdmVyc2UoZGF0YVsnY2xhc3MnXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsbS5kYXRhICE9PSB2bm9kZS50ZXh0KSB7XG4gICAgICBlbG0uZGF0YSA9IHZub2RlLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnROb2RlTWF0Y2ggKG5vZGUsIHZub2RlLCBpblZQcmUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUudGFnKSkge1xuICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKFxuICAgICAgICAhaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgaW5WUHJlKSAmJlxuICAgICAgICB2bm9kZS50YWcudG9Mb3dlckNhc2UoKSA9PT0gKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09ICh2bm9kZS5pc0NvbW1lbnQgPyA4IDogMylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5KSB7XG4gICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkVm5vZGUpKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGlzSW5pdGlhbFBhdGNoID0gZmFsc2U7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGlzVW5kZWYob2xkVm5vZGUpKSB7XG4gICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50XG4gICAgICBpc0luaXRpYWxQYXRjaCA9IHRydWU7XG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpO1xuICAgICAgaWYgKCFpc1JlYWxFbGVtZW50ICYmIHNhbWVWbm9kZShvbGRWbm9kZSwgdm5vZGUpKSB7XG4gICAgICAgIC8vIHBhdGNoIGV4aXN0aW5nIHJvb3Qgbm9kZVxuICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBudWxsLCBudWxsLCByZW1vdmVPbmx5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1JlYWxFbGVtZW50KSB7XG4gICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcnZlci1yZW5kZXJlZCBjb250ZW50IGFuZCBpZiB3ZSBjYW4gcGVyZm9ybVxuICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCBoeWRyYXRpb24uXG4gICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHtcbiAgICAgICAgICAgIG9sZFZub2RlLnJlbW92ZUF0dHJpYnV0ZShTU1JfQVRUUik7XG4gICAgICAgICAgICBoeWRyYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNUcnVlKGh5ZHJhdGluZykpIHtcbiAgICAgICAgICAgIGlmIChoeWRyYXRlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSkge1xuICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpO1xuICAgICAgICAgICAgICByZXR1cm4gb2xkVm5vZGVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICdUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgJyArXG4gICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgK1xuICAgICAgICAgICAgICAgICdIVE1MIG1hcmt1cCwgZm9yIGV4YW1wbGUgbmVzdGluZyBibG9jay1sZXZlbCBlbGVtZW50cyBpbnNpZGUgJyArXG4gICAgICAgICAgICAgICAgJzxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyAnICtcbiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlaXRoZXIgbm90IHNlcnZlci1yZW5kZXJlZCwgb3IgaHlkcmF0aW9uIGZhaWxlZC5cbiAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbm9kZSBhbmQgcmVwbGFjZSBpdFxuICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgdmFyIG9sZEVsbSA9IG9sZFZub2RlLmVsbTtcbiAgICAgICAgdmFyIHBhcmVudEVsbSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbm9kZVxuICAgICAgICBjcmVhdGVFbG0oXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhXG4gICAgICAgICAgLy8gbGVhdmluZyB0cmFuc2l0aW9uLiBPbmx5IGhhcHBlbnMgd2hlbiBjb21iaW5pbmcgdHJhbnNpdGlvbiArXG4gICAgICAgICAgLy8ga2VlcC1hbGl2ZSArIEhPQ3MuICgjNDU5MClcbiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtLFxuICAgICAgICAgIG5vZGVPcHMubmV4dFNpYmxpbmcob2xkRWxtKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwYXJlbnQgcGxhY2Vob2xkZXIgbm9kZSBlbGVtZW50LCByZWN1cnNpdmVseVxuICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkge1xuICAgICAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlLnBhcmVudDtcbiAgICAgICAgICB2YXIgcGF0Y2hhYmxlID0gaXNQYXRjaGFibGUodm5vZGUpO1xuICAgICAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMuZGVzdHJveS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjYnMuZGVzdHJveVtpXShhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3Rvci5lbG0gPSB2bm9kZS5lbG07XG4gICAgICAgICAgICBpZiAocGF0Y2hhYmxlKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICAgICAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyAjNjUxM1xuICAgICAgICAgICAgICAvLyBpbnZva2UgaW5zZXJ0IGhvb2tzIHRoYXQgbWF5IGhhdmUgYmVlbiBtZXJnZWQgYnkgY3JlYXRlIGhvb2tzLlxuICAgICAgICAgICAgICAvLyBlLmcuIGZvciBkaXJlY3RpdmVzIHRoYXQgdXNlcyB0aGUgXCJpbnNlcnRlZFwiIGhvb2suXG4gICAgICAgICAgICAgIHZhciBpbnNlcnQgPSBhbmNlc3Rvci5kYXRhLmhvb2suaW5zZXJ0O1xuICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGF0IGluZGV4IDEgdG8gYXZvaWQgcmUtaW52b2tpbmcgY29tcG9uZW50IG1vdW50ZWQgaG9va1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkkMiA9IDE7IGkkMiA8IGluc2VydC5mbnMubGVuZ3RoOyBpJDIrKykge1xuICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWdpc3RlclJlZihhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZXN0cm95IG9sZCBub2RlXG4gICAgICAgIGlmIChpc0RlZihwYXJlbnRFbG0pKSB7XG4gICAgICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgW29sZFZub2RlXSwgMCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkge1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpO1xuICAgIHJldHVybiB2bm9kZS5lbG1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIGRpcmVjdGl2ZXMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlRGlyZWN0aXZlcyxcbiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICBkZXN0cm95OiBmdW5jdGlvbiB1bmJpbmREaXJlY3RpdmVzICh2bm9kZSkge1xuICAgIHVwZGF0ZURpcmVjdGl2ZXModm5vZGUsIGVtcHR5Tm9kZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZURpcmVjdGl2ZXMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzIHx8IHZub2RlLmRhdGEuZGlyZWN0aXZlcykge1xuICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGlzQ3JlYXRlID0gb2xkVm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7XG4gIHZhciBvbGREaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcywgb2xkVm5vZGUuY29udGV4dCk7XG4gIHZhciBuZXdEaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKHZub2RlLmRhdGEuZGlyZWN0aXZlcywgdm5vZGUuY29udGV4dCk7XG5cbiAgdmFyIGRpcnNXaXRoSW5zZXJ0ID0gW107XG4gIHZhciBkaXJzV2l0aFBvc3RwYXRjaCA9IFtdO1xuXG4gIHZhciBrZXksIG9sZERpciwgZGlyO1xuICBmb3IgKGtleSBpbiBuZXdEaXJzKSB7XG4gICAgb2xkRGlyID0gb2xkRGlyc1trZXldO1xuICAgIGRpciA9IG5ld0RpcnNba2V5XTtcbiAgICBpZiAoIW9sZERpcikge1xuICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZFxuICAgICAgY2FsbEhvb2skMShkaXIsICdiaW5kJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIGlmIChkaXIuZGVmICYmIGRpci5kZWYuaW5zZXJ0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZVxuICAgICAgZGlyLm9sZFZhbHVlID0gb2xkRGlyLnZhbHVlO1xuICAgICAgZGlyLm9sZEFyZyA9IG9sZERpci5hcmc7XG4gICAgICBjYWxsSG9vayQxKGRpciwgJ3VwZGF0ZScsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmNvbXBvbmVudFVwZGF0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aEluc2VydC5sZW5ndGgpIHtcbiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhJbnNlcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aEluc2VydFtpXSwgJ2luc2VydGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0NyZWF0ZSkge1xuICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEluc2VydCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHtcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFpc0NyZWF0ZSkge1xuICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHtcbiAgICAgIGlmICghbmV3RGlyc1trZXldKSB7XG4gICAgICAgIC8vIG5vIGxvbmdlciBwcmVzZW50LCB1bmJpbmRcbiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSAoXG4gIGRpcnMsXG4gIHZtXG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghZGlycykge1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHJldHVybiByZXNcbiAgfVxuICB2YXIgaSwgZGlyO1xuICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykge1xuICAgIGRpciA9IGRpcnNbaV07XG4gICAgaWYgKCFkaXIubW9kaWZpZXJzKSB7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGRpci5tb2RpZmllcnMgPSBlbXB0eU1vZGlmaWVycztcbiAgICB9XG4gICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7XG4gICAgZGlyLmRlZiA9IHJlc29sdmVBc3NldCh2bS4kb3B0aW9ucywgJ2RpcmVjdGl2ZXMnLCBkaXIubmFtZSwgdHJ1ZSk7XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGlyTmFtZSAoZGlyKSB7XG4gIHJldHVybiBkaXIucmF3TmFtZSB8fCAoKGRpci5uYW1lKSArIFwiLlwiICsgKE9iamVjdC5rZXlzKGRpci5tb2RpZmllcnMgfHwge30pLmpvaW4oJy4nKSkpXG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rJDEgKGRpciwgaG9vaywgdm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpIHtcbiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdO1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4odm5vZGUuZWxtLCBkaXIsIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bm9kZS5jb250ZXh0LCAoXCJkaXJlY3RpdmUgXCIgKyAoZGlyLm5hbWUpICsgXCIgXCIgKyBob29rICsgXCIgaG9va1wiKSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBiYXNlTW9kdWxlcyA9IFtcbiAgcmVmLFxuICBkaXJlY3RpdmVzXG5dO1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gdXBkYXRlQXR0cnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChpc0RlZihvcHRzKSAmJiBvcHRzLkN0b3Iub3B0aW9ucy5pbmhlcml0QXR0cnMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGlzVW5kZWYob2xkVm5vZGUuZGF0YS5hdHRycykgJiYgaXNVbmRlZih2bm9kZS5kYXRhLmF0dHJzKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBrZXksIGN1ciwgb2xkO1xuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9O1xuICB2YXIgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzIHx8IHt9O1xuICAvLyBjbG9uZSBvYnNlcnZlZCBvYmplY3RzLCBhcyB0aGUgdXNlciBwcm9iYWJseSB3YW50cyB0byBtdXRhdGUgaXRcbiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHtcbiAgICBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgPSBleHRlbmQoe30sIGF0dHJzKTtcbiAgfVxuXG4gIGZvciAoa2V5IGluIGF0dHJzKSB7XG4gICAgY3VyID0gYXR0cnNba2V5XTtcbiAgICBvbGQgPSBvbGRBdHRyc1trZXldO1xuICAgIGlmIChvbGQgIT09IGN1cikge1xuICAgICAgc2V0QXR0cihlbG0sIGtleSwgY3VyKTtcbiAgICB9XG4gIH1cbiAgLy8gIzQzOTE6IGluIElFOSwgc2V0dGluZyB0eXBlIGNhbiByZXNldCB2YWx1ZSBmb3IgaW5wdXRbdHlwZT1yYWRpb11cbiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKChpc0lFIHx8IGlzRWRnZSkgJiYgYXR0cnMudmFsdWUgIT09IG9sZEF0dHJzLnZhbHVlKSB7XG4gICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTtcbiAgfVxuICBmb3IgKGtleSBpbiBvbGRBdHRycykge1xuICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7XG4gICAgICBpZiAoaXNYbGluayhrZXkpKSB7XG4gICAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBnZXRYbGlua1Byb3Aoa2V5KSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHtcbiAgICAgICAgZWxtLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRBdHRyIChlbCwga2V5LCB2YWx1ZSkge1xuICBpZiAoZWwudGFnTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAvLyBzZXQgYXR0cmlidXRlIGZvciBibGFuayB2YWx1ZVxuICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+XG4gICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGVjaG5pY2FsbHkgYWxsb3dmdWxsc2NyZWVuIGlzIGEgYm9vbGVhbiBhdHRyaWJ1dGUgZm9yIDxpZnJhbWU+LFxuICAgICAgLy8gYnV0IEZsYXNoIGV4cGVjdHMgYSB2YWx1ZSBvZiBcInRydWVcIiB3aGVuIHVzZWQgb24gPGVtYmVkPiB0YWdcbiAgICAgIHZhbHVlID0ga2V5ID09PSAnYWxsb3dmdWxsc2NyZWVuJyAmJiBlbC50YWdOYW1lID09PSAnRU1CRUQnXG4gICAgICAgID8gJ3RydWUnXG4gICAgICAgIDoga2V5O1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBjb252ZXJ0RW51bWVyYXRlZFZhbHVlKGtleSwgdmFsdWUpKTtcbiAgfSBlbHNlIGlmIChpc1hsaW5rKGtleSkpIHtcbiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gIzcxMzg6IElFMTAgJiAxMSBmaXJlcyBpbnB1dCBldmVudCB3aGVuIHNldHRpbmcgcGxhY2Vob2xkZXIgb25cbiAgICAvLyA8dGV4dGFyZWE+Li4uIGJsb2NrIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhbmQgcmVtb3ZlIHRoZSBibG9ja2VyXG4gICAgLy8gaW1tZWRpYXRlbHkuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKFxuICAgICAgaXNJRSAmJiAhaXNJRTkgJiZcbiAgICAgIGVsLnRhZ05hbWUgPT09ICdURVhUQVJFQScgJiZcbiAgICAgIGtleSA9PT0gJ3BsYWNlaG9sZGVyJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWVsLl9faWVwaFxuICAgICkge1xuICAgICAgdmFyIGJsb2NrZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIGJsb2NrZXIpO1xuICAgICAgfTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGVsLl9faWVwaCA9IHRydWU7IC8qIElFIHBsYWNlaG9sZGVyIHBhdGNoZWQgKi9cbiAgICB9XG4gICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICB9XG59XG5cbnZhciBhdHRycyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVBdHRycyxcbiAgdXBkYXRlOiB1cGRhdGVBdHRyc1xufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTtcbiAgaWYgKFxuICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiZcbiAgICBpc1VuZGVmKGRhdGEuY2xhc3MpICYmIChcbiAgICAgIGlzVW5kZWYob2xkRGF0YSkgfHwgKFxuICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmXG4gICAgICAgIGlzVW5kZWYob2xkRGF0YS5jbGFzcylcbiAgICAgIClcbiAgICApXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNscyA9IGdlbkNsYXNzRm9yVm5vZGUodm5vZGUpO1xuXG4gIC8vIGhhbmRsZSB0cmFuc2l0aW9uIGNsYXNzZXNcbiAgdmFyIHRyYW5zaXRpb25DbGFzcyA9IGVsLl90cmFuc2l0aW9uQ2xhc3NlcztcbiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHtcbiAgICBjbHMgPSBjb25jYXQoY2xzLCBzdHJpbmdpZnlDbGFzcyh0cmFuc2l0aW9uQ2xhc3MpKTtcbiAgfVxuXG4gIC8vIHNldCB0aGUgY2xhc3NcbiAgaWYgKGNscyAhPT0gZWwuX3ByZXZDbGFzcykge1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpO1xuICAgIGVsLl9wcmV2Q2xhc3MgPSBjbHM7XG4gIH1cbn1cblxudmFyIGtsYXNzID0ge1xuICBjcmVhdGU6IHVwZGF0ZUNsYXNzLFxuICB1cGRhdGU6IHVwZGF0ZUNsYXNzXG59O1xuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZVxuLy8gc28gd2UgdXNlZCBzb21lIHJlc2VydmVkIHRva2VucyBkdXJpbmcgY29tcGlsZS5cbnZhciBSQU5HRV9UT0tFTiA9ICdfX3InO1xudmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7XG5cbi8qICAqL1xuXG4vLyBub3JtYWxpemUgdi1tb2RlbCBldmVudCB0b2tlbnMgdGhhdCBjYW4gb25seSBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuXG4vLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlXG4vLyB0aGUgd2hvbGUgcG9pbnQgaXMgZW5zdXJpbmcgdGhlIHYtbW9kZWwgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgYmVmb3JlXG4vLyB1c2VyLWF0dGFjaGVkIGhhbmRsZXJzLlxuZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW1JBTkdFX1RPS0VOXSkpIHtcbiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gaXNJRSA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICBvbltldmVudF0gPSBbXS5jb25jYXQob25bUkFOR0VfVE9LRU5dLCBvbltldmVudF0gfHwgW10pO1xuICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07XG4gIH1cbiAgLy8gVGhpcyB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBmaXggIzQ1MjEgYnV0IG5vIGxvbmdlciBuZWNlc3NhcnlcbiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXSkpIHtcbiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pO1xuICAgIGRlbGV0ZSBvbltDSEVDS0JPWF9SQURJT19UT0tFTl07XG4gIH1cbn1cblxudmFyIHRhcmdldCQxO1xuXG5mdW5jdGlvbiBjcmVhdGVPbmNlSGFuZGxlciQxIChldmVudCwgaGFuZGxlciwgY2FwdHVyZSkge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldCQxOyAvLyBzYXZlIGN1cnJlbnQgdGFyZ2V0IGVsZW1lbnQgaW4gY2xvc3VyZVxuICByZXR1cm4gZnVuY3Rpb24gb25jZUhhbmRsZXIgKCkge1xuICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlcyAhPT0gbnVsbCkge1xuICAgICAgcmVtb3ZlJDIoZXZlbnQsIG9uY2VIYW5kbGVyLCBjYXB0dXJlLCBfdGFyZ2V0KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gIzk0NDY6IEZpcmVmb3ggPD0gNTMgKGluIHBhcnRpY3VsYXIsIEVTUiA1MikgaGFzIGluY29ycmVjdCBFdmVudC50aW1lU3RhbXBcbi8vIGltcGxlbWVudGF0aW9uIGFuZCBkb2VzIG5vdCBmaXJlIG1pY3JvdGFza3MgaW4gYmV0d2VlbiBldmVudCBwcm9wYWdhdGlvbiwgc29cbi8vIHNhZmUgdG8gZXhjbHVkZS5cbnZhciB1c2VNaWNyb3Rhc2tGaXggPSBpc1VzaW5nTWljcm9UYXNrICYmICEoaXNGRiAmJiBOdW1iZXIoaXNGRlsxXSkgPD0gNTMpO1xuXG5mdW5jdGlvbiBhZGQkMSAoXG4gIG5hbWUsXG4gIGhhbmRsZXIsXG4gIGNhcHR1cmUsXG4gIHBhc3NpdmVcbikge1xuICAvLyBhc3luYyBlZGdlIGNhc2UgIzY1NjY6IGlubmVyIGNsaWNrIGV2ZW50IHRyaWdnZXJzIHBhdGNoLCBldmVudCBoYW5kbGVyXG4gIC8vIGF0dGFjaGVkIHRvIG91dGVyIGVsZW1lbnQgZHVyaW5nIHBhdGNoLCBhbmQgdHJpZ2dlcmVkIGFnYWluLiBUaGlzXG4gIC8vIGhhcHBlbnMgYmVjYXVzZSBicm93c2VycyBmaXJlIG1pY3JvdGFzayB0aWNrcyBiZXR3ZWVuIGV2ZW50IHByb3BhZ2F0aW9uLlxuICAvLyB0aGUgc29sdXRpb24gaXMgc2ltcGxlOiB3ZSBzYXZlIHRoZSB0aW1lc3RhbXAgd2hlbiBhIGhhbmRsZXIgaXMgYXR0YWNoZWQsXG4gIC8vIGFuZCB0aGUgaGFuZGxlciB3b3VsZCBvbmx5IGZpcmUgaWYgdGhlIGV2ZW50IHBhc3NlZCB0byBpdCB3YXMgZmlyZWRcbiAgLy8gQUZURVIgaXQgd2FzIGF0dGFjaGVkLlxuICBpZiAodXNlTWljcm90YXNrRml4KSB7XG4gICAgdmFyIGF0dGFjaGVkVGltZXN0YW1wID0gY3VycmVudEZsdXNoVGltZXN0YW1wO1xuICAgIHZhciBvcmlnaW5hbCA9IGhhbmRsZXI7XG4gICAgaGFuZGxlciA9IG9yaWdpbmFsLl93cmFwcGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gbm8gYnViYmxpbmcsIHNob3VsZCBhbHdheXMgZmlyZS5cbiAgICAgICAgLy8gdGhpcyBpcyBqdXN0IGEgc2FmZXR5IG5ldCBpbiBjYXNlIGV2ZW50LnRpbWVTdGFtcCBpcyB1bnJlbGlhYmxlIGluXG4gICAgICAgIC8vIGNlcnRhaW4gd2VpcmQgZW52aXJvbm1lbnRzLi4uXG4gICAgICAgIGUudGFyZ2V0ID09PSBlLmN1cnJlbnRUYXJnZXQgfHxcbiAgICAgICAgLy8gZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgaGFuZGxlciBhdHRhY2htZW50XG4gICAgICAgIGUudGltZVN0YW1wID49IGF0dGFjaGVkVGltZXN0YW1wIHx8XG4gICAgICAgIC8vIGJhaWwgZm9yIGVudmlyb25tZW50cyB0aGF0IGhhdmUgYnVnZ3kgZXZlbnQudGltZVN0YW1wIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAvLyAjOTQ2MiBpT1MgOSBidWc6IGV2ZW50LnRpbWVTdGFtcCBpcyAwIGFmdGVyIGhpc3RvcnkucHVzaFN0YXRlXG4gICAgICAgIC8vICM5NjgxIFF0V2ViRW5naW5lIGV2ZW50LnRpbWVTdGFtcCBpcyBuZWdhdGl2ZSB2YWx1ZVxuICAgICAgICBlLnRpbWVTdGFtcCA8PSAwIHx8XG4gICAgICAgIC8vICM5NDQ4IGJhaWwgaWYgZXZlbnQgaXMgZmlyZWQgaW4gYW5vdGhlciBkb2N1bWVudCBpbiBhIG11bHRpLXBhZ2VcbiAgICAgICAgLy8gZWxlY3Ryb24vbncuanMgYXBwLCBzaW5jZSBldmVudC50aW1lU3RhbXAgd2lsbCBiZSB1c2luZyBhIGRpZmZlcmVudFxuICAgICAgICAvLyBzdGFydGluZyByZWZlcmVuY2VcbiAgICAgICAgZS50YXJnZXQub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBuYW1lLFxuICAgIGhhbmRsZXIsXG4gICAgc3VwcG9ydHNQYXNzaXZlXG4gICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9XG4gICAgICA6IGNhcHR1cmVcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBuYW1lLFxuICBoYW5kbGVyLFxuICBjYXB0dXJlLFxuICBfdGFyZ2V0XG4pIHtcbiAgKF90YXJnZXQgfHwgdGFyZ2V0JDEpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgbmFtZSxcbiAgICBoYW5kbGVyLl93cmFwcGVyIHx8IGhhbmRsZXIsXG4gICAgY2FwdHVyZVxuICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLm9uKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEub24pKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9uID0gdm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdmFyIG9sZE9uID0gb2xkVm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07XG4gIG5vcm1hbGl6ZUV2ZW50cyhvbik7XG4gIHVwZGF0ZUxpc3RlbmVycyhvbiwgb2xkT24sIGFkZCQxLCByZW1vdmUkMiwgY3JlYXRlT25jZUhhbmRsZXIkMSwgdm5vZGUuY29udGV4dCk7XG4gIHRhcmdldCQxID0gdW5kZWZpbmVkO1xufVxuXG52YXIgZXZlbnRzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnNcbn07XG5cbi8qICAqL1xuXG52YXIgc3ZnQ29udGFpbmVyO1xuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIga2V5LCBjdXI7XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBvbGRQcm9wcyA9IG9sZFZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307XG4gIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307XG4gIC8vIGNsb25lIG9ic2VydmVkIG9iamVjdHMsIGFzIHRoZSB1c2VyIHByb2JhYmx5IHdhbnRzIHRvIG11dGF0ZSBpdFxuICBpZiAoaXNEZWYocHJvcHMuX19vYl9fKSkge1xuICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpO1xuICB9XG5cbiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBlbG1ba2V5XSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoa2V5IGluIHByb3BzKSB7XG4gICAgY3VyID0gcHJvcHNba2V5XTtcbiAgICAvLyBpZ25vcmUgY2hpbGRyZW4gaWYgdGhlIG5vZGUgaGFzIHRleHRDb250ZW50IG9yIGlubmVySFRNTCxcbiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9yc1xuICAgIC8vIG9uIHN1YnNlcXVlbnQgcGF0Y2hlcyAoIzMzNjApXG4gICAgaWYgKGtleSA9PT0gJ3RleHRDb250ZW50JyB8fCBrZXkgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfVxuICAgICAgaWYgKGN1ciA9PT0gb2xkUHJvcHNba2V5XSkgeyBjb250aW51ZSB9XG4gICAgICAvLyAjNjYwMSB3b3JrIGFyb3VuZCBDaHJvbWUgdmVyc2lvbiA8PSA1NSBidWcgd2hlcmUgc2luZ2xlIHRleHROb2RlXG4gICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eVxuICAgICAgaWYgKGVsbS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbG0ucmVtb3ZlQ2hpbGQoZWxtLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICd2YWx1ZScgJiYgZWxtLnRhZ05hbWUgIT09ICdQUk9HUkVTUycpIHtcbiAgICAgIC8vIHN0b3JlIHZhbHVlIGFzIF92YWx1ZSBhcyB3ZWxsIHNpbmNlXG4gICAgICAvLyBub24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkXG4gICAgICBlbG0uX3ZhbHVlID0gY3VyO1xuICAgICAgLy8gYXZvaWQgcmVzZXR0aW5nIGN1cnNvciBwb3NpdGlvbiB3aGVuIHZhbHVlIGlzIHRoZSBzYW1lXG4gICAgICB2YXIgc3RyQ3VyID0gaXNVbmRlZihjdXIpID8gJycgOiBTdHJpbmcoY3VyKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHtcbiAgICAgICAgZWxtLnZhbHVlID0gc3RyQ3VyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaW5uZXJIVE1MJyAmJiBpc1NWRyhlbG0udGFnTmFtZSkgJiYgaXNVbmRlZihlbG0uaW5uZXJIVE1MKSkge1xuICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGlubmVySFRNTCBmb3IgU1ZHIGVsZW1lbnRzXG4gICAgICBzdmdDb250YWluZXIgPSBzdmdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gXCI8c3ZnPlwiICsgY3VyICsgXCI8L3N2Zz5cIjtcbiAgICAgIHZhciBzdmcgPSBzdmdDb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIHdoaWxlIChlbG0uZmlyc3RDaGlsZCkge1xuICAgICAgICBlbG0ucmVtb3ZlQ2hpbGQoZWxtLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN2Zy5maXJzdENoaWxkKSB7XG4gICAgICAgIGVsbS5hcHBlbmRDaGlsZChzdmcuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIHNraXAgdGhlIHVwZGF0ZSBpZiBvbGQgYW5kIG5ldyBWRE9NIHN0YXRlIGlzIHRoZSBzYW1lLlxuICAgICAgLy8gYHZhbHVlYCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVjYXVzZSB0aGUgRE9NIHZhbHVlIG1heSBiZSB0ZW1wb3JhcmlseVxuICAgICAgLy8gb3V0IG9mIHN5bmMgd2l0aCBWRE9NIHN0YXRlIGR1ZSB0byBmb2N1cywgY29tcG9zaXRpb24gYW5kIG1vZGlmaWVycy5cbiAgICAgIC8vIFRoaXMgICM0NTIxIGJ5IHNraXBwaW5nIHRoZSB1bm5lY2VzYXJyeSBgY2hlY2tlZGAgdXBkYXRlLlxuICAgICAgY3VyICE9PSBvbGRQcm9wc1trZXldXG4gICAgKSB7XG4gICAgICAvLyBzb21lIHByb3BlcnR5IHVwZGF0ZXMgY2FuIHRocm93XG4gICAgICAvLyBlLmcuIGB2YWx1ZWAgb24gPHByb2dyZXNzPiB3LyBub24tZmluaXRlIHZhbHVlXG4gICAgICB0cnkge1xuICAgICAgICBlbG1ba2V5XSA9IGN1cjtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG59XG5cbi8vIGNoZWNrIHBsYXRmb3Jtcy93ZWIvdXRpbC9hdHRycy5qcyBhY2NlcHRWYWx1ZVxuXG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVZhbHVlIChlbG0sIGNoZWNrVmFsKSB7XG4gIHJldHVybiAoIWVsbS5jb21wb3NpbmcgJiYgKFxuICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fFxuICAgIGlzTm90SW5Gb2N1c0FuZERpcnR5KGVsbSwgY2hlY2tWYWwpIHx8XG4gICAgaXNEaXJ0eVdpdGhNb2RpZmllcnMoZWxtLCBjaGVja1ZhbClcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHtcbiAgLy8gcmV0dXJuIHRydWUgd2hlbiB0ZXh0Ym94ICgubnVtYmVyIGFuZCAudHJpbSkgbG9zZXMgZm9jdXMgYW5kIGl0cyB2YWx1ZSBpc1xuICAvLyBub3QgZXF1YWwgdG8gdGhlIHVwZGF0ZWQgdmFsdWVcbiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlO1xuICAvLyAjNjE1N1xuICAvLyB3b3JrIGFyb3VuZCBJRSBidWcgd2hlbiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbiBhbiBpZnJhbWVcbiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIG5vdEluRm9jdXMgJiYgZWxtLnZhbHVlICE9PSBjaGVja1ZhbFxufVxuXG5mdW5jdGlvbiBpc0RpcnR5V2l0aE1vZGlmaWVycyAoZWxtLCBuZXdWYWwpIHtcbiAgdmFyIHZhbHVlID0gZWxtLnZhbHVlO1xuICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWVcbiAgaWYgKGlzRGVmKG1vZGlmaWVycykpIHtcbiAgICBpZiAobW9kaWZpZXJzLm51bWJlcikge1xuICAgICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKSAhPT0gdG9OdW1iZXIobmV3VmFsKVxuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLnRyaW0pIHtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgIT09IG5ld1ZhbC50cmltKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlICE9PSBuZXdWYWxcbn1cblxudmFyIGRvbVByb3BzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLFxuICB1cGRhdGU6IHVwZGF0ZURPTVByb3BzXG59O1xuXG4vKiAgKi9cblxudmFyIHBhcnNlU3R5bGVUZXh0ID0gY2FjaGVkKGZ1bmN0aW9uIChjc3NUZXh0KSB7XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXFwpKS9nO1xuICB2YXIgcHJvcGVydHlEZWxpbWl0ZXIgPSAvOiguKykvO1xuICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdmFyIHRtcCA9IGl0ZW0uc3BsaXQocHJvcGVydHlEZWxpbWl0ZXIpO1xuICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZVxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVEYXRhIChkYXRhKSB7XG4gIHZhciBzdHlsZSA9IG5vcm1hbGl6ZVN0eWxlQmluZGluZyhkYXRhLnN0eWxlKTtcbiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uXG4gIC8vIGFuZCBpcyBhbHdheXMgYSBmcmVzaCBvYmplY3QsIHNvIGl0J3Mgc2FmZSB0byBtZXJnZSBpbnRvIGl0XG4gIHJldHVybiBkYXRhLnN0YXRpY1N0eWxlXG4gICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpXG4gICAgOiBzdHlsZVxufVxuXG4vLyBub3JtYWxpemUgcG9zc2libGUgYXJyYXkgLyBzdHJpbmcgdmFsdWVzIGludG8gT2JqZWN0XG5mdW5jdGlvbiBub3JtYWxpemVTdHlsZUJpbmRpbmcgKGJpbmRpbmdTdHlsZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7XG4gICAgcmV0dXJuIHRvT2JqZWN0KGJpbmRpbmdTdHlsZSlcbiAgfVxuICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFyc2VTdHlsZVRleHQoYmluZGluZ1N0eWxlKVxuICB9XG4gIHJldHVybiBiaW5kaW5nU3R5bGVcbn1cblxuLyoqXG4gKiBwYXJlbnQgY29tcG9uZW50IHN0eWxlIHNob3VsZCBiZSBhZnRlciBjaGlsZCdzXG4gKiBzbyB0aGF0IHBhcmVudCBjb21wb25lbnQncyBzdHlsZSBjb3VsZCBvdmVycmlkZSBpdFxuICovXG5mdW5jdGlvbiBnZXRTdHlsZSAodm5vZGUsIGNoZWNrQ2hpbGQpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgc3R5bGVEYXRhO1xuXG4gIGlmIChjaGVja0NoaWxkKSB7XG4gICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkTm9kZSAmJiBjaGlsZE5vZGUuZGF0YSAmJlxuICAgICAgICAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKGNoaWxkTm9kZS5kYXRhKSlcbiAgICAgICkge1xuICAgICAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkge1xuICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7XG4gIH1cblxuICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlO1xuICB3aGlsZSAoKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHtcbiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHtcbiAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbnZhciBjc3NWYXJSRSA9IC9eLS0vO1xudmFyIGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG52YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoY3NzVmFyUkUudGVzdChuYW1lKSkge1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7XG4gIH0gZWxzZSBpZiAoaW1wb3J0YW50UkUudGVzdCh2YWwpKSB7XG4gICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoaHlwaGVuYXRlKG5hbWUpLCB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgJycpLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIC8vIFN1cHBvcnQgdmFsdWVzIGFycmF5IGNyZWF0ZWQgYnkgYXV0b3ByZWZpeGVyLCBlLmcuXG4gICAgICAvLyB7ZGlzcGxheTogW1wiLXdlYmtpdC1ib3hcIiwgXCItbXMtZmxleGJveFwiLCBcImZsZXhcIl19XG4gICAgICAvLyBTZXQgdGhlbSBvbmUgYnkgb25lLCBhbmQgdGhlIGJyb3dzZXIgd2lsbCBvbmx5IHNldCB0aG9zZSBpdCBjYW4gcmVjb2duaXplXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHZlbmRvck5hbWVzID0gWydXZWJraXQnLCAnTW96JywgJ21zJ107XG5cbnZhciBlbXB0eVN0eWxlO1xudmFyIG5vcm1hbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAocHJvcCkge1xuICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTtcbiAgcHJvcCA9IGNhbWVsaXplKHByb3ApO1xuICBpZiAocHJvcCAhPT0gJ2ZpbHRlcicgJiYgKHByb3AgaW4gZW1wdHlTdHlsZSkpIHtcbiAgICByZXR1cm4gcHJvcFxuICB9XG4gIHZhciBjYXBOYW1lID0gcHJvcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3Auc2xpY2UoMSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbmFtZSA9IHZlbmRvck5hbWVzW2ldICsgY2FwTmFtZTtcbiAgICBpZiAobmFtZSBpbiBlbXB0eVN0eWxlKSB7XG4gICAgICByZXR1cm4gbmFtZVxuICAgIH1cbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgb2xkRGF0YSA9IG9sZFZub2RlLmRhdGE7XG5cbiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJlxuICAgIGlzVW5kZWYob2xkRGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihvbGREYXRhLnN0eWxlKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjdXIsIG5hbWU7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZFN0YXRpY1N0eWxlID0gb2xkRGF0YS5zdGF0aWNTdHlsZTtcbiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307XG5cbiAgLy8gaWYgc3RhdGljIHN0eWxlIGV4aXN0cywgc3R5bGViaW5kaW5nIGFscmVhZHkgbWVyZ2VkIGludG8gaXQgd2hlbiBkb2luZyBub3JtYWxpemVTdHlsZURhdGFcbiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nO1xuXG4gIHZhciBzdHlsZSA9IG5vcm1hbGl6ZVN0eWxlQmluZGluZyh2bm9kZS5kYXRhLnN0eWxlKSB8fCB7fTtcblxuICAvLyBzdG9yZSBub3JtYWxpemVkIHN0eWxlIHVuZGVyIGEgZGlmZmVyZW50IGtleSBmb3IgbmV4dCBkaWZmXG4gIC8vIG1ha2Ugc3VyZSB0byBjbG9uZSBpdCBpZiBpdCdzIHJlYWN0aXZlLCBzaW5jZSB0aGUgdXNlciBsaWtlbHkgd2FudHNcbiAgLy8gdG8gbXV0YXRlIGl0LlxuICB2bm9kZS5kYXRhLm5vcm1hbGl6ZWRTdHlsZSA9IGlzRGVmKHN0eWxlLl9fb2JfXylcbiAgICA/IGV4dGVuZCh7fSwgc3R5bGUpXG4gICAgOiBzdHlsZTtcblxuICB2YXIgbmV3U3R5bGUgPSBnZXRTdHlsZSh2bm9kZSwgdHJ1ZSk7XG5cbiAgZm9yIChuYW1lIGluIG9sZFN0eWxlKSB7XG4gICAgaWYgKGlzVW5kZWYobmV3U3R5bGVbbmFtZV0pKSB7XG4gICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBuZXdTdHlsZSkge1xuICAgIGN1ciA9IG5ld1N0eWxlW25hbWVdO1xuICAgIGlmIChjdXIgIT09IG9sZFN0eWxlW25hbWVdKSB7XG4gICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZ1xuICAgICAgc2V0UHJvcChlbCwgbmFtZSwgY3VyID09IG51bGwgPyAnJyA6IGN1cik7XG4gICAgfVxuICB9XG59XG5cbnZhciBzdHlsZSA9IHtcbiAgY3JlYXRlOiB1cGRhdGVTdHlsZSxcbiAgdXBkYXRlOiB1cGRhdGVTdHlsZVxufTtcblxuLyogICovXG5cbnZhciB3aGl0ZXNwYWNlUkUgPSAvXFxzKy87XG5cbi8qKlxuICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2xzIHx8ICEoY2xzID0gY2xzLnRyaW0oKSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgICBjbHMuc3BsaXQod2hpdGVzcGFjZVJFKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBlbC5jbGFzc0xpc3QuYWRkKGMpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgY3VyID0gXCIgXCIgKyAoZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnKSArIFwiIFwiO1xuICAgIGlmIChjdXIuaW5kZXhPZignICcgKyBjbHMgKyAnICcpIDwgMCkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2xzIHx8ICEoY2xzID0gY2xzLnRyaW0oKSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgICBjbHMuc3BsaXQod2hpdGVzcGFjZVJFKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBlbC5jbGFzc0xpc3QucmVtb3ZlKGMpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgIH1cbiAgICBpZiAoIWVsLmNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1ciA9IFwiIFwiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyBcIiBcIjtcbiAgICB2YXIgdGFyID0gJyAnICsgY2xzICsgJyAnO1xuICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHtcbiAgICAgIGN1ciA9IGN1ci5yZXBsYWNlKHRhciwgJyAnKTtcbiAgICB9XG4gICAgY3VyID0gY3VyLnRyaW0oKTtcbiAgICBpZiAoY3VyKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY3VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24gKGRlZiQkMSkge1xuICBpZiAoIWRlZiQkMSkge1xuICAgIHJldHVyblxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgZGVmJCQxID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBpZiAoZGVmJCQxLmNzcyAhPT0gZmFsc2UpIHtcbiAgICAgIGV4dGVuZChyZXMsIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZiQkMS5uYW1lIHx8ICd2JykpO1xuICAgIH1cbiAgICBleHRlbmQocmVzLCBkZWYkJDEpO1xuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmJCQxID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEpXG4gIH1cbn1cblxudmFyIGF1dG9Dc3NUcmFuc2l0aW9uID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB7XG4gICAgZW50ZXJDbGFzczogKG5hbWUgKyBcIi1lbnRlclwiKSxcbiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgXCItZW50ZXItdG9cIiksXG4gICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1lbnRlci1hY3RpdmVcIiksXG4gICAgbGVhdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZVwiKSxcbiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtdG9cIiksXG4gICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZS1hY3RpdmVcIilcbiAgfVxufSk7XG5cbnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTtcbnZhciBUUkFOU0lUSU9OID0gJ3RyYW5zaXRpb24nO1xudmFyIEFOSU1BVElPTiA9ICdhbmltYXRpb24nO1xuXG4vLyBUcmFuc2l0aW9uIHByb3BlcnR5L2V2ZW50IHNuaWZmaW5nXG52YXIgdHJhbnNpdGlvblByb3AgPSAndHJhbnNpdGlvbic7XG52YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnO1xudmFyIGFuaW1hdGlvblByb3AgPSAnYW5pbWF0aW9uJztcbnZhciBhbmltYXRpb25FbmRFdmVudCA9ICdhbmltYXRpb25lbmQnO1xuaWYgKGhhc1RyYW5zaXRpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh3aW5kb3cub250cmFuc2l0aW9uZW5kID09PSB1bmRlZmluZWQgJiZcbiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgdHJhbnNpdGlvblByb3AgPSAnV2Via2l0VHJhbnNpdGlvbic7XG4gICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICB9XG4gIGlmICh3aW5kb3cub25hbmltYXRpb25lbmQgPT09IHVuZGVmaW5lZCAmJlxuICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFuaW1hdGlvblByb3AgPSAnV2Via2l0QW5pbWF0aW9uJztcbiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnO1xuICB9XG59XG5cbi8vIGJpbmRpbmcgdG8gd2luZG93IGlzIG5lY2Vzc2FyeSB0byBtYWtlIGhvdCByZWxvYWQgd29yayBpbiBJRSBpbiBzdHJpY3QgbW9kZVxudmFyIHJhZiA9IGluQnJvd3NlclxuICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpXG4gICAgOiBzZXRUaW1lb3V0XG4gIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9O1xuXG5mdW5jdGlvbiBuZXh0RnJhbWUgKGZuKSB7XG4gIHJhZihmdW5jdGlvbiAoKSB7XG4gICAgcmFmKGZuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykge1xuICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzLmluZGV4T2YoY2xzKSA8IDApIHtcbiAgICB0cmFuc2l0aW9uQ2xhc3Nlcy5wdXNoKGNscyk7XG4gICAgYWRkQ2xhc3MoZWwsIGNscyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhbnNpdGlvbkNsYXNzIChlbCwgY2xzKSB7XG4gIGlmIChlbC5fdHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpO1xuICB9XG4gIHJlbW92ZUNsYXNzKGVsLCBjbHMpO1xufVxuXG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMgKFxuICBlbCxcbiAgZXhwZWN0ZWRUeXBlLFxuICBjYlxuKSB7XG4gIHZhciByZWYgPSBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKTtcbiAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDtcbiAgdmFyIHByb3BDb3VudCA9IHJlZi5wcm9wQ291bnQ7XG4gIGlmICghdHlwZSkgeyByZXR1cm4gY2IoKSB9XG4gIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDtcbiAgdmFyIGVuZGVkID0gMDtcbiAgdmFyIGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7XG4gICAgY2IoKTtcbiAgfTtcbiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGVsKSB7XG4gICAgICBpZiAoKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgICAgZW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7XG59XG5cbnZhciB0cmFuc2Zvcm1SRSA9IC9cXGIodHJhbnNmb3JtfGFsbCkoLHwkKS87XG5cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIC8vIEpTRE9NIG1heSByZXR1cm4gdW5kZWZpbmVkIGZvciB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgdmFyIHRyYW5zaXRpb25EZWxheXMgPSAoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0RlbGF5J10gfHwgJycpLnNwbGl0KCcsICcpO1xuICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnRHVyYXRpb24nXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciB0cmFuc2l0aW9uVGltZW91dCA9IGdldFRpbWVvdXQodHJhbnNpdGlvbkRlbGF5cywgdHJhbnNpdGlvbkR1cmF0aW9ucyk7XG4gIHZhciBhbmltYXRpb25EZWxheXMgPSAoc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciBhbmltYXRpb25EdXJhdGlvbnMgPSAoc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciBhbmltYXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dChhbmltYXRpb25EZWxheXMsIGFuaW1hdGlvbkR1cmF0aW9ucyk7XG5cbiAgdmFyIHR5cGU7XG4gIHZhciB0aW1lb3V0ID0gMDtcbiAgdmFyIHByb3BDb3VudCA9IDA7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwXG4gICAgICA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dFxuICAgICAgICA/IFRSQU5TSVRJT05cbiAgICAgICAgOiBBTklNQVRJT05cbiAgICAgIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlXG4gICAgICA/IHR5cGUgPT09IFRSQU5TSVRJT05cbiAgICAgICAgPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aFxuICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgIDogMDtcbiAgfVxuICB2YXIgaGFzVHJhbnNmb3JtID1cbiAgICB0eXBlID09PSBUUkFOU0lUSU9OICYmXG4gICAgdHJhbnNmb3JtUkUudGVzdChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnUHJvcGVydHknXSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgIHByb3BDb3VudDogcHJvcENvdW50LFxuICAgIGhhc1RyYW5zZm9ybTogaGFzVHJhbnNmb3JtXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGltZW91dCAoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG5cbiAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGR1cmF0aW9ucy5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKVxuICB9KSlcbn1cblxuLy8gT2xkIHZlcnNpb25zIG9mIENocm9taXVtIChiZWxvdyA2MS4wLjMxNjMuMTAwKSBmb3JtYXRzIGZsb2F0aW5nIHBvaW50ZXIgbnVtYmVyc1xuLy8gaW4gYSBsb2NhbGUtZGVwZW5kZW50IHdheSwgdXNpbmcgYSBjb21tYSBpbnN0ZWFkIG9mIGEgZG90LlxuLy8gSWYgY29tbWEgaXMgbm90IHJlcGxhY2VkIHdpdGggYSBkb3QsIHRoZSBpbnB1dCB3aWxsIGJlIHJvdW5kZWQgZG93biAoaS5lLiBhY3Rpbmdcbi8vIGFzIGEgZmxvb3IgZnVuY3Rpb24pIGNhdXNpbmcgdW5leHBlY3RlZCBiZWhhdmlvcnNcbmZ1bmN0aW9uIHRvTXMgKHMpIHtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKCcsJywgJy4nKSkgKiAxMDAwXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnRlciAodm5vZGUsIHRvZ2dsZURpc3BsYXkpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuXG4gIC8vIGNhbGwgbGVhdmUgY2FsbGJhY2sgbm93XG4gIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHtcbiAgICBlbC5fbGVhdmVDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9sZWF2ZUNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmIChpc1VuZGVmKGRhdGEpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKGVsLl9lbnRlckNiKSB8fCBlbC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNzcyA9IGRhdGEuY3NzO1xuICB2YXIgdHlwZSA9IGRhdGEudHlwZTtcbiAgdmFyIGVudGVyQ2xhc3MgPSBkYXRhLmVudGVyQ2xhc3M7XG4gIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzcztcbiAgdmFyIGVudGVyQWN0aXZlQ2xhc3MgPSBkYXRhLmVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBhcHBlYXJDbGFzcyA9IGRhdGEuYXBwZWFyQ2xhc3M7XG4gIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzO1xuICB2YXIgYXBwZWFyQWN0aXZlQ2xhc3MgPSBkYXRhLmFwcGVhckFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlRW50ZXIgPSBkYXRhLmJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlciA9IGRhdGEuYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkID0gZGF0YS5lbnRlckNhbmNlbGxlZDtcbiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyO1xuICB2YXIgYXBwZWFyID0gZGF0YS5hcHBlYXI7XG4gIHZhciBhZnRlckFwcGVhciA9IGRhdGEuYWZ0ZXJBcHBlYXI7XG4gIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDtcbiAgdmFyIGR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbjtcblxuICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzXG4gIC8vIHRyYW5zaXRpb24uIE9uZSBlZGdlIGNhc2UgdG8gY2hlY2sgaXMgd2hlbiB0aGUgPHRyYW5zaXRpb24+IGlzIHBsYWNlZFxuICAvLyBhcyB0aGUgcm9vdCBub2RlIG9mIGEgY2hpbGQgY29tcG9uZW50LiBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjaGVja1xuICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay5cbiAgdmFyIGNvbnRleHQgPSBhY3RpdmVJbnN0YW5jZTtcbiAgdmFyIHRyYW5zaXRpb25Ob2RlID0gYWN0aXZlSW5zdGFuY2UuJHZub2RlO1xuICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7XG4gICAgY29udGV4dCA9IHRyYW5zaXRpb25Ob2RlLmNvbnRleHQ7XG4gICAgdHJhbnNpdGlvbk5vZGUgPSB0cmFuc2l0aW9uTm9kZS5wYXJlbnQ7XG4gIH1cblxuICB2YXIgaXNBcHBlYXIgPSAhY29udGV4dC5faXNNb3VudGVkIHx8ICF2bm9kZS5pc1Jvb3RJbnNlcnQ7XG5cbiAgaWYgKGlzQXBwZWFyICYmICFhcHBlYXIgJiYgYXBwZWFyICE9PSAnJykge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHN0YXJ0Q2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJDbGFzc1xuICAgID8gYXBwZWFyQ2xhc3NcbiAgICA6IGVudGVyQ2xhc3M7XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzQXBwZWFyICYmIGFwcGVhckFjdGl2ZUNsYXNzXG4gICAgPyBhcHBlYXJBY3RpdmVDbGFzc1xuICAgIDogZW50ZXJBY3RpdmVDbGFzcztcbiAgdmFyIHRvQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJUb0NsYXNzXG4gICAgPyBhcHBlYXJUb0NsYXNzXG4gICAgOiBlbnRlclRvQ2xhc3M7XG5cbiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyXG4gICAgPyAoYmVmb3JlQXBwZWFyIHx8IGJlZm9yZUVudGVyKVxuICAgIDogYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhclxuICAgID8gKHR5cGVvZiBhcHBlYXIgPT09ICdmdW5jdGlvbicgPyBhcHBlYXIgOiBlbnRlcilcbiAgICA6IGVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhclxuICAgID8gKGFmdGVyQXBwZWFyIHx8IGFmdGVyRW50ZXIpXG4gICAgOiBhZnRlckVudGVyO1xuICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXJcbiAgICA/IChhcHBlYXJDYW5jZWxsZWQgfHwgZW50ZXJDYW5jZWxsZWQpXG4gICAgOiBlbnRlckNhbmNlbGxlZDtcblxuICB2YXIgZXhwbGljaXRFbnRlckR1cmF0aW9uID0gdG9OdW1iZXIoXG4gICAgaXNPYmplY3QoZHVyYXRpb24pXG4gICAgICA/IGR1cmF0aW9uLmVudGVyXG4gICAgICA6IGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZXhwbGljaXRFbnRlckR1cmF0aW9uICE9IG51bGwpIHtcbiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpO1xuICB9XG5cbiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTtcbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGVudGVySG9vayk7XG5cbiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCB0b0NsYXNzKTtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIHN0YXJ0Q2xhc3MpO1xuICAgICAgfVxuICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyRW50ZXJIb29rICYmIGFmdGVyRW50ZXJIb29rKGVsKTtcbiAgICB9XG4gICAgZWwuX2VudGVyQ2IgPSBudWxsO1xuICB9KTtcblxuICBpZiAoIXZub2RlLmRhdGEuc2hvdykge1xuICAgIC8vIHJlbW92ZSBwZW5kaW5nIGxlYXZlIGVsZW1lbnQgb24gZW50ZXIgYnkgaW5qZWN0aW5nIGFuIGluc2VydCBob29rXG4gICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcbiAgICAgIHZhciBwZW5kaW5nTm9kZSA9IHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmcgJiYgcGFyZW50Ll9wZW5kaW5nW3Zub2RlLmtleV07XG4gICAgICBpZiAocGVuZGluZ05vZGUgJiZcbiAgICAgICAgcGVuZGluZ05vZGUudGFnID09PSB2bm9kZS50YWcgJiZcbiAgICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiKCk7XG4gICAgICB9XG4gICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzdGFydCBlbnRlciB0cmFuc2l0aW9uXG4gIGJlZm9yZUVudGVySG9vayAmJiBiZWZvcmVFbnRlckhvb2soZWwpO1xuICBpZiAoZXhwZWN0c0NTUykge1xuICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7XG4gICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhY3RpdmVDbGFzcyk7XG4gICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7XG4gICAgICBpZiAoIWNiLmNhbmNlbGxlZCkge1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpO1xuICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZER1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbikpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHZub2RlLmRhdGEuc2hvdykge1xuICAgIHRvZ2dsZURpc3BsYXkgJiYgdG9nZ2xlRGlzcGxheSgpO1xuICAgIGVudGVySG9vayAmJiBlbnRlckhvb2soZWwsIGNiKTtcbiAgfVxuXG4gIGlmICghZXhwZWN0c0NTUyAmJiAhdXNlcldhbnRzQ29udHJvbCkge1xuICAgIGNiKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVhdmUgKHZub2RlLCBybSkge1xuICB2YXIgZWwgPSB2bm9kZS5lbG07XG5cbiAgLy8gY2FsbCBlbnRlciBjYWxsYmFjayBub3dcbiAgaWYgKGlzRGVmKGVsLl9lbnRlckNiKSkge1xuICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgZWwuX2VudGVyQ2IoKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gcmVzb2x2ZVRyYW5zaXRpb24odm5vZGUuZGF0YS50cmFuc2l0aW9uKTtcbiAgaWYgKGlzVW5kZWYoZGF0YSkgfHwgZWwubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gcm0oKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjc3MgPSBkYXRhLmNzcztcbiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7XG4gIHZhciBsZWF2ZUNsYXNzID0gZGF0YS5sZWF2ZUNsYXNzO1xuICB2YXIgbGVhdmVUb0NsYXNzID0gZGF0YS5sZWF2ZVRvQ2xhc3M7XG4gIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlTGVhdmUgPSBkYXRhLmJlZm9yZUxlYXZlO1xuICB2YXIgbGVhdmUgPSBkYXRhLmxlYXZlO1xuICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTtcbiAgdmFyIGxlYXZlQ2FuY2VsbGVkID0gZGF0YS5sZWF2ZUNhbmNlbGxlZDtcbiAgdmFyIGRlbGF5TGVhdmUgPSBkYXRhLmRlbGF5TGVhdmU7XG4gIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247XG5cbiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTtcbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTtcblxuICB2YXIgZXhwbGljaXRMZWF2ZUR1cmF0aW9uID0gdG9OdW1iZXIoXG4gICAgaXNPYmplY3QoZHVyYXRpb24pXG4gICAgICA/IGR1cmF0aW9uLmxlYXZlXG4gICAgICA6IGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkge1xuICAgIGNoZWNrRHVyYXRpb24oZXhwbGljaXRMZWF2ZUR1cmF0aW9uLCAnbGVhdmUnLCB2bm9kZSk7XG4gIH1cblxuICB2YXIgY2IgPSBlbC5fbGVhdmVDYiA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUuX3BlbmRpbmcpIHtcbiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpO1xuICAgICAgfVxuICAgICAgbGVhdmVDYW5jZWxsZWQgJiYgbGVhdmVDYW5jZWxsZWQoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBybSgpO1xuICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKGVsKTtcbiAgICB9XG4gICAgZWwuX2xlYXZlQ2IgPSBudWxsO1xuICB9KTtcblxuICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgIGRlbGF5TGVhdmUocGVyZm9ybUxlYXZlKTtcbiAgfSBlbHNlIHtcbiAgICBwZXJmb3JtTGVhdmUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7XG4gICAgLy8gdGhlIGRlbGF5ZWQgbGVhdmUgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZFxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyByZWNvcmQgbGVhdmluZyBlbGVtZW50XG4gICAgaWYgKCF2bm9kZS5kYXRhLnNob3cgJiYgZWwucGFyZW50Tm9kZSkge1xuICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlO1xuICAgIH1cbiAgICBiZWZvcmVMZWF2ZSAmJiBiZWZvcmVMZWF2ZShlbCk7XG4gICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTtcbiAgICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHtcbiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgICAgaWYgKCF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZER1cmF0aW9uKGV4cGxpY2l0TGVhdmVEdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxlYXZlICYmIGxlYXZlKGVsLCBjYik7XG4gICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGVcbmZ1bmN0aW9uIGNoZWNrRHVyYXRpb24gKHZhbCwgbmFtZSwgdm5vZGUpIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIFwiICtcbiAgICAgIFwiZ290IFwiICsgKEpTT04uc3RyaW5naWZ5KHZhbCkpICsgXCIuXCIsXG4gICAgICB2bm9kZS5jb250ZXh0XG4gICAgKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIE5hTiAtIFwiICtcbiAgICAgICd0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuJyxcbiAgICAgIHZub2RlLmNvbnRleHRcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWREdXJhdGlvbiAodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHRyYW5zaXRpb24gaG9vaydzIGFyZ3VtZW50IGxlbmd0aC4gVGhlIGhvb2sgbWF5IGJlOlxuICogLSBhIG1lcmdlZCBob29rIChpbnZva2VyKSB3aXRoIHRoZSBvcmlnaW5hbCBpbiAuZm5zXG4gKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aClcbiAqIC0gYSBwbGFpbiBmdW5jdGlvbiAoLmxlbmd0aClcbiAqL1xuZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHtcbiAgaWYgKGlzVW5kZWYoZm4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgdmFyIGludm9rZXJGbnMgPSBmbi5mbnM7XG4gIGlmIChpc0RlZihpbnZva2VyRm5zKSkge1xuICAgIC8vIGludm9rZXJcbiAgICByZXR1cm4gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aChcbiAgICAgIEFycmF5LmlzQXJyYXkoaW52b2tlckZucylcbiAgICAgICAgPyBpbnZva2VyRm5zWzBdXG4gICAgICAgIDogaW52b2tlckZuc1xuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGZuLl9sZW5ndGggfHwgZm4ubGVuZ3RoKSA+IDFcbiAgfVxufVxuXG5mdW5jdGlvbiBfZW50ZXIgKF8sIHZub2RlKSB7XG4gIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHtcbiAgICBlbnRlcih2bm9kZSk7XG4gIH1cbn1cblxudmFyIHRyYW5zaXRpb24gPSBpbkJyb3dzZXIgPyB7XG4gIGNyZWF0ZTogX2VudGVyLFxuICBhY3RpdmF0ZTogX2VudGVyLFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSQkMSAodm5vZGUsIHJtKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodm5vZGUuZGF0YS5zaG93ICE9PSB0cnVlKSB7XG4gICAgICBsZWF2ZSh2bm9kZSwgcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBybSgpO1xuICAgIH1cbiAgfVxufSA6IHt9O1xuXG52YXIgcGxhdGZvcm1Nb2R1bGVzID0gW1xuICBhdHRycyxcbiAga2xhc3MsXG4gIGV2ZW50cyxcbiAgZG9tUHJvcHMsXG4gIHN0eWxlLFxuICB0cmFuc2l0aW9uXG5dO1xuXG4vKiAgKi9cblxuLy8gdGhlIGRpcmVjdGl2ZSBtb2R1bGUgc2hvdWxkIGJlIGFwcGxpZWQgbGFzdCwgYWZ0ZXIgYWxsXG4vLyBidWlsdC1pbiBtb2R1bGVzIGhhdmUgYmVlbiBhcHBsaWVkLlxudmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTtcblxudmFyIHBhdGNoID0gY3JlYXRlUGF0Y2hGdW5jdGlvbih7IG5vZGVPcHM6IG5vZGVPcHMsIG1vZHVsZXM6IG1vZHVsZXMgfSk7XG5cbi8qKlxuICogTm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IGxpa2UgYXR0YWNoaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLlxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKGlzSUU5KSB7XG4gIC8vIGh0dHA6Ly93d3cubWF0dHM0MTEuY29tL3Bvc3QvaW50ZXJuZXQtZXhwbG9yZXItOS1vbmlucHV0L1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAoZWwgJiYgZWwudm1vZGVsKSB7XG4gICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTtcbiAgICB9XG4gIH0pO1xufVxuXG52YXIgZGlyZWN0aXZlID0ge1xuICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHtcbiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gIzY5MDNcbiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdwb3N0cGF0Y2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlyZWN0aXZlLmNvbXBvbmVudFVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm5vZGUuY29udGV4dCk7XG4gICAgICB9XG4gICAgICBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09ICd0ZXh0YXJlYScgfHwgaXNUZXh0SW5wdXRUeXBlKGVsLnR5cGUpKSB7XG4gICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzO1xuICAgICAgaWYgKCFiaW5kaW5nLm1vZGlmaWVycy5sYXp5KSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBvc2l0aW9uc3RhcnQnLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgICAvLyBTYWZhcmkgPCAxMC4yICYgVUlXZWJWaWV3IGRvZXNuJ3QgZmlyZSBjb21wb3NpdGlvbmVuZCB3aGVuXG4gICAgICAgIC8vIHN3aXRjaGluZyBmb2N1cyBiZWZvcmUgY29uZmlybWluZyBjb21wb3NpdGlvbiBjaG9pY2VcbiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZVxuICAgICAgICAvLyBmaXJlcyBcImNoYW5nZVwiIGluc3RlYWQgb2YgXCJpbnB1dFwiIG9uIGF1dG9jb21wbGV0ZS5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXNJRTkpIHtcbiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICBzZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm5vZGUuY29udGV4dCk7XG4gICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCxcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdmFsdWUgaXMgb3V0LW9mLXN5bmMgd2l0aCB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAgICAgIC8vIGRldGVjdCBzdWNoIGNhc2VzIGFuZCBmaWx0ZXIgb3V0IHZhbHVlcyB0aGF0IG5vIGxvbmdlciBoYXMgYSBtYXRjaGluZ1xuICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uXG4gICAgICB2YXIgcHJldk9wdGlvbnMgPSBlbC5fdk9wdGlvbnM7XG4gICAgICB2YXIgY3VyT3B0aW9ucyA9IGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTtcbiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHtcbiAgICAgICAgLy8gdHJpZ2dlciBjaGFuZ2UgZXZlbnQgaWZcbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGZvciBhdCBsZWFzdCBvbmUgdmFsdWVcbiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlXG4gICAgICAgICAgPyBiaW5kaW5nLnZhbHVlLnNvbWUoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIGhhc05vTWF0Y2hpbmdPcHRpb24odiwgY3VyT3B0aW9ucyk7IH0pXG4gICAgICAgICAgOiBiaW5kaW5nLnZhbHVlICE9PSBiaW5kaW5nLm9sZFZhbHVlICYmIGhhc05vTWF0Y2hpbmdPcHRpb24oYmluZGluZy52YWx1ZSwgY3VyT3B0aW9ucyk7XG4gICAgICAgIGlmIChuZWVkUmVzZXQpIHtcbiAgICAgICAgICB0cmlnZ2VyKGVsLCAnY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFNlbGVjdGVkIChlbCwgYmluZGluZywgdm0pIHtcbiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzSUUgfHwgaXNFZGdlKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBhY3R1YWxseVNldFNlbGVjdGVkKGVsLCBiaW5kaW5nLCB2bSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7XG4gIHZhciB2YWx1ZSA9IGJpbmRpbmcudmFsdWU7XG4gIHZhciBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiPHNlbGVjdCBtdWx0aXBsZSB2LW1vZGVsPVxcXCJcIiArIChiaW5kaW5nLmV4cHJlc3Npb24pICsgXCJcXFwiPiBcIiArXG4gICAgICBcImV4cGVjdHMgYW4gQXJyYXkgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290IFwiICsgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpKSxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VsZWN0ZWQsIG9wdGlvbjtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbC5vcHRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIHNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBnZXRWYWx1ZShvcHRpb24pKSA+IC0xO1xuICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsb29zZUVxdWFsKGdldFZhbHVlKG9wdGlvbiksIHZhbHVlKSkge1xuICAgICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSkge1xuICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWlzTXVsdGlwbGUpIHtcbiAgICBlbC5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzTm9NYXRjaGluZ09wdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSlcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikge1xuICByZXR1cm4gJ192YWx1ZScgaW4gb3B0aW9uXG4gICAgPyBvcHRpb24uX3ZhbHVlXG4gICAgOiBvcHRpb24udmFsdWVcbn1cblxuZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25FbmQgKGUpIHtcbiAgLy8gcHJldmVudCB0cmlnZ2VyaW5nIGFuIGlucHV0IGV2ZW50IGZvciBubyByZWFzb25cbiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgZS50YXJnZXQuY29tcG9zaW5nID0gZmFsc2U7XG4gIHRyaWdnZXIoZS50YXJnZXQsICdpbnB1dCcpO1xufVxuXG5mdW5jdGlvbiB0cmlnZ2VyIChlbCwgdHlwZSkge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gIGUuaW5pdEV2ZW50KHR5cGUsIHRydWUsIHRydWUpO1xuICBlbC5kaXNwYXRjaEV2ZW50KGUpO1xufVxuXG4vKiAgKi9cblxuLy8gcmVjdXJzaXZlbHkgc2VhcmNoIGZvciBwb3NzaWJsZSB0cmFuc2l0aW9uIGRlZmluZWQgaW5zaWRlIHRoZSBjb21wb25lbnQgcm9vdFxuZnVuY3Rpb24gbG9jYXRlTm9kZSAodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKVxuICAgID8gbG9jYXRlTm9kZSh2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpXG4gICAgOiB2bm9kZVxufVxuXG52YXIgc2hvdyA9IHtcbiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSByZWYudmFsdWU7XG5cbiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpO1xuICAgIHZhciB0cmFuc2l0aW9uJCQxID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLnRyYW5zaXRpb247XG4gICAgdmFyIG9yaWdpbmFsRGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheSA9XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7XG4gICAgaWYgKHZhbHVlICYmIHRyYW5zaXRpb24kJDEpIHtcbiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IG9yaWdpbmFsRGlzcGxheSA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUgKGVsLCByZWYsIHZub2RlKSB7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuICAgIHZhciBvbGRWYWx1ZSA9IHJlZi5vbGRWYWx1ZTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSkgeyByZXR1cm4gfVxuICAgIHZub2RlID0gbG9jYXRlTm9kZSh2bm9kZSk7XG4gICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjtcbiAgICBpZiAodHJhbnNpdGlvbiQkMSkge1xuICAgICAgdm5vZGUuZGF0YS5zaG93ID0gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVhdmUodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWwuX192T3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnO1xuICAgIH1cbiAgfSxcblxuICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCAoXG4gICAgZWwsXG4gICAgYmluZGluZyxcbiAgICB2bm9kZSxcbiAgICBvbGRWbm9kZSxcbiAgICBpc0Rlc3Ryb3lcbiAgKSB7XG4gICAgaWYgKCFpc0Rlc3Ryb3kpIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgcGxhdGZvcm1EaXJlY3RpdmVzID0ge1xuICBtb2RlbDogZGlyZWN0aXZlLFxuICBzaG93OiBzaG93XG59O1xuXG4vKiAgKi9cblxudmFyIHRyYW5zaXRpb25Qcm9wcyA9IHtcbiAgbmFtZTogU3RyaW5nLFxuICBhcHBlYXI6IEJvb2xlYW4sXG4gIGNzczogQm9vbGVhbixcbiAgbW9kZTogU3RyaW5nLFxuICB0eXBlOiBTdHJpbmcsXG4gIGVudGVyQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVDbGFzczogU3RyaW5nLFxuICBlbnRlclRvQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJDbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGR1cmF0aW9uOiBbTnVtYmVyLCBTdHJpbmcsIE9iamVjdF1cbn07XG5cbi8vIGluIGNhc2UgdGhlIGNoaWxkIGlzIGFsc28gYW4gYWJzdHJhY3QgY29tcG9uZW50LCBlLmcuIDxrZWVwLWFsaXZlPlxuLy8gd2Ugd2FudCB0byByZWN1cnNpdmVseSByZXRyaWV2ZSB0aGUgcmVhbCBjb21wb25lbnQgdG8gYmUgcmVuZGVyZWRcbmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHtcbiAgdmFyIGNvbXBPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgaWYgKGNvbXBPcHRpb25zICYmIGNvbXBPcHRpb25zLkN0b3Iub3B0aW9ucy5hYnN0cmFjdCkge1xuICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7XG4gIHZhciBkYXRhID0ge307XG4gIHZhciBvcHRpb25zID0gY29tcC4kb3B0aW9ucztcbiAgLy8gcHJvcHNcbiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMucHJvcHNEYXRhKSB7XG4gICAgZGF0YVtrZXldID0gY29tcFtrZXldO1xuICB9XG4gIC8vIGV2ZW50cy5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMgYW5kIHBhc3MgdGhlbSBkaXJlY3RseSB0byB0aGUgdHJhbnNpdGlvbiBtZXRob2RzXG4gIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIGZvciAodmFyIGtleSQxIGluIGxpc3RlbmVycykge1xuICAgIGRhdGFbY2FtZWxpemUoa2V5JDEpXSA9IGxpc3RlbmVyc1trZXkkMV07XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuZnVuY3Rpb24gcGxhY2Vob2xkZXIgKGgsIHJhd0NoaWxkKSB7XG4gIGlmICgvXFxkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHtcbiAgICByZXR1cm4gaCgna2VlcC1hbGl2ZScsIHtcbiAgICAgIHByb3BzOiByYXdDaGlsZC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUGFyZW50VHJhbnNpdGlvbiAodm5vZGUpIHtcbiAgd2hpbGUgKCh2bm9kZSA9IHZub2RlLnBhcmVudCkpIHtcbiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7XG4gIHJldHVybiBvbGRDaGlsZC5rZXkgPT09IGNoaWxkLmtleSAmJiBvbGRDaGlsZC50YWcgPT09IGNoaWxkLnRhZ1xufVxuXG52YXIgaXNOb3RUZXh0Tm9kZSA9IGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH07XG5cbnZhciBpc1ZTaG93RGlyZWN0aXZlID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQubmFtZSA9PT0gJ3Nob3cnOyB9O1xuXG52YXIgVHJhbnNpdGlvbiA9IHtcbiAgbmFtZTogJ3RyYW5zaXRpb24nLFxuICBwcm9wczogdHJhbnNpdGlvblByb3BzLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHRleHQgbm9kZXMgKHBvc3NpYmxlIHdoaXRlc3BhY2VzKVxuICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGlzTm90VGV4dE5vZGUpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgd2FybihcbiAgICAgICAgJzx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQuIFVzZSAnICtcbiAgICAgICAgJzx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuJyxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBtb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgLy8gd2FybiBpbnZhbGlkIG1vZGVcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJ1xuICAgICkge1xuICAgICAgd2FybihcbiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLFxuICAgICAgICB0aGlzLiRwYXJlbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHJhd0NoaWxkID0gY2hpbGRyZW5bMF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgY29tcG9uZW50IHJvb3Qgbm9kZSBhbmQgdGhlIGNvbXBvbmVudCdzXG4gICAgLy8gcGFyZW50IGNvbnRhaW5lciBub2RlIGFsc28gaGFzIHRyYW5zaXRpb24sIHNraXAuXG4gICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0cmFuc2l0aW9uIGRhdGEgdG8gY2hpbGRcbiAgICAvLyB1c2UgZ2V0UmVhbENoaWxkKCkgdG8gaWdub3JlIGFic3RyYWN0IGNvbXBvbmVudHMgZS5nLiBrZWVwLWFsaXZlXG4gICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGVhdmluZykge1xuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKVxuICAgIH1cblxuICAgIC8vIGVuc3VyZSBhIGtleSB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdm5vZGUgdHlwZSBhbmQgdG8gdGhpcyB0cmFuc2l0aW9uXG4gICAgLy8gY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgdG8gcmVtb3ZlIHBlbmRpbmcgbGVhdmluZyBub2Rlc1xuICAgIC8vIGR1cmluZyBlbnRlcmluZy5cbiAgICB2YXIgaWQgPSBcIl9fdHJhbnNpdGlvbi1cIiArICh0aGlzLl91aWQpICsgXCItXCI7XG4gICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGxcbiAgICAgID8gY2hpbGQuaXNDb21tZW50XG4gICAgICAgID8gaWQgKyAnY29tbWVudCdcbiAgICAgICAgOiBpZCArIGNoaWxkLnRhZ1xuICAgICAgOiBpc1ByaW1pdGl2ZShjaGlsZC5rZXkpXG4gICAgICAgID8gKFN0cmluZyhjaGlsZC5rZXkpLmluZGV4T2YoaWQpID09PSAwID8gY2hpbGQua2V5IDogaWQgKyBjaGlsZC5rZXkpXG4gICAgICAgIDogY2hpbGQua2V5O1xuXG4gICAgdmFyIGRhdGEgPSAoY2hpbGQuZGF0YSB8fCAoY2hpbGQuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IGV4dHJhY3RUcmFuc2l0aW9uRGF0YSh0aGlzKTtcbiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTtcbiAgICB2YXIgb2xkQ2hpbGQgPSBnZXRSZWFsQ2hpbGQob2xkUmF3Q2hpbGQpO1xuXG4gICAgLy8gbWFyayB2LXNob3dcbiAgICAvLyBzbyB0aGF0IHRoZSB0cmFuc2l0aW9uIG1vZHVsZSBjYW4gaGFuZCBvdmVyIHRoZSBjb250cm9sIHRvIHRoZSBkaXJlY3RpdmVcbiAgICBpZiAoY2hpbGQuZGF0YS5kaXJlY3RpdmVzICYmIGNoaWxkLmRhdGEuZGlyZWN0aXZlcy5zb21lKGlzVlNob3dEaXJlY3RpdmUpKSB7XG4gICAgICBjaGlsZC5kYXRhLnNob3cgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9sZENoaWxkICYmXG4gICAgICBvbGRDaGlsZC5kYXRhICYmXG4gICAgICAhaXNTYW1lQ2hpbGQoY2hpbGQsIG9sZENoaWxkKSAmJlxuICAgICAgIWlzQXN5bmNQbGFjZWhvbGRlcihvbGRDaGlsZCkgJiZcbiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlXG4gICAgICAhKG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlICYmIG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpXG4gICAgKSB7XG4gICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmVcbiAgICAgIC8vIGltcG9ydGFudCBmb3IgZHluYW1pYyB0cmFuc2l0aW9ucyFcbiAgICAgIHZhciBvbGREYXRhID0gb2xkQ2hpbGQuZGF0YS50cmFuc2l0aW9uID0gZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn07XG5cbi8qICAqL1xuXG52YXIgcHJvcHMgPSBleHRlbmQoe1xuICB0YWc6IFN0cmluZyxcbiAgbW92ZUNsYXNzOiBTdHJpbmdcbn0sIHRyYW5zaXRpb25Qcm9wcyk7XG5cbmRlbGV0ZSBwcm9wcy5tb2RlO1xuXG52YXIgVHJhbnNpdGlvbkdyb3VwID0ge1xuICBwcm9wczogcHJvcHMsXG5cbiAgYmVmb3JlTW91bnQ6IGZ1bmN0aW9uIGJlZm9yZU1vdW50ICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB1cGRhdGUgPSB0aGlzLl91cGRhdGU7XG4gICAgdGhpcy5fdXBkYXRlID0gZnVuY3Rpb24gKHZub2RlLCBoeWRyYXRpbmcpIHtcbiAgICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh0aGlzJDEpO1xuICAgICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzc1xuICAgICAgdGhpcyQxLl9fcGF0Y2hfXyhcbiAgICAgICAgdGhpcyQxLl92bm9kZSxcbiAgICAgICAgdGhpcyQxLmtlcHQsXG4gICAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmdcbiAgICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpXG4gICAgICApO1xuICAgICAgdGhpcyQxLl92bm9kZSA9IHRoaXMkMS5rZXB0O1xuICAgICAgcmVzdG9yZUFjdGl2ZUluc3RhbmNlKCk7XG4gICAgICB1cGRhdGUuY2FsbCh0aGlzJDEsIHZub2RlLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGFnID0gdGhpcy50YWcgfHwgdGhpcy4kdm5vZGUuZGF0YS50YWcgfHwgJ3NwYW4nO1xuICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgdmFyIHJhd0NoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXTtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTtcbiAgICAgIGlmIChjLnRhZykge1xuICAgICAgICBpZiAoYy5rZXkgIT0gbnVsbCAmJiBTdHJpbmcoYy5rZXkpLmluZGV4T2YoJ19fdmxpc3QnKSAhPT0gMCkge1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7XG4gICAgICAgICAgbWFwW2Mua2V5XSA9IGNcbiAgICAgICAgICA7KGMuZGF0YSB8fCAoYy5kYXRhID0ge30pKS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbkRhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBvcHRzID0gYy5jb21wb25lbnRPcHRpb25zO1xuICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnO1xuICAgICAgICAgIHdhcm4oKFwiPHRyYW5zaXRpb24tZ3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQ6IDxcIiArIG5hbWUgKyBcIj5cIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIGtlcHQgPSBbXTtcbiAgICAgIHZhciByZW1vdmVkID0gW107XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBwcmV2Q2hpbGRyZW4ubGVuZ3RoOyBpJDErKykge1xuICAgICAgICB2YXIgYyQxID0gcHJldkNoaWxkcmVuW2kkMV07XG4gICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgYyQxLmRhdGEucG9zID0gYyQxLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKG1hcFtjJDEua2V5XSkge1xuICAgICAgICAgIGtlcHQucHVzaChjJDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQucHVzaChjJDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7XG4gICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkO1xuICAgIH1cblxuICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pXG4gIH0sXG5cbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcmV2Q2hpbGRyZW47XG4gICAgdmFyIG1vdmVDbGFzcyA9IHRoaXMubW92ZUNsYXNzIHx8ICgodGhpcy5uYW1lIHx8ICd2JykgKyAnLW1vdmUnKTtcbiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2UgZGl2aWRlIHRoZSB3b3JrIGludG8gdGhyZWUgbG9vcHMgdG8gYXZvaWQgbWl4aW5nIERPTSByZWFkcyBhbmQgd3JpdGVzXG4gICAgLy8gaW4gZWFjaCBpdGVyYXRpb24gLSB3aGljaCBoZWxwcyBwcmV2ZW50IGxheW91dCB0aHJhc2hpbmcuXG4gICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChhcHBseVRyYW5zbGF0aW9uKTtcblxuICAgIC8vIGZvcmNlIHJlZmxvdyB0byBwdXQgZXZlcnl0aGluZyBpbiBwb3NpdGlvblxuICAgIC8vIGFzc2lnbiB0byB0aGlzIHRvIGF2b2lkIGJlaW5nIHJlbW92ZWQgaW4gdHJlZS1zaGFraW5nXG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgdGhpcy5fcmVmbG93ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XG5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYy5kYXRhLm1vdmVkKSB7XG4gICAgICAgIHZhciBlbCA9IGMuZWxtO1xuICAgICAgICB2YXIgcyA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSBzLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcnO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlIHx8IC90cmFuc2Zvcm0kLy50ZXN0KGUucHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kRXZlbnQsIGNiKTtcbiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFoYXNUcmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGhpcy5faGFzTW92ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzTW92ZVxuICAgICAgfVxuICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzXG4gICAgICAvLyBDU1MgdHJhbnNpdGlvbnMuIFNpbmNlIHRoZSBlbGVtZW50IG1heSBiZSBpbnNpZGUgYW4gZW50ZXJpbmdcbiAgICAgIC8vIHRyYW5zaXRpb24gYXQgdGhpcyB2ZXJ5IG1vbWVudCwgd2UgbWFrZSBhIGNsb25lIG9mIGl0IGFuZCByZW1vdmVcbiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzc1xuICAgICAgLy8gaXMgYXBwbGllZC5cbiAgICAgIHZhciBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3Nlcykge1xuICAgICAgICBlbC5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xzKSB7IHJlbW92ZUNsYXNzKGNsb25lLCBjbHMpOyB9KTtcbiAgICAgIH1cbiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpO1xuICAgICAgY2xvbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuJGVsLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICAgICAgdGhpcy4kZWwucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgcmV0dXJuICh0aGlzLl9oYXNNb3ZlID0gaW5mby5oYXNUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHtcbiAgICBjLmVsbS5fbW92ZUNiKCk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChjLmVsbS5fZW50ZXJDYikge1xuICAgIGMuZWxtLl9lbnRlckNiKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24gKGMpIHtcbiAgYy5kYXRhLm5ld1BvcyA9IGMuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uIChjKSB7XG4gIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zO1xuICB2YXIgbmV3UG9zID0gYy5kYXRhLm5ld1BvcztcbiAgdmFyIGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGMuZGF0YS5tb3ZlZCA9IHRydWU7XG4gICAgdmFyIHMgPSBjLmVsbS5zdHlsZTtcbiAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyBkeCArIFwicHgsXCIgKyBkeSArIFwicHgpXCI7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnMHMnO1xuICB9XG59XG5cbnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7XG4gIFRyYW5zaXRpb246IFRyYW5zaXRpb24sXG4gIFRyYW5zaXRpb25Hcm91cDogVHJhbnNpdGlvbkdyb3VwXG59O1xuXG4vKiAgKi9cblxuLy8gaW5zdGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyB1dGlsc1xuVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wO1xuVnVlLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gaXNSZXNlcnZlZFRhZztcblZ1ZS5jb25maWcuaXNSZXNlcnZlZEF0dHIgPSBpc1Jlc2VydmVkQXR0cjtcblZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlO1xuVnVlLmNvbmZpZy5pc1Vua25vd25FbGVtZW50ID0gaXNVbmtub3duRWxlbWVudDtcblxuLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzXG5leHRlbmQoVnVlLm9wdGlvbnMuZGlyZWN0aXZlcywgcGxhdGZvcm1EaXJlY3RpdmVzKTtcbmV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBwbGF0Zm9ybUNvbXBvbmVudHMpO1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHBhdGNoIGZ1bmN0aW9uXG5WdWUucHJvdG90eXBlLl9fcGF0Y2hfXyA9IGluQnJvd3NlciA/IHBhdGNoIDogbm9vcDtcblxuLy8gcHVibGljIG1vdW50IG1ldGhvZFxuVnVlLnByb3RvdHlwZS4kbW91bnQgPSBmdW5jdGlvbiAoXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vdW50Q29tcG9uZW50KHRoaXMsIGVsLCBoeWRyYXRpbmcpXG59O1xuXG4vLyBkZXZ0b29scyBnbG9iYWwgaG9va1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpbkJyb3dzZXIpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNvbmZpZy5kZXZ0b29scykge1xuICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgIGRldnRvb2xzLmVtaXQoJ2luaXQnLCBWdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oXG4gICAgICAgICAgJ0Rvd25sb2FkIHRoZSBWdWUgRGV2dG9vbHMgZXh0ZW5zaW9uIGZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOlxcbicgK1xuICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJlxuICAgICAgY29uZmlnLnByb2R1Y3Rpb25UaXAgIT09IGZhbHNlICYmXG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIGNvbnNvbGVbY29uc29sZS5pbmZvID8gJ2luZm8nIDogJ2xvZyddKFxuICAgICAgICBcIllvdSBhcmUgcnVubmluZyBWdWUgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cXG5cIiArXG4gICAgICAgIFwiTWFrZSBzdXJlIHRvIHR1cm4gb24gcHJvZHVjdGlvbiBtb2RlIHdoZW4gZGVwbG95aW5nIGZvciBwcm9kdWN0aW9uLlxcblwiICtcbiAgICAgICAgXCJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbFwiXG4gICAgICApO1xuICAgIH1cbiAgfSwgMCk7XG59XG5cbi8qICAqL1xuXG5leHBvcnQgZGVmYXVsdCBWdWU7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\n");
/***/ }),
/***/ "./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js":
/*!********************************************************!*\
!*** ./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js ***!
\********************************************************/
/*! exports provided: default, Store, install, mapState, mapMutations, mapGetters, mapActions, createNamespacedHelpers */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Store\", function() { return Store; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"install\", function() { return install; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapState\", function() { return mapState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapMutations\", function() { return mapMutations; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapGetters\", function() { return mapGetters; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapActions\", function() { return mapActions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespacedHelpers\", function() { return createNamespacedHelpers; });\n/**\n * vuex v3.1.1\n * (c) 2019 Evan You\n * @license MIT\n */\nfunction applyMixin (Vue) {\n var version = Number(Vue.version.split('.')[0]);\n\n if (version >= 2) {\n Vue.mixin({ beforeCreate: vuexInit });\n } else {\n // override init and inject vuex init procedure\n // for 1.x backwards compatibility.\n var _init = Vue.prototype._init;\n Vue.prototype._init = function (options) {\n if ( options === void 0 ) options = {};\n\n options.init = options.init\n ? [vuexInit].concat(options.init)\n : vuexInit;\n _init.call(this, options);\n };\n }\n\n /**\n * Vuex init hook, injected into each instances init hooks list.\n */\n\n function vuexInit () {\n var options = this.$options;\n // store injection\n if (options.store) {\n this.$store = typeof options.store === 'function'\n ? options.store()\n : options.store;\n } else if (options.parent && options.parent.$store) {\n this.$store = options.parent.$store;\n }\n }\n}\n\nvar target = typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n if (!devtoolHook) { return }\n\n store._devtoolHook = devtoolHook;\n\n devtoolHook.emit('vuex:init', store);\n\n devtoolHook.on('vuex:travel-to-state', function (targetState) {\n store.replaceState(targetState);\n });\n\n store.subscribe(function (mutation, state) {\n devtoolHook.emit('vuex:mutation', mutation, state);\n });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n return function () {\n return fn(arg)\n }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n this.runtime = runtime;\n // Store some children item\n this._children = Object.create(null);\n // Store the origin module object which passed by programmer\n this._rawModule = rawModule;\n var rawState = rawModule.state;\n\n // Store the origin module's state\n this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors = { namespaced: { configurable: true } };\n\nprototypeAccessors.namespaced.get = function () {\n return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n return this._children[key]\n};\n\nModule.prototype.update = function update (rawModule) {\n this._rawModule.namespaced = rawModule.namespaced;\n if (rawModule.actions) {\n this._rawModule.actions = rawModule.actions;\n }\n if (rawModule.mutations) {\n this._rawModule.mutations = rawModule.mutations;\n }\n if (rawModule.getters) {\n this._rawModule.getters = rawModule.getters;\n }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n if (this._rawModule.getters) {\n forEachValue(this._rawModule.getters, fn);\n }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n if (this._rawModule.actions) {\n forEachValue(this._rawModule.actions, fn);\n }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n if (this._rawModule.mutations) {\n forEachValue(this._rawModule.mutations, fn);\n }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n // register root module (Vuex.Store options)\n this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n return path.reduce(function (module, key) {\n return module.getChild(key)\n }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n var module = this.root;\n return path.reduce(function (namespace, key) {\n module = module.getChild(key);\n return namespace + (module.namespaced ? key + '/' : '')\n }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n var this$1 = this;\n if ( runtime === void 0 ) runtime = true;\n\n if (true) {\n assertRawModule(path, rawModule);\n }\n\n var newModule = new Module(rawModule, runtime);\n if (path.length === 0) {\n this.root = newModule;\n } else {\n var parent = this.get(path.slice(0, -1));\n parent.addChild(path[path.length - 1], newModule);\n }\n\n // register nested modules\n if (rawModule.modules) {\n forEachValue(rawModule.modules, function (rawChildModule, key) {\n this$1.register(path.concat(key), rawChildModule, runtime);\n });\n }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n if (!parent.getChild(key).runtime) { return }\n\n parent.removeChild(key);\n};\n\nfunction update (path, targetModule, newModule) {\n if (true) {\n assertRawModule(path, newModule);\n }\n\n // update target module\n targetModule.update(newModule);\n\n // update nested modules\n if (newModule.modules) {\n for (var key in newModule.modules) {\n if (!targetModule.getChild(key)) {\n if (true) {\n console.warn(\n \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n 'manual reload is needed'\n );\n }\n return\n }\n update(\n path.concat(key),\n targetModule.getChild(key),\n newModule.modules[key]\n );\n }\n }\n}\n\nvar functionAssert = {\n assert: function (value) { return typeof value === 'function'; },\n expected: 'function'\n};\n\nvar objectAssert = {\n assert: function (value) { return typeof value === 'function' ||\n (typeof value === 'object' && typeof value.handler === 'function'); },\n expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n getters: functionAssert,\n mutations: functionAssert,\n actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n Object.keys(assertTypes).forEach(function (key) {\n if (!rawModule[key]) { return }\n\n var assertOptions = assertTypes[key];\n\n forEachValue(rawModule[key], function (value, type) {\n assert(\n assertOptions.assert(value),\n makeAssertionMessage(path, key, type, value, assertOptions.expected)\n );\n });\n });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n if (path.length > 0) {\n buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n }\n buf += \" is \" + (JSON.stringify(value)) + \".\";\n return buf\n}\n\nvar Vue; // bind on install\n\nvar Store = function Store (options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n // Auto install if it is not done yet and `window` has `Vue`.\n // To allow users to avoid auto-installation in some cases,\n // this code should be placed here. See #731\n if (!Vue && typeof window !== 'undefined' && window.Vue) {\n install(window.Vue);\n }\n\n if (true) {\n assert(Vue, \"must call Vue.use(Vuex) before creating a store instance.\");\n assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n assert(this instanceof Store, \"store must be called with the new operator.\");\n }\n\n var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n var strict = options.strict; if ( strict === void 0 ) strict = false;\n\n // store internal state\n this._committing = false;\n this._actions = Object.create(null);\n this._actionSubscribers = [];\n this._mutations = Object.create(null);\n this._wrappedGetters = Object.create(null);\n this._modules = new ModuleCollection(options);\n this._modulesNamespaceMap = Object.create(null);\n this._subscribers = [];\n this._watcherVM = new Vue();\n\n // bind commit and dispatch to self\n var store = this;\n var ref = this;\n var dispatch = ref.dispatch;\n var commit = ref.commit;\n this.dispatch = function boundDispatch (type, payload) {\n return dispatch.call(store, type, payload)\n };\n this.commit = function boundCommit (type, payload, options) {\n return commit.call(store, type, payload, options)\n };\n\n // strict mode\n this.strict = strict;\n\n var state = this._modules.root.state;\n\n // init root module.\n // this also recursively registers all sub-modules\n // and collects all module getters inside this._wrappedGetters\n installModule(this, state, [], this._modules.root);\n\n // initialize the store vm, which is responsible for the reactivity\n // (also registers _wrappedGetters as computed properties)\n resetStoreVM(this, state);\n\n // apply plugins\n plugins.forEach(function (plugin) { return plugin(this$1); });\n\n var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;\n if (useDevtools) {\n devtoolPlugin(this);\n }\n};\n\nvar prototypeAccessors$1 = { state: { configurable: true } };\n\nprototypeAccessors$1.state.get = function () {\n return this._vm._data.$$state\n};\n\nprototypeAccessors$1.state.set = function (v) {\n if (true) {\n assert(false, \"use store.replaceState() to explicit replace store state.\");\n }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n var this$1 = this;\n\n // check object-style commit\n var ref = unifyObjectStyle(_type, _payload, _options);\n var type = ref.type;\n var payload = ref.payload;\n var options = ref.options;\n\n var mutation = { type: type, payload: payload };\n var entry = this._mutations[type];\n if (!entry) {\n if (true) {\n console.error((\"[vuex] unknown mutation type: \" + type));\n }\n return\n }\n this._withCommit(function () {\n entry.forEach(function commitIterator (handler) {\n handler(payload);\n });\n });\n this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); });\n\n if (\n true &&\n options && options.silent\n ) {\n console.warn(\n \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n 'Use the filter functionality in the vue-devtools'\n );\n }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n var this$1 = this;\n\n // check object-style dispatch\n var ref = unifyObjectStyle(_type, _payload);\n var type = ref.type;\n var payload = ref.payload;\n\n var action = { type: type, payload: payload };\n var entry = this._actions[type];\n if (!entry) {\n if (true) {\n console.error((\"[vuex] unknown action type: \" + type));\n }\n return\n }\n\n try {\n this._actionSubscribers\n .filter(function (sub) { return sub.before; })\n .forEach(function (sub) { return sub.before(action, this$1.state); });\n } catch (e) {\n if (true) {\n console.warn(\"[vuex] error in before action subscribers: \");\n console.error(e);\n }\n }\n\n var result = entry.length > 1\n ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n : entry[0](payload);\n\n return result.then(function (res) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.after; })\n .forEach(function (sub) { return sub.after(action, this$1.state); });\n } catch (e) {\n if (true) {\n console.warn(\"[vuex] error in after action subscribers: \");\n console.error(e);\n }\n }\n return res\n })\n};\n\nStore.prototype.subscribe = function subscribe (fn) {\n return genericSubscribe(fn, this._subscribers)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn) {\n var subs = typeof fn === 'function' ? { before: fn } : fn;\n return genericSubscribe(subs, this._actionSubscribers)\n};\n\nStore.prototype.watch = function watch (getter, cb, options) {\n var this$1 = this;\n\n if (true) {\n assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n }\n return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n var this$1 = this;\n\n this._withCommit(function () {\n this$1._vm._data.$$state = state;\n });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n if ( options === void 0 ) options = {};\n\n if (typeof path === 'string') { path = [path]; }\n\n if (true) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n assert(path.length > 0, 'cannot register the root module by using registerModule.');\n }\n\n this._modules.register(path, rawModule);\n installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n // reset store to update getters...\n resetStoreVM(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n var this$1 = this;\n\n if (typeof path === 'string') { path = [path]; }\n\n if (true) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n this._modules.unregister(path);\n this._withCommit(function () {\n var parentState = getNestedState(this$1.state, path.slice(0, -1));\n Vue.delete(parentState, path[path.length - 1]);\n });\n resetStore(this);\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n this._modules.update(newOptions);\n resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n var committing = this._committing;\n this._committing = true;\n fn();\n this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors$1 );\n\nfunction genericSubscribe (fn, subs) {\n if (subs.indexOf(fn) < 0) {\n subs.push(fn);\n }\n return function () {\n var i = subs.indexOf(fn);\n if (i > -1) {\n subs.splice(i, 1);\n }\n }\n}\n\nfunction resetStore (store, hot) {\n store._actions = Object.create(null);\n store._mutations = Object.create(null);\n store._wrappedGetters = Object.create(null);\n store._modulesNamespaceMap = Object.create(null);\n var state = store.state;\n // init all modules\n installModule(store, state, [], store._modules.root, true);\n // reset vm\n resetStoreVM(store, state, hot);\n}\n\nfunction resetStoreVM (store, state, hot) {\n var oldVm = store._vm;\n\n // bind store public getters\n store.getters = {};\n var wrappedGetters = store._wrappedGetters;\n var computed = {};\n forEachValue(wrappedGetters, function (fn, key) {\n // use computed to leverage its lazy-caching mechanism\n // direct inline function use will lead to closure preserving oldVm.\n // using partial to return function with only arguments preserved in closure enviroment.\n computed[key] = partial(fn, store);\n Object.defineProperty(store.getters, key, {\n get: function () { return store._vm[key]; },\n enumerable: true // for local getters\n });\n });\n\n // use a Vue instance to store the state tree\n // suppress warnings just in case the user has added\n // some funky global mixins\n var silent = Vue.config.silent;\n Vue.config.silent = true;\n store._vm = new Vue({\n data: {\n $$state: state\n },\n computed: computed\n });\n Vue.config.silent = silent;\n\n // enable strict mode for new vm\n if (store.strict) {\n enableStrictMode(store);\n }\n\n if (oldVm) {\n if (hot) {\n // dispatch changes in all subscribed watchers\n // to force getter re-evaluation for hot reloading.\n store._withCommit(function () {\n oldVm._data.$$state = null;\n });\n }\n Vue.nextTick(function () { return oldVm.$destroy(); });\n }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n var isRoot = !path.length;\n var namespace = store._modules.getNamespace(path);\n\n // register in namespace map\n if (module.namespaced) {\n store._modulesNamespaceMap[namespace] = module;\n }\n\n // set state\n if (!isRoot && !hot) {\n var parentState = getNestedState(rootState, path.slice(0, -1));\n var moduleName = path[path.length - 1];\n store._withCommit(function () {\n Vue.set(parentState, moduleName, module.state);\n });\n }\n\n var local = module.context = makeLocalContext(store, namespace, path);\n\n module.forEachMutation(function (mutation, key) {\n var namespacedType = namespace + key;\n registerMutation(store, namespacedType, mutation, local);\n });\n\n module.forEachAction(function (action, key) {\n var type = action.root ? key : namespace + key;\n var handler = action.handler || action;\n registerAction(store, type, handler, local);\n });\n\n module.forEachGetter(function (getter, key) {\n var namespacedType = namespace + key;\n registerGetter(store, namespacedType, getter, local);\n });\n\n module.forEachChild(function (child, key) {\n installModule(store, rootState, path.concat(key), child, hot);\n });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n var noNamespace = namespace === '';\n\n var local = {\n dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ( true && !store._actions[type]) {\n console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n return store.dispatch(type, payload)\n },\n\n commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ( true && !store._mutations[type]) {\n console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n store.commit(type, payload, options);\n }\n };\n\n // getters and state object must be gotten lazily\n // because they will be changed by vm update\n Object.defineProperties(local, {\n getters: {\n get: noNamespace\n ? function () { return store.getters; }\n : function () { return makeLocalGetters(store, namespace); }\n },\n state: {\n get: function () { return getNestedState(store.state, path); }\n }\n });\n\n return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n var gettersProxy = {};\n\n var splitPos = namespace.length;\n Object.keys(store.getters).forEach(function (type) {\n // skip if the target getter is not match this namespace\n if (type.slice(0, splitPos) !== namespace) { return }\n\n // extract local getter type\n var localType = type.slice(splitPos);\n\n // Add a port to the getters proxy.\n // Define as getter property because\n // we do not want to evaluate the getters in this time.\n Object.defineProperty(gettersProxy, localType, {\n get: function () { return store.getters[type]; },\n enumerable: true\n });\n });\n\n return gettersProxy\n}\n\nfunction registerMutation (store, type, handler, local) {\n var entry = store._mutations[type] || (store._mutations[type] = []);\n entry.push(function wrappedMutationHandler (payload) {\n handler.call(store, local.state, payload);\n });\n}\n\nfunction registerAction (store, type, handler, local) {\n var entry = store._actions[type] || (store._actions[type] = []);\n entry.push(function wrappedActionHandler (payload, cb) {\n var res = handler.call(store, {\n dispatch: local.dispatch,\n commit: local.commit,\n getters: local.getters,\n state: local.state,\n rootGetters: store.getters,\n rootState: store.state\n }, payload, cb);\n if (!isPromise(res)) {\n res = Promise.resolve(res);\n }\n if (store._devtoolHook) {\n return res.catch(function (err) {\n store._devtoolHook.emit('vuex:error', err);\n throw err\n })\n } else {\n return res\n }\n });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n if (store._wrappedGetters[type]) {\n if (true) {\n console.error((\"[vuex] duplicate getter key: \" + type));\n }\n return\n }\n store._wrappedGetters[type] = function wrappedGetter (store) {\n return rawGetter(\n local.state, // local state\n local.getters, // local getters\n store.state, // root state\n store.getters // root getters\n )\n };\n}\n\nfunction enableStrictMode (store) {\n store._vm.$watch(function () { return this._data.$$state }, function () {\n if (true) {\n assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n }\n }, { deep: true, sync: true });\n}\n\nfunction getNestedState (state, path) {\n return path.length\n ? path.reduce(function (state, key) { return state[key]; }, state)\n : state\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n if (isObject(type) && type.type) {\n options = payload;\n payload = type;\n type = type.type;\n }\n\n if (true) {\n assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n }\n\n return { type: type, payload: payload, options: options }\n}\n\nfunction install (_Vue) {\n if (Vue && _Vue === Vue) {\n if (true) {\n console.error(\n '[vuex] already installed. Vue.use(Vuex) should be called only once.'\n );\n }\n return\n }\n Vue = _Vue;\n applyMixin(Vue);\n}\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n var res = {};\n normalizeMap(states).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedState () {\n var state = this.$store.state;\n var getters = this.$store.getters;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n if (!module) {\n return\n }\n state = module.context.state;\n getters = module.context.getters;\n }\n return typeof val === 'function'\n ? val.call(this, state, getters)\n : state[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n var res = {};\n normalizeMap(mutations).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedMutation () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Get the commit method from store\n var commit = this.$store.commit;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n if (!module) {\n return\n }\n commit = module.context.commit;\n }\n return typeof val === 'function'\n ? val.apply(this, [commit].concat(args))\n : commit.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n var res = {};\n normalizeMap(getters).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n // The namespace has been mutated by normalizeNamespace\n val = namespace + val;\n res[key] = function mappedGetter () {\n if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n return\n }\n if ( true && !(val in this.$store.getters)) {\n console.error((\"[vuex] unknown getter: \" + val));\n return\n }\n return this.$store.getters[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n var res = {};\n normalizeMap(actions).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedAction () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // get dispatch function from store\n var dispatch = this.$store.dispatch;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n if (!module) {\n return\n }\n dispatch = module.context.dispatch;\n }\n return typeof val === 'function'\n ? val.apply(this, [dispatch].concat(args))\n : dispatch.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n mapState: mapState.bind(null, namespace),\n mapGetters: mapGetters.bind(null, namespace),\n mapMutations: mapMutations.bind(null, namespace),\n mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n return Array.isArray(map)\n ? map.map(function (key) { return ({ key: key, val: key }); })\n : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n return function (namespace, map) {\n if (typeof namespace !== 'string') {\n map = namespace;\n namespace = '';\n } else if (namespace.charAt(namespace.length - 1) !== '/') {\n namespace += '/';\n }\n return fn(namespace, map)\n }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n var module = store._modulesNamespaceMap[namespace];\n if ( true && !module) {\n console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n }\n return module\n}\n\nvar index_esm = {\n Store: Store,\n install: install,\n version: '3.1.1',\n mapState: mapState,\n mapMutations: mapMutations,\n mapGetters: mapGetters,\n mapActions: mapActions,\n createNamespacedHelpers: createNamespacedHelpers\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index_esm);\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZXhAMy4xLjFAdnVleC9kaXN0L3Z1ZXguZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWV4QDMuMS4xQHZ1ZXgvZGlzdC92dWV4LmVzbS5qcz81OTFhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdnVleCB2My4xLjFcbiAqIChjKSAyMDE5IEV2YW4gWW91XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuZnVuY3Rpb24gYXBwbHlNaXhpbiAoVnVlKSB7XG4gIHZhciB2ZXJzaW9uID0gTnVtYmVyKFZ1ZS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuXG4gIGlmICh2ZXJzaW9uID49IDIpIHtcbiAgICBWdWUubWl4aW4oeyBiZWZvcmVDcmVhdGU6IHZ1ZXhJbml0IH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG92ZXJyaWRlIGluaXQgYW5kIGluamVjdCB2dWV4IGluaXQgcHJvY2VkdXJlXG4gICAgLy8gZm9yIDEueCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICB2YXIgX2luaXQgPSBWdWUucHJvdG90eXBlLl9pbml0O1xuICAgIFZ1ZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgICAgIG9wdGlvbnMuaW5pdCA9IG9wdGlvbnMuaW5pdFxuICAgICAgICA/IFt2dWV4SW5pdF0uY29uY2F0KG9wdGlvbnMuaW5pdClcbiAgICAgICAgOiB2dWV4SW5pdDtcbiAgICAgIF9pbml0LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWdWV4IGluaXQgaG9vaywgaW5qZWN0ZWQgaW50byBlYWNoIGluc3RhbmNlcyBpbml0IGhvb2tzIGxpc3QuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHZ1ZXhJbml0ICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgLy8gc3RvcmUgaW5qZWN0aW9uXG4gICAgaWYgKG9wdGlvbnMuc3RvcmUpIHtcbiAgICAgIHRoaXMuJHN0b3JlID0gdHlwZW9mIG9wdGlvbnMuc3RvcmUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLnN0b3JlKClcbiAgICAgICAgOiBvcHRpb25zLnN0b3JlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJlbnQgJiYgb3B0aW9ucy5wYXJlbnQuJHN0b3JlKSB7XG4gICAgICB0aGlzLiRzdG9yZSA9IG9wdGlvbnMucGFyZW50LiRzdG9yZTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHRhcmdldCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gID8gd2luZG93XG4gIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGdsb2JhbFxuICAgIDoge307XG52YXIgZGV2dG9vbEhvb2sgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuZnVuY3Rpb24gZGV2dG9vbFBsdWdpbiAoc3RvcmUpIHtcbiAgaWYgKCFkZXZ0b29sSG9vaykgeyByZXR1cm4gfVxuXG4gIHN0b3JlLl9kZXZ0b29sSG9vayA9IGRldnRvb2xIb29rO1xuXG4gIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6aW5pdCcsIHN0b3JlKTtcblxuICBkZXZ0b29sSG9vay5vbigndnVleDp0cmF2ZWwtdG8tc3RhdGUnLCBmdW5jdGlvbiAodGFyZ2V0U3RhdGUpIHtcbiAgICBzdG9yZS5yZXBsYWNlU3RhdGUodGFyZ2V0U3RhdGUpO1xuICB9KTtcblxuICBzdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG11dGF0aW9uLCBzdGF0ZSkge1xuICAgIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6bXV0YXRpb24nLCBtdXRhdGlvbiwgc3RhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBwYXNzIHRoZSB0ZXN0XG4gKiBieSBzZWNvbmQgYXJndW1lbnQgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcmV0dXJuIHsqfVxuICovXG5cbi8qKlxuICogZm9yRWFjaCBmb3Igb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hWYWx1ZSAob2JqLCBmbikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZm4ob2JqW2tleV0sIGtleSk7IH0pO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbidcbn1cblxuZnVuY3Rpb24gYXNzZXJ0IChjb25kaXRpb24sIG1zZykge1xuICBpZiAoIWNvbmRpdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoKFwiW3Z1ZXhdIFwiICsgbXNnKSkgfVxufVxuXG5mdW5jdGlvbiBwYXJ0aWFsIChmbiwgYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuKGFyZylcbiAgfVxufVxuXG4vLyBCYXNlIGRhdGEgc3RydWN0IGZvciBzdG9yZSdzIG1vZHVsZSwgcGFja2FnZSB3aXRoIHNvbWUgYXR0cmlidXRlIGFuZCBtZXRob2RcbnZhciBNb2R1bGUgPSBmdW5jdGlvbiBNb2R1bGUgKHJhd01vZHVsZSwgcnVudGltZSkge1xuICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lO1xuICAvLyBTdG9yZSBzb21lIGNoaWxkcmVuIGl0ZW1cbiAgdGhpcy5fY2hpbGRyZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luIG1vZHVsZSBvYmplY3Qgd2hpY2ggcGFzc2VkIGJ5IHByb2dyYW1tZXJcbiAgdGhpcy5fcmF3TW9kdWxlID0gcmF3TW9kdWxlO1xuICB2YXIgcmF3U3RhdGUgPSByYXdNb2R1bGUuc3RhdGU7XG5cbiAgLy8gU3RvcmUgdGhlIG9yaWdpbiBtb2R1bGUncyBzdGF0ZVxuICB0aGlzLnN0YXRlID0gKHR5cGVvZiByYXdTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHJhd1N0YXRlKCkgOiByYXdTdGF0ZSkgfHwge307XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBuYW1lc3BhY2VkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5uYW1lc3BhY2VkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWRcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiBhZGRDaGlsZCAoa2V5LCBtb2R1bGUpIHtcbiAgdGhpcy5fY2hpbGRyZW5ba2V5XSA9IG1vZHVsZTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZCAoa2V5KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlbltrZXldO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5nZXRDaGlsZCA9IGZ1bmN0aW9uIGdldENoaWxkIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuW2tleV1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChyYXdNb2R1bGUpIHtcbiAgdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWQgPSByYXdNb2R1bGUubmFtZXNwYWNlZDtcbiAgaWYgKHJhd01vZHVsZS5hY3Rpb25zKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMgPSByYXdNb2R1bGUuYWN0aW9ucztcbiAgfVxuICBpZiAocmF3TW9kdWxlLm11dGF0aW9ucykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMgPSByYXdNb2R1bGUubXV0YXRpb25zO1xuICB9XG4gIGlmIChyYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzID0gcmF3TW9kdWxlLmdldHRlcnM7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaENoaWxkID0gZnVuY3Rpb24gZm9yRWFjaENoaWxkIChmbikge1xuICBmb3JFYWNoVmFsdWUodGhpcy5fY2hpbGRyZW4sIGZuKTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaEdldHRlciA9IGZ1bmN0aW9uIGZvckVhY2hHZXR0ZXIgKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycywgZm4pO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hBY3Rpb24gPSBmdW5jdGlvbiBmb3JFYWNoQWN0aW9uIChmbikge1xuICBpZiAodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoTXV0YXRpb24gPSBmdW5jdGlvbiBmb3JFYWNoTXV0YXRpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1vZHVsZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgTW9kdWxlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIE1vZHVsZUNvbGxlY3Rpb24gKHJhd1Jvb3RNb2R1bGUpIHtcbiAgLy8gcmVnaXN0ZXIgcm9vdCBtb2R1bGUgKFZ1ZXguU3RvcmUgb3B0aW9ucylcbiAgdGhpcy5yZWdpc3RlcihbXSwgcmF3Um9vdE1vZHVsZSwgZmFsc2UpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobW9kdWxlLCBrZXkpIHtcbiAgICByZXR1cm4gbW9kdWxlLmdldENoaWxkKGtleSlcbiAgfSwgdGhpcy5yb290KVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlID0gZnVuY3Rpb24gZ2V0TmFtZXNwYWNlIChwYXRoKSB7XG4gIHZhciBtb2R1bGUgPSB0aGlzLnJvb3Q7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBrZXkpIHtcbiAgICBtb2R1bGUgPSBtb2R1bGUuZ2V0Q2hpbGQoa2V5KTtcbiAgICByZXR1cm4gbmFtZXNwYWNlICsgKG1vZHVsZS5uYW1lc3BhY2VkID8ga2V5ICsgJy8nIDogJycpXG4gIH0sICcnKVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlJDEgKHJhd1Jvb3RNb2R1bGUpIHtcbiAgdXBkYXRlKFtdLCB0aGlzLnJvb3QsIHJhd1Jvb3RNb2R1bGUpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlciAocGF0aCwgcmF3TW9kdWxlLCBydW50aW1lKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gICAgaWYgKCBydW50aW1lID09PSB2b2lkIDAgKSBydW50aW1lID0gdHJ1ZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydFJhd01vZHVsZShwYXRoLCByYXdNb2R1bGUpO1xuICB9XG5cbiAgdmFyIG5ld01vZHVsZSA9IG5ldyBNb2R1bGUocmF3TW9kdWxlLCBydW50aW1lKTtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5yb290ID0gbmV3TW9kdWxlO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldChwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgcGFyZW50LmFkZENoaWxkKHBhdGhbcGF0aC5sZW5ndGggLSAxXSwgbmV3TW9kdWxlKTtcbiAgfVxuXG4gIC8vIHJlZ2lzdGVyIG5lc3RlZCBtb2R1bGVzXG4gIGlmIChyYXdNb2R1bGUubW9kdWxlcykge1xuICAgIGZvckVhY2hWYWx1ZShyYXdNb2R1bGUubW9kdWxlcywgZnVuY3Rpb24gKHJhd0NoaWxkTW9kdWxlLCBrZXkpIHtcbiAgICAgIHRoaXMkMS5yZWdpc3RlcihwYXRoLmNvbmNhdChrZXkpLCByYXdDaGlsZE1vZHVsZSwgcnVudGltZSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyIChwYXRoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLmdldChwYXRoLnNsaWNlKDAsIC0xKSk7XG4gIHZhciBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIGlmICghcGFyZW50LmdldENoaWxkKGtleSkucnVudGltZSkgeyByZXR1cm4gfVxuXG4gIHBhcmVudC5yZW1vdmVDaGlsZChrZXkpO1xufTtcblxuZnVuY3Rpb24gdXBkYXRlIChwYXRoLCB0YXJnZXRNb2R1bGUsIG5ld01vZHVsZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydFJhd01vZHVsZShwYXRoLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHRhcmdldCBtb2R1bGVcbiAgdGFyZ2V0TW9kdWxlLnVwZGF0ZShuZXdNb2R1bGUpO1xuXG4gIC8vIHVwZGF0ZSBuZXN0ZWQgbW9kdWxlc1xuICBpZiAobmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICAgIGlmICghdGFyZ2V0TW9kdWxlLmdldENoaWxkKGtleSkpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlt2dWV4XSB0cnlpbmcgdG8gYWRkIGEgbmV3IG1vZHVsZSAnXCIgKyBrZXkgKyBcIicgb24gaG90IHJlbG9hZGluZywgXCIgK1xuICAgICAgICAgICAgJ21hbnVhbCByZWxvYWQgaXMgbmVlZGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGUoXG4gICAgICAgIHBhdGguY29uY2F0KGtleSksXG4gICAgICAgIHRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpLFxuICAgICAgICBuZXdNb2R1bGUubW9kdWxlc1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZnVuY3Rpb25Bc3NlcnQgPSB7XG4gIGFzc2VydDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7IH0sXG4gIGV4cGVjdGVkOiAnZnVuY3Rpb24nXG59O1xuXG52YXIgb2JqZWN0QXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uIG9yIG9iamVjdCB3aXRoIFwiaGFuZGxlclwiIGZ1bmN0aW9uJ1xufTtcblxudmFyIGFzc2VydFR5cGVzID0ge1xuICBnZXR0ZXJzOiBmdW5jdGlvbkFzc2VydCxcbiAgbXV0YXRpb25zOiBmdW5jdGlvbkFzc2VydCxcbiAgYWN0aW9uczogb2JqZWN0QXNzZXJ0XG59O1xuXG5mdW5jdGlvbiBhc3NlcnRSYXdNb2R1bGUgKHBhdGgsIHJhd01vZHVsZSkge1xuICBPYmplY3Qua2V5cyhhc3NlcnRUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFyYXdNb2R1bGVba2V5XSkgeyByZXR1cm4gfVxuXG4gICAgdmFyIGFzc2VydE9wdGlvbnMgPSBhc3NlcnRUeXBlc1trZXldO1xuXG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZVtrZXldLCBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYXNzZXJ0T3B0aW9ucy5hc3NlcnQodmFsdWUpLFxuICAgICAgICBtYWtlQXNzZXJ0aW9uTWVzc2FnZShwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBhc3NlcnRPcHRpb25zLmV4cGVjdGVkKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VBc3NlcnRpb25NZXNzYWdlIChwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBleHBlY3RlZCkge1xuICB2YXIgYnVmID0ga2V5ICsgXCIgc2hvdWxkIGJlIFwiICsgZXhwZWN0ZWQgKyBcIiBidXQgXFxcIlwiICsga2V5ICsgXCIuXCIgKyB0eXBlICsgXCJcXFwiXCI7XG4gIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICBidWYgKz0gXCIgaW4gbW9kdWxlIFxcXCJcIiArIChwYXRoLmpvaW4oJy4nKSkgKyBcIlxcXCJcIjtcbiAgfVxuICBidWYgKz0gXCIgaXMgXCIgKyAoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSArIFwiLlwiO1xuICByZXR1cm4gYnVmXG59XG5cbnZhciBWdWU7IC8vIGJpbmQgb24gaW5zdGFsbFxuXG52YXIgU3RvcmUgPSBmdW5jdGlvbiBTdG9yZSAob3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgLy8gQXV0byBpbnN0YWxsIGlmIGl0IGlzIG5vdCBkb25lIHlldCBhbmQgYHdpbmRvd2AgaGFzIGBWdWVgLlxuICAvLyBUbyBhbGxvdyB1c2VycyB0byBhdm9pZCBhdXRvLWluc3RhbGxhdGlvbiBpbiBzb21lIGNhc2VzLFxuICAvLyB0aGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBoZXJlLiBTZWUgIzczMVxuICBpZiAoIVZ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVnVlKSB7XG4gICAgaW5zdGFsbCh3aW5kb3cuVnVlKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KFZ1ZSwgXCJtdXN0IGNhbGwgVnVlLnVzZShWdWV4KSBiZWZvcmUgY3JlYXRpbmcgYSBzdG9yZSBpbnN0YW5jZS5cIik7XG4gICAgYXNzZXJ0KHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJywgXCJ2dWV4IHJlcXVpcmVzIGEgUHJvbWlzZSBwb2x5ZmlsbCBpbiB0aGlzIGJyb3dzZXIuXCIpO1xuICAgIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgU3RvcmUsIFwic3RvcmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yLlwiKTtcbiAgfVxuXG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zOyBpZiAoIHBsdWdpbnMgPT09IHZvaWQgMCApIHBsdWdpbnMgPSBbXTtcbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0OyBpZiAoIHN0cmljdCA9PT0gdm9pZCAwICkgc3RyaWN0ID0gZmFsc2U7XG5cbiAgLy8gc3RvcmUgaW50ZXJuYWwgc3RhdGVcbiAgdGhpcy5fY29tbWl0dGluZyA9IGZhbHNlO1xuICB0aGlzLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fbXV0YXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9tb2R1bGVzID0gbmV3IE1vZHVsZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gIHRoaXMuX21vZHVsZXNOYW1lc3BhY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuICB0aGlzLl93YXRjaGVyVk0gPSBuZXcgVnVlKCk7XG5cbiAgLy8gYmluZCBjb21taXQgYW5kIGRpc3BhdGNoIHRvIHNlbGZcbiAgdmFyIHN0b3JlID0gdGhpcztcbiAgdmFyIHJlZiA9IHRoaXM7XG4gIHZhciBkaXNwYXRjaCA9IHJlZi5kaXNwYXRjaDtcbiAgdmFyIGNvbW1pdCA9IHJlZi5jb21taXQ7XG4gIHRoaXMuZGlzcGF0Y2ggPSBmdW5jdGlvbiBib3VuZERpc3BhdGNoICh0eXBlLCBwYXlsb2FkKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoLmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQpXG4gIH07XG4gIHRoaXMuY29tbWl0ID0gZnVuY3Rpb24gYm91bmRDb21taXQgKHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY29tbWl0LmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpXG4gIH07XG5cbiAgLy8gc3RyaWN0IG1vZGVcbiAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO1xuXG4gIC8vIGluaXQgcm9vdCBtb2R1bGUuXG4gIC8vIHRoaXMgYWxzbyByZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIHN1Yi1tb2R1bGVzXG4gIC8vIGFuZCBjb2xsZWN0cyBhbGwgbW9kdWxlIGdldHRlcnMgaW5zaWRlIHRoaXMuX3dyYXBwZWRHZXR0ZXJzXG4gIGluc3RhbGxNb2R1bGUodGhpcywgc3RhdGUsIFtdLCB0aGlzLl9tb2R1bGVzLnJvb3QpO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHN0b3JlIHZtLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHJlYWN0aXZpdHlcbiAgLy8gKGFsc28gcmVnaXN0ZXJzIF93cmFwcGVkR2V0dGVycyBhcyBjb21wdXRlZCBwcm9wZXJ0aWVzKVxuICByZXNldFN0b3JlVk0odGhpcywgc3RhdGUpO1xuXG4gIC8vIGFwcGx5IHBsdWdpbnNcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHsgcmV0dXJuIHBsdWdpbih0aGlzJDEpOyB9KTtcblxuICB2YXIgdXNlRGV2dG9vbHMgPSBvcHRpb25zLmRldnRvb2xzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRldnRvb2xzIDogVnVlLmNvbmZpZy5kZXZ0b29scztcbiAgaWYgKHVzZURldnRvb2xzKSB7XG4gICAgZGV2dG9vbFBsdWdpbih0aGlzKTtcbiAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBzdGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl92bS5fZGF0YS4kJHN0YXRlXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5zZXQgPSBmdW5jdGlvbiAodikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChmYWxzZSwgXCJ1c2Ugc3RvcmUucmVwbGFjZVN0YXRlKCkgdG8gZXhwbGljaXQgcmVwbGFjZSBzdG9yZSBzdGF0ZS5cIik7XG4gIH1cbn07XG5cblN0b3JlLnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiBjb21taXQgKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAvLyBjaGVjayBvYmplY3Qtc3R5bGUgY29tbWl0XG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gICAgdmFyIHBheWxvYWQgPSByZWYucGF5bG9hZDtcbiAgICB2YXIgb3B0aW9ucyA9IHJlZi5vcHRpb25zO1xuXG4gIHZhciBtdXRhdGlvbiA9IHsgdHlwZTogdHlwZSwgcGF5bG9hZDogcGF5bG9hZCB9O1xuICB2YXIgZW50cnkgPSB0aGlzLl9tdXRhdGlvbnNbdHlwZV07XG4gIGlmICghZW50cnkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBtdXRhdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgdGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgZW50cnkuZm9yRWFjaChmdW5jdGlvbiBjb21taXRJdGVyYXRvciAoaGFuZGxlcikge1xuICAgICAgaGFuZGxlcihwYXlsb2FkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHRoaXMuX3N1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViKG11dGF0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcblxuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5zaWxlbnRcbiAgKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbdnVleF0gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlICsgXCIuIFNpbGVudCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgJ1VzZSB0aGUgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIHZ1ZS1kZXZ0b29scydcbiAgICApO1xuICB9XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCAoX3R5cGUsIF9wYXlsb2FkKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gY2hlY2sgb2JqZWN0LXN0eWxlIGRpc3BhdGNoXG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuXG4gIHZhciBhY3Rpb24gPSB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQgfTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fYWN0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5iZWZvcmU7IH0pXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYmVmb3JlKGFjdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGJlZm9yZSBhY3Rpb24gc3Vic2NyaWJlcnM6IFwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9IGVudHJ5Lmxlbmd0aCA+IDFcbiAgICA/IFByb21pc2UuYWxsKGVudHJ5Lm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlcihwYXlsb2FkKTsgfSkpXG4gICAgOiBlbnRyeVswXShwYXlsb2FkKTtcblxuICByZXR1cm4gcmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzJDEuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmFmdGVyOyB9KVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXIoYWN0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbdnVleF0gZXJyb3IgaW4gYWZ0ZXIgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSlcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiBzdWJzY3JpYmUgKGZuKSB7XG4gIHJldHVybiBnZW5lcmljU3Vic2NyaWJlKGZuLCB0aGlzLl9zdWJzY3JpYmVycylcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmVBY3Rpb24gPSBmdW5jdGlvbiBzdWJzY3JpYmVBY3Rpb24gKGZuKSB7XG4gIHZhciBzdWJzID0gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nID8geyBiZWZvcmU6IGZuIH0gOiBmbjtcbiAgcmV0dXJuIGdlbmVyaWNTdWJzY3JpYmUoc3VicywgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUud2F0Y2ggPSBmdW5jdGlvbiB3YXRjaCAoZ2V0dGVyLCBjYiwgb3B0aW9ucykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBnZXR0ZXIgPT09ICdmdW5jdGlvbicsIFwic3RvcmUud2F0Y2ggb25seSBhY2NlcHRzIGEgZnVuY3Rpb24uXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLl93YXRjaGVyVk0uJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldHRlcih0aGlzJDEuc3RhdGUsIHRoaXMkMS5nZXR0ZXJzKTsgfSwgY2IsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gcmVwbGFjZVN0YXRlIChzdGF0ZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMkMS5fdm0uX2RhdGEuJCRzdGF0ZSA9IHN0YXRlO1xuICB9KTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlIChwYXRoLCByYXdNb2R1bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICAgIGFzc2VydChwYXRoLmxlbmd0aCA+IDAsICdjYW5ub3QgcmVnaXN0ZXIgdGhlIHJvb3QgbW9kdWxlIGJ5IHVzaW5nIHJlZ2lzdGVyTW9kdWxlLicpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy5yZWdpc3RlcihwYXRoLCByYXdNb2R1bGUpO1xuICBpbnN0YWxsTW9kdWxlKHRoaXMsIHRoaXMuc3RhdGUsIHBhdGgsIHRoaXMuX21vZHVsZXMuZ2V0KHBhdGgpLCBvcHRpb25zLnByZXNlcnZlU3RhdGUpO1xuICAvLyByZXNldCBzdG9yZSB0byB1cGRhdGUgZ2V0dGVycy4uLlxuICByZXNldFN0b3JlVk0odGhpcywgdGhpcy5zdGF0ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHVucmVnaXN0ZXJNb2R1bGUgKHBhdGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy51bnJlZ2lzdGVyKHBhdGgpO1xuICB0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50U3RhdGUgPSBnZXROZXN0ZWRTdGF0ZSh0aGlzJDEuc3RhdGUsIHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBWdWUuZGVsZXRlKHBhcmVudFN0YXRlLCBwYXRoW3BhdGgubGVuZ3RoIC0gMV0pO1xuICB9KTtcbiAgcmVzZXRTdG9yZSh0aGlzKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5ob3RVcGRhdGUgPSBmdW5jdGlvbiBob3RVcGRhdGUgKG5ld09wdGlvbnMpIHtcbiAgdGhpcy5fbW9kdWxlcy51cGRhdGUobmV3T3B0aW9ucyk7XG4gIHJlc2V0U3RvcmUodGhpcywgdHJ1ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuX3dpdGhDb21taXQgPSBmdW5jdGlvbiBfd2l0aENvbW1pdCAoZm4pIHtcbiAgdmFyIGNvbW1pdHRpbmcgPSB0aGlzLl9jb21taXR0aW5nO1xuICB0aGlzLl9jb21taXR0aW5nID0gdHJ1ZTtcbiAgZm4oKTtcbiAgdGhpcy5fY29tbWl0dGluZyA9IGNvbW1pdHRpbmc7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3RvcmUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMkMSApO1xuXG5mdW5jdGlvbiBnZW5lcmljU3Vic2NyaWJlIChmbiwgc3Vicykge1xuICBpZiAoc3Vicy5pbmRleE9mKGZuKSA8IDApIHtcbiAgICBzdWJzLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGkgPSBzdWJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHN1YnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN0b3JlIChzdG9yZSwgaG90KSB7XG4gIHN0b3JlLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc3RvcmUuX211dGF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl93cmFwcGVkR2V0dGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIHN0YXRlID0gc3RvcmUuc3RhdGU7XG4gIC8vIGluaXQgYWxsIG1vZHVsZXNcbiAgaW5zdGFsbE1vZHVsZShzdG9yZSwgc3RhdGUsIFtdLCBzdG9yZS5fbW9kdWxlcy5yb290LCB0cnVlKTtcbiAgLy8gcmVzZXQgdm1cbiAgcmVzZXRTdG9yZVZNKHN0b3JlLCBzdGF0ZSwgaG90KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdG9yZVZNIChzdG9yZSwgc3RhdGUsIGhvdCkge1xuICB2YXIgb2xkVm0gPSBzdG9yZS5fdm07XG5cbiAgLy8gYmluZCBzdG9yZSBwdWJsaWMgZ2V0dGVyc1xuICBzdG9yZS5nZXR0ZXJzID0ge307XG4gIHZhciB3cmFwcGVkR2V0dGVycyA9IHN0b3JlLl93cmFwcGVkR2V0dGVycztcbiAgdmFyIGNvbXB1dGVkID0ge307XG4gIGZvckVhY2hWYWx1ZSh3cmFwcGVkR2V0dGVycywgZnVuY3Rpb24gKGZuLCBrZXkpIHtcbiAgICAvLyB1c2UgY29tcHV0ZWQgdG8gbGV2ZXJhZ2UgaXRzIGxhenktY2FjaGluZyBtZWNoYW5pc21cbiAgICAvLyBkaXJlY3QgaW5saW5lIGZ1bmN0aW9uIHVzZSB3aWxsIGxlYWQgdG8gY2xvc3VyZSBwcmVzZXJ2aW5nIG9sZFZtLlxuICAgIC8vIHVzaW5nIHBhcnRpYWwgdG8gcmV0dXJuIGZ1bmN0aW9uIHdpdGggb25seSBhcmd1bWVudHMgcHJlc2VydmVkIGluIGNsb3N1cmUgZW52aXJvbWVudC5cbiAgICBjb21wdXRlZFtrZXldID0gcGFydGlhbChmbiwgc3RvcmUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdG9yZS5nZXR0ZXJzLCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuX3ZtW2tleV07IH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlIC8vIGZvciBsb2NhbCBnZXR0ZXJzXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIHVzZSBhIFZ1ZSBpbnN0YW5jZSB0byBzdG9yZSB0aGUgc3RhdGUgdHJlZVxuICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgaGFzIGFkZGVkXG4gIC8vIHNvbWUgZnVua3kgZ2xvYmFsIG1peGluc1xuICB2YXIgc2lsZW50ID0gVnVlLmNvbmZpZy5zaWxlbnQ7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gdHJ1ZTtcbiAgc3RvcmUuX3ZtID0gbmV3IFZ1ZSh7XG4gICAgZGF0YToge1xuICAgICAgJCRzdGF0ZTogc3RhdGVcbiAgICB9LFxuICAgIGNvbXB1dGVkOiBjb21wdXRlZFxuICB9KTtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSBzaWxlbnQ7XG5cbiAgLy8gZW5hYmxlIHN0cmljdCBtb2RlIGZvciBuZXcgdm1cbiAgaWYgKHN0b3JlLnN0cmljdCkge1xuICAgIGVuYWJsZVN0cmljdE1vZGUoc3RvcmUpO1xuICB9XG5cbiAgaWYgKG9sZFZtKSB7XG4gICAgaWYgKGhvdCkge1xuICAgICAgLy8gZGlzcGF0Y2ggY2hhbmdlcyBpbiBhbGwgc3Vic2NyaWJlZCB3YXRjaGVyc1xuICAgICAgLy8gdG8gZm9yY2UgZ2V0dGVyIHJlLWV2YWx1YXRpb24gZm9yIGhvdCByZWxvYWRpbmcuXG4gICAgICBzdG9yZS5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9sZFZtLl9kYXRhLiQkc3RhdGUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJldHVybiBvbGRWbS4kZGVzdHJveSgpOyB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsTW9kdWxlIChzdG9yZSwgcm9vdFN0YXRlLCBwYXRoLCBtb2R1bGUsIGhvdCkge1xuICB2YXIgaXNSb290ID0gIXBhdGgubGVuZ3RoO1xuICB2YXIgbmFtZXNwYWNlID0gc3RvcmUuX21vZHVsZXMuZ2V0TmFtZXNwYWNlKHBhdGgpO1xuXG4gIC8vIHJlZ2lzdGVyIGluIG5hbWVzcGFjZSBtYXBcbiAgaWYgKG1vZHVsZS5uYW1lc3BhY2VkKSB7XG4gICAgc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSA9IG1vZHVsZTtcbiAgfVxuXG4gIC8vIHNldCBzdGF0ZVxuICBpZiAoIWlzUm9vdCAmJiAhaG90KSB7XG4gICAgdmFyIHBhcmVudFN0YXRlID0gZ2V0TmVzdGVkU3RhdGUocm9vdFN0YXRlLCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgdmFyIG1vZHVsZU5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgc3RvcmUuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgICAgVnVlLnNldChwYXJlbnRTdGF0ZSwgbW9kdWxlTmFtZSwgbW9kdWxlLnN0YXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBsb2NhbCA9IG1vZHVsZS5jb250ZXh0ID0gbWFrZUxvY2FsQ29udGV4dChzdG9yZSwgbmFtZXNwYWNlLCBwYXRoKTtcblxuICBtb2R1bGUuZm9yRWFjaE11dGF0aW9uKGZ1bmN0aW9uIChtdXRhdGlvbiwga2V5KSB7XG4gICAgdmFyIG5hbWVzcGFjZWRUeXBlID0gbmFtZXNwYWNlICsga2V5O1xuICAgIHJlZ2lzdGVyTXV0YXRpb24oc3RvcmUsIG5hbWVzcGFjZWRUeXBlLCBtdXRhdGlvbiwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaEFjdGlvbihmdW5jdGlvbiAoYWN0aW9uLCBrZXkpIHtcbiAgICB2YXIgdHlwZSA9IGFjdGlvbi5yb290ID8ga2V5IDogbmFtZXNwYWNlICsga2V5O1xuICAgIHZhciBoYW5kbGVyID0gYWN0aW9uLmhhbmRsZXIgfHwgYWN0aW9uO1xuICAgIHJlZ2lzdGVyQWN0aW9uKHN0b3JlLCB0eXBlLCBoYW5kbGVyLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoR2V0dGVyKGZ1bmN0aW9uIChnZXR0ZXIsIGtleSkge1xuICAgIHZhciBuYW1lc3BhY2VkVHlwZSA9IG5hbWVzcGFjZSArIGtleTtcbiAgICByZWdpc3RlckdldHRlcihzdG9yZSwgbmFtZXNwYWNlZFR5cGUsIGdldHRlciwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaENoaWxkKGZ1bmN0aW9uIChjaGlsZCwga2V5KSB7XG4gICAgaW5zdGFsbE1vZHVsZShzdG9yZSwgcm9vdFN0YXRlLCBwYXRoLmNvbmNhdChrZXkpLCBjaGlsZCwgaG90KTtcbiAgfSk7XG59XG5cbi8qKlxuICogbWFrZSBsb2NhbGl6ZWQgZGlzcGF0Y2gsIGNvbW1pdCwgZ2V0dGVycyBhbmQgc3RhdGVcbiAqIGlmIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSwganVzdCB1c2Ugcm9vdCBvbmVzXG4gKi9cbmZ1bmN0aW9uIG1ha2VMb2NhbENvbnRleHQgKHN0b3JlLCBuYW1lc3BhY2UsIHBhdGgpIHtcbiAgdmFyIG5vTmFtZXNwYWNlID0gbmFtZXNwYWNlID09PSAnJztcblxuICB2YXIgbG9jYWwgPSB7XG4gICAgZGlzcGF0Y2g6IG5vTmFtZXNwYWNlID8gc3RvcmUuZGlzcGF0Y2ggOiBmdW5jdGlvbiAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgICAgdmFyIGFyZ3MgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgICAgdmFyIHBheWxvYWQgPSBhcmdzLnBheWxvYWQ7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Mub3B0aW9ucztcbiAgICAgIHZhciB0eXBlID0gYXJncy50eXBlO1xuXG4gICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucm9vdCkge1xuICAgICAgICB0eXBlID0gbmFtZXNwYWNlICsgdHlwZTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXN0b3JlLl9hY3Rpb25zW3R5cGVdKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBsb2NhbCBhY3Rpb24gdHlwZTogXCIgKyAoYXJncy50eXBlKSArIFwiLCBnbG9iYWwgdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKHR5cGUsIHBheWxvYWQpXG4gICAgfSxcblxuICAgIGNvbW1pdDogbm9OYW1lc3BhY2UgPyBzdG9yZS5jb21taXQgOiBmdW5jdGlvbiAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgICAgdmFyIGFyZ3MgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgICAgdmFyIHBheWxvYWQgPSBhcmdzLnBheWxvYWQ7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Mub3B0aW9ucztcbiAgICAgIHZhciB0eXBlID0gYXJncy50eXBlO1xuXG4gICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucm9vdCkge1xuICAgICAgICB0eXBlID0gbmFtZXNwYWNlICsgdHlwZTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXN0b3JlLl9tdXRhdGlvbnNbdHlwZV0pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGxvY2FsIG11dGF0aW9uIHR5cGU6IFwiICsgKGFyZ3MudHlwZSkgKyBcIiwgZ2xvYmFsIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0b3JlLmNvbW1pdCh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gZ2V0dGVycyBhbmQgc3RhdGUgb2JqZWN0IG11c3QgYmUgZ290dGVuIGxhemlseVxuICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBjaGFuZ2VkIGJ5IHZtIHVwZGF0ZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsb2NhbCwge1xuICAgIGdldHRlcnM6IHtcbiAgICAgIGdldDogbm9OYW1lc3BhY2VcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5nZXR0ZXJzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFrZUxvY2FsR2V0dGVycyhzdG9yZSwgbmFtZXNwYWNlKTsgfVxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0TmVzdGVkU3RhdGUoc3RvcmUuc3RhdGUsIHBhdGgpOyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbG9jYWxcbn1cblxuZnVuY3Rpb24gbWFrZUxvY2FsR2V0dGVycyAoc3RvcmUsIG5hbWVzcGFjZSkge1xuICB2YXIgZ2V0dGVyc1Byb3h5ID0ge307XG5cbiAgdmFyIHNwbGl0UG9zID0gbmFtZXNwYWNlLmxlbmd0aDtcbiAgT2JqZWN0LmtleXMoc3RvcmUuZ2V0dGVycykuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIC8vIHNraXAgaWYgdGhlIHRhcmdldCBnZXR0ZXIgaXMgbm90IG1hdGNoIHRoaXMgbmFtZXNwYWNlXG4gICAgaWYgKHR5cGUuc2xpY2UoMCwgc3BsaXRQb3MpICE9PSBuYW1lc3BhY2UpIHsgcmV0dXJuIH1cblxuICAgIC8vIGV4dHJhY3QgbG9jYWwgZ2V0dGVyIHR5cGVcbiAgICB2YXIgbG9jYWxUeXBlID0gdHlwZS5zbGljZShzcGxpdFBvcyk7XG5cbiAgICAvLyBBZGQgYSBwb3J0IHRvIHRoZSBnZXR0ZXJzIHByb3h5LlxuICAgIC8vIERlZmluZSBhcyBnZXR0ZXIgcHJvcGVydHkgYmVjYXVzZVxuICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGV2YWx1YXRlIHRoZSBnZXR0ZXJzIGluIHRoaXMgdGltZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2V0dGVyc1Byb3h5LCBsb2NhbFR5cGUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuZ2V0dGVyc1t0eXBlXTsgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGdldHRlcnNQcm94eVxufVxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGF0aW9uIChzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpIHtcbiAgdmFyIGVudHJ5ID0gc3RvcmUuX211dGF0aW9uc1t0eXBlXSB8fCAoc3RvcmUuX211dGF0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkTXV0YXRpb25IYW5kbGVyIChwYXlsb2FkKSB7XG4gICAgaGFuZGxlci5jYWxsKHN0b3JlLCBsb2NhbC5zdGF0ZSwgcGF5bG9hZCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckFjdGlvbiAoc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKSB7XG4gIHZhciBlbnRyeSA9IHN0b3JlLl9hY3Rpb25zW3R5cGVdIHx8IChzdG9yZS5fYWN0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkQWN0aW9uSGFuZGxlciAocGF5bG9hZCwgY2IpIHtcbiAgICB2YXIgcmVzID0gaGFuZGxlci5jYWxsKHN0b3JlLCB7XG4gICAgICBkaXNwYXRjaDogbG9jYWwuZGlzcGF0Y2gsXG4gICAgICBjb21taXQ6IGxvY2FsLmNvbW1pdCxcbiAgICAgIGdldHRlcnM6IGxvY2FsLmdldHRlcnMsXG4gICAgICBzdGF0ZTogbG9jYWwuc3RhdGUsXG4gICAgICByb290R2V0dGVyczogc3RvcmUuZ2V0dGVycyxcbiAgICAgIHJvb3RTdGF0ZTogc3RvcmUuc3RhdGVcbiAgICB9LCBwYXlsb2FkLCBjYik7XG4gICAgaWYgKCFpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gICAgfVxuICAgIGlmIChzdG9yZS5fZGV2dG9vbEhvb2spIHtcbiAgICAgIHJldHVybiByZXMuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzdG9yZS5fZGV2dG9vbEhvb2suZW1pdCgndnVleDplcnJvcicsIGVycik7XG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyR2V0dGVyIChzdG9yZSwgdHlwZSwgcmF3R2V0dGVyLCBsb2NhbCkge1xuICBpZiAoc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIGR1cGxpY2F0ZSBnZXR0ZXIga2V5OiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdID0gZnVuY3Rpb24gd3JhcHBlZEdldHRlciAoc3RvcmUpIHtcbiAgICByZXR1cm4gcmF3R2V0dGVyKFxuICAgICAgbG9jYWwuc3RhdGUsIC8vIGxvY2FsIHN0YXRlXG4gICAgICBsb2NhbC5nZXR0ZXJzLCAvLyBsb2NhbCBnZXR0ZXJzXG4gICAgICBzdG9yZS5zdGF0ZSwgLy8gcm9vdCBzdGF0ZVxuICAgICAgc3RvcmUuZ2V0dGVycyAvLyByb290IGdldHRlcnNcbiAgICApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuYWJsZVN0cmljdE1vZGUgKHN0b3JlKSB7XG4gIHN0b3JlLl92bS4kd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS4kJHN0YXRlIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgYXNzZXJ0KHN0b3JlLl9jb21taXR0aW5nLCBcImRvIG5vdCBtdXRhdGUgdnVleCBzdG9yZSBzdGF0ZSBvdXRzaWRlIG11dGF0aW9uIGhhbmRsZXJzLlwiKTtcbiAgICB9XG4gIH0sIHsgZGVlcDogdHJ1ZSwgc3luYzogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkU3RhdGUgKHN0YXRlLCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLmxlbmd0aFxuICAgID8gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCBrZXkpIHsgcmV0dXJuIHN0YXRlW2tleV07IH0sIHN0YXRlKVxuICAgIDogc3RhdGVcbn1cblxuZnVuY3Rpb24gdW5pZnlPYmplY3RTdHlsZSAodHlwZSwgcGF5bG9hZCwgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3QodHlwZSkgJiYgdHlwZS50eXBlKSB7XG4gICAgb3B0aW9ucyA9IHBheWxvYWQ7XG4gICAgcGF5bG9hZCA9IHR5cGU7XG4gICAgdHlwZSA9IHR5cGUudHlwZTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJywgKFwiZXhwZWN0cyBzdHJpbmcgYXMgdGhlIHR5cGUsIGJ1dCBmb3VuZCBcIiArICh0eXBlb2YgdHlwZSkgKyBcIi5cIikpO1xuICB9XG5cbiAgcmV0dXJuIHsgdHlwZTogdHlwZSwgcGF5bG9hZDogcGF5bG9hZCwgb3B0aW9uczogb3B0aW9ucyB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKF9WdWUpIHtcbiAgaWYgKFZ1ZSAmJiBfVnVlID09PSBWdWUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1t2dWV4XSBhbHJlYWR5IGluc3RhbGxlZC4gVnVlLnVzZShWdWV4KSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBWdWUgPSBfVnVlO1xuICBhcHBseU1peGluKFZ1ZSk7XG59XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBnZXR0aW5nIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHN0YXRlcyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IHN0YXRlIGFuZCBnZXR0ZXJzIGZvciBwYXJhbSwgeW91IGNhbiBkbyBzb21ldGhpbmcgZm9yIHN0YXRlIGFuZCBnZXR0ZXJzIGluIGl0LlxuICogQHBhcmFtIHtPYmplY3R9XG4gKi9cbnZhciBtYXBTdGF0ZSA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBzdGF0ZXMpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBub3JtYWxpemVNYXAoc3RhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkU3RhdGUgKCkge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy4kc3RvcmUuc3RhdGU7XG4gICAgICB2YXIgZ2V0dGVycyA9IHRoaXMuJHN0b3JlLmdldHRlcnM7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcFN0YXRlJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IG1vZHVsZS5jb250ZXh0LnN0YXRlO1xuICAgICAgICBnZXR0ZXJzID0gbW9kdWxlLmNvbnRleHQuZ2V0dGVycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmNhbGwodGhpcywgc3RhdGUsIGdldHRlcnMpXG4gICAgICAgIDogc3RhdGVbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgY29tbWl0dGluZyB0aGUgbXV0YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG11dGF0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBjb21taXRgIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbSwgaXQgY2FuIGFjY2VwdCBhbnRob3IgcGFyYW1zLiBZb3UgY2FuIGNvbW1pdCBtdXRhdGlvbiBhbmQgZG8gYW55IG90aGVyIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uLiBzcGVjaWFsbHksIFlvdSBuZWVkIHRvIHBhc3MgYW50aG9yIHBhcmFtcyBmcm9tIHRoZSBtYXBwZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBtYXBNdXRhdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgbXV0YXRpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgbm9ybWFsaXplTWFwKG11dGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZE11dGF0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBHZXQgdGhlIGNvbW1pdCBtZXRob2QgZnJvbSBzdG9yZVxuICAgICAgdmFyIGNvbW1pdCA9IHRoaXMuJHN0b3JlLmNvbW1pdDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwTXV0YXRpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb21taXQgPSBtb2R1bGUuY29udGV4dC5jb21taXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbY29tbWl0XS5jb25jYXQoYXJncykpXG4gICAgICAgIDogY29tbWl0LmFwcGx5KHRoaXMuJHN0b3JlLCBbdmFsXS5jb25jYXQoYXJncykpXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgZ2V0dGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZ2V0dGVyc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwR2V0dGVycyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBnZXR0ZXJzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgbm9ybWFsaXplTWFwKGdldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgLy8gVGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBtdXRhdGVkIGJ5IG5vcm1hbGl6ZU5hbWVzcGFjZVxuICAgIHZhbCA9IG5hbWVzcGFjZSArIHZhbDtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEdldHRlciAoKSB7XG4gICAgICBpZiAobmFtZXNwYWNlICYmICFnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEdldHRlcnMnLCBuYW1lc3BhY2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgISh2YWwgaW4gdGhpcy4kc3RvcmUuZ2V0dGVycykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBnZXR0ZXI6IFwiICsgdmFsKSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZGlzcGF0Y2ggdGhlIGFjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gYWN0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBkaXNwYXRjaGAgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtLCBpdCBjYW4gYWNjZXB0IGFudGhvciBwYXJhbXMuIFlvdSBjYW4gZGlzcGF0Y2ggYWN0aW9uIGFuZCBkbyBhbnkgb3RoZXIgdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24uIHNwZWNpYWxseSwgWW91IG5lZWQgdG8gcGFzcyBhbnRob3IgcGFyYW1zIGZyb20gdGhlIG1hcHBlZCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIG1hcEFjdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgYWN0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIG5vcm1hbGl6ZU1hcChhY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkQWN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBnZXQgZGlzcGF0Y2ggZnVuY3Rpb24gZnJvbSBzdG9yZVxuICAgICAgdmFyIGRpc3BhdGNoID0gdGhpcy4kc3RvcmUuZGlzcGF0Y2g7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEFjdGlvbnMnLCBuYW1lc3BhY2UpO1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoID0gbW9kdWxlLmNvbnRleHQuZGlzcGF0Y2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbZGlzcGF0Y2hdLmNvbmNhdChhcmdzKSlcbiAgICAgICAgOiBkaXNwYXRjaC5hcHBseSh0aGlzLiRzdG9yZSwgW3ZhbF0uY29uY2F0KGFyZ3MpKVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLyoqXG4gKiBSZWJpbmRpbmcgbmFtZXNwYWNlIHBhcmFtIGZvciBtYXBYWFggZnVuY3Rpb24gaW4gc3BlY2lhbCBzY29wZWQsIGFuZCByZXR1cm4gdGhlbSBieSBzaW1wbGUgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBjcmVhdGVOYW1lc3BhY2VkSGVscGVycyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHsgcmV0dXJuICh7XG4gIG1hcFN0YXRlOiBtYXBTdGF0ZS5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBNdXRhdGlvbnM6IG1hcE11dGF0aW9ucy5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMuYmluZChudWxsLCBuYW1lc3BhY2UpXG59KTsgfTtcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIG1hcFxuICogbm9ybWFsaXplTWFwKFsxLCAyLCAzXSkgPT4gWyB7IGtleTogMSwgdmFsOiAxIH0sIHsga2V5OiAyLCB2YWw6IDIgfSwgeyBrZXk6IDMsIHZhbDogMyB9IF1cbiAqIG5vcm1hbGl6ZU1hcCh7YTogMSwgYjogMiwgYzogM30pID0+IFsgeyBrZXk6ICdhJywgdmFsOiAxIH0sIHsga2V5OiAnYicsIHZhbDogMiB9LCB7IGtleTogJ2MnLCB2YWw6IDMgfSBdXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gbWFwXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcCAobWFwKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcClcbiAgICA/IG1hcC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDoga2V5IH0pOyB9KVxuICAgIDogT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDogbWFwW2tleV0gfSk7IH0pXG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gZXhwZWN0IHR3byBwYXJhbSBjb250YWlucyBuYW1lc3BhY2UgYW5kIG1hcC4gaXQgd2lsbCBub3JtYWxpemUgdGhlIG5hbWVzcGFjZSBhbmQgdGhlbiB0aGUgcGFyYW0ncyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIG1hcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTmFtZXNwYWNlIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWFwKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICBtYXAgPSBuYW1lc3BhY2U7XG4gICAgICBuYW1lc3BhY2UgPSAnJztcbiAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZS5jaGFyQXQobmFtZXNwYWNlLmxlbmd0aCAtIDEpICE9PSAnLycpIHtcbiAgICAgIG5hbWVzcGFjZSArPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiBmbihuYW1lc3BhY2UsIG1hcClcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaCBhIHNwZWNpYWwgbW9kdWxlIGZyb20gc3RvcmUgYnkgbmFtZXNwYWNlLiBpZiBtb2R1bGUgbm90IGV4aXN0LCBwcmludCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0b3JlXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVscGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE1vZHVsZUJ5TmFtZXNwYWNlIChzdG9yZSwgaGVscGVyLCBuYW1lc3BhY2UpIHtcbiAgdmFyIG1vZHVsZSA9IHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFtb2R1bGUpIHtcbiAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBtb2R1bGUgbmFtZXNwYWNlIG5vdCBmb3VuZCBpbiBcIiArIGhlbHBlciArIFwiKCk6IFwiICsgbmFtZXNwYWNlKSk7XG4gIH1cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG52YXIgaW5kZXhfZXNtID0ge1xuICBTdG9yZTogU3RvcmUsXG4gIGluc3RhbGw6IGluc3RhbGwsXG4gIHZlcnNpb246ICczLjEuMScsXG4gIG1hcFN0YXRlOiBtYXBTdGF0ZSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMsXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMsXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMsXG4gIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzOiBjcmVhdGVOYW1lc3BhY2VkSGVscGVyc1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXhfZXNtO1xuZXhwb3J0IHsgU3RvcmUsIGluc3RhbGwsIG1hcFN0YXRlLCBtYXBNdXRhdGlvbnMsIG1hcEdldHRlcnMsIG1hcEFjdGlvbnMsIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzIH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\n");
/***/ }),
/***/ "./node_modules/_webpack@4.41.2@webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3dlYnBhY2tANC40MS4yQHdlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_webpack@4.41.2@webpack/buildin/global.js\n");
/***/ }),
/***/ "./node_modules/_xhr@2.4.0@xhr/index.js":
/*!**********************************************!*\
!*** ./node_modules/_xhr@2.4.0@xhr/index.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar window = __webpack_require__(/*! global/window */ \"./node_modules/_global@4.3.2@global/window.js\")\nvar isFunction = __webpack_require__(/*! is-function */ \"./node_modules/_is-function@1.0.1@is-function/index.js\")\nvar parseHeaders = __webpack_require__(/*! parse-headers */ \"./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js\")\nvar xtend = __webpack_require__(/*! xtend */ \"./node_modules/_xtend@4.0.2@xtend/immutable.js\")\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function(method) {\n createXHR[method === \"delete\" ? \"del\" : method] = function(uri, options, callback) {\n options = initParams(uri, options, callback)\n options.method = method.toUpperCase()\n return _createXHR(options)\n }\n})\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i])\n }\n}\n\nfunction isEmpty(obj){\n for(var i in obj){\n if(obj.hasOwnProperty(i)) return false\n }\n return true\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri\n\n if (isFunction(options)) {\n callback = options\n if (typeof uri === \"string\") {\n params = {uri:uri}\n }\n } else {\n params = xtend(options, {uri: uri})\n }\n\n params.callback = callback\n return params\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback)\n return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n if(typeof options.callback === \"undefined\"){\n throw new Error(\"callback argument missing\")\n }\n\n var called = false\n var callback = function cbOnce(err, response, body){\n if(!called){\n called = true\n options.callback(err, response, body)\n }\n }\n\n function readystatechange() {\n if (xhr.readyState === 4) {\n setTimeout(loadFunc, 0)\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined\n\n if (xhr.response) {\n body = xhr.response\n } else {\n body = xhr.responseText || getXml(xhr)\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body)\n } catch (e) {}\n }\n\n return body\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer)\n if(!(evt instanceof Error)){\n evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n }\n evt.statusCode = 0\n return callback(evt, failureResponse)\n }\n\n // will load the data & process the response in a special response object\n function loadFunc() {\n if (aborted) return\n var status\n clearTimeout(timeoutTimer)\n if(options.useXDR && xhr.status===undefined) {\n //IE8 CORS GET successful response doesn't have a status field, but body is fine\n status = 200\n } else {\n status = (xhr.status === 1223 ? 204 : xhr.status)\n }\n var response = failureResponse\n var err = null\n\n if (status !== 0){\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n }\n if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders())\n }\n } else {\n err = new Error(\"Internal XMLHttpRequest Error\")\n }\n return callback(err, response, response.body)\n }\n\n var xhr = options.xhr || null\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest()\n }else{\n xhr = new createXHR.XMLHttpRequest()\n }\n }\n\n var key\n var aborted\n var uri = xhr.url = options.uri || options.url\n var method = xhr.method = options.method || \"GET\"\n var body = options.body || options.data\n var headers = xhr.headers = options.headers || {}\n var sync = !!options.sync\n var isJson = false\n var timeoutTimer\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n }\n\n if (\"json\" in options && options.json !== false) {\n isJson = true\n headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n if (method !== \"GET\" && method !== \"HEAD\") {\n headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n body = JSON.stringify(options.json === true ? body : options.json)\n }\n }\n\n xhr.onreadystatechange = readystatechange\n xhr.onload = loadFunc\n xhr.onerror = errorFunc\n // IE9 must have onprogress be set to a unique function.\n xhr.onprogress = function () {\n // IE must die\n }\n xhr.onabort = function(){\n aborted = true;\n }\n xhr.ontimeout = errorFunc\n xhr.open(method, uri, !sync, options.username, options.password)\n //has to be after open\n if(!sync) {\n xhr.withCredentials = !!options.withCredentials\n }\n // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n if (!sync && options.timeout > 0 ) {\n timeoutTimer = setTimeout(function(){\n if (aborted) return\n aborted = true//IE9 may still call readystatechange\n xhr.abort(\"timeout\")\n var e = new Error(\"XMLHttpRequest timeout\")\n e.code = \"ETIMEDOUT\"\n errorFunc(e)\n }, options.timeout )\n }\n\n if (xhr.setRequestHeader) {\n for(key in headers){\n if(headers.hasOwnProperty(key)){\n xhr.setRequestHeader(key, headers[key])\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n }\n\n if (\"responseType\" in options) {\n xhr.responseType = options.responseType\n }\n\n if (\"beforeSend\" in options &&\n typeof options.beforeSend === \"function\"\n ) {\n options.beforeSend(xhr)\n }\n\n // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n xhr.send(body || null)\n\n return xhr\n\n\n}\n\nfunction getXml(xhr) {\n if (xhr.responseType === \"document\") {\n return xhr.responseXML\n }\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\"\n if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n return xhr.responseXML\n }\n\n return null\n}\n\nfunction noop() {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3hockAyLjQuMEB4aHIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3hockAyLjQuMEB4aHIvaW5kZXguanM/ZWFmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKFwiaXMtZnVuY3Rpb25cIilcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKFwicGFyc2UtaGVhZGVyc1wiKVxudmFyIHh0ZW5kID0gcmVxdWlyZShcInh0ZW5kXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlWEhSXG5jcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxuY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0ID0gXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiAobmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpKSA/IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA6IHdpbmRvdy5YRG9tYWluUmVxdWVzdFxuXG5mb3JFYWNoQXJyYXkoW1wiZ2V0XCIsIFwicHV0XCIsIFwicG9zdFwiLCBcInBhdGNoXCIsIFwiaGVhZFwiLCBcImRlbGV0ZVwiXSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgY3JlYXRlWEhSW21ldGhvZCA9PT0gXCJkZWxldGVcIiA/IFwiZGVsXCIgOiBtZXRob2RdID0gZnVuY3Rpb24odXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG4gICAgfVxufSlcblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iail7XG4gICAgZm9yKHZhciBpIGluIG9iail7XG4gICAgICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciBwYXJhbXMgPSB1cmlcblxuICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0ge3VyaTp1cml9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMgPSB4dGVuZChvcHRpb25zLCB7dXJpOiB1cml9KVxuICAgIH1cblxuICAgIHBhcmFtcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBjcmVhdGVYSFIodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVhIUihvcHRpb25zKSB7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMuY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlXG4gICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2JPbmNlKGVyciwgcmVzcG9uc2UsIGJvZHkpe1xuICAgICAgICBpZighY2FsbGVkKXtcbiAgICAgICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soZXJyLCByZXNwb25zZSwgYm9keSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChsb2FkRnVuYywgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgICAgIC8vIENocm9tZSB3aXRoIHJlcXVlc3RUeXBlPWJsb2IgdGhyb3dzIGVycm9ycyBhcnJvdW5kIHdoZW4gZXZlbiB0ZXN0aW5nIGFjY2VzcyB0byByZXNwb25zZVRleHRcbiAgICAgICAgdmFyIGJvZHkgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlVGV4dCB8fCBnZXRYbWwoeGhyKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV2dCwgZmFpbHVyZVJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkRnVuYygpIHtcbiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICB2YXIgc3RhdHVzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpXG4gICAgICAgIGlmKG9wdGlvbnMudXNlWERSICYmIHhoci5zdGF0dXM9PT11bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vSUU4IENPUlMgR0VUIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZG9lc24ndCBoYXZlIGEgc3RhdHVzIGZpZWxkLCBidXQgYm9keSBpcyBmaW5lXG4gICAgICAgICAgICBzdGF0dXMgPSAyMDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9ICh4aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogeGhyLnN0YXR1cylcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBmYWlsdXJlUmVzcG9uc2VcbiAgICAgICAgdmFyIGVyciA9IG51bGxcblxuICAgICAgICBpZiAoc3RhdHVzICE9PSAwKXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICAgICAgcmF3UmVxdWVzdDogeGhyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJJbnRlcm5hbCBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGFcbiAgICB2YXIgaGVhZGVycyA9IHhoci5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgdmFyIHN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICAgIHZhciBpc0pzb24gPSBmYWxzZVxuICAgIHZhciB0aW1lb3V0VGltZXJcbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgdXJsOiB1cmksXG4gICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgIH1cblxuICAgIGlmIChcImpzb25cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuanNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24gPT09IHRydWUgPyBib2R5IDogb3B0aW9ucy5qc29uKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlYWR5c3RhdGVjaGFuZ2VcbiAgICB4aHIub25sb2FkID0gbG9hZEZ1bmNcbiAgICB4aHIub25lcnJvciA9IGVycm9yRnVuY1xuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmNcbiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpXG4gICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlblxuICAgIGlmKCFzeW5jKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgfVxuICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdFxuICAgIC8vIG5vdCBzZXR0aW5nIHRpbWVvdXQgb24gdGhlIHhociBvYmplY3QsIGJlY2F1c2Ugb2Ygb2xkIHdlYmtpdHMgZXRjLiBub3QgaGFuZGxpbmcgdGhhdCBjb3JyZWN0bHlcbiAgICAvLyBib3RoIG5wbSdzIHJlcXVlc3QgYW5kIGpxdWVyeSAxLnggdXNlIHRoaXMga2luZCBvZiB0aW1lb3V0LCBzbyB0aGlzIGlzIGJlaW5nIGNvbnNpc3RlbnRcbiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHtcbiAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICAgICAgYWJvcnRlZCA9IHRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgLy8gTWljcm9zb2Z0IEVkZ2UgYnJvd3NlciBzZW5kcyBcInVuZGVmaW5lZFwiIHdoZW4gc2VuZCBpcyBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdmFsdWUuXG4gICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3BlYyBzYXlzIHRvIHBhc3MgbnVsbCBhcyBib2R5IHRvIGluZGljYXRlIG5vIGJvZHlcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdWd0dXIveGhyL2lzc3Vlcy8xMDAuXG4gICAgeGhyLnNlbmQoYm9keSB8fCBudWxsKVxuXG4gICAgcmV0dXJuIHhoclxuXG5cbn1cblxuZnVuY3Rpb24gZ2V0WG1sKHhocikge1xuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcImRvY3VtZW50XCIpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cbiAgICB2YXIgZmlyZWZveEJ1Z1Rha2VuRWZmZWN0ID0geGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_xhr@2.4.0@xhr/index.js\n");
/***/ }),
/***/ "./node_modules/_xtend@4.0.2@xtend/immutable.js":
/*!******************************************************!*\
!*** ./node_modules/_xtend@4.0.2@xtend/immutable.js ***!
\******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3h0ZW5kQDQuMC4yQHh0ZW5kL2ltbXV0YWJsZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9feHRlbmRANC4wLjJAeHRlbmQvaW1tdXRhYmxlLmpzPzFlYmEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_xtend@4.0.2@xtend/immutable.js\n");
/***/ }),
/***/ "./src/App.vue":
/*!*********************!*\
!*** ./src/App.vue ***!
\*********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\");\n/* harmony import */ var _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.vue?vue&type=script&lang=js& */ \"./src/App.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App.vue?vue&type=style&index=0&lang=scss& */ \"./src/App.vue?vue&type=style&index=0&lang=scss&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('7ba5bd90')) {\n api.createRecord('7ba5bd90', component.options)\n } else {\n api.reload('7ba5bd90', component.options)\n }\n module.hot.accept(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\");\n(function () {\n api.rerender('7ba5bd90', {\n render: _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/App.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9BcHAudnVlPzVkYzMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzdiYTViZDkwJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzdiYTViZDkwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzdiYTViZDkwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJlwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhcGkucmVyZW5kZXIoJzdiYTViZDkwJywge1xuICAgICAgICByZW5kZXI6IHJlbmRlcixcbiAgICAgICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0aWNSZW5kZXJGbnNcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJzcmMvQXBwLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/App.vue\n");
/***/ }),
/***/ "./src/App.vue?vue&type=script&lang=js&":
/*!**********************************************!*\
!*** ./src/App.vue?vue&type=script&lang=js& ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../node_modules/_babel-loader@8.0.6@babel-loader/lib!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT8wYzc2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!*******************************************************!*\
!*** ./src/App.vue?vue&type=style&index=0&lang=scss& ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT84ZjU1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9BcHAudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmbGFuZz1zY3NzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=style&index=0&lang=scss&\n");
/***/ }),
/***/ "./src/App.vue?vue&type=template&id=7ba5bd90&":
/*!****************************************************!*\
!*** ./src/App.vue?vue&type=template&id=7ba5bd90& ***!
\****************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=template&id=7ba5bd90& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YmE1YmQ5MCYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT9hNGQzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCItIWNhY2hlLWxvYWRlcj97XFxcImNhY2hlRGlyZWN0b3J5XFxcIjpcXFwibm9kZV9tb2R1bGVzLy5jYWNoZS92dWUtbG9hZGVyXFxcIixcXFwiY2FjaGVJZGVudGlmaWVyXFxcIjpcXFwiMzkwN2JiY2EtdnVlLWxvYWRlci10ZW1wbGF0ZVxcXCJ9IS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YmE1YmQ5MCZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=template&id=7ba5bd90&\n");
/***/ }),
/***/ "./src/api/api.js":
/*!************************!*\
!*** ./src/api/api.js ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = {\n load: \"/pingan_hklife_webapi/user/load\",\n logout: \"/pingan_hklife_webapi/user/logout\",\n // 基本信息\n baseInfo: \"/pingan_hklife_webapi/user/baseInfo\",\n // 用户身份信息\n profile: \"/pingan_hklife_webapi/user/profile\",\n // 是否显示图形验证码接口\n stdIsShowImageVcode: \"/pingan_hklife_webapi/auth/stdIsShowImageVcode\",\n // 刷新图形验证码接口\n stdRefreshVcode: \"/pingan_hklife_webapi/auth/stdRefreshVcode\",\n // OTP发送接口\n stdSendOTP: \"/pingan_hklife_webapi/auth/stdSendOTP\",\n // OTP验证与验重接口\n stdValidateOTPandRepeat: \"/pingan_hklife_webapi/auth/stdValidateOTPandRepeat\",\n // 注册手机号验重接口\n gsRegCheck: \"/pingan_hklife_webapi/auth/gsRegCheck\",\n // 账户整合登录接口\n gsLogin: \"/pingan_hklife_webapi/auth/gsLogin\",\n // 注册接口\n stdRegister: \"/pingan_hklife_webapi/auth/stdRegister\",\n // 修改密码\n changePassword: \"/pingan_hklife_webapi/user/password/change\",\n // 短信验证码登录\n otpLogin: \"/pingan_hklife_webapi/user/otpLogin\",\n // 短信验证码登录\n otpRegisterAndLogin: \"/pingan_hklife_webapi/user/otpRegisterAndLogin\",\n // 找回密码:定位用户信息\n locateUserInfo: \"/pingan_hklife_webapi/reset/locateUserInfo\",\n // 找回密码:发送验证码\n sendOtp: \"/pingan_hklife_webapi/reset/sendOtp\",\n // 找回密码:校验验证码\n checkOtp: \"/pingan_hklife_webapi/reset/checkOtp\",\n // 找回密码:重置密码\n resetPwd: \"/pingan_hklife_webapi/reset/resetPwd\",\n // 找回密码:重置密码\n updateInformation: \"/pingan_hklife_webapi/user/updateInformation\",\n // 读取联系方式\n getContacts: \"/pingan_hklife_webapi/customService/contacts/get\",\n // 更新联系方式\n updateContacts: \"/pingan_hklife_webapi/customService/contacts/update\",\n // 保存預約服務\n saveReservation: \"/pingan_hklife_webapi/customService/reservation/save\",\n // 保存投訴建議\n saveComplain: \"/pingan_hklife_webapi/customService/complain/save\",\n // 保单接口\n policyList: \"/pingan_hklife_webapi/policy/list\",\n // 保单接口\n policyDetail: \"/pingan_hklife_webapi/policy/detail\",\n // 保单聯系方式變更\n updatePolicyContanct: \"/pingan_hklife_webapi/policy/updateContacts\",\n // 保单客戶資料變更\n updatePolicyInfo: \"/pingan_hklife_webapi/policy/updateInfo\",\n // 证件上传\n idPicUpload: \"/pingan_hklife_webapi/policy/idPicUpload\",\n // cms相关\n indexVideo: \"/pingan_hklife_webapi/cms/indexVideo\",\n banner: \"/pingan_hklife_webapi/cms/banner/list\",\n newsList: \"/pingan_hklife_webapi/cms/news/list\",\n newsDetail: \"/pingan_hklife_webapi/cms/news/get\",\n companyOutline: \"/pingan_hklife_webapi/cms/company/outline\"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXBpL2FwaS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hcGkvYXBpLmpzPzRlYzMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvYWQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvbG9hZFwiLFxuICBsb2dvdXQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvbG9nb3V0XCIsXG4gIC8vIOWfuuacrOS/oeaBr1xuICBiYXNlSW5mbzogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9iYXNlSW5mb1wiLFxuICAvLyDnlKjmiLfouqvku73kv6Hmga9cbiAgcHJvZmlsZTogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9wcm9maWxlXCIsXG4gIC8vIOaYr+WQpuaYvuekuuWbvuW9oumqjOivgeeggeaOpeWPo1xuICBzdGRJc1Nob3dJbWFnZVZjb2RlOiBcIi9waW5nYW5faGtsaWZlX3dlYmFwaS9hdXRoL3N0ZElzU2hvd0ltYWdlVmNvZGVcIixcbiAgLy8g5Yi35paw5Zu+5b2i6aqM6K+B56CB5o6l5Y+jXG4gIHN0ZFJlZnJlc2hWY29kZTogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9zdGRSZWZyZXNoVmNvZGVcIixcbiAgLy8gT1RQ5Y+R6YCB5o6l5Y+jXG4gIHN0ZFNlbmRPVFA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvc3RkU2VuZE9UUFwiLFxuICAvLyBPVFDpqozor4HkuI7pqozph43mjqXlj6NcbiAgc3RkVmFsaWRhdGVPVFBhbmRSZXBlYXQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvc3RkVmFsaWRhdGVPVFBhbmRSZXBlYXRcIixcbiAgLy8g5rOo5YaM5omL5py65Y+36aqM6YeN5o6l5Y+jXG4gIGdzUmVnQ2hlY2s6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvZ3NSZWdDaGVja1wiLFxuICAvLyDotKbmiLfmlbTlkIjnmbvlvZXmjqXlj6NcbiAgZ3NMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9nc0xvZ2luXCIsXG4gIC8vIOazqOWGjOaOpeWPo1xuICBzdGRSZWdpc3RlcjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9zdGRSZWdpc3RlclwiLFxuICAvLyDkv67mlLnlr4bnoIFcbiAgY2hhbmdlUGFzc3dvcmQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvcGFzc3dvcmQvY2hhbmdlXCIsXG4gIC8vIOefreS/oemqjOivgeeggeeZu+W9lVxuICBvdHBMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9vdHBMb2dpblwiLFxuICAvLyDnn63kv6Hpqozor4HnoIHnmbvlvZVcbiAgb3RwUmVnaXN0ZXJBbmRMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9vdHBSZWdpc3RlckFuZExvZ2luXCIsXG4gIC8vIOaJvuWbnuWvhuegge+8muWumuS9jeeUqOaIt+S/oeaBr1xuICBsb2NhdGVVc2VySW5mbzogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcmVzZXQvbG9jYXRlVXNlckluZm9cIixcbiAgLy8g5om+5Zue5a+G56CB77ya5Y+R6YCB6aqM6K+B56CBXG4gIHNlbmRPdHA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3Jlc2V0L3NlbmRPdHBcIixcbiAgLy8g5om+5Zue5a+G56CB77ya5qCh6aqM6aqM6K+B56CBXG4gIGNoZWNrT3RwOiBcIi9waW5nYW5faGtsaWZlX3dlYmFwaS9yZXNldC9jaGVja090cFwiLFxuICAvLyDmib7lm57lr4bnoIHvvJrph43nva7lr4bnoIFcbiAgcmVzZXRQd2Q6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3Jlc2V0L3Jlc2V0UHdkXCIsXG4gIC8vIOaJvuWbnuWvhuegge+8mumHjee9ruWvhueggVxuICB1cGRhdGVJbmZvcm1hdGlvbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci91cGRhdGVJbmZvcm1hdGlvblwiLFxuICAvLyDor7vlj5bogZTns7vmlrnlvI9cbiAgZ2V0Q29udGFjdHM6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2N1c3RvbVNlcnZpY2UvY29udGFjdHMvZ2V0XCIsXG4gIC8vIOabtOaWsOiBlOezu+aWueW8j1xuICB1cGRhdGVDb250YWN0czogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvY3VzdG9tU2VydmljZS9jb250YWN0cy91cGRhdGVcIixcbiAgLy8g5L+d5a2Y6aCQ57SE5pyN5YuZXG4gIHNhdmVSZXNlcnZhdGlvbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvY3VzdG9tU2VydmljZS9yZXNlcnZhdGlvbi9zYXZlXCIsXG4gIC8vIOS/neWtmOaKleiotOW7uuitsFxuICBzYXZlQ29tcGxhaW46IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2N1c3RvbVNlcnZpY2UvY29tcGxhaW4vc2F2ZVwiLFxuXG4gIC8vIOS/neWNleaOpeWPo1xuICBwb2xpY3lMaXN0IDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L2xpc3RcIixcbiAgLy8g5L+d5Y2V5o6l5Y+jXG4gIHBvbGljeURldGFpbCA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3BvbGljeS9kZXRhaWxcIixcbiAgLy8g5L+d5Y2V6IGv57O75pa55byP6K6K5pu0XG4gIHVwZGF0ZVBvbGljeUNvbnRhbmN0IDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L3VwZGF0ZUNvbnRhY3RzXCIsXG4gIC8vIOS/neWNleWuouaItuizh+aWmeiuiuabtFxuICB1cGRhdGVQb2xpY3lJbmZvIDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L3VwZGF0ZUluZm9cIixcbiAgLy8g6K+B5Lu25LiK5LygXG4gIGlkUGljVXBsb2FkIDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L2lkUGljVXBsb2FkXCIsXG5cblxuICAvLyBjbXPnm7jlhbNcbiAgaW5kZXhWaWRlbyA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2Ntcy9pbmRleFZpZGVvXCIsXG4gIGJhbm5lciA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2Ntcy9iYW5uZXIvbGlzdFwiLFxuICBuZXdzTGlzdCA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2Ntcy9uZXdzL2xpc3RcIixcbiAgbmV3c0RldGFpbCA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2Ntcy9uZXdzL2dldFwiLFxuICBjb21wYW55T3V0bGluZSA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2Ntcy9jb21wYW55L291dGxpbmVcIlxufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/api/api.js\n");
/***/ }),
/***/ "./src/api/fetch-api.js":
/*!******************************!*\
!*** ./src/api/fetch-api.js ***!
\******************************/
/*! exports provided: httpGet, httpPost, formdata */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"httpGet\", function() { return httpGet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"httpPost\", function() { return httpPost; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formdata\", function() { return formdata; });\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.regexp.replace */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_regexp_to_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.regexp.to-string */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es6_regexp_to_string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_to_string__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.regexp.split */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js\");\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _store_state_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/store/state.js */ \"./src/store/state.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! crypto-js */ \"./node_modules/_crypto-js@3.1.9-1@crypto-js/index.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(crypto_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var jsencrypt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jsencrypt */ \"./node_modules/_jsencrypt@3.0.0-rc.1@jsencrypt/bin/jsencrypt.js\");\n/* harmony import */ var jsencrypt__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(jsencrypt__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\nvar key = \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA1SNj4qiOEmvTkZfp+Gt0UOLTCdxuEqRE+k0fROhgZdN2GmtDg6jcZV/CXKdwQGGdwOYdxEngRQb2K/SXd5Rnu4MkuAoHopDNrBRVqoJNQi6VOv6fvAEzeYivtS9aMM7IvdZuN1QlASCz2vxfUKJ3BaijMQqQE9m0pVm+0BDEfwIDAQAB\";\nvar encryptSwitch = \"true\";\nvar rsa = new jsencrypt__WEBPACK_IMPORTED_MODULE_6___default.a();\nrsa.setPublicKey(key);\nvar chars = \"0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z\".split(\",\");\n\nfunction randomAesKey() {\n var res = \"\";\n\n for (var i = 0; i < 16; i++) {\n var id = Math.ceil(Math.random() * (chars.length - 1));\n res += chars[id];\n }\n\n return res;\n}\n\n;\n\nfunction encryptContent(obj) {\n var aesKey = randomAesKey();\n var key = crypto_js__WEBPACK_IMPORTED_MODULE_5___default.a.enc.Utf8.parse(aesKey);\n var encrypted = crypto_js__WEBPACK_IMPORTED_MODULE_5___default.a.AES.encrypt(JSON.stringify(obj), key, {\n mode: crypto_js__WEBPACK_IMPORTED_MODULE_5___default.a.mode.ECB,\n padding: crypto_js__WEBPACK_IMPORTED_MODULE_5___default.a.pad.Pkcs7\n });\n var content = encrypted.toString(); //返回的是base64格式的密文\n\n var securityKey = rsa.encrypt(aesKey);\n var result = {\n k: securityKey,\n v: content\n };\n return result;\n}\n\n; // import {\n// Toast\n// } from 'vant';\n\nfunction Toast(msg) {\n console.log(\"msg:\", msg);\n} // axios的默认url\n// axios.defaults.baseURL = \"\"\n// 服务器地址\n// let base = process.env.REQUEST_DOMAIN || \"http://localhost:9101\";\n// let base = COM.baseUrl;\n// console.log(process.env);\n\n\nvar base = \"\";\nvar axios = axios__WEBPACK_IMPORTED_MODULE_3___default.a.create({\n baseURL: \"https://30.76.147.155\",\n timeout: 5000\n});\nvar encryptPattern = [/^\\/pingan_hklife_webapi\\/policy.*/, /^\\/pingan_hklife_webapi\\/user.*/, /^\\/pingan_hklife_webapi\\/auth.*/, /^\\/pingan_hklife_webapi\\/customService.*/];\nvar encryptWhileList = [\"/pingan_hklife_webapi/policy/idPicUpload\"]; // 请求拦截器\n\naxios.interceptors.request.use(function (config) {\n if (encryptSwitch == \"true\") {\n for (var index = 0; index < encryptPattern.length; index++) {\n var element = encryptPattern[index];\n\n if (element.test(config.url)) {\n if (encryptWhileList.indexOf(config.url) >= 0) {\n break;\n }\n\n var data = config.data;\n\n try {\n config.data = encryptContent(data);\n } catch (e) {\n console.error(e);\n }\n\n break;\n }\n }\n }\n\n return config;\n}, function (error) {\n return Promise.error(error);\n}); // 响应拦截器\n\naxios.interceptors.response.use(function (response) {\n if (response.status === 200) {\n if (response.data.code === 200) {\n return Promise.resolve(response);\n } else {\n // Toast(response.data.bizMsg);\n return Promise.reject(response.data);\n }\n } else {\n return Promise.reject(response.data);\n }\n}, // 服务器状态码不是200的情况\nfunction (error) {\n if (error.response.status) {\n switch (error.response.status) {\n // 401: 未登录\n // 未登录则跳转登录页面,并携带当前页面的路径\n // 在登录成功后返回当前页面,这一步需要在登录页操作。\n case 401:\n router.replace({\n path: '/login',\n query: {\n redirect: router.currentRoute.fullPath\n }\n });\n break;\n // 403 token过期\n // 登录过期对用户进行提示\n // 清除本地token和清空vuex中token对象\n // 跳转登录页面\n\n case 403:\n Toast({\n message: '登录过期,请重新登录',\n duration: 1000,\n forbidClick: true\n }); // 清除token\n\n localStorage.removeItem('token');\n store.commit('loginSuccess', null); // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面\n\n setTimeout(function () {\n router.replace({\n path: '/login',\n query: {\n redirect: router.currentRoute.fullPath\n }\n });\n }, 1000);\n break;\n // 404请求不存在\n\n case 404:\n Toast({\n message: '网络请求不存在',\n duration: 1500,\n forbidClick: true\n });\n break;\n // 其他错误,直接抛出错误提示\n\n default:\n Toast({\n message: error.response.data.message,\n duration: 1500,\n forbidClick: true\n });\n }\n\n return Promise.reject(error.response);\n }\n}); //formDataHeaders设置\n\nvar formDataHeaders = {\n headers: {\n \"Content-Type\": \"multipart/form-data\"\n }\n};\n/**\n * 封装get方法\n * @param {*} params\n */\n\nvar httpGet = function httpGet(params) {\n var url = params.url,\n data = params.data,\n sid = params.sid;\n var headers = {};\n\n if (sid) {\n var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid : \"\";\n headers = {\n headers: {\n sid: sessionId\n }\n };\n }\n\n return axios.get(\"\".concat(base).concat(url), {\n params: data\n }, headers).then(function (res) {\n return res.data.content;\n });\n};\n/**\n * 封装post方法\n * @param {*} params\n */\n\nvar httpPost = function httpPost(params) {\n var url = params.url,\n data = params.data,\n sid = params.sid,\n sidStr = params.sidStr;\n var headers = {};\n\n if (sid) {\n var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid : \"\";\n headers = {\n headers: {\n sid: sessionId\n }\n };\n }\n\n if (sidStr) {\n headers = {\n headers: {\n sid: sidStr\n }\n };\n }\n\n return axios.post(\"\".concat(base).concat(url), data, headers).then(function (res) {\n return res.data.content;\n });\n};\n/**\n * 封装post方法\n * @param {*} params\n * data数据是 formdata格式\n * 例如:\n * this.file = file\n let data = new FormData() //使用formData对象\n data.append('path', '/pro/mzczcradmin/')\n data.append('file', file.file)\n */\n\nvar formdata = function formdata(params) {\n var url = params.url,\n data = params.data,\n sid = params.sid;\n var headers = {\n headers: {\n \"Content-Type\": \"multipart/form-data\"\n }\n };\n var formData = new FormData(); //使用formData对象\n\n for (var _key in data) {\n formData.append(_key, data[_key]);\n }\n\n if (sid) {\n var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].userInfo.sid : \"\";\n headers.headers.sid = sessionId;\n }\n\n return axios.post(\"\".concat(base).concat(url), formData, headers).then(function (res) {\n return res.data;\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXBpL2ZldGNoLWFwaS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hcGkvZmV0Y2gtYXBpLmpzP2VkMGIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zSW5zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBzdGF0ZSBmcm9tICdAL3N0b3JlL3N0YXRlLmpzJztcbmltcG9ydCBDcnlwdG9KUyBmcm9tIFwiY3J5cHRvLWpzXCI7XG5pbXBvcnQgSnNFbmNyeXB0IGZyb20gXCJqc2VuY3J5cHRcIjtcblxubGV0IGtleSA9IHByb2Nlc3MuZW52LlZVRV9BUFBfQ09OVEVOVF9FTkNSWVBUX0tFWTtcbmxldCBlbmNyeXB0U3dpdGNoID0gcHJvY2Vzcy5lbnYuVlVFX0FQUF9DT05URU5UX0VOQ1JZUFRfU1dJVENIO1xubGV0IHJzYSA9IG5ldyBKc0VuY3J5cHQoKTtcbnJzYS5zZXRQdWJsaWNLZXkoa2V5KTtcbmxldCBjaGFycyA9IFwiMCwxLDIsMyw0LDUsNiw3LDgsOSxhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdSx2LHcseCx5LHpcIi5zcGxpdChcIixcIik7XG5cbmZ1bmN0aW9uIHJhbmRvbUFlc0tleSgpIHtcblx0bGV0IHJlcyA9IFwiXCI7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuXHRcdGxldCBpZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogKGNoYXJzLmxlbmd0aCAtIDEpKTtcblx0XHRyZXMgKz0gY2hhcnNbaWRdO1xuXHR9XG5cdHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBlbmNyeXB0Q29udGVudChvYmopIHtcblx0bGV0IGFlc0tleSA9IHJhbmRvbUFlc0tleSgpO1xuXHRsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoYWVzS2V5KTtcblx0dmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KG9iaiksIGtleSwge1xuXHRcdG1vZGU6IENyeXB0b0pTLm1vZGUuRUNCLFxuXHRcdHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xuXHR9KTtcblx0bGV0IGNvbnRlbnQgPSBlbmNyeXB0ZWQudG9TdHJpbmcoKTsgLy/ov5Tlm57nmoTmmK9iYXNlNjTmoLzlvI/nmoTlr4bmlodcblx0bGV0IHNlY3VyaXR5S2V5ID0gcnNhLmVuY3J5cHQoYWVzS2V5KTtcblxuXHRsZXQgcmVzdWx0ID0ge1xuXHRcdGs6IHNlY3VyaXR5S2V5LFxuXHRcdHY6IGNvbnRlbnRcblx0fTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGltcG9ydCB7XG4vLyAgIFRvYXN0XG4vLyB9IGZyb20gJ3ZhbnQnO1xuXG5mdW5jdGlvbiBUb2FzdChtc2cpIHtcblx0Y29uc29sZS5sb2coXCJtc2c6XCIsIG1zZyk7XG59XG5cbi8vIGF4aW9z55qE6buY6K6kdXJsXG4vLyBheGlvcy5kZWZhdWx0cy5iYXNlVVJMID0gXCJcIlxuXG4vLyDmnI3liqHlmajlnLDlnYBcbi8vIGxldCBiYXNlID0gcHJvY2Vzcy5lbnYuUkVRVUVTVF9ET01BSU4gfHwgXCJodHRwOi8vbG9jYWxob3N0OjkxMDFcIjtcbi8vIGxldCBiYXNlID0gQ09NLmJhc2VVcmw7XG4vLyBjb25zb2xlLmxvZyhwcm9jZXNzLmVudik7XG5sZXQgYmFzZSA9IFwiXCI7XG5jb25zdCBheGlvcyA9IGF4aW9zSW5zLmNyZWF0ZSh7XG5cdGJhc2VVUkw6IHByb2Nlc3MuZW52LlZVRV9BUFBfQkFTRV9VUkwsXG5cdHRpbWVvdXQ6IDUwMDBcbn0pXG5cbmxldCBlbmNyeXB0UGF0dGVybiA9IFtcblx0L15cXC9waW5nYW5faGtsaWZlX3dlYmFwaVxcL3BvbGljeS4qLyxcblx0L15cXC9waW5nYW5faGtsaWZlX3dlYmFwaVxcL3VzZXIuKi8sXG5cdC9eXFwvcGluZ2FuX2hrbGlmZV93ZWJhcGlcXC9hdXRoLiovLFxuXHQvXlxcL3Bpbmdhbl9oa2xpZmVfd2ViYXBpXFwvY3VzdG9tU2VydmljZS4qLyxcbl1cblxubGV0IGVuY3J5cHRXaGlsZUxpc3QgPSBbXG5cdFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3BvbGljeS9pZFBpY1VwbG9hZFwiXG5dXG5cbi8vIOivt+axguaLpuaIquWZqFxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxuXHRjb25maWcgPT4ge1xuXHRcdGlmIChlbmNyeXB0U3dpdGNoID09IFwidHJ1ZVwiKSB7XG5cdFx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZW5jcnlwdFBhdHRlcm4ubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdGxldCBlbGVtZW50ID0gZW5jcnlwdFBhdHRlcm5baW5kZXhdO1xuXHRcdFx0XHRpZiAoZWxlbWVudC50ZXN0KGNvbmZpZy51cmwpKSB7XG5cdFx0XHRcdFx0aWYgKGVuY3J5cHRXaGlsZUxpc3QuaW5kZXhPZihjb25maWcudXJsKSA+PSAwKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGV0IGRhdGEgPSBjb25maWcuZGF0YTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uZmlnLmRhdGEgPSBlbmNyeXB0Q29udGVudChkYXRhKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY29uZmlnO1xuXHR9LFxuXHRlcnJvciA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UuZXJyb3IoZXJyb3IpO1xuXHR9KVxuXG4vLyDlk43lupTmi6bmiKrlmahcbmF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG5cdHJlc3BvbnNlID0+IHtcblx0XHRpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcblx0XHRcdGlmIChyZXNwb25zZS5kYXRhLmNvZGUgPT09IDIwMCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRvYXN0KHJlc3BvbnNlLmRhdGEuYml6TXNnKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZGF0YSk7XG5cdFx0fVxuXHR9LFxuXHQvLyDmnI3liqHlmajnirbmgIHnoIHkuI3mmK8yMDDnmoTmg4XlhrVcblx0ZXJyb3IgPT4ge1xuXHRcdGlmIChlcnJvci5yZXNwb25zZS5zdGF0dXMpIHtcblx0XHRcdHN3aXRjaCAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzKSB7XG5cdFx0XHRcdC8vIDQwMTog5pyq55m75b2VXG5cdFx0XHRcdC8vIOacqueZu+W9leWImei3s+i9rOeZu+W9lemhtemdou+8jOW5tuaQuuW4puW9k+WJjemhtemdoueahOi3r+W+hFxuXHRcdFx0XHQvLyDlnKjnmbvlvZXmiJDlip/lkI7ov5Tlm57lvZPliY3pobXpnaLvvIzov5nkuIDmraXpnIDopoHlnKjnmbvlvZXpobXmk43kvZzjgIJcblx0XHRcdFx0Y2FzZSA0MDE6XG5cdFx0XHRcdFx0cm91dGVyLnJlcGxhY2Uoe1xuXHRcdFx0XHRcdFx0cGF0aDogJy9sb2dpbicsXG5cdFx0XHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdFx0XHRyZWRpcmVjdDogcm91dGVyLmN1cnJlbnRSb3V0ZS5mdWxsUGF0aFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvLyA0MDMgdG9rZW7ov4fmnJ9cblx0XHRcdFx0Ly8g55m75b2V6L+H5pyf5a+555So5oi36L+b6KGM5o+Q56S6XG5cdFx0XHRcdC8vIOa4hemZpOacrOWcsHRva2Vu5ZKM5riF56m6dnVleOS4rXRva2Vu5a+56LGhXG5cdFx0XHRcdC8vIOi3s+i9rOeZu+W9lemhtemdolxuXHRcdFx0XHRjYXNlIDQwMzpcblx0XHRcdFx0XHRUb2FzdCh7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiAn55m75b2V6L+H5pyf77yM6K+36YeN5paw55m75b2VJyxcblx0XHRcdFx0XHRcdGR1cmF0aW9uOiAxMDAwLFxuXHRcdFx0XHRcdFx0Zm9yYmlkQ2xpY2s6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvLyDmuIXpmaR0b2tlblxuXHRcdFx0XHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbicpO1xuXHRcdFx0XHRcdHN0b3JlLmNvbW1pdCgnbG9naW5TdWNjZXNzJywgbnVsbCk7XG5cdFx0XHRcdFx0Ly8g6Lez6L2s55m75b2V6aG16Z2i77yM5bm25bCG6KaB5rWP6KeI55qE6aG16Z2iZnVsbFBhdGjkvKDov4fljrvvvIznmbvlvZXmiJDlip/lkI7ot7PovazpnIDopoHorr/pl67nmoTpobXpnaJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHJvdXRlci5yZXBsYWNlKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogJy9sb2dpbicsXG5cdFx0XHRcdFx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdFx0XHRcdFx0cmVkaXJlY3Q6IHJvdXRlci5jdXJyZW50Um91dGUuZnVsbFBhdGhcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSwgMTAwMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIDQwNOivt+axguS4jeWtmOWcqFxuXHRcdFx0XHRjYXNlIDQwNDpcblx0XHRcdFx0XHRUb2FzdCh7XG5cdFx0XHRcdFx0XHRtZXNzYWdlOiAn572R57uc6K+35rGC5LiN5a2Y5ZyoJyxcblx0XHRcdFx0XHRcdGR1cmF0aW9uOiAxNTAwLFxuXHRcdFx0XHRcdFx0Zm9yYmlkQ2xpY2s6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Ly8g5YW25LuW6ZSZ6K+v77yM55u05o6l5oqb5Ye66ZSZ6K+v5o+Q56S6XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0VG9hc3Qoe1xuXHRcdFx0XHRcdFx0bWVzc2FnZTogZXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0ZHVyYXRpb246IDE1MDAsXG5cdFx0XHRcdFx0XHRmb3JiaWRDbGljazogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLnJlc3BvbnNlKTtcblx0XHR9XG5cdH1cbik7XG5cbi8vZm9ybURhdGFIZWFkZXJz6K6+572uXG5sZXQgZm9ybURhdGFIZWFkZXJzID0ge1xuXHRoZWFkZXJzOiB7XG5cdFx0XCJDb250ZW50LVR5cGVcIjogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcblx0fVxufVxuXG4vKipcbiAqIOWwgeijhWdldOaWueazlVxuICogQHBhcmFtIHsqfSBwYXJhbXNcbiAqL1xuZXhwb3J0IGNvbnN0IGh0dHBHZXQgPSBwYXJhbXMgPT4ge1xuXHRsZXQge1xuXHRcdHVybCxcblx0XHRkYXRhLFxuXHRcdHNpZFxuXHR9ID0gcGFyYW1zO1xuXHRsZXQgaGVhZGVycyA9IHt9O1xuXHRpZiAoc2lkKSB7XG5cdFx0bGV0IHNlc3Npb25JZCA9IHN0YXRlLnVzZXJJbmZvICYmIHN0YXRlLnVzZXJJbmZvLnNpZCA/IHN0YXRlLnVzZXJJbmZvLnNpZCA6IFwiXCI7XG5cdFx0aGVhZGVycyA9IHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0c2lkOiBzZXNzaW9uSWRcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGF4aW9zLmdldChgJHtiYXNlfSR7dXJsfWAsIHtcblx0XHRwYXJhbXM6IGRhdGFcblx0fSwgaGVhZGVycykudGhlbihyZXMgPT4gcmVzLmRhdGEuY29udGVudCk7XG59XG5cbi8qKlxuICog5bCB6KOFcG9zdOaWueazlVxuICogQHBhcmFtIHsqfSBwYXJhbXNcbiAqL1xuZXhwb3J0IGNvbnN0IGh0dHBQb3N0ID0gcGFyYW1zID0+IHtcblx0bGV0IHtcblx0XHR1cmwsXG5cdFx0ZGF0YSxcblx0XHRzaWQsXG5cdFx0c2lkU3RyLFxuXHR9ID0gcGFyYW1zO1xuXHRsZXQgaGVhZGVycyA9IHt9O1xuXHRpZiAoc2lkKSB7XG5cdFx0bGV0IHNlc3Npb25JZCA9IHN0YXRlLnVzZXJJbmZvICYmIHN0YXRlLnVzZXJJbmZvLnNpZCA/IHN0YXRlLnVzZXJJbmZvLnNpZCA6IFwiXCI7XG5cdFx0aGVhZGVycyA9IHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0c2lkOiBzZXNzaW9uSWRcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKHNpZFN0cikge1xuXHRcdGhlYWRlcnMgPSB7XG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdHNpZDogc2lkU3RyXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBheGlvcy5wb3N0KGAke2Jhc2V9JHt1cmx9YCwgZGF0YSwgaGVhZGVycykudGhlbihyZXMgPT4gcmVzLmRhdGEuY29udGVudCk7XG59XG5cbi8qKlxuICog5bCB6KOFcG9zdOaWueazlVxuICogQHBhcmFtIHsqfSBwYXJhbXNcbiAqIGRhdGHmlbDmja7mmK8gZm9ybWRhdGHmoLzlvI9cbiAqIOS+i+Wmgu+8mlxuICogICAgICAgICAgdGhpcy5maWxlID0gZmlsZVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBuZXcgRm9ybURhdGEoKSAvL+S9v+eUqGZvcm1EYXRh5a+56LGhXG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgncGF0aCcsICcvcHJvL216Y3pjcmFkbWluLycpXG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUuZmlsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1kYXRhID0gcGFyYW1zID0+IHtcblx0bGV0IHtcblx0XHR1cmwsXG5cdFx0ZGF0YSxcblx0XHRzaWQsXG5cdH0gPSBwYXJhbXM7XG5cdGxldCBoZWFkZXJzID0ge1xuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG5cdFx0fVxuXHR9XG5cdGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOyAvL+S9v+eUqGZvcm1EYXRh5a+56LGhXG5cdGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG5cdFx0Zm9ybURhdGEuYXBwZW5kKGtleSwgZGF0YVtrZXldKTtcblx0fVxuXHRpZiAoc2lkKSB7XG5cdFx0bGV0IHNlc3Npb25JZCA9IHN0YXRlLnVzZXJJbmZvICYmIHN0YXRlLnVzZXJJbmZvLnNpZCA/IHN0YXRlLnVzZXJJbmZvLnNpZCA6IFwiXCI7XG5cdFx0aGVhZGVycy5oZWFkZXJzLnNpZCA9IHNlc3Npb25JZDtcblx0fVxuXHRyZXR1cm4gYXhpb3MucG9zdChgJHtiYXNlfSR7dXJsfWAsIGZvcm1EYXRhLCBoZWFkZXJzKS50aGVuKHJlcyA9PiByZXMuZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBT0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUE3Q0E7QUFDQTtBQWtEQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFNQTs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFEQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQURBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFEQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVVBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBREE7QUFEQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/api/fetch-api.js\n");
/***/ }),
/***/ "./src/assets/images/common/button-next.png":
/*!**************************************************!*\
!*** ./src/assets/images/common/button-next.png ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAuCAMAAAAFiil6AAAAPFBMVEUAAAD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQC43r6mAAAAE3RSTlMAKcry1foyDBPhGjsjwT/rsXp75PzLkAAAAGRJREFUOMut1EsOgCAMAFHQivhF7f3v6gVGDC0s5yUkhLThljXgES0se9HlQ0abZJRokUmln6SqzCxakaGfbDY5WE6bXL/AV3Hnh/h7MnX+9NaeoUdP5zHgzkPo7wV6dWU8wv0Fq/cJL8kFDSkAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vYnV0dG9uLW5leHQucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2J1dHRvbi1uZXh0LnBuZz9iZmNkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQXVDQU1BQUFBRmlpbDZBQUFBUEZCTVZFVUFBQUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FDNDNyNm1BQUFBRTNSU1RsTUFLY3J5MWZveURCUGhHanNqd1QvcnNYcDc1UHpMa0FBQUFHUkpSRUZVT011dDFFc09nQ0FNQUZIUWl2aEY3ZjN2NmdWR0RDMHM1eVVraExUaGxqWGdFUzBzZTlIbFEwYWJaSlJva1VtbG42U3F6Q3hha2FHZmJEWTVXRTZiWEwvQVYzSG5oL2g3TW5YKzlOYWVvVWRQNXpIZ3prUG83d1Y2ZFdVOHd2MEZxL2NKTDhrRkRTa0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/button-next.png\n");
/***/ }),
/***/ "./src/assets/images/common/button-prev.png":
/*!**************************************************!*\
!*** ./src/assets/images/common/button-prev.png ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAuCAMAAAAFiil6AAAAM1BMVEUAAAD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQADIOb6AAAAEHRSTlMAJBM8LPgaDNXH8eQz3bF3c64jtAAAAFZJREFUOMvF1MEVgCAQA1FAkICg9F+tFpAc5K24xz/njaO34+J+DAiv/kMPXXqKbxw2nh9v3Af1YufbD+5O4Trksq40u4KpkiItwbb0qVK9eOVlBXJkbrftCFHy0aPQAAAAAElFTkSuQmCC\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vYnV0dG9uLXByZXYucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2J1dHRvbi1wcmV2LnBuZz9lYjZlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQXVDQU1BQUFBRmlpbDZBQUFBTTFCTVZFVUFBQUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FBRElPYjZBQUFBRUhSU1RsTUFKQk04TFBnYUROWEg4ZVF6M2JGM2M2NGp0QUFBQUZaSlJFRlVPTXZGMU1FVmdDQVFBMUZBa0lDZzlGK3RGcEFjNUsyNHh6L25qYU8zNCtKK0RBaXYva01QWFhxS2J4dzJuaDl2M0FmMVl1ZmJEKzVPNFRya3NxNDB1NEtwa2lJdHdiYjBxVks5ZU9WbEJYSmticmZ0Q0ZIeTBhUFFBQUFBQUVsRlRrU3VRbUNDXCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/button-prev.png\n");
/***/ }),
/***/ "./src/assets/images/common/down-arrow.png":
/*!*************************************************!*\
!*** ./src/assets/images/common/down-arrow.png ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAnklEQVQYlY2PPQoCQQyFv5E9gQdaG0VncG9iZWdtYWWneJCBSWHnNSxkwcLaUnRjsTPL4A/6QYok74U8M7WTGugDd8DQ0gMUeMRq4uxaADtgxX9sjKpSObsG5j/EWx9kZlQVgMrZPTD8Ij74IIP0a2IMnD+IL8AoNZ3BB2mAkjZgQoHSB7m9GaLplF8DnA9yzDVdhpzK2SVQ+CCL190TREgyBB3ltCcAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmc/NzI2NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFJQ0FZQUFBRE41Qjd4QUFBQW5rbEVRVlFZbFkyUFBRb0NRUXlGdjVFOWdRZGFHMFZuY0c5aVpXZHRZV1duZUpDQlNXSG5OU3hrd2NMYVVuUmpzVFBMNEEvNlFZb2s3NFU4TTdXVEd1Z0RkOERRMGdNVWVNUnE0dXhhQUR0Z3hYOXNqS3BTT2JzRzVqL0VXeDlrWmxRVmdNclpQVEQ4SWo3NElJUDBhMklNbkQrSUw4QW9OWjNCQjJtQWtqWmdRb0hTQjdtOUdhTHBsRjhEbkE5eXpEVmRocHpLMlNWUStDQ0wxOTBUUkVneUJCM2x0Q2NBQUFBQVNVVk9SSzVDWUlJPVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/common/down-arrow.png\n");
/***/ }),
/***/ "./src/assets/images/common/icon-eyes-off.png":
/*!****************************************************!*\
!*** ./src/assets/images/common/icon-eyes-off.png ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAMAAAA8nnbJAAAASFBMVEUAAADc3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d2MgPlJAAAAF3RSTlMAiEXazT5WARAxIWHzsAxM5XIZBJ27BlWYBu8AAACYSURBVCjP7Y/LFoMgDERF3gKKAs7//2mjSA+17abrziKHcJNMMvz1iyb74XOcj6i5f4cLcu3zGG/IQZhraEROHTEZkC1ZAf5sTc6DxQYdgorgqzVpkswj2mHj1Ueh7EMSuFQEJprLhSZmw0wBbFuYYLT7hnKYmmaihae3hKz26nVpd14la2HomQr6ZLYeQclditg37Sb16QM4Lgb/IrG3AgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmc/MzE0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCc0FBQUFZQ0FNQUFBQThubmJKQUFBQVNGQk1WRVVBQUFEYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzZDNkM2MzZDNjM2QzYzNkM2MzZDJNZ1BsSkFBQUFGM1JTVGxNQWlFWGF6VDVXQVJBeElXSHpzQXhNNVhJWkJKMjdCbFdZQnU4QUFBQ1lTVVJCVkNqUDdZL0xGb01nREVSRjNnS0tBczcvLzJtalNBKzE3YWJyemlLSGNKTk1NdnoxaXliNzRYT2NqNmk1ZjRjTGN1M3pHRy9JUVpocmFFUk9IVEVaa0MxWkFmNXNUYzZEeFFZZGdvcmdxelZwa3N3ajJtSGoxVWVoN0VNU3VGUUVKcHJMaFNabXcwd0JiRnVZWUxUN2huS1ltbWFpaGFlM2hLejI2blZwZDE0bGEySG9tUXI2WkxZZVFjbGRpdGczN1NiMTZRTTRMZ2IvSXJHM0FnQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/icon-eyes-off.png\n");
/***/ }),
/***/ "./src/assets/images/common/icon-eyes-on.png":
/*!***************************************************!*\
!*** ./src/assets/images/common/icon-eyes-on.png ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAMAAAA8nnbJAAAAVFBMVEUAAADd3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d0oEK0uAAAAG3RSTlMAL5qyB4ATDQM7opFkhfB34NbpS/bLGFbIbSHSfxLbAAAArElEQVQoz82RWRKDIBBEEVAEWRTQLH3/ewaYKqNW8p28D5bpmp6mYP/KqD7XO7eiEIUdLoouwn0KoTcRmI6q4vCP4jd0ZekMctqlbYGTjEkOoK/2S9mIIULXfULFlpM0cBRuJUmiMbcix60N87xdnyDIC3msfQL9qY8SJDI1MPI0r/PVkugx63fOMSBrtpM8hKb3KRshNnZAOcDzEJwAlsQuKCtyjTLpr//wS15nnwwqYeZsVQAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb24ucG5nPzE3NzgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQnNBQUFBWUNBTUFBQUE4bm5iSkFBQUFWRkJNVkVVQUFBRGQzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNkM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNkM2QzYzNkM2MzZDNjM2QzYzNkMG9FSzB1QUFBQUczUlNUbE1BTDVxeUI0QVREUU03b3BGa2hmQjM0TmJwUy9iTEdGYkliU0hTZnhMYkFBQUFyRWxFUVZRb3o4MlJXUktESUJCRUVWQUVXUlRRTEgzL2V3YVlLcU5XOHAyOEQ1YnBtcDZtWVAvS3FEN1hPN2VpRUlVZExvb3V3bjBLb1RjUm1JNnE0dkNQNGpkMFpla01jdHFsYllHVGpFa09vSy8yUzltSUlVTFhmVUxGbHBNMGNCUnVKVW1pTWJjaXg2ME44N3hkbnlESUMzbXNmUUw5cVk4U0pESTFNUEkwci9QVmt1Z3g2M2ZPTVNCcnRwTThoS2IzS1JzaE5uWkFPY0R6RUp3QWxzUXVLQ3R5alRMcHIvL3dTMTVubnd3cVllWnNWUUFBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/common/icon-eyes-on.png\n");
/***/ }),
/***/ "./src/assets/images/home/footer-icon-1.png":
/*!**************************************************!*\
!*** ./src/assets/images/home/footer-icon-1.png ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAC5klEQVRIibWVX0iTURjGf9+Yf7F0OdFRV1tRlELmpKgQDU0i09RdSH8MAu8q07uiiyBDosjoLimoVCxIKy1EsVZqZDX/1IVh7CtyGBvahW0udGt24Xbic04l2XN13ud9v+c55z3nfEeyyjJ+HAKqgEwgjv+DC/gAXAeeAaj8iRqgDchZhTj+b3OAdr8mklWWC/xEOFCoAqrDJA5QpQaMC9kf4+N0dXby6eMwDrsdj8dDgkbD5i1byMnZR3pGBpIkrcTAKFlleS4Q+Xw+mhoaePq4FZ/PF/Kr1LQ0KquqSdRql3UQBnNzc9y8UcdrsxmAiIgIPB6PolitVuP1egFITknhytVrrI2PX9IgcIro6+0V4gkaDXcbmzhWfkIUapOSaGh+QNmRowA47HZu19cvuwJh0NnRIcjfbjdDgwN8+/ZVcO7paYYHB/kqWwX3rv8tLqdzSQPRojJTKbOzs8vOSG8woDcY+OP9g9frQVKp0Ol0GDMzMWzcFFSvDgxiY2OXNJAkibz8fGxjY3R3dQXlHzY3s8No5NTpMyRoNIIXLdIbDEvOPG9/PgMWC59HRkLWDFosXDh/TtE2YXC4pDTk2V6XmIjb7ebn5CQAhYeLuXipRuRPVlRwqvIsMH+HHj5oDjZITUvj6PHyRQ22p6fz/l2/iIcGLDxvbxNxX08P5hfdIn7T1yfGYg8ASkwmABrv31MYREZGKvbHZrNhs9lE/GV0VFHv/PWvRQqDAGJiYtiXm4vL6cJhtxMdHU1ycjIOh2PRFS6E3qAPbbB+wwZu3b5D3Jo1Cl6r1a7oYgEUFReLsWphcueuXUHiAAcOFpCbl7eseInJxO49e0Ws+NmtBD2vXtHa8oix79+Dclu3pVJTW6vg1IATCJ5yCGRlZ5OVnc3kxITYE51Ox9TUFE9aW5iZmSEqKipQ7pKssvyS+WcuHDCrgLowiQPUqZh/jy+HQfwy0B44RReAIsAMTK9CdNqvUejX5C/LRP7HP0eCYAAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTEucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0xLnBuZz9kNzU0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFDNWtsRVFWUklpYldWWDBpVFVSakdmOStZZjdGME9kRlJWMXRSbEVMbXBLZ1FEVTBpMDlSZFNIOE1BdThxMDd1aWl5QkRvc2pvTGltb1ZDeElLeTFFc1ZacVpEWC8xSVZoN0N0eUdCdmFoVzB1ZEd0MjRYYmljMDRsMlhOMTN1ZDl2K2M1NXozbmZFZXl5akorSEFLcWdFd2dqditEQy9nQVhBZWVBYWo4aVJxZ0RjaFpoVGorYjNPQWRyOG1rbFdXQy94RU9GQ29BcXJESkE1UXBRYU1DOWtmNCtOMGRYYnk2ZU13RHJzZGo4ZERna2JENWkxYnlNblpSM3BHQnBJa3JjVEFLRmxsZVM0UStYdyttaG9hZVBxNEZaL1BGL0tyMUxRMEtxdXFTZFJxbDNVUUJuTnpjOXk4VWNkcnN4bUFpSWdJUEI2UG9saXRWdVAxZWdGSVRrbmh5dFZyckkyUFg5SWdjSXJvNiswVjRna2FEWGNibXpoV2ZrSVVhcE9TYUdoK1FObVJvd0E0N0hadTE5Y3Z1d0poME5uUkljamZiamREZ3dOOCsvWlZjTzdwYVlZSEIva3FXd1gzcnY4dExxZHpTUVBSb2pKVEtiT3pzOHZPU0c4d29EY1krT1A5ZzlmclFWS3AwT2wwR0RNek1XemNGRlN2RGd4aVkyT1hOSkFraWJ6OGZHeGpZM1IzZFFYbEh6WTNzOE5vNU5UcE15Um9OSUlYTGRJYkRFdk9QRzkvUGdNV0M1OUhSa0xXREZvc1hEaC9UdEUyWVhDNHBEVGsyVjZYbUlqYjdlYm41Q1FBaFllTHVYaXBSdVJQVmxSd3F2SXNNSCtISGo1b0RqWklUVXZqNlBIeVJRMjJwNmZ6L2wyL2lJY0dMRHh2YnhOeFgwOFA1aGZkSW43VDF5ZkdZZzhBU2t3bUFCcnYzMU1ZUkVaR0t2Ykhack5oczlsRS9HVjBWRkh2L1BXdlJRcURBR0ppWXRpWG00dkw2Y0podHhNZEhVMXljaklPaDJQUkZTNkUzcUFQYmJCK3d3WnUzYjVEM0pvMUNsNnIxYTdvWWdFVUZSZUxzV3BoY3VldVhVSGlBQWNPRnBDYmw3ZXNlSW5KeE80OWUwV3MrTm10QkQydlh0SGE4b2l4NzkrRGNsdTNwVkpUVzZ2ZzFJQVRDSjV5Q0dSbFo1T1ZuYzNreElUWUU1MU94OVRVRkU5YVc1aVptU0VxS2lwUTdwS3NzdnlTK1djdUhEQ3JnTG93aVFQVXFaaC9qeStIUWZ3eTBCNDRSUmVBSXNBTVRLOUNkTnF2VWVqWDVDL0xSUDdIUDBlQ1lBQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-1.png\n");
/***/ }),
/***/ "./src/assets/images/home/footer-icon-2.png":
/*!**************************************************!*\
!*** ./src/assets/images/home/footer-icon-2.png ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABX0lEQVRIie2VMU/CUBSFvxbKgDIg/SmgM4tBI5i4GIwumpAwYjQujrLK7qAhmoiJxkTc/QGIszX0F0BBInVDHHiQNCm+KnTzbPede865777hKQ3TRCANFIAEMM/f0ANqwCnwCKAK4gR4AJJTmCO0SaAqPFEaprkmDvxARgX2fTIHKASBuNfutmVxU7nmpV7nvdOh3+8DEA7PcVWpuEniQSDixbzb7XJ0eIDVanmdByCiynuGuL+7/a05AEGvjW+G4aij0QWWUylCIQ1N06YPaFuWo04sLbKZzUp1nlf0NRg4hYo3qfQGl+UyAJ+27Tg3jNcxFwiobG3vuOqVhmkOXBmBjUxaOqWu65ydX7hynlf0E2K6PpGbTUBscoB0RSPk9nZpNZvjOrWySi6fl+pmcoP/gKkDPnz076nAs48BNRUo+RhQUhn+x0UfzItAdfTIx8A68ATYEyVy2MIjIzz5BpjIXAKSOsukAAAAAElFTkSuQmCC\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTIucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0yLnBuZz85NTQ0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCWDBsRVFWUklpZTJWTVUvQ1VCU0Z2eGJLZ0RJZy9TbWdNNHRCSTVpNEdJd3VtcEF3WWpRdWpyTEs3cUFobW9pSnhrVGMvUUdJc3pYMEYwQkJJblZESEhpUU5DbStLblR6YlBlZGU4NjU3NzdoS1EzVFJDQU5GSUFFTU0vZjBBTnF3Q253Q0tBSzRnUjRBSkpUbUNPMFNhQXFQRkVhcHJrbUR2eEFSZ1gyZlRJSEtBU0J1TmZ1dG1WeFU3bm1wVjdudmRPaDMrOERFQTdQY1ZXcHVFbmlRU0RpeGJ6YjdYSjBlSURWYW5tZEJ5Q2l5bnVHdUwrNy9hMDVBRUd2alcrRzRhaWowUVdXVXlsQ0lRMU4wNllQYUZ1V28wNHNMYktaelVwMW5sZjBOUmc0aFlvM3FmUUdsK1V5QUorMjdUZzNqTmN4Rndpb2JHM3Z1T3FWaG1rT1hCbUJqVXhhT3FXdTY1eWRYN2h5bmxmMEUySzZQcEdiVFVCc2NvQjBSU1BrOW5acE5admpPcld5U2k2ZmwrcG1jb1AvZ0trRFBuejA3Nm5BczQ4Qk5SVW8rUmhRVWhuK3gwVWZ6SXRBZGZUSXg4QTY4QVRZRXlWeTJNSWpJeno1QnBqSVhBS1NPc3VrQUFBQUFFbEZUa1N1UW1DQ1wiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-2.png\n");
/***/ }),
/***/ "./src/assets/images/home/footer-icon-3.png":
/*!**************************************************!*\
!*** ./src/assets/images/home/footer-icon-3.png ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABqElEQVRIid2Vu0tCURzHP/cQCJKBLoYXwj8iG2oqGlLKligTWwN7GDW3BLlW0B9QNFdDD3oQBRVUNNfkRcuoxUDwOdweg7dSu2Bdu0vf6fA9v/P9nMcPjhRTFDT1AdOAB2jEmLLANbAA7AAIbWIe2AI66whHW9sJbGuZSDFF6dUMM+QXwIxJ4QDTAmg1EdAqAFu1u7e7SygQYGpinKfHx3oANqHnrq2ukM/nSN7fc7C/Vw8AXYBLlr/GLlmv5MeSYoryVm2m02nOz06x2x20d3QgSZJhQIOe+aKqeDxtABQKBaxWK8+pFKqqAmBrasJisXB7c0M2k6HF7UaW9U+qC5ifm+PuLgHAaDhMj9dX4Q0NB7m6vCARj3+u6eruZmxiEiEqb133DWppc2O9Ihzg+OiIw4P9b7WGAG+vrwRDI4xHIjgcjgpItXSvqJZ6vD4GBgdLOxSC5aUlAB6SyW+1hk5Q3sZOZ/PnuFgs/g2Asq6t1cLGAL/Q/wBkTMzPSjFFOab0zZmhEwEsmhQOsCgo/cdRE8KjwPbHI88C/cAJkKsjNKdl+LVM3gGN73henaQ7LgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTMucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0zLnBuZz9hNTMwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCcUVsRVFWUklpZDJWdTB0Q1VSekhQL2NRQ0pLQkxvWVh3ajhpRzJvcUdsTEtsaWdUV3dON0dEVzNCTGxXMEI5UU5GZEREM29RQlJWVU5OZmtSY3VveFVEd09kd2VnN2RTdTJCZHUwdmY2ZkE5di9QOW5NY1BqaFJURkRUMUFkT0FCMmpFbUxMQU5iQUE3QUFJYldJZTJBSTY2d2hIVzlzSmJHdVpTREZGNmRVTU0rUVh3SXhKNFFEVEFtZzFFZEFxQUZ1MXU3ZTdTeWdRWUdwaW5LZkh4M29BTnFIbnJxMnVrTS9uU043ZmM3Qy9WdzhBWFlCTGxyL0dMbG12NU1lU1lvcnlWbTJtMDJuT3owNngyeDIwZDNRZ1NaSmhRSU9lK2FLcWVEeHRBQlFLQmF4V0s4K3BGS3FxQW1CcmFzSmlzWEI3YzBNMms2SEY3VWFXOVUrcUM1aWZtK1B1TGdIQWFEaE1qOWRYNFEwTkI3bTZ2Q0FSajMrdTZlcnVabXhpRWlFcWIxMzNEV3BwYzJPOUloemcrT2lJdzRQOWI3V0dBRyt2cndSREk0eEhJamdjamdwSXRYU3ZxSlo2dkQ0R0JnZExPeFNDNWFVbEFCNlN5VysxaGs1UTNzWk9aL1BudUZncy9nMkFzcTZ0MWNMR0FML1Evd0JrVE16UFNqRkZPYWIwelptaEV3RXNtaFFPc0Nnby9jZFJFOEtqd1BiSEk4OEMvY0FKa0tzak5LZGwrTFZNM2dHTjczaGVuYVE3TGdBQUFBQkpSVTVFcmtKZ2dnPT1cIiJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-3.png\n");
/***/ }),
/***/ "./src/assets/images/home/footer-logo.png":
/*!************************************************!*\
!*** ./src/assets/images/home/footer-logo.png ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/footer-logo.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1sb2dvLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvZm9vdGVyLWxvZ28ucG5nP2I2ZWYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltZy9mb290ZXItbG9nby5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-logo.png\n");
/***/ }),
/***/ "./src/assets/images/home/header-logo.png":
/*!************************************************!*\
!*** ./src/assets/images/home/header-logo.png ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/header-logo.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2hlYWRlci1sb2dvLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvaGVhZGVyLWxvZ28ucG5nPzI0ZWIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltZy9oZWFkZXItbG9nby5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/header-logo.png\n");
/***/ }),
/***/ "./src/assets/images/home/icon-head-plus-act.png":
/*!*******************************************************!*\
!*** ./src/assets/images/home/icon-head-plus-act.png ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAkklEQVQ4je3VIQ7CUBBF0VPSYLDoIrqIGtaBKDtgQYh6DGwDwzJAE1JDBQr7g5hCANGkL/niJXduJmN+1talnswwTfoD92hg0mdEg1vymr6Bd6QfZ5QORJpjjm3AVC99iX3Ab7K2Lgucv1wuzWJYN+1wCJgKRdIvOAV8l+OKVQDtUCf9iHW06XBuOkp/n+wff9QTVy0XuVfqI/sAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLWFjdC5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLWFjdC5wbmc/NGExZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCVUFBQUFWQ0FZQUFBQ3BGNldXQUFBQWtrbEVRVlE0amUzVklRN0NVQkJGMFZQU1lMRG9JcnFJR3RhQktEdGdRWWg2REd3RHd6SkFFMUpEQlFyN2c1aENBTkdrTC9uaUpYZHVKbU4rMXRhbG5zd3dUZm9EOTJoZzBtZEVnMXZ5bXI2QmQ2UWZaNVFPUkpwamptM0FWQzk5aVgzQWI3SzJMZ3VjdjF3dXpXSllOKzF3Q0pnS1JkSXZPQVY4bCtPS1ZRRHRVQ2Y5aUhXMDZYQnVPa3Avbit3ZmY5UVRWeTBYdVZmcUkvc0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-plus-act.png\n");
/***/ }),
/***/ "./src/assets/images/home/icon-head-plus.png":
/*!***************************************************!*\
!*** ./src/assets/images/home/icon-head-plus.png ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAmklEQVQ4je3QIQoCURSF4U95GLSa3cYUF6Bg1aDdIEbXYphu0W1Y3IZZbE6YZDE8Bd+MYBmYAzcc+M/h3tuZTScqNEAv8iUeqUC3qhE57tHkVYE6pT+rLW1IacAQ+wSTffgxjgl+E9DH/IdFRq/5pl2zflrglGAy7+decUnwRcANiwR0wDLyZ6xSmzbnp23p/xVqMGtsI19WBZ78VxQSjvxpZgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMucG5nPzMwZjMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQlVBQUFBVkNBWUFBQUNwRjZXV0FBQUFta2xFUVZRNGplM1FJUW9DVVJTRjRVOTVHTFNhM2NZVUY2QmcxYURkSUViWFlwaHUwVzFZM0laWmJFNllaREU4QmQrTVlCbVlBemNjK00vaDN0dVpUU2NxTkVBdjhpVWVxVUMzcWhFNTd0SGtWWUU2cFQrckxXMUlhY0FRK3dTVGZmZ3hqZ2wrRTlESC9JZEZScS81cGwyemZscmdsR0F5NytkZWNVbndSY0FOaXdSMHdETHlaNnhTbXpibnAyM3AveFZxTUd0c0kxOVdCWjc4VnhRU2p2eHBaZ0FBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-plus.png\n");
/***/ }),
/***/ "./src/assets/images/home/icon-head-right-arrow.png":
/*!**********************************************************!*\
!*** ./src/assets/images/home/icon-head-right-arrow.png ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUCAYAAAC58NwRAAABGElEQVQokY3SPSyDURSA4afVGESwCINYxGgTNhKL34RBSCzsYu5gNUhMNoPVIBFhkEj8TIiJjcnWzaJLh0YxfOdLmupXzvaenPfec+49uY+1IRhDF679EXlM4BFX2P2P0IdccBHbfwmnOKvL7WCrlVDDarSUxj42sgSoYgn3wTkcYjlLgArm8RTchiPMZglQxgxegttxgsksAd4xjbfgDpxL/qqpAKWQSsHduMBIlkAyeKGOv/GZJQzgBv3B5bjxtZnQi1sMBlcwh+dmM/TEycPBVSziIS2oFzpxiZHgGlY0bHAqpE83HvyF9chpFAo4xlTkvrEp+eVfkZfsy0JdroiDZsWpUIpTSVZ7L6tYtHOH0ZjjrlUx/ACL+jSfgR2/WgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1yaWdodC1hcnJvdy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1yaWdodC1hcnJvdy5wbmc/OWEwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFVQ0FZQUFBQzU4TndSQUFBQkdFbEVRVlFva1kzU1BTeURVUlNBNGFmVkdFU3dDSU5ZeEdnVE5oS0wzNFJCU0N6c1l1NWdOVWhNTm9QVklCRmhrRWo4VElpSmpjbld6YUpMaDBZeGZPZExtdXBYenZhZW5QZmVjKzQ5dVkrMUlSaERGNjc5RVhsTTRCRlgyUDJQMElkY2NCSGJmd21uT0t2TDdXQ3JsVkREYXJTVXhqNDJzZ1NvWWduM3dUa2NZamxMZ0FybThSVGNoaVBNWmdsUXhneGVndHR4Z3Nrc0FkNHhqYmZnRHB4TC9xcXBBS1dRU3NIZHVNQklsa0F5ZUtHT3YvR1pKUXpnQnYzQjVianh0Wm5RaTFzTUJsY3doK2RtTS9URXljUEJWU3ppSVMyb0Z6cHhpWkhnR2xZMGJIQXFwRTgzSHZ5RjljaHBGQW80eGxUa3ZyRXArZVZma1pmc3kwSmRyb2lEWnNXcFVJcFRTVlo3TDZ0WXRIT0gwWmpqcmxVeC9BQ0wralNmZ1IyL1dnQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-right-arrow.png\n");
/***/ }),
/***/ "./src/assets/images/home/icon-user.png":
/*!**********************************************!*\
!*** ./src/assets/images/home/icon-user.png ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAANCAYAAACdKY9CAAAA40lEQVQokYWRPUpDQRRGjyEP3UAIaGkqUbIDQXQHkk2Ji1AQUwiKhBRaPLSQBxYuwiZNoiABUYLHwjtxjA+98MGd755vfhhUMnXVK/VdfYt+K2dyeFOdBjxQh9G/qBt1gXP1Q93OvJ3wzuoCI/V+4YqoD+pjWjf4rgmwCjQzrwjvORl5oA+sAUfAOtABjoE2cDqnsqML9cbfVcbsxxua6qE6qwnM1INgQF1S+zG8U3fVZXVF3VOrmJ2kQC+Mi7TLggr1Mph91Fv1VW3VwEltv36+JODrP+CkUp02gDFQ8X9VwNMn4rqc0xVlVWkAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tdXNlci5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tdXNlci5wbmc/Nzg1MSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFOQ0FZQUFBQ2RLWTlDQUFBQTQwbEVRVlFva1lXUlBVcERRUlJHanlFUDNVQUlhR2txVWJJRFFYUUhrazJKaTFBUVV3aUtoQlJhUExTUUJ4WXV3aVpOb2lBQlVZTEh3anR4akErOThNR2Q3NTV2ZmhoVU1uWFZLL1ZkZll0K0syZHllRk9kQmp4UWg5Ry9xQnQxZ1hQMVE5M092SjN3enVvQ0kvVis0WXFvRCtwaldqZjRyZ213Q2pRenJ3anZPUmw1b0Erc0FVZkFPdEFCam9FMmNEcW5zcU1MOWNiZlZjYnN4eHVhNnFFNnF3bk0xSU5nUUYxUyt6RzhVM2ZWWlhWRjNWT3JtSjJrUUMrTWk3VExnZ3IxTXBoOTFGdjFWVzNWd0VsdHYzNitKT0RyUCtDa1VwMDJnREZROFg5VndOTW40cnFjMHhWbFZXa0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-user.png\n");
/***/ }),
/***/ "./src/assets/images/home/mobile-nav-close.png":
/*!*****************************************************!*\
!*** ./src/assets/images/home/mobile-nav-close.png ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABMElEQVRIia3Wu07DMBSA4Q83PEAH2BGPA4wUUR6ijHRBYuqKxDPQqjAw0KdCVGKCqRVDE8lEzq3hSFEutv7f9smxfPA1Pj3BI44ww7t+cYEpPjHJ8ISzvPEN13jdEz7CHIP8PQQMow4DLHD5D3AYBrtl2SQko57wDWYBK9wkJPOWkir4GKuQf1juKamDv0CIGrpKGuFlQRdJKzhkiZEt8/tzBCgkRbSCVwnqJIv8OZ55JbxOUCUpL2ktvEkQS+YJ+LYJnhrRv0eT4MpuiVL9ghbFWCco4PHfss2vIhqLsUqQgm/sdtqxDhWfSnIVvJzQqjr5k/TyDNrCW28rsaAtvJOkEHSFt5ZkON8THktI5+Q74K4HPJakZjINWPeE10nWGW5xiGM86HdsWeIH9/jA5BfK4W9xxh2j0wAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS1uYXYtY2xvc2UucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LWNsb3NlLnBuZz8zZWM1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCTUVsRVFWUklpYTNXdTA3RE1CU0E0UTgzUEVBSDJCR1BBNHdVVVI2aWpIUkJZdXFLeERQUXFqQXcwS2RDVkdLQ3FSVkRFOGxFenEzaFNGRXV0djdmOXNteGZQQTFQajNCSTQ0d3c3dCtjWUVwUGpISjhJU3p2UEVOMTNqZEV6N0NISVA4UFFRTW93NERMSEQ1RDNBWUJydGwyU1FrbzU3d0RXWUJLOXdrSlBPV2tpcjRHS3VRZjFqdUthbUR2MENJR3JwS0d1RmxRUmRKS3poa2laRXQ4L3R6QkNna1JiU0NWd25xSkl2OE9aNTVKYnhPVUNVcEwya3R2RWtRUytZSitMWUpuaHJSdjBlVDRNcHVpVkw5Z2hiRldDY280UEhmc3MydklocUxzVXFRZ20vc2R0cXhEaFdmU25JVnZKelFxanI1ay9UeUROckNXMjhyc2FBdHZKT2tFSFNGdDVaa09OOFRIa3RJNStRNzRLNEhQSmFrWmpJTldQZUUxMG5XR1c1eGlHTTg2SGRzV2VJSDkvakE1QmZLNFc5eHhoMmowd0FBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-nav-close.png\n");
/***/ }),
/***/ "./src/assets/images/home/mobile-nav.png":
/*!***********************************************!*\
!*** ./src/assets/images/home/mobile-nav.png ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAdCAYAAAAtt6XDAAABJUlEQVRYhe3YOUrEYBiA4Wf+iVsluGFj4QJ6AREUr2ExneAdxA0VRCw8hJcQT6CF2lkJoli6T6fgMhZxYMaxsJEvhS+kSfX8IXxfSKlaGe3GLmbRJq4rLOEkww4WAjH1RnCAwYSpYExjvRhLuImWNPSO24Q1xYC9YxWPGU4xhAm0B6Iu8QTZ141XnIVxvlWq1WrRhpZSNOCnCokqVSuj0YaWCvmkEoZxiDfUAq87zNVR25hG+c+O/rv6sIfOhPFYS1NdGE44j5Y09IyrhBUc4SPW4x7zeMnkO2cm1tNcIUfC/+77bYVEFXL31T/y2uRDtCPQci0fCzJMYh/9gSDyObmOrYRN8SDy93sDPQmDsZamyhhIOI6WNPSAiwyLcmER/iUs4+0TEg9TPrk6Z0MAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS1uYXYucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LnBuZz81NjZiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNVQUFBQWRDQVlBQUFBdHQ2WERBQUFCSlVsRVFWUlloZTNZT1VyRVlCaUE0V2YraVZzbHVHRmo0UUo2QVJFVXIyRXhuZUFkeEEwVlJDdzhoSmNRVDZDRjJsa0pvbGk2VDZmZ01oWnhZTWF4c0pFdmhTK2tTZlg4SVh4ZlNLbGFHZTNHTG1iUkpxNHJMT0Vrd3c0V0FqSDFSbkNBd1lTcFlFeGp2UmhMdUltV05QU08yNFExeFlDOVl4V1BHVTR4aEFtMEI2SXU4UVRaMTQxWG5JVnh2bFdxMVdyUmhwWlNOT0NuQ29rcVZTdWowWWFXQ3Zta0VvWnhpRGZVQXE4N3pOVlIyNWhHK2MrTy9ydjZzSWZPaFBGWVMxTmRHRTQ0ajVZMDlJeXJoQlVjNFNQVzR4N3plTW5rTzJjbTF0TmNJVWZDLys3N2JZVkVGWEwzMVQveTJ1UkR0Q1BRY2kwZkN6Sk1ZaC85Z1NEeU9ibU9yWVJOOFNEeTkzc0RQUW1Ec1phbXloaElPSTZXTlBTQWl3eUxjbUVSL2lVczQrMFRFZzlUUHJrNlowTUFBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-nav.png\n");
/***/ }),
/***/ "./src/assets/images/home/mobile-user.png":
/*!************************************************!*\
!*** ./src/assets/images/home/mobile-user.png ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAfCAYAAAD0ma06AAAC3klEQVRIia3WT6hVVRTH8c+9pU+QOlnPooggOv0xHmJOXkqJ4DAMAvvnIQdSDZQgCBqJNAicOBECRUQe1klCI4hGQRRlfwgMXn+g6BCUFlEWHvVpZlmD7YX99jv3nnv1/UZ3rb3u/p6999pr7c7JjXcYQldjPTZgLW655P8ZH+Aw3s7K6mLbRJ0hgPdjP5a1xH2JzVlZHR0U1G2Z5HF8OAQMluOTusgfvlzgGryKBYn/L0zjK5xPxhbicF3kq0YFLsJUAjuN5zCOFcKKxvE8ZqK4BZiqi3zhKMCncHtk13gArySTn8nKapewG2ci/114clRgrBeEpGhUVlZf4MXEXQwLvAqTkX0SB/rBIu03e/WrhwUuFQ6/p2lcaKNlZXVeSKSeFtdFft0wwP8Su/Uyj6Im4B/4O7JXCNs8UHWRj+HeyDUjJFsr8B98HtlLsLENKCTatZH9WVZW6W71zdLXE3sX7ulHqot8AjsT98Gm2H7AKfwU2UvwKTZjLPKP1UX+LD5GFvl/EKrUHA0q3uvwbsNHncY36GACi5Pxf7E2K6sjTZMOqqXvYZNwprGuETrIZAPsAjb1g7UB4Ti+b4mJ9R1+HBTQD7gUh4TmOkxr6mkCR+oiP1gX+fXDAlcK1WXDCKBUT2C6LvLlbcBJvI+bE/8M9uIh3CQkTOdS3HrsM7uOwq34qC7ylbEzztLbcFTocbF2YztONC0lKytQF/k4duDpJOQ33JeV1S/xCjt4LYGdE7Z1Sz9YAj6RldUzwnbGxf5GUbfpAQs8GAVdxGN4sw3UAH5DeAvFZW1dXeSP9oAdbEv+twPvjAqLoG+ZW+q294BrcHc0cAwvXy4s0kv4NbIn6iKf7ApZFmu38DK7ImVldRZ7EvcjXeFxFOvQlcIipTmwuiu8sHr6E9V80bKy+trs19ydXaH19HRsvmCRjke/b+gK7aZpcL4UL+JUF1uFi/2tuddjPrRNOKbfsfV/MDyyBD9TL0IAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS11c2VyLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvbW9iaWxlLXVzZXIucG5nPzRkNmYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQndBQUFBZkNBWUFBQUQwbWEwNkFBQUMza2xFUVZSSWlhM1dUNmhWVlJUSDhjKzlwVStRT2xuUG9vZ2dPdjB4SG1KT1hrcUo0REFNQXZ2bklRZFNEWlFnQ0JxSk5BaWNPQkVDUlVRZTFrbENJNGhHUVJSbGZ3Z01YbitnNkJDVUZsRVdIdlZwWmxtRDdZWDk5anYzbm52MS9VWjNyYjN1L3A2OTk5cHI3YzdKalhjWVFsZGpQVFpnTFc2NTVQOFpIK0F3M3M3SzZtTGJSSjBoZ1BkalA1YTF4SDJKelZsWkhSMFUxRzJaNUhGOE9BUU1sdU9UdXNnZnZsemdHcnlLQlluL0wwempLNXhQeGhiaWNGM2txMFlGTHNKVUFqdU41ekNPRmNLS3h2RThacUs0QlppcWkzemhLTUNuY0h0azEzZ0FyeVNUbjhuS2FwZXdHMmNpLzExNGNsUmdyQmVFcEdoVVZsWmY0TVhFWFF3THZBcVRrWDBTQi9yQkl1MDNlL1dyaHdVdUZRNi9wMmxjYUtObFpYVmVTS1NlRnRkRmZ0MHd3UDhTdS9VeWo2SW00Qi80TzdKWENOczhVSFdSaitIZXlEVWpKRnNyOEI5OEh0bExzTEVOS0NUYXRaSDlXVlpXNlc3MXpkTFhFM3NYN3VsSHFvdDhBanNUOThHbTJIN0FLZndVMlV2d0tUWmpMUEtQMVVYK0xENUdGdmwvRUtyVUhBMHEzdXZ3YnNOSG5jWTM2R0FDaTVQeGY3RTJLNnNqVFpNT3FxWHZZWk53cHJHdUVUcklaQVBzQWpiMWc3VUI0VGkrYjRtSjlSMStIQlRRRDdnVWg0VG1Pa3hyNm1rQ1Irb2lQMWdYK2ZYREFsY0sxV1hEQ0tCVVQyQzZMdkxsYmNCSnZJK2JFLzhNOXVJaDNDUWtUT2RTM0hyc003dU93cTM0cUM3eWxiRXp6dExiY0ZUb2NiRjJZenRPTkMwbEt5dFFGL2s0ZHVEcEpPUTMzSmVWMVMveENqdDRMWUdkRTdaMVN6OVlBajZSbGRVenduYkd4ZjVHVWJmcEFRczhHQVZkeEdONHN3M1VBSDVEZUF2RlpXMWRYZVNQOW9BZGJFdit0d1B2akFxTG9HK1pXK3EyOTRCcmNIYzBjQXd2WHk0czBrdjROYkluNmlLZjdBcFpGbXUzOERLN0ltVmxkUlo3RXZjalhlRnhGT3ZRbGNJaXBUbXd1aXU4c0hyNkU5VjgwYkt5K3RyczE5eWRYYUgxOUhSc3ZtQ1Jqa2UvYitnSzdhWnBjTDRVTCtKVUYxdUZpLzJ0dWRkalByUk5PS2Jmc2ZWL01EeXlCRDlUTDBJQUFBQUFTVVZPUks1Q1lJST1cIiJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-user.png\n");
/***/ }),
/***/ "./src/assets/images/home/qrcode.png":
/*!*******************************************!*\
!*** ./src/assets/images/home/qrcode.png ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/qrcode.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL3FyY29kZS5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL3FyY29kZS5wbmc/NTNlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3FyY29kZS5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/qrcode.png\n");
/***/ }),
/***/ "./src/assets/images/index/recommend-1.png":
/*!*************************************************!*\
!*** ./src/assets/images/index/recommend-1.png ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/recommend-1.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMS5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMS5wbmc/M2E2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0xLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-1.png\n");
/***/ }),
/***/ "./src/assets/images/index/recommend-2.png":
/*!*************************************************!*\
!*** ./src/assets/images/index/recommend-2.png ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/recommend-2.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMi5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMi5wbmc/YzM0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0yLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-2.png\n");
/***/ }),
/***/ "./src/assets/images/index/recommend-3.png":
/*!*************************************************!*\
!*** ./src/assets/images/index/recommend-3.png ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/recommend-3.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMy5wbmc/NTIzNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0zLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-3.png\n");
/***/ }),
/***/ "./src/assets/images/index/recommend-4.png":
/*!*************************************************!*\
!*** ./src/assets/images/index/recommend-4.png ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"assets/img/recommend-4.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtNC5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtNC5wbmc/OTYyNyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC00LnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-4.png\n");
/***/ }),
/***/ "./src/common/lang/en.js":
/*!*******************************!*\
!*** ./src/common/lang/en.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = {\n message: {\n login: 'Login',\n Username: 'Username',\n Password: 'Password',\n Captcha: 'Captcha',\n Language: 'Language',\n zh: 'Chinese',\n en: 'English'\n },\n glbalTips: {\n sessionLost: \"为了更好的体验,需要您登录后再进行此操作\"\n },\n form: {\n datePicker: {\n datePlaceholder: \"please select date\"\n },\n modalUploadCard: {\n tit: \"請上傳證件資料\",\n front: \"證件正面\",\n back: \"證件反面\"\n }\n },\n nav: {\n loginData: {\n name: \"login\",\n path: \"/login\",\n list: [{\n name: \"register\",\n path: \"/register\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"login\",\n path: \"/login\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"modify password\",\n path: \"/password/reset\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"profile\",\n path: \"/infomation/improve\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"logout\",\n path: \"\",\n type: \"auth\",\n value: \"logout\"\n }]\n },\n navList: [{\n name: \"Products\",\n path: \"/empty\",\n list: [{\n name: \"VHIS\",\n path: \"\",\n value: \"gotoVHIS\"\n }, {\n name: \"Insurance with Investment Focus\",\n path: \"/product\"\n }]\n }, {\n name: \"Customer Service\",\n path: \"/custom/product\",\n list: [{\n name: \"Customer Service\",\n path: \"/custom/product\"\n }, {\n name: \"Contact Us\",\n path: \"/custom/service?q=m1\"\n }, {\n name: \"Online Premium Payment\",\n path: \"/custom/service?q=m2\"\n }, {\n name: \"Policy Inquiry\",\n path: \"/custom/service?q=m3\"\n }, {\n name: \"Policy Change\",\n path: \"/custom/service?q=m41\"\n }, {\n name: \"Claims\",\n path: \"/custom/service?q=m5\"\n }, {\n name: \"E-reservation\",\n path: \"/custom/service?q=m6\"\n }, {\n name: \"Complaints\",\n path: \"/custom/service?q=m7\"\n }, {\n name: \"Useful Forms\",\n path: \"/custom/service?q=m8\"\n }]\n }, {\n name: \"About Us\",\n path: \"/profile\",\n list: [{\n name: \"About Ping An (Life) HK\",\n path: \"/profile\"\n }, {\n name: \"Company Events\",\n path: \"/empty\"\n }, {\n name: \"News Center\",\n path: \"/news/list\"\n }, {\n name: \"Corporate Social Responsibility\",\n path: \"/empty\"\n }, {\n name: \"Awards\",\n path: \"/empty\"\n }]\n }, {\n name: \"Join Us\",\n path: \"/empty\",\n list: [{\n name: \"Corporate Culture\",\n path: \"/empty\"\n }, {\n name: \"Career Opportunities\",\n path: \"/empty\"\n }]\n }]\n },\n footer: {\n hkPhone: \"HK Tel\",\n cnPhone: \"CN Tel\",\n aboutUs: \"About us\",\n companyIntroduction: \"Company introduction\",\n news: \"News\",\n joinUs: \"Join us\",\n helpCenter: \"Help center\",\n privacy: \"Privacy Policy\",\n terms: \"Terms of Use\",\n protocol: \"Personal Data Collection Statement\",\n map: \"Map\",\n contactUs: \"Contact us\",\n contactInformation: \"Contact Information\",\n service: \"Service\",\n qrcode: \"Official Accounts\",\n copyright: \"版權所有 © 中國平安保險(集團)股份有限公司未經許可不得復制、轉載或摘編,違者必究!\"\n },\n login: {\n title: \"PingAn One Connect Member Service\",\n loginType1: \"Login with user name and password\",\n loginType2: \"Dynamic password login\",\n account: \"Account\",\n accountPlaceholder: \"Please enter Mobile no./ One Connect User Name\",\n password: \"Password\",\n passwordPlaceholder: \"Please enter password\",\n verifyPlaceholder: \"Please enter password\",\n agree: \"Agree with \",\n protocol: \" PingAn One Connect Member Service Agreement\",\n login: \"Confirm\",\n register: \"Register\",\n forget: \"Forget password\",\n mobile: \"Mobile no.\",\n mobilePlaceholder: \"Please enter Mobile no\",\n verifyCode: \"SMS verification code\",\n verifyCodePlaceholder: \"SMS verification code\",\n verifyCodeGet: \"Get SMS verification code\",\n tips: {\n e1: \"Please enter account\",\n e2: \"Please enter the password\",\n e3: \"Please enter the picture verification code\",\n e4: \"Agree with PingAn One Connect Member Service Agreement\",\n e5: \"Invalidate account or password, please re-enter\",\n oe0: \"Invalidate mobile no. , please re-enter\",\n oe1: \"Please get SMS verification code first\",\n oe2: \"Please enter the picture verification code\",\n oe3: \"Please enter the picture verification code\",\n oe4: \"Invalidate SMS verification code, please re-enter\"\n }\n },\n session: {\n sidExpire: \"It has not been operated for a long time. For the sake of your account security, please restart\"\n },\n register: {\n mobileOptions: [{\n type: \"hk\",\n name: \"HK No\",\n placeHolder: \"Please enter 8-digit mobile number\",\n areaCode: \"+852\"\n }, {\n type: \"zh\",\n name: \"Mainland No.\",\n placeHolder: \"Please enter 11-digit mobile number\",\n areaCode: \"+86\"\n }],\n coutTips: \"{second}Seconds\",\n title: \"Welcome\",\n title2: \"Please set up new password\",\n mobilePlaceholder: \"Please enter 8-digit mobile number\",\n verifyCodePlaceholder: \"Please enter SMS verification code\",\n verifyCodeGet: \"Get SMS verification code\",\n agree: \"Agree with \",\n protocol: \" PingAn One Connect Member Service Agreement\",\n register: \"Click to reister\",\n newPassword: \"Password\",\n newPasswordPlaceholder: \"Please enter password\",\n newPasswordSure: \"Confirm password\",\n newPasswordSurePlaceholder: \"Please confirm password\",\n sure: \"Confirm\",\n tips: {\n e1: \"Invalidate mobile no. , please re-enter\",\n e2: \"Agree with PingAn One Connect Member Service Agreement\",\n e3: \"Invalidate SMS verification code, please re-enter\",\n e4: \"Please get SMS verification code first\",\n e5: \"Your mobile no. is not register, please register before login\",\n e6: \"Please enter the picture verification code\",\n e7: \"Password length cannot be less than 8 bits\",\n e8: \"Passwords must contain numbers, characters, and special numbers\",\n e9: \"New password cannot be the same as the old one\",\n e10: \"Verification code was Expired\",\n e11: \"Registration failed, please contact the staff\",\n e12: \"Success\"\n }\n },\n passwordCheck: {\n error1: \"Password length cannot be less than 8 bits\",\n error2: \"Passwords must contain numbers, characters, and special numbers\",\n error3: \"The passwords are inconsistent. Please confirm and re-enter\",\n error4: \"Password modification failed. Please try again later or call 95511\",\n error5: \"Current password is incorrect. Please re-enter\",\n success: \"Success\"\n },\n passwordReset: {\n oldPwd: \"Current password\",\n oldPwdPlaceholde: \"Please enter current password\",\n cidExpire: \"It has not been operated for a long time. For the sake of your account security, please restart\",\n type1: {\n title: \"Retrieve password\",\n t1: \"Please enter user information\",\n t1Placeholder: \"Mobile no./ One Connect User Name\",\n submit: \"Confirm\",\n error: \"Invalid mobile no./ user name, please re-enter\"\n },\n type2: {\n title: \"Retrieve password\",\n t1: \"SMS verification code\",\n t1Placeholder: \"Please enter verification code\",\n submit: \"Confirm\",\n error1: \"Invalid verification code\",\n error2: \"Verification code was Expired\",\n error3: \"短信验证码发放时间少于1分钟,请稍后再试\"\n },\n type3: {\n title: \"Retrieve password\",\n t1: \"Please verify ID information\",\n t1Placeholder: \"\",\n submit: \"Confirm\"\n },\n type4: {\n title: \"Please set up new password\",\n t1: \"New password\",\n t1Placeholder: \"Please enter new password\",\n t2: \"Confirm password\",\n t2Placeholder: \"Please re-enter new password\",\n submit: \"Confirm\",\n error1: \"Password length not less than 8 bits\",\n error2: \"Passwords must contain numbers, characters, and special numbers\"\n }\n },\n infomationImprove: {\n title: \"Please complete all information\",\n t1: \"姓名\",\n t1c1: \"Surname\",\n t1c2: \"Name\",\n t1Placeholder: \"\",\n t2: \"Sex\",\n t2Placeholder: \"\",\n t3: \"Date of birth\",\n t3Placeholder: \"\",\n t4: \"Type of ID\",\n t4Placeholder: \"\",\n t5: \"ID no.\",\n t5Placeholder: \"\",\n submit: \"Confirm\",\n cancel: \"Skip\",\n candidates: {\n sex: [{\n name: \"男\",\n value: \"M\"\n }, {\n name: \"女\",\n value: \"F\"\n }],\n idType: [{\n name: \"身份證\",\n value: \"1\"\n }, {\n name: \"護照\",\n value: \"2\"\n }, {\n name: \"軍官證或士兵證\",\n value: \"3\"\n }, {\n name: \"港澳通行證/回鄉證或台胞證\",\n value: \"6\"\n }, {\n name: \"外國人永久居留身份證\",\n value: \"O\"\n }, {\n name: \"港澳台居民居住證\",\n value: \"V\"\n }, {\n name: \"台灣居民居住證\",\n value: \"W\"\n }, {\n name: \"其他\",\n value: \"0\"\n }]\n },\n successMsg: \"更新成功\",\n errorTips: {\n e1: \"請填寫姓名信息\",\n e2: \"請選擇性別\",\n e3: \"請選擇生日\",\n e4: \"請選擇證件類型\",\n e5: \"請填寫證件號碼\",\n e6: \"您填寫的證件號碼有誤\",\n e7: \"您填寫的信息有誤,請核實後重新提交\"\n }\n },\n index: {\n news: \"新聞資訊\",\n newMore: \"查看更多\",\n recommend: {\n t1: \"Online Quotation\",\n t2: \"Customer Service\",\n t3: \"Product Information\",\n t4: \"Latest News\",\n item1: {\n btn: \"了解更多產品\",\n t1: \"為自己和家人尋找壹份保障\"\n },\n item2: {\n btn: \"立即預約\",\n t1: \"在線預約 專業服務\"\n },\n item3: {\n btn: \"客户服务\",\n t1: \"專業客服為妳服務\",\n t2: \"想了解更多,可致電\",\n t3: \"95511\",\n t4: \"聯絡我們,或進入\"\n }\n }\n },\n complaintAcceptance: {\n name: \"Name\",\n namePlaceholder: \"Name\",\n contactType: \"Preferred Way of Contact\",\n email: \"E-mail\",\n question: \"Question/ Opinion\",\n questionPlaceHolder: \"No more than 500 words\",\n orderNo: \"Policy No\",\n orderNoPlaceHolder: \"If you are Ping An customer, please provide the policy number\",\n contactTime: \"Preferred Contact Date\",\n notice1: \"The personal data collected in this form is processed in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Information Collection Statement and will only be used to contact you. However, the personal data collected will not be transferred to third-party organizations other than those specified in the \\\"Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement\\\" without your explicit authorization. You can choose not to provide us with the required personal information, but this may prevent us from contacting you. You can also access and correct your personal data in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement。\",\n notice2: \"I hereby confirm that I understand and agree that my personal data will be used for the above purposes in accordance with the Ping An Life Insurance Company of China (HK) Personal Data Collection Statement.\",\n contactTypes: [{\n name: 'Mobile',\n value: 1,\n show: \"Mobile\",\n icon: \"mobile\"\n }, {\n name: 'Email',\n value: 2,\n show: \"Email\",\n icon: \"email\"\n }],\n errorTips: {\n e1: \"Please fill in this item\",\n e2: \"Please fill in the correct contact information\"\n },\n success: \"Thank you for your comments\"\n },\n reservation: {\n name: \"Name\",\n namePlaceholder: \"Name\",\n contactType: \"Preferred way of contact\",\n contactTypeCadidates: [{\n name: \"phone no\",\n value: 1\n }],\n contact: \"Contact Number\",\n contactPlaceholder: \"(HK No./ Mainland No.)\",\n reservationType: \"Type of Reservation\",\n reservationCandidates: [{\n name: \"Insurance consultation\",\n value: \"投保諮詢\"\n }, {\n name: \"Agent change\",\n value: \"代办保单变更\"\n }],\n reservationRemark: \"Reservation Description\",\n reservationRemarkPlaceholder: \"Optional, no more than 500 words, prompt text \\\"Please briefly explain the insurance type or business you want to consult\",\n hkClient: \"Current Pingan HK Customer\",\n yes: \"Yes\",\n no: \"No\",\n contactTime: \"Preferred Contact Date\",\n notice1: \"The personal data collected in this form is processed in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Information Collection Statement and will only be used to contact you. However, the personal data collected will not be transferred to third-party organizations other than those specified in the \\\"Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement\\\" without your explicit authorization. You can choose not to provide us with the required personal information, but this may prevent us from contacting you. You can also access and correct your personal data in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement。\",\n notice2: \"I hereby confirm that I understand and agree that my personal data will be used for the above purposes in accordance with the Ping An Life Insurance Company of China (HK) Personal Data Collection Statement.\",\n success: \"Success\",\n submitBtn: 'Confirm',\n errorTips: {\n e1: \"Please fill in this item\",\n e2: \"Please fill in the correct contact information\"\n }\n },\n paymentType: {\n menu1: \"Payment in Person at Cashier\",\n menu2: \"Internet Banking\",\n menu3: \"Telegrapgic Transfer\",\n menu4: \"JETCO ATM\",\n menu5: \"PPS\",\n menu6: \"Hong Kong Post\"\n },\n product: {\n btnPosition: \"Booking service\",\n iconProblem: \"Common problem\",\n iconProcess: \"Insurance process\",\n iconProduct: \"Product details\"\n },\n customProduct: {\n menu1: \"Contact us\",\n menu2: \"Pay premium\",\n menu3: \"Query policy\",\n menu4: \"Change policy\",\n menu5: \"Claim report\",\n menu6: \"Reservation service\",\n menu7: \"Suggestions\",\n menu8: \"Common form\"\n },\n commonForm: {\n head1: \"Type of Forms\",\n head2: \"Forms\",\n head3: \"Purpose\",\n head4: \"Attachment\",\n download: \"Download\",\n form: [{\n type: \"Payment\",\n list: [{\n name: \"「E-account Service」and Direct Debit Authorization Application for Bank Account\",\n desc: \"For applying e-service account and direct debit authorization\",\n download: \"\"\n }, {\n name: \"Credit Card Account Direct Debit Authorization\",\n desc: \"Application for credit card direct debit\",\n download: \"\"\n }]\n }, {\n type: \"Change of Policy\",\n list: [{\n name: \"Policy Termination Application Form\",\n desc: \"Policy surrender\",\n download: \"\"\n }, {\n name: \"Application for Change of Policy Form(Policy Loan Repayment)\",\n desc: \"Policy loan\",\n download: \"\"\n }, {\n name: \"Application for Change of Policy Form(Change of Policy)\",\n desc: \"Newly added premium, deducted premium\",\n download: \"\"\n }, {\n name: \"Application for Change of Policy Form(Change of Customer Information)\",\n desc: \"Basic Information Change\",\n download: \"\"\n }, {\n name: \"Application for Change of Policy Form(Change of Beneficiary)\",\n desc: \"Mode of payment, self-replacement and reissues\",\n download: \"\"\n }, {\n name: \"Authorization Letter\",\n desc: \"To authorize 3rd party to handle on behalf of policy owner\",\n download: \"\"\n }, {\n name: \"Tax Statement\",\n desc: \"CRS\",\n download: \"\"\n }, {\n name: \"Health Declaration\",\n desc: \"For underwriting purpose\",\n download: \"\"\n }]\n }, {\n type: \"Claims\",\n list: [{\n name: \"Claims Form\",\n desc: \"For written claims application\",\n download: \"\"\n }]\n }]\n },\n policyChangeGuide: {\n notice: \"If you need to modify please\",\n noticeLink: \"contact customer service\",\n head1: \"Item\",\n head2: \"Details\",\n head3: \"Applicant\",\n head4: \"Deadline\",\n head5: \"Materials to be submitted\",\n download: \"下載文檔\",\n form: [{\n project: \"Policy Surrender\",\n content: \"Cancellation of contract after the cooling-off period, the company will refund the policy cash value\",\n applicant: \"Policy Owner\",\n receptionTime: \"Before Policy Expires\",\n materialList: [{\n name: \"Policy\"\n }, {\n name: \"Application form\",\n type: 1\n }, {\n name: \"ID card of Policy Owner\"\n }, {\n name: \"Bank information\"\n }]\n }, {\n project: \"Policy Surrender within cool off period\",\n content: \"If the contract is cancelled within the cooling-off period, the company will refund the entire premium without interest.\",\n applicant: \"Policy Owner\",\n receptionTime: \"Before cool off period\",\n materialList: [{\n name: \"Policy\"\n }, {\n name: \"Application form\",\n type: 1\n }, {\n name: \"ID card of Policy Owner\"\n }, {\n name: \"Bank information\"\n }, {\n name: \"First premium receipt\"\n }]\n }, {\n project: \"Change of Customer Information\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m42\"\n },\n content: \"Change of Policy Owner, Insured and Beneficiary informat\",\n applicant: \"Policy Owner\",\n receptionTime: \"Anytime\",\n materialList: [{\n name: \"Application form\",\n type: 1\n }, {\n name: \"Other necessary proving documents\"\n }]\n }, {\n project: \"Change of Contact Information\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m43\"\n },\n content: \"Change of address, contact no.\",\n applicant: \"Policy Owner\",\n receptionTime: \"Anytime\",\n materialList: [{\n name: \"Application form\",\n type: 1\n }, {\n name: \"ID card of Policy Owner\"\n }]\n }, {\n project: \"Change of Payment Information\",\n content: \"Change of mode of payment or payement account\",\n applicant: \"Policy Owner\",\n receptionTime: \"Before the expiration of policy payment\",\n materialList: [{\n name: \"Application form\",\n type: 1\n }, {\n name: \"Policy\"\n }]\n }]\n },\n policyChangeContact: {\n phone: \"Contact Number\",\n address: \"Correspondence Address\",\n email: \"E-Mail\",\n checkTips: \"I do not agree to receive promotional information\",\n submit: \"Confirm\",\n errorTips: {\n e1: \"Please enter the collect mobile no\",\n e2: \"請填寫聯繫地址\",\n e3: \"Please enter the collect E-mail\"\n },\n success: \"Success\"\n },\n policyChangeInformation: {\n title: \"Change of Customer Information\",\n owner: \"Policy Owner\",\n insured: \"Insured\",\n obj: \"Select for change\",\n name: \"Name\",\n sex: \"Sex\",\n birth: \"Date of Birth\",\n type: \"Type of Identification Document\",\n NO: \"ID No.\",\n validityPeriod: \"ID Validation Date\",\n nationality: \"Nationality\",\n employer: \"Employer\",\n maritalStatus: \"Marital Status\",\n submit: \"Confirm\",\n upload: \"Upload Attachment\",\n modifyTips1: \"If you need to modify please\",\n modifyTips2: \"contact customer service\",\n success: \"Success\"\n },\n contactUs: {\n service: {\n center: {\n title: \"Customer Service Center\",\n address: \"Address: Unit 3501 - 7 & 14, Floor 35, The Gateway Tower 5, Tsim Sha Tsui, Hong Kong\",\n time: \"Service Hour:9 a.m. - 6 p.m. , Monday to Friday\"\n },\n hotline: {\n title: \"Customer Service Hotline\",\n hk: \"Hong Kong:(852) 2983 8866\",\n cn: \"Mainland:(86) 40078 95511\",\n time: \"Service Hour:9 a.m. - 6 p.m. , Monday to Friday\"\n },\n mail: {\n title: \"Customer Service Email\",\n mail: \"cs@pingan.com.hk\"\n }\n },\n pulbic: {\n title: \"Official WeChat Account\",\n m1: \"Login to the \\\"WeChat\\\" APP, press the \\\"+\\\" button in the upper right corner and select \\\"Add Friend\\\", select \\\"Public Account\\\" Enter and search \\\"Ping An Life Hong Kong\\\"\",\n m2: \"Log in to the WeChat APP, press the \\\"+\\\" button in the upper right corner and select \\\"Scan\\\" to scan the QR code below(QR Code here)\"\n },\n qrcode: {\n title: \"Official WeChat Account\"\n }\n },\n customService: {\n name: \"Customer service\",\n menu1: \"Contact Us\",\n menu2: \"Online Premium Payment\",\n menu3: \"Policy Inquiry\",\n menu4: \"Policy Change\",\n menu41: \"Policy Change Guideline\",\n menu42: \"Change of Contact Information\",\n menu43: \"Change of Customer Information\",\n menu5: \"Claims\",\n menu6: \"E-reservation\",\n menu7: \"Complaints\",\n menu8: \"Useful Forms\",\n insuranceQuery: {\n modify: \"modify\",\n InsurantNumber: \"Policy Number\",\n Insurant: \"Insured\",\n InsurantName: \"Policy Type\",\n InsurantAmount: \"Sum Insured\",\n effectiveDate: \"Premium Due Date\",\n period: \"Protection Duration\",\n t2Title: \"Policy Information\",\n t2n1: \"Policy Type\",\n t2n2: \"Sum Insured\",\n t2n3: \"Effective Date\",\n t2n4: \"Protection Duration\",\n t2n5: \"Name of Insured(Chinese)\",\n t2n6: \"Name of Insured (English) \",\n t2n7: \"Date of Birth\",\n t2n8: \"ID No\",\n t3Title: \"Customer Information\",\n t3n1: \"Name of Policy Owner(Chinese)\",\n t3n2: \"Name of Policy Owner(English)\",\n t3n3: \"Date of Birth\",\n t3n4: \"ID No\",\n t3n5: \"Postal Address\",\n t3n6: \"Residential Address\",\n t3n7: \"Mobile No.\",\n t3n8: \"Email\",\n t4Title: \"Beneficiary information\",\n t4NameCn: \"Name(Chinese)\",\n t4NameEn: \"Name (English)\",\n t4Relation: \"Relationship with Insured\",\n t4Allocation: \"Distribution ratio\",\n t5Title: \"Payment information\",\n t5PaymentPeriod: \"Payment period\",\n t5PaymentMethod: \"Mode of Payment\",\n t5PaymentCurrency: \"Currency\",\n t5CurrentPremium: \"Current premium\",\n t5PaymentBank: \"Bank\",\n t5PaymentAccount: \"Payment Account\",\n t6Title: \"Payment History\",\n t6PaymentPeriod: \"Installment\",\n t6PaymentMethod: \"Mode of Payment\",\n t6ClosingDate: \"Received Date\",\n t6PaymentAmount: \"Amount\",\n showMore: \"Show All Policies\",\n noPolicy: \"You haven't bought any policy, if you have any questions please\",\n customService: \" contact customer service\"\n },\n unauth: {\n tips: \"If you have a ping an all in one account account, it can help us provide better services for you\",\n or: \"or\",\n login: \" login\",\n register: \" register\",\n baseInfoTip: \"Your complete information can help us to provide you with complete services\",\n infoBtn: \" Go to perfection\"\n }\n },\n pagination: {\n firstPage: \"first\",\n nextPage: \"next\",\n goto: \"Go to\",\n per: \"page\",\n page: \"\"\n },\n newsDetail: {\n back: \"Back\",\n publishAt: \"Publish time\",\n readers: \"Number of reader\",\n per: \"\"\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvZW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvZW4uanM/MWUwNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAnTG9naW4nLFxuXHRcdFVzZXJuYW1lOiAnVXNlcm5hbWUnLFxuXHRcdFBhc3N3b3JkOiAnUGFzc3dvcmQnLFxuXHRcdENhcHRjaGE6ICdDYXB0Y2hhJyxcblx0XHRMYW5ndWFnZTogJ0xhbmd1YWdlJyxcblx0XHR6aDogJ0NoaW5lc2UnLFxuXHRcdGVuOiAnRW5nbGlzaCdcblx0fSxcblx0Z2xiYWxUaXBzOiB7XG5cdFx0c2Vzc2lvbkxvc3Q6IFwi5Li65LqG5pu05aW955qE5L2T6aqM77yM6ZyA6KaB5oKo55m75b2V5ZCO5YaN6L+b6KGM5q2k5pON5L2cXCJcblx0fSxcblx0Zm9ybToge1xuXHRcdGRhdGVQaWNrZXI6IHtcblx0XHRcdGRhdGVQbGFjZWhvbGRlcjogXCJwbGVhc2Ugc2VsZWN0IGRhdGVcIlxuXHRcdH0sXG5cdFx0bW9kYWxVcGxvYWRDYXJkOiB7XG5cdFx0XHR0aXQ6IFwi6KuL5LiK5YKz6K2J5Lu26LOH5paZXCIsXG5cdFx0XHRmcm9udDogXCLorYnku7bmraPpnaJcIixcblx0XHRcdGJhY2s6IFwi6K2J5Lu25Y+N6Z2iXCIsXG5cdFx0fVxuXHR9LFxuXHRuYXY6IHtcblx0XHRsb2dpbkRhdGE6IHtcblx0XHRcdG5hbWU6IFwibG9naW5cIixcblx0XHRcdHBhdGg6IFwiL2xvZ2luXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcInJlZ2lzdGVyXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3JlZ2lzdGVyXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwibG9naW5cIixcblx0XHRcdFx0cGF0aDogXCIvbG9naW5cIixcblx0XHRcdFx0dHlwZTogXCJub0F1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwibW9kaWZ5IHBhc3N3b3JkXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3Bhc3N3b3JkL3Jlc2V0XCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJwcm9maWxlXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2luZm9tYXRpb24vaW1wcm92ZVwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwibG9nb3V0XCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJsb2dvdXRcIlxuXHRcdFx0fSxcblx0XHRcdF1cblx0XHR9LFxuXHRcdG5hdkxpc3Q6IFt7XG5cdFx0XHRuYW1lOiBcIlByb2R1Y3RzXCIsXG5cdFx0XHRwYXRoOiBcIi9lbXB0eVwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJWSElTXCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdHZhbHVlOiBcImdvdG9WSElTXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSW5zdXJhbmNlIHdpdGggSW52ZXN0bWVudCBGb2N1c1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9wcm9kdWN0XCJcblx0XHRcdH1dXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRuYW1lOiBcIkN1c3RvbWVyIFNlcnZpY2VcIixcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9wcm9kdWN0XCIsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIkN1c3RvbWVyIFNlcnZpY2VcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIkNvbnRhY3QgVXNcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0xXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiT25saW5lIFByZW1pdW0gUGF5bWVudFwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTJcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJQb2xpY3kgSW5xdWlyeVwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTNcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJQb2xpY3kgQ2hhbmdlXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tNDFcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJDbGFpbXNcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW01XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiRS1yZXNlcnZhdGlvblwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTZcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJDb21wbGFpbnRzXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tN1wiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIlVzZWZ1bCBGb3Jtc1wiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bThcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCJBYm91dCBVc1wiLFxuXHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJBYm91dCBQaW5nIEFuIChMaWZlKSBIS1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9wcm9maWxlXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQ29tcGFueSBFdmVudHNcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIk5ld3MgQ2VudGVyXCIsXG5cdFx0XHRcdHBhdGg6IFwiL25ld3MvbGlzdFwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkNvcnBvcmF0ZSBTb2NpYWwgUmVzcG9uc2liaWxpdHlcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBd2FyZHNcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdHtcblx0XHRcdG5hbWU6IFwiSm9pbiBVc1wiLFxuXHRcdFx0cGF0aDogXCIvZW1wdHlcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiQ29ycG9yYXRlIEN1bHR1cmVcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJDYXJlZXIgT3Bwb3J0dW5pdGllc1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0XVxuXHRcdH1dXG5cdH0sXG5cdGZvb3Rlcjoge1xuXHRcdGhrUGhvbmU6IFwiSEsgVGVsXCIsXG5cdFx0Y25QaG9uZTogXCJDTiBUZWxcIixcblx0XHRhYm91dFVzOiBcIkFib3V0IHVzXCIsXG5cdFx0Y29tcGFueUludHJvZHVjdGlvbjogXCJDb21wYW55IGludHJvZHVjdGlvblwiLFxuXHRcdG5ld3M6IFwiTmV3c1wiLFxuXHRcdGpvaW5VczogXCJKb2luIHVzXCIsXG5cdFx0aGVscENlbnRlcjogXCJIZWxwIGNlbnRlclwiLFxuXHRcdHByaXZhY3k6IFwiUHJpdmFjeSBQb2xpY3lcIixcblx0XHR0ZXJtczogXCJUZXJtcyBvZiBVc2VcIixcblx0XHRwcm90b2NvbDogXCJQZXJzb25hbCBEYXRhIENvbGxlY3Rpb24gU3RhdGVtZW50XCIsXG5cdFx0bWFwOiBcIk1hcFwiLFxuXHRcdGNvbnRhY3RVczogXCJDb250YWN0IHVzXCIsXG5cdFx0Y29udGFjdEluZm9ybWF0aW9uOiBcIkNvbnRhY3QgSW5mb3JtYXRpb25cIixcblx0XHRzZXJ2aWNlOiBcIlNlcnZpY2VcIixcblx0XHRxcmNvZGU6IFwiT2ZmaWNpYWwgQWNjb3VudHNcIixcblx0XHRjb3B5cmlnaHQ6IFwi54mI5qyK5omA5pyJIMKpIOS4reWci+W5s+WuieS/nemaqu+8iOmbhuWcmO+8ieiCoeS7veaciemZkOWFrOWPuOacque2k+ioseWPr+S4jeW+l+W+qeWItuOAgei9iei8ieaIluaRmOe3qO+8jOmBleiAheW/heeptiFcIlxuXHR9LFxuXHRsb2dpbjoge1xuXHRcdHRpdGxlOiBcIlBpbmdBbiBPbmUgQ29ubmVjdCBNZW1iZXIgU2VydmljZVwiLFxuXHRcdGxvZ2luVHlwZTE6IFwiTG9naW4gd2l0aCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkXCIsXG5cdFx0bG9naW5UeXBlMjogXCJEeW5hbWljIHBhc3N3b3JkIGxvZ2luXCIsXG5cdFx0YWNjb3VudDogXCJBY2NvdW50XCIsXG5cdFx0YWNjb3VudFBsYWNlaG9sZGVyOiBcIlBsZWFzZSBlbnRlciBNb2JpbGUgbm8uLyBPbmUgQ29ubmVjdCBVc2VyIE5hbWVcIixcblx0XHRwYXNzd29yZDogXCJQYXNzd29yZFwiLFxuXHRcdHBhc3N3b3JkUGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIHBhc3N3b3JkXCIsXG5cdFx0dmVyaWZ5UGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIHBhc3N3b3JkXCIsXG5cdFx0YWdyZWU6IFwiQWdyZWUgd2l0aCBcIixcblx0XHRwcm90b2NvbDogXCIgUGluZ0FuIE9uZSBDb25uZWN0IE1lbWJlciBTZXJ2aWNlIEFncmVlbWVudFwiLFxuXHRcdGxvZ2luOiBcIkNvbmZpcm1cIixcblx0XHRyZWdpc3RlcjogXCJSZWdpc3RlclwiLFxuXHRcdGZvcmdldDogXCJGb3JnZXQgcGFzc3dvcmRcIixcblx0XHRtb2JpbGU6IFwiTW9iaWxlIG5vLlwiLFxuXHRcdG1vYmlsZVBsYWNlaG9sZGVyOiBcIlBsZWFzZSBlbnRlciBNb2JpbGUgbm9cIixcblx0XHR2ZXJpZnlDb2RlOiBcIlNNUyB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdHZlcmlmeUNvZGVQbGFjZWhvbGRlcjogXCJTTVMgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHR2ZXJpZnlDb2RlR2V0OiBcIkdldCBTTVMgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHR0aXBzOiB7XG5cdFx0XHRlMTogXCJQbGVhc2UgZW50ZXIgYWNjb3VudFwiLFxuXHRcdFx0ZTI6IFwiUGxlYXNlIGVudGVyIHRoZSBwYXNzd29yZFwiLFxuXHRcdFx0ZTM6IFwiUGxlYXNlIGVudGVyIHRoZSBwaWN0dXJlIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0XHRlNDogXCJBZ3JlZSB3aXRoIFBpbmdBbiBPbmUgQ29ubmVjdCBNZW1iZXIgU2VydmljZSBBZ3JlZW1lbnRcIixcblx0XHRcdGU1OiBcIkludmFsaWRhdGUgYWNjb3VudCBvciBwYXNzd29yZCwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0XHRvZTA6IFwiSW52YWxpZGF0ZSBtb2JpbGUgbm8uICwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0XHRvZTE6IFwiUGxlYXNlIGdldCBTTVMgdmVyaWZpY2F0aW9uIGNvZGUgZmlyc3RcIixcblx0XHRcdG9lMjogXCJQbGVhc2UgZW50ZXIgdGhlIHBpY3R1cmUgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdG9lMzogXCJQbGVhc2UgZW50ZXIgdGhlIHBpY3R1cmUgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdG9lNDogXCJJbnZhbGlkYXRlIFNNUyB2ZXJpZmljYXRpb24gY29kZSwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0fVxuXHR9LFxuXHRzZXNzaW9uOiB7XG5cdFx0c2lkRXhwaXJlOiBcIkl0IGhhcyBub3QgYmVlbiBvcGVyYXRlZCBmb3IgYSBsb25nIHRpbWUuIEZvciB0aGUgc2FrZSBvZiB5b3VyIGFjY291bnQgc2VjdXJpdHksIHBsZWFzZSByZXN0YXJ0XCIsXG5cdH0sXG5cdHJlZ2lzdGVyOiB7XG5cdFx0bW9iaWxlT3B0aW9uczogW3tcblx0XHRcdHR5cGU6IFwiaGtcIixcblx0XHRcdG5hbWU6IFwiSEsgTm9cIixcblx0XHRcdHBsYWNlSG9sZGVyOiBcIlBsZWFzZSBlbnRlciA4LWRpZ2l0IG1vYmlsZSBudW1iZXJcIixcblx0XHRcdGFyZWFDb2RlOiBcIis4NTJcIlxuXHRcdH0sIHtcblx0XHRcdHR5cGU6IFwiemhcIixcblx0XHRcdG5hbWU6IFwiTWFpbmxhbmQgTm8uXCIsXG5cdFx0XHRwbGFjZUhvbGRlcjogXCJQbGVhc2UgZW50ZXIgMTEtZGlnaXQgbW9iaWxlIG51bWJlclwiLFxuXHRcdFx0YXJlYUNvZGU6IFwiKzg2XCJcblx0XHR9XSxcblx0XHRjb3V0VGlwczogXCJ7c2Vjb25kfVNlY29uZHNcIixcblx0XHR0aXRsZTogXCJXZWxjb21lXCIsXG5cdFx0dGl0bGUyOiBcIlBsZWFzZSBzZXQgdXAgbmV3IHBhc3N3b3JkXCIsXG5cdFx0bW9iaWxlUGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIDgtZGlnaXQgbW9iaWxlIG51bWJlclwiLFxuXHRcdHZlcmlmeUNvZGVQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgU01TIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0dmVyaWZ5Q29kZUdldDogXCJHZXQgU01TIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0YWdyZWU6IFwiQWdyZWUgd2l0aCBcIixcblx0XHRwcm90b2NvbDogXCIgUGluZ0FuIE9uZSBDb25uZWN0IE1lbWJlciBTZXJ2aWNlIEFncmVlbWVudFwiLFxuXHRcdHJlZ2lzdGVyOiBcIkNsaWNrIHRvIHJlaXN0ZXJcIixcblx0XHRuZXdQYXNzd29yZDogXCJQYXNzd29yZFwiLFxuXHRcdG5ld1Bhc3N3b3JkUGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIHBhc3N3b3JkXCIsXG5cdFx0bmV3UGFzc3dvcmRTdXJlOiBcIkNvbmZpcm0gcGFzc3dvcmRcIixcblx0XHRuZXdQYXNzd29yZFN1cmVQbGFjZWhvbGRlcjogXCJQbGVhc2UgY29uZmlybSBwYXNzd29yZFwiLFxuXHRcdHN1cmU6IFwiQ29uZmlybVwiLFxuXHRcdHRpcHM6IHtcblx0XHRcdGUxOiBcIkludmFsaWRhdGUgbW9iaWxlIG5vLiAsIHBsZWFzZSByZS1lbnRlclwiLFxuXHRcdFx0ZTI6IFwiQWdyZWUgd2l0aCBQaW5nQW4gT25lIENvbm5lY3QgTWVtYmVyIFNlcnZpY2UgQWdyZWVtZW50XCIsXG5cdFx0XHRlMzogXCJJbnZhbGlkYXRlIFNNUyB2ZXJpZmljYXRpb24gY29kZSwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0XHRlNDogXCJQbGVhc2UgZ2V0IFNNUyB2ZXJpZmljYXRpb24gY29kZSBmaXJzdFwiLFxuXHRcdFx0ZTU6IFwiWW91ciBtb2JpbGUgbm8uIGlzIG5vdCByZWdpc3RlciwgcGxlYXNlIHJlZ2lzdGVyIGJlZm9yZSBsb2dpblwiLFxuXHRcdFx0ZTY6IFwiUGxlYXNlIGVudGVyIHRoZSBwaWN0dXJlIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0XHRlNzogXCJQYXNzd29yZCBsZW5ndGggY2Fubm90IGJlIGxlc3MgdGhhbiA4IGJpdHNcIixcblx0XHRcdGU4OiBcIlBhc3N3b3JkcyBtdXN0IGNvbnRhaW4gbnVtYmVycywgY2hhcmFjdGVycywgYW5kIHNwZWNpYWwgbnVtYmVyc1wiLFxuXHRcdFx0ZTk6IFwiTmV3IHBhc3N3b3JkIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgb2xkIG9uZVwiLFxuXHRcdFx0ZTEwOiBcIlZlcmlmaWNhdGlvbiBjb2RlIHdhcyBFeHBpcmVkXCIsXG5cdFx0XHRlMTE6IFwiUmVnaXN0cmF0aW9uIGZhaWxlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIHN0YWZmXCIsXG5cdFx0XHRlMTI6IFwiU3VjY2Vzc1wiLFxuXHRcdH1cblx0fSxcblx0cGFzc3dvcmRDaGVjazoge1xuXHRcdGVycm9yMTogXCJQYXNzd29yZCBsZW5ndGggY2Fubm90IGJlIGxlc3MgdGhhbiA4IGJpdHNcIixcblx0XHRlcnJvcjI6IFwiUGFzc3dvcmRzIG11c3QgY29udGFpbiBudW1iZXJzLCBjaGFyYWN0ZXJzLCBhbmQgc3BlY2lhbCBudW1iZXJzXCIsXG5cdFx0ZXJyb3IzOiBcIlRoZSBwYXNzd29yZHMgYXJlIGluY29uc2lzdGVudC4gUGxlYXNlIGNvbmZpcm0gYW5kIHJlLWVudGVyXCIsXG5cdFx0ZXJyb3I0OiBcIlBhc3N3b3JkIG1vZGlmaWNhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIgb3IgY2FsbCA5NTUxMVwiLFxuXHRcdGVycm9yNTogXCJDdXJyZW50IHBhc3N3b3JkIGlzIGluY29ycmVjdC4gUGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0c3VjY2VzczogXCJTdWNjZXNzXCJcblx0fSxcblx0cGFzc3dvcmRSZXNldDoge1xuXHRcdG9sZFB3ZDogXCJDdXJyZW50IHBhc3N3b3JkXCIsXG5cdFx0b2xkUHdkUGxhY2Vob2xkZTogXCJQbGVhc2UgZW50ZXIgY3VycmVudCBwYXNzd29yZFwiLFxuXHRcdGNpZEV4cGlyZTogXCJJdCBoYXMgbm90IGJlZW4gb3BlcmF0ZWQgZm9yIGEgbG9uZyB0aW1lLiBGb3IgdGhlIHNha2Ugb2YgeW91ciBhY2NvdW50IHNlY3VyaXR5LCBwbGVhc2UgcmVzdGFydFwiLFxuXHRcdHR5cGUxOiB7XG5cdFx0XHR0aXRsZTogXCJSZXRyaWV2ZSBwYXNzd29yZFwiLFxuXHRcdFx0dDE6IFwiUGxlYXNlIGVudGVyIHVzZXIgaW5mb3JtYXRpb25cIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwiTW9iaWxlIG5vLi8gT25lIENvbm5lY3QgVXNlciBOYW1lXCIsXG5cdFx0XHRzdWJtaXQ6IFwiQ29uZmlybVwiLFxuXHRcdFx0ZXJyb3I6IFwiSW52YWxpZCBtb2JpbGUgbm8uLyB1c2VyIG5hbWUsIHBsZWFzZSByZS1lbnRlclwiLFxuXHRcdH0sXG5cdFx0dHlwZTI6IHtcblx0XHRcdHRpdGxlOiBcIlJldHJpZXZlIHBhc3N3b3JkXCIsXG5cdFx0XHR0MTogXCJTTVMgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0XHRzdWJtaXQ6IFwiQ29uZmlybVwiLFxuXHRcdFx0ZXJyb3IxOiBcIkludmFsaWQgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdGVycm9yMjogXCJWZXJpZmljYXRpb24gY29kZSB3YXMgRXhwaXJlZFwiLFxuXHRcdFx0ZXJyb3IzOiBcIuefreS/oemqjOivgeeggeWPkeaUvuaXtumXtOWwkeS6jjHliIbpkp/vvIzor7fnqI3lkI7lho3or5VcIixcblx0XHR9LFxuXHRcdHR5cGUzOiB7XG5cdFx0XHR0aXRsZTogXCJSZXRyaWV2ZSBwYXNzd29yZFwiLFxuXHRcdFx0dDE6IFwiUGxlYXNlIHZlcmlmeSBJRCBpbmZvcm1hdGlvblwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCJcIixcblx0XHRcdHN1Ym1pdDogXCJDb25maXJtXCIsXG5cdFx0fSxcblx0XHR0eXBlNDoge1xuXHRcdFx0dGl0bGU6IFwiUGxlYXNlIHNldCB1cCBuZXcgcGFzc3dvcmRcIixcblx0XHRcdHQxOiBcIk5ldyBwYXNzd29yZFwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgbmV3IHBhc3N3b3JkXCIsXG5cdFx0XHR0MjogXCJDb25maXJtIHBhc3N3b3JkXCIsXG5cdFx0XHR0MlBsYWNlaG9sZGVyOiBcIlBsZWFzZSByZS1lbnRlciBuZXcgcGFzc3dvcmRcIixcblx0XHRcdHN1Ym1pdDogXCJDb25maXJtXCIsXG5cdFx0XHRlcnJvcjE6IFwiUGFzc3dvcmQgbGVuZ3RoIG5vdCBsZXNzIHRoYW4gOCBiaXRzXCIsXG5cdFx0XHRlcnJvcjI6IFwiUGFzc3dvcmRzIG11c3QgY29udGFpbiBudW1iZXJzLCBjaGFyYWN0ZXJzLCBhbmQgc3BlY2lhbCBudW1iZXJzXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmZvbWF0aW9uSW1wcm92ZToge1xuXHRcdHRpdGxlOiBcIlBsZWFzZSBjb21wbGV0ZSBhbGwgaW5mb3JtYXRpb25cIixcblx0XHR0MTogXCLlp5PlkI1cIixcblx0XHR0MWMxOiBcIlN1cm5hbWVcIixcblx0XHR0MWMyOiBcIk5hbWVcIixcblx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQyOiBcIlNleFwiLFxuXHRcdHQyUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDM6IFwiRGF0ZSBvZiBiaXJ0aFwiLFxuXHRcdHQzUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDQ6IFwiVHlwZSBvZiBJRFwiLFxuXHRcdHQ0UGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDU6IFwiSUQgbm8uXCIsXG5cdFx0dDVQbGFjZWhvbGRlcjogXCJcIixcblx0XHRzdWJtaXQ6IFwiQ29uZmlybVwiLFxuXHRcdGNhbmNlbDogXCJTa2lwXCIsXG5cdFx0Y2FuZGlkYXRlczoge1xuXHRcdFx0c2V4OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUt1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJNXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlpbNcIixcblx0XHRcdFx0dmFsdWU6IFwiRlwiXG5cdFx0XHR9XSxcblx0XHRcdGlkVHlwZTogW3tcblx0XHRcdFx0bmFtZTogXCLouqvku73orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiMVwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi6K2354WnXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjJcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIui7jeWumOitieaIluWjq+WFteitiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIzXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPpgJrooYzorYkv5Zue6YSJ6K2J5oiW5Y+w6IOe6K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjZcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWkluWci+S6uuawuOS5heWxheeVmei6q+S7veitiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJPXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPlj7DlsYXmsJHlsYXkvY/orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiVlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5Y+w54Gj5bGF5rCR5bGF5L2P6K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIldcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWFtuS7llwiLFxuXHRcdFx0XHR2YWx1ZTogXCIwXCJcblx0XHRcdH1dXG5cdFx0fSxcblx0XHRzdWNjZXNzTXNnOiBcIuabtOaWsOaIkOWKn1wiLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6KuL5aGr5a+r5aeT5ZCN5L+h5oGvXCIsXG5cdFx0XHRlMjogXCLoq4vpgbjmk4fmgKfliKVcIixcblx0XHRcdGUzOiBcIuiri+mBuOaTh+eUn+aXpVwiLFxuXHRcdFx0ZTQ6IFwi6KuL6YG45pOH6K2J5Lu26aGe5Z6LXCIsXG5cdFx0XHRlNTogXCLoq4vloavlr6vorYnku7bomZ/norxcIixcblx0XHRcdGU2OiBcIuaCqOWhq+Wvq+eahOitieS7tuiZn+eivOacieiqpFwiLFxuXHRcdFx0ZTc6IFwi5oKo5aGr5a+r55qE5L+h5oGv5pyJ6Kqk77yM6KuL5qC45a+m5b6M6YeN5paw5o+Q5LqkXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmRleDoge1xuXHRcdG5ld3M6IFwi5paw6IGe6LOH6KiKXCIsXG5cdFx0bmV3TW9yZTogXCLmn6XnnIvmm7TlpJpcIixcblx0XHRyZWNvbW1lbmQ6IHtcblx0XHRcdHQxOiBcIk9ubGluZSBRdW90YXRpb25cIixcblx0XHRcdHQyOiBcIkN1c3RvbWVyIFNlcnZpY2VcIixcblx0XHRcdHQzOiBcIlByb2R1Y3QgSW5mb3JtYXRpb25cIixcblx0XHRcdHQ0OiBcIkxhdGVzdCBOZXdzXCIsXG5cdFx0XHRpdGVtMToge1xuXHRcdFx0XHRidG46IFwi5LqG6Kej5pu05aSa55Si5ZOBXCIsXG5cdFx0XHRcdHQxOiBcIueCuuiHquW3seWSjOWutuS6uuWwi+aJvuWjueS7veS/nemanFwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0yOiB7XG5cdFx0XHRcdGJ0bjogXCLnq4vljbPpoJDntIRcIixcblx0XHRcdFx0dDE6IFwi5Zyo57ea6aCQ57SEIOWwiOalreacjeWLmVwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0zOiB7XG5cdFx0XHRcdGJ0bjogXCLlrqLmiLfmnI3liqFcIixcblx0XHRcdFx0dDE6IFwi5bCI5qWt5a6i5pyN54K65aaz5pyN5YuZXCIsXG5cdFx0XHRcdHQyOiBcIuaDs+S6huino+abtOWkmu+8jOWPr+iHtOmbu1wiLFxuXHRcdFx0XHR0MzogXCI5NTUxMVwiLFxuXHRcdFx0XHR0NDogXCLoga/ntaHmiJHlgJHvvIzmiJbpgLLlhaVcIixcblx0XHRcdH1cblx0XHR9LFxuXHR9LFxuXHRjb21wbGFpbnRBY2NlcHRhbmNlOiB7XG5cdFx0bmFtZTogXCJOYW1lXCIsXG5cdFx0bmFtZVBsYWNlaG9sZGVyOiBcIk5hbWVcIixcblx0XHRjb250YWN0VHlwZTogXCJQcmVmZXJyZWQgV2F5IG9mIENvbnRhY3RcIixcblx0XHRlbWFpbDogXCJFLW1haWxcIixcblx0XHRxdWVzdGlvbjogXCJRdWVzdGlvbi8gT3BpbmlvblwiLFxuXHRcdHF1ZXN0aW9uUGxhY2VIb2xkZXI6IFwiTm8gbW9yZSB0aGFuIDUwMCB3b3Jkc1wiLFxuXHRcdG9yZGVyTm86IFwiUG9saWN5IE5vXCIsXG5cdFx0b3JkZXJOb1BsYWNlSG9sZGVyOiBcIklmIHlvdSBhcmUgUGluZyBBbiBjdXN0b21lciwgcGxlYXNlIHByb3ZpZGUgdGhlIHBvbGljeSBudW1iZXJcIixcblx0XHRjb250YWN0VGltZTogXCJQcmVmZXJyZWQgQ29udGFjdCBEYXRlXCIsXG5cdFx0bm90aWNlMTogXCJUaGUgcGVyc29uYWwgZGF0YSBjb2xsZWN0ZWQgaW4gdGhpcyBmb3JtIGlzIHByb2Nlc3NlZCBpbiBhY2NvcmRhbmNlIHdpdGggUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISyksIEx0ZCBQZXJzb25hbCBJbmZvcm1hdGlvbiBDb2xsZWN0aW9uIFN0YXRlbWVudCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgdG8gY29udGFjdCB5b3UuIEhvd2V2ZXIsIHRoZSBwZXJzb25hbCBkYXRhIGNvbGxlY3RlZCB3aWxsIG5vdCBiZSB0cmFuc2ZlcnJlZCB0byB0aGlyZC1wYXJ0eSBvcmdhbml6YXRpb25zIG90aGVyIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBcXFwiUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISyksIEx0ZCBQZXJzb25hbCBEYXRhIENvbGxlY3Rpb24gU3RhdGVtZW50XFxcIiB3aXRob3V0IHlvdXIgZXhwbGljaXQgYXV0aG9yaXphdGlvbi4gWW91IGNhbiBjaG9vc2Ugbm90IHRvIHByb3ZpZGUgdXMgd2l0aCB0aGUgcmVxdWlyZWQgcGVyc29uYWwgaW5mb3JtYXRpb24sIGJ1dCB0aGlzIG1heSBwcmV2ZW50IHVzIGZyb20gY29udGFjdGluZyB5b3UuIFlvdSBjYW4gYWxzbyBhY2Nlc3MgYW5kIGNvcnJlY3QgeW91ciBwZXJzb25hbCBkYXRhIGluIGFjY29yZGFuY2Ugd2l0aCBQaW5nIEFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQ2hpbmEgKEhLKSwgTHRkIFBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnTjgIJcIixcblx0XHRub3RpY2UyOiBcIkkgaGVyZWJ5IGNvbmZpcm0gdGhhdCBJIHVuZGVyc3RhbmQgYW5kIGFncmVlIHRoYXQgbXkgcGVyc29uYWwgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBhYm92ZSBwdXJwb3NlcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ29tcGFueSBvZiBDaGluYSAoSEspIFBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnQuXCIsXG5cdFx0Y29udGFjdFR5cGVzOiBbeyBuYW1lOiAnTW9iaWxlJywgdmFsdWU6IDEsIHNob3c6IFwiTW9iaWxlXCIsIGljb246IFwibW9iaWxlXCIgfSwgeyBuYW1lOiAnRW1haWwnLCB2YWx1ZTogMiwgc2hvdzogXCJFbWFpbFwiLCBpY29uOiBcImVtYWlsXCIgfV0sXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCJQbGVhc2UgZmlsbCBpbiB0aGlzIGl0ZW1cIixcblx0XHRcdGUyOiBcIlBsZWFzZSBmaWxsIGluIHRoZSBjb3JyZWN0IGNvbnRhY3QgaW5mb3JtYXRpb25cIlxuXHRcdH0sXG5cdFx0c3VjY2VzczogXCJUaGFuayB5b3UgZm9yIHlvdXIgY29tbWVudHNcIlxuXHR9LFxuXHRyZXNlcnZhdGlvbjoge1xuXHRcdG5hbWU6IFwiTmFtZVwiLFxuXHRcdG5hbWVQbGFjZWhvbGRlcjogXCJOYW1lXCIsXG5cdFx0Y29udGFjdFR5cGU6IFwiUHJlZmVycmVkIHdheSBvZiBjb250YWN0XCIsXG5cdFx0Y29udGFjdFR5cGVDYWRpZGF0ZXM6IFt7IG5hbWU6IFwicGhvbmUgbm9cIiwgdmFsdWU6IDEgfV0sXG5cdFx0Y29udGFjdDogXCJDb250YWN0IE51bWJlclwiLFxuXHRcdGNvbnRhY3RQbGFjZWhvbGRlcjogXCLvvIhISyBOby4vIE1haW5sYW5kIE5vLu+8iVwiLFxuXHRcdHJlc2VydmF0aW9uVHlwZTogXCJUeXBlIG9mIFJlc2VydmF0aW9uXCIsXG5cdFx0cmVzZXJ2YXRpb25DYW5kaWRhdGVzOiBbXG5cdFx0XHR7IG5hbWU6IFwiSW5zdXJhbmNlIGNvbnN1bHRhdGlvblwiLCB2YWx1ZTogXCLmipXkv53oq67oqaJcIiB9LFxuXHRcdFx0eyBuYW1lOiBcIkFnZW50IGNoYW5nZVwiLCB2YWx1ZTogXCLku6Plip7kv53ljZXlj5jmm7RcIiB9XG5cdFx0XSxcblx0XHRyZXNlcnZhdGlvblJlbWFyazogXCJSZXNlcnZhdGlvbiBEZXNjcmlwdGlvblwiLFxuXHRcdHJlc2VydmF0aW9uUmVtYXJrUGxhY2Vob2xkZXI6IFwiT3B0aW9uYWwsIG5vIG1vcmUgdGhhbiA1MDAgd29yZHMsIHByb21wdCB0ZXh0IFxcXCJQbGVhc2UgYnJpZWZseSBleHBsYWluIHRoZSBpbnN1cmFuY2UgdHlwZSBvciBidXNpbmVzcyB5b3Ugd2FudCB0byBjb25zdWx0XCIsXG5cdFx0aGtDbGllbnQ6IFwiQ3VycmVudCBQaW5nYW4gSEsgQ3VzdG9tZXJcIixcblx0XHR5ZXM6IFwiWWVzXCIsXG5cdFx0bm86IFwiTm9cIixcblx0XHRjb250YWN0VGltZTogXCJQcmVmZXJyZWQgQ29udGFjdCBEYXRlXCIsXG5cdFx0bm90aWNlMTogXCJUaGUgcGVyc29uYWwgZGF0YSBjb2xsZWN0ZWQgaW4gdGhpcyBmb3JtIGlzIHByb2Nlc3NlZCBpbiBhY2NvcmRhbmNlIHdpdGggUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISyksIEx0ZCBQZXJzb25hbCBJbmZvcm1hdGlvbiBDb2xsZWN0aW9uIFN0YXRlbWVudCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgdG8gY29udGFjdCB5b3UuIEhvd2V2ZXIsIHRoZSBwZXJzb25hbCBkYXRhIGNvbGxlY3RlZCB3aWxsIG5vdCBiZSB0cmFuc2ZlcnJlZCB0byB0aGlyZC1wYXJ0eSBvcmdhbml6YXRpb25zIG90aGVyIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBcXFwiUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISyksIEx0ZCBQZXJzb25hbCBEYXRhIENvbGxlY3Rpb24gU3RhdGVtZW50XFxcIiB3aXRob3V0IHlvdXIgZXhwbGljaXQgYXV0aG9yaXphdGlvbi4gWW91IGNhbiBjaG9vc2Ugbm90IHRvIHByb3ZpZGUgdXMgd2l0aCB0aGUgcmVxdWlyZWQgcGVyc29uYWwgaW5mb3JtYXRpb24sIGJ1dCB0aGlzIG1heSBwcmV2ZW50IHVzIGZyb20gY29udGFjdGluZyB5b3UuIFlvdSBjYW4gYWxzbyBhY2Nlc3MgYW5kIGNvcnJlY3QgeW91ciBwZXJzb25hbCBkYXRhIGluIGFjY29yZGFuY2Ugd2l0aCBQaW5nIEFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQ2hpbmEgKEhLKSwgTHRkIFBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnTjgIJcIixcblx0XHRub3RpY2UyOiBcIkkgaGVyZWJ5IGNvbmZpcm0gdGhhdCBJIHVuZGVyc3RhbmQgYW5kIGFncmVlIHRoYXQgbXkgcGVyc29uYWwgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBhYm92ZSBwdXJwb3NlcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ29tcGFueSBvZiBDaGluYSAoSEspIFBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnQuXCIsXG5cdFx0c3VjY2VzczogXCJTdWNjZXNzXCIsXG5cdFx0c3VibWl0QnRuOiAnQ29uZmlybScsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCJQbGVhc2UgZmlsbCBpbiB0aGlzIGl0ZW1cIixcblx0XHRcdGUyOiBcIlBsZWFzZSBmaWxsIGluIHRoZSBjb3JyZWN0IGNvbnRhY3QgaW5mb3JtYXRpb25cIlxuXHRcdH1cblx0fSxcblx0cGF5bWVudFR5cGU6IHtcblx0XHRtZW51MTogXCJQYXltZW50IGluIFBlcnNvbiBhdCBDYXNoaWVyXCIsXG5cdFx0bWVudTI6IFwiSW50ZXJuZXQgQmFua2luZ1wiLFxuXHRcdG1lbnUzOiBcIlRlbGVncmFwZ2ljIFRyYW5zZmVyXCIsXG5cdFx0bWVudTQ6IFwiSkVUQ08gQVRNXCIsXG5cdFx0bWVudTU6IFwiUFBTXCIsXG5cdFx0bWVudTY6IFwiSG9uZyBLb25nIFBvc3RcIixcblx0fSxcblx0cHJvZHVjdDoge1xuXHRcdGJ0blBvc2l0aW9uOiBcIkJvb2tpbmcgc2VydmljZVwiLFxuXHRcdGljb25Qcm9ibGVtOiBcIkNvbW1vbiBwcm9ibGVtXCIsXG5cdFx0aWNvblByb2Nlc3M6IFwiSW5zdXJhbmNlIHByb2Nlc3NcIixcblx0XHRpY29uUHJvZHVjdDogXCJQcm9kdWN0IGRldGFpbHNcIlxuXHR9LFxuXHRjdXN0b21Qcm9kdWN0OiB7XG5cdFx0bWVudTE6IFwiQ29udGFjdCB1c1wiLFxuXHRcdG1lbnUyOiBcIlBheSBwcmVtaXVtXCIsXG5cdFx0bWVudTM6IFwiUXVlcnkgcG9saWN5XCIsXG5cdFx0bWVudTQ6IFwiQ2hhbmdlIHBvbGljeVwiLFxuXHRcdG1lbnU1OiBcIkNsYWltIHJlcG9ydFwiLFxuXHRcdG1lbnU2OiBcIlJlc2VydmF0aW9uIHNlcnZpY2VcIixcblx0XHRtZW51NzogXCJTdWdnZXN0aW9uc1wiLFxuXHRcdG1lbnU4OiBcIkNvbW1vbiBmb3JtXCIsXG5cdH0sXG5cdGNvbW1vbkZvcm06IHtcblx0XHRoZWFkMTogXCJUeXBlIG9mIEZvcm1zXCIsXG5cdFx0aGVhZDI6IFwiRm9ybXNcIixcblx0XHRoZWFkMzogXCJQdXJwb3NlXCIsXG5cdFx0aGVhZDQ6IFwiQXR0YWNobWVudFwiLFxuXHRcdGRvd25sb2FkOiBcIkRvd25sb2FkXCIsXG5cdFx0Zm9ybTogW3tcblx0XHRcdHR5cGU6IFwiUGF5bWVudFwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLjgIxFLWFjY291bnQgU2VydmljZeOAjWFuZCBEaXJlY3QgRGViaXQgQXV0aG9yaXphdGlvbiBBcHBsaWNhdGlvbiBmb3IgQmFuayBBY2NvdW50XCIsXG5cdFx0XHRcdGRlc2M6IFwiRm9yIGFwcGx5aW5nIGUtc2VydmljZSBhY2NvdW50IGFuZCBkaXJlY3QgZGViaXQgYXV0aG9yaXphdGlvblwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQ3JlZGl0IENhcmQgQWNjb3VudCBEaXJlY3QgRGViaXQgQXV0aG9yaXphdGlvblwiLFxuXHRcdFx0XHRkZXNjOiBcIkFwcGxpY2F0aW9uIGZvciBjcmVkaXQgY2FyZCBkaXJlY3QgZGViaXRcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIkNoYW5nZSBvZiBQb2xpY3lcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiUG9saWN5IFRlcm1pbmF0aW9uIEFwcGxpY2F0aW9uIEZvcm1cIixcblx0XHRcdFx0ZGVzYzogXCJQb2xpY3kgc3VycmVuZGVyXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3IgQ2hhbmdlIG9mIFBvbGljeSBGb3Jt77yIUG9saWN5IExvYW4gUmVwYXltZW5077yJXCIsXG5cdFx0XHRcdGRlc2M6IFwiUG9saWN5IGxvYW5cIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvciBDaGFuZ2Ugb2YgUG9saWN5IEZvcm3vvIhDaGFuZ2Ugb2YgUG9saWN577yJXCIsXG5cdFx0XHRcdGRlc2M6IFwiTmV3bHkgYWRkZWQgcHJlbWl1bSwgZGVkdWN0ZWQgcHJlbWl1bVwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9yIENoYW5nZSBvZiBQb2xpY3kgRm9ybe+8iENoYW5nZSBvZiBDdXN0b21lciBJbmZvcm1hdGlvbu+8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIkJhc2ljIEluZm9ybWF0aW9uIENoYW5nZVwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9yIENoYW5nZSBvZiBQb2xpY3kgRm9ybe+8iENoYW5nZSBvZiBCZW5lZmljaWFyee+8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIk1vZGUgb2YgcGF5bWVudCwgc2VsZi1yZXBsYWNlbWVudCBhbmQgcmVpc3N1ZXNcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkF1dGhvcml6YXRpb24gTGV0dGVyXCIsXG5cdFx0XHRcdGRlc2M6IFwiVG8gYXV0aG9yaXplIDNyZCBwYXJ0eSB0byBoYW5kbGUgb24gYmVoYWxmIG9mIHBvbGljeSBvd25lclwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiVGF4IFN0YXRlbWVudFwiLFxuXHRcdFx0XHRkZXNjOiBcIkNSU1wiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSGVhbHRoIERlY2xhcmF0aW9uXCIsXG5cdFx0XHRcdGRlc2M6IFwiRm9yIHVuZGVyd3JpdGluZyBwdXJwb3NlXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJDbGFpbXNcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiQ2xhaW1zIEZvcm1cIixcblx0XHRcdFx0ZGVzYzogXCJGb3Igd3JpdHRlbiBjbGFpbXMgYXBwbGljYXRpb25cIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0XVxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VHdWlkZToge1xuXG5cdFx0bm90aWNlOiBcIklmIHlvdSBuZWVkIHRvIG1vZGlmeSBwbGVhc2VcIixcblx0XHRub3RpY2VMaW5rOiBcImNvbnRhY3QgY3VzdG9tZXIgc2VydmljZVwiLFxuXHRcdGhlYWQxOiBcIkl0ZW1cIixcblx0XHRoZWFkMjogXCJEZXRhaWxzXCIsXG5cdFx0aGVhZDM6IFwiQXBwbGljYW50XCIsXG5cdFx0aGVhZDQ6IFwiRGVhZGxpbmVcIixcblx0XHRoZWFkNTogXCJNYXRlcmlhbHMgdG8gYmUgc3VibWl0dGVkXCIsXG5cdFx0ZG93bmxvYWQ6IFwi5LiL6LyJ5paH5qqUXCIsXG5cdFx0Zm9ybTogW3tcblx0XHRcdHByb2plY3Q6IFwiUG9saWN5IFN1cnJlbmRlclwiLFxuXHRcdFx0Y29udGVudDogXCJDYW5jZWxsYXRpb24gb2YgY29udHJhY3QgYWZ0ZXIgdGhlIGNvb2xpbmctb2ZmIHBlcmlvZCwgdGhlIGNvbXBhbnkgd2lsbCByZWZ1bmQgdGhlIHBvbGljeSBjYXNoIHZhbHVlXCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwiUG9saWN5IE93bmVyXCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIkJlZm9yZSBQb2xpY3kgRXhwaXJlc1wiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIlBvbGljeVwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3JtXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIklEIGNhcmQgb2YgUG9saWN5IE93bmVyXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJhbmsgaW5mb3JtYXRpb25cIixcblx0XHRcdH1dLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCJQb2xpY3kgU3VycmVuZGVyIHdpdGhpbiBjb29sIG9mZiBwZXJpb2RcIixcblx0XHRcdGNvbnRlbnQ6IFwiSWYgdGhlIGNvbnRyYWN0IGlzIGNhbmNlbGxlZCB3aXRoaW4gdGhlIGNvb2xpbmctb2ZmIHBlcmlvZCwgdGhlIGNvbXBhbnkgd2lsbCByZWZ1bmQgdGhlIGVudGlyZSBwcmVtaXVtIHdpdGhvdXQgaW50ZXJlc3QuXCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwiUG9saWN5IE93bmVyXCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIkJlZm9yZSBjb29sIG9mZiBwZXJpb2RcIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJQb2xpY3lcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9ybVwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJJRCBjYXJkIG9mIFBvbGljeSBPd25lclwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJCYW5rIGluZm9ybWF0aW9uXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkZpcnN0IHByZW1pdW0gcmVjZWlwdFwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwiQ2hhbmdlIG9mIEN1c3RvbWVyIEluZm9ybWF0aW9uXCIsXG5cdFx0XHRwcm9qZWN0VHlwZTogMSxcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlXCIsXG5cdFx0XHRxdWVyeToge1xuXHRcdFx0XHRxOiBcIm00MlwiXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogXCJDaGFuZ2Ugb2YgUG9saWN5IE93bmVyLCBJbnN1cmVkIGFuZCBCZW5lZmljaWFyeSBpbmZvcm1hdFwiLFxuXHRcdFx0YXBwbGljYW50OiBcIlBvbGljeSBPd25lclwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCJBbnl0aW1lXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9ybVwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJPdGhlciBuZWNlc3NhcnkgcHJvdmluZyBkb2N1bWVudHNcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIkNoYW5nZSBvZiBDb250YWN0IEluZm9ybWF0aW9uXCIsXG5cdFx0XHRwcm9qZWN0VHlwZTogMSxcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlXCIsXG5cdFx0XHRxdWVyeToge1xuXHRcdFx0XHRxOiBcIm00M1wiXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogXCJDaGFuZ2Ugb2YgYWRkcmVzcywgY29udGFjdCBuby5cIixcblx0XHRcdGFwcGxpY2FudDogXCJQb2xpY3kgT3duZXJcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwiQW55dGltZVwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvcm1cIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSUQgY2FyZCBvZiBQb2xpY3kgT3duZXJcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIkNoYW5nZSBvZiBQYXltZW50IEluZm9ybWF0aW9uXCIsXG5cdFx0XHRjb250ZW50OiBcIkNoYW5nZSBvZiBtb2RlIG9mIHBheW1lbnQgb3IgcGF5ZW1lbnQgYWNjb3VudFwiLFxuXHRcdFx0YXBwbGljYW50OiBcIlBvbGljeSBPd25lclwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCJCZWZvcmUgdGhlIGV4cGlyYXRpb24gb2YgcG9saWN5IHBheW1lbnRcIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3JtXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIlBvbGljeVwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlQ29udGFjdDoge1xuXHRcdHBob25lOiBcIkNvbnRhY3QgTnVtYmVyXCIsXG5cdFx0YWRkcmVzczogXCJDb3JyZXNwb25kZW5jZSBBZGRyZXNzXCIsXG5cdFx0ZW1haWw6IFwiRS1NYWlsXCIsXG5cdFx0Y2hlY2tUaXBzOiBcIkkgZG8gbm90IGFncmVlIHRvIHJlY2VpdmUgcHJvbW90aW9uYWwgaW5mb3JtYXRpb25cIixcblx0XHRzdWJtaXQ6IFwiQ29uZmlybVwiLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwiUGxlYXNlIGVudGVyIHRoZSBjb2xsZWN0IG1vYmlsZSBub1wiLFxuXHRcdFx0ZTI6IFwi6KuL5aGr5a+r6IGv57mr5Zyw5Z2AXCIsXG5cdFx0XHRlMzogXCJQbGVhc2UgZW50ZXIgdGhlIGNvbGxlY3QgRS1tYWlsXCJcblx0XHR9LFxuXHRcdHN1Y2Nlc3M6IFwiU3VjY2Vzc1wiLFxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VJbmZvcm1hdGlvbjoge1xuXHRcdHRpdGxlOiBcIkNoYW5nZSBvZiBDdXN0b21lciBJbmZvcm1hdGlvblwiLFxuXHRcdG93bmVyOiBcIlBvbGljeSBPd25lclwiLFxuXHRcdGluc3VyZWQ6IFwiSW5zdXJlZFwiLFxuXHRcdG9iajogXCJTZWxlY3QgZm9yIGNoYW5nZVwiLFxuXHRcdG5hbWU6IFwiTmFtZVwiLFxuXHRcdHNleDogXCJTZXhcIixcblx0XHRiaXJ0aDogXCJEYXRlIG9mIEJpcnRoXCIsXG5cdFx0dHlwZTogXCJUeXBlIG9mIElkZW50aWZpY2F0aW9uIERvY3VtZW50XCIsXG5cdFx0Tk86IFwiSUQgTm8uXCIsXG5cdFx0dmFsaWRpdHlQZXJpb2Q6IFwiSUQgVmFsaWRhdGlvbiBEYXRlXCIsXG5cdFx0bmF0aW9uYWxpdHk6IFwiTmF0aW9uYWxpdHlcIixcblx0XHRlbXBsb3llcjogXCJFbXBsb3llclwiLFxuXHRcdG1hcml0YWxTdGF0dXM6IFwiTWFyaXRhbCBTdGF0dXNcIixcblx0XHRzdWJtaXQ6IFwiQ29uZmlybVwiLFxuXHRcdHVwbG9hZDogXCJVcGxvYWQgQXR0YWNobWVudFwiLFxuXHRcdG1vZGlmeVRpcHMxOiBcIklmIHlvdSBuZWVkIHRvIG1vZGlmeSBwbGVhc2VcIixcblx0XHRtb2RpZnlUaXBzMjogXCJjb250YWN0IGN1c3RvbWVyIHNlcnZpY2VcIixcblx0XHRzdWNjZXNzOiBcIlN1Y2Nlc3NcIixcblx0fSxcblx0Y29udGFjdFVzOiB7XG5cdFx0c2VydmljZToge1xuXHRcdFx0Y2VudGVyOiB7XG5cdFx0XHRcdHRpdGxlOiBcIkN1c3RvbWVyIFNlcnZpY2UgQ2VudGVyXCIsXG5cdFx0XHRcdGFkZHJlc3M6IFwiQWRkcmVzczogVW5pdCAzNTAxIC0gNyAmIDE0LCBGbG9vciAzNSwgVGhlIEdhdGV3YXkgVG93ZXIgNSwgVHNpbSBTaGEgVHN1aSwgSG9uZyBLb25nXCIsXG5cdFx0XHRcdHRpbWU6IFwiU2VydmljZSBIb3Vy77yaOSBhLm0uICAtIDYgcC5tLiAsIE1vbmRheSB0byBGcmlkYXlcIixcblx0XHRcdH0sXG5cdFx0XHRob3RsaW5lOiB7XG5cdFx0XHRcdHRpdGxlOiBcIkN1c3RvbWVyIFNlcnZpY2UgSG90bGluZVwiLFxuXHRcdFx0XHRoazogXCJIb25nIEtvbmfvvJooODUyKSAgMjk4MyA4ODY2XCIsXG5cdFx0XHRcdGNuOiBcIk1haW5sYW5k77yaKDg2KSA0MDA3OCA5NTUxMVwiLFxuXHRcdFx0XHR0aW1lOiBcIlNlcnZpY2UgSG91cu+8mjkgYS5tLiAgLSA2IHAubS4gLCBNb25kYXkgdG8gRnJpZGF5XCJcblx0XHRcdH0sXG5cdFx0XHRtYWlsOiB7XG5cdFx0XHRcdHRpdGxlOiBcIkN1c3RvbWVyIFNlcnZpY2UgRW1haWxcIixcblx0XHRcdFx0bWFpbDogXCJjc0BwaW5nYW4uY29tLmhrXCJcblx0XHRcdH1cblx0XHR9LFxuXHRcdHB1bGJpYzoge1xuXHRcdFx0dGl0bGU6IFwiT2ZmaWNpYWwgV2VDaGF0IEFjY291bnRcIixcblx0XHRcdG0xOiBcIkxvZ2luIHRvIHRoZSBcXFwiV2VDaGF0XFxcIiBBUFAsIHByZXNzIHRoZSBcXFwiK1xcXCIgYnV0dG9uIGluIHRoZSB1cHBlciByaWdodCBjb3JuZXIgYW5kIHNlbGVjdCBcXFwiQWRkIEZyaWVuZFxcXCIsIHNlbGVjdCBcXFwiUHVibGljIEFjY291bnRcXFwiIEVudGVyIGFuZCBzZWFyY2ggXFxcIlBpbmcgQW4gTGlmZSBIb25nIEtvbmdcXFwiXCIsXG5cdFx0XHRtMjogXCJMb2cgaW4gdG8gdGhlIFdlQ2hhdCBBUFAsIHByZXNzIHRoZSBcXFwiK1xcXCIgYnV0dG9uIGluIHRoZSB1cHBlciByaWdodCBjb3JuZXIgYW5kIHNlbGVjdCBcXFwiU2NhblxcXCIgdG8gc2NhbiB0aGUgUVIgY29kZSBiZWxvd++8iFFSIENvZGUgaGVyZe+8iVwiXG5cdFx0fSxcblx0XHRxcmNvZGU6IHtcblx0XHRcdHRpdGxlOiBcIk9mZmljaWFsIFdlQ2hhdCBBY2NvdW50XCJcblx0XHR9XG5cdH0sXG5cdGN1c3RvbVNlcnZpY2U6IHtcblx0XHRuYW1lOiBcIkN1c3RvbWVyIHNlcnZpY2VcIixcblx0XHRtZW51MTogXCJDb250YWN0IFVzXCIsXG5cdFx0bWVudTI6IFwiT25saW5lIFByZW1pdW0gUGF5bWVudFwiLFxuXHRcdG1lbnUzOiBcIlBvbGljeSBJbnF1aXJ5XCIsXG5cdFx0bWVudTQ6IFwiUG9saWN5IENoYW5nZVwiLFxuXHRcdG1lbnU0MTogXCJQb2xpY3kgQ2hhbmdlIEd1aWRlbGluZVwiLFxuXHRcdG1lbnU0MjogXCJDaGFuZ2Ugb2YgQ29udGFjdCBJbmZvcm1hdGlvblwiLFxuXHRcdG1lbnU0MzogXCJDaGFuZ2Ugb2YgQ3VzdG9tZXIgSW5mb3JtYXRpb25cIixcblx0XHRtZW51NTogXCJDbGFpbXNcIixcblx0XHRtZW51NjogXCJFLXJlc2VydmF0aW9uXCIsXG5cdFx0bWVudTc6IFwiQ29tcGxhaW50c1wiLFxuXHRcdG1lbnU4OiBcIlVzZWZ1bCBGb3Jtc1wiLFxuXHRcdGluc3VyYW5jZVF1ZXJ5OiB7XG5cdFx0XHRtb2RpZnk6IFwibW9kaWZ5XCIsXG5cblx0XHRcdEluc3VyYW50TnVtYmVyOiBcIlBvbGljeSBOdW1iZXJcIixcblx0XHRcdEluc3VyYW50OiBcIkluc3VyZWRcIixcblx0XHRcdEluc3VyYW50TmFtZTogXCJQb2xpY3kgVHlwZVwiLFxuXHRcdFx0SW5zdXJhbnRBbW91bnQ6IFwiU3VtIEluc3VyZWRcIixcblx0XHRcdGVmZmVjdGl2ZURhdGU6IFwiUHJlbWl1bSBEdWUgRGF0ZVwiLFxuXHRcdFx0cGVyaW9kOiBcIlByb3RlY3Rpb24gRHVyYXRpb25cIixcblxuXG5cdFx0XHR0MlRpdGxlOiBcIlBvbGljeSBJbmZvcm1hdGlvblwiLFxuXHRcdFx0dDJuMTogXCJQb2xpY3kgVHlwZVwiLFxuXHRcdFx0dDJuMjogXCJTdW0gSW5zdXJlZFwiLFxuXHRcdFx0dDJuMzogXCJFZmZlY3RpdmUgRGF0ZVwiLFxuXHRcdFx0dDJuNDogXCJQcm90ZWN0aW9uIER1cmF0aW9uXCIsXG5cdFx0XHR0Mm41OiBcIk5hbWUgb2YgSW5zdXJlZO+8iENoaW5lc2XvvIlcIixcblx0XHRcdHQybjY6IFwiTmFtZSBvZiBJbnN1cmVkIChFbmdsaXNoKSBcIixcblx0XHRcdHQybjc6IFwiRGF0ZSBvZiBCaXJ0aFwiLFxuXHRcdFx0dDJuODogXCJJRCBOb1wiLFxuXG5cblx0XHRcdHQzVGl0bGU6IFwiQ3VzdG9tZXIgSW5mb3JtYXRpb25cIixcblx0XHRcdHQzbjE6IFwiTmFtZSBvZiBQb2xpY3kgT3duZXLvvIhDaGluZXNl77yJXCIsXG5cdFx0XHR0M24yOiBcIk5hbWUgb2YgUG9saWN5IE93bmVy77yIRW5nbGlzaO+8iVwiLFxuXHRcdFx0dDNuMzogXCJEYXRlIG9mIEJpcnRoXCIsXG5cdFx0XHR0M240OiBcIklEIE5vXCIsXG5cdFx0XHR0M241OiBcIlBvc3RhbCBBZGRyZXNzXCIsXG5cdFx0XHR0M242OiBcIlJlc2lkZW50aWFsIEFkZHJlc3NcIixcblx0XHRcdHQzbjc6IFwiTW9iaWxlIE5vLlwiLFxuXHRcdFx0dDNuODogXCJFbWFpbFwiLFxuXG5cdFx0XHR0NFRpdGxlOiBcIkJlbmVmaWNpYXJ5IGluZm9ybWF0aW9uXCIsXG5cdFx0XHR0NE5hbWVDbjogXCJOYW1l77yIQ2hpbmVzZe+8iVwiLFxuXHRcdFx0dDROYW1lRW46IFwiTmFtZSAoRW5nbGlzaClcIixcblx0XHRcdHQ0UmVsYXRpb246IFwiUmVsYXRpb25zaGlwIHdpdGggSW5zdXJlZFwiLFxuXHRcdFx0dDRBbGxvY2F0aW9uOiBcIkRpc3RyaWJ1dGlvbiByYXRpb1wiLFxuXG5cdFx0XHR0NVRpdGxlOiBcIlBheW1lbnQgaW5mb3JtYXRpb25cIixcblx0XHRcdHQ1UGF5bWVudFBlcmlvZDogXCJQYXltZW50IHBlcmlvZFwiLFxuXHRcdFx0dDVQYXltZW50TWV0aG9kOiBcIk1vZGUgb2YgUGF5bWVudFwiLFxuXHRcdFx0dDVQYXltZW50Q3VycmVuY3k6IFwiQ3VycmVuY3lcIixcblx0XHRcdHQ1Q3VycmVudFByZW1pdW06IFwiQ3VycmVudCBwcmVtaXVtXCIsXG5cdFx0XHR0NVBheW1lbnRCYW5rOiBcIkJhbmtcIixcblx0XHRcdHQ1UGF5bWVudEFjY291bnQ6IFwiUGF5bWVudCBBY2NvdW50XCIsXG5cblx0XHRcdHQ2VGl0bGU6IFwiUGF5bWVudCBIaXN0b3J5XCIsXG5cdFx0XHR0NlBheW1lbnRQZXJpb2Q6IFwiSW5zdGFsbG1lbnRcIixcblx0XHRcdHQ2UGF5bWVudE1ldGhvZDogXCJNb2RlIG9mIFBheW1lbnRcIixcblx0XHRcdHQ2Q2xvc2luZ0RhdGU6IFwiUmVjZWl2ZWQgRGF0ZVwiLFxuXHRcdFx0dDZQYXltZW50QW1vdW50OiBcIkFtb3VudFwiLFxuXG5cdFx0XHRzaG93TW9yZTogXCJTaG93IEFsbCBQb2xpY2llc1wiLFxuXHRcdFx0bm9Qb2xpY3k6IFwiWW91IGhhdmVuJ3QgYm91Z2h0IGFueSBwb2xpY3ksIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgcGxlYXNlXCIsXG5cdFx0XHRjdXN0b21TZXJ2aWNlOiBcIiBjb250YWN0IGN1c3RvbWVyIHNlcnZpY2VcIixcblx0XHR9LFxuXHRcdHVuYXV0aDoge1xuXHRcdFx0dGlwczogXCJJZiB5b3UgaGF2ZSBhIHBpbmcgYW4gYWxsIGluIG9uZSBhY2NvdW50IGFjY291bnQsIGl0IGNhbiBoZWxwIHVzIHByb3ZpZGUgYmV0dGVyIHNlcnZpY2VzIGZvciB5b3VcIixcblx0XHRcdG9yOiBcIm9yXCIsXG5cdFx0XHRsb2dpbjogXCIgbG9naW5cIixcblx0XHRcdHJlZ2lzdGVyOiBcIiByZWdpc3RlclwiLFxuXHRcdFx0YmFzZUluZm9UaXA6IFwiWW91ciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBjYW4gaGVscCB1cyB0byBwcm92aWRlIHlvdSB3aXRoIGNvbXBsZXRlIHNlcnZpY2VzXCIsXG5cdFx0XHRpbmZvQnRuOiBcIiBHbyB0byBwZXJmZWN0aW9uXCJcblx0XHR9XG5cdH0sXG5cdHBhZ2luYXRpb246IHtcblx0XHRmaXJzdFBhZ2U6IFwiZmlyc3RcIixcblx0XHRuZXh0UGFnZTogXCJuZXh0XCIsXG5cdFx0Z290bzogXCJHbyB0b1wiLFxuXHRcdHBlcjogXCJwYWdlXCIsXG5cdFx0cGFnZTogXCJcIlxuXHR9LFxuXHRuZXdzRGV0YWlsOiB7XG5cdFx0YmFjazogXCJCYWNrXCIsXG5cdFx0cHVibGlzaEF0OiBcIlB1Ymxpc2ggdGltZVwiLFxuXHRcdHJlYWRlcnM6IFwiTnVtYmVyIG9mIHJlYWRlclwiLFxuXHRcdHBlcjogXCJcIlxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUExQkE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFGQTtBQVJBO0FBY0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBcENBO0FBMkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQWxCQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFQQTtBQWpIQTtBQStIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBbkJBO0FBZ0NBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBMUJBO0FBeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUExQkE7QUFxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUE3QkE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFuREE7QUE2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQWJBO0FBSEE7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFqQkE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQXRCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBUEE7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQXJDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFGQTtBQWhFQTtBQTBFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQUlBO0FBREE7QUFmQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFJQTtBQURBO0FBSUE7QUFEQTtBQWxCQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFkQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFkQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQVRBO0FBMUZBO0FBMEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFGQTtBQVpBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUF2QkE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQXREQTtBQXdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBckVBO0FBOEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBbHdCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/common/lang/en.js\n");
/***/ }),
/***/ "./src/common/lang/tc.js":
/*!*******************************!*\
!*** ./src/common/lang/tc.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = {\n message: {\n login: 'Login',\n Username: 'Username',\n Password: 'Password',\n Captcha: 'Captcha',\n Language: 'Language',\n zh: 'Chinese',\n en: 'English'\n },\n glbalTips: {\n sessionLost: \"為了更好的體驗,需要您登錄後再進行此操作\"\n },\n form: {\n datePicker: {\n datePlaceholder: \"请选择日期\"\n },\n modalUploadCard: {\n tit: \"請上傳證件資料\",\n front: \"證件正面\",\n back: \"證件反面\"\n }\n },\n nav: {\n loginData: {\n name: \"登入\",\n path: \"/login\",\n list: [{\n name: \"註冊\",\n path: \"/register\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"登入\",\n path: \"/login\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"修改密碼\",\n path: \"/password/reset\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"個人信息\",\n path: \"/infomation/improve\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"登出\",\n path: \"\",\n type: \"auth\",\n value: \"logout\"\n }]\n },\n navList: [{\n name: \"產品介紹\",\n path: \"/empty\",\n list: [{\n name: \"自願醫保計劃\",\n path: \"\",\n value: \"gotoVHIS\"\n }, {\n name: \"投資成份保險\",\n path: \"/product\"\n }]\n }, {\n name: \"客戶服務\",\n path: \"/custom/product\",\n list: [{\n name: \"客戶服務導航\",\n path: \"/custom/product\"\n }, {\n name: \"聯系我們\",\n path: \"/custom/service?q=m1\"\n }, {\n name: \"繳付保費\",\n path: \"/custom/service?q=m2\"\n }, {\n name: \"保單查詢\",\n path: \"/custom/service?q=m3\"\n }, {\n name: \"保單變更\",\n path: \"/custom/service?q=m41\"\n }, {\n name: \"理賠申請\",\n path: \"/custom/service?q=m5\"\n }, {\n name: \"預約服務\",\n path: \"/custom/service?q=m6\"\n }, {\n name: \"投訴受理\",\n path: \"/custom/service?q=m7\"\n }, {\n name: \"常用表格\",\n path: \"/custom/service?q=m8\"\n }]\n }, {\n name: \"關於我們\",\n path: \"/profile\",\n list: [{\n name: \"有關平安人壽香港\",\n path: \"/profile\"\n }, {\n name: \"公司活動\",\n path: \"/empty\"\n }, {\n name: \"新聞中心\",\n path: \"/news/list\"\n }, {\n name: \"企業社會責任\",\n path: \"/empty\"\n }, {\n name: \"獎項殊榮\",\n path: \"/empty\"\n }]\n }, {\n name: \"加入我們\",\n path: \"/empty\",\n list: [{\n name: \"企業文化\",\n path: \"/empty\"\n }, {\n name: \"事業發展機會\",\n path: \"/empty\"\n }]\n }]\n },\n footer: {\n hkPhone: \"香港号码\",\n cnPhone: \"内地号码\",\n aboutUs: \"關於我們\",\n companyIntroduction: \"集團介紹\",\n news: \"新聞資訊\",\n joinUs: \"加入我們\",\n helpCenter: \"幫助中心\",\n privacy: \"隱私政策\",\n terms: \"使用條款\",\n protocol: \"個人資料收集聲明\",\n map: \"網站地圖\",\n contactUs: \"聯絡我們\",\n contactInformation: \"聯繫方式\",\n service: \"服務網絡\",\n qrcode: \"社交媒體\",\n copyright: \"版權所有 © 中國平安保險(集團)股份有限公司未經許可不得復制、轉載或摘編,違者必究!\"\n },\n login: {\n title: \"平安一賬通\",\n loginType1: \"賬密登錄\",\n loginType2: \"動態密碼登录\",\n account: \"賬號\",\n accountPlaceholder: \"請輸入證件號/一賬通用戶名/手機號\",\n password: \"密碼\",\n passwordPlaceholder: \"輸入登錄密碼\",\n verifyPlaceholder: \"請輸入驗證碼\",\n agree: \"同意\",\n protocol: \"《平安一賬通會員服務協議》\",\n login: \"登入\",\n register: \"註冊\",\n forget: \"忘記密碼\",\n mobile: \"手機號\",\n mobilePlaceholder: \"手機號\",\n verifyCode: \"驗證碼\",\n verifyCodePlaceholder: \"驗證碼\",\n verifyCodeGet: \"獲取驗證碼\",\n tips: {\n e1: \"請輸入賬號信息\",\n e2: \"請輸入密碼\",\n e3: \"請輸入圖像驗證碼\",\n e4: \"請同意《平安一賬通會員服務協議》\",\n e5: \"賬號或密碼不正確\",\n oe0: \"請輸入正確的手機號\",\n oe1: \"請先獲取短信驗證碼\",\n oe2: \"請輸入圖片驗證碼\",\n oe3: \"請輸入短信驗證碼\",\n oe4: \"短信驗證碼不正確\"\n }\n },\n register: {\n mobileOptions: [{\n type: \"hk\",\n name: \"香港手機號\",\n placeHolder: \"請輸入8位手機號碼\",\n areaCode: \"+852\"\n }, {\n type: \"zh\",\n name: \"大陸手機號\",\n placeHolder: \"請輸入11位手機號碼\",\n areaCode: \"+86\"\n }],\n coutTips: \"{second}秒後重新獲取\",\n title: \"歡迎註冊\",\n title2: \"請設置新的密碼\",\n mobilePlaceholder: \"請輸入8位手機號碼\",\n verifyCodePlaceholder: \"請輸入驗證碼\",\n verifyCodeGet: \"獲取驗證碼\",\n agree: \"同意\",\n protocol: \"《平安一賬通會員服務協議》\",\n register: \"點擊註冊\",\n newPassword: \"新密碼\",\n newPasswordPlaceholder: \"請輸入新密碼\",\n newPasswordSure: \"確認密碼\",\n newPasswordSurePlaceholder: \"請再次輸入新密碼\",\n sure: \"確認\",\n tips: {\n e1: \"手機號不正確,請輸入正確的手機號\",\n e2: \"請同意《平安一賬通會員服務協議》\",\n e3: \"短信驗證碼不正確\",\n e4: \"請先獲取短信驗證碼\",\n e5: \"手機號已經被註冊,請使用其他手機號註冊或直接登錄\",\n e6: \"請輸入圖片驗證碼\",\n e7: \"密碼長度不能少於8位\",\n e8: \"密碼中必須包含數字、字符以及特殊號碼\",\n e9: \"兩次密碼不一致,請確認後重新輸入\",\n e10: \"驗證碼過期,請重新申請驗證碼\",\n e11: \"註冊失敗,請聯繫工作人員\",\n e12: \"註冊成功\"\n }\n },\n session: {\n sidExpire: \"長時間未操作,為了您賬戶的安全,請登錄後再操作\"\n },\n passwordCheck: {\n error1: \"密碼長度不少於8位\",\n error2: \"密碼中必須包含數字、字符以及特殊號碼\",\n error3: \"兩次密碼不一致,請確認後重新輸入\",\n error4: \"密碼修改失敗,請稍後再試,或撥打客服電話95511解決\",\n error5: \"舊密碼不正確,請重新輸入\",\n success: \"密碼修改成功\"\n },\n passwordReset: {\n oldPwd: \"舊密碼\",\n oldPwdPlaceholde: \"請輸入舊密碼\",\n cidExpire: \"長時間未操作,為了您賬戶的安全,請重新開始\",\n type1: {\n title: \"密碼找回\",\n t1: \"用戶輸入信息\",\n t1Placeholder: \"手機號/一賬通用戶名/證件號\",\n submit: \"確認\",\n error: \"您的手機號或證件號輸入錯誤,請核對后重新輸入\"\n },\n type2: {\n title: \"密碼找回\",\n t1: \"手機短信驗證碼\",\n t1Placeholder: \"請輸入驗證碼\",\n submit: \"確認\",\n error1: \"短信驗證碼輸入錯誤,請核對後重新輸入\",\n error2: \"短信驗證碼已經過期,請重新獲取驗證碼\",\n error3: \"短信驗證碼發放時間少於1分鐘,請稍後再試\"\n },\n type3: {\n title: \"密碼找回\",\n t1: \"核對身份證信息\",\n t1Placeholder: \"\",\n submit: \"確認\"\n },\n type4: {\n title: \"請設置新的密碼\",\n t1: \"新密碼\",\n t1Placeholder: \"請輸入新密碼\",\n t2: \"確認密碼\",\n t2Placeholder: \"請重新輸入新密碼\",\n submit: \"確認\"\n }\n },\n infomationImprove: {\n title: \"請完善您的信息\",\n t1: \"姓名\",\n t1c1: \"姓\",\n t1c2: \"名\",\n t1Placeholder: \"\",\n t2: \"性別\",\n t2Placeholder: \"\",\n t3: \"出生日期\",\n t3Placeholder: \"\",\n t4: \"證件類型\",\n t4Placeholder: \"\",\n t5: \"證件號碼\",\n t5Placeholder: \"\",\n submit: \"確認\",\n cancel: \"跳過\",\n candidates: {\n sex: [{\n name: \"男\",\n value: \"M\"\n }, {\n name: \"女\",\n value: \"F\"\n }],\n idType: [{\n name: \"身份證\",\n value: \"1\"\n }, {\n name: \"護照\",\n value: \"2\"\n }, {\n name: \"軍官證或士兵證\",\n value: \"3\"\n }, {\n name: \"港澳通行證/回鄉證或台胞證\",\n value: \"6\"\n }, {\n name: \"外國人永久居留身份證\",\n value: \"O\"\n }, {\n name: \"港澳台居民居住證\",\n value: \"V\"\n }, {\n name: \"台灣居民居住證\",\n value: \"W\"\n }, {\n name: \"其他\",\n value: \"0\"\n }]\n },\n successMsg: \"更新成功\",\n errorTips: {\n e1: \"請填寫姓名信息\",\n e2: \"請選擇性別\",\n e3: \"請選擇生日\",\n e4: \"請選擇證件類型\",\n e5: \"請填寫證件號碼\",\n e6: \"您填寫的證件號碼有誤\",\n e7: \"您填寫的信息有誤,請核實後重新提交\"\n }\n },\n index: {\n news: \"新聞資訊\",\n newMore: \"查看更多\",\n recommend: {\n t1: \"在線報價\",\n t2: \"客戶服務\",\n t3: \"產品介紹\",\n t4: \"最新消息\",\n item1: {\n btn: \"了解更多產品\",\n t1: \"為自己和家人尋找壹份保障\"\n },\n item2: {\n btn: \"立即預約\",\n t1: \"在線預約 專業服務\"\n },\n item3: {\n btn: \"客戶服務\",\n t1: \"專業客服為妳服務\",\n t2: \"想了解更多,可致電\",\n t3: \"95511\",\n t4: \"聯絡我們,或進入\"\n }\n }\n },\n complaintAcceptance: {\n name: \"姓名\",\n namePlaceholder: \"姓名\",\n contactType: \"聯絡方式\",\n email: \"電郵地址\",\n question: \"問題或意見\",\n questionPlaceHolder: \"(字數不超過500字)\",\n orderNo: \"保單編號\",\n orderNoPlaceHolder: \"如您為平安客戶,請提供保單編號\",\n contactTime: \"期望聯絡時間\",\n notice1: \"本表格所收集的個人資料根據「平安人壽香港個人資料收集聲明」處理及只會被用作於聯絡 閣下之用。然而所收集的個人資料未經您明確授權將不會轉移至「平安人壽香港個人資料收集聲明」列明以外之第三者機構。您可選擇不向我們提供所需的個人資料,惟這樣可能導致我們不能聯絡您。您亦可根據「平安人壽香港個人資料收集聲明」之權利查閱及更正個人資料。\",\n notice2: \"本人現確認明白並同意本人的個人資料根據中銀人壽個人資料收集聲明作以上述用途。\",\n contactTypes: [{\n name: '電話',\n value: 1,\n show: \"聯絡電話\",\n icon: \"mobile\"\n }, {\n name: '電郵',\n value: 2,\n show: \"電郵地址\",\n icon: \"email\"\n }],\n errorTips: {\n e1: \"請填寫該項內容\",\n e2: \"請填寫正確的聯繫方式\"\n },\n success: \"感謝您的寶貴意見\"\n },\n reservation: {\n name: \"姓名\",\n namePlaceholder: \"姓名\",\n contactType: \"聯絡方式\",\n contactTypeCadidates: [{\n name: \"電話\",\n value: 1\n }],\n contact: \"聯絡電話\",\n contactPlaceholder: \"香港號碼/內地號碼\",\n reservationType: \"預約類型\",\n reservationCandidates: [{\n name: \"投保諮詢\",\n value: \"投保諮詢\"\n }, {\n name: \"代辦保單變更\",\n value: \"代办保单变更\"\n }],\n reservationRemark: \"預約說明\",\n reservationRemarkPlaceholder: \"請簡單說明您想要咨詢的產品或業務\",\n hkClient: \"是否平安香港客戶\",\n yes: \"是\",\n no: \"否\",\n contactTime: \"期望聯絡時間\",\n notice1: \"本表格所收集的個人資料根據「平安人壽香港個人資料收集聲明」處理及只會被用作於聯絡 閣下之用。然而所收集的個人資料未經您明確授權將不會轉移至「平安人壽香港個人資料收集聲明」列明以外之第三者機構。您可選擇不向我們提供所需的個人資料,惟這樣可能導致我們不能聯絡您。您亦可根據「平安人壽香港個人資料收集聲明」之權利查閱及更正個人資料。\",\n notice2: \"本人現確認明白並同意本人的個人資料根據中銀人壽個人資料收集聲明作以上述用途。\",\n success: \"提交成功\",\n submitBtn: '确认',\n errorTips: {\n e1: \"請填寫該項內容\",\n e2: \"請填寫正確的聯繫方式\"\n }\n },\n paymentType: {\n menu1: \"親臨客服中心付款\",\n menu2: \"網銀付款\",\n menu3: \"電匯付款\",\n menu4: \"櫃員機付款\",\n menu5: \"「繳費靈」付款\",\n menu6: \"香港郵政局\"\n },\n product: {\n btnPosition: \"預約服務\",\n iconProblem: \"常見問題\",\n iconProcess: \"投保流程\",\n iconProduct: \"產品詳情\"\n },\n customProduct: {\n menu1: \"聯繫我們\",\n menu2: \"繳付保費\",\n menu3: \"保單查詢\",\n menu4: \"保單變更\",\n menu5: \"理賠申請\",\n menu6: \"預約服務\",\n menu7: \"投訴受理\",\n menu8: \"常用表格\"\n },\n commonForm: {\n head1: \"表格類型\",\n head2: \"表格名稱\",\n head3: \"使用說明\",\n head4: \"附件\",\n download: \"下載文檔\",\n form: [{\n type: \"繳費類\",\n list: [{\n name: \"「電子入賬服務」及銀行戶口<br>直接付款授權申請\",\n desc: \"申請設立「 電子入賬服務」 及銀行戶口<br>直接付款授權時須提供\",\n download: \"\"\n }, {\n name: \"信用卡戶口直接付款授權書\",\n desc: \"申請信用卡戶口直接付款授權時須提供\",\n download: \"\"\n }]\n }, {\n type: \"保單變更類\",\n list: [{\n name: \"保險合同解除申請書\",\n desc: \"退保、冷靜期退保業務適用\",\n download: \"\"\n }, {\n name: \"保險合同變更申請書( 保單貸款還款類)\",\n desc: \"保單貸款、還款業務適用\",\n download: \"\"\n }, {\n name: \"保險合同變更申請書( 保險合同計劃變更類)\",\n desc: \"加保、減保、新增附險、復效等業務適用\",\n download: \"\"\n }, {\n name: \"保險合同變更申請書( 客戶信息變更類)\",\n desc: \"基本資訊變更業務適用\",\n download: \"\"\n }, {\n name: \"保險合同變更申請書( 客戶權益變更類)\",\n desc: \"交費方式、自墊選擇權變更、補發等業務適用\",\n download: \"\"\n }, {\n name: \"授權委托書\",\n desc: \"委托他人代辦時須提供\",\n download: \"\"\n }, {\n name: \"稅收聲明\",\n desc: \"CRS要求\",\n download: \"\"\n }, {\n name: \"健康告知\",\n desc: \"須二次核保的業務須提供\",\n download: \"\"\n }]\n }, {\n type: \"理賠類\",\n list: [{\n name: \"理賠申請書\",\n desc: \"紙質申請的應備文件\",\n download: \"\"\n }]\n }]\n },\n policyChangeGuide: {\n notice: \"如需做其他保單變更\",\n noticeLink: \"聯繫客服\",\n head1: \"項目\",\n head2: \"具體內容\",\n head3: \"申請資格人\",\n head4: \"受理時間\",\n head5: \"應備材料\",\n download: \"下載文檔\",\n form: [{\n project: \"退保\",\n content: \"在冷靜期後解除合同,公司將退還保單現金價值或未滿期凈保費。(待產品精算確認)\",\n applicant: \"投保人\",\n receptionTime: \"保單效力終止前\",\n materialList: [{\n name: \"保險單\"\n }, {\n name: \"申請書\",\n type: 1\n }, {\n name: \"投保人有效身份證件\"\n }, {\n name: \"存折银行卡相关\"\n }]\n }, {\n project: \"冷靜期退保\",\n content: \"在冷靜期內提出解除合同,公司會無息退還全部保費\",\n applicant: \"投保人\",\n receptionTime: \"冷靜期結束前\",\n materialList: [{\n name: \"保險單\"\n }, {\n name: \"申請書\",\n type: 1\n }, {\n name: \"投保人有效身份證件\"\n }, {\n name: \"存折银行卡相关\"\n }, {\n name: \"首期保費發票\"\n }]\n }, {\n project: \"客戶資料變更\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m42\"\n },\n content: \"投保人、受保人、受益人的個人信息變更\",\n applicant: \"投保人\",\n receptionTime: \"不限\",\n materialList: [{\n name: \"申請書\",\n type: 1\n }, {\n name: \"必要的證明材料\"\n }]\n }, {\n project: \"聯系方式變更\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m43\"\n },\n content: \"地址、電話等信息的變更\",\n applicant: \"投保人\",\n receptionTime: \"不限\",\n materialList: [{\n name: \"申請書\",\n type: 1\n }, {\n name: \"投保人有效身份證件\"\n }]\n }, {\n project: \"交費方式變更\",\n content: \"更改保單的續期交費方式或交費賬號\",\n applicant: \"投保人\",\n receptionTime: \"保單交費期滿前\",\n materialList: [{\n name: \"申請書\",\n type: 1\n }, {\n name: \"保險單\"\n }]\n }]\n },\n policyChangeContact: {\n phone: \"聯繫電話\",\n address: \"聯繫地址\",\n email: \"電郵地址\",\n checkTips: \"本人不同意接收宣傳信息\",\n submit: \"確認修改\",\n errorTips: {\n e1: \"請填寫正確的聯繫電話\",\n e2: \"請填寫聯繫地址\",\n e3: \"請填寫正確的電郵地址\"\n },\n success: \"更新成功\"\n },\n policyChangeInformation: {\n title: \"客戶資料變更\",\n owner: \"投保人\",\n insured: \"受保人\",\n obj: \"變更對象\",\n name: \"姓名\",\n sex: \"性别\",\n birth: \"出生日期\",\n type: \"證件類型\",\n NO: \"證件號碼\",\n validityPeriod: \"證件有效期\",\n nationality: \"國籍\",\n employer: \"工作單位\",\n maritalStatus: \"婚姻狀況\",\n submit: \"確認修改\",\n upload: \"附件上傳\",\n modifyTips1: \"如需修改請\",\n modifyTips2: \"聯繫客服\",\n success: \"更新成功\"\n },\n contactUs: {\n service: {\n center: {\n title: \"客戶服務中心\",\n address: \"地址:香港尖沙嘴港威永金融大樓\",\n time: \"服務時間:星期壹至五9:00-18:00\"\n },\n hotline: {\n title: \"客戶服務熱線\",\n hk: \"香港號碼:(852)2983 8866\",\n cn: \"內地號碼:(86)40078 95511\",\n time: \"服務時間:星期壹至五9:00-18:00\"\n },\n mail: {\n title: \"客戶服務電郵\",\n mail: \"cs@pingan.com.hk\"\n }\n },\n pulbic: {\n title: \"微信公眾號\",\n m1: \"登陸「微信」APP, 按右上角的「+」按鈕並選擇「添加朋友」,選擇「公眾號」 輸入並搜索「平安人壽香港」\",\n m2: \"登陸「微信」APP, 按右上角的「+」按鈕並選擇「掃壹掃」掃描下方二維碼(放置二維碼)\"\n },\n qrcode: {\n title: \"官方公眾號\"\n }\n },\n customService: {\n name: \"客戶服務\",\n menu1: \"聯繫我們\",\n menu2: \"繳付保費\",\n menu3: \"保單查詢\",\n menu4: \"保單變更\",\n menu41: \"保單變更指引\",\n menu42: \"聯系方式變更\",\n menu43: \"客戶資料變更\",\n menu5: \"理賠申請\",\n menu6: \"預約服務\",\n menu7: \"投訴受理\",\n menu8: \"常用表格\",\n insuranceQuery: {\n modify: \"修改\",\n InsurantNumber: \"保單號碼\",\n Insurant: \"受保人\",\n InsurantName: \"險種名稱\",\n InsurantAmount: \"保額\",\n effectiveDate: \"保費到期日\",\n period: \"保障年期\",\n t2Title: \"保單信息\",\n t2n1: \"險種名稱\",\n t2n2: \"保額\",\n t2n3: \"生效日期\",\n t2n4: \"保障年期\",\n t2n5: \"受保人姓名(中文)\",\n t2n6: \"受保人姓名(英文)\",\n t2n7: \"出生日期\",\n t2n8: \"證件號碼\",\n t3Title: \"客戶資料\",\n t3n1: \"投保人姓名(中文)\",\n t3n2: \"投保人姓名(英文)\",\n t3n3: \"出生日期\",\n t3n4: \"證件號碼\",\n t3n5: \"聯繫地址\",\n t3n6: \"居住地址\",\n t3n7: \"手提電話\",\n t3n8: \"電子郵箱\",\n t4Title: \"受益人資料\",\n // t4BeneficiaryInformation\n t4NameCn: \"姓名(中文)\",\n t4NameEn: \"姓名(英文)\",\n t4Relation: \"與受保人關係\",\n t4Allocation: \"分配比例\",\n t5Title: \"繳費資料\",\n t5PaymentPeriod: \"續費年期\",\n t5PaymentMethod: \"繳費方式\",\n t5PaymentCurrency: \"繳費幣種\",\n t5CurrentPremium: \"當期保費\",\n t5PaymentBank: \"繳費銀行\",\n t5PaymentAccount: \"繳費帳號\",\n t6Title: \"繳費記錄\",\n t6PaymentPeriod: \"繳費期\",\n t6PaymentMethod: \"繳費方式\",\n t6ClosingDate: \"實收日期\",\n t6PaymentAmount: \"繳費金額\",\n showMore: \"顯示所有保單\",\n noPolicy: \"您還未購買保單,如有疑問請\",\n customService: \"聯繫客服\"\n },\n unauth: {\n tips: \"如您有平安一賬通賬戶,可幫助我們更好地為您提供服務\",\n or: \"或\",\n login: \"登錄\",\n register: \"註冊\",\n baseInfoTip: \"您的完整信息可幫助我們為你提供完整服務\",\n infoBtn: \"前往完善\"\n }\n },\n pagination: {\n firstPage: \"第一頁\",\n nextPage: \"下一頁\",\n goto: \"跳轉\",\n per: \"第\",\n page: \"頁\"\n },\n newsDetail: {\n back: \"回到列表頁\",\n publishAt: \"發佈時間\",\n readers: \"閱讀人數\",\n per: \"人\"\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvdGMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvdGMuanM/ZDNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAnTG9naW4nLFxuXHRcdFVzZXJuYW1lOiAnVXNlcm5hbWUnLFxuXHRcdFBhc3N3b3JkOiAnUGFzc3dvcmQnLFxuXHRcdENhcHRjaGE6ICdDYXB0Y2hhJyxcblx0XHRMYW5ndWFnZTogJ0xhbmd1YWdlJyxcblx0XHR6aDogJ0NoaW5lc2UnLFxuXHRcdGVuOiAnRW5nbGlzaCdcblx0fSxcblx0Z2xiYWxUaXBzOiB7XG5cdFx0c2Vzc2lvbkxvc3Q6IFwi54K65LqG5pu05aW955qE6auU6amX77yM6ZyA6KaB5oKo55m76YyE5b6M5YaN6YCy6KGM5q2k5pON5L2cXCJcblx0fSxcblx0Zm9ybToge1xuXHRcdGRhdGVQaWNrZXI6IHtcblx0XHRcdGRhdGVQbGFjZWhvbGRlcjogXCLor7fpgInmi6nml6XmnJ9cIlxuXHRcdH0sXG5cdFx0bW9kYWxVcGxvYWRDYXJkOiB7XG5cdFx0XHR0aXQ6IFwi6KuL5LiK5YKz6K2J5Lu26LOH5paZXCIsXG5cdFx0XHRmcm9udDogXCLorYnku7bmraPpnaJcIixcblx0XHRcdGJhY2s6IFwi6K2J5Lu25Y+N6Z2iXCIsXG5cdFx0fVxuXHR9LFxuXHRuYXY6IHtcblx0XHRsb2dpbkRhdGE6IHtcblx0XHRcdG5hbWU6IFwi55m75YWlXCIsXG5cdFx0XHRwYXRoOiBcIi9sb2dpblwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLoqLvlhopcIixcblx0XHRcdFx0cGF0aDogXCIvcmVnaXN0ZXJcIixcblx0XHRcdFx0dHlwZTogXCJub0F1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLnmbvlhaVcIixcblx0XHRcdFx0cGF0aDogXCIvbG9naW5cIixcblx0XHRcdFx0dHlwZTogXCJub0F1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5L+u5pS55a+G56K8XCIsXG5cdFx0XHRcdHBhdGg6IFwiL3Bhc3N3b3JkL3Jlc2V0XCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlgIvkurrkv6Hmga9cIixcblx0XHRcdFx0cGF0aDogXCIvaW5mb21hdGlvbi9pbXByb3ZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLnmbvlh7pcIixcblx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0dHlwZTogXCJhdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcImxvZ291dFwiXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHRuYXZMaXN0OiBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi55Si5ZOB5LuL57S5XCIsXG5cdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCIsXG5cdFx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdFx0bmFtZTogXCLoh6rpoZjphqvkv53oqIjlioNcIixcblx0XHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcImdvdG9WSElTXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwi5oqV6LOH5oiQ5Lu95L+d6ZqqXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWuouaItuacjeWLmVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLlrqLmiLbmnI3li5nlsI7oiKpcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9wcm9kdWN0XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi6IGv57O75oiR5YCRXCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0xXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi57mz5LuY5L+d6LK7XCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0yXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+d5Zau5p+l6KmiXCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0zXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+d5Zau6K6K5pu0XCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW00MVwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIueQhuizoOeUs+iri1wiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tNVwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIumgkOe0hOacjeWLmVwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tNlwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuaKleiotOWPl+eQhlwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tN1wiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuW4uOeUqOihqOagvFwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tOFwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLpl5zmlrzmiJHlgJFcIixcblx0XHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdG5hbWU6IFwi5pyJ6Zec5bmz5a6J5Lq65aO96aaZ5rivXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIuWFrOWPuOa0u+WLlVwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdG5hbWU6IFwi5paw6IGe5Lit5b+DXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvbmV3cy9saXN0XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwi5LyB5qWt56S+5pyD6LKs5Lu7XCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCLnjY7poIXmrormpq5cIixcblx0XHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWKoOWFpeaIkeWAkVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdG5hbWU6IFwi5LyB5qWt5paH5YyWXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCLkuovmpa3nmbzlsZXmqZ/mnINcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdF1cblx0XHRcdH1cblx0XHRdXG5cdH0sXG5cdGZvb3Rlcjoge1xuXHRcdGhrUGhvbmU6IFwi6aaZ5riv5Y+356CBXCIsXG5cdFx0Y25QaG9uZTogXCLlhoXlnLDlj7fnoIFcIixcblx0XHRhYm91dFVzOiBcIumXnOaWvOaIkeWAkVwiLFxuXHRcdGNvbXBhbnlJbnRyb2R1Y3Rpb246IFwi6ZuG5ZyY5LuL57S5XCIsXG5cdFx0bmV3czogXCLmlrDogZ7os4foqIpcIixcblx0XHRqb2luVXM6IFwi5Yqg5YWl5oiR5YCRXCIsXG5cdFx0aGVscENlbnRlcjogXCLluavliqnkuK3lv4NcIixcblx0XHRwcml2YWN5OiBcIumaseengeaUv+etllwiLFxuXHRcdHRlcm1zOiBcIuS9v+eUqOaineasvlwiLFxuXHRcdHByb3RvY29sOiBcIuWAi+S6uuizh+aWmeaUtumbhuiBsuaYjlwiLFxuXHRcdG1hcDogXCLntrLnq5nlnLDlnJZcIixcblx0XHRjb250YWN0VXM6IFwi6IGv57Wh5oiR5YCRXCIsXG5cdFx0Y29udGFjdEluZm9ybWF0aW9uOiBcIuiBr+e5q+aWueW8j1wiLFxuXHRcdHNlcnZpY2U6IFwi5pyN5YuZ57ay57WhXCIsXG5cdFx0cXJjb2RlOiBcIuekvuS6pOWqkumrlFwiLFxuXHRcdGNvcHlyaWdodDogXCLniYjmrIrmiYDmnIkgwqkg5Lit5ZyL5bmz5a6J5L+d6Zqq77yI6ZuG5ZyY77yJ6IKh5Lu95pyJ6ZmQ5YWs5Y+45pyq57aT6Kix5Y+v5LiN5b6X5b6p5Yi244CB6L2J6LyJ5oiW5pGY57eo77yM6YGV6ICF5b+F56m2IVwiXG5cdH0sXG5cdGxvZ2luOiB7XG5cdFx0dGl0bGU6IFwi5bmz5a6J5LiA6LOs6YCaXCIsXG5cdFx0bG9naW5UeXBlMTogXCLos6zlr4bnmbvpjIRcIixcblx0XHRsb2dpblR5cGUyOiBcIuWLleaFi+WvhueivOeZu+W9lVwiLFxuXHRcdGFjY291bnQ6IFwi6LOs6JmfXCIsXG5cdFx0YWNjb3VudFBsYWNlaG9sZGVyOiBcIuiri+i8uOWFpeitieS7tuiZny/kuIDos6zpgJrnlKjmiLblkI0v5omL5qmf6JmfXCIsXG5cdFx0cGFzc3dvcmQ6IFwi5a+G56K8XCIsXG5cdFx0cGFzc3dvcmRQbGFjZWhvbGRlcjogXCLovLjlhaXnmbvpjITlr4bnorxcIixcblx0XHR2ZXJpZnlQbGFjZWhvbGRlcjogXCLoq4vovLjlhaXpqZforYnnorxcIixcblx0XHRhZ3JlZTogXCLlkIzmhI9cIixcblx0XHRwcm90b2NvbDogXCLjgIrlubPlronkuIDos6zpgJrmnIPlk6HmnI3li5nljZTorbDjgItcIixcblx0XHRsb2dpbjogXCLnmbvlhaVcIixcblx0XHRyZWdpc3RlcjogXCLoqLvlhopcIixcblx0XHRmb3JnZXQ6IFwi5b+Y6KiY5a+G56K8XCIsXG5cdFx0bW9iaWxlOiBcIuaJi+apn+iZn1wiLFxuXHRcdG1vYmlsZVBsYWNlaG9sZGVyOiBcIuaJi+apn+iZn1wiLFxuXHRcdHZlcmlmeUNvZGU6IFwi6amX6K2J56K8XCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIumpl+itieeivFwiLFxuXHRcdHZlcmlmeUNvZGVHZXQ6IFwi542y5Y+W6amX6K2J56K8XCIsXG5cdFx0dGlwczoge1xuXHRcdFx0ZTE6IFwi6KuL6Ly45YWl6LOs6Jmf5L+h5oGvXCIsXG5cdFx0XHRlMjogXCLoq4vovLjlhaXlr4bnorxcIixcblx0XHRcdGUzOiBcIuiri+i8uOWFpeWcluWDj+mpl+itieeivFwiLFxuXHRcdFx0ZTQ6IFwi6KuL5ZCM5oSP44CK5bmz5a6J5LiA6LOs6YCa5pyD5ZOh5pyN5YuZ5Y2U6K2w44CLXCIsXG5cdFx0XHRlNTogXCLos6zomZ/miJblr4bnorzkuI3mraPnorpcIixcblx0XHRcdG9lMDogXCLoq4vovLjlhaXmraPnorrnmoTmiYvmqZ/omZ9cIixcblx0XHRcdG9lMTogXCLoq4vlhYjnjbLlj5bnn63kv6HpqZforYnnorxcIixcblx0XHRcdG9lMjogXCLoq4vovLjlhaXlnJbniYfpqZforYnnorxcIixcblx0XHRcdG9lMzogXCLoq4vovLjlhaXnn63kv6HpqZforYnnorxcIixcblx0XHRcdG9lNDogXCLnn63kv6HpqZforYnnorzkuI3mraPnorpcIixcblx0XHR9LFxuXHR9LFxuXHRyZWdpc3Rlcjoge1xuXHRcdG1vYmlsZU9wdGlvbnM6IFt7XG5cdFx0XHR0eXBlOiBcImhrXCIsXG5cdFx0XHRuYW1lOiBcIummmea4r+aJi+apn+iZn1wiLFxuXHRcdFx0cGxhY2VIb2xkZXI6IFwi6KuL6Ly45YWlOOS9jeaJi+apn+iZn+eivFwiLFxuXHRcdFx0YXJlYUNvZGU6IFwiKzg1MlwiXG5cdFx0fSwge1xuXHRcdFx0dHlwZTogXCJ6aFwiLFxuXHRcdFx0bmFtZTogXCLlpKfpmbjmiYvmqZ/omZ9cIixcblx0XHRcdHBsYWNlSG9sZGVyOiBcIuiri+i8uOWFpTEx5L2N5omL5qmf6Jmf56K8XCIsXG5cdFx0XHRhcmVhQ29kZTogXCIrODZcIlxuXHRcdH1dLFxuXHRcdGNvdXRUaXBzOiBcIntzZWNvbmR956eS5b6M6YeN5paw542y5Y+WXCIsXG5cdFx0dGl0bGU6IFwi5q2h6L+O6Ki75YaKXCIsXG5cdFx0dGl0bGUyOiBcIuiri+ioree9ruaWsOeahOWvhueivFwiLFxuXHRcdG1vYmlsZVBsYWNlaG9sZGVyOiBcIuiri+i8uOWFpTjkvY3miYvmqZ/omZ/norxcIixcblx0XHR2ZXJpZnlDb2RlUGxhY2Vob2xkZXI6IFwi6KuL6Ly45YWl6amX6K2J56K8XCIsXG5cdFx0dmVyaWZ5Q29kZUdldDogXCLnjbLlj5bpqZforYnnorxcIixcblx0XHRhZ3JlZTogXCLlkIzmhI9cIixcblx0XHRwcm90b2NvbDogXCLjgIrlubPlronkuIDos6zpgJrmnIPlk6HmnI3li5nljZTorbDjgItcIixcblx0XHRyZWdpc3RlcjogXCLpu57mk4roqLvlhopcIixcblx0XHRuZXdQYXNzd29yZDogXCLmlrDlr4bnorxcIixcblx0XHRuZXdQYXNzd29yZFBsYWNlaG9sZGVyOiBcIuiri+i8uOWFpeaWsOWvhueivFwiLFxuXHRcdG5ld1Bhc3N3b3JkU3VyZTogXCLnorroqo3lr4bnorxcIixcblx0XHRuZXdQYXNzd29yZFN1cmVQbGFjZWhvbGRlcjogXCLoq4vlho3mrKHovLjlhaXmlrDlr4bnorxcIixcblx0XHRzdXJlOiBcIueiuuiqjVwiLFxuXHRcdHRpcHM6IHtcblx0XHRcdGUxOiBcIuaJi+apn+iZn+S4jeato+eiuu+8jOiri+i8uOWFpeato+eiuueahOaJi+apn+iZn1wiLFxuXHRcdFx0ZTI6IFwi6KuL5ZCM5oSP44CK5bmz5a6J5LiA6LOs6YCa5pyD5ZOh5pyN5YuZ5Y2U6K2w44CLXCIsXG5cdFx0XHRlMzogXCLnn63kv6HpqZforYnnorzkuI3mraPnorpcIixcblx0XHRcdGU0OiBcIuiri+WFiOeNsuWPluefreS/oempl+itieeivFwiLFxuXHRcdFx0ZTU6IFwi5omL5qmf6Jmf5bey57aT6KKr6Ki75YaK77yM6KuL5L2/55So5YW25LuW5omL5qmf6Jmf6Ki75YaK5oiW55u05o6l55m76YyEXCIsXG5cdFx0XHRlNjogXCLoq4vovLjlhaXlnJbniYfpqZforYnnorxcIixcblx0XHRcdGU3OiBcIuWvhueivOmVt+W6puS4jeiDveWwkeaWvDjkvY1cIixcblx0XHRcdGU4OiBcIuWvhueivOS4reW/hemgiOWMheWQq+aVuOWtl+OAgeWtl+espuS7peWPiueJueauiuiZn+eivFwiLFxuXHRcdFx0ZTk6IFwi5YWp5qyh5a+G56K85LiN5LiA6Ie077yM6KuL56K66KqN5b6M6YeN5paw6Ly45YWlXCIsXG5cdFx0XHRlMTA6IFwi6amX6K2J56K86YGO5pyf77yM6KuL6YeN5paw55Sz6KuL6amX6K2J56K8XCIsXG5cdFx0XHRlMTE6IFwi6Ki75YaK5aSx5pWX77yM6KuL6IGv57mr5bel5L2c5Lq65ZOhXCIsXG5cdFx0XHRlMTI6IFwi6Ki75YaK5oiQ5YqfXCIsXG5cdFx0fVxuXHR9LFxuXHRzZXNzaW9uOiB7XG5cdFx0c2lkRXhwaXJlOiBcIumVt+aZgumWk+acquaTjeS9nO+8jOeCuuS6huaCqOizrOaItueahOWuieWFqO+8jOiri+eZu+mMhOW+jOWGjeaTjeS9nFwiLFxuXHR9LFxuXHRwYXNzd29yZENoZWNrOiB7XG5cdFx0ZXJyb3IxOiBcIuWvhueivOmVt+W6puS4jeWwkeaWvDjkvY1cIixcblx0XHRlcnJvcjI6IFwi5a+G56K85Lit5b+F6aCI5YyF5ZCr5pW45a2X44CB5a2X56ym5Lul5Y+K54m55q6K6Jmf56K8XCIsXG5cdFx0ZXJyb3IzOiBcIuWFqeasoeWvhueivOS4jeS4gOiHtO+8jOiri+eiuuiqjeW+jOmHjeaWsOi8uOWFpVwiLFxuXHRcdGVycm9yNDogXCLlr4bnorzkv67mlLnlpLHmlZfvvIzoq4vnqI3lvozlho3oqabvvIzmiJbmkqXmiZPlrqLmnI3pm7voqbE5NTUxMeino+axulwiLFxuXHRcdGVycm9yNTogXCLoiIrlr4bnorzkuI3mraPnorrvvIzoq4vph43mlrDovLjlhaVcIixcblx0XHRzdWNjZXNzOiBcIuWvhueivOS/ruaUueaIkOWKn1wiXG5cdH0sXG5cdHBhc3N3b3JkUmVzZXQ6IHtcblx0XHRvbGRQd2Q6IFwi6IiK5a+G56K8XCIsXG5cdFx0b2xkUHdkUGxhY2Vob2xkZTogXCLoq4vovLjlhaXoiIrlr4bnorxcIixcblx0XHRjaWRFeHBpcmU6IFwi6ZW35pmC6ZaT5pyq5pON5L2c77yM54K65LqG5oKo6LOs5oi255qE5a6J5YWo77yM6KuL6YeN5paw6ZaL5aeLXCIsXG5cdFx0dHlwZTE6IHtcblx0XHRcdHRpdGxlOiBcIuWvhueivOaJvuWbnlwiLFxuXHRcdFx0dDE6IFwi55So5oi26Ly45YWl5L+h5oGvXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIuaJi+apn+iZny/kuIDos6zpgJrnlKjmiLblkI0v6K2J5Lu26JmfXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0XHRlcnJvcjogXCLmgqjnmoTmiYvmqZ/omZ/miJborYnku7bomZ/ovLjlhaXpjK/oqqTvvIzoq4vmoLjlsI3lkI7ph43mlrDovLjlhaVcIixcblx0XHR9LFxuXHRcdHR5cGUyOiB7XG5cdFx0XHR0aXRsZTogXCLlr4bnorzmib7lm55cIixcblx0XHRcdHQxOiBcIuaJi+apn+efreS/oempl+itieeivFwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCLoq4vovLjlhaXpqZforYnnorxcIixcblx0XHRcdHN1Ym1pdDogXCLnorroqo1cIixcblx0XHRcdGVycm9yMTogXCLnn63kv6HpqZforYnnorzovLjlhaXpjK/oqqTvvIzoq4vmoLjlsI3lvozph43mlrDovLjlhaVcIixcblx0XHRcdGVycm9yMjogXCLnn63kv6HpqZforYnnorzlt7LntpPpgY7mnJ/vvIzoq4vph43mlrDnjbLlj5bpqZforYnnorxcIixcblx0XHRcdGVycm9yMzogXCLnn63kv6HpqZforYnnorznmbzmlL7mmYLplpPlsJHmlrwx5YiG6ZCY77yM6KuL56iN5b6M5YaN6KmmXCIsXG5cdFx0fSxcblx0XHR0eXBlMzoge1xuXHRcdFx0dGl0bGU6IFwi5a+G56K85om+5ZueXCIsXG5cdFx0XHR0MTogXCLmoLjlsI3ouqvku73orYnkv6Hmga9cIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0fSxcblx0XHR0eXBlNDoge1xuXHRcdFx0dGl0bGU6IFwi6KuL6Kit572u5paw55qE5a+G56K8XCIsXG5cdFx0XHR0MTogXCLmlrDlr4bnorxcIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwi6KuL6Ly45YWl5paw5a+G56K8XCIsXG5cdFx0XHR0MjogXCLnorroqo3lr4bnorxcIixcblx0XHRcdHQyUGxhY2Vob2xkZXI6IFwi6KuL6YeN5paw6Ly45YWl5paw5a+G56K8XCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmZvbWF0aW9uSW1wcm92ZToge1xuXHRcdHRpdGxlOiBcIuiri+WujOWWhOaCqOeahOS/oeaBr1wiLFxuXHRcdHQxOiBcIuWnk+WQjVwiLFxuXHRcdHQxYzE6IFwi5aeTXCIsXG5cdFx0dDFjMjogXCLlkI1cIixcblx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQyOiBcIuaAp+WIpVwiLFxuXHRcdHQyUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDM6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0dDNQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NDogXCLorYnku7bpoZ7lnotcIixcblx0XHR0NFBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQ1OiBcIuitieS7tuiZn+eivFwiLFxuXHRcdHQ1UGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0c3VibWl0OiBcIueiuuiqjVwiLFxuXHRcdGNhbmNlbDogXCLot7PpgY5cIixcblx0XHRjYW5kaWRhdGVzOiB7XG5cdFx0XHRzZXg6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55S3XCIsXG5cdFx0XHRcdHZhbHVlOiBcIk1cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWls1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJGXCJcblx0XHRcdH1dLFxuXHRcdFx0aWRUeXBlOiBbe1xuXHRcdFx0XHRuYW1lOiBcIui6q+S7veitiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIxXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLorbfnhadcIixcblx0XHRcdFx0dmFsdWU6IFwiMlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi6LuN5a6Y6K2J5oiW5aOr5YW16K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjNcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+mAmuihjOitiS/lm57phInorYnmiJblj7Dog57orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiNlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5aSW5ZyL5Lq65rC45LmF5bGF55WZ6Lqr5Lu96K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIk9cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+WPsOWxheawkeWxheS9j+itiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJWXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlj7DngaPlsYXmsJHlsYXkvY/orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiV1wiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5YW25LuWXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjBcIlxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdHN1Y2Nlc3NNc2c6IFwi5pu05paw5oiQ5YqfXCIsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLoq4vloavlr6vlp5PlkI3kv6Hmga9cIixcblx0XHRcdGUyOiBcIuiri+mBuOaTh+aAp+WIpVwiLFxuXHRcdFx0ZTM6IFwi6KuL6YG45pOH55Sf5pelXCIsXG5cdFx0XHRlNDogXCLoq4vpgbjmk4forYnku7bpoZ7lnotcIixcblx0XHRcdGU1OiBcIuiri+Whq+Wvq+itieS7tuiZn+eivFwiLFxuXHRcdFx0ZTY6IFwi5oKo5aGr5a+r55qE6K2J5Lu26Jmf56K85pyJ6KqkXCIsXG5cdFx0XHRlNzogXCLmgqjloavlr6vnmoTkv6Hmga/mnInoqqTvvIzoq4vmoLjlr6blvozph43mlrDmj5DkuqRcIixcblx0XHR9XG5cdH0sXG5cdGluZGV4OiB7XG5cdFx0bmV3czogXCLmlrDogZ7os4foqIpcIixcblx0XHRuZXdNb3JlOiBcIuafpeeci+abtOWkmlwiLFxuXHRcdHJlY29tbWVuZDoge1xuXHRcdFx0dDE6IFwi5Zyo57ea5aCx5YO5XCIsXG5cdFx0XHR0MjogXCLlrqLmiLbmnI3li5lcIixcblx0XHRcdHQzOiBcIueUouWTgeS7i+e0uVwiLFxuXHRcdFx0dDQ6IFwi5pyA5paw5raI5oGvXCIsXG5cdFx0XHRpdGVtMToge1xuXHRcdFx0XHRidG46IFwi5LqG6Kej5pu05aSa55Si5ZOBXCIsXG5cdFx0XHRcdHQxOiBcIueCuuiHquW3seWSjOWutuS6uuWwi+aJvuWjueS7veS/nemanFwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0yOiB7XG5cdFx0XHRcdGJ0bjogXCLnq4vljbPpoJDntIRcIixcblx0XHRcdFx0dDE6IFwi5Zyo57ea6aCQ57SEIOWwiOalreacjeWLmVwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0zOiB7XG5cdFx0XHRcdGJ0bjogXCLlrqLmiLbmnI3li5lcIixcblx0XHRcdFx0dDE6IFwi5bCI5qWt5a6i5pyN54K65aaz5pyN5YuZXCIsXG5cdFx0XHRcdHQyOiBcIuaDs+S6huino+abtOWkmu+8jOWPr+iHtOmbu1wiLFxuXHRcdFx0XHR0MzogXCI5NTUxMVwiLFxuXHRcdFx0XHR0NDogXCLoga/ntaHmiJHlgJHvvIzmiJbpgLLlhaVcIixcblx0XHRcdH1cblx0XHR9LFxuXHR9LFxuXHRjb21wbGFpbnRBY2NlcHRhbmNlOiB7XG5cdFx0bmFtZTogXCLlp5PlkI1cIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwi5aeT5ZCNXCIsXG5cdFx0Y29udGFjdFR5cGU6IFwi6IGv57Wh5pa55byPXCIsXG5cdFx0ZW1haWw6IFwi6Zu76YO15Zyw5Z2AXCIsXG5cdFx0cXVlc3Rpb246IFwi5ZWP6aGM5oiW5oSP6KaLXCIsXG5cdFx0cXVlc3Rpb25QbGFjZUhvbGRlcjogXCLvvIjlrZfmlbjkuI3otoXpgY41MDDlrZfvvIlcIixcblx0XHRvcmRlck5vOiBcIuS/neWWrue3qOiZn1wiLFxuXHRcdG9yZGVyTm9QbGFjZUhvbGRlcjogXCLlpoLmgqjngrrlubPlronlrqLmiLbvvIzoq4vmj5Dkvpvkv53llq7nt6jomZ9cIixcblx0XHRjb250YWN0VGltZTogXCLmnJ/mnJvoga/ntaHmmYLplpNcIixcblx0XHRub3RpY2UxOiBcIuacrOihqOagvOaJgOaUtumbhueahOWAi+S6uuizh+aWmeagueaTmuOAjOW5s+WuieS6uuWjvemmmea4r+WAi+S6uuizh+aWmeaUtumbhuiBsuaYjuOAjeiZleeQhuWPiuWPquacg+iiq+eUqOS9nOaWvOiBr+e1oSDplqPkuIvkuYvnlKjjgILnhLbogIzmiYDmlLbpm4bnmoTlgIvkurros4fmlpnmnKrntpPmgqjmmI7norrmjojmrIrlsIfkuI3mnIPovYnnp7voh7PjgIzlubPlronkurrlo73pppnmuK/lgIvkurros4fmlpnmlLbpm4bogbLmmI7jgI3liJfmmI7ku6XlpJbkuYvnrKzkuInogIXmqZ/mp4vjgILmgqjlj6/pgbjmk4fkuI3lkJHmiJHlgJHmj5DkvpvmiYDpnIDnmoTlgIvkurros4fmlpnvvIzmg5/pgJnmqKPlj6/og73lsI7oh7TmiJHlgJHkuI3og73oga/ntaHmgqjjgILmgqjkuqblj6/moLnmk5rjgIzlubPlronkurrlo73pppnmuK/lgIvkurros4fmlpnmlLbpm4bogbLmmI7jgI3kuYvmrIrliKnmn6XplrHlj4rmm7TmraPlgIvkurros4fmlpnjgIJcIixcblx0XHRub3RpY2UyOiBcIuacrOS6uuePvueiuuiqjeaYjueZveS4puWQjOaEj+acrOS6uueahOWAi+S6uuizh+aWmeagueaTmuS4remKgOS6uuWjveWAi+S6uuizh+aWmeaUtumbhuiBsuaYjuS9nOS7peS4iui/sOeUqOmAlOOAglwiLFxuXHRcdGNvbnRhY3RUeXBlczogW3sgbmFtZTogJ+mbu+ipsScsIHZhbHVlOiAxLCBzaG93OiBcIuiBr+e1oembu+ipsVwiLCBpY29uOiBcIm1vYmlsZVwiIH0sIHsgbmFtZTogJ+mbu+mDtScsIHZhbHVlOiAyLCBzaG93OiBcIumbu+mDteWcsOWdgFwiLCBpY29uOiBcImVtYWlsXCIgfV0sXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLoq4vloavlr6voqbLpoIXlhaflrrlcIixcblx0XHRcdGUyOiBcIuiri+Whq+Wvq+ato+eiuueahOiBr+e5q+aWueW8j1wiXG5cdFx0fSxcblx0XHRzdWNjZXNzOiBcIuaEn+isneaCqOeahOWvtuiytOaEj+imi1wiXG5cdH0sXG5cdHJlc2VydmF0aW9uOiB7XG5cdFx0bmFtZTogXCLlp5PlkI1cIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwi5aeT5ZCNXCIsXG5cdFx0Y29udGFjdFR5cGU6IFwi6IGv57Wh5pa55byPXCIsXG5cdFx0Y29udGFjdFR5cGVDYWRpZGF0ZXM6IFt7IG5hbWU6IFwi6Zu76KmxXCIsIHZhbHVlOiAxIH1dLFxuXHRcdGNvbnRhY3Q6IFwi6IGv57Wh6Zu76KmxXCIsXG5cdFx0Y29udGFjdFBsYWNlaG9sZGVyOiBcIummmea4r+iZn+eivC/lhaflnLDomZ/norxcIixcblx0XHRyZXNlcnZhdGlvblR5cGU6IFwi6aCQ57SE6aGe5Z6LXCIsXG5cdFx0cmVzZXJ2YXRpb25DYW5kaWRhdGVzOiBbXG5cdFx0XHR7IG5hbWU6IFwi5oqV5L+d6Kuu6KmiXCIsIHZhbHVlOiBcIuaKleS/neirruipolwiIH0sXG5cdFx0XHR7IG5hbWU6IFwi5Luj6L6m5L+d5Zau6K6K5pu0XCIsIHZhbHVlOiBcIuS7o+WKnuS/neWNleWPmOabtFwiIH1cblx0XHRdLFxuXHRcdHJlc2VydmF0aW9uUmVtYXJrOiBcIumgkOe0hOiqquaYjlwiLFxuXHRcdHJlc2VydmF0aW9uUmVtYXJrUGxhY2Vob2xkZXI6IFwi6KuL57Ch5Zau6Kqq5piO5oKo5oOz6KaB5ZKo6Kmi55qE55Si5ZOB5oiW5qWt5YuZXCIsXG5cdFx0aGtDbGllbnQ6IFwi5piv5ZCm5bmz5a6J6aaZ5riv5a6i5oi2XCIsXG5cdFx0eWVzOiBcIuaYr1wiLFxuXHRcdG5vOiBcIuWQplwiLFxuXHRcdGNvbnRhY3RUaW1lOiBcIuacn+acm+iBr+e1oeaZgumWk1wiLFxuXHRcdG5vdGljZTE6IFwi5pys6KGo5qC85omA5pS26ZuG55qE5YCL5Lq66LOH5paZ5qC55pOa44CM5bmz5a6J5Lq65aO96aaZ5riv5YCL5Lq66LOH5paZ5pS26ZuG6IGy5piO44CN6JmV55CG5Y+K5Y+q5pyD6KKr55So5L2c5pa86IGv57WhIOmWo+S4i+S5i+eUqOOAgueEtuiAjOaJgOaUtumbhueahOWAi+S6uuizh+aWmeacque2k+aCqOaYjueiuuaOiOasiuWwh+S4jeacg+i9ieenu+iHs+OAjOW5s+WuieS6uuWjvemmmea4r+WAi+S6uuizh+aWmeaUtumbhuiBsuaYjuOAjeWIl+aYjuS7peWkluS5i+esrOS4ieiAheapn+ani+OAguaCqOWPr+mBuOaTh+S4jeWQkeaIkeWAkeaPkOS+m+aJgOmcgOeahOWAi+S6uuizh+aWme+8jOaDn+mAmeaoo+WPr+iDveWwjuiHtOaIkeWAkeS4jeiDveiBr+e1oeaCqOOAguaCqOS6puWPr+agueaTmuOAjOW5s+WuieS6uuWjvemmmea4r+WAi+S6uuizh+aWmeaUtumbhuiBsuaYjuOAjeS5i+asiuWIqeafpemWseWPiuabtOato+WAi+S6uuizh+aWmeOAglwiLFxuXHRcdG5vdGljZTI6IFwi5pys5Lq654++56K66KqN5piO55m95Lim5ZCM5oSP5pys5Lq655qE5YCL5Lq66LOH5paZ5qC55pOa5Lit6YqA5Lq65aO95YCL5Lq66LOH5paZ5pS26ZuG6IGy5piO5L2c5Lul5LiK6L+w55So6YCU44CCXCIsXG5cdFx0c3VjY2VzczogXCLmj5DkuqTmiJDlip9cIixcblx0XHRzdWJtaXRCdG46ICfnoa7orqQnLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6KuL5aGr5a+r6Kmy6aCF5YWn5a65XCIsXG5cdFx0XHRlMjogXCLoq4vloavlr6vmraPnorrnmoToga/nuavmlrnlvI9cIlxuXHRcdH1cblx0fSxcblx0cGF5bWVudFR5cGU6IHtcblx0XHRtZW51MTogXCLopqroh6jlrqLmnI3kuK3lv4Pku5jmrL5cIixcblx0XHRtZW51MjogXCLntrLpioDku5jmrL5cIixcblx0XHRtZW51MzogXCLpm7vljK/ku5jmrL5cIixcblx0XHRtZW51NDogXCLmq4Plk6HmqZ/ku5jmrL5cIixcblx0XHRtZW51NTogXCLjgIznubPosrvpnYjjgI3ku5jmrL5cIixcblx0XHRtZW51NjogXCLpppnmuK/pg7XmlL/lsYBcIixcblx0fSxcblx0cHJvZHVjdDoge1xuXHRcdGJ0blBvc2l0aW9uOiBcIumgkOe0hOacjeWLmVwiLFxuXHRcdGljb25Qcm9ibGVtOiBcIuW4uOimi+WVj+mhjFwiLFxuXHRcdGljb25Qcm9jZXNzOiBcIuaKleS/nea1geeoi1wiLFxuXHRcdGljb25Qcm9kdWN0OiBcIueUouWTgeips+aDhVwiXG5cdH0sXG5cdGN1c3RvbVByb2R1Y3Q6IHtcblx0XHRtZW51MTogXCLoga/nuavmiJHlgJFcIixcblx0XHRtZW51MjogXCLnubPku5jkv53osrtcIixcblx0XHRtZW51MzogXCLkv53llq7mn6XoqaJcIixcblx0XHRtZW51NDogXCLkv53llq7orormm7RcIixcblx0XHRtZW51NTogXCLnkIbos6DnlLPoq4tcIixcblx0XHRtZW51NjogXCLpoJDntITmnI3li5lcIixcblx0XHRtZW51NzogXCLmipXoqLTlj5fnkIZcIixcblx0XHRtZW51ODogXCLluLjnlKjooajmoLxcIixcblx0fSxcblx0Y29tbW9uRm9ybToge1xuXHRcdGhlYWQxOiBcIuihqOagvOmhnuWei1wiLFxuXHRcdGhlYWQyOiBcIuihqOagvOWQjeeosVwiLFxuXHRcdGhlYWQzOiBcIuS9v+eUqOiqquaYjlwiLFxuXHRcdGhlYWQ0OiBcIumZhOS7tlwiLFxuXHRcdGRvd25sb2FkOiBcIuS4i+i8ieaWh+aqlFwiLFxuXHRcdGZvcm06IFt7XG5cdFx0XHR0eXBlOiBcIue5s+iyu+mhnlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLjgIzpm7vlrZDlhaXos6zmnI3li5njgI3lj4rpioDooYzmiLblj6M8YnI+55u05o6l5LuY5qy+5o6I5qyK55Sz6KuLXCIsXG5cdFx0XHRcdGRlc2M6IFwi55Sz6KuL6Kit56uL44CMIOmbu+WtkOWFpeizrOacjeWLmeOAjSDlj4rpioDooYzmiLblj6M8YnI+55u05o6l5LuY5qy+5o6I5qyK5pmC6aCI5o+Q5L6bXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv6HnlKjljaHmiLblj6Pnm7TmjqXku5jmrL7mjojmrIrmm7hcIixcblx0XHRcdFx0ZGVzYzogXCLnlLPoq4vkv6HnlKjljaHmiLblj6Pnm7TmjqXku5jmrL7mjojmrIrmmYLpoIjmj5DkvptcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIuS/neWWruiuiuabtOmhnlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLkv53pmqrlkIjlkIzop6PpmaTnlLPoq4vmm7hcIixcblx0XHRcdFx0ZGVzYzogXCLpgIDkv53jgIHlhrfpnZzmnJ/pgIDkv53mpa3li5npgannlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWQiOWQjOiuiuabtOeUs+iri+abuO+8iCDkv53llq7osrjmrL7pgoTmrL7poZ7vvIlcIixcblx0XHRcdFx0ZGVzYzogXCLkv53llq7osrjmrL7jgIHpgoTmrL7mpa3li5npgannlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWQiOWQjOiuiuabtOeUs+iri+abuO+8iCDkv53pmqrlkIjlkIzoqIjlioPorormm7TpoZ7vvIlcIixcblx0XHRcdFx0ZGVzYzogXCLliqDkv53jgIHmuJvkv53jgIHmlrDlop7pmYTpmqrjgIHlvqnmlYjnrYnmpa3li5npgannlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWQiOWQjOiuiuabtOeUs+iri+abuO+8iCDlrqLmiLbkv6Hmga/orormm7TpoZ7vvIlcIixcblx0XHRcdFx0ZGVzYzogXCLln7rmnKzos4foqIrorormm7Tmpa3li5npgannlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWQiOWQjOiuiuabtOeUs+iri+abuO+8iCDlrqLmiLbmrIrnm4rorormm7TpoZ7vvIlcIixcblx0XHRcdFx0ZGVzYzogXCLkuqTosrvmlrnlvI/jgIHoh6rloorpgbjmk4fmrIrorormm7TjgIHoo5znmbznrYnmpa3li5npgannlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuaOiOasiuWnlOaJmOabuFwiLFxuXHRcdFx0XHRkZXNjOiBcIuWnlOaJmOS7luS6uuS7o+i+puaZgumgiOaPkOS+m1wiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi56iF5pS26IGy5piOXCIsXG5cdFx0XHRcdGRlc2M6IFwiQ1JT6KaB5rGCXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlgaXlurflkYrnn6VcIixcblx0XHRcdFx0ZGVzYzogXCLpoIjkuozmrKHmoLjkv53nmoTmpa3li5npoIjmj5DkvptcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIueQhuizoOmhnlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLnkIbos6DnlLPoq4vmm7hcIixcblx0XHRcdFx0ZGVzYzogXCLntJnos6rnlLPoq4vnmoTmh4nlgpnmlofku7ZcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0XVxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VHdWlkZToge1xuXHRcdG5vdGljZTogXCLlpoLpnIDlgZrlhbbku5bkv53llq7orormm7RcIixcblx0XHRub3RpY2VMaW5rOiBcIuiBr+e5q+WuouacjVwiLFxuXHRcdGhlYWQxOiBcIumgheebrlwiLFxuXHRcdGhlYWQyOiBcIuWFt+mrlOWFp+WuuVwiLFxuXHRcdGhlYWQzOiBcIueUs+iri+izh+agvOS6ulwiLFxuXHRcdGhlYWQ0OiBcIuWPl+eQhuaZgumWk1wiLFxuXHRcdGhlYWQ1OiBcIuaHieWCmeadkOaWmVwiLFxuXHRcdGRvd25sb2FkOiBcIuS4i+i8ieaWh+aqlFwiLFxuXHRcdGZvcm06IFt7XG5cdFx0XHRwcm9qZWN0OiBcIumAgOS/nVwiLFxuXHRcdFx0Y29udGVudDogXCLlnKjlhrfpnZzmnJ/lvozop6PpmaTlkIjlkIzvvIzlhazlj7jlsIfpgIDpgoTkv53llq7nj77ph5Hlg7nlgLzmiJbmnKrmu7/mnJ/lh4jkv53osrvjgILvvIjlvoXnlKLlk4Hnsr7nrpfnorroqo3vvIlcIixcblx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5L+d5Zau5pWI5Yqb57WC5q2i5YmNXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zqq5ZauXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIueUs+iri+abuFwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXkv53kurrmnInmlYjouqvku73orYnku7ZcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5a2Y5oqY6ZO26KGM5Y2h55u45YWzXCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCLlhrfpnZzmnJ/pgIDkv51cIixcblx0XHRcdGNvbnRlbnQ6IFwi5Zyo5Ya36Z2c5pyf5YWn5o+Q5Ye66Kej6Zmk5ZCI5ZCM77yM5YWs5Y+45pyD54Sh5oGv6YCA6YKE5YWo6YOo5L+d6LK7XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIuWGt+mdnOacn+e1kOadn+WJjVwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWWrlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLnlLPoq4vmm7hcIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5oqV5L+d5Lq65pyJ5pWI6Lqr5Lu96K2J5Lu2XCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWtmOaKmOmTtuihjOWNoeebuOWFs1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLpppbmnJ/kv53osrvnmbznpahcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIuWuouaItuizh+aWmeiuiuabtFwiLFxuXHRcdFx0cHJvamVjdFR5cGU6IDEsXG5cdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZVwiLFxuXHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0cTogXCJtNDJcIlxuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IFwi5oqV5L+d5Lq644CB5Y+X5L+d5Lq644CB5Y+X55uK5Lq655qE5YCL5Lq65L+h5oGv6K6K5pu0XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIuS4jemZkFwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUs+iri+abuFwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlv4XopoHnmoTorYnmmI7mnZDmlplcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIuiBr+ezu+aWueW8j+iuiuabtFwiLFxuXHRcdFx0cHJvamVjdFR5cGU6IDEsXG5cdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZVwiLFxuXHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0cTogXCJtNDNcIlxuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IFwi5Zyw5Z2A44CB6Zu76Kmx562J5L+h5oGv55qE6K6K5pu0XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIuS4jemZkFwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUs+iri+abuFwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXkv53kurrmnInmlYjouqvku73orYnku7ZcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIuS6pOiyu+aWueW8j+iuiuabtFwiLFxuXHRcdFx0Y29udGVudDogXCLmm7TmlLnkv53llq7nmoTnuozmnJ/kuqTosrvmlrnlvI/miJbkuqTosrvos6zomZ9cIixcblx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5L+d5Zau5Lqk6LK75pyf5ru/5YmNXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55Sz6KuL5pu4XCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemaquWWrlwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlQ29udGFjdDoge1xuXHRcdHBob25lOiBcIuiBr+e5q+mbu+ipsVwiLFxuXHRcdGFkZHJlc3M6IFwi6IGv57mr5Zyw5Z2AXCIsXG5cdFx0ZW1haWw6IFwi6Zu76YO15Zyw5Z2AXCIsXG5cdFx0Y2hlY2tUaXBzOiBcIuacrOS6uuS4jeWQjOaEj+aOpeaUtuWuo+WCs+S/oeaBr1wiLFxuXHRcdHN1Ym1pdDogXCLnorroqo3kv67mlLlcIixcblx0XHRlcnJvclRpcHM6IHtcblx0XHRcdGUxOiBcIuiri+Whq+Wvq+ato+eiuueahOiBr+e5q+mbu+ipsVwiLFxuXHRcdFx0ZTI6IFwi6KuL5aGr5a+r6IGv57mr5Zyw5Z2AXCIsXG5cdFx0XHRlMzogXCLoq4vloavlr6vmraPnorrnmoTpm7vpg7XlnLDlnYBcIlxuXHRcdH0sXG5cdFx0c3VjY2VzczogXCLmm7TmlrDmiJDlip9cIixcblx0fSxcblx0cG9saWN5Q2hhbmdlSW5mb3JtYXRpb246IHtcblx0XHR0aXRsZTogXCLlrqLmiLbos4fmlpnorormm7RcIixcblx0XHRvd25lcjogXCLmipXkv53kurpcIixcblx0XHRpbnN1cmVkOiBcIuWPl+S/neS6ulwiLFxuXHRcdG9iajogXCLorormm7TlsI3osaFcIixcblx0XHRuYW1lOiBcIuWnk+WQjVwiLFxuXHRcdHNleDogXCLmgKfliKtcIixcblx0XHRiaXJ0aDogXCLlh7rnlJ/ml6XmnJ9cIixcblx0XHR0eXBlOiBcIuitieS7tumhnuWei1wiLFxuXHRcdE5POiBcIuitieS7tuiZn+eivFwiLFxuXHRcdHZhbGlkaXR5UGVyaW9kOiBcIuitieS7tuacieaViOacn1wiLFxuXHRcdG5hdGlvbmFsaXR5OiBcIuWci+exjVwiLFxuXHRcdGVtcGxveWVyOiBcIuW3peS9nOWWruS9jVwiLFxuXHRcdG1hcml0YWxTdGF0dXM6IFwi5ama5ae754uA5rOBXCIsXG5cdFx0c3VibWl0OiBcIueiuuiqjeS/ruaUuVwiLFxuXHRcdHVwbG9hZDogXCLpmYTku7bkuIrlgrNcIixcblx0XHRtb2RpZnlUaXBzMTogXCLlpoLpnIDkv67mlLnoq4tcIixcblx0XHRtb2RpZnlUaXBzMjogXCLoga/nuavlrqLmnI1cIixcblx0XHRzdWNjZXNzOiBcIuabtOaWsOaIkOWKn1wiLFxuXHR9LFxuXHRjb250YWN0VXM6IHtcblx0XHRzZXJ2aWNlOiB7XG5cdFx0XHRjZW50ZXI6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ5Lit5b+DXCIsXG5cdFx0XHRcdGFkZHJlc3M6IFwi5Zyw5Z2A77ya6aaZ5riv5bCW5rKZ5Zi05riv5aiB5rC46YeR6J6N5aSn5qiTXCIsXG5cdFx0XHRcdHRpbWU6IFwi5pyN5YuZ5pmC6ZaT77ya5pif5pyf5aO56Iez5LqUOTowMC0xODowMFwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdGxpbmU6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ54ax57eaXCIsXG5cdFx0XHRcdGhrOiBcIummmea4r+iZn+eivO+8mig4NTIpMjk4MyA4ODY2XCIsXG5cdFx0XHRcdGNuOiBcIuWFp+WcsOiZn+eivO+8mig4Nik0MDA3OCA5NTUxMVwiLFxuXHRcdFx0XHR0aW1lOiBcIuacjeWLmeaZgumWk++8muaYn+acn+WjueiHs+S6lDk6MDAtMTg6MDBcIlxuXHRcdFx0fSxcblx0XHRcdG1haWw6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ6Zu76YO1XCIsXG5cdFx0XHRcdG1haWw6IFwiY3NAcGluZ2FuLmNvbS5oa1wiXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRwdWxiaWM6IHtcblx0XHRcdHRpdGxlOiBcIuW+ruS/oeWFrOecvuiZn1wiLFxuXHRcdFx0bTE6IFwi55m76Zm444CM5b6u5L+h44CNQVBQ77yMIOaMieWPs+S4iuinkueahOOAjCvjgI3mjInpiJXkuKbpgbjmk4fjgIzmt7vliqDmnIvlj4vjgI3vvIzpgbjmk4fjgIzlhaznnL7omZ/jgI0g6Ly45YWl5Lim5pCc57Si44CM5bmz5a6J5Lq65aO96aaZ5riv44CNXCIsXG5cdFx0XHRtMjogXCLnmbvpmbjjgIzlvq7kv6HjgI1BUFDvvIwg5oyJ5Y+z5LiK6KeS55qE44CMK+OAjeaMiemIleS4pumBuOaTh+OAjOaOg+WjueaOg+OAjeaOg+aPj+S4i+aWueS6jOe2reeivO+8iOaUvue9ruS6jOe2reeivO+8iVwiXG5cdFx0fSxcblx0XHRxcmNvZGU6IHtcblx0XHRcdHRpdGxlOiBcIuWumOaWueWFrOecvuiZn1wiXG5cdFx0fVxuXHR9LFxuXHRjdXN0b21TZXJ2aWNlOiB7XG5cdFx0bmFtZTogXCLlrqLmiLbmnI3li5lcIixcblx0XHRtZW51MTogXCLoga/nuavmiJHlgJFcIixcblx0XHRtZW51MjogXCLnubPku5jkv53osrtcIixcblx0XHRtZW51MzogXCLkv53llq7mn6XoqaJcIixcblx0XHRtZW51NDogXCLkv53llq7orormm7RcIixcblx0XHRtZW51NDE6IFwi5L+d5Zau6K6K5pu05oyH5byVXCIsXG5cdFx0bWVudTQyOiBcIuiBr+ezu+aWueW8j+iuiuabtFwiLFxuXHRcdG1lbnU0MzogXCLlrqLmiLbos4fmlpnorormm7RcIixcblx0XHRtZW51NTogXCLnkIbos6DnlLPoq4tcIixcblx0XHRtZW51NjogXCLpoJDntITmnI3li5lcIixcblx0XHRtZW51NzogXCLmipXoqLTlj5fnkIZcIixcblx0XHRtZW51ODogXCLluLjnlKjooajmoLxcIixcblx0XHRpbnN1cmFuY2VRdWVyeToge1xuXHRcdFx0bW9kaWZ5OiBcIuS/ruaUuVwiLFxuXG5cdFx0XHRJbnN1cmFudE51bWJlcjogXCLkv53llq7omZ/norxcIixcblx0XHRcdEluc3VyYW50OiBcIuWPl+S/neS6ulwiLFxuXHRcdFx0SW5zdXJhbnROYW1lOiBcIumaqueoruWQjeeosVwiLFxuXHRcdFx0SW5zdXJhbnRBbW91bnQ6IFwi5L+d6aGNXCIsXG5cdFx0XHRlZmZlY3RpdmVEYXRlOiBcIuS/neiyu+WIsOacn+aXpVwiLFxuXHRcdFx0cGVyaW9kOiBcIuS/nemanOW5tOacn1wiLFxuXG5cdFx0XHR0MlRpdGxlOiBcIuS/neWWruS/oeaBr1wiLFxuXHRcdFx0dDJuMTogXCLpmqrnqK7lkI3nqLFcIixcblx0XHRcdHQybjI6IFwi5L+d6aGNXCIsXG5cdFx0XHR0Mm4zOiBcIueUn+aViOaXpeacn1wiLFxuXHRcdFx0dDJuNDogXCLkv53pmpzlubTmnJ9cIixcblx0XHRcdHQybjU6IFwi5Y+X5L+d5Lq65aeT5ZCN77yI5Lit5paH77yJXCIsXG5cdFx0XHR0Mm42OiBcIuWPl+S/neS6uuWnk+WQje+8iOiLseaWh++8iVwiLFxuXHRcdFx0dDJuNzogXCLlh7rnlJ/ml6XmnJ9cIixcblx0XHRcdHQybjg6IFwi6K2J5Lu26Jmf56K8XCIsXG5cblxuXHRcdFx0dDNUaXRsZTogXCLlrqLmiLbos4fmlplcIixcblx0XHRcdHQzbjE6IFwi5oqV5L+d5Lq65aeT5ZCN77yI5Lit5paH77yJXCIsXG5cdFx0XHR0M24yOiBcIuaKleS/neS6uuWnk+WQje+8iOiLseaWh++8iVwiLFxuXHRcdFx0dDNuMzogXCLlh7rnlJ/ml6XmnJ9cIixcblx0XHRcdHQzbjQ6IFwi6K2J5Lu26Jmf56K8XCIsXG5cdFx0XHR0M241OiBcIuiBr+e5q+WcsOWdgFwiLFxuXHRcdFx0dDNuNjogXCLlsYXkvY/lnLDlnYBcIixcblx0XHRcdHQzbjc6IFwi5omL5o+Q6Zu76KmxXCIsXG5cdFx0XHR0M244OiBcIumbu+WtkOmDteeusVwiLFxuXG5cdFx0XHR0NFRpdGxlOiBcIuWPl+ebiuS6uuizh+aWmVwiLCAvLyB0NEJlbmVmaWNpYXJ5SW5mb3JtYXRpb25cblx0XHRcdHQ0TmFtZUNuOiBcIuWnk+WQje+8iOS4reaWh++8iVwiLFxuXHRcdFx0dDROYW1lRW46IFwi5aeT5ZCN77yI6Iux5paH77yJXCIsXG5cdFx0XHR0NFJlbGF0aW9uOiBcIuiIh+WPl+S/neS6uumXnOS/glwiLFxuXHRcdFx0dDRBbGxvY2F0aW9uOiBcIuWIhumFjeavlOS+i1wiLFxuXG5cdFx0XHR0NVRpdGxlOiBcIue5s+iyu+izh+aWmVwiLFxuXHRcdFx0dDVQYXltZW50UGVyaW9kOiBcIue6jOiyu+W5tOacn1wiLFxuXHRcdFx0dDVQYXltZW50TWV0aG9kOiBcIue5s+iyu+aWueW8j1wiLFxuXHRcdFx0dDVQYXltZW50Q3VycmVuY3k6IFwi57mz6LK75bmj56iuXCIsXG5cdFx0XHR0NUN1cnJlbnRQcmVtaXVtOiBcIueVtuacn+S/neiyu1wiLFxuXHRcdFx0dDVQYXltZW50QmFuazogXCLnubPosrvpioDooYxcIixcblx0XHRcdHQ1UGF5bWVudEFjY291bnQ6IFwi57mz6LK75biz6JmfXCIsXG5cblx0XHRcdHQ2VGl0bGU6IFwi57mz6LK76KiY6YyEXCIsXG5cdFx0XHR0NlBheW1lbnRQZXJpb2Q6IFwi57mz6LK75pyfXCIsXG5cdFx0XHR0NlBheW1lbnRNZXRob2Q6IFwi57mz6LK75pa55byPXCIsXG5cdFx0XHR0NkNsb3NpbmdEYXRlOiBcIuWvpuaUtuaXpeacn1wiLFxuXHRcdFx0dDZQYXltZW50QW1vdW50OiBcIue5s+iyu+mHkemhjVwiLFxuXG5cdFx0XHRzaG93TW9yZTogXCLpoa/npLrmiYDmnInkv53llq5cIixcblx0XHRcdG5vUG9saWN5OiBcIuaCqOmChOacquizvOiyt+S/neWWru+8jOWmguacieeWkeWVj+iri1wiLFxuXHRcdFx0Y3VzdG9tU2VydmljZTogXCLoga/nuavlrqLmnI1cIixcblx0XHR9LFxuXHRcdHVuYXV0aDoge1xuXHRcdFx0dGlwczogXCLlpoLmgqjmnInlubPlronkuIDos6zpgJros6zmiLbvvIzlj6/luavliqnmiJHlgJHmm7Tlpb3lnLDngrrmgqjmj5DkvpvmnI3li5lcIixcblx0XHRcdG9yOiBcIuaIllwiLFxuXHRcdFx0bG9naW46IFwi55m76YyEXCIsXG5cdFx0XHRyZWdpc3RlcjogXCLoqLvlhopcIixcblx0XHRcdGJhc2VJbmZvVGlwOiBcIuaCqOeahOWujOaVtOS/oeaBr+WPr+W5q+WKqeaIkeWAkeeCuuS9oOaPkOS+m+WujOaVtOacjeWLmVwiLFxuXHRcdFx0aW5mb0J0bjogXCLliY3lvoDlrozlloRcIlxuXHRcdH1cblx0fSxcblx0cGFnaW5hdGlvbjoge1xuXHRcdGZpcnN0UGFnZTogXCLnrKzkuIDpoIFcIixcblx0XHRuZXh0UGFnZTogXCLkuIvkuIDpoIFcIixcblx0XHRnb3RvOiBcIui3s+i9iVwiLFxuXHRcdHBlcjogXCLnrKxcIixcblx0XHRwYWdlOiBcIumggVwiXG5cdH0sXG5cdG5ld3NEZXRhaWw6IHtcblx0XHRiYWNrOiBcIuWbnuWIsOWIl+ihqOmggVwiLFxuXHRcdHB1Ymxpc2hBdDogXCLnmbzkvYjmmYLplpNcIixcblx0XHRyZWFkZXJzOiBcIumWseiugOS6uuaVuFwiLFxuXHRcdHBlcjogXCLkurpcIlxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUExQkE7QUFrQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFGQTtBQVJBO0FBY0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBcENBO0FBMkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQWxCQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFQQTtBQWxIQTtBQWlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBbkJBO0FBZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBMUJBO0FBeUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQTFCQTtBQW1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQTdCQTtBQWtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQW5EQTtBQTZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBYkE7QUFIQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQWpCQTtBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBdEJBO0FBMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFQQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBckNBO0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUZBO0FBaEVBO0FBMEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBSUE7QUFEQTtBQWZBO0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQUlBO0FBREE7QUFJQTtBQURBO0FBbEJBO0FBd0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQWRBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQWRBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBVEE7QUExRkE7QUEwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBWEE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxCQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUZBO0FBWkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFEQTtBQXZCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyREE7QUF1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQXBFQTtBQTZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQWp3QkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/common/lang/tc.js\n");
/***/ }),
/***/ "./src/common/lang/zh.js":
/*!*******************************!*\
!*** ./src/common/lang/zh.js ***!
\*******************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = {\n message: {\n login: '登录',\n Username: '用户名',\n Password: '密码',\n Captcha: '验证码',\n Language: '语言',\n zh: '中文',\n en: '英文'\n },\n glbalTips: {\n sessionLost: \"为了更好的体验,需要您登录后再进行此操作\"\n },\n form: {\n datePicker: {\n datePlaceholder: \"请选择日期\"\n },\n modalUploadCard: {\n tit: \"请上传证件资料\",\n front: \"证件正面\",\n back: \"证件反面\"\n }\n },\n nav: {\n loginData: {\n name: \"登陆\",\n path: \"/login\",\n list: [{\n name: \"注册\",\n path: \"/register\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"登陆\",\n path: \"/login\",\n type: \"noAuth\",\n value: \"\"\n }, {\n name: \"修改密码\",\n path: \"/password/reset\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"个人信息\",\n path: \"/infomation/improve\",\n type: \"auth\",\n value: \"\"\n }, {\n name: \"登出\",\n path: \"\",\n type: \"auth\",\n value: \"logout\"\n }]\n },\n navList: [{\n name: \"产品介绍\",\n path: \"/empty\",\n list: [{\n name: \"自愿医保基本计划\",\n path: \"\",\n value: \"gotoVHIS\"\n }, {\n name: \"投资成份保险\",\n path: \"/product\"\n }]\n }, {\n name: \"客户服务\",\n path: \"/custom/product\",\n list: [{\n name: \"客户服务导航\",\n path: \"/custom/product\"\n }, {\n name: \"联系我们\",\n path: \"/custom/service?q=m1\"\n }, {\n name: \"缴付保费\",\n path: \"/custom/service?q=m2\"\n }, {\n name: \"保单查询\",\n path: \"/custom/service?q=m3\"\n }, {\n name: \"保单变更\",\n path: \"/custom/service?q=m41\"\n }, {\n name: \"理赔申请\",\n path: \"/custom/service?q=m5\"\n }, {\n name: \"预约服务\",\n path: \"/custom/service?q=m6\"\n }, {\n name: \"投诉受理\",\n path: \"/custom/service?q=m7\"\n }, {\n name: \"常用表格\",\n path: \"/custom/service?q=m8\"\n }]\n }, {\n name: \"关于我们\",\n path: \"/profile\",\n list: [{\n name: \"有关平安香港\",\n path: \"/profile\"\n }, {\n name: \"公司活动\",\n path: \"/empty\"\n }, {\n name: \"新闻中心\",\n path: \"/news/list\"\n }, {\n name: \"企业社会责任\",\n path: \"/empty\"\n }, {\n name: \"奖项殊荣\",\n path: \"/empty\"\n }]\n }, {\n name: \"加入我们\",\n path: \"/empty\",\n list: [{\n name: \"企业文化\",\n path: \"/empty\"\n }, {\n name: \"事业发展机会\",\n path: \"/empty\"\n }]\n }]\n },\n footer: {\n hkPhone: \"香港号码\",\n cnPhone: \"内地号码\",\n aboutUs: \"关于我们\",\n companyIntroduction: \"集团介绍\",\n news: \"新闻资讯\",\n joinUs: \"加入我们\",\n helpCenter: \"帮助中心\",\n privacy: \"隐私政策\",\n terms: \"使用条款\",\n protocol: \"个人资料收集声明\",\n map: \"网站地图\",\n contactUs: \"联络我们\",\n contactInformation: \"联系方式\",\n service: \"服务网络\",\n qrcode: \"社交媒體\",\n copyright: \"版权所有 © 中国平安保险(集团)股份有限公司未经许可不得复制、转载或摘编,违者必究!\"\n },\n login: {\n title: \"平安一账通\",\n loginType1: \"账密登录\",\n loginType2: \"动态密码登录\",\n account: \"账号\",\n accountPlaceholder: \"请输入证件号/一账通用户名/手机号\",\n password: \"密码\",\n passwordPlaceholder: \"输入登录密码\",\n verifyPlaceholder: \"请输入验证码\",\n agree: \"同意\",\n protocol: \"《平安一账通会员服务协议》\",\n login: \"登入\",\n register: \"注册\",\n forget: \"忘记密码\",\n mobile: \"手机号\",\n mobilePlaceholder: \"手机号\",\n verifyCode: \"验证码\",\n verifyCodePlaceholder: \"验证码\",\n verifyCodeGet: \"获取验证码\",\n tips: {\n e1: \"请输入账号信息\",\n e2: \"请输入密码\",\n e3: \"请输入图像验证码\",\n e4: \"请同意《平安一账通会员服务协议》\",\n e5: \"账号或密码不正确\",\n oe0: \"请输入正确的手机号\",\n oe1: \"请先获取短信验证码\",\n oe2: \"请输入图片验证码\",\n oe3: \"请输入短信验证码\",\n oe4: \"短信验证码不正确\"\n }\n },\n session: {\n sidExpire: \"长时间未操作,为了您的账户安全,请登录后再操作\"\n },\n register: {\n mobileOptions: [{\n type: \"hk\",\n name: \"香港手机号\",\n placeHolder: \"请输入8位手机号码\",\n areaCode: \"+852\"\n }, {\n type: \"zh\",\n name: \"大陆手机号\",\n placeHolder: \"请输入11位手机号码\",\n areaCode: \"+86\"\n }],\n coutTips: \"{second}秒后重新获取\",\n title: \"欢迎注册\",\n title2: \"请设置新的密码\",\n mobilePlaceholder: \"请输入8位手机号码\",\n verifyCodePlaceholder: \"请输入验证码\",\n verifyCodeGet: \"获取验证码\",\n agree: \"同意\",\n protocol: \"《平安一账通会员服务协议》\",\n register: \"点击注册\",\n newPassword: \"新密码\",\n newPasswordPlaceholder: \"请输入新密码\",\n newPasswordSure: \"确认密码\",\n newPasswordSurePlaceholder: \"请再次输入新密码\",\n sure: \"确认\",\n tips: {\n e1: \"手机号不正确,请输入正确的手机号\",\n e2: \"请同意《平安一账通会员服务协议》\",\n e3: \"短信验证码不正确\",\n e4: \"请先获取短信验证码\",\n e5: \"手机号已经被注册,请使用其他手机号注册或直接登录\",\n e6: \"请输入图片验证码\",\n e7: \"密码长度不能少于8位\",\n e8: \"密码必须同时包含数字、字母、特殊字符\",\n e9: \"两次输入的密码不一致\",\n e10: \"验证码过期,请重新申请验证码\",\n e11: \"注册失败,请联系工作人员\",\n e12: \"註冊成功\"\n }\n },\n passwordCheck: {\n error1: \"密码长度不少于8位\",\n error2: \"密码中必须包含数字、字符以及特殊号码\",\n error3: \"两次密码不一致,请确认后重新输入\",\n error4: \"密码修改失败,请稍后再试,或拨打客服电话95511解决\",\n error5: \"旧密码不正确,请重新输入\",\n success: \"密码修改成功\"\n },\n passwordReset: {\n oldPwd: \"旧密码\",\n oldPwdPlaceholde: \"请输入旧密码\",\n cidExpire: \"长时间未操作,为了您的账户安全,请重新开始\",\n type1: {\n title: \"密码找回\",\n t1: \"用户输入信息\",\n t1Placeholder: \"手机号/一账通用户名/证件号\",\n submit: \"确认\",\n error: \"您的手机号或证件号输入错误,请核对后重新输入\"\n },\n type2: {\n title: \"密码找回\",\n t1: \"手机短信验证码\",\n t1Placeholder: \"请输入验证码\",\n submit: \"确认\",\n error1: \"短信验证码输入错误,请核对后重新输入\",\n error2: \"短信验证码已经过期,请重新获取验证码\",\n error3: \"短信验证码发放时间少于1分钟,请稍后再试\"\n },\n type3: {\n title: \"密码找回\",\n t1: \"核对身份证信息\",\n t1Placeholder: \"\",\n submit: \"确认\"\n },\n type4: {\n title: \"请设置新的密码\",\n t1: \"新密码\",\n t1Placeholder: \"请输入新密码\",\n t2: \"确认密码\",\n t2Placeholder: \"请重新输入新密码\",\n submit: \"确认\"\n }\n },\n infomationImprove: {\n title: \"请完善您的信息\",\n t1: \"姓名\",\n t1c1: \"姓\",\n t1c2: \"名\",\n t1Placeholder: \"\",\n t2: \"性别\",\n t2Placeholder: \"\",\n t3: \"出生日期\",\n t3Placeholder: \"\",\n t4: \"证件类型\",\n t4Placeholder: \"\",\n t5: \"证件号码\",\n t5Placeholder: \"\",\n submit: \"确认\",\n cancel: \"跳过\",\n candidates: {\n sex: [{\n name: \"男\",\n value: \"M\"\n }, {\n name: \"女\",\n value: \"F\"\n }],\n idType: [{\n name: \"身份证\",\n value: \"1\"\n }, {\n name: \"护照\",\n value: \"2\"\n }, {\n name: \"军官证或士兵证\",\n value: \"3\"\n }, {\n name: \"港澳通行证/回乡证或台胞证\",\n value: \"6\"\n }, {\n name: \"外国人永久居留身份证\",\n value: \"O\"\n }, {\n name: \"港澳居民居住证\",\n value: \"V\"\n }, {\n name: \"台湾居民居住证\",\n value: \"W\"\n }, {\n name: \"其他\",\n value: \"0\"\n }]\n },\n successMsg: \"更新成功\",\n errorTips: {\n e1: \"请填写姓名信息\",\n e2: \"请选择性别\",\n e3: \"请选择生日\",\n e4: \"请选择证件类型\",\n e5: \"请填写证件号码\",\n e6: \"您填写的证件号码有误\",\n e7: \"您填写的信息有误,请核实后重新提交\"\n }\n },\n index: {\n news: \"新闻资讯\",\n newMore: \"查看更多\",\n recommend: {\n t1: \"在线报价\",\n t2: \"客户服务\",\n t3: \"产品介绍\",\n t4: \"最新消息\",\n item1: {\n btn: \"了解更多产品\",\n t1: \"为自己和家人寻找一份保障\"\n },\n item2: {\n btn: \"立即预约\",\n t1: \"在线预约 专业服务\"\n },\n item3: {\n btn: \"客户服务\",\n t1: \"专业客服为你服务\",\n t2: \"想了解更多,可致电\",\n t3: \"95511\",\n t4: \"联络我们,或进入\"\n }\n }\n },\n complaintAcceptance: {\n name: \"姓名\",\n namePlaceholder: \"姓名\",\n contactType: \"联络方式\",\n email: \"电邮地址\",\n question: \"问题或意见\",\n questionPlaceHolder: \"(字数不超过500字)\",\n orderNo: \"保单编号\",\n orderNoPlaceHolder: \"如您为平安客户,请提供保单编号\",\n contactTime: \"期望联络时间\",\n notice1: \"本表格所收集的个人资料根据「平安人寿香港个人资料收集声明」处理及只会被用作于联络 阁下之用。然而所收集的个人资料未经您明确授权将不会转移至「平安人寿香港个人资料收集声明」列明以外之第三者机构。您可选择不向我们提供所需的个人资料,惟这样可能导致我们不能联络您。您亦可根据「平安人寿香港个人资料收集声明」之权利查阅及更正个人资料。\",\n notice2: \"本人现确认明白并同意本人的个人资料根据中银人寿个人资料收集声明作以上述用途。\",\n contactTypes: [{\n name: '电话',\n value: 1,\n show: \"联络电话\",\n icon: \"mobile\"\n }, {\n name: '电邮',\n value: 2,\n show: \"电邮地址\",\n icon: \"email\"\n }],\n errorTips: {\n e1: \"请填写该项内容\",\n e2: \"请填写正确的联系方式\"\n },\n success: \"感谢您的宝贵意见\"\n },\n reservation: {\n name: \"姓名\",\n namePlaceholder: \"姓名\",\n contactType: \"联络方式\",\n contactTypeCadidates: [{\n name: \"电话\",\n value: 1\n }],\n contact: \"联络电话\",\n contactPlaceholder: \"香港号码/内地号码\",\n reservationType: \"预约类型\",\n reservationCandidates: [{\n name: \"投保咨询\",\n value: \"投保咨询\"\n }, {\n name: \"代办保单变更\",\n value: \"代办保单变更\"\n }],\n reservationRemark: \"预约说明\",\n reservationRemarkPlaceholder: \"请简单说明您想要咨询的产品或业务\",\n hkClient: \"是否平安香港客户\",\n yes: \"是\",\n no: \"否\",\n contactTime: \"期望联络时间\",\n notice1: \"本表格所收集的个人资料根据「平安人寿香港个人资料收集声明」处理及只会被用作于联络 阁下之用。然而所收集的个人资料未经您明确授权将不会转移至「平安人寿香港个人资料收集声明」列明以外之第三者机构。您可选择不向我们提供所需的个人资料,惟这样可能导致我们不能联络您。您亦可根据「平安人寿香港个人资料收集声明」之权利查阅及更正个人资料。\",\n notice2: \"本人现确认明白并同意本人的个人资料根据中银人寿个人资料收集声明作以上述用途。\",\n success: \"提交成功\",\n submitBtn: '确认',\n errorTips: {\n e1: \"请填写该项内容\",\n e2: \"请填写正确的联系方式\"\n }\n },\n paymentType: {\n menu1: \"亲临客服中心付款\",\n menu2: \"网银付款\",\n menu3: \"电汇付款\",\n menu4: \"柜员机付款\",\n menu5: \"「缴费灵」付款\",\n menu6: \"香港邮政局\"\n },\n product: {\n btnPosition: \"预约服务\",\n iconProblem: \"常见问题\",\n iconProcess: \"投保流程\",\n iconProduct: \"产品详情\"\n },\n customProduct: {\n menu1: \"联系我们\",\n menu2: \"缴付保费\",\n menu3: \"保单查询\",\n menu4: \"保单变更\",\n menu5: \"理赔申请\",\n menu6: \"预约服务\",\n menu7: \"投诉受理\",\n menu8: \"常用表格\"\n },\n commonForm: {\n head1: \"表格类型\",\n head2: \"表格名称\",\n head3: \"使用说明\",\n head4: \"附件\",\n download: \"下载文档\",\n form: [{\n type: \"缴费类\",\n list: [{\n name: \"「电子入账服务」及银行户口<br>直接付款授权申请\",\n desc: \"申请设立「电子入账服务」及银行户口<br>直接付款授权时须提供\",\n download: \"\"\n }, {\n name: \"信用卡户口直接付款授权书\",\n desc: \"申请信用卡户口直接付款授权时须提供\",\n download: \"\"\n }]\n }, {\n type: \"保单变更类\",\n list: [{\n name: \"保险合同解除申请书\",\n desc: \"退保、冷静期退保业务适用\",\n download: \"\"\n }, {\n name: \"保险合同变更申请书(保单贷款还款类)\",\n desc: \"保单贷款、还款业务适用\",\n download: \"\"\n }, {\n name: \"保险合同变更申请书(保险合同计划变更类)\",\n desc: \"加保、减保、新增附险、复效等业务适用\",\n download: \"\"\n }, {\n name: \"保险合同变更申请书(客户信息变更类)\",\n desc: \"基本信息变更业务适用\",\n download: \"\"\n }, {\n name: \"保险合同变更申请书(客户权益变更类)\",\n desc: \"交费方式、自垫选择权变更、补发等业务适用\",\n download: \"\"\n }, {\n name: \"授权委托书\",\n desc: \"委托他人代办时须提供\",\n download: \"\"\n }, {\n name: \"税收声明\",\n desc: \"CRS要求\",\n download: \"\"\n }, {\n name: \"健康告知\",\n desc: \"须二次核保的业务须提供\",\n download: \"\"\n }]\n }, {\n type: \"理赔类\",\n list: [{\n name: \"理赔申请书\",\n desc: \"纸质申请的应备文件\",\n download: \"\"\n }]\n }]\n },\n policyChangeGuide: {\n notice: \"如需做其他保单变更\",\n noticeLink: \"联系客服\",\n head1: \"项目\",\n head2: \"具体内容\",\n head3: \"申请资格人\",\n head4: \"受理时间\",\n head5: \"应备材料\",\n download: \"下载文档\",\n form: [{\n project: \"退保\",\n content: \"在冷静期后解除合同,公司将退还保单现金价值或未满期净保费。(待产品精算确认)\",\n applicant: \"投保人\",\n receptionTime: \"保单效力终止前\",\n materialList: [{\n name: \"保险单\"\n }, {\n name: \"申请书\",\n type: 1\n }, {\n name: \"投保人有效身份证件\"\n }, {\n name: \"存折银行卡相关\"\n }]\n }, {\n project: \"冷静期退保\",\n content: \"在冷静期内提出解除合同,公司会无息退还全部保费\",\n applicant: \"投保人\",\n receptionTime: \"冷静期结束前\",\n materialList: [{\n name: \"保险单\"\n }, {\n name: \"申请书\",\n type: 1\n }, {\n name: \"投保人有效身份证件\"\n }, {\n name: \"存折银行卡相关\"\n }, {\n name: \"首期保费发票\"\n }]\n }, {\n project: \"客户资料变更\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m42\"\n },\n content: \"投保人、受保人、受益人的个人信息变更\",\n applicant: \"投保人\",\n receptionTime: \"不限\",\n materialList: [{\n name: \"申请书\",\n type: 1\n }, {\n name: \"必要的证明材料\"\n }]\n }, {\n project: \"联系信息变更\",\n projectType: 1,\n path: \"/custom/service\",\n query: {\n q: \"m43\"\n },\n content: \"地址、电话等信息的变更\",\n applicant: \"投保人\",\n receptionTime: \"不限\",\n materialList: [{\n name: \"申请书\",\n type: 1\n }, {\n name: \"投保人有效身份证件\"\n }]\n }, {\n project: \"交费方式变更\",\n content: \"更改保单的续期交费方式或交费账号\",\n applicant: \"投保人\",\n receptionTime: \"保单交费期满前\",\n materialList: [{\n name: \"申请书\",\n type: 1\n }, {\n name: \"保险单\"\n }]\n }]\n },\n policyChangeContact: {\n phone: \"联系电话\",\n address: \"联系地址\",\n email: \"电邮地址\",\n checkTips: \"本人不同意接收宣传信息\",\n submit: \"确认修改\",\n errorTips: {\n e1: \"请填写正确的联系电话\",\n e2: \"請填寫聯繫地址\",\n e3: \"请填写正确的电邮地址\"\n },\n success: \"更新成功\"\n },\n policyChangeInformation: {\n title: \"客户资料变更\",\n owner: \"投保人\",\n insured: \"受保人\",\n obj: \"变更对象\",\n name: \"姓名\",\n sex: \"性别\",\n birth: \"出生日期\",\n type: \"证件类型\",\n NO: \"证件号码\",\n validityPeriod: \"证件有效期\",\n nationality: \"国籍\",\n employer: \"工作单位\",\n maritalStatus: \"婚姻状况\",\n submit: \"确认修改\",\n upload: \"附件上传\",\n modifyTips1: \"如需修改请\",\n modifyTips2: \"联系客服\",\n success: \"更新成功\"\n },\n contactUs: {\n service: {\n center: {\n title: \"客户服务中心\",\n address: \"地址:香港尖沙嘴港威永金融大楼\",\n time: \"服务时间:星期一至五9:00-18:00\"\n },\n hotline: {\n title: \"客户服务热线\",\n hk: \"香港号码:(852)2983 8866\",\n cn: \"内地号码:(86)40078 95511\",\n time: \"服务时间:星期一至五9:00-18:00\"\n },\n mail: {\n title: \"客户服务电邮\",\n mail: \"cs@pingan.com.hk\"\n }\n },\n pulbic: {\n title: \"微信公众号\",\n m1: \"登陆「微信」APP, 按右上角的「+」按钮並选择「添加朋友」,选择「公众号」 输入并搜索「平安人寿香港」\",\n m2: \"登陆「微信」APP, 按右上角的「+」按钮並选择「扫一扫」扫描下方二维码(放置二维码)\"\n },\n qrcode: {\n title: \"官方公众号\"\n }\n },\n customService: {\n name: \"客户服务\",\n menu1: \"联系我们\",\n menu2: \"缴付保费\",\n menu3: \"保单查询\",\n menu4: \"保单变更\",\n menu41: \"保单变更指引\",\n menu42: \"联系方式变更\",\n menu43: \"客户资料变更\",\n menu5: \"理赔申请\",\n menu6: \"预约服务\",\n menu7: \"投诉受理\",\n menu8: \"常用表格\",\n insuranceQuery: {\n modify: \"修改\",\n InsurantNumber: \"保单号码\",\n Insurant: \"受保人\",\n InsurantName: \"险种名称\",\n InsurantAmount: \"保额\",\n effectiveDate: \"保费到期日\",\n period: \"保障年期\",\n t2Title: \"保單信息\",\n t2n1: \"险种名称\",\n t2n2: \"保额\",\n t2n3: \"生效日期\",\n t2n4: \"保障年期\",\n t2n5: \"受保人姓名(中文)\",\n t2n6: \"受保人姓名(英文)\",\n t2n7: \"出生日期\",\n t2n8: \"证件号码\",\n t3Title: \"客户资料\",\n t3n1: \"投保人姓名(中文)\",\n t3n2: \"投保人姓名(英文)\",\n t3n3: \"出生日期\",\n t3n4: \"证件号码\",\n t3n5: \"联系地址\",\n t3n6: \"居住地址\",\n t3n7: \"手提电话\",\n t3n8: \"电子邮箱\",\n t4Title: \"受益人资料\",\n // t4BeneficiaryInformation\n t4NameCn: \"姓名(中文)\",\n t4NameEn: \"姓名(英文)\",\n t4Relation: \"与受保人关系\",\n t4Allocation: \"分配比例\",\n t5Title: \"缴费资料\",\n t5PaymentPeriod: \"缴费年期\",\n t5PaymentMethod: \"缴费方式\",\n t5PaymentCurrency: \"缴费币种\",\n t5CurrentPremium: \"当期保费\",\n t5PaymentBank: \"缴费银行\",\n t5PaymentAccount: \"缴费账号\",\n t6Title: \"缴费记录\",\n t6PaymentPeriod: \"缴费期\",\n t6PaymentMethod: \"缴费方式\",\n t6ClosingDate: \"实收日期\",\n t6PaymentAmount: \"缴费金额\",\n showMore: \"显示所有保单\",\n noPolicy: \"您还未购买保单,如有疑问请\",\n customService: \"联系客服\"\n },\n unauth: {\n m1: {\n tit: \"如需查询保单请投保人\",\n or: \"/\",\n tail: \"平安一账通账户\"\n },\n m2: {\n tit: \"如需变更保单请投保人\",\n or: \"/\",\n tail: \"平安一账通账户\"\n },\n m3: {\n tit: \"如您有平安一账通账户,可帮助我们更好地为您提供服务,\",\n or: \"/\",\n tail: \"\"\n },\n tips: \"如您有平安一账通账户,可帮助我们更好地为您提供服务\",\n or: \"或\",\n login: \"登录\",\n register: \"注册\",\n baseInfoTip: \"您的完整信息可帮助我们为您提供完整服务\",\n infoBtn: \"前往完善\"\n }\n },\n pagination: {\n firstPage: \"上一页\",\n nextPage: \"下一页\",\n goto: \"跳转\",\n per: \"第\",\n page: \"页\"\n },\n newsDetail: {\n back: \"回到列表页\",\n publishAt: \"发布时间\",\n readers: \"阅读人数\",\n per: \"人\"\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvemguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvemguanM/MjNkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAn55m75b2VJyxcblx0XHRVc2VybmFtZTogJ+eUqOaIt+WQjScsXG5cdFx0UGFzc3dvcmQ6ICflr4bnoIEnLFxuXHRcdENhcHRjaGE6ICfpqozor4HnoIEnLFxuXHRcdExhbmd1YWdlOiAn6K+t6KiAJyxcblx0XHR6aDogJ+S4reaWhycsXG5cdFx0ZW46ICfoi7HmlocnXG5cdH0sXG5cdGdsYmFsVGlwczoge1xuXHRcdHNlc3Npb25Mb3N0OiBcIuS4uuS6huabtOWlveeahOS9k+mqjO+8jOmcgOimgeaCqOeZu+W9leWQjuWGjei/m+ihjOatpOaTjeS9nFwiXG5cdH0sXG5cdGZvcm06IHtcblx0XHRkYXRlUGlja2VyOiB7XG5cdFx0XHRkYXRlUGxhY2Vob2xkZXI6IFwi6K+36YCJ5oup5pel5pyfXCJcblx0XHR9LFxuXHRcdG1vZGFsVXBsb2FkQ2FyZDoge1xuXHRcdFx0dGl0OiBcIuivt+S4iuS8oOivgeS7tui1hOaWmVwiLFxuXHRcdFx0ZnJvbnQ6IFwi6K+B5Lu25q2j6Z2iXCIsXG5cdFx0XHRiYWNrOiBcIuivgeS7tuWPjemdolwiLFxuXHRcdH1cblx0fSxcblx0bmF2OiB7XG5cdFx0bG9naW5EYXRhOiB7XG5cdFx0XHRuYW1lOiBcIueZu+mZhlwiLFxuXHRcdFx0cGF0aDogXCIvbG9naW5cIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5rOo5YaMXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3JlZ2lzdGVyXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi55m76ZmGXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2xvZ2luXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/ruaUueWvhueggVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9wYXNzd29yZC9yZXNldFwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5Liq5Lq65L+h5oGvXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2luZm9tYXRpb24vaW1wcm92ZVwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi55m75Ye6XCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJsb2dvdXRcIlxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0bmF2TGlzdDogW3tcblx0XHRcdG5hbWU6IFwi5Lqn5ZOB5LuL57uNXCIsXG5cdFx0XHRwYXRoOiBcIi9lbXB0eVwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLoh6rmhL/ljLvkv53ln7rmnKzorqHliJJcIixcblx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0dmFsdWU6IFwiZ290b1ZISVNcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXotYTmiJDku73kv53pmalcIixcblx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCLlrqLmiLfmnI3liqFcIixcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9wcm9kdWN0XCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuWuouaIt+acjeWKoeWvvOiIqlwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuiBlOezu+aIkeS7rFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0xXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi57y05LuY5L+d6LS5XCIsXG5cdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53ljZXmn6Xor6JcIixcblx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tM1wiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/neWNleWPmOabtFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW00MVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIueQhui1lOeUs+ivt1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW01XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi6aKE57qm5pyN5YqhXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTZcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXor4nlj5fnkIZcIixcblx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tN1wiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuW4uOeUqOihqOagvFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW04XCJcblx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRuYW1lOiBcIuWFs+S6juaIkeS7rFwiLFxuXHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLmnInlhbPlubPlronpppnmuK9cIixcblx0XHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWFrOWPuOa0u+WKqFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5paw6Ze75Lit5b+DXCIsXG5cdFx0XHRcdHBhdGg6IFwiL25ld3MvbGlzdFwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS8geS4muekvuS8mui0o+S7u1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWllumhueauiuiNo1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRuYW1lOiBcIuWKoOWFpeaIkeS7rFwiLFxuXHRcdFx0cGF0aDogXCIvZW1wdHlcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5LyB5Lia5paH5YyWXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5LqL5Lia5Y+R5bGV5py65LyaXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fVxuXHRcdF1cblx0fSxcblx0Zm9vdGVyOiB7XG5cdFx0aGtQaG9uZTogXCLpppnmuK/lj7fnoIFcIixcblx0XHRjblBob25lOiBcIuWGheWcsOWPt+eggVwiLFxuXHRcdGFib3V0VXM6IFwi5YWz5LqO5oiR5LusXCIsXG5cdFx0Y29tcGFueUludHJvZHVjdGlvbjogXCLpm4blm6Lku4vnu41cIixcblx0XHRuZXdzOiBcIuaWsOmXu+i1hOiur1wiLFxuXHRcdGpvaW5VczogXCLliqDlhaXmiJHku6xcIixcblx0XHRoZWxwQ2VudGVyOiBcIuW4ruWKqeS4reW/g1wiLFxuXHRcdHByaXZhY3k6IFwi6ZqQ56eB5pS/562WXCIsXG5cdFx0dGVybXM6IFwi5L2/55So5p2h5qy+XCIsXG5cdFx0cHJvdG9jb2w6IFwi5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piOXCIsXG5cdFx0bWFwOiBcIue9keermeWcsOWbvlwiLFxuXHRcdGNvbnRhY3RVczogXCLogZTnu5zmiJHku6xcIixcblx0XHRjb250YWN0SW5mb3JtYXRpb246IFwi6IGU57O75pa55byPXCIsXG5cdFx0c2VydmljZTogXCLmnI3liqHnvZHnu5xcIixcblx0XHRxcmNvZGU6IFwi56S+5Lqk5aqS6auUXCIsXG5cdFx0Y29weXJpZ2h0OiBcIueJiOadg+aJgOaciSDCqSDkuK3lm73lubPlronkv53pmanvvIjpm4blm6LvvInogqHku73mnInpmZDlhazlj7jmnKrnu4/orrjlj6/kuI3lvpflpI3liLbjgIHovazovb3miJbmkZjnvJbvvIzov53ogIXlv4XnqbYhXCJcblx0fSxcblx0bG9naW46IHtcblx0XHR0aXRsZTogXCLlubPlronkuIDotKbpgJpcIixcblx0XHRsb2dpblR5cGUxOiBcIui0puWvhueZu+W9lVwiLFxuXHRcdGxvZ2luVHlwZTI6IFwi5Yqo5oCB5a+G56CB55m75b2VXCIsXG5cdFx0YWNjb3VudDogXCLotKblj7dcIixcblx0XHRhY2NvdW50UGxhY2Vob2xkZXI6IFwi6K+36L6T5YWl6K+B5Lu25Y+3L+S4gOi0pumAmueUqOaIt+WQjS/miYvmnLrlj7dcIixcblx0XHRwYXNzd29yZDogXCLlr4bnoIFcIixcblx0XHRwYXNzd29yZFBsYWNlaG9sZGVyOiBcIui+k+WFpeeZu+W9leWvhueggVwiLFxuXHRcdHZlcmlmeVBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpemqjOivgeeggVwiLFxuXHRcdGFncmVlOiBcIuWQjOaEj1wiLFxuXHRcdHByb3RvY29sOiBcIuOAiuW5s+WuieS4gOi0pumAmuS8muWRmOacjeWKoeWNj+iuruOAi1wiLFxuXHRcdGxvZ2luOiBcIueZu+WFpVwiLFxuXHRcdHJlZ2lzdGVyOiBcIuazqOWGjFwiLFxuXHRcdGZvcmdldDogXCLlv5jorrDlr4bnoIFcIixcblx0XHRtb2JpbGU6IFwi5omL5py65Y+3XCIsXG5cdFx0bW9iaWxlUGxhY2Vob2xkZXI6IFwi5omL5py65Y+3XCIsXG5cdFx0dmVyaWZ5Q29kZTogXCLpqozor4HnoIFcIixcblx0XHR2ZXJpZnlDb2RlUGxhY2Vob2xkZXI6IFwi6aqM6K+B56CBXCIsXG5cdFx0dmVyaWZ5Q29kZUdldDogXCLojrflj5bpqozor4HnoIFcIixcblx0XHR0aXBzOiB7XG5cdFx0XHRlMTogXCLor7fovpPlhaXotKblj7fkv6Hmga9cIixcblx0XHRcdGUyOiBcIuivt+i+k+WFpeWvhueggVwiLFxuXHRcdFx0ZTM6IFwi6K+36L6T5YWl5Zu+5YOP6aqM6K+B56CBXCIsXG5cdFx0XHRlNDogXCLor7flkIzmhI/jgIrlubPlronkuIDotKbpgJrkvJrlkZjmnI3liqHljY/orq7jgItcIixcblx0XHRcdGU1OiBcIui0puWPt+aIluWvhueggeS4jeato+ehrlwiLFxuXHRcdFx0b2UwOiBcIuivt+i+k+WFpeato+ehrueahOaJi+acuuWPt1wiLFxuXHRcdFx0b2UxOiBcIuivt+WFiOiOt+WPluefreS/oemqjOivgeeggVwiLFxuXHRcdFx0b2UyOiBcIuivt+i+k+WFpeWbvueJh+mqjOivgeeggVwiLFxuXHRcdFx0b2UzOiBcIuivt+i+k+WFpeefreS/oemqjOivgeeggVwiLFxuXHRcdFx0b2U0OiBcIuefreS/oemqjOivgeeggeS4jeato+ehrlwiLFxuXHRcdH1cblx0fSxcblx0c2Vzc2lvbjoge1xuXHRcdHNpZEV4cGlyZTogXCLplb/ml7bpl7TmnKrmk43kvZzvvIzkuLrkuobmgqjnmoTotKbmiLflronlhajvvIzor7fnmbvlvZXlkI7lho3mk43kvZxcIixcblx0fSxcblx0cmVnaXN0ZXI6IHtcblx0XHRtb2JpbGVPcHRpb25zOiBbe1xuXHRcdFx0dHlwZTogXCJoa1wiLFxuXHRcdFx0bmFtZTogXCLpppnmuK/miYvmnLrlj7dcIixcblx0XHRcdHBsYWNlSG9sZGVyOiBcIuivt+i+k+WFpTjkvY3miYvmnLrlj7fnoIFcIixcblx0XHRcdGFyZWFDb2RlOiBcIis4NTJcIlxuXHRcdH0sIHtcblx0XHRcdHR5cGU6IFwiemhcIixcblx0XHRcdG5hbWU6IFwi5aSn6ZmG5omL5py65Y+3XCIsXG5cdFx0XHRwbGFjZUhvbGRlcjogXCLor7fovpPlhaUxMeS9jeaJi+acuuWPt+eggVwiLFxuXHRcdFx0YXJlYUNvZGU6IFwiKzg2XCJcblx0XHR9XSxcblx0XHRjb3V0VGlwczogXCJ7c2Vjb25kfeenkuWQjumHjeaWsOiOt+WPllwiLFxuXHRcdHRpdGxlOiBcIuasoui/juazqOWGjFwiLFxuXHRcdHRpdGxlMjogXCLor7forr7nva7mlrDnmoTlr4bnoIFcIixcblx0XHRtb2JpbGVQbGFjZWhvbGRlcjogXCLor7fovpPlhaU45L2N5omL5py65Y+356CBXCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpemqjOivgeeggVwiLFxuXHRcdHZlcmlmeUNvZGVHZXQ6IFwi6I635Y+W6aqM6K+B56CBXCIsXG5cdFx0YWdyZWU6IFwi5ZCM5oSPXCIsXG5cdFx0cHJvdG9jb2w6IFwi44CK5bmz5a6J5LiA6LSm6YCa5Lya5ZGY5pyN5Yqh5Y2P6K6u44CLXCIsXG5cdFx0cmVnaXN0ZXI6IFwi54K55Ye75rOo5YaMXCIsXG5cdFx0bmV3UGFzc3dvcmQ6IFwi5paw5a+G56CBXCIsXG5cdFx0bmV3UGFzc3dvcmRQbGFjZWhvbGRlcjogXCLor7fovpPlhaXmlrDlr4bnoIFcIixcblx0XHRuZXdQYXNzd29yZFN1cmU6IFwi56Gu6K6k5a+G56CBXCIsXG5cdFx0bmV3UGFzc3dvcmRTdXJlUGxhY2Vob2xkZXI6IFwi6K+35YaN5qyh6L6T5YWl5paw5a+G56CBXCIsXG5cdFx0c3VyZTogXCLnoa7orqRcIixcblx0XHR0aXBzOiB7XG5cdFx0XHRlMTogXCLmiYvmnLrlj7fkuI3mraPnoa7vvIzor7fovpPlhaXmraPnoa7nmoTmiYvmnLrlj7dcIixcblx0XHRcdGUyOiBcIuivt+WQjOaEj+OAiuW5s+WuieS4gOi0pumAmuS8muWRmOacjeWKoeWNj+iuruOAi1wiLFxuXHRcdFx0ZTM6IFwi55+t5L+h6aqM6K+B56CB5LiN5q2j56GuXCIsXG5cdFx0XHRlNDogXCLor7flhYjojrflj5bnn63kv6Hpqozor4HnoIFcIixcblx0XHRcdGU1OiBcIuaJi+acuuWPt+W3sue7j+iiq+azqOWGjO+8jOivt+S9v+eUqOWFtuS7luaJi+acuuWPt+azqOWGjOaIluebtOaOpeeZu+W9lVwiLFxuXHRcdFx0ZTY6IFwi6K+36L6T5YWl5Zu+54mH6aqM6K+B56CBXCIsXG5cdFx0XHRlNzogXCLlr4bnoIHplb/luqbkuI3og73lsJHkuo445L2NXCIsXG5cdFx0XHRlODogXCLlr4bnoIHlv4XpobvlkIzml7bljIXlkKvmlbDlrZfjgIHlrZfmr43jgIHnibnmrorlrZfnrKZcIixcblx0XHRcdGU5OiBcIuS4pOasoei+k+WFpeeahOWvhueggeS4jeS4gOiHtFwiLFxuXHRcdFx0ZTEwOiBcIumqjOivgeeggei/h+acn++8jOivt+mHjeaWsOeUs+ivt+mqjOivgeeggVwiLFxuXHRcdFx0ZTExOiBcIuazqOWGjOWksei0pe+8jOivt+iBlOezu+W3peS9nOS6uuWRmFwiLFxuXHRcdFx0ZTEyOiBcIuiou+WGiuaIkOWKn1wiLFxuXHRcdH1cblx0fSxcblx0cGFzc3dvcmRDaGVjazoge1xuXHRcdGVycm9yMTogXCLlr4bnoIHplb/luqbkuI3lsJHkuo445L2NXCIsXG5cdFx0ZXJyb3IyOiBcIuWvhueggeS4reW/hemhu+WMheWQq+aVsOWtl+OAgeWtl+espuS7peWPiueJueauiuWPt+eggVwiLFxuXHRcdGVycm9yMzogXCLkuKTmrKHlr4bnoIHkuI3kuIDoh7TvvIzor7fnoa7orqTlkI7ph43mlrDovpPlhaVcIixcblx0XHRlcnJvcjQ6IFwi5a+G56CB5L+u5pS55aSx6LSl77yM6K+356iN5ZCO5YaN6K+V77yM5oiW5ouo5omT5a6i5pyN55S16K+dOTU1MTHop6PlhrNcIixcblx0XHRlcnJvcjU6IFwi5pen5a+G56CB5LiN5q2j56Gu77yM6K+36YeN5paw6L6T5YWlXCIsXG5cdFx0c3VjY2VzczogXCLlr4bnoIHkv67mlLnmiJDlip9cIlxuXHR9LFxuXHRwYXNzd29yZFJlc2V0OiB7XG5cdFx0b2xkUHdkOiBcIuaXp+WvhueggVwiLFxuXHRcdG9sZFB3ZFBsYWNlaG9sZGU6IFwi6K+36L6T5YWl5pen5a+G56CBXCIsXG5cdFx0Y2lkRXhwaXJlOiBcIumVv+aXtumXtOacquaTjeS9nO+8jOS4uuS6huaCqOeahOi0puaIt+WuieWFqO+8jOivt+mHjeaWsOW8gOWni1wiLFxuXHRcdHR5cGUxOiB7XG5cdFx0XHR0aXRsZTogXCLlr4bnoIHmib7lm55cIixcblx0XHRcdHQxOiBcIueUqOaIt+i+k+WFpeS/oeaBr1wiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCLmiYvmnLrlj7cv5LiA6LSm6YCa55So5oi35ZCNL+ivgeS7tuWPt1wiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdFx0ZXJyb3I6IFwi5oKo55qE5omL5py65Y+35oiW6K+B5Lu25Y+36L6T5YWl6ZSZ6K+v77yM6K+35qC45a+55ZCO6YeN5paw6L6T5YWlXCIsXG5cdFx0fSxcblx0XHR0eXBlMjoge1xuXHRcdFx0dGl0bGU6IFwi5a+G56CB5om+5ZueXCIsXG5cdFx0XHR0MTogXCLmiYvmnLrnn63kv6Hpqozor4HnoIFcIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwi6K+36L6T5YWl6aqM6K+B56CBXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56Gu6K6kXCIsXG5cdFx0XHRlcnJvcjE6IFwi55+t5L+h6aqM6K+B56CB6L6T5YWl6ZSZ6K+v77yM6K+35qC45a+55ZCO6YeN5paw6L6T5YWlXCIsXG5cdFx0XHRlcnJvcjI6IFwi55+t5L+h6aqM6K+B56CB5bey57uP6L+H5pyf77yM6K+36YeN5paw6I635Y+W6aqM6K+B56CBXCIsXG5cdFx0XHRlcnJvcjM6IFwi55+t5L+h6aqM6K+B56CB5Y+R5pS+5pe26Ze05bCR5LqOMeWIhumSn++8jOivt+eojeWQjuWGjeivlVwiLFxuXHRcdH0sXG5cdFx0dHlwZTM6IHtcblx0XHRcdHRpdGxlOiBcIuWvhueggeaJvuWbnlwiLFxuXHRcdFx0dDE6IFwi5qC45a+56Lqr5Lu96K+B5L+h5oGvXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdH0sXG5cdFx0dHlwZTQ6IHtcblx0XHRcdHRpdGxlOiBcIuivt+iuvue9ruaWsOeahOWvhueggVwiLFxuXHRcdFx0dDE6IFwi5paw5a+G56CBXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpeaWsOWvhueggVwiLFxuXHRcdFx0dDI6IFwi56Gu6K6k5a+G56CBXCIsXG5cdFx0XHR0MlBsYWNlaG9sZGVyOiBcIuivt+mHjeaWsOi+k+WFpeaWsOWvhueggVwiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdH1cblx0fSxcblx0aW5mb21hdGlvbkltcHJvdmU6IHtcblx0XHR0aXRsZTogXCLor7flrozlloTmgqjnmoTkv6Hmga9cIixcblx0XHR0MTogXCLlp5PlkI1cIixcblx0XHR0MWMxOiBcIuWnk1wiLFxuXHRcdHQxYzI6IFwi5ZCNXCIsXG5cdFx0dDFQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0MjogXCLmgKfliKtcIixcblx0XHR0MlBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQzOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdHQzUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDQ6IFwi6K+B5Lu257G75Z6LXCIsXG5cdFx0dDRQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NTogXCLor4Hku7blj7fnoIFcIixcblx0XHR0NVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHN1Ym1pdDogXCLnoa7orqRcIixcblx0XHRjYW5jZWw6IFwi6Lez6L+HXCIsXG5cdFx0Y2FuZGlkYXRlczoge1xuXHRcdFx0c2V4OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUt1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJNXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlpbNcIixcblx0XHRcdFx0dmFsdWU6IFwiRlwiXG5cdFx0XHR9XSxcblx0XHRcdGlkVHlwZTogW3tcblx0XHRcdFx0bmFtZTogXCLouqvku73or4FcIixcblx0XHRcdFx0dmFsdWU6IFwiMVwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5oqk54WnXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjJcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWGm+WumOivgeaIluWjq+WFteivgVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIzXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPpgJrooYzor4Ev5Zue5Lmh6K+B5oiW5Y+w6IOe6K+BXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjZcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWkluWbveS6uuawuOS5heWxheeVmei6q+S7veivgVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJPXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPlsYXmsJHlsYXkvY/or4FcIixcblx0XHRcdFx0dmFsdWU6IFwiVlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5Y+w5rm+5bGF5rCR5bGF5L2P6K+BXCIsXG5cdFx0XHRcdHZhbHVlOiBcIldcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWFtuS7llwiLFxuXHRcdFx0XHR2YWx1ZTogXCIwXCJcblx0XHRcdH1dXG5cdFx0fSxcblx0XHRzdWNjZXNzTXNnOiBcIuabtOaWsOaIkOWKn1wiLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6K+35aGr5YaZ5aeT5ZCN5L+h5oGvXCIsXG5cdFx0XHRlMjogXCLor7fpgInmi6nmgKfliKtcIixcblx0XHRcdGUzOiBcIuivt+mAieaLqeeUn+aXpVwiLFxuXHRcdFx0ZTQ6IFwi6K+36YCJ5oup6K+B5Lu257G75Z6LXCIsXG5cdFx0XHRlNTogXCLor7floavlhpnor4Hku7blj7fnoIFcIixcblx0XHRcdGU2OiBcIuaCqOWhq+WGmeeahOivgeS7tuWPt+eggeacieivr1wiLFxuXHRcdFx0ZTc6IFwi5oKo5aGr5YaZ55qE5L+h5oGv5pyJ6K+v77yM6K+35qC45a6e5ZCO6YeN5paw5o+Q5LqkXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmRleDoge1xuXHRcdG5ld3M6IFwi5paw6Ze76LWE6K6vXCIsXG5cdFx0bmV3TW9yZTogXCLmn6XnnIvmm7TlpJpcIixcblx0XHRyZWNvbW1lbmQ6IHtcblx0XHRcdHQxOiBcIuWcqOe6v+aKpeS7t1wiLFxuXHRcdFx0dDI6IFwi5a6i5oi35pyN5YqhXCIsXG5cdFx0XHR0MzogXCLkuqflk4Hku4vnu41cIixcblx0XHRcdHQ0OiBcIuacgOaWsOa2iOaBr1wiLFxuXHRcdFx0aXRlbTE6IHtcblx0XHRcdFx0YnRuOiBcIuS6huino+abtOWkmuS6p+WTgVwiLFxuXHRcdFx0XHR0MTogXCLkuLroh6rlt7Hlkozlrrbkurrlr7vmib7kuIDku73kv53pmpxcIixcblx0XHRcdH0sXG5cdFx0XHRpdGVtMjoge1xuXHRcdFx0XHRidG46IFwi56uL5Y2z6aKE57qmXCIsXG5cdFx0XHRcdHQxOiBcIuWcqOe6v+mihOe6piDkuJPkuJrmnI3liqFcIixcblx0XHRcdH0sXG5cdFx0XHRpdGVtMzoge1xuXHRcdFx0XHRidG46IFwi5a6i5oi35pyN5YqhXCIsXG5cdFx0XHRcdHQxOiBcIuS4k+S4muWuouacjeS4uuS9oOacjeWKoVwiLFxuXHRcdFx0XHR0MjogXCLmg7Pkuobop6Pmm7TlpJrvvIzlj6/oh7TnlLVcIixcblx0XHRcdFx0dDM6IFwiOTU1MTFcIixcblx0XHRcdFx0dDQ6IFwi6IGU57uc5oiR5Lus77yM5oiW6L+b5YWlXCIsXG5cdFx0XHR9XG5cdFx0fSxcblx0fSxcblx0Y29tcGxhaW50QWNjZXB0YW5jZToge1xuXHRcdG5hbWU6IFwi5aeT5ZCNXCIsXG5cdFx0bmFtZVBsYWNlaG9sZGVyOiBcIuWnk+WQjVwiLFxuXHRcdGNvbnRhY3RUeXBlOiBcIuiBlOe7nOaWueW8j1wiLFxuXHRcdGVtYWlsOiBcIueUtemCruWcsOWdgFwiLFxuXHRcdHF1ZXN0aW9uOiBcIumXrumimOaIluaEj+ingVwiLFxuXHRcdHF1ZXN0aW9uUGxhY2VIb2xkZXI6IFwi77yI5a2X5pWw5LiN6LaF6L+HNTAw5a2X77yJXCIsXG5cdFx0b3JkZXJObzogXCLkv53ljZXnvJblj7dcIixcblx0XHRvcmRlck5vUGxhY2VIb2xkZXI6IFwi5aaC5oKo5Li65bmz5a6J5a6i5oi377yM6K+35o+Q5L6b5L+d5Y2V57yW5Y+3XCIsXG5cdFx0Y29udGFjdFRpbWU6IFwi5pyf5pyb6IGU57uc5pe26Ze0XCIsXG5cdFx0bm90aWNlMTogXCLmnKzooajmoLzmiYDmlLbpm4bnmoTkuKrkurrotYTmlpnmoLnmja7jgIzlubPlronkurrlr7/pppnmuK/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7jgI3lpITnkIblj4rlj6rkvJrooqvnlKjkvZzkuo7ogZTnu5wg6ZiB5LiL5LmL55So44CC54S26ICM5omA5pS26ZuG55qE5Liq5Lq66LWE5paZ5pyq57uP5oKo5piO56Gu5o6I5p2D5bCG5LiN5Lya6L2s56e76Iez44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5YiX5piO5Lul5aSW5LmL56ys5LiJ6ICF5py65p6E44CC5oKo5Y+v6YCJ5oup5LiN5ZCR5oiR5Lus5o+Q5L6b5omA6ZyA55qE5Liq5Lq66LWE5paZ77yM5oOf6L+Z5qC35Y+v6IO95a+86Ie05oiR5Lus5LiN6IO96IGU57uc5oKo44CC5oKo5Lqm5Y+v5qC55o2u44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5LmL5p2D5Yip5p+l6ZiF5Y+K5pu05q2j5Liq5Lq66LWE5paZ44CCXCIsXG5cdFx0bm90aWNlMjogXCLmnKzkurrnjrDnoa7orqTmmI7nmb3lubblkIzmhI/mnKzkurrnmoTkuKrkurrotYTmlpnmoLnmja7kuK3pk7bkurrlr7/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7kvZzku6XkuIrov7DnlKjpgJTjgIJcIixcblx0XHRjb250YWN0VHlwZXM6IFt7IG5hbWU6ICfnlLXor50nLCB2YWx1ZTogMSwgc2hvdzogXCLogZTnu5znlLXor51cIiwgaWNvbjogXCJtb2JpbGVcIiB9LCB7IG5hbWU6ICfnlLXpgq4nLCB2YWx1ZTogMixzaG93OiBcIueUtemCruWcsOWdgFwiLCBpY29uOiBcImVtYWlsXCIgfV0sXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLor7floavlhpnor6XpobnlhoXlrrlcIixcblx0XHRcdGUyOiBcIuivt+Whq+WGmeato+ehrueahOiBlOezu+aWueW8j1wiXG5cdFx0fSxcblx0XHRzdWNjZXNzOiBcIuaEn+iwouaCqOeahOWunei0teaEj+ingVwiXG5cdH0sXG5cdHJlc2VydmF0aW9uOiB7XG5cdFx0bmFtZTogXCLlp5PlkI1cIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwi5aeT5ZCNXCIsXG5cdFx0Y29udGFjdFR5cGU6IFwi6IGU57uc5pa55byPXCIsXG5cdFx0Y29udGFjdFR5cGVDYWRpZGF0ZXM6IFt7IG5hbWU6IFwi55S16K+dXCIsIHZhbHVlOiAxIH1dLFxuXHRcdGNvbnRhY3Q6IFwi6IGU57uc55S16K+dXCIsXG5cdFx0Y29udGFjdFBsYWNlaG9sZGVyOiBcIummmea4r+WPt+eggS/lhoXlnLDlj7fnoIFcIixcblx0XHRyZXNlcnZhdGlvblR5cGU6IFwi6aKE57qm57G75Z6LXCIsXG5cdFx0cmVzZXJ2YXRpb25DYW5kaWRhdGVzOiBbXG5cdFx0XHR7IG5hbWU6IFwi5oqV5L+d5ZKo6K+iXCIsIHZhbHVlOiBcIuaKleS/neWSqOivolwiIH0sXG5cdFx0XHR7IG5hbWU6IFwi5Luj5Yqe5L+d5Y2V5Y+Y5pu0XCIsIHZhbHVlOiBcIuS7o+WKnuS/neWNleWPmOabtFwiIH1cblx0XHRdLFxuXHRcdHJlc2VydmF0aW9uUmVtYXJrOiBcIumihOe6puivtOaYjlwiLFxuXHRcdHJlc2VydmF0aW9uUmVtYXJrUGxhY2Vob2xkZXI6IFwi6K+3566A5Y2V6K+05piO5oKo5oOz6KaB5ZKo6K+i55qE5Lqn5ZOB5oiW5Lia5YqhXCIsXG5cdFx0aGtDbGllbnQ6IFwi5piv5ZCm5bmz5a6J6aaZ5riv5a6i5oi3XCIsXG5cdFx0eWVzOiBcIuaYr1wiLFxuXHRcdG5vOiBcIuWQplwiLFxuXHRcdGNvbnRhY3RUaW1lOiBcIuacn+acm+iBlOe7nOaXtumXtFwiLFxuXHRcdG5vdGljZTE6IFwi5pys6KGo5qC85omA5pS26ZuG55qE5Liq5Lq66LWE5paZ5qC55o2u44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5aSE55CG5Y+K5Y+q5Lya6KKr55So5L2c5LqO6IGU57ucIOmYgeS4i+S5i+eUqOOAgueEtuiAjOaJgOaUtumbhueahOS4quS6uui1hOaWmeacque7j+aCqOaYjuehruaOiOadg+WwhuS4jeS8mui9rOenu+iHs+OAjOW5s+WuieS6uuWvv+mmmea4r+S4quS6uui1hOaWmeaUtumbhuWjsOaYjuOAjeWIl+aYjuS7peWkluS5i+esrOS4ieiAheacuuaehOOAguaCqOWPr+mAieaLqeS4jeWQkeaIkeS7rOaPkOS+m+aJgOmcgOeahOS4quS6uui1hOaWme+8jOaDn+i/meagt+WPr+iDveWvvOiHtOaIkeS7rOS4jeiDveiBlOe7nOaCqOOAguaCqOS6puWPr+agueaNruOAjOW5s+WuieS6uuWvv+mmmea4r+S4quS6uui1hOaWmeaUtumbhuWjsOaYjuOAjeS5i+adg+WIqeafpemYheWPiuabtOato+S4quS6uui1hOaWmeOAglwiLFxuXHRcdG5vdGljZTI6IFwi5pys5Lq6546w56Gu6K6k5piO55m95bm25ZCM5oSP5pys5Lq655qE5Liq5Lq66LWE5paZ5qC55o2u5Lit6ZO25Lq65a+/5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO5L2c5Lul5LiK6L+w55So6YCU44CCXCIsXG5cdFx0c3VjY2VzczogXCLmj5DkuqTmiJDlip9cIixcblx0XHRzdWJtaXRCdG46ICfnoa7orqQnLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6K+35aGr5YaZ6K+l6aG55YaF5a65XCIsXG5cdFx0XHRlMjogXCLor7floavlhpnmraPnoa7nmoTogZTns7vmlrnlvI9cIlxuXHRcdH1cblx0fSxcblx0cGF5bWVudFR5cGU6IHtcblx0XHRtZW51MTogXCLkurLkuLTlrqLmnI3kuK3lv4Pku5jmrL5cIixcblx0XHRtZW51MjogXCLnvZHpk7bku5jmrL5cIixcblx0XHRtZW51MzogXCLnlLXmsYfku5jmrL5cIixcblx0XHRtZW51NDogXCLmn5zlkZjmnLrku5jmrL5cIixcblx0XHRtZW51NTogXCLjgIznvLTotLnngbXjgI3ku5jmrL5cIixcblx0XHRtZW51NjogXCLpppnmuK/pgq7mlL/lsYBcIixcblx0fSxcblx0cHJvZHVjdDoge1xuXHRcdGJ0blBvc2l0aW9uOiBcIumihOe6puacjeWKoVwiLFxuXHRcdGljb25Qcm9ibGVtOiBcIuW4uOingemXrumimFwiLFxuXHRcdGljb25Qcm9jZXNzOiBcIuaKleS/nea1geeoi1wiLFxuXHRcdGljb25Qcm9kdWN0OiBcIuS6p+WTgeivpuaDhVwiXG5cdH0sXG5cdGN1c3RvbVByb2R1Y3Q6IHtcblx0XHRtZW51MTogXCLogZTns7vmiJHku6xcIixcblx0XHRtZW51MjogXCLnvLTku5jkv53otLlcIixcblx0XHRtZW51MzogXCLkv53ljZXmn6Xor6JcIixcblx0XHRtZW51NDogXCLkv53ljZXlj5jmm7RcIixcblx0XHRtZW51NTogXCLnkIbotZTnlLPor7dcIixcblx0XHRtZW51NjogXCLpooTnuqbmnI3liqFcIixcblx0XHRtZW51NzogXCLmipXor4nlj5fnkIZcIixcblx0XHRtZW51ODogXCLluLjnlKjooajmoLxcIixcblx0fSxcblx0Y29tbW9uRm9ybToge1xuXHRcdGhlYWQxOiBcIuihqOagvOexu+Wei1wiLFxuXHRcdGhlYWQyOiBcIuihqOagvOWQjeensFwiLFxuXHRcdGhlYWQzOiBcIuS9v+eUqOivtOaYjlwiLFxuXHRcdGhlYWQ0OiBcIumZhOS7tlwiLFxuXHRcdGRvd25sb2FkOiBcIuS4i+i9veaWh+aho1wiLFxuXHRcdGZvcm06IFt7XG5cdFx0XHR0eXBlOiBcIue8tOi0ueexu1wiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLjgIznlLXlrZDlhaXotKbmnI3liqHjgI3lj4rpk7booYzmiLflj6M8YnI+55u05o6l5LuY5qy+5o6I5p2D55Sz6K+3XCIsXG5cdFx0XHRcdGRlc2M6IFwi55Sz6K+36K6+56uL44CM55S15a2Q5YWl6LSm5pyN5Yqh44CN5Y+K6ZO26KGM5oi35Y+jPGJyPuebtOaOpeS7mOasvuaOiOadg+aXtumhu+aPkOS+m1wiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5L+h55So5Y2h5oi35Y+j55u05o6l5LuY5qy+5o6I5p2D5LmmXCIsXG5cdFx0XHRcdGRlc2M6IFwi55Sz6K+35L+h55So5Y2h5oi35Y+j55u05o6l5LuY5qy+5o6I5p2D5pe26aG75o+Q5L6bXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCLkv53ljZXlj5jmm7TnsbtcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zmp5ZCI5ZCM6Kej6Zmk55Sz6K+35LmmXCIsXG5cdFx0XHRcdGRlc2M6IFwi6YCA5L+d44CB5Ya36Z2Z5pyf6YCA5L+d5Lia5Yqh6YCC55SoXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53pmanlkIjlkIzlj5jmm7TnlLPor7fkuabvvIjkv53ljZXotLfmrL7ov5jmrL7nsbvvvIlcIixcblx0XHRcdFx0ZGVzYzogXCLkv53ljZXotLfmrL7jgIHov5jmrL7kuJrliqHpgILnlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemZqeWQiOWQjOWPmOabtOeUs+ivt+S5pu+8iOS/nemZqeWQiOWQjOiuoeWIkuWPmOabtOexu++8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIuWKoOS/neOAgeWHj+S/neOAgeaWsOWinumZhOmZqeOAgeWkjeaViOetieS4muWKoemAgueUqFwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zmp5ZCI5ZCM5Y+Y5pu055Sz6K+35Lmm77yI5a6i5oi35L+h5oGv5Y+Y5pu057G777yJXCIsXG5cdFx0XHRcdGRlc2M6IFwi5Z+65pys5L+h5oGv5Y+Y5pu05Lia5Yqh6YCC55SoXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53pmanlkIjlkIzlj5jmm7TnlLPor7fkuabvvIjlrqLmiLfmnYPnm4rlj5jmm7TnsbvvvIlcIixcblx0XHRcdFx0ZGVzYzogXCLkuqTotLnmlrnlvI/jgIHoh6rlnqvpgInmi6nmnYPlj5jmm7TjgIHooaXlj5HnrYnkuJrliqHpgILnlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuaOiOadg+WnlOaJmOS5plwiLFxuXHRcdFx0XHRkZXNjOiBcIuWnlOaJmOS7luS6uuS7o+WKnuaXtumhu+aPkOS+m1wiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi56iO5pS25aOw5piOXCIsXG5cdFx0XHRcdGRlc2M6IFwiQ1JT6KaB5rGCXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlgaXlurflkYrnn6VcIixcblx0XHRcdFx0ZGVzYzogXCLpobvkuozmrKHmoLjkv53nmoTkuJrliqHpobvmj5DkvptcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XG5cblx0XHRcdF1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHR5cGU6IFwi55CG6LWU57G7XCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueQhui1lOeUs+ivt+S5plwiLFxuXHRcdFx0XHRkZXNjOiBcIue6uOi0qOeUs+ivt+eahOW6lOWkh+aWh+S7tlwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH1dXG5cdFx0fSxcblx0XHRdXG5cdH0sXG5cdHBvbGljeUNoYW5nZUd1aWRlOiB7XG5cdFx0bm90aWNlOiBcIuWmgumcgOWBmuWFtuS7luS/neWNleWPmOabtFwiLFxuXHRcdG5vdGljZUxpbms6IFwi6IGU57O75a6i5pyNXCIsXG5cdFx0aGVhZDE6IFwi6aG555uuXCIsXG5cdFx0aGVhZDI6IFwi5YW35L2T5YaF5a65XCIsXG5cdFx0aGVhZDM6IFwi55Sz6K+36LWE5qC85Lq6XCIsXG5cdFx0aGVhZDQ6IFwi5Y+X55CG5pe26Ze0XCIsXG5cdFx0aGVhZDU6IFwi5bqU5aSH5p2Q5paZXCIsXG5cdFx0ZG93bmxvYWQ6IFwi5LiL6L295paH5qGjXCIsXG5cdFx0Zm9ybTogW3tcblx0XHRcdHByb2plY3Q6IFwi6YCA5L+dXCIsXG5cdFx0XHRjb250ZW50OiBcIuWcqOWGt+mdmeacn+WQjuino+mZpOWQiOWQjO+8jOWFrOWPuOWwhumAgOi/mOS/neWNleeOsOmHkeS7t+WAvOaIluacqua7oeacn+WHgOS/nei0ueOAgu+8iOW+heS6p+WTgeeyvueul+ehruiupO+8iVwiLFxuXHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCLkv53ljZXmlYjlipvnu4jmraLliY1cIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLkv53pmanljZVcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi55Sz6K+35LmmXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuaKleS/neS6uuacieaViOi6q+S7veivgeS7tlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlrZjmipjpk7booYzljaHnm7jlhbNcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIuWGt+mdmeacn+mAgOS/nVwiLFxuXHRcdFx0Y29udGVudDogXCLlnKjlhrfpnZnmnJ/lhoXmj5Dlh7rop6PpmaTlkIjlkIzvvIzlhazlj7jkvJrml6Dmga/pgIDov5jlhajpg6jkv53otLlcIixcblx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5Ya36Z2Z5pyf57uT5p2f5YmNXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zmp5Y2VXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIueUs+ivt+S5plwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXkv53kurrmnInmlYjouqvku73or4Hku7ZcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5a2Y5oqY6ZO26KGM5Y2h55u45YWzXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIummluacn+S/nei0ueWPkeelqFwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwi5a6i5oi36LWE5paZ5Y+Y5pu0XCIsXG5cdFx0XHRwcm9qZWN0VHlwZTogMSxcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlXCIsXG5cdFx0XHRxdWVyeToge1xuXHRcdFx0XHRxOiBcIm00MlwiXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogXCLmipXkv53kurrjgIHlj5fkv53kurrjgIHlj5fnm4rkurrnmoTkuKrkurrkv6Hmga/lj5jmm7RcIixcblx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5LiN6ZmQXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55Sz6K+35LmmXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuW/heimgeeahOivgeaYjuadkOaWmVwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwi6IGU57O75L+h5oGv5Y+Y5pu0XCIsXG5cdFx0XHRwcm9qZWN0VHlwZTogMSxcblx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlXCIsXG5cdFx0XHRxdWVyeToge1xuXHRcdFx0XHRxOiBcIm00M1wiXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogXCLlnLDlnYDjgIHnlLXor53nrYnkv6Hmga/nmoTlj5jmm7RcIixcblx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5LiN6ZmQXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55Sz6K+35LmmXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuaKleS/neS6uuacieaViOi6q+S7veivgeS7tlwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwi5Lqk6LS55pa55byP5Y+Y5pu0XCIsXG5cdFx0XHRjb250ZW50OiBcIuabtOaUueS/neWNleeahOe7reacn+S6pOi0ueaWueW8j+aIluS6pOi0uei0puWPt1wiLFxuXHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCLkv53ljZXkuqTotLnmnJ/mu6HliY1cIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLnlLPor7fkuaZcIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zmp5Y2VXCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0XVxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VDb250YWN0OiB7XG5cdFx0cGhvbmU6IFwi6IGU57O755S16K+dXCIsXG5cdFx0YWRkcmVzczogXCLogZTns7vlnLDlnYBcIixcblx0XHRlbWFpbDogXCLnlLXpgq7lnLDlnYBcIixcblx0XHRjaGVja1RpcHM6IFwi5pys5Lq65LiN5ZCM5oSP5o6l5pS25a6j5Lyg5L+h5oGvXCIsXG5cdFx0c3VibWl0OiBcIuehruiupOS/ruaUuVwiLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6K+35aGr5YaZ5q2j56Gu55qE6IGU57O755S16K+dXCIsXG5cdFx0XHRlMjogXCLoq4vloavlr6voga/nuavlnLDlnYBcIixcblx0XHRcdGUzOiBcIuivt+Whq+WGmeato+ehrueahOeUtemCruWcsOWdgFwiXG5cdFx0fSxcblx0XHRzdWNjZXNzOiBcIuabtOaWsOaIkOWKn1wiLFxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VJbmZvcm1hdGlvbjoge1xuXHRcdHRpdGxlOiBcIuWuouaIt+i1hOaWmeWPmOabtFwiLFxuXHRcdG93bmVyOiBcIuaKleS/neS6ulwiLFxuXHRcdGluc3VyZWQ6IFwi5Y+X5L+d5Lq6XCIsXG5cdFx0b2JqOiBcIuWPmOabtOWvueixoVwiLFxuXHRcdG5hbWU6IFwi5aeT5ZCNXCIsXG5cdFx0c2V4OiBcIuaAp+WIq1wiLFxuXHRcdGJpcnRoOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdHR5cGU6IFwi6K+B5Lu257G75Z6LXCIsXG5cdFx0Tk86IFwi6K+B5Lu25Y+356CBXCIsXG5cdFx0dmFsaWRpdHlQZXJpb2Q6IFwi6K+B5Lu25pyJ5pWI5pyfXCIsXG5cdFx0bmF0aW9uYWxpdHk6IFwi5Zu957GNXCIsXG5cdFx0ZW1wbG95ZXI6IFwi5bel5L2c5Y2V5L2NXCIsXG5cdFx0bWFyaXRhbFN0YXR1czogXCLlqZrlp7vnirblhrVcIixcblx0XHRzdWJtaXQ6IFwi56Gu6K6k5L+u5pS5XCIsXG5cdFx0dXBsb2FkOiBcIumZhOS7tuS4iuS8oFwiLFxuXHRcdG1vZGlmeVRpcHMxOiBcIuWmgumcgOS/ruaUueivt1wiLFxuXHRcdG1vZGlmeVRpcHMyOiBcIuiBlOezu+WuouacjVwiLFxuXHRcdHN1Y2Nlc3M6IFwi5pu05paw5oiQ5YqfXCIsXG5cdH0sXG5cdGNvbnRhY3RVczoge1xuXHRcdHNlcnZpY2U6IHtcblx0XHRcdGNlbnRlcjoge1xuXHRcdFx0XHR0aXRsZTogXCLlrqLmiLfmnI3liqHkuK3lv4NcIixcblx0XHRcdFx0YWRkcmVzczogXCLlnLDlnYDvvJrpppnmuK/lsJbmspnlmLTmuK/lqIHmsLjph5Hono3lpKfmpbxcIixcblx0XHRcdFx0dGltZTogXCLmnI3liqHml7bpl7TvvJrmmJ/mnJ/kuIDoh7PkupQ5OjAwLTE4OjAwXCIsXG5cdFx0XHR9LFxuXHRcdFx0aG90bGluZToge1xuXHRcdFx0XHR0aXRsZTogXCLlrqLmiLfmnI3liqHng63nur9cIixcblx0XHRcdFx0aGs6IFwi6aaZ5riv5Y+356CB77yaKDg1MikyOTgzIDg4NjZcIixcblx0XHRcdFx0Y246IFwi5YaF5Zyw5Y+356CB77yaKDg2KTQwMDc4IDk1NTExXCIsXG5cdFx0XHRcdHRpbWU6IFwi5pyN5Yqh5pe26Ze077ya5pif5pyf5LiA6Iez5LqUOTowMC0xODowMFwiXG5cdFx0XHR9LFxuXHRcdFx0bWFpbDoge1xuXHRcdFx0XHR0aXRsZTogXCLlrqLmiLfmnI3liqHnlLXpgq5cIixcblx0XHRcdFx0bWFpbDogXCJjc0BwaW5nYW4uY29tLmhrXCJcblx0XHRcdH1cblx0XHR9LFxuXHRcdHB1bGJpYzoge1xuXHRcdFx0dGl0bGU6IFwi5b6u5L+h5YWs5LyX5Y+3XCIsXG5cdFx0XHRtMTogXCLnmbvpmYbjgIzlvq7kv6HjgI1BUFDvvIwg5oyJ5Y+z5LiK6KeS55qE44CMK+OAjeaMiemSruS4pumAieaLqeOAjOa3u+WKoOaci+WPi+OAje+8jOmAieaLqeOAjOWFrOS8l+WPt+OAjSDovpPlhaXlubbmkJzntKLjgIzlubPlronkurrlr7/pppnmuK/jgI1cIixcblx0XHRcdG0yOiBcIueZu+mZhuOAjOW+ruS/oeOAjUFQUO+8jCDmjInlj7PkuIrop5LnmoTjgIwr44CN5oyJ6ZKu5Lim6YCJ5oup44CM5omr5LiA5omr44CN5omr5o+P5LiL5pa55LqM57u056CB77yI5pS+572u5LqM57u056CB77yJXCJcblx0XHR9LFxuXHRcdHFyY29kZToge1xuXHRcdFx0dGl0bGU6IFwi5a6Y5pa55YWs5LyX5Y+3XCJcblx0XHR9XG5cdH0sXG5cdGN1c3RvbVNlcnZpY2U6IHtcblx0XHRuYW1lOiBcIuWuouaIt+acjeWKoVwiLFxuXHRcdG1lbnUxOiBcIuiBlOezu+aIkeS7rFwiLFxuXHRcdG1lbnUyOiBcIue8tOS7mOS/nei0uVwiLFxuXHRcdG1lbnUzOiBcIuS/neWNleafpeivolwiLFxuXHRcdG1lbnU0OiBcIuS/neWNleWPmOabtFwiLFxuXHRcdG1lbnU0MTogXCLkv53ljZXlj5jmm7TmjIflvJVcIixcblx0XHRtZW51NDI6IFwi6IGU57O75pa55byP5Y+Y5pu0XCIsXG5cdFx0bWVudTQzOiBcIuWuouaIt+i1hOaWmeWPmOabtFwiLFxuXHRcdG1lbnU1OiBcIueQhui1lOeUs+ivt1wiLFxuXHRcdG1lbnU2OiBcIumihOe6puacjeWKoVwiLFxuXHRcdG1lbnU3OiBcIuaKleivieWPl+eQhlwiLFxuXHRcdG1lbnU4OiBcIuW4uOeUqOihqOagvFwiLFxuXHRcdGluc3VyYW5jZVF1ZXJ5OiB7XG5cdFx0XHRtb2RpZnk6IFwi5L+u5pS5XCIsXG5cblx0XHRcdEluc3VyYW50TnVtYmVyOiBcIuS/neWNleWPt+eggVwiLFxuXHRcdFx0SW5zdXJhbnQ6IFwi5Y+X5L+d5Lq6XCIsXG5cdFx0XHRJbnN1cmFudE5hbWU6IFwi6Zmp56eN5ZCN56ewXCIsXG5cdFx0XHRJbnN1cmFudEFtb3VudDogXCLkv53pop1cIixcblx0XHRcdGVmZmVjdGl2ZURhdGU6IFwi5L+d6LS55Yiw5pyf5pelXCIsXG5cdFx0XHRwZXJpb2Q6IFwi5L+d6Zqc5bm05pyfXCIsXG5cblxuXHRcdFx0dDJUaXRsZTogXCLkv53llq7kv6Hmga9cIixcblx0XHRcdHQybjE6IFwi6Zmp56eN5ZCN56ewXCIsXG5cdFx0XHR0Mm4yOiBcIuS/neminVwiLFxuXHRcdFx0dDJuMzogXCLnlJ/mlYjml6XmnJ9cIixcblx0XHRcdHQybjQ6IFwi5L+d6Zqc5bm05pyfXCIsXG5cdFx0XHR0Mm41OiBcIuWPl+S/neS6uuWnk+WQje+8iOS4reaWh++8iVwiLFxuXHRcdFx0dDJuNjogXCLlj5fkv53kurrlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQybjc6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0XHR0Mm44OiBcIuivgeS7tuWPt+eggVwiLFxuXG5cdFx0XHR0M1RpdGxlOiBcIuWuouaIt+i1hOaWmVwiLFxuXHRcdFx0dDNuMTogXCLmipXkv53kurrlp5PlkI3vvIjkuK3mlofvvIlcIixcblx0XHRcdHQzbjI6IFwi5oqV5L+d5Lq65aeT5ZCN77yI6Iux5paH77yJXCIsXG5cdFx0XHR0M24zOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdFx0dDNuNDogXCLor4Hku7blj7fnoIFcIixcblx0XHRcdHQzbjU6IFwi6IGU57O75Zyw5Z2AXCIsXG5cdFx0XHR0M242OiBcIuWxheS9j+WcsOWdgFwiLFxuXHRcdFx0dDNuNzogXCLmiYvmj5DnlLXor51cIixcblx0XHRcdHQzbjg6IFwi55S15a2Q6YKu566xXCIsXG5cblx0XHRcdHQ0VGl0bGU6IFwi5Y+X55uK5Lq66LWE5paZXCIsIC8vIHQ0QmVuZWZpY2lhcnlJbmZvcm1hdGlvblxuXHRcdFx0dDROYW1lQ246IFwi5aeT5ZCN77yI5Lit5paH77yJXCIsXG5cdFx0XHR0NE5hbWVFbjogXCLlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQ0UmVsYXRpb246IFwi5LiO5Y+X5L+d5Lq65YWz57O7XCIsXG5cdFx0XHR0NEFsbG9jYXRpb246IFwi5YiG6YWN5q+U5L6LXCIsXG5cblx0XHRcdHQ1VGl0bGU6IFwi57y06LS56LWE5paZXCIsXG5cdFx0XHR0NVBheW1lbnRQZXJpb2Q6IFwi57y06LS55bm05pyfXCIsXG5cdFx0XHR0NVBheW1lbnRNZXRob2Q6IFwi57y06LS55pa55byPXCIsXG5cdFx0XHR0NVBheW1lbnRDdXJyZW5jeTogXCLnvLTotLnluIHnp41cIixcblx0XHRcdHQ1Q3VycmVudFByZW1pdW06IFwi5b2T5pyf5L+d6LS5XCIsXG5cdFx0XHR0NVBheW1lbnRCYW5rOiBcIue8tOi0uemTtuihjFwiLFxuXHRcdFx0dDVQYXltZW50QWNjb3VudDogXCLnvLTotLnotKblj7dcIixcblxuXHRcdFx0dDZUaXRsZTogXCLnvLTotLnorrDlvZVcIixcblx0XHRcdHQ2UGF5bWVudFBlcmlvZDogXCLnvLTotLnmnJ9cIixcblx0XHRcdHQ2UGF5bWVudE1ldGhvZDogXCLnvLTotLnmlrnlvI9cIixcblx0XHRcdHQ2Q2xvc2luZ0RhdGU6IFwi5a6e5pS25pel5pyfXCIsXG5cdFx0XHR0NlBheW1lbnRBbW91bnQ6IFwi57y06LS56YeR6aKdXCIsXG5cblx0XHRcdHNob3dNb3JlOiBcIuaYvuekuuaJgOacieS/neWNlVwiLFxuXHRcdFx0bm9Qb2xpY3k6IFwi5oKo6L+Y5pyq6LSt5Lmw5L+d5Y2V77yM5aaC5pyJ55aR6Zeu6K+3XCIsXG5cdFx0XHRjdXN0b21TZXJ2aWNlOiBcIuiBlOezu+WuouacjVwiLFxuXHRcdH0sXG5cdFx0dW5hdXRoOiB7XG5cblx0XHRcdG0xOiB7XG5cdFx0XHRcdHRpdDogXCLlpoLpnIDmn6Xor6Lkv53ljZXor7fmipXkv53kurpcIixcblx0XHRcdFx0b3I6IFwiL1wiLFxuXHRcdFx0XHR0YWlsOiBcIuW5s+WuieS4gOi0pumAmui0puaIt1wiXG5cdFx0XHR9LFxuXHRcdFx0bTI6IHtcblx0XHRcdFx0dGl0OiBcIuWmgumcgOWPmOabtOS/neWNleivt+aKleS/neS6ulwiLFxuXHRcdFx0XHRvcjogXCIvXCIsXG5cdFx0XHRcdHRhaWw6IFwi5bmz5a6J5LiA6LSm6YCa6LSm5oi3XCJcblx0XHRcdH0sXG5cdFx0XHRtMzoge1xuXHRcdFx0XHR0aXQ6IFwi5aaC5oKo5pyJ5bmz5a6J5LiA6LSm6YCa6LSm5oi377yM5Y+v5biu5Yqp5oiR5Lus5pu05aW95Zyw5Li65oKo5o+Q5L6b5pyN5Yqh77yMXCIsXG5cdFx0XHRcdG9yOiBcIi9cIixcblx0XHRcdFx0dGFpbDogXCJcIlxuXHRcdFx0fSxcblxuXHRcdFx0dGlwczogXCLlpoLmgqjmnInlubPlronkuIDotKbpgJrotKbmiLfvvIzlj6/luK7liqnmiJHku6zmm7Tlpb3lnLDkuLrmgqjmj5DkvpvmnI3liqFcIixcblx0XHRcdG9yOiBcIuaIllwiLFxuXHRcdFx0bG9naW46IFwi55m75b2VXCIsXG5cdFx0XHRyZWdpc3RlcjogXCLms6jlhoxcIixcblx0XHRcdGJhc2VJbmZvVGlwOiBcIuaCqOeahOWujOaVtOS/oeaBr+WPr+W4ruWKqeaIkeS7rOS4uuaCqOaPkOS+m+WujOaVtOacjeWKoVwiLFxuXHRcdFx0aW5mb0J0bjogXCLliY3lvoDlrozlloRcIlxuXHRcdH1cblx0fSxcblx0cGFnaW5hdGlvbjoge1xuXHRcdGZpcnN0UGFnZTogXCLkuIrkuIDpobVcIixcblx0XHRuZXh0UGFnZTogXCLkuIvkuIDpobVcIixcblx0XHRnb3RvOiBcIui3s+i9rFwiLFxuXHRcdHBlcjogXCLnrKxcIixcblx0XHRwYWdlOiBcIumhtVwiXG5cdH0sXG5cdG5ld3NEZXRhaWw6IHtcblx0XHRiYWNrOiBcIuWbnuWIsOWIl+ihqOmhtVwiLFxuXHRcdHB1Ymxpc2hBdDogXCLlj5HluIPml7bpl7RcIixcblx0XHRyZWFkZXJzOiBcIumYheivu+S6uuaVsFwiLFxuXHRcdHBlcjogXCLkurpcIlxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUExQkE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFGQTtBQVJBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBbkNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQWxCQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFQQTtBQWpIQTtBQWdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBbkJBO0FBZ0NBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBMUJBO0FBeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQTFCQTtBQW1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQTdCQTtBQWtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQW5EQTtBQTZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBYkE7QUFIQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQWpCQTtBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBdEJBO0FBMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFQQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBckNBO0FBOENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUZBO0FBakVBO0FBMkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBSUE7QUFEQTtBQWZBO0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQUlBO0FBREE7QUFJQTtBQURBO0FBbEJBO0FBd0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQWRBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQWRBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBVEE7QUExRkE7QUEwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBWEE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxCQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUZBO0FBWkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFEQTtBQXZCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyREE7QUF1REE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2QkE7QUFwRUE7QUE4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFseEJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/common/lang/zh.js\n");
/***/ }),
/***/ "./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&":
/*!***************************************************************************!*\
!*** ./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js& ***!
\***************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./dropdown.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24uanM/ZjBjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0xMi0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fYmFiZWwtbG9hZGVyQDguMC42QGJhYmVsLWxvYWRlci9saWIvaW5kZXguanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19lc2xpbnQtbG9hZGVyQDIuMi4xQGVzbGludC1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTMtMCEuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0xMi0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fYmFiZWwtbG9hZGVyQDguMC42QGJhYmVsLWxvYWRlci9saWIvaW5kZXguanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19lc2xpbnQtbG9hZGVyQDIuMi4xQGVzbGludC1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTMtMCEuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/components/home/dropdown/dropdown.vue":
/*!***************************************************!*\
!*** ./src/components/home/dropdown/dropdown.vue ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n/* harmony import */ var _dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown.js?vue&type=script&lang=js& */ \"./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"3b4f35af\",\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('3b4f35af')) {\n api.createRecord('3b4f35af', component.options)\n } else {\n api.reload('3b4f35af', component.options)\n }\n module.hot.accept(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n(function () {\n api.rerender('3b4f35af', {\n render: _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/components/home/dropdown/dropdown.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlPzI1YWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2I0ZjM1YWYmc2NvcGVkPXRydWUmXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjNiNGYzNWFmXCIsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIHZhciBhcGkgPSByZXF1aXJlKFwiL1VzZXJzL2pvZS9Eb2N1bWVudHMvZ2l0L3Bpbmdhbi9oa2xpZmUvcGluZ2FuLWxpZmUtaW5kZXgtcHJvL25vZGVfbW9kdWxlcy9fdnVlLWhvdC1yZWxvYWQtYXBpQDIuMy40QHZ1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnM2I0ZjM1YWYnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnM2I0ZjM1YWYnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnM2I0ZjM1YWYnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYjRmMzVhZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCczYjRmMzVhZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9kcm9wZG93bi9kcm9wZG93bi52dWVcIlxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue\n");
/***/ }),
/***/ "./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!*************************************************************************************************************!*\
!*** ./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
\*************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT9iY2E3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9M2I0ZjM1YWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&":
/*!**********************************************************************************************!*\
!*** ./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& ***!
\**********************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYjRmMzVhZiZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT9hMTA1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCItIWNhY2hlLWxvYWRlcj97XFxcImNhY2hlRGlyZWN0b3J5XFxcIjpcXFwibm9kZV9tb2R1bGVzLy5jYWNoZS92dWUtbG9hZGVyXFxcIixcXFwiY2FjaGVJZGVudGlmaWVyXFxcIjpcXFwiMzkwN2JiY2EtdnVlLWxvYWRlci10ZW1wbGF0ZVxcXCJ9IS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiNGYzNWFmJnNjb3BlZD10cnVlJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/footer/footer.js?vue&type=script&lang=js&":
/*!***********************************************************************!*\
!*** ./src/components/home/footer/footer.js?vue&type=script&lang=js& ***!
\***********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./footer.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLmpzPzlmNmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vZm9vdGVyLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/components/home/footer/footer.vue":
/*!***********************************************!*\
!*** ./src/components/home/footer/footer.vue ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n/* harmony import */ var _footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./footer.js?vue&type=script&lang=js& */ \"./src/components/home/footer/footer.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"f678fc22\",\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('f678fc22')) {\n api.createRecord('f678fc22', component.options)\n } else {\n api.reload('f678fc22', component.options)\n }\n module.hot.accept(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n(function () {\n api.rerender('f678fc22', {\n render: _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/components/home/footer/footer.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZT8xZDIzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vZm9vdGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mNjc4ZmMyMiZzY29wZWQ9dHJ1ZSZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvb3Rlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiZjY3OGZjMjJcIixcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvam9lL0RvY3VtZW50cy9naXQvcGluZ2FuL2hrbGlmZS9waW5nYW4tbGlmZS1pbmRleC1wcm8vbm9kZV9tb2R1bGVzL192dWUtaG90LXJlbG9hZC1hcGlAMi4zLjRAdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCdmNjc4ZmMyMicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCdmNjc4ZmMyMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCdmNjc4ZmMyMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vZm9vdGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mNjc4ZmMyMiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCdmNjc4ZmMyMicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue\n");
/***/ }),
/***/ "./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!*********************************************************************************************************!*\
!*** ./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
\*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/MmUzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Zvb3Rlci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD1mNjc4ZmMyMiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZm9vdGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPWY2NzhmYzIyJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&":
/*!******************************************************************************************!*\
!*** ./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true& ***!
\******************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWY2NzhmYzIyJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/NzZiOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjM5MDdiYmNhLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Zvb3Rlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjY3OGZjMjImc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/header/header.js?vue&type=script&lang=js&":
/*!***********************************************************************!*\
!*** ./src/components/home/header/header.js?vue&type=script&lang=js& ***!
\***********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./header.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLmpzPzIyZDMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vaGVhZGVyLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/components/home/header/header.vue":
/*!***********************************************!*\
!*** ./src/components/home/header/header.vue ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n/* harmony import */ var _header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./header.js?vue&type=script&lang=js& */ \"./src/components/home/header/header.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"6fba8daf\",\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('6fba8daf')) {\n api.createRecord('6fba8daf', component.options)\n } else {\n api.reload('6fba8daf', component.options)\n }\n module.hot.accept(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n(function () {\n api.rerender('6fba8daf', {\n render: _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/components/home/header/header.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZT9lOTM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vaGVhZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02ZmJhOGRhZiZzY29wZWQ9dHJ1ZSZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiNmZiYThkYWZcIixcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvam9lL0RvY3VtZW50cy9naXQvcGluZ2FuL2hrbGlmZS9waW5nYW4tbGlmZS1pbmRleC1wcm8vbm9kZV9tb2R1bGVzL192dWUtaG90LXJlbG9hZC1hcGlAMi4zLjRAdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCc2ZmJhOGRhZicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCc2ZmJhOGRhZicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCc2ZmJhOGRhZicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vaGVhZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02ZmJhOGRhZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCc2ZmJhOGRhZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue\n");
/***/ }),
/***/ "./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!*********************************************************************************************************!*\
!*** ./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
\*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/NDEzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2hlYWRlci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD02ZmJhOGRhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaGVhZGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTZmYmE4ZGFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&":
/*!******************************************************************************************!*\
!*** ./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true& ***!
\******************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZmYmE4ZGFmJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/ZTljYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjM5MDdiYmNhLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2hlYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmZiYThkYWYmc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&":
/*!*******************************************************************************!*\
!*** ./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js& ***!
\*******************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./m-dropdown.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi5qcz8wMTU4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vbS1kcm9wZG93bi5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9tLWRyb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/components/home/m-dropdown/m-dropdown.vue":
/*!*******************************************************!*\
!*** ./src/components/home/m-dropdown/m-dropdown.vue ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n/* harmony import */ var _m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./m-dropdown.js?vue&type=script&lang=js& */ \"./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"04c55e2f\",\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('04c55e2f')) {\n api.createRecord('04c55e2f', component.options)\n } else {\n api.reload('04c55e2f', component.options)\n }\n module.hot.accept(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n(function () {\n api.rerender('04c55e2f', {\n render: _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/components/home/m-dropdown/m-dropdown.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/MWU0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA0YzU1ZTJmJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL20tZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL20tZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIwNGM1NWUyZlwiLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzA0YzU1ZTJmJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzA0YzU1ZTJmJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzA0YzU1ZTJmJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCcwNGM1NWUyZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlXCJcbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue\n");
/***/ }),
/***/ "./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!*****************************************************************************************************************!*\
!*** ./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
\*****************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlPzg0MDEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&":
/*!**************************************************************************************************!*\
!*** ./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& ***!
\**************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDRjNTVlMmYmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlPzQ2OGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi0hY2FjaGUtbG9hZGVyP3tcXFwiY2FjaGVEaXJlY3RvcnlcXFwiOlxcXCJub2RlX21vZHVsZXMvLmNhY2hlL3Z1ZS1sb2FkZXJcXFwiLFxcXCJjYWNoZUlkZW50aWZpZXJcXFwiOlxcXCIzOTA3YmJjYS12dWUtbG9hZGVyLXRlbXBsYXRlXFxcIn0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\n");
/***/ }),
/***/ "./src/main.js":
/*!*********************!*\
!*** ./src/main.js ***!
\*********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vant_es_icon_style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vant/es/icon/style */ \"./node_modules/_vant@2.2.16@vant/es/icon/style/index.js\");\n/* harmony import */ var vant_es_icon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vant/es/icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n/* harmony import */ var vant_es_collapse_style__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vant/es/collapse/style */ \"./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js\");\n/* harmony import */ var vant_es_collapse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vant/es/collapse */ \"./node_modules/_vant@2.2.16@vant/es/collapse/index.js\");\n/* harmony import */ var vant_es_collapse_item_style__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vant/es/collapse-item/style */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js\");\n/* harmony import */ var vant_es_collapse_item__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vant/es/collapse-item */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_i18n__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue-i18n */ \"./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js\");\n/* harmony import */ var _App_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./App.vue */ \"./src/App.vue\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./router */ \"./src/router.js\");\n/* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./store/index */ \"./src/store/index.js\");\n/* harmony import */ var vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! vue-awesome-swiper */ \"./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js\");\n/* harmony import */ var vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! swiper/dist/css/swiper.css */ \"./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\n/* harmony import */ var swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./mock */ \"./src/mock/index.js\");\n/* harmony import */ var vue_video_player__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! vue-video-player */ \"./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js\");\n/* harmony import */ var vue_video_player__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(vue_video_player__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! video.js/dist/video-js.css */ \"./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\n/* harmony import */ var video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15___default.a); // vant\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vant_es_collapse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).use(vant_es_collapse_item__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vant_es_icon__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n_mock__WEBPACK_IMPORTED_MODULE_17__[\"default\"].bootstrap(); // 视频\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_video_player__WEBPACK_IMPORTED_MODULE_18___default.a); // import 'amfe-flexible';\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].config.productionTip = false; // Purecss\n// import Purecss from 'purecss'\n// Vue.use(Purecss);\n// 国际化\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_i18n__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\nvar i18n = new vue_i18n__WEBPACK_IMPORTED_MODULE_11__[\"default\"]({\n locale: localStorage.getItem(\"lang\") || 'tc',\n // 语言标识\n //this.$i18n.locale // 通过切换locale的值来实现语言切换\n messages: {\n 'tc': __webpack_require__(/*! @/common/lang/tc */ \"./src/common/lang/tc.js\"),\n // 繁体语言包\n 'zh': __webpack_require__(/*! @/common/lang/zh */ \"./src/common/lang/zh.js\"),\n // 简体语言包\n 'en': __webpack_require__(/*! @/common/lang/en */ \"./src/common/lang/en.js\") // 英文语言包\n\n }\n});\nnew vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]({\n i18n: i18n,\n router: _router__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n store: _store_index__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n render: function render(h) {\n return h(_App_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n },\n mounted: function mounted() {\n document.dispatchEvent(new Event('render-event'));\n },\n data: {\n bus: new vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]()\n }\n}).$mount('#app');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbWFpbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9tYWluLmpzPzU2ZDciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnO1xuaW1wb3J0IFZ1ZUkxOG4gZnJvbSAndnVlLWkxOG4nO1xuaW1wb3J0IEFwcCBmcm9tICcuL0FwcC52dWUnO1xuaW1wb3J0IHJvdXRlciBmcm9tICcuL3JvdXRlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZS9pbmRleCc7XG5cbmltcG9ydCBWdWVBd2Vzb21lU3dpcGVyIGZyb20gJ3Z1ZS1hd2Vzb21lLXN3aXBlcidcbmltcG9ydCAnc3dpcGVyL2Rpc3QvY3NzL3N3aXBlci5jc3MnXG5WdWUudXNlKFZ1ZUF3ZXNvbWVTd2lwZXIpXG5cbi8vIHZhbnRcbmltcG9ydCB7XG5cdENvbGxhcHNlLFxuXHRDb2xsYXBzZUl0ZW0sXG5cdEljb25cbn0gZnJvbSAndmFudCc7XG5WdWUudXNlKENvbGxhcHNlKS51c2UoQ29sbGFwc2VJdGVtKTtcblZ1ZS51c2UoSWNvbik7XG5cbmltcG9ydCBNb2NrIGZyb20gJy4vbW9jaydcbk1vY2suYm9vdHN0cmFwKCk7XG5cbi8vIOinhumikVxuaW1wb3J0IFZ1ZVZpZGVvUGxheWVyIGZyb20gJ3Z1ZS12aWRlby1wbGF5ZXInXG5pbXBvcnQgJ3ZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzJ1xuVnVlLnVzZShWdWVWaWRlb1BsYXllcilcblxuLy8gaW1wb3J0ICdhbWZlLWZsZXhpYmxlJztcblZ1ZS5jb25maWcucHJvZHVjdGlvblRpcCA9IGZhbHNlXG5cbi8vIFB1cmVjc3Ncbi8vIGltcG9ydCBQdXJlY3NzIGZyb20gJ3B1cmVjc3MnXG4vLyBWdWUudXNlKFB1cmVjc3MpO1xuXG4vLyDlm73pmYXljJZcblZ1ZS51c2UoVnVlSTE4bilcbmNvbnN0IGkxOG4gPSBuZXcgVnVlSTE4bih7XG5cdGxvY2FsZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYW5nXCIpIHx8ICd0YycsIC8vIOivreiogOagh+ivhlxuXHQvL3RoaXMuJGkxOG4ubG9jYWxlIC8vIOmAmui/h+WIh+aNomxvY2FsZeeahOWAvOadpeWunueOsOivreiogOWIh+aNolxuXHRtZXNzYWdlczoge1xuXHRcdCd0Yyc6IHJlcXVpcmUoJ0AvY29tbW9uL2xhbmcvdGMnKSwgLy8g57mB5L2T6K+t6KiA5YyFXG5cdFx0J3poJzogcmVxdWlyZSgnQC9jb21tb24vbGFuZy96aCcpLCAvLyDnroDkvZPor63oqIDljIVcblx0XHQnZW4nOiByZXF1aXJlKCdAL2NvbW1vbi9sYW5nL2VuJyksIC8vIOiLseaWh+ivreiogOWMhVxuXHR9XG59KVxuXG5cblxubmV3IFZ1ZSh7XG5cdGkxOG4sXG5cdHJvdXRlcixcblx0c3RvcmUsXG5cdHJlbmRlcjogaCA9PiBoKEFwcCksXG5cdG1vdW50ZWQ6ICgpID0+IHtcblx0XHRkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyLWV2ZW50JykpO1xuXHR9LFxuXHRkYXRhOiB7XG5cdFx0YnVzOiBuZXcgVnVlKClcblx0fVxufSkuJG1vdW50KCcjYXBwJylcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUpBO0FBSEE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQVJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/main.js\n");
/***/ }),
/***/ "./src/mock/data/user.js":
/*!*******************************!*\
!*** ./src/mock/data/user.js ***!
\*******************************/
/*! exports provided: LoginUsers, Users */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LoginUsers\", function() { return LoginUsers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Users\", function() { return Users; });\n/* harmony import */ var mockjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mockjs */ \"./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js\");\n/* harmony import */ var mockjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mockjs__WEBPACK_IMPORTED_MODULE_0__);\n\nvar LoginUsers = [{\n id: 1,\n username: 'admin',\n password: 'admin',\n avatar: 'https://raw.githubusercontent.com/taylorchen709/markdown-images/master/vueadmin/user.png',\n name: '张某某'\n}];\nvar Users = [];\n\nfor (var i = 0; i < 5; i++) {\n Users.push(mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.mock({\n id: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.guid(),\n province: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.province(),\n city: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.city(),\n fieldName: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.cname(),\n address: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.mock('@county(true)'),\n 'age|18-60': 1,\n birth: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.date(),\n sex: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.integer(0, 1)\n }));\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9kYXRhL3VzZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbW9jay9kYXRhL3VzZXIuanM/MWUxMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTW9jayBmcm9tICdtb2NranMnO1xuY29uc3QgTG9naW5Vc2VycyA9IFtcbiAge1xuICAgIGlkOiAxLFxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nLFxuICAgIGF2YXRhcjogJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS90YXlsb3JjaGVuNzA5L21hcmtkb3duLWltYWdlcy9tYXN0ZXIvdnVlYWRtaW4vdXNlci5wbmcnLFxuICAgIG5hbWU6ICflvKDmn5Dmn5AnXG4gIH1cbl07XG5cbmNvbnN0IFVzZXJzID0gW107XG5cbmZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gIFVzZXJzLnB1c2goTW9jay5tb2NrKHtcbiAgICBpZDogTW9jay5SYW5kb20uZ3VpZCgpLFxuICAgIHByb3ZpbmNlOiBNb2NrLlJhbmRvbS5wcm92aW5jZSgpLFxuICAgIGNpdHk6IE1vY2suUmFuZG9tLmNpdHkoKSxcbiAgICBmaWVsZE5hbWU6IE1vY2suUmFuZG9tLmNuYW1lKCksXG4gICAgYWRkcmVzczogTW9jay5tb2NrKCdAY291bnR5KHRydWUpJyksXG4gICAgJ2FnZXwxOC02MCc6IDEsXG4gICAgYmlydGg6IE1vY2suUmFuZG9tLmRhdGUoKSxcbiAgICBzZXg6IE1vY2suUmFuZG9tLmludGVnZXIoMCwgMSlcbiAgfSkpO1xufVxuXG5leHBvcnQgeyBMb2dpblVzZXJzLCBVc2VycyB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/data/user.js\n");
/***/ }),
/***/ "./src/mock/index.js":
/*!***************************!*\
!*** ./src/mock/index.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mock */ \"./src/mock/mock.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_mock__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9tb2NrL2luZGV4LmpzPzI0NWEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vY2sgZnJvbSAnLi9tb2NrJztcblxuZXhwb3J0IGRlZmF1bHQgbW9jaztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/index.js\n");
/***/ }),
/***/ "./src/mock/mock.js":
/*!**************************!*\
!*** ./src/mock/mock.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios-mock-adapter */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js\");\n/* harmony import */ var axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _data_user__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data/user */ \"./src/mock/data/user.js\");\n\n\n\nvar _Users = _data_user__WEBPACK_IMPORTED_MODULE_2__[\"Users\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n /**\n * mock bootstrap\n */\n bootstrap: function bootstrap() {\n return; // 紧在dev环境下使用\n\n if (true) {\n return;\n }\n\n var mock = new axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1___default.a(axios__WEBPACK_IMPORTED_MODULE_0___default.a); // mock success request\n\n mock.onGet('/success').reply(200, {\n msg: 'success'\n }); // mock error request\n\n mock.onGet('/error').reply(500, {\n msg: 'failure'\n }); // 拦截 get方法demo\n\n mock.onGet('/path1/path2/getdemo').reply(function (config) {\n // 拦截参数\n var _config$params = config.params,\n params1 = _config$params.params1,\n params2 = _config$params.params2;\n return new Promise(function (resolve, reject) {\n var content = {};\n var success = true;\n resolve([200, {\n code: 2000,\n msg: '请求成功',\n success: success,\n content: content\n }]);\n });\n }); // 拦截post方法demo\n\n mock.onPost('/path1/path2/postdemo').reply(function (config) {\n var _JSON$parse = JSON.parse(config.data),\n params1 = _JSON$parse.params1,\n params2 = _JSON$parse.params2;\n\n return new Promise(function (resolve, reject) {\n var content = {};\n var success = true;\n resolve([200, {\n code: 2000,\n msg: '请求成功',\n success: success,\n content: content\n }]);\n });\n });\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9tb2NrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL21vY2svbW9jay5qcz85NTIzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgTW9ja0FkYXB0ZXIgZnJvbSAnYXhpb3MtbW9jay1hZGFwdGVyJztcbmltcG9ydCB7XG4gIExvZ2luVXNlcnMsXG4gIFVzZXJzXG59IGZyb20gJy4vZGF0YS91c2VyJztcbmxldCBfVXNlcnMgPSBVc2VycztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogbW9jayBib290c3RyYXBcbiAgICovXG4gIGJvb3RzdHJhcCgpIHtcbiAgICByZXR1cm47XG4gICAgLy8g57Sn5ZyoZGV2546v5aKD5LiL5L2/55SoXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1vY2sgPSBuZXcgTW9ja0FkYXB0ZXIoYXhpb3MpO1xuXG4gICAgLy8gbW9jayBzdWNjZXNzIHJlcXVlc3RcbiAgICBtb2NrLm9uR2V0KCcvc3VjY2VzcycpLnJlcGx5KDIwMCwge1xuICAgICAgbXNnOiAnc3VjY2VzcydcbiAgICB9KTtcblxuICAgIC8vIG1vY2sgZXJyb3IgcmVxdWVzdFxuICAgIG1vY2sub25HZXQoJy9lcnJvcicpLnJlcGx5KDUwMCwge1xuICAgICAgbXNnOiAnZmFpbHVyZSdcbiAgICB9KTtcblxuICAgIC8vIOaLpuaIqiBnZXTmlrnms5VkZW1vXG4gICAgbW9jay5vbkdldCgnL3BhdGgxL3BhdGgyL2dldGRlbW8nKS5yZXBseShjb25maWcgPT4ge1xuICAgICAgLy8g5oum5oiq5Y+C5pWwXG4gICAgICBsZXQge1xuICAgICAgICBwYXJhbXMxLFxuICAgICAgICBwYXJhbXMyXG4gICAgICB9ID0gY29uZmlnLnBhcmFtcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBjb250ZW50ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZShbMjAwLCB7XG4gICAgICAgICAgY29kZTogMjAwMCxcbiAgICAgICAgICBtc2c6ICfor7fmsYLmiJDlip8nLFxuICAgICAgICAgIHN1Y2Nlc3MsXG4gICAgICAgICAgY29udGVudFxuICAgICAgICB9XSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIOaLpuaIqnBvc3Tmlrnms5VkZW1vXG4gICAgbW9jay5vblBvc3QoJy9wYXRoMS9wYXRoMi9wb3N0ZGVtbycpLnJlcGx5KGNvbmZpZyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBwYXJhbXMxLFxuICAgICAgICBwYXJhbXMyXG4gICAgICB9ID0gSlNPTi5wYXJzZShjb25maWcuZGF0YSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgY29udGVudCA9IHt9O1xuICAgICAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIHJlc29sdmUoWzIwMCwge1xuICAgICAgICAgIGNvZGU6IDIwMDAsXG4gICAgICAgICAgbXNnOiAn6K+35rGC5oiQ5YqfJyxcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgfV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBREE7QUFDQTtBQUlBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBRUE7QUEzREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/mock.js\n");
/***/ }),
/***/ "./src/pages/index/index.js?vue&type=script&lang=js&":
/*!**************************************************!*\
!*** ./src/pages/index?vue&type=script&lang=js& ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!.?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXguanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4PzQ5OTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/pages/index/index.js?vue&type=script&lang=js&\n");
/***/ }),
/***/ "./src/pages/index/index.vue":
/*!***********************************!*\
!*** ./src/pages/index/index.vue ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n/* harmony import */ var _index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! .?vue&type=script&lang=js& */ \"./src/pages/index/index.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"1badc801\",\n null\n \n)\n\n/* hot reload */\nif (true) {\n var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('1badc801')) {\n api.createRecord('1badc801', component.options)\n } else {\n api.reload('1badc801', component.options)\n }\n module.hot.accept(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n(function () {\n api.rerender('1badc801', {\n render: _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n staticRenderFns: _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n })\n })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n }\n}\ncomponent.options.__file = \"src/pages/index/index.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4L2luZGV4LnZ1ZT80NjNlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTFiYWRjODAxJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL2luZGV4LmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9pbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0xYmFkYzgwMSZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIxYmFkYzgwMVwiLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzFiYWRjODAxJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzFiYWRjODAxJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzFiYWRjODAxJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWJhZGM4MDEmc2NvcGVkPXRydWUmXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwaS5yZXJlbmRlcignMWJhZGM4MDEnLCB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRpY1JlbmRlckZuc1xuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInNyYy9wYWdlcy9pbmRleC9pbmRleC52dWVcIlxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue\n");
/***/ }),
/***/ "./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!*********************************************************************************************!*\
!*** ./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
\*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/YzA3ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTFiYWRjODAxJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9pbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0xYmFkYzgwMSZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");
/***/ }),
/***/ "./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&":
/*!******************************************************************************!*\
!*** ./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true& ***!
\******************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"3907bbca-vue-loader-template\"}!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"3907bbca-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_3907bbca_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTFiYWRjODAxJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MWJhYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjM5MDdiYmNhLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xYmFkYzgwMSZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\n");
/***/ }),
/***/ "./src/router.js":
/*!***********************!*\
!*** ./src/router.js ***!
\***********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_router__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-router */ \"./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js\");\n/* harmony import */ var _pages_index_index_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pages/index/index.vue */ \"./src/pages/index/index.vue\");\n/* harmony import */ var _common_lang_tc_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @common/lang/tc.js */ \"./src/common/lang/tc.js\");\n/* harmony import */ var _common_lang_tc_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_common_lang_tc_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _common_lang_zh_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @common/lang/zh.js */ \"./src/common/lang/zh.js\");\n/* harmony import */ var _common_lang_zh_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_common_lang_zh_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _common_lang_en_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @common/lang/en.js */ \"./src/common/lang/en.js\");\n/* harmony import */ var _common_lang_en_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_common_lang_en_js__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_2__[\"default\"].use(vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n/**\n * 重写路由的push方法\n */\n\nvar routerPush = vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype.push;\n\nvue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype.push = function push(location) {\n return routerPush.call(this, location).catch(function (error) {\n return error;\n });\n};\n\nvar routes = [{\n path: '/',\n name: 'index',\n component: _pages_index_index_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/login',\n name: 'login',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(4), __webpack_require__.e(8)]).then(__webpack_require__.bind(null, /*! ./pages/login/login.vue */ \"./src/pages/login/login.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/register',\n name: 'register',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(9)]).then(__webpack_require__.bind(null, /*! ./pages/register/register.vue */ \"./src/pages/register/register.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/password/find',\n name: 'passwordFind',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(12)]).then(__webpack_require__.bind(null, /*! ./pages/password-find/password-find.vue */ \"./src/pages/password-find/password-find.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/password/reset',\n name: 'passwordReset',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(3), __webpack_require__.e(13)]).then(__webpack_require__.bind(null, /*! ./pages/password-reset/password-reset.vue */ \"./src/pages/password-reset/password-reset.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/infomation/improve',\n name: 'infomationImprove',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(2), __webpack_require__.e(3), __webpack_require__.e(11)]).then(__webpack_require__.bind(null, /*! ./pages/infomation-improve/infomation-improve.vue */ \"./src/pages/infomation-improve/infomation-improve.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/profile',\n name: 'profile',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 19).then(__webpack_require__.bind(null, /*! ./pages/profile/profile.vue */ \"./src/pages/profile/profile.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/terms',\n name: 'terms',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 21).then(__webpack_require__.bind(null, /*! ./pages/terms/terms.vue */ \"./src/pages/terms/terms.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/privacy',\n name: 'privacy',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 18).then(__webpack_require__.bind(null, /*! ./pages/privacy/privacy.vue */ \"./src/pages/privacy/privacy.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/personal/data/collection',\n name: 'personalDataCollection',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 17).then(__webpack_require__.bind(null, /*! ./pages/personal-data-collection/personal-data-collection.vue */ \"./src/pages/personal-data-collection/personal-data-collection.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/protocol',\n name: 'protocol',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 20).then(__webpack_require__.bind(null, /*! ./pages/protocol/protocol.vue */ \"./src/pages/protocol/protocol.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/news/list',\n name: 'newsList',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 6).then(__webpack_require__.bind(null, /*! ./pages/news-list/news-list.vue */ \"./src/pages/news-list/news-list.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/news/detail',\n name: 'newsDetail',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 14).then(__webpack_require__.bind(null, /*! ./pages/news-detail/news-detail.vue */ \"./src/pages/news-detail/news-detail.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/product',\n name: 'product',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 7).then(__webpack_require__.bind(null, /*! ./pages/product/product.vue */ \"./src/pages/product/product.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/custom/service',\n name: 'customService',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(2), __webpack_require__.e(3), __webpack_require__.e(4), __webpack_require__.e(5)]).then(__webpack_require__.bind(null, /*! ./pages/custom-service/custom-service.vue */ \"./src/pages/custom-service/custom-service.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/custom/product',\n name: 'customProduct',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 10).then(__webpack_require__.bind(null, /*! ./pages/custom-product/custom-product.vue */ \"./src/pages/custom-product/custom-product.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/demo',\n name: 'demo',\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(2), __webpack_require__.e(15)]).then(__webpack_require__.bind(null, /*! ./pages/demo/index.vue */ \"./src/pages/demo/index.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/about',\n name: 'about',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 22).then(__webpack_require__.bind(null, /*! ./pages/About.vue */ \"./src/pages/About.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n}, {\n path: '/empty',\n name: 'empty',\n component: function component() {\n return __webpack_require__.e(/*! import() */ 16).then(__webpack_require__.bind(null, /*! ./pages/empty/empty.vue */ \"./src/pages/empty/empty.vue\"));\n },\n meta: {\n title: '平安人寿保险官网'\n }\n} // 404页面\n// {\n// \tpath: '*', // * 表示上面路径匹配不到的都显示这个页面\n// \tname: '404',\n// \tcomponent: Index\n// },\n]; // add route path\n\nroutes.forEach(function (route) {\n route.path = route.path || '/' + (route.name || '');\n});\nvar router = new vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n routes: routes // mode: 'history',\n\n});\nrouter.beforeEach(function (to, from, next) {\n var langStr = localStorage.getItem(\"lang\") || 'tc';\n var lang; // switch\n\n switch (langStr) {\n // 简体\n case \"zh\":\n lang = _common_lang_zh_js__WEBPACK_IMPORTED_MODULE_6___default.a;\n break;\n // 英文\n\n case \"en\":\n lang = _common_lang_en_js__WEBPACK_IMPORTED_MODULE_7___default.a;\n break;\n // 繁体\n\n default:\n lang = _common_lang_tc_js__WEBPACK_IMPORTED_MODULE_5___default.a;\n break;\n } // lang对象为当前语言配置 见 en.js,tc.js,zh.js\n\n\n var title = \"\";\n lang.nav.navList.forEach(function (e1) {\n if (e1.list && e1.list.length > 0) {\n e1.list.forEach(function (e2) {\n if (e2.path == to.fullPath) {\n title = e2.name;\n }\n });\n } else {\n if (e1.path == to.fullPath) {\n title = e1.name;\n }\n }\n }); // to参数可以获取要前往页面的信息,包括参数\n\n title = title || to.meta && to.meta.title;\n\n if (title) {\n document.title = title;\n } // const scrollTopList = [\n // \t\"newsList\", \"newsDetail\", \"protocol\", \"privacy\", \"terms\", \"paymentType\", \"reservation\"\n // ]\n\n\n document.documentElement.scrollTop = 0;\n document.body.scrollTop = 0;\n next();\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (router);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcm91dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3JvdXRlci5qcz80MWNiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJ1xuaW1wb3J0IFJvdXRlciBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IEluZGV4IGZyb20gJy4vcGFnZXMvaW5kZXgvaW5kZXgudnVlJ1xuXG5pbXBvcnQgdGMgZnJvbSAnQGNvbW1vbi9sYW5nL3RjLmpzJ1xuaW1wb3J0IHpoIGZyb20gJ0Bjb21tb24vbGFuZy96aC5qcydcbmltcG9ydCBlbiBmcm9tICdAY29tbW9uL2xhbmcvZW4uanMnXG5cblZ1ZS51c2UoUm91dGVyKVxuXG4vKipcbiAqIOmHjeWGmei3r+eUseeahHB1c2jmlrnms5VcbiAqL1xuY29uc3Qgcm91dGVyUHVzaCA9IFJvdXRlci5wcm90b3R5cGUucHVzaFxuUm91dGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaChsb2NhdGlvbikge1xuXHRyZXR1cm4gcm91dGVyUHVzaC5jYWxsKHRoaXMsIGxvY2F0aW9uKS5jYXRjaChlcnJvciA9PiBlcnJvcilcbn1cblxuY29uc3Qgcm91dGVzID0gW1xuXG5cdHtcblx0XHRwYXRoOiAnLycsXG5cdFx0bmFtZTogJ2luZGV4Jyxcblx0XHRjb21wb25lbnQ6IEluZGV4LFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5bmz5a6J5Lq65a+/5L+d6Zmp5a6Y572RJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvbG9naW4nLFxuXHRcdG5hbWU6ICdsb2dpbicsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvbG9naW4vbG9naW4udnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9yZWdpc3RlcicsXG5cdFx0bmFtZTogJ3JlZ2lzdGVyJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9yZWdpc3Rlci9yZWdpc3Rlci52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL3Bhc3N3b3JkL2ZpbmQnLFxuXHRcdG5hbWU6ICdwYXNzd29yZEZpbmQnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL3Bhc3N3b3JkLWZpbmQvcGFzc3dvcmQtZmluZC52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL3Bhc3N3b3JkL3Jlc2V0Jyxcblx0XHRuYW1lOiAncGFzc3dvcmRSZXNldCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcGFzc3dvcmQtcmVzZXQvcGFzc3dvcmQtcmVzZXQudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9pbmZvbWF0aW9uL2ltcHJvdmUnLFxuXHRcdG5hbWU6ICdpbmZvbWF0aW9uSW1wcm92ZScsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvaW5mb21hdGlvbi1pbXByb3ZlL2luZm9tYXRpb24taW1wcm92ZS52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL3Byb2ZpbGUnLFxuXHRcdG5hbWU6ICdwcm9maWxlJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9wcm9maWxlL3Byb2ZpbGUudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy90ZXJtcycsXG5cdFx0bmFtZTogJ3Rlcm1zJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy90ZXJtcy90ZXJtcy52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL3ByaXZhY3knLFxuXHRcdG5hbWU6ICdwcml2YWN5Jyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9wcml2YWN5L3ByaXZhY3kudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9wZXJzb25hbC9kYXRhL2NvbGxlY3Rpb24nLFxuXHRcdG5hbWU6ICdwZXJzb25hbERhdGFDb2xsZWN0aW9uJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9wZXJzb25hbC1kYXRhLWNvbGxlY3Rpb24vcGVyc29uYWwtZGF0YS1jb2xsZWN0aW9uLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5bmz5a6J5Lq65a+/5L+d6Zmp5a6Y572RJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvcHJvdG9jb2wnLFxuXHRcdG5hbWU6ICdwcm90b2NvbCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcHJvdG9jb2wvcHJvdG9jb2wudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9uZXdzL2xpc3QnLFxuXHRcdG5hbWU6ICduZXdzTGlzdCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvbmV3cy1saXN0L25ld3MtbGlzdC52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL25ld3MvZGV0YWlsJyxcblx0XHRuYW1lOiAnbmV3c0RldGFpbCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvbmV3cy1kZXRhaWwvbmV3cy1kZXRhaWwudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXG5cdHtcblx0XHRwYXRoOiAnL3Byb2R1Y3QnLFxuXHRcdG5hbWU6ICdwcm9kdWN0Jyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9wcm9kdWN0L3Byb2R1Y3QudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9jdXN0b20vc2VydmljZScsXG5cdFx0bmFtZTogJ2N1c3RvbVNlcnZpY2UnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL2N1c3RvbS1zZXJ2aWNlL2N1c3RvbS1zZXJ2aWNlLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5bmz5a6J5Lq65a+/5L+d6Zmp5a6Y572RJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvY3VzdG9tL3Byb2R1Y3QnLFxuXHRcdG5hbWU6ICdjdXN0b21Qcm9kdWN0Jyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9jdXN0b20tcHJvZHVjdC9jdXN0b20tcHJvZHVjdC52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cblx0e1xuXHRcdHBhdGg6ICcvZGVtbycsXG5cdFx0bmFtZTogJ2RlbW8nLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL2RlbW8vaW5kZXgudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICflubPlronkurrlr7/kv53pmanlrpjnvZEnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9hYm91dCcsXG5cdFx0bmFtZTogJ2Fib3V0Jyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9BYm91dC52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL2VtcHR5Jyxcblx0XHRuYW1lOiAnZW1wdHknLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL2VtcHR5L2VtcHR5LnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5bmz5a6J5Lq65a+/5L+d6Zmp5a6Y572RJ1xuXHRcdH1cblx0fSxcblx0Ly8gNDA06aG16Z2iXG5cdC8vIHtcblx0Ly8gXHRwYXRoOiAnKicsIC8vICog6KGo56S65LiK6Z2i6Lev5b6E5Yy56YWN5LiN5Yiw55qE6YO95pi+56S66L+Z5Liq6aG16Z2iXG5cdC8vIFx0bmFtZTogJzQwNCcsXG5cdC8vIFx0Y29tcG9uZW50OiBJbmRleFxuXHQvLyB9LFxuXVxuXG4vLyBhZGQgcm91dGUgcGF0aFxucm91dGVzLmZvckVhY2gocm91dGUgPT4ge1xuXHRyb3V0ZS5wYXRoID0gcm91dGUucGF0aCB8fCAnLycgKyAocm91dGUubmFtZSB8fCAnJyk7XG59KTtcblxuY29uc3Qgcm91dGVyID0gbmV3IFJvdXRlcih7XG5cdHJvdXRlcyxcblx0Ly8gbW9kZTogJ2hpc3RvcnknLFxufSk7XG5cblxucm91dGVyLmJlZm9yZUVhY2goKHRvLCBmcm9tLCBuZXh0KSA9PiB7XG5cdGxldCBsYW5nU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYW5nXCIpIHx8ICd0Yyc7XG5cdGxldCBsYW5nO1xuXHQvLyBzd2l0Y2hcblx0c3dpdGNoIChsYW5nU3RyKSB7XG5cdFx0Ly8g566A5L2TXG5cdFx0Y2FzZSBcInpoXCI6XG5cdFx0XHRsYW5nID0gemg7XG5cdFx0XHRicmVhaztcblxuXHRcdC8vIOiLseaWh1xuXHRcdGNhc2UgXCJlblwiOlxuXHRcdFx0bGFuZyA9IGVuO1xuXHRcdFx0YnJlYWs7XG5cblx0XHQvLyDnuYHkvZNcblx0XHRkZWZhdWx0OlxuXHRcdFx0bGFuZyA9IHRjO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHQvLyBsYW5n5a+56LGh5Li65b2T5YmN6K+t6KiA6YWN572uIOingSBlbi5qcyx0Yy5qcyx6aC5qc1xuXHRsZXQgdGl0bGUgPSBcIlwiO1xuXHRsYW5nLm5hdi5uYXZMaXN0LmZvckVhY2goZTEgPT4ge1xuXHRcdGlmIChlMS5saXN0ICYmIGUxLmxpc3QubGVuZ3RoID4gMCkge1xuXHRcdFx0ZTEubGlzdC5mb3JFYWNoKGUyID0+IHtcblx0XHRcdFx0aWYoZTIucGF0aCA9PSB0by5mdWxsUGF0aCl7XG5cdFx0XHRcdFx0dGl0bGUgPSBlMi5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoZTEucGF0aCA9PSB0by5mdWxsUGF0aCl7XG5cdFx0XHRcdHRpdGxlID0gZTEubmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHQvLyB0b+WPguaVsOWPr+S7peiOt+WPluimgeWJjeW+gOmhtemdoueahOS/oeaBr++8jOWMheaLrOWPguaVsFxuXHR0aXRsZSA9IHRpdGxlIHx8IHRvLm1ldGEgJiYgdG8ubWV0YS50aXRsZTtcblx0aWYgKHRpdGxlKSB7XG5cdFx0ZG9jdW1lbnQudGl0bGUgPSB0aXRsZTtcblx0fVxuXHQvLyBjb25zdCBzY3JvbGxUb3BMaXN0ID0gW1xuXHQvLyBcdFwibmV3c0xpc3RcIiwgXCJuZXdzRGV0YWlsXCIsIFwicHJvdG9jb2xcIiwgXCJwcml2YWN5XCIsIFwidGVybXNcIiwgXCJwYXltZW50VHlwZVwiLCBcInJlc2VydmF0aW9uXCJcblx0Ly8gXVxuXHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcblx0ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSAwO1xuXHRuZXh0KCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBVUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBVUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpLQTtBQUNBO0FBb0tBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFkQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/router.js\n");
/***/ }),
/***/ "./src/store/actions.js":
/*!******************************!*\
!*** ./src/store/actions.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("// import request from '@/service'\n// export const banner = async (store, params) => {\n// return await request.get('/api/v1/get_banner', { params: params })\n// }\n// export const categories = async (store, params) => {\n// return await request.get('/japi/v1/categories', { params: params })\n// }\n// export const recommend = async (store, params) => {\n// return await request.post('/wapi/v1/query', params)\n// }\n// export const entries = async (store, params) => {\n// return await request.get('/tapi/v1/get_entry_by_rank', { params: params })\n// }\n// export const getListByLastTime = async (store, params) => {\n// return await request.get('/xapi/v1/getListByLastTime', { params: params })\n// }\n// export const increment = ({\n// \tcommit\n// }) => {\n// \tcommit('INCREMENT')\n// }\n// export const pcorphone = ({\n// \tcommit\n// }) => {\n// \tcommit('PCORPHONE')\n// }//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvYWN0aW9ucy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9zdG9yZS9hY3Rpb25zLmpzPzYzZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHJlcXVlc3QgZnJvbSAnQC9zZXJ2aWNlJ1xuXG4vLyBleHBvcnQgY29uc3QgYmFubmVyID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvYXBpL3YxL2dldF9iYW5uZXInLCB7IHBhcmFtczogcGFyYW1zIH0pXG4vLyB9XG5cbi8vIGV4cG9ydCBjb25zdCBjYXRlZ29yaWVzID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvamFwaS92MS9jYXRlZ29yaWVzJywgeyBwYXJhbXM6IHBhcmFtcyB9KVxuLy8gfVxuXG4vLyBleHBvcnQgY29uc3QgcmVjb21tZW5kID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucG9zdCgnL3dhcGkvdjEvcXVlcnknLCBwYXJhbXMpXG4vLyB9XG5cbi8vIGV4cG9ydCBjb25zdCBlbnRyaWVzID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvdGFwaS92MS9nZXRfZW50cnlfYnlfcmFuaycsIHsgcGFyYW1zOiBwYXJhbXMgfSlcbi8vIH1cblxuLy8gZXhwb3J0IGNvbnN0IGdldExpc3RCeUxhc3RUaW1lID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcveGFwaS92MS9nZXRMaXN0QnlMYXN0VGltZScsIHsgcGFyYW1zOiBwYXJhbXMgfSlcbi8vIH1cblxuXG4vLyBleHBvcnQgY29uc3QgaW5jcmVtZW50ID0gKHtcbi8vIFx0Y29tbWl0XG4vLyB9KSA9PiB7XG4vLyBcdGNvbW1pdCgnSU5DUkVNRU5UJylcbi8vIH1cblxuLy8gZXhwb3J0IGNvbnN0IHBjb3JwaG9uZSA9ICh7XG4vLyBcdGNvbW1pdFxuLy8gfSkgPT4ge1xuLy8gXHRjb21taXQoJ1BDT1JQSE9ORScpXG4vLyB9XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/actions.js\n");
/***/ }),
/***/ "./src/store/index.js":
/*!****************************!*\
!*** ./src/store/index.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ \"./src/store/state.js\");\n/* harmony import */ var _mutations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mutations */ \"./src/store/mutations.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions */ \"./src/store/actions.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_actions__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\nvar store = function store() {\n return new vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Store({\n state: _state__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n mutations: _mutations__WEBPACK_IMPORTED_MODULE_3__,\n actions: _actions__WEBPACK_IMPORTED_MODULE_4__\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvc3RvcmUvaW5kZXguanM/NDM2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSdcbmltcG9ydCBWdWV4IGZyb20gJ3Z1ZXgnXG5pbXBvcnQgc3RhdGUgZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCAqIGFzIG11dGF0aW9ucyBmcm9tICcuL211dGF0aW9ucydcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9hY3Rpb25zJ1xuXG5WdWUudXNlKFZ1ZXgpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gbmV3IFZ1ZXguU3RvcmUoe1xuICBzdGF0ZSxcbiAgbXV0YXRpb25zLFxuICBhY3Rpb25zXG59KVxuXG5leHBvcnQgZGVmYXVsdCBzdG9yZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFDQTtBQUtBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/store/index.js\n");
/***/ }),
/***/ "./src/store/mutations.js":
/*!********************************!*\
!*** ./src/store/mutations.js ***!
\********************************/
/*! exports provided: INCREMENT, IS_MOBILE, IS_SMALL_SCREEN, SET_USER_INFO, CACHE_POLICY_LIST */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"INCREMENT\", function() { return INCREMENT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IS_MOBILE\", function() { return IS_MOBILE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IS_SMALL_SCREEN\", function() { return IS_SMALL_SCREEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SET_USER_INFO\", function() { return SET_USER_INFO; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CACHE_POLICY_LIST\", function() { return CACHE_POLICY_LIST; });\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ \"./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction INCREMENT(state) {\n state.counter++;\n}\nfunction IS_MOBILE(state, bool) {\n state.isMobile = bool;\n}\nfunction IS_SMALL_SCREEN(state, bool) {\n state.isSmallScreen = bool;\n}\nfunction SET_USER_INFO(state, val) {\n if (val) {\n Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_0__[\"setCookie\"])(\"_user_profile\", encodeURIComponent(JSON.stringify(val)), 7200);\n state.userInfo = val;\n } else {\n Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_0__[\"setCookie\"])(\"_user_profile\", \"\", 1);\n state.userInfo = null;\n state.policyList = null;\n }\n}\nfunction CACHE_POLICY_LIST(state, val) {\n state.policyList = val;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvbXV0YXRpb25zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N0b3JlL211dGF0aW9ucy5qcz8wNDM5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNldENvb2tpZSwgZ2V0Q29va2llIH0gZnJvbSAnQC91dGlscy91dGlscy5qcydcbmltcG9ydCB7IHN0YXQgfSBmcm9tICdmcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJTkNSRU1FTlQoc3RhdGUpIHtcblx0c3RhdGUuY291bnRlcisrXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJU19NT0JJTEUoc3RhdGUsIGJvb2wpIHtcblx0c3RhdGUuaXNNb2JpbGUgPSBib29sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJU19TTUFMTF9TQ1JFRU4oc3RhdGUsIGJvb2wpIHtcblx0c3RhdGUuaXNTbWFsbFNjcmVlbiA9IGJvb2xcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFVF9VU0VSX0lORk8oc3RhdGUsIHZhbCkge1xuXHRpZiAodmFsKSB7XG5cdFx0c2V0Q29va2llKFwiX3VzZXJfcHJvZmlsZVwiLCBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodmFsKSksIDcyMDApO1xuXHRcdHN0YXRlLnVzZXJJbmZvID0gdmFsO1xuXHR9IGVsc2Uge1xuXHRcdHNldENvb2tpZShcIl91c2VyX3Byb2ZpbGVcIiwgXCJcIiwgMSk7XG5cdFx0c3RhdGUudXNlckluZm8gPSBudWxsO1xuXHRcdHN0YXRlLnBvbGljeUxpc3QgPSBudWxsO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDQUNIRV9QT0xJQ1lfTElTVChzdGF0ZSwgdmFsKSB7XG5cdHN0YXRlLnBvbGljeUxpc3QgPSB2YWw7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/mutations.js\n");
/***/ }),
/***/ "./src/store/state.js":
/*!****************************!*\
!*** ./src/store/state.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n counter: 2,\n // 例子\n isMobile: false,\n //是否手机访问\n isSmallScreen: false,\n // 是否小屏幕 (PC时,小屏幕机导航栏会改变))\n userInfo: {\n sid: \"\",\n name: \"\",\n hadFullInfo: \"\"\n },\n policyList: []\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvc3RhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvc3RvcmUvc3RhdGUuanM/ZmNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG5cdGNvdW50ZXI6IDIsIC8vIOS+i+WtkFxuXHRpc01vYmlsZTogZmFsc2UsIC8v5piv5ZCm5omL5py66K6/6ZeuXG5cdGlzU21hbGxTY3JlZW46IGZhbHNlLCAvLyDmmK/lkKblsI/lsY/luZUgKFBD5pe277yM5bCP5bGP5bmV5py65a+86Iiq5qCP5Lya5pS55Y+YKSlcblxuXHR1c2VySW5mbzoge1xuXHRcdHNpZDogXCJcIixcblx0XHRuYW1lOiBcIlwiLFxuXHRcdGhhZEZ1bGxJbmZvOiBcIlwiLFxuXHR9LFxuXHRwb2xpY3lMaXN0OiBbXVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/state.js\n");
/***/ }),
/***/ "./src/utils/biz.js":
/*!**************************!*\
!*** ./src/utils/biz.js ***!
\**************************/
/*! exports provided: gotoVHIS, getDateYMD */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gotoVHIS\", function() { return gotoVHIS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getDateYMD\", function() { return getDateYMD; });\n/**\n * \n * @param {string} lan 语言\n */\nfunction gotoVHIS(lan) {\n var url = \"http://154.213.4.36/index.html\";\n\n switch (lan) {\n case 'zh':\n url += \"?language=zh-cn\";\n break;\n\n case 'en':\n url += \"?language=en\";\n break;\n\n default:\n url += \"?language=zh-hk\";\n break;\n }\n\n url += \"&partnerId=PA001&productCode=VHIS001\";\n window.location.href = url;\n}\nfunction getDateYMD(timestamp) {\n var day = new Date(timestamp);\n var y = day.getFullYear();\n var m = day.getMonth() + 1;\n var d = day.getDate();\n var s = y + \"-\" + (m < 10 ? \"0\" + m : m) + \"-\" + (d < 10 ? \"0\" + d : d);\n return s;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvYml6LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2Jpei5qcz83MWUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuIOivreiogFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ290b1ZISVMobGFuKSB7XG4gICAgbGV0IHVybCA9IHByb2Nlc3MuZW52LlZVRV9BUFBfVkhJU19JTkRFWDtcbiAgICBzd2l0Y2ggKGxhbikge1xuICAgICAgICBjYXNlICd6aCc6XG4gICAgICAgICAgICB1cmwgKz0gXCI/bGFuZ3VhZ2U9emgtY25cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlbic6XG4gICAgICAgICAgICB1cmwgKz0gXCI/bGFuZ3VhZ2U9ZW5cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdXJsICs9IFwiP2xhbmd1YWdlPXpoLWhrXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdXJsICs9IFwiJnBhcnRuZXJJZD1QQTAwMSZwcm9kdWN0Q29kZT1WSElTMDAxXCI7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVZTUQodGltZXN0YW1wKSB7XG4gICAgbGV0IGRheSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XG4gICAgbGV0IHkgPSBkYXkuZ2V0RnVsbFllYXIoKTtcbiAgICBsZXQgbSA9IGRheS5nZXRNb250aCgpICsgMTtcbiAgICBsZXQgZCA9IGRheS5nZXREYXRlKCk7XG4gICAgbGV0IHMgPSB5ICsgXCItXCIgKyAobSA8IDEwID8gXCIwXCIgKyBtIDogbSkgKyBcIi1cIiArIChkIDwgMTAgPyBcIjBcIiArIGQgOiBkKTtcbiAgICByZXR1cm4gcztcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/biz.js\n");
/***/ }),
/***/ "./src/utils/utils.js":
/*!****************************!*\
!*** ./src/utils/utils.js ***!
\****************************/
/*! exports provided: REGEXPS, checkMobile, param2Obj, getCookie, setCookie, delCookie, getEnv, setTitle, addQuery, getPath, getQuery, getObjByListKeyValue, formatBr, debounce, throttle, contactMethodCheck */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REGEXPS\", function() { return REGEXPS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkMobile\", function() { return checkMobile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"param2Obj\", function() { return param2Obj; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCookie\", function() { return getCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setCookie\", function() { return setCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"delCookie\", function() { return delCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getEnv\", function() { return getEnv; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setTitle\", function() { return setTitle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addQuery\", function() { return addQuery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPath\", function() { return getPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getQuery\", function() { return getQuery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getObjByListKeyValue\", function() { return getObjByListKeyValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatBr\", function() { return formatBr; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return debounce; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return throttle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"contactMethodCheck\", function() { return contactMethodCheck; });\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.regexp.match */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js\");\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.regexp.constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js\");\n/* harmony import */ var core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es6.regexp.replace */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es6.regexp.split */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js\");\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n// 正在表达式\nvar REGEXPS = {\n \"mobile\": /^1\\d{10}$/\n}; // 验证手机\n\nfunction checkMobile(str) {\n return REGEXPS.mobile.test(str);\n}\n/**\n * 链接参数转换为obj\n * 入参 完整链接\n * @param {*} url\n */\n\nfunction param2Obj(url) {\n var search = url.split('?')[1];\n\n if (!search) {\n return {};\n }\n\n return JSON.parse('{\"' + decodeURIComponent(search).replace(/\"/g, '\\\\\"').replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}');\n} //获取cookie、\n\nfunction getCookie(name) {\n var arr,\n reg = new RegExp(\"(^| )\" + name + \"=([^;]*)(;|$)\");\n if (arr = document.cookie.match(reg)) return arr[2];else return null;\n} //设置cookie\n\nfunction setCookie(c_name, value, second) {\n var exdate = new Date();\n exdate.setTime(exdate.getTime() + second * 1000);\n document.cookie = c_name + \"=\" + escape(value) + (second == null ? \"\" : \";expires=\" + exdate.toGMTString());\n}\n; //删除cookie\n\nfunction delCookie(name) {\n var exp = new Date();\n exp.setTime(exp.getTime() - 1);\n var cval = getCookie(name);\n if (cval != null) document.cookie = name + \"=\" + cval + \";expires=\" + exp.toGMTString();\n}\n;\n/**\n * 获取环境信息\n * @return {Object} 环境信息对象\n */\n\nfunction getEnv() {\n var nav = window.navigator;\n var env = {\n \"iphone\": false,\n \"ipad\": false,\n \"android\": false,\n \"pc\": false,\n \"ios\": false,\n \"ver\": \"0\"\n };\n var ua = nav.userAgent;\n var android = ua.match(/(Android)\\s+([\\d.]+)/);\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n\n if (ipad) {\n env.ipad = ipad[1] && true || false;\n env.ver = ipad[2] && ipad[2].replace(/-/g, \".\") || \"\";\n env.ios = true;\n } else if (iphone) {\n env.iphone = iphone[1] && true || false;\n env.ver = iphone[2] && iphone[2].replace(/-/g, \".\") || \"\";\n env.ios = true;\n } else if (android) {\n env.android = android[1] && true || false;\n env.ver = android[2];\n } else {\n env.pc = true;\n }\n\n return env;\n}\n/**\n * 设定页面 title\n * @param {[type]} title [description]\n */\n\nfunction setTitle(title) {\n if (!title) {\n return;\n }\n\n document.title = title; // if (ENV.ios && navigator.userAgent.toLowerCase().indexOf(\"micromessenger\") !== -1) {\n // 修复微信端IOS无法修改document.title的情况\n\n if (getEnv().ios && (navigator.userAgent.toLowerCase().indexOf(\"micromessenger\") !== -1 || navigator.userAgent.toLowerCase().indexOf(\"alipay\") !== -1)) {\n //修复IOS微信端和支付宝无法修改document.title的情况\n var $iframe = document.createElement('iframe');\n $iframe.className = \"C-hiddenIframe\";\n $iframe.src = \"/\" + location.pathname.split('/')[1] + \"/favicon.ico\";\n $iframe.style.visibility = 'hidden';\n $iframe.style.width = '1px';\n $iframe.style.height = '1px';\n\n $iframe.onload = function onIframeLoad() {\n setTimeout(function () {\n $iframe.onload = null;\n onIframeLoad = null;\n document.body.removeChild($iframe);\n $iframe = null;\n }, 0);\n };\n\n document.body.appendChild($iframe);\n }\n} // 为链接添加参数\n\nfunction addQuery(url, query) {\n query = query || {};\n\n query = function (query) {\n var q = [];\n Object.keys(query).forEach(function (_q) {\n q.push(_q + '=' + query[_q]);\n });\n return q.join('&');\n }(query);\n\n if (url.indexOf('?') !== -1) {\n url += '&' + query;\n } else {\n url += '?' + query;\n }\n\n return url;\n}\n/**\n * 获得当前页面的path\n * @return {String} 页面path\n */\n\nfunction getPath() {\n var path = window.location.hash;\n path = path || \"#/\";\n path = path === \"#/\" ? \"#/index\" : path;\n path = path.split(\"?\");\n return path[0];\n} // 获取 url 参数\n\nfunction getQuery(name) {\n return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, \"\"])[1].replace(/\\+/g, '%20')) || null;\n}\n/**\n * 从数组中获取 key未value的对象\n * @param {*} value\n * @param {*} key\n * @param {*} list\n */\n\nfunction getObjByListKeyValue(value, key, list) {\n var result = null;\n list.forEach(function (element) {\n if (element[key + \"\"] == value) {\n result = element;\n }\n });\n return result;\n}\n/**\n * 把 \\n换行符转换成<br>\n * 转换后需要用 v-html渲染\n * 用{{}}会当成字符串把 html渲染出来\n */\n\nfunction formatBr(str) {\n str = str.replace(/\\n/g, '<br/>');\n return str;\n}\n;\n/**\n * @desc 函数防抖\n * @param func 函数\n * @param wait 延迟执行毫秒数\n * @param immediate true 表立即执行,false 表非立即执行\n */\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this;\n var args = arguments;\n if (timeout) clearTimeout(timeout);\n\n if (immediate) {\n var callNow = !timeout;\n timeout = setTimeout(function () {\n timeout = null;\n }, wait);\n if (callNow) func.apply(context, args);\n } else {\n timeout = setTimeout(function () {\n func.apply(context, args);\n }, wait);\n }\n };\n}\n/**\n * @desc 函数节流\n * @param func 函数\n * @param wait 延迟执行毫秒数\n * @param type 1 表时间戳版,2 表定时器版\n * 时间戳版的函数触发是在时间段内开始的时候,而定时器版的函数触发是在时间段内结束的时候。\n */\n\nfunction throttle(func, wait, type) {\n if (type === 1) {\n var previous = 0;\n } else if (type === 2) {\n var timeout;\n }\n\n return function () {\n var context = this;\n var args = arguments;\n\n if (type === 1) {\n var now = Date.now();\n\n if (now - previous > wait) {\n func.apply(context, args);\n previous = now;\n }\n } else if (type === 2) {\n if (!timeout) {\n timeout = setTimeout(function () {\n timeout = null;\n func.apply(context, args);\n }, wait);\n }\n }\n };\n}\n/**\n * 几种常用的校验方式\n * @param {string} type \n * @param {string} value \n */\n\nfunction contactMethodCheck(type, value) {\n if (type == 'hkmobile') {\n // return /^[5689]{1}\\d{7}$/.test(value);\n return /^\\d{8}$/.test(value);\n }\n\n if (type == 'mobile') {\n // return /^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$/.test(value);\n return /^1\\d{10}$/.test(value);\n }\n\n if (type == 'email') {\n return /^(\\w-*\\.*)+@(\\w-?)+(\\.\\w{2,})+$/.test(value);\n }\n\n return true;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvdXRpbHMuanM/ZmE3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyDmraPlnKjooajovr7lvI9cbmV4cG9ydCBjb25zdCBSRUdFWFBTID0ge1xuICBcIm1vYmlsZVwiOiAvXjFcXGR7MTB9JC9cbn1cblxuLy8g6aqM6K+B5omL5py6XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNb2JpbGUoc3RyKSB7XG4gIHJldHVybiBSRUdFWFBTLm1vYmlsZS50ZXN0KHN0cik7XG59XG5cbi8qKlxuICog6ZO+5o6l5Y+C5pWw6L2s5o2i5Li6b2JqXG4gKiDlhaXlj4Ig5a6M5pW06ZO+5o6lXG4gKiBAcGFyYW0geyp9IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyYW0yT2JqKHVybCkge1xuICBjb25zdCBzZWFyY2ggPSB1cmwuc3BsaXQoJz8nKVsxXVxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIHJldHVybiBKU09OLnBhcnNlKFxuICAgICd7XCInICtcbiAgICBkZWNvZGVVUklDb21wb25lbnQoc2VhcmNoKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxuICAgICAgLnJlcGxhY2UoLyYvZywgJ1wiLFwiJylcbiAgICAgIC5yZXBsYWNlKC89L2csICdcIjpcIicpICtcbiAgICAnXCJ9J1xuICApXG59XG5cblxuXG4vL+iOt+WPlmNvb2tpZeOAgVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7XG4gIHZhciBhcnIsIHJlZyA9IG5ldyBSZWdFeHAoXCIoXnwgKVwiICsgbmFtZSArIFwiPShbXjtdKikoO3wkKVwiKTtcbiAgaWYgKGFyciA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChyZWcpKVxuICAgIHJldHVybiAoYXJyWzJdKTtcbiAgZWxzZVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vL+iuvue9rmNvb2tpZVxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShjX25hbWUsIHZhbHVlLCBzZWNvbmQpIHtcbiAgdmFyIGV4ZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGV4ZGF0ZS5zZXRUaW1lKGV4ZGF0ZS5nZXRUaW1lKCkgKyBzZWNvbmQgKiAxMDAwKTtcbiAgZG9jdW1lbnQuY29va2llID0gY19uYW1lICsgXCI9XCIgKyBlc2NhcGUodmFsdWUpICsgKChzZWNvbmQgPT0gbnVsbCkgPyBcIlwiIDogXCI7ZXhwaXJlcz1cIiArIGV4ZGF0ZS50b0dNVFN0cmluZygpKTtcbn07XG5cbi8v5Yig6ZmkY29va2llXG5leHBvcnQgZnVuY3Rpb24gZGVsQ29va2llKG5hbWUpIHtcbiAgdmFyIGV4cCA9IG5ldyBEYXRlKCk7XG4gIGV4cC5zZXRUaW1lKGV4cC5nZXRUaW1lKCkgLSAxKTtcbiAgdmFyIGN2YWwgPSBnZXRDb29raWUobmFtZSk7XG4gIGlmIChjdmFsICE9IG51bGwpXG4gICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArIFwiPVwiICsgY3ZhbCArIFwiO2V4cGlyZXM9XCIgKyBleHAudG9HTVRTdHJpbmcoKTtcbn07XG5cblxuLyoqXG4gKiDojrflj5bnjq/looPkv6Hmga9cbiAqIEByZXR1cm4ge09iamVjdH0g546v5aKD5L+h5oGv5a+56LGhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnYoKSB7XG4gIHZhciBuYXYgPSB3aW5kb3cubmF2aWdhdG9yO1xuICB2YXIgZW52ID0ge1xuICAgIFwiaXBob25lXCI6IGZhbHNlLFxuICAgIFwiaXBhZFwiOiBmYWxzZSxcbiAgICBcImFuZHJvaWRcIjogZmFsc2UsXG4gICAgXCJwY1wiOiBmYWxzZSxcbiAgICBcImlvc1wiOiBmYWxzZSxcbiAgICBcInZlclwiOiBcIjBcIlxuICB9O1xuXG4gIHZhciB1YSA9IG5hdi51c2VyQWdlbnQ7XG4gIHZhciBhbmRyb2lkID0gdWEubWF0Y2goLyhBbmRyb2lkKVxccysoW1xcZC5dKykvKTtcbiAgdmFyIGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICB2YXIgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPUylcXHMoW1xcZF9dKykvKTtcbiAgaWYgKGlwYWQpIHtcbiAgICBlbnYuaXBhZCA9IGlwYWRbMV0gJiYgdHJ1ZSB8fCBmYWxzZTtcbiAgICBlbnYudmVyID0gaXBhZFsyXSAmJiBpcGFkWzJdLnJlcGxhY2UoLy0vZywgXCIuXCIpIHx8IFwiXCI7XG4gICAgZW52LmlvcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXBob25lKSB7XG4gICAgZW52LmlwaG9uZSA9IGlwaG9uZVsxXSAmJiB0cnVlIHx8IGZhbHNlO1xuICAgIGVudi52ZXIgPSBpcGhvbmVbMl0gJiYgaXBob25lWzJdLnJlcGxhY2UoLy0vZywgXCIuXCIpIHx8IFwiXCI7XG4gICAgZW52LmlvcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoYW5kcm9pZCkge1xuICAgIGVudi5hbmRyb2lkID0gYW5kcm9pZFsxXSAmJiB0cnVlIHx8IGZhbHNlO1xuICAgIGVudi52ZXIgPSBhbmRyb2lkWzJdO1xuICB9IGVsc2Uge1xuICAgIGVudi5wYyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZW52O1xufVxuXG4vKipcbiAqIOiuvuWumumhtemdoiB0aXRsZVxuICogQHBhcmFtIHtbdHlwZV19IHRpdGxlIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRpdGxlKHRpdGxlKSB7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZTtcbiAgLy8gaWYgKEVOVi5pb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtaWNyb21lc3NlbmdlclwiKSAhPT0gLTEpIHtcbiAgLy8g5L+u5aSN5b6u5L+h56uvSU9T5peg5rOV5L+u5pS5ZG9jdW1lbnQudGl0bGXnmoTmg4XlhrVcbiAgaWYgKGdldEVudigpLmlvcyAmJiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtaWNyb21lc3NlbmdlclwiKSAhPT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhbGlwYXlcIikgIT09IC0xKSkge1xuICAgIC8v5L+u5aSNSU9T5b6u5L+h56uv5ZKM5pSv5LuY5a6d5peg5rOV5L+u5pS5ZG9jdW1lbnQudGl0bGXnmoTmg4XlhrVcbiAgICB2YXIgJGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICRpZnJhbWUuY2xhc3NOYW1lID0gXCJDLWhpZGRlbklmcmFtZVwiO1xuICAgICRpZnJhbWUuc3JjID0gXCIvXCIgKyBsb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpWzFdICsgXCIvZmF2aWNvbi5pY29cIjtcbiAgICAkaWZyYW1lLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAkaWZyYW1lLnN0eWxlLndpZHRoID0gJzFweCc7XG4gICAgJGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgICAkaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uIG9uSWZyYW1lTG9hZCgpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAkaWZyYW1lLm9ubG9hZCA9IG51bGw7XG4gICAgICAgIG9uSWZyYW1lTG9hZCA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoJGlmcmFtZSk7XG4gICAgICAgICRpZnJhbWUgPSBudWxsO1xuICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRpZnJhbWUpO1xuICB9XG59XG5cbi8vIOS4uumTvuaOpea3u+WKoOWPguaVsFxuZXhwb3J0IGZ1bmN0aW9uIGFkZFF1ZXJ5KHVybCwgcXVlcnkpIHtcbiAgcXVlcnkgPSBxdWVyeSB8fCB7fVxuICBxdWVyeSA9IChmdW5jdGlvbiAocXVlcnkpIHtcbiAgICB2YXIgcSA9IFtdXG4gICAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goZnVuY3Rpb24gKF9xKSB7XG4gICAgICBxLnB1c2goX3EgKyAnPScgKyBxdWVyeVtfcV0pXG4gICAgfSlcbiAgICByZXR1cm4gcS5qb2luKCcmJylcbiAgfSkocXVlcnkpXG4gIGlmICh1cmwuaW5kZXhPZignPycpICE9PSAtMSkge1xuICAgIHVybCArPSAnJicgKyBxdWVyeVxuICB9IGVsc2Uge1xuICAgIHVybCArPSAnPycgKyBxdWVyeVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuXG4vKipcbiAqIOiOt+W+l+W9k+WJjemhtemdoueahHBhdGhcbiAqIEByZXR1cm4ge1N0cmluZ30g6aG16Z2icGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCgpIHtcbiAgdmFyIHBhdGggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcbiAgcGF0aCA9IHBhdGggfHwgXCIjL1wiO1xuICBwYXRoID0gcGF0aCA9PT0gXCIjL1wiID8gXCIjL2luZGV4XCIgOiBwYXRoO1xuICBwYXRoID0gcGF0aC5zcGxpdChcIj9cIik7XG4gIHJldHVybiBwYXRoWzBdO1xufVxuXG4vLyDojrflj5YgdXJsIOWPguaVsFxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5KG5hbWUpIHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgobmV3IFJlZ0V4cCgnWz98Jl0nICsgbmFtZSArICc9JyArICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLmhyZWYpIHx8IFssIFwiXCJdKVsxXS5yZXBsYWNlKC9cXCsvZywgJyUyMCcpKSB8fCBudWxsO1xufVxuXG4vKipcbiAqIOS7juaVsOe7hOS4reiOt+WPliBrZXnmnKp2YWx1ZeeahOWvueixoVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqQnlMaXN0S2V5VmFsdWUodmFsdWUsIGtleSwgbGlzdCkge1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGlmIChlbGVtZW50W2tleSArIFwiXCJdID09IHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICog5oqKIFxcbuaNouihjOespui9rOaNouaIkDxicj5cbiAqIOi9rOaNouWQjumcgOimgeeUqCB2LWh0bWzmuLLmn5NcbiAqIOeUqHt7fX3kvJrlvZPmiJDlrZfnrKbkuLLmioogaHRtbOa4suafk+WHuuadpVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QnIoc3RyKSB7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9cXG4vZywgJzxici8+JylcbiAgcmV0dXJuIHN0clxufTtcblxuXG4vKipcbiAqIEBkZXNjIOWHveaVsOmYsuaKllxuICogQHBhcmFtIGZ1bmMg5Ye95pWwXG4gKiBAcGFyYW0gd2FpdCDlu7bov5/miafooYzmr6vnp5LmlbBcbiAqIEBwYXJhbSBpbW1lZGlhdGUgdHJ1ZSDooajnq4vljbPmiafooYzvvIxmYWxzZSDooajpnZ7nq4vljbPmiafooYxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICBsZXQgdGltZW91dDtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGxldCBjb250ZXh0ID0gdGhpcztcbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdmFyIGNhbGxOb3cgPSAhdGltZW91dDtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9LCB3YWl0KVxuICAgICAgaWYgKGNhbGxOb3cpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgICB9LCB3YWl0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzYyDlh73mlbDoioLmtYFcbiAqIEBwYXJhbSBmdW5jIOWHveaVsFxuICogQHBhcmFtIHdhaXQg5bu26L+f5omn6KGM5q+r56eS5pWwXG4gKiBAcGFyYW0gdHlwZSAxIOihqOaXtumXtOaIs+eJiO+8jDIg6KGo5a6a5pe25Zmo54mIXG4gKiDml7bpl7TmiLPniYjnmoTlh73mlbDop6blj5HmmK/lnKjml7bpl7TmrrXlhoXlvIDlp4vnmoTml7blgJnvvIzogIzlrprml7blmajniYjnmoTlh73mlbDop6blj5HmmK/lnKjml7bpl7TmrrXlhoXnu5PmnZ/nmoTml7blgJnjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IDIpIHtcbiAgICB2YXIgdGltZW91dDtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGxldCBjb250ZXh0ID0gdGhpcztcbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIGlmIChub3cgLSBwcmV2aW91cyA+IHdhaXQpIHtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAyKSB7XG4gICAgICBpZiAoIXRpbWVvdXQpIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICAgICAgfSwgd2FpdClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiDlh6Dnp43luLjnlKjnmoTmoKHpqozmlrnlvI9cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFjdE1ldGhvZENoZWNrKHR5cGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlID09ICdoa21vYmlsZScpIHtcbiAgICAvLyByZXR1cm4gL15bNTY4OV17MX1cXGR7N30kLy50ZXN0KHZhbHVlKTtcbiAgICByZXR1cm4gL15cXGR7OH0kLy50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlID09ICdtb2JpbGUnKSB7XG4gICAgLy8gcmV0dXJuIC9eKCgxM1swLTldKXwoMTRbNSw3LDldKXwoMTUoWzAtM118WzUtOV0pKXwoMTY2KXwoMTdbMC05XSl8KDE4WzAtOV0pfCgxOVswLTldKSlcXGR7OH0kLy50ZXN0KHZhbHVlKTtcbiAgICByZXR1cm4gL14xXFxkezEwfSQvLnRlc3QodmFsdWUpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT0gJ2VtYWlsJykge1xuICAgIHJldHVybiAvXihcXHctKlxcLiopK0AoXFx3LT8pKyhcXC5cXHd7Mix9KSskLy50ZXN0KHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBUUE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFHQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBOzs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/utils.js\n");
/***/ }),
/***/ 0:
/*!***************************!*\
!*** multi ./src/main.js ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! ./src/main.js */"./src/main.js");
/***/ }),
/***/ 1:
/*!******************************!*\
!*** min-document (ignored) ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9taW4tZG9jdW1lbnQgKGlnbm9yZWQpP2Q4ZGEiXSwic291cmNlc0NvbnRlbnQiOlsiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n");
/***/ })
/******/ });